From 4505f6434c4d1364d6fe2aeed8ca111ac1d32a43 Mon Sep 17 00:00:00 2001 From: Ron Kok Date: Mon, 25 Mar 2024 09:12:07 -0700 Subject: [PATCH] Release 0.10.24 --- .editorconfig | 10 - .eslintignore | 2 - .eslintrc | 73 - .gitattributes | 3 - .gitignore | 2 - .pnp.cjs | 12643 ------- .pnp.loader.mjs | 2042 - ...-utils-npm-4.4.0-d1791bd5a3-cdfe3ae42b.zip | Bin 65295 -> 0 bytes ...porter-npm-1.0.1-9d07ed2e4a-0fd22007db.zip | Bin 10603 -> 0 bytes ...-array-npm-1.1.2-45b82d7fb6-69a84d5980.zip | Bin 8860 -> 0 bytes ...candir-npm-2.1.5-89c67370dd-a970d595bd.zip | Bin 13877 -> 0 bytes ...s.stat-npm-2.0.5-01f4dd3030-012480b5ca.zip | Bin 8706 -> 0 bytes ...s.walk-npm-1.2.8-b4a89da548-190c643f15.zip | Bin 15613 -> 0 bytes ...e-once-npm-2.0.0-e36cf4f140-ad87447820.zip | Bin 6906 -> 0 bytes ...abbrev-npm-1.1.1-3659247eab-a4a97ec07d.zip | Bin 2938 -> 0 bytes ...rn-jsx-npm-5.3.2-d7594599ea-c3d3b2a89c.zip | Bin 8550 -> 0 bytes ...t-base-npm-6.0.2-428f325a93-f52b6872cc.zip | Bin 13588 -> 0 bytes ...-error-npm-3.1.0-415a406f4e-1101a33f21.zip | Bin 4089 -> 0 bytes .../ajv-npm-6.12.6-4b5105e2b2-874972efe5.zip | Bin 245015 -> 0 bytes ...-regex-npm-5.0.1-c963a48615-2aa4bb54ca.zip | Bin 3870 -> 0 bytes ...styles-npm-4.3.0-245c7d42c7-513b44c3b2.zip | Bin 6922 -> 0 bytes ...aproba-npm-2.0.0-8716bcfde6-5615cadcfb.zip | Bin 4560 -> 0 bytes ...re-yet-npm-3.0.1-3395b1512f-52590c2486.zip | Bin 6954 -> 0 bytes ...gparse-npm-2.0.1-faff7999e6-83644b5649.zip | Bin 41212 -> 0 bytes ...nsion-npm-1.1.11-fb95eb05ad-faf34a7bb0.zip | Bin 5597 -> 0 bytes ...ansion-npm-2.0.1-17aa2616f9-a61e7cd2e8.zip | Bin 6048 -> 0 bytes ...lsites-npm-3.1.0-268f989910-072d17b6ab.zip | Bin 3763 -> 0 bytes .../chalk-npm-4.1.2-ba8b67ab80-fe75c9d5c7.zip | Bin 13756 -> 0 bytes ...chownr-npm-2.0.0-638f1c9c61-c57cf9dd07.zip | Bin 2856 -> 0 bytes ...-stack-npm-2.2.0-a8ce435a5c-2ac8cd2b2f.zip | Bin 3676 -> 0 bytes ...onvert-npm-2.0.1-79730e935b-79e6bdb9fd.zip | Bin 10501 -> 0 bytes ...r-name-npm-1.1.4-025792b0ea-b044585952.zip | Bin 3487 -> 0 bytes ...upport-npm-1.1.3-3be5c53455-9b73568176.zip | Bin 4890 -> 0 bytes ...ander-npm-2.20.3-d8dcbaa39b-ab8c07884e.zip | Bin 20978 -> 0 bytes ...at-map-npm-0.0.1-85a921b7ee-902a9f5d89.zip | Bin 3838 -> 0 bytes ...trings-npm-1.1.0-e3160e5275-8755d76787.zip | Bin 5890 -> 0 bytes ...-spawn-npm-7.0.3-e4ff3e65b3-671cc7c728.zip | Bin 10218 -> 0 bytes .../debug-npm-4.3.4-4513954577-3dbad3f94e.zip | Bin 15777 -> 0 bytes ...eep-is-npm-0.1.4-88938b5a67-edb65dd0d7.zip | Bin 5430 -> 0 bytes ...egates-npm-1.0.0-9b1942d75f-a51744d9b5.zip | Bin 4237 -> 0 bytes ...ctrine-npm-3.0.0-c6f1615f04-fd7673ca77.zip | Bin 27965 -> 0 bytes ...-regex-npm-8.0.0-213764015c-d4c5c39d5a.zip | Bin 11951 -> 0 bytes ...oding-npm-0.1.13-82a1837d30-bb98632f8f.zip | Bin 4563 -> 0 bytes ...-paths-npm-2.2.1-7c7577428c-65b5df55a8.zip | Bin 4944 -> 0 bytes ...r-code-npm-2.0.3-082e0ff9a7-8b7b1be20d.zip | Bin 5769 -> 0 bytes ...regexp-npm-4.0.0-4b531d8d59-98b48897d9.zip | Bin 3201 -> 0 bytes .../esm-npm-3.2.25-762b3ebd40-978aabe2de.zip | Bin 92145 -> 0 bytes ...squery-npm-1.5.0-d8f8a06879-aefb0d2596.zip | Bin 163213 -> 0 bytes ...ecurse-npm-4.3.0-10b86a887a-ebc17b1a33.zip | Bin 6250 -> 0 bytes ...averse-npm-5.3.0-03284f8f63-072780882d.zip | Bin 10967 -> 0 bytes ...sutils-npm-2.0.3-f865beafd5-22b5b08f74.zip | Bin 14093 -> 0 bytes ...-equal-npm-3.1.3-790edcfcf5-e21a9d8d84.zip | Bin 7393 -> 0 bytes ...ingify-npm-2.1.0-02e8905fda-b191531e36.zip | Bin 11434 -> 0 bytes ...shtein-npm-2.0.6-fcd74b8df5-92cfec0a8d.zip | Bin 4597 -> 0 bytes ...fastq-npm-1.15.0-1013f6514e-0170e6bfcd.zip | Bin 12375 -> 0 bytes ...-cache-npm-6.0.1-31965cf0af-f49701feaa.zip | Bin 9083 -> 0 bytes ...ind-up-npm-5.0.0-e03e9b796d-07955e3573.zip | Bin 5051 -> 0 bytes ...nipass-npm-2.1.0-501ef87306-1b8d128dae.zip | Bin 5203 -> 0 bytes ...alpath-npm-1.0.0-c8f05d8126-99ddea01a7.zip | Bin 5917 -> 0 bytes .../gauge-npm-4.0.4-8f878385e9-788b6bfe52.zip | Bin 17407 -> 0 bytes .../glob-npm-7.2.3-2d866d17a5-29452e97b3.zip | Bin 19642 -> 0 bytes ...parent-npm-6.0.2-2cbef12738-c13ee97978.zip | Bin 4254 -> 0 bytes ...s-flag-npm-4.0.0-32af9f0536-261a135703.zip | Bin 3266 -> 0 bytes ...nicode-npm-2.0.1-893adb4747-1eab07a743.zip | Bin 2730 -> 0 bytes ...-agent-npm-5.0.0-7f1f121b83-e2ee1ff165.zip | Bin 8110 -> 0 bytes ...-agent-npm-5.0.1-42d65f358e-571fccdf38.zip | Bin 11991 -> 0 bytes ...ize-ms-npm-1.2.1-e942bd7329-9c7a74a282.zip | Bin 2775 -> 0 bytes ...v-lite-npm-0.6.3-24b8aae27e-3f60d47a5c.zip | Bin 195962 -> 0 bytes ...ignore-npm-5.2.4-fbe6e989e5-3d4c309c60.zip | Bin 19603 -> 0 bytes ...-fresh-npm-3.3.0-3e34265ca9-2cacfad06e.zip | Bin 3375 -> 0 bytes ...urhash-npm-0.1.4-610c5068a0-7cae75c8cd.zip | Bin 5509 -> 0 bytes ...string-npm-4.0.0-7b717435b2-824cfb9929.zip | Bin 3163 -> 0 bytes ...flight-npm-1.0.6-ccedb4b908-f4f76aa072.zip | Bin 2738 -> 0 bytes ...herits-npm-2.0.4-c66b3957a0-4a48a73384.zip | Bin 2949 -> 0 bytes .../ip-npm-2.0.0-204facb3cc-cfcfac6b87.zip | Bin 5265 -> 0 bytes ...xtglob-npm-2.1.1-0870ea68b5-df033653d0.zip | Bin 3458 -> 0 bytes ...-point-npm-3.0.0-1ecf4ebee5-44a30c2945.zip | Bin 3403 -> 0 bytes ...s-glob-npm-4.0.3-cb87bf1bdb-d381c1319f.zip | Bin 5221 -> 0 bytes ...lambda-npm-1.0.1-7ab55bc8a8-93a32f0194.zip | Bin 2925 -> 0 bytes ...inside-npm-3.0.3-2ea0ef44fd-abd50f0618.zip | Bin 3217 -> 0 bytes .../isexe-npm-2.0.0-b58870bd2e-26bf6c5480.zip | Bin 5446 -> 0 bytes ...s-yaml-npm-4.1.0-3606f32312-c7830dfd45.zip | Bin 113708 -> 0 bytes ...averse-npm-0.4.1-4759091693-7486074d3b.zip | Bin 7476 -> 0 bytes ...sonify-npm-1.0.1-b65772b28b-cff44156dd.zip | Bin 9457 -> 0 bytes .../levn-npm-0.4.1-d183b2d7bb-12c5021c85.zip | Bin 8964 -> 0 bytes ...e-path-npm-6.0.0-06a1e4c528-72eb661788.zip | Bin 4218 -> 0 bytes ....merge-npm-4.6.2-77cb4416bf-ad580b4bdb.zip | Bin 13720 -> 0 bytes ...-cache-npm-6.0.0-b4c8668fe1-f97f499f89.zip | Bin 6589 -> 0 bytes ...imatch-npm-3.1.2-9405269906-c154e56640.zip | Bin 12857 -> 0 bytes ...ollect-npm-1.0.2-3b4676eab5-14df761028.zip | Bin 2858 -> 0 bytes ...-flush-npm-1.0.5-efe79d9826-56269a0b22.zip | Bin 2768 -> 0 bytes ...peline-npm-1.2.4-5924cb077f-b14240dac0.zip | Bin 3797 -> 0 bytes ...-sized-npm-1.0.3-306d86f432-79076749fc.zip | Bin 31525 -> 0 bytes ...nizlib-npm-2.1.2-ea89cd0cfb-f1fdeac0b0.zip | Bin 7136 -> 0 bytes ...mkdirp-npm-1.0.4-37f6ef56b9-a96865108c.zip | Bin 9794 -> 0 bytes .../ms-npm-2.1.2-ec0c1512ff-673cdb2c31.zip | Bin 3647 -> 0 bytes .../ms-npm-2.1.3-81ff3cfac1-aa92de6080.zip | Bin 3593 -> 0 bytes ...ompare-npm-1.4.0-97b75b362d-23ad088b08.zip | Bin 3295 -> 0 bytes ...tiator-npm-0.6.3-9d50e36171-b8ffeb1e26.zip | Bin 10848 -> 0 bytes ...npmlog-npm-6.0.2-e0e69455c7-ae238cd264.zip | Bin 7031 -> 0 bytes .../once-npm-1.4.0-ccf03ef07a-cd0a885013.zip | Bin 2595 -> 0 bytes ...-limit-npm-3.1.0-05d2ede37f-7c3690c4db.zip | Bin 4578 -> 0 bytes ...locate-npm-5.0.0-92cc7c7a3e-1623088f36.zip | Bin 4554 -> 0 bytes .../p-map-npm-4.0.0-4677ae07c7-cb0ab21ec0.zip | Bin 4836 -> 0 bytes ...module-npm-1.0.1-1fae11b095-6ba8b25514.zip | Bin 2797 -> 0 bytes ...exists-npm-4.0.0-e9e4f63eb0-505807199d.zip | Bin 3043 -> 0 bytes ...solute-npm-1.0.1-31bc695ffd-060840f92c.zip | Bin 2649 -> 0 bytes ...th-key-npm-3.1.1-0e66ea8321-55cd7a9dd4.zip | Bin 3358 -> 0 bytes ...ude-ls-npm-1.2.1-3e4d272a55-cd192ec0d0.zip | Bin 12547 -> 0 bytes ...-retry-npm-2.0.1-871f0b01b7-f96a3f6d90.zip | Bin 5697 -> 0 bytes ...nycode-npm-2.3.0-df4bdce06b-39f760e09a.zip | Bin 12703 -> 0 bytes ...rotask-npm-1.2.3-fcc98e4e2d-b676f8c040.zip | Bin 4687 -> 0 bytes ...e-from-npm-4.0.0-f758ec21bf-f4ba0b8494.zip | Bin 2901 -> 0 bytes ...retry-npm-0.12.0-72ac7fb4cc-623bd7d2e5.zip | Bin 14371 -> 0 bytes ...eusify-npm-1.0.4-95ac4aec11-c3076ebcc2.zip | Bin 6227 -> 0 bytes ...rimraf-npm-3.0.2-2cb7dac69a-87f4164e39.zip | Bin 7735 -> 0 bytes ...rallel-npm-1.2.0-3f47ff2034-cb4f97ad25.zip | Bin 3625 -> 0 bytes ...buffer-npm-5.2.1-3481c8aa9b-b99c4b41fd.zip | Bin 11229 -> 0 bytes ...buffer-npm-2.1.2-8d5c0b705e-cab8f25ae6.zip | Bin 14275 -> 0 bytes ...ocking-npm-2.0.0-49e2cffa24-6e65a05f7c.zip | Bin 3205 -> 0 bytes ...ommand-npm-2.0.0-eb2b01921d-6b52fe8727.zip | Bin 2298 -> 0 bytes ...-regex-npm-3.0.0-899a0cd65e-1a2bcae50d.zip | Bin 2557 -> 0 bytes ...l-exit-npm-3.0.7-bd270458a3-a2f098f247.zip | Bin 4883 -> 0 bytes ...buffer-npm-4.2.0-5ac3f668bb-b5167a7142.zip | Bin 26591 -> 0 bytes ...-agent-npm-7.0.0-7aacf32ea0-7205543701.zip | Bin 8631 -> 0 bytes ...ce-map-npm-0.6.1-1a3621db16-59ce8640cf.zip | Bin 207644 -> 0 bytes ...pport-npm-0.5.21-09ca99e250-43e98d700d.zip | Bin 28941 -> 0 bytes ...-width-npm-4.2.3-2c27177bae-e52c10dc3f.zip | Bin 3604 -> 0 bytes ...ecoder-npm-1.3.0-2422117fd0-8417646695.zip | Bin 6078 -> 0 bytes ...p-ansi-npm-6.0.1-caddc7cb40-f3cd25890a.zip | Bin 3050 -> 0 bytes ...mments-npm-3.1.1-dcb2324823-492f73e272.zip | Bin 4107 -> 0 bytes ...-color-npm-7.2.0-606bfcf7da-3dda818de0.zip | Bin 4192 -> 0 bytes ...-table-npm-0.2.0-d92a778b59-b6937a38c8.zip | Bin 7844 -> 0 bytes ...-check-npm-0.4.0-60565800ce-ec688ebfc9.zip | Bin 8389 -> 0 bytes ...-fest-npm-0.20.2-b36432617f-4fb3272df2.zip | Bin 51675 -> 0 bytes ...uri-js-npm-4.4.1-66d11cbcaf-7167432de6.zip | Bin 145871 -> 0 bytes ...recate-npm-1.0.2-e3fe1a219c-474acf1146.zip | Bin 3982 -> 0 bytes .../which-npm-2.0.2-320ddf72f7-1a5c563d3c.zip | Bin 5713 -> 0 bytes ...-align-npm-1.1.5-889d77e592-d5fc37cd56.zip | Bin 2750 -> 0 bytes ...wrappy-npm-1.0.2-916de4d4b3-159da4805f.zip | Bin 2344 -> 0 bytes ...allist-npm-4.0.0-b493d9e907-343617202a.zip | Bin 5369 -> 0 bytes ...-queue-npm-0.1.0-c6c9a7db29-f77b3d8d00.zip | Bin 3976 -> 0 bytes .yarn/install-state.gz | Bin 153714 -> 0 bytes CHANGELOG.md | 713 - LICENSE | 21 - README.md | 43 - docs/administration.md | 490 - docs/comparison.html | 10474 ------ docs/support_table.md | 1882 - docs/supported.md | 1663 - package.json | 46 - site/assets/Asana-Math.woff2 | Bin 247716 -> 0 bytes site/assets/FiraMath-Regular.woff2 | Bin 97164 -> 0 bytes site/assets/GUST-FONT-LICENSE.txt | 30 - site/assets/LibertinusMath-Regular.woff2 | Bin 329152 -> 0 bytes site/assets/MANIFEST-Latin-Modern-Math.txt | 60 - site/assets/README-Latin-Modern-Math.txt | 92 - site/assets/STIXTwoMath-Regular.woff2 | Bin 551908 -> 0 bytes site/assets/Temml-Asana.css | 143 - site/assets/Temml-Fira.css | 154 - site/assets/Temml-Latin-Modern.css | 157 - site/assets/Temml-Libertinus.css | 154 - site/assets/Temml-Local.css | 140 - site/assets/Temml-STIX2.css | 144 - site/assets/Temml.woff2 | Bin 9404 -> 0 bytes site/assets/auto-render.min.js | 1 - site/assets/copy-tex.min.js | 1 - site/assets/latinmodernmath.woff2 | Bin 388456 -> 0 bytes site/assets/mhchem.min.js | 1 - site/assets/physics.js | 132 - site/assets/temml.min.js | 1 - site/assets/texvc.js | 61 - site/copy-tex.html | 46 - site/docs/docStyles.css | 377 - site/docs/en/administration.html | 254 - site/docs/en/comparison.html | 10466 ------ site/docs/en/support_table.html | 1630 - site/docs/en/supported.html | 768 - site/docs/katex.css | 11 - site/docs/sphere.jpg | Bin 12278 -> 0 bytes site/index.html | 231 - site/indexStyles.css | 206 - site/tests/Arrow note height table.html | 193 - site/tests/LaTeXML-tests.html | 112 - site/tests/environment-tests.html | 155 - site/tests/images/AccentsText.svg | 207 - site/tests/images/ArrayMode.svg | 330 - site/tests/images/ArrayType.svg | 33 - site/tests/images/Arrays.svg | 238 - site/tests/images/BinCancellation.svg | 99 - site/tests/images/BoldSymbol.svg | 178 - site/tests/images/CD.svg | 61 - site/tests/images/ColorBox.svg | 52 - site/tests/images/ColorImplicit.svg | 183 - site/tests/images/ColorSpacing.svg | 54 - site/tests/images/DashesAndQuotes.svg | 276 - site/tests/images/DelimiterSizing1.svg | 102 - site/tests/images/DelimiterSizing2.svg | 69 - site/tests/images/DisplayMode.svg | 52 - site/tests/images/ExtensibleArrows.svg | 326 - site/tests/images/Fractions1.svg | 119 - site/tests/images/Fractions2.svg | 158 - site/tests/images/HorizontalBraces.svg | 191 - site/tests/images/Integrands.svg | 129 - site/tests/images/LargeRuleNumerator.svg | 17 - site/tests/images/LeftRight.svg | 60 - site/tests/images/LeftRightListStyling.svg | 57 - site/tests/images/LeftRightMiddle.svg | 111 - site/tests/images/LeftRightStyleSizing.svg | 72 - site/tests/images/LimitControls.svg | 120 - site/tests/images/MathChoice.svg | 51 - site/tests/images/MathtoolsMatrix.svg | 69 - site/tests/images/NegativeSpace.svg | 55 - site/tests/images/NestedFractions.svg | 90 - .../tests/images/NullDelimiterInteraction.svg | 39 - site/tests/images/OpLimits.svg | 301 - site/tests/images/OperatorName.svg | 231 - site/tests/images/OverUnderline.svg | 87 - site/tests/images/OverUnderset.svg | 229 - site/tests/images/PrimeSpacing.svg | 57 - site/tests/images/PrimeSuper.svg | 81 - site/tests/images/RelativeUnits.svg | 99 - site/tests/images/SizingBaseline.svg | 63 - site/tests/images/SqrtRoot.svg | 169 - site/tests/images/StretchyAccent.svg | 385 - site/tests/images/StrikeThrough.svg | 337 - site/tests/images/StrikeThroughColor.svg | 103 - site/tests/images/StyleSpacing.svg | 33 - site/tests/images/StyleSwitching.svg | 61 - site/tests/images/SupSubCharacterBox.svg | 75 - site/tests/images/SupSubHorizSpacing.svg | 99 - site/tests/images/SupSubLeftAlignReset.svg | 85 - site/tests/images/SupSubOffsets.svg | 114 - site/tests/images/TextSpace.svg | 141 - site/tests/images/TextStacked.svg | 405 - site/tests/images/TextWithMath.svg | 226 - site/tests/images/accents.svg | 82 - site/tests/images/align.svg | 105 - site/tests/images/aligned.svg | 81 - site/tests/images/alignedat.svg | 123 - site/tests/images/angl.svg | 18 - site/tests/images/baseline.svg | 63 - site/tests/images/binom.svg | 99 - site/tests/images/boxed.svg | 76 - site/tests/images/cases.svg | 207 - site/tests/images/colors.svg | 21 - site/tests/images/displaystyle.svg | 73 - site/tests/images/dots.svg | 141 - site/tests/images/equation.svg | 96 - site/tests/images/ex1.gif | Bin 202 -> 0 bytes site/tests/images/ex10.gif | Bin 684 -> 0 bytes site/tests/images/ex11.gif | Bin 156 -> 0 bytes site/tests/images/ex12.gif | Bin 951 -> 0 bytes site/tests/images/ex13.gif | Bin 1763 -> 0 bytes site/tests/images/ex14.gif | Bin 1131 -> 0 bytes site/tests/images/ex15.gif | Bin 175 -> 0 bytes site/tests/images/ex16.gif | Bin 362 -> 0 bytes site/tests/images/ex17.gif | Bin 522 -> 0 bytes site/tests/images/ex18.gif | Bin 1476 -> 0 bytes site/tests/images/ex19.gif | Bin 467 -> 0 bytes site/tests/images/ex2.gif | Bin 163 -> 0 bytes site/tests/images/ex20.gif | Bin 144 -> 0 bytes site/tests/images/ex21.gif | Bin 1072 -> 0 bytes site/tests/images/ex22.gif | Bin 1039 -> 0 bytes site/tests/images/ex23.gif | Bin 1600 -> 0 bytes site/tests/images/ex24.gif | Bin 2003 -> 0 bytes site/tests/images/ex25.gif | Bin 145 -> 0 bytes site/tests/images/ex26.gif | Bin 343 -> 0 bytes site/tests/images/ex27.gif | Bin 222 -> 0 bytes site/tests/images/ex28.gif | Bin 179 -> 0 bytes site/tests/images/ex29.png | Bin 3313 -> 0 bytes site/tests/images/ex3.gif | Bin 349 -> 0 bytes site/tests/images/ex30.png | Bin 3392 -> 0 bytes site/tests/images/ex4.gif | Bin 268 -> 0 bytes site/tests/images/ex5.gif | Bin 235 -> 0 bytes site/tests/images/ex6.gif | Bin 906 -> 0 bytes site/tests/images/ex7.gif | Bin 739 -> 0 bytes site/tests/images/ex8.gif | Bin 416 -> 0 bytes site/tests/images/ex9.gif | Bin 869 -> 0 bytes site/tests/images/exponents.svg | 39 - site/tests/images/functions.svg | 78 - site/tests/images/gather.svg | 61 - site/tests/images/greek.svg | 33 - site/tests/images/kern.svg | 52 - site/tests/images/lap.svg | 220 - site/tests/images/latex.svg | 54 - site/tests/images/mathop.svg | 111 - site/tests/images/mod.svg | 183 - site/tests/images/newline.svg | 155 - site/tests/images/not.svg | 147 - site/tests/images/oldfont.svg | 128 - site/tests/images/phantom.svg | 147 - site/tests/images/pmb.svg | 54 - site/tests/images/raisebox.svg | 92 - site/tests/images/rcases.svg | 75 - site/tests/images/rlapbug.svg | 22 - site/tests/images/rule.svg | 9 - site/tests/images/sizing.svg | 64 - site/tests/images/smash.svg | 52 - site/tests/images/spacing.svg | 330 - site/tests/images/sqrt.svg | 176 - site/tests/images/stackrel.svg | 60 - site/tests/images/subarray.svg | 39 - site/tests/images/text.svg | 64 - site/tests/images/units.svg | 351 - site/tests/images/verb.svg | 271 - site/tests/katex-tests.html | 609 - site/tests/mhchem-tests.html | 204 - site/tests/mozilla-tests.html | 108 - site/tests/wiki-tests.html | 590 - site/xml-formatter.js | 432 - src/Lexer.js | 115 - src/MacroExpander.js | 436 - src/Namespace.js | 107 - src/ParseError.js | 64 - src/Parser.js | 993 - src/Settings.js | 54 - src/SourceLocation.js | 29 - src/Style.js | 144 - src/Token.js | 40 - src/asciiFromScript.js | 29 - src/buildMathML.js | 290 - src/constants.js | 25 - src/defineEnvironment.js | 25 - src/defineFunction.js | 69 - src/defineMacro.js | 11 - src/domTree.js | 185 - src/environments.js | 8 - src/environments/array.js | 872 - src/environments/cd.js | 253 - src/functions.js | 59 - src/functions/accent.js | 152 - src/functions/accentunder.js | 38 - src/functions/arrow.js | 230 - src/functions/cancelto.js | 36 - src/functions/char.js | 33 - src/functions/color.js | 250 - src/functions/cr.js | 45 - src/functions/def.js | 262 - src/functions/delimsizing.js | 325 - src/functions/enclose.js | 217 - src/functions/envTag.js | 38 - src/functions/environment.js | 59 - src/functions/font.js | 150 - src/functions/genfrac.js | 333 - src/functions/hbox.js | 30 - src/functions/horizBrace.js | 32 - src/functions/href.js | 90 - src/functions/html.js | 95 - src/functions/includegraphics.js | 131 - src/functions/kern.js | 75 - src/functions/label.js | 29 - src/functions/lap.js | 75 - src/functions/math.js | 40 - src/functions/mathchoice.js | 41 - src/functions/mclass.js | 207 - src/functions/multiscript.js | 91 - src/functions/not.js | 46 - src/functions/op.js | 346 - src/functions/operatorname.js | 141 - src/functions/ordgroup.js | 9 - src/functions/phantom.js | 73 - src/functions/pmb.js | 30 - src/functions/raise.js | 68 - src/functions/ref.js | 28 - src/functions/reflect.js | 24 - src/functions/relax.js | 16 - src/functions/rule.js | 52 - src/functions/sizing.js | 64 - src/functions/smash.js | 66 - src/functions/sqrt.js | 31 - src/functions/styling.js | 58 - src/functions/supsub.js | 149 - src/functions/symbolsOp.js | 53 - src/functions/symbolsOrd.js | 97 - src/functions/symbolsSpacing.js | 53 - src/functions/tag.js | 8 - src/functions/text.js | 75 - src/functions/tip.js | 63 - src/functions/toggle.js | 13 - src/functions/verb.js | 33 - src/linebreaking.js | 138 - src/macros.js | 705 - src/mathMLTree.js | 175 - src/parseNode.js | 42 - src/parseTree.js | 40 - src/postProcess.js | 57 - src/replace.js | 225 - src/stretchy.js | 113 - src/symbols.js | 1071 - src/tree.js | 50 - src/unicodeAccents.js | 16 - src/unicodeSupOrSub.js | 108 - src/unicodeSymbolBuilder.js | 31 - src/unicodeSymbols.js | 320 - src/units.js | 109 - src/utils.js | 127 - src/variant.js | 100 - temml.d.ts | 60 - temml.js | 187 - test/Investigate.html | 195 - test/LaTeXML-tests.md | 141 - test/auto-render.js | 212 - test/environment-tests.md | 143 - test/katex-tests.md | 1146 - test/main.css | 16 - test/mhchem-tests.md | 279 - test/mozilla-tests.md | 176 - test/processTests.js | 6 - test/repl.html | 60 - test/temml.js | 11634 ------ test/temmlPostProcess.js | 70 - test/unit-test.cjs | 2360 -- test/wiki-tests.md | 945 - utils/TeXZilla.js | 4220 --- utils/buildDocs.js | 97 - utils/buildTests.js | 33 - utils/copyfiles.js | 65 - utils/hurmet.cjs | 31088 ---------------- utils/insertPlugins.js | 22 - utils/katex.min.js | 1 - utils/rollupConfig.js | 28 - utils/temml.cjs | 13531 ------- utils/temml.mjs | 13529 ------- yarn.lock | 1864 - 425 files changed, 153044 deletions(-) delete mode 100644 .editorconfig delete mode 100644 .eslintignore delete mode 100644 .eslintrc delete mode 100644 .gitattributes delete mode 100644 .gitignore delete mode 100644 .pnp.cjs delete mode 100644 .pnp.loader.mjs delete mode 100644 .yarn/cache/@eslint-community-eslint-utils-npm-4.4.0-d1791bd5a3-cdfe3ae42b.zip delete mode 100644 .yarn/cache/@humanwhocodes-module-importer-npm-1.0.1-9d07ed2e4a-0fd22007db.zip delete mode 100644 .yarn/cache/@jridgewell-set-array-npm-1.1.2-45b82d7fb6-69a84d5980.zip delete mode 100644 .yarn/cache/@nodelib-fs.scandir-npm-2.1.5-89c67370dd-a970d595bd.zip delete mode 100644 .yarn/cache/@nodelib-fs.stat-npm-2.0.5-01f4dd3030-012480b5ca.zip delete mode 100644 .yarn/cache/@nodelib-fs.walk-npm-1.2.8-b4a89da548-190c643f15.zip delete mode 100644 .yarn/cache/@tootallnate-once-npm-2.0.0-e36cf4f140-ad87447820.zip delete mode 100644 .yarn/cache/abbrev-npm-1.1.1-3659247eab-a4a97ec07d.zip delete mode 100644 .yarn/cache/acorn-jsx-npm-5.3.2-d7594599ea-c3d3b2a89c.zip delete mode 100644 .yarn/cache/agent-base-npm-6.0.2-428f325a93-f52b6872cc.zip delete mode 100644 .yarn/cache/aggregate-error-npm-3.1.0-415a406f4e-1101a33f21.zip delete mode 100644 .yarn/cache/ajv-npm-6.12.6-4b5105e2b2-874972efe5.zip delete mode 100644 .yarn/cache/ansi-regex-npm-5.0.1-c963a48615-2aa4bb54ca.zip delete mode 100644 .yarn/cache/ansi-styles-npm-4.3.0-245c7d42c7-513b44c3b2.zip delete mode 100644 .yarn/cache/aproba-npm-2.0.0-8716bcfde6-5615cadcfb.zip delete mode 100644 .yarn/cache/are-we-there-yet-npm-3.0.1-3395b1512f-52590c2486.zip delete mode 100644 .yarn/cache/argparse-npm-2.0.1-faff7999e6-83644b5649.zip delete mode 100644 .yarn/cache/brace-expansion-npm-1.1.11-fb95eb05ad-faf34a7bb0.zip delete mode 100644 .yarn/cache/brace-expansion-npm-2.0.1-17aa2616f9-a61e7cd2e8.zip delete mode 100644 .yarn/cache/callsites-npm-3.1.0-268f989910-072d17b6ab.zip delete mode 100644 .yarn/cache/chalk-npm-4.1.2-ba8b67ab80-fe75c9d5c7.zip delete mode 100644 .yarn/cache/chownr-npm-2.0.0-638f1c9c61-c57cf9dd07.zip delete mode 100644 .yarn/cache/clean-stack-npm-2.2.0-a8ce435a5c-2ac8cd2b2f.zip delete mode 100644 .yarn/cache/color-convert-npm-2.0.1-79730e935b-79e6bdb9fd.zip delete mode 100644 .yarn/cache/color-name-npm-1.1.4-025792b0ea-b044585952.zip delete mode 100644 .yarn/cache/color-support-npm-1.1.3-3be5c53455-9b73568176.zip delete mode 100644 .yarn/cache/commander-npm-2.20.3-d8dcbaa39b-ab8c07884e.zip delete mode 100644 .yarn/cache/concat-map-npm-0.0.1-85a921b7ee-902a9f5d89.zip delete mode 100644 .yarn/cache/console-control-strings-npm-1.1.0-e3160e5275-8755d76787.zip delete mode 100644 .yarn/cache/cross-spawn-npm-7.0.3-e4ff3e65b3-671cc7c728.zip delete mode 100644 .yarn/cache/debug-npm-4.3.4-4513954577-3dbad3f94e.zip delete mode 100644 .yarn/cache/deep-is-npm-0.1.4-88938b5a67-edb65dd0d7.zip delete mode 100644 .yarn/cache/delegates-npm-1.0.0-9b1942d75f-a51744d9b5.zip delete mode 100644 .yarn/cache/doctrine-npm-3.0.0-c6f1615f04-fd7673ca77.zip delete mode 100644 .yarn/cache/emoji-regex-npm-8.0.0-213764015c-d4c5c39d5a.zip delete mode 100644 .yarn/cache/encoding-npm-0.1.13-82a1837d30-bb98632f8f.zip delete mode 100644 .yarn/cache/env-paths-npm-2.2.1-7c7577428c-65b5df55a8.zip delete mode 100644 .yarn/cache/err-code-npm-2.0.3-082e0ff9a7-8b7b1be20d.zip delete mode 100644 .yarn/cache/escape-string-regexp-npm-4.0.0-4b531d8d59-98b48897d9.zip delete mode 100644 .yarn/cache/esm-npm-3.2.25-762b3ebd40-978aabe2de.zip delete mode 100644 .yarn/cache/esquery-npm-1.5.0-d8f8a06879-aefb0d2596.zip delete mode 100644 .yarn/cache/esrecurse-npm-4.3.0-10b86a887a-ebc17b1a33.zip delete mode 100644 .yarn/cache/estraverse-npm-5.3.0-03284f8f63-072780882d.zip delete mode 100644 .yarn/cache/esutils-npm-2.0.3-f865beafd5-22b5b08f74.zip delete mode 100644 .yarn/cache/fast-deep-equal-npm-3.1.3-790edcfcf5-e21a9d8d84.zip delete mode 100644 .yarn/cache/fast-json-stable-stringify-npm-2.1.0-02e8905fda-b191531e36.zip delete mode 100644 .yarn/cache/fast-levenshtein-npm-2.0.6-fcd74b8df5-92cfec0a8d.zip delete mode 100644 .yarn/cache/fastq-npm-1.15.0-1013f6514e-0170e6bfcd.zip delete mode 100644 .yarn/cache/file-entry-cache-npm-6.0.1-31965cf0af-f49701feaa.zip delete mode 100644 .yarn/cache/find-up-npm-5.0.0-e03e9b796d-07955e3573.zip delete mode 100644 .yarn/cache/fs-minipass-npm-2.1.0-501ef87306-1b8d128dae.zip delete mode 100644 .yarn/cache/fs.realpath-npm-1.0.0-c8f05d8126-99ddea01a7.zip delete mode 100644 .yarn/cache/gauge-npm-4.0.4-8f878385e9-788b6bfe52.zip delete mode 100644 .yarn/cache/glob-npm-7.2.3-2d866d17a5-29452e97b3.zip delete mode 100644 .yarn/cache/glob-parent-npm-6.0.2-2cbef12738-c13ee97978.zip delete mode 100644 .yarn/cache/has-flag-npm-4.0.0-32af9f0536-261a135703.zip delete mode 100644 .yarn/cache/has-unicode-npm-2.0.1-893adb4747-1eab07a743.zip delete mode 100644 .yarn/cache/http-proxy-agent-npm-5.0.0-7f1f121b83-e2ee1ff165.zip delete mode 100644 .yarn/cache/https-proxy-agent-npm-5.0.1-42d65f358e-571fccdf38.zip delete mode 100644 .yarn/cache/humanize-ms-npm-1.2.1-e942bd7329-9c7a74a282.zip delete mode 100644 .yarn/cache/iconv-lite-npm-0.6.3-24b8aae27e-3f60d47a5c.zip delete mode 100644 .yarn/cache/ignore-npm-5.2.4-fbe6e989e5-3d4c309c60.zip delete mode 100644 .yarn/cache/import-fresh-npm-3.3.0-3e34265ca9-2cacfad06e.zip delete mode 100644 .yarn/cache/imurmurhash-npm-0.1.4-610c5068a0-7cae75c8cd.zip delete mode 100644 .yarn/cache/indent-string-npm-4.0.0-7b717435b2-824cfb9929.zip delete mode 100644 .yarn/cache/inflight-npm-1.0.6-ccedb4b908-f4f76aa072.zip delete mode 100644 .yarn/cache/inherits-npm-2.0.4-c66b3957a0-4a48a73384.zip delete mode 100644 .yarn/cache/ip-npm-2.0.0-204facb3cc-cfcfac6b87.zip delete mode 100644 .yarn/cache/is-extglob-npm-2.1.1-0870ea68b5-df033653d0.zip delete mode 100644 .yarn/cache/is-fullwidth-code-point-npm-3.0.0-1ecf4ebee5-44a30c2945.zip delete mode 100644 .yarn/cache/is-glob-npm-4.0.3-cb87bf1bdb-d381c1319f.zip delete mode 100644 .yarn/cache/is-lambda-npm-1.0.1-7ab55bc8a8-93a32f0194.zip delete mode 100644 .yarn/cache/is-path-inside-npm-3.0.3-2ea0ef44fd-abd50f0618.zip delete mode 100644 .yarn/cache/isexe-npm-2.0.0-b58870bd2e-26bf6c5480.zip delete mode 100644 .yarn/cache/js-yaml-npm-4.1.0-3606f32312-c7830dfd45.zip delete mode 100644 .yarn/cache/json-schema-traverse-npm-0.4.1-4759091693-7486074d3b.zip delete mode 100644 .yarn/cache/json-stable-stringify-without-jsonify-npm-1.0.1-b65772b28b-cff44156dd.zip delete mode 100644 .yarn/cache/levn-npm-0.4.1-d183b2d7bb-12c5021c85.zip delete mode 100644 .yarn/cache/locate-path-npm-6.0.0-06a1e4c528-72eb661788.zip delete mode 100644 .yarn/cache/lodash.merge-npm-4.6.2-77cb4416bf-ad580b4bdb.zip delete mode 100644 .yarn/cache/lru-cache-npm-6.0.0-b4c8668fe1-f97f499f89.zip delete mode 100644 .yarn/cache/minimatch-npm-3.1.2-9405269906-c154e56640.zip delete mode 100644 .yarn/cache/minipass-collect-npm-1.0.2-3b4676eab5-14df761028.zip delete mode 100644 .yarn/cache/minipass-flush-npm-1.0.5-efe79d9826-56269a0b22.zip delete mode 100644 .yarn/cache/minipass-pipeline-npm-1.2.4-5924cb077f-b14240dac0.zip delete mode 100644 .yarn/cache/minipass-sized-npm-1.0.3-306d86f432-79076749fc.zip delete mode 100644 .yarn/cache/minizlib-npm-2.1.2-ea89cd0cfb-f1fdeac0b0.zip delete mode 100644 .yarn/cache/mkdirp-npm-1.0.4-37f6ef56b9-a96865108c.zip delete mode 100644 .yarn/cache/ms-npm-2.1.2-ec0c1512ff-673cdb2c31.zip delete mode 100644 .yarn/cache/ms-npm-2.1.3-81ff3cfac1-aa92de6080.zip delete mode 100644 .yarn/cache/natural-compare-npm-1.4.0-97b75b362d-23ad088b08.zip delete mode 100644 .yarn/cache/negotiator-npm-0.6.3-9d50e36171-b8ffeb1e26.zip delete mode 100644 .yarn/cache/npmlog-npm-6.0.2-e0e69455c7-ae238cd264.zip delete mode 100644 .yarn/cache/once-npm-1.4.0-ccf03ef07a-cd0a885013.zip delete mode 100644 .yarn/cache/p-limit-npm-3.1.0-05d2ede37f-7c3690c4db.zip delete mode 100644 .yarn/cache/p-locate-npm-5.0.0-92cc7c7a3e-1623088f36.zip delete mode 100644 .yarn/cache/p-map-npm-4.0.0-4677ae07c7-cb0ab21ec0.zip delete mode 100644 .yarn/cache/parent-module-npm-1.0.1-1fae11b095-6ba8b25514.zip delete mode 100644 .yarn/cache/path-exists-npm-4.0.0-e9e4f63eb0-505807199d.zip delete mode 100644 .yarn/cache/path-is-absolute-npm-1.0.1-31bc695ffd-060840f92c.zip delete mode 100644 .yarn/cache/path-key-npm-3.1.1-0e66ea8321-55cd7a9dd4.zip delete mode 100644 .yarn/cache/prelude-ls-npm-1.2.1-3e4d272a55-cd192ec0d0.zip delete mode 100644 .yarn/cache/promise-retry-npm-2.0.1-871f0b01b7-f96a3f6d90.zip delete mode 100644 .yarn/cache/punycode-npm-2.3.0-df4bdce06b-39f760e09a.zip delete mode 100644 .yarn/cache/queue-microtask-npm-1.2.3-fcc98e4e2d-b676f8c040.zip delete mode 100644 .yarn/cache/resolve-from-npm-4.0.0-f758ec21bf-f4ba0b8494.zip delete mode 100644 .yarn/cache/retry-npm-0.12.0-72ac7fb4cc-623bd7d2e5.zip delete mode 100644 .yarn/cache/reusify-npm-1.0.4-95ac4aec11-c3076ebcc2.zip delete mode 100644 .yarn/cache/rimraf-npm-3.0.2-2cb7dac69a-87f4164e39.zip delete mode 100644 .yarn/cache/run-parallel-npm-1.2.0-3f47ff2034-cb4f97ad25.zip delete mode 100644 .yarn/cache/safe-buffer-npm-5.2.1-3481c8aa9b-b99c4b41fd.zip delete mode 100644 .yarn/cache/safer-buffer-npm-2.1.2-8d5c0b705e-cab8f25ae6.zip delete mode 100644 .yarn/cache/set-blocking-npm-2.0.0-49e2cffa24-6e65a05f7c.zip delete mode 100644 .yarn/cache/shebang-command-npm-2.0.0-eb2b01921d-6b52fe8727.zip delete mode 100644 .yarn/cache/shebang-regex-npm-3.0.0-899a0cd65e-1a2bcae50d.zip delete mode 100644 .yarn/cache/signal-exit-npm-3.0.7-bd270458a3-a2f098f247.zip delete mode 100644 .yarn/cache/smart-buffer-npm-4.2.0-5ac3f668bb-b5167a7142.zip delete mode 100644 .yarn/cache/socks-proxy-agent-npm-7.0.0-7aacf32ea0-7205543701.zip delete mode 100644 .yarn/cache/source-map-npm-0.6.1-1a3621db16-59ce8640cf.zip delete mode 100644 .yarn/cache/source-map-support-npm-0.5.21-09ca99e250-43e98d700d.zip delete mode 100644 .yarn/cache/string-width-npm-4.2.3-2c27177bae-e52c10dc3f.zip delete mode 100644 .yarn/cache/string_decoder-npm-1.3.0-2422117fd0-8417646695.zip delete mode 100644 .yarn/cache/strip-ansi-npm-6.0.1-caddc7cb40-f3cd25890a.zip delete mode 100644 .yarn/cache/strip-json-comments-npm-3.1.1-dcb2324823-492f73e272.zip delete mode 100644 .yarn/cache/supports-color-npm-7.2.0-606bfcf7da-3dda818de0.zip delete mode 100644 .yarn/cache/text-table-npm-0.2.0-d92a778b59-b6937a38c8.zip delete mode 100644 .yarn/cache/type-check-npm-0.4.0-60565800ce-ec688ebfc9.zip delete mode 100644 .yarn/cache/type-fest-npm-0.20.2-b36432617f-4fb3272df2.zip delete mode 100644 .yarn/cache/uri-js-npm-4.4.1-66d11cbcaf-7167432de6.zip delete mode 100644 .yarn/cache/util-deprecate-npm-1.0.2-e3fe1a219c-474acf1146.zip delete mode 100644 .yarn/cache/which-npm-2.0.2-320ddf72f7-1a5c563d3c.zip delete mode 100644 .yarn/cache/wide-align-npm-1.1.5-889d77e592-d5fc37cd56.zip delete mode 100644 .yarn/cache/wrappy-npm-1.0.2-916de4d4b3-159da4805f.zip delete mode 100644 .yarn/cache/yallist-npm-4.0.0-b493d9e907-343617202a.zip delete mode 100644 .yarn/cache/yocto-queue-npm-0.1.0-c6c9a7db29-f77b3d8d00.zip delete mode 100644 .yarn/install-state.gz delete mode 100644 CHANGELOG.md delete mode 100644 LICENSE delete mode 100644 README.md delete mode 100644 docs/administration.md delete mode 100644 docs/comparison.html delete mode 100644 docs/support_table.md delete mode 100644 docs/supported.md delete mode 100644 package.json delete mode 100644 site/assets/Asana-Math.woff2 delete mode 100644 site/assets/FiraMath-Regular.woff2 delete mode 100644 site/assets/GUST-FONT-LICENSE.txt delete mode 100644 site/assets/LibertinusMath-Regular.woff2 delete mode 100644 site/assets/MANIFEST-Latin-Modern-Math.txt delete mode 100644 site/assets/README-Latin-Modern-Math.txt delete mode 100644 site/assets/STIXTwoMath-Regular.woff2 delete mode 100644 site/assets/Temml-Asana.css delete mode 100644 site/assets/Temml-Fira.css delete mode 100644 site/assets/Temml-Latin-Modern.css delete mode 100644 site/assets/Temml-Libertinus.css delete mode 100644 site/assets/Temml-Local.css delete mode 100644 site/assets/Temml-STIX2.css delete mode 100644 site/assets/Temml.woff2 delete mode 100644 site/assets/auto-render.min.js delete mode 100644 site/assets/copy-tex.min.js delete mode 100644 site/assets/latinmodernmath.woff2 delete mode 100644 site/assets/mhchem.min.js delete mode 100644 site/assets/physics.js delete mode 100644 site/assets/temml.min.js delete mode 100644 site/assets/texvc.js delete mode 100644 site/copy-tex.html delete mode 100644 site/docs/docStyles.css delete mode 100644 site/docs/en/administration.html delete mode 100644 site/docs/en/comparison.html delete mode 100644 site/docs/en/support_table.html delete mode 100644 site/docs/en/supported.html delete mode 100644 site/docs/katex.css delete mode 100644 site/docs/sphere.jpg delete mode 100644 site/index.html delete mode 100644 site/indexStyles.css delete mode 100644 site/tests/Arrow note height table.html delete mode 100644 site/tests/LaTeXML-tests.html delete mode 100644 site/tests/environment-tests.html delete mode 100644 site/tests/images/AccentsText.svg delete mode 100644 site/tests/images/ArrayMode.svg delete mode 100644 site/tests/images/ArrayType.svg delete mode 100644 site/tests/images/Arrays.svg delete mode 100644 site/tests/images/BinCancellation.svg delete mode 100644 site/tests/images/BoldSymbol.svg delete mode 100644 site/tests/images/CD.svg delete mode 100644 site/tests/images/ColorBox.svg delete mode 100644 site/tests/images/ColorImplicit.svg delete mode 100644 site/tests/images/ColorSpacing.svg delete mode 100644 site/tests/images/DashesAndQuotes.svg delete mode 100644 site/tests/images/DelimiterSizing1.svg delete mode 100644 site/tests/images/DelimiterSizing2.svg delete mode 100644 site/tests/images/DisplayMode.svg delete mode 100644 site/tests/images/ExtensibleArrows.svg delete mode 100644 site/tests/images/Fractions1.svg delete mode 100644 site/tests/images/Fractions2.svg delete mode 100644 site/tests/images/HorizontalBraces.svg delete mode 100644 site/tests/images/Integrands.svg delete mode 100644 site/tests/images/LargeRuleNumerator.svg delete mode 100644 site/tests/images/LeftRight.svg delete mode 100644 site/tests/images/LeftRightListStyling.svg delete mode 100644 site/tests/images/LeftRightMiddle.svg delete mode 100644 site/tests/images/LeftRightStyleSizing.svg delete mode 100644 site/tests/images/LimitControls.svg delete mode 100644 site/tests/images/MathChoice.svg delete mode 100644 site/tests/images/MathtoolsMatrix.svg delete mode 100644 site/tests/images/NegativeSpace.svg delete mode 100644 site/tests/images/NestedFractions.svg delete mode 100644 site/tests/images/NullDelimiterInteraction.svg delete mode 100644 site/tests/images/OpLimits.svg delete mode 100644 site/tests/images/OperatorName.svg delete mode 100644 site/tests/images/OverUnderline.svg delete mode 100644 site/tests/images/OverUnderset.svg delete mode 100644 site/tests/images/PrimeSpacing.svg delete mode 100644 site/tests/images/PrimeSuper.svg delete mode 100644 site/tests/images/RelativeUnits.svg delete mode 100644 site/tests/images/SizingBaseline.svg delete mode 100644 site/tests/images/SqrtRoot.svg delete mode 100644 site/tests/images/StretchyAccent.svg delete mode 100644 site/tests/images/StrikeThrough.svg delete mode 100644 site/tests/images/StrikeThroughColor.svg delete mode 100644 site/tests/images/StyleSpacing.svg delete mode 100644 site/tests/images/StyleSwitching.svg delete mode 100644 site/tests/images/SupSubCharacterBox.svg delete mode 100644 site/tests/images/SupSubHorizSpacing.svg delete mode 100644 site/tests/images/SupSubLeftAlignReset.svg delete mode 100644 site/tests/images/SupSubOffsets.svg delete mode 100644 site/tests/images/TextSpace.svg delete mode 100644 site/tests/images/TextStacked.svg delete mode 100644 site/tests/images/TextWithMath.svg delete mode 100644 site/tests/images/accents.svg delete mode 100644 site/tests/images/align.svg delete mode 100644 site/tests/images/aligned.svg delete mode 100644 site/tests/images/alignedat.svg delete mode 100644 site/tests/images/angl.svg delete mode 100644 site/tests/images/baseline.svg delete mode 100644 site/tests/images/binom.svg delete mode 100644 site/tests/images/boxed.svg delete mode 100644 site/tests/images/cases.svg delete mode 100644 site/tests/images/colors.svg delete mode 100644 site/tests/images/displaystyle.svg delete mode 100644 site/tests/images/dots.svg delete mode 100644 site/tests/images/equation.svg delete mode 100644 site/tests/images/ex1.gif delete mode 100644 site/tests/images/ex10.gif delete mode 100644 site/tests/images/ex11.gif delete mode 100644 site/tests/images/ex12.gif delete mode 100644 site/tests/images/ex13.gif delete mode 100644 site/tests/images/ex14.gif delete mode 100644 site/tests/images/ex15.gif delete mode 100644 site/tests/images/ex16.gif delete mode 100644 site/tests/images/ex17.gif delete mode 100644 site/tests/images/ex18.gif delete mode 100644 site/tests/images/ex19.gif delete mode 100644 site/tests/images/ex2.gif delete mode 100644 site/tests/images/ex20.gif delete mode 100644 site/tests/images/ex21.gif delete mode 100644 site/tests/images/ex22.gif delete mode 100644 site/tests/images/ex23.gif delete mode 100644 site/tests/images/ex24.gif delete mode 100644 site/tests/images/ex25.gif delete mode 100644 site/tests/images/ex26.gif delete mode 100644 site/tests/images/ex27.gif delete mode 100644 site/tests/images/ex28.gif delete mode 100644 site/tests/images/ex29.png delete mode 100644 site/tests/images/ex3.gif delete mode 100644 site/tests/images/ex30.png delete mode 100644 site/tests/images/ex4.gif delete mode 100644 site/tests/images/ex5.gif delete mode 100644 site/tests/images/ex6.gif delete mode 100644 site/tests/images/ex7.gif delete mode 100644 site/tests/images/ex8.gif delete mode 100644 site/tests/images/ex9.gif delete mode 100644 site/tests/images/exponents.svg delete mode 100644 site/tests/images/functions.svg delete mode 100644 site/tests/images/gather.svg delete mode 100644 site/tests/images/greek.svg delete mode 100644 site/tests/images/kern.svg delete mode 100644 site/tests/images/lap.svg delete mode 100644 site/tests/images/latex.svg delete mode 100644 site/tests/images/mathop.svg delete mode 100644 site/tests/images/mod.svg delete mode 100644 site/tests/images/newline.svg delete mode 100644 site/tests/images/not.svg delete mode 100644 site/tests/images/oldfont.svg delete mode 100644 site/tests/images/phantom.svg delete mode 100644 site/tests/images/pmb.svg delete mode 100644 site/tests/images/raisebox.svg delete mode 100644 site/tests/images/rcases.svg delete mode 100644 site/tests/images/rlapbug.svg delete mode 100644 site/tests/images/rule.svg delete mode 100644 site/tests/images/sizing.svg delete mode 100644 site/tests/images/smash.svg delete mode 100644 site/tests/images/spacing.svg delete mode 100644 site/tests/images/sqrt.svg delete mode 100644 site/tests/images/stackrel.svg delete mode 100644 site/tests/images/subarray.svg delete mode 100644 site/tests/images/text.svg delete mode 100644 site/tests/images/units.svg delete mode 100644 site/tests/images/verb.svg delete mode 100644 site/tests/katex-tests.html delete mode 100644 site/tests/mhchem-tests.html delete mode 100644 site/tests/mozilla-tests.html delete mode 100644 site/tests/wiki-tests.html delete mode 100644 site/xml-formatter.js delete mode 100644 src/Lexer.js delete mode 100644 src/MacroExpander.js delete mode 100644 src/Namespace.js delete mode 100644 src/ParseError.js delete mode 100644 src/Parser.js delete mode 100644 src/Settings.js delete mode 100644 src/SourceLocation.js delete mode 100644 src/Style.js delete mode 100644 src/Token.js delete mode 100644 src/asciiFromScript.js delete mode 100644 src/buildMathML.js delete mode 100644 src/constants.js delete mode 100644 src/defineEnvironment.js delete mode 100644 src/defineFunction.js delete mode 100644 src/defineMacro.js delete mode 100644 src/domTree.js delete mode 100644 src/environments.js delete mode 100644 src/environments/array.js delete mode 100644 src/environments/cd.js delete mode 100644 src/functions.js delete mode 100644 src/functions/accent.js delete mode 100644 src/functions/accentunder.js delete mode 100644 src/functions/arrow.js delete mode 100644 src/functions/cancelto.js delete mode 100644 src/functions/char.js delete mode 100644 src/functions/color.js delete mode 100644 src/functions/cr.js delete mode 100644 src/functions/def.js delete mode 100644 src/functions/delimsizing.js delete mode 100644 src/functions/enclose.js delete mode 100644 src/functions/envTag.js delete mode 100644 src/functions/environment.js delete mode 100644 src/functions/font.js delete mode 100644 src/functions/genfrac.js delete mode 100644 src/functions/hbox.js delete mode 100644 src/functions/horizBrace.js delete mode 100644 src/functions/href.js delete mode 100644 src/functions/html.js delete mode 100644 src/functions/includegraphics.js delete mode 100644 src/functions/kern.js delete mode 100644 src/functions/label.js delete mode 100644 src/functions/lap.js delete mode 100644 src/functions/math.js delete mode 100644 src/functions/mathchoice.js delete mode 100644 src/functions/mclass.js delete mode 100644 src/functions/multiscript.js delete mode 100644 src/functions/not.js delete mode 100644 src/functions/op.js delete mode 100644 src/functions/operatorname.js delete mode 100644 src/functions/ordgroup.js delete mode 100644 src/functions/phantom.js delete mode 100644 src/functions/pmb.js delete mode 100644 src/functions/raise.js delete mode 100644 src/functions/ref.js delete mode 100644 src/functions/reflect.js delete mode 100644 src/functions/relax.js delete mode 100644 src/functions/rule.js delete mode 100644 src/functions/sizing.js delete mode 100644 src/functions/smash.js delete mode 100644 src/functions/sqrt.js delete mode 100644 src/functions/styling.js delete mode 100644 src/functions/supsub.js delete mode 100644 src/functions/symbolsOp.js delete mode 100644 src/functions/symbolsOrd.js delete mode 100644 src/functions/symbolsSpacing.js delete mode 100644 src/functions/tag.js delete mode 100644 src/functions/text.js delete mode 100644 src/functions/tip.js delete mode 100644 src/functions/toggle.js delete mode 100644 src/functions/verb.js delete mode 100644 src/linebreaking.js delete mode 100644 src/macros.js delete mode 100644 src/mathMLTree.js delete mode 100644 src/parseNode.js delete mode 100644 src/parseTree.js delete mode 100644 src/postProcess.js delete mode 100644 src/replace.js delete mode 100644 src/stretchy.js delete mode 100644 src/symbols.js delete mode 100644 src/tree.js delete mode 100644 src/unicodeAccents.js delete mode 100644 src/unicodeSupOrSub.js delete mode 100644 src/unicodeSymbolBuilder.js delete mode 100644 src/unicodeSymbols.js delete mode 100644 src/units.js delete mode 100644 src/utils.js delete mode 100644 src/variant.js delete mode 100644 temml.d.ts delete mode 100644 temml.js delete mode 100644 test/Investigate.html delete mode 100644 test/LaTeXML-tests.md delete mode 100644 test/auto-render.js delete mode 100644 test/environment-tests.md delete mode 100644 test/katex-tests.md delete mode 100644 test/main.css delete mode 100644 test/mhchem-tests.md delete mode 100644 test/mozilla-tests.md delete mode 100644 test/processTests.js delete mode 100644 test/repl.html delete mode 100644 test/temml.js delete mode 100644 test/temmlPostProcess.js delete mode 100644 test/unit-test.cjs delete mode 100644 test/wiki-tests.md delete mode 100644 utils/TeXZilla.js delete mode 100644 utils/buildDocs.js delete mode 100644 utils/buildTests.js delete mode 100644 utils/copyfiles.js delete mode 100644 utils/hurmet.cjs delete mode 100644 utils/insertPlugins.js delete mode 100644 utils/katex.min.js delete mode 100644 utils/rollupConfig.js delete mode 100644 utils/temml.cjs delete mode 100644 utils/temml.mjs delete mode 100644 yarn.lock diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 1ed453a3..00000000 --- a/.editorconfig +++ /dev/null @@ -1,10 +0,0 @@ -root = true - -[*] -end_of_line = lf -insert_final_newline = true - -[*.{js,json,yml}] -charset = utf-8 -indent_style = space -indent_size = 2 diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index a0a65c66..00000000 --- a/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -contrib/auto-render/test/*.js -src/autocorrect.js diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 0511c021..00000000 --- a/.eslintrc +++ /dev/null @@ -1,73 +0,0 @@ -{ - "extends": [ - "eslint:recommended" - ], - "globals":{ - "BigInt":true - }, - "rules": { - "arrow-spacing": 2, - "brace-style": [2, "1tbs", { "allowSingleLine": true }], - "camelcase": [2, { "properties": "never" }], - "comma-dangle": [2, "never"], - "comma-spacing": [2, { "before": false, "after": true }], - "constructor-super": 2, - "curly": 2, - "eol-last": 2, - "eqeqeq": [2, "allow-null"], - "guard-for-in": 2, - "indent": "off", - "indent-legacy": [2, 2, {"SwitchCase": 1}], - "keyword-spacing": 2, - "linebreak-style": [2, "unix"], - "max-len": [2, 100, 4, { "ignoreUrls": true, "ignoreRegExpLiterals": true }], - "new-cap": 2, - "no-alert": 2, - "no-array-constructor": 2, - "no-console": 2, - "no-const-assign": 2, - "no-debugger": 2, - "no-dupe-class-members": 2, - "no-dupe-keys": 2, - "no-extra-bind": 2, - "no-misleading-character-class": 0, - "no-new": 2, - "no-new-func": 2, - "no-new-object": 2, - "no-spaced-func": 2, - "no-this-before-super": 2, - "no-throw-literal": 2, - "no-trailing-spaces": 2, - "no-undef": 2, - "no-unexpected-multiline": 2, - "no-unreachable": 2, - "no-unused-vars": [2, {"args": "none", "varsIgnorePattern": "^_*$"}], - "no-useless-call": 2, - "no-var": 2, - "no-with": 2, - "object-curly-spacing": [2, "always"], - "one-var": [2, "never"], - "prefer-const": 2, - "prefer-spread": 0, - "semi": 0, - "space-before-blocks": 2, - "space-before-function-paren": [2, "never"], - "space-infix-ops": 2, - "space-unary-ops": 2, - "prefer-template": 0, - "arrow-parens": 0, - "prefer-arrow-callback": 0, - "valid-jsdoc": 0, - "require-jsdoc": 0 - }, - "env": { - "node": true, - "browser": true, - "es6": true - }, - "parserOptions": { - "ecmaVersion": 8, - "sourceType": "module" - }, - "root": true -} diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 5dc46e6b..00000000 --- a/.gitattributes +++ /dev/null @@ -1,3 +0,0 @@ -* text=auto eol=lf -*.{cmd,[cC][mM][dD]} text eol=crlf -*.{bat,[bB][aA][tT]} text eol=crlf \ No newline at end of file diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 44b27430..00000000 --- a/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules -.yarn diff --git a/.pnp.cjs b/.pnp.cjs deleted file mode 100644 index e5663137..00000000 --- a/.pnp.cjs +++ /dev/null @@ -1,12643 +0,0 @@ -#!/usr/bin/env node -/* eslint-disable */ -"use strict"; - -function $$SETUP_STATE(hydrateRuntimeState, basePath) { - return hydrateRuntimeState(JSON.parse('{\ - "__info": [\ - "This file is automatically generated. Do not touch it, or risk",\ - "your modifications being lost. We also recommend you not to read",\ - "it either without using the @yarnpkg/pnp package, as the data layout",\ - "is entirely unspecified and WILL change from a version to another."\ - ],\ - "dependencyTreeRoots": [\ - {\ - "name": "temml",\ - "reference": "workspace:."\ - }\ - ],\ - "enableTopLevelFallback": true,\ - "ignorePatternData": "(^(?:\\\\.yarn\\\\/sdks(?:\\\\/(?!\\\\.{1,2}(?:\\\\/|$))(?:(?:(?!(?:^|\\\\/)\\\\.{1,2}(?:\\\\/|$)).)*?)|$))$)",\ - "fallbackExclusionList": [\ - ["temml", ["workspace:."]]\ - ],\ - "fallbackPool": [\ - ],\ - "packageRegistryData": [\ - [null, [\ - [null, {\ - "packageLocation": "./",\ - "packageDependencies": [\ - ["eslint", "npm:8.52.0"],\ - ["esm", "npm:3.2.25"],\ - ["rollup", "npm:2.79.1"],\ - ["terser", "npm:5.22.0"]\ - ],\ - "linkType": "SOFT"\ - }]\ - ]],\ - ["@aashutoshrathi/word-wrap", [\ - ["npm:1.2.6", {\ - "packageLocation": "./.yarn/cache/@aashutoshrathi-word-wrap-npm-1.2.6-5b1d95e487-ada901b9e7.zip/node_modules/@aashutoshrathi/word-wrap/",\ - "packageDependencies": [\ - ["@aashutoshrathi/word-wrap", "npm:1.2.6"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["@eslint-community/eslint-utils", [\ - ["npm:4.4.0", {\ - "packageLocation": "./.yarn/cache/@eslint-community-eslint-utils-npm-4.4.0-d1791bd5a3-cdfe3ae42b.zip/node_modules/@eslint-community/eslint-utils/",\ - "packageDependencies": [\ - ["@eslint-community/eslint-utils", "npm:4.4.0"]\ - ],\ - "linkType": "SOFT"\ - }],\ - ["virtual:e7f048a4398cf12bbd1cde95eff45a3327b9fe42e04c31ed99d0e926830d0b78ff78b511118c2bd3bc6add84782ab97a5b001e972071d6fdbfe85a86c150922a#npm:4.4.0", {\ - "packageLocation": "./.yarn/__virtual__/@eslint-community-eslint-utils-virtual-a282c466c0/0/cache/@eslint-community-eslint-utils-npm-4.4.0-d1791bd5a3-cdfe3ae42b.zip/node_modules/@eslint-community/eslint-utils/",\ - "packageDependencies": [\ - ["@eslint-community/eslint-utils", "virtual:e7f048a4398cf12bbd1cde95eff45a3327b9fe42e04c31ed99d0e926830d0b78ff78b511118c2bd3bc6add84782ab97a5b001e972071d6fdbfe85a86c150922a#npm:4.4.0"],\ - ["@types/eslint", null],\ - ["eslint", "npm:8.52.0"],\ - ["eslint-visitor-keys", "npm:3.4.3"]\ - ],\ - "packagePeers": [\ - "@types/eslint",\ - "eslint"\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["@eslint-community/regexpp", [\ - ["npm:4.10.0", {\ - "packageLocation": "./.yarn/cache/@eslint-community-regexpp-npm-4.10.0-6bfb984c81-2a6e345429.zip/node_modules/@eslint-community/regexpp/",\ - "packageDependencies": [\ - ["@eslint-community/regexpp", "npm:4.10.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["@eslint/eslintrc", [\ - ["npm:2.1.2", {\ - "packageLocation": "./.yarn/cache/@eslint-eslintrc-npm-2.1.2-feb0771c9f-bc742a1e3b.zip/node_modules/@eslint/eslintrc/",\ - "packageDependencies": [\ - ["@eslint/eslintrc", "npm:2.1.2"],\ - ["ajv", "npm:6.12.6"],\ - ["debug", "virtual:feb0771c9f8eadaf509cfed41e14a8bebbea5442233275c1c87085111077a08ef71eb773b899665b154d8203a55a489610a54117ae059fce5f5b8b844493b1b1#npm:4.3.4"],\ - ["espree", "npm:9.6.1"],\ - ["globals", "npm:13.23.0"],\ - ["ignore", "npm:5.2.4"],\ - ["import-fresh", "npm:3.3.0"],\ - ["js-yaml", "npm:4.1.0"],\ - ["minimatch", "npm:3.1.2"],\ - ["strip-json-comments", "npm:3.1.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["@eslint/js", [\ - ["npm:8.52.0", {\ - "packageLocation": "./.yarn/cache/@eslint-js-npm-8.52.0-801dbdf7b0-490893b809.zip/node_modules/@eslint/js/",\ - "packageDependencies": [\ - ["@eslint/js", "npm:8.52.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["@humanwhocodes/config-array", [\ - ["npm:0.11.13", {\ - "packageLocation": "./.yarn/cache/@humanwhocodes-config-array-npm-0.11.13-12314014f2-f8ea57b0d7.zip/node_modules/@humanwhocodes/config-array/",\ - "packageDependencies": [\ - ["@humanwhocodes/config-array", "npm:0.11.13"],\ - ["@humanwhocodes/object-schema", "npm:2.0.1"],\ - ["debug", "virtual:feb0771c9f8eadaf509cfed41e14a8bebbea5442233275c1c87085111077a08ef71eb773b899665b154d8203a55a489610a54117ae059fce5f5b8b844493b1b1#npm:4.3.4"],\ - ["minimatch", "npm:3.1.2"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["@humanwhocodes/module-importer", [\ - ["npm:1.0.1", {\ - "packageLocation": "./.yarn/cache/@humanwhocodes-module-importer-npm-1.0.1-9d07ed2e4a-0fd22007db.zip/node_modules/@humanwhocodes/module-importer/",\ - "packageDependencies": [\ - ["@humanwhocodes/module-importer", "npm:1.0.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["@humanwhocodes/object-schema", [\ - ["npm:2.0.1", {\ - "packageLocation": "./.yarn/cache/@humanwhocodes-object-schema-npm-2.0.1-c23364bbfc-24929487b1.zip/node_modules/@humanwhocodes/object-schema/",\ - "packageDependencies": [\ - ["@humanwhocodes/object-schema", "npm:2.0.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["@isaacs/cliui", [\ - ["npm:8.0.2", {\ - "packageLocation": "./.yarn/cache/@isaacs-cliui-npm-8.0.2-f4364666d5-4a473b9b32.zip/node_modules/@isaacs/cliui/",\ - "packageDependencies": [\ - ["@isaacs/cliui", "npm:8.0.2"],\ - ["string-width", "npm:5.1.2"],\ - ["string-width-cjs", [\ - "string-width",\ - "npm:4.2.3"\ - ]],\ - ["strip-ansi", "npm:7.1.0"],\ - ["strip-ansi-cjs", [\ - "strip-ansi",\ - "npm:6.0.1"\ - ]],\ - ["wrap-ansi", "npm:8.1.0"],\ - ["wrap-ansi-cjs", [\ - "wrap-ansi",\ - "npm:7.0.0"\ - ]]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["@jridgewell/gen-mapping", [\ - ["npm:0.3.3", {\ - "packageLocation": "./.yarn/cache/@jridgewell-gen-mapping-npm-0.3.3-1815eba94c-4a74944bd3.zip/node_modules/@jridgewell/gen-mapping/",\ - "packageDependencies": [\ - ["@jridgewell/gen-mapping", "npm:0.3.3"],\ - ["@jridgewell/set-array", "npm:1.1.2"],\ - ["@jridgewell/sourcemap-codec", "npm:1.4.15"],\ - ["@jridgewell/trace-mapping", "npm:0.3.20"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["@jridgewell/resolve-uri", [\ - ["npm:3.1.1", {\ - "packageLocation": "./.yarn/cache/@jridgewell-resolve-uri-npm-3.1.1-aa2de3f210-f5b441fe79.zip/node_modules/@jridgewell/resolve-uri/",\ - "packageDependencies": [\ - ["@jridgewell/resolve-uri", "npm:3.1.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["@jridgewell/set-array", [\ - ["npm:1.1.2", {\ - "packageLocation": "./.yarn/cache/@jridgewell-set-array-npm-1.1.2-45b82d7fb6-69a84d5980.zip/node_modules/@jridgewell/set-array/",\ - "packageDependencies": [\ - ["@jridgewell/set-array", "npm:1.1.2"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["@jridgewell/source-map", [\ - ["npm:0.3.5", {\ - "packageLocation": "./.yarn/cache/@jridgewell-source-map-npm-0.3.5-9f964eaf44-1ad4dec0bd.zip/node_modules/@jridgewell/source-map/",\ - "packageDependencies": [\ - ["@jridgewell/source-map", "npm:0.3.5"],\ - ["@jridgewell/gen-mapping", "npm:0.3.3"],\ - ["@jridgewell/trace-mapping", "npm:0.3.20"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["@jridgewell/sourcemap-codec", [\ - ["npm:1.4.15", {\ - "packageLocation": "./.yarn/cache/@jridgewell-sourcemap-codec-npm-1.4.15-a055fb62cf-b881c7e503.zip/node_modules/@jridgewell/sourcemap-codec/",\ - "packageDependencies": [\ - ["@jridgewell/sourcemap-codec", "npm:1.4.15"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["@jridgewell/trace-mapping", [\ - ["npm:0.3.20", {\ - "packageLocation": "./.yarn/cache/@jridgewell-trace-mapping-npm-0.3.20-d90f282910-cd1a735313.zip/node_modules/@jridgewell/trace-mapping/",\ - "packageDependencies": [\ - ["@jridgewell/trace-mapping", "npm:0.3.20"],\ - ["@jridgewell/resolve-uri", "npm:3.1.1"],\ - ["@jridgewell/sourcemap-codec", "npm:1.4.15"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["@nodelib/fs.scandir", [\ - ["npm:2.1.5", {\ - "packageLocation": "./.yarn/cache/@nodelib-fs.scandir-npm-2.1.5-89c67370dd-a970d595bd.zip/node_modules/@nodelib/fs.scandir/",\ - "packageDependencies": [\ - ["@nodelib/fs.scandir", "npm:2.1.5"],\ - ["@nodelib/fs.stat", "npm:2.0.5"],\ - ["run-parallel", "npm:1.2.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["@nodelib/fs.stat", [\ - ["npm:2.0.5", {\ - "packageLocation": "./.yarn/cache/@nodelib-fs.stat-npm-2.0.5-01f4dd3030-012480b5ca.zip/node_modules/@nodelib/fs.stat/",\ - "packageDependencies": [\ - ["@nodelib/fs.stat", "npm:2.0.5"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["@nodelib/fs.walk", [\ - ["npm:1.2.8", {\ - "packageLocation": "./.yarn/cache/@nodelib-fs.walk-npm-1.2.8-b4a89da548-190c643f15.zip/node_modules/@nodelib/fs.walk/",\ - "packageDependencies": [\ - ["@nodelib/fs.walk", "npm:1.2.8"],\ - ["@nodelib/fs.scandir", "npm:2.1.5"],\ - ["fastq", "npm:1.15.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["@npmcli/fs", [\ - ["npm:3.1.0", {\ - "packageLocation": "./.yarn/cache/@npmcli-fs-npm-3.1.0-0844a57978-a50a6818de.zip/node_modules/@npmcli/fs/",\ - "packageDependencies": [\ - ["@npmcli/fs", "npm:3.1.0"],\ - ["semver", "npm:7.5.4"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["@pkgjs/parseargs", [\ - ["npm:0.11.0", {\ - "packageLocation": "./.yarn/cache/@pkgjs-parseargs-npm-0.11.0-cd2a3fe948-6ad6a00fc4.zip/node_modules/@pkgjs/parseargs/",\ - "packageDependencies": [\ - ["@pkgjs/parseargs", "npm:0.11.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["@tootallnate/once", [\ - ["npm:2.0.0", {\ - "packageLocation": "./.yarn/cache/@tootallnate-once-npm-2.0.0-e36cf4f140-ad87447820.zip/node_modules/@tootallnate/once/",\ - "packageDependencies": [\ - ["@tootallnate/once", "npm:2.0.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["@ungap/structured-clone", [\ - ["npm:1.2.0", {\ - "packageLocation": "./.yarn/cache/@ungap-structured-clone-npm-1.2.0-648f0b82e0-4f656b7b46.zip/node_modules/@ungap/structured-clone/",\ - "packageDependencies": [\ - ["@ungap/structured-clone", "npm:1.2.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["abbrev", [\ - ["npm:1.1.1", {\ - "packageLocation": "./.yarn/cache/abbrev-npm-1.1.1-3659247eab-a4a97ec07d.zip/node_modules/abbrev/",\ - "packageDependencies": [\ - ["abbrev", "npm:1.1.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["acorn", [\ - ["npm:8.10.0", {\ - "packageLocation": "./.yarn/cache/acorn-npm-8.10.0-2230c9e83e-538ba38af0.zip/node_modules/acorn/",\ - "packageDependencies": [\ - ["acorn", "npm:8.10.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["acorn-jsx", [\ - ["npm:5.3.2", {\ - "packageLocation": "./.yarn/cache/acorn-jsx-npm-5.3.2-d7594599ea-c3d3b2a89c.zip/node_modules/acorn-jsx/",\ - "packageDependencies": [\ - ["acorn-jsx", "npm:5.3.2"]\ - ],\ - "linkType": "SOFT"\ - }],\ - ["virtual:a50722a5a9326b6a5f12350c494c4db3aa0f4caeac45e3e9e5fe071da20014ecfe738fe2ebe2c9c98abae81a4ea86b42f56d776b3bd5ec37f9ad3670c242b242#npm:5.3.2", {\ - "packageLocation": "./.yarn/__virtual__/acorn-jsx-virtual-834321b202/0/cache/acorn-jsx-npm-5.3.2-d7594599ea-c3d3b2a89c.zip/node_modules/acorn-jsx/",\ - "packageDependencies": [\ - ["acorn-jsx", "virtual:a50722a5a9326b6a5f12350c494c4db3aa0f4caeac45e3e9e5fe071da20014ecfe738fe2ebe2c9c98abae81a4ea86b42f56d776b3bd5ec37f9ad3670c242b242#npm:5.3.2"],\ - ["@types/acorn", null],\ - ["acorn", "npm:8.10.0"]\ - ],\ - "packagePeers": [\ - "@types/acorn",\ - "acorn"\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["agent-base", [\ - ["npm:6.0.2", {\ - "packageLocation": "./.yarn/cache/agent-base-npm-6.0.2-428f325a93-f52b6872cc.zip/node_modules/agent-base/",\ - "packageDependencies": [\ - ["agent-base", "npm:6.0.2"],\ - ["debug", "virtual:feb0771c9f8eadaf509cfed41e14a8bebbea5442233275c1c87085111077a08ef71eb773b899665b154d8203a55a489610a54117ae059fce5f5b8b844493b1b1#npm:4.3.4"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["agentkeepalive", [\ - ["npm:4.5.0", {\ - "packageLocation": "./.yarn/cache/agentkeepalive-npm-4.5.0-f237b580b2-13278cd5b1.zip/node_modules/agentkeepalive/",\ - "packageDependencies": [\ - ["agentkeepalive", "npm:4.5.0"],\ - ["humanize-ms", "npm:1.2.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["aggregate-error", [\ - ["npm:3.1.0", {\ - "packageLocation": "./.yarn/cache/aggregate-error-npm-3.1.0-415a406f4e-1101a33f21.zip/node_modules/aggregate-error/",\ - "packageDependencies": [\ - ["aggregate-error", "npm:3.1.0"],\ - ["clean-stack", "npm:2.2.0"],\ - ["indent-string", "npm:4.0.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["ajv", [\ - ["npm:6.12.6", {\ - "packageLocation": "./.yarn/cache/ajv-npm-6.12.6-4b5105e2b2-874972efe5.zip/node_modules/ajv/",\ - "packageDependencies": [\ - ["ajv", "npm:6.12.6"],\ - ["fast-deep-equal", "npm:3.1.3"],\ - ["fast-json-stable-stringify", "npm:2.1.0"],\ - ["json-schema-traverse", "npm:0.4.1"],\ - ["uri-js", "npm:4.4.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["ansi-regex", [\ - ["npm:5.0.1", {\ - "packageLocation": "./.yarn/cache/ansi-regex-npm-5.0.1-c963a48615-2aa4bb54ca.zip/node_modules/ansi-regex/",\ - "packageDependencies": [\ - ["ansi-regex", "npm:5.0.1"]\ - ],\ - "linkType": "HARD"\ - }],\ - ["npm:6.0.1", {\ - "packageLocation": "./.yarn/cache/ansi-regex-npm-6.0.1-8d663a607d-1ff8b7667c.zip/node_modules/ansi-regex/",\ - "packageDependencies": [\ - ["ansi-regex", "npm:6.0.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["ansi-styles", [\ - ["npm:4.3.0", {\ - "packageLocation": "./.yarn/cache/ansi-styles-npm-4.3.0-245c7d42c7-513b44c3b2.zip/node_modules/ansi-styles/",\ - "packageDependencies": [\ - ["ansi-styles", "npm:4.3.0"],\ - ["color-convert", "npm:2.0.1"]\ - ],\ - "linkType": "HARD"\ - }],\ - ["npm:6.2.1", {\ - "packageLocation": "./.yarn/cache/ansi-styles-npm-6.2.1-d43647018c-ef940f2f0c.zip/node_modules/ansi-styles/",\ - "packageDependencies": [\ - ["ansi-styles", "npm:6.2.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["aproba", [\ - ["npm:2.0.0", {\ - "packageLocation": "./.yarn/cache/aproba-npm-2.0.0-8716bcfde6-5615cadcfb.zip/node_modules/aproba/",\ - "packageDependencies": [\ - ["aproba", "npm:2.0.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["are-we-there-yet", [\ - ["npm:3.0.1", {\ - "packageLocation": "./.yarn/cache/are-we-there-yet-npm-3.0.1-3395b1512f-52590c2486.zip/node_modules/are-we-there-yet/",\ - "packageDependencies": [\ - ["are-we-there-yet", "npm:3.0.1"],\ - ["delegates", "npm:1.0.0"],\ - ["readable-stream", "npm:3.6.2"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["argparse", [\ - ["npm:2.0.1", {\ - "packageLocation": "./.yarn/cache/argparse-npm-2.0.1-faff7999e6-83644b5649.zip/node_modules/argparse/",\ - "packageDependencies": [\ - ["argparse", "npm:2.0.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["balanced-match", [\ - ["npm:1.0.2", {\ - "packageLocation": "./.yarn/cache/balanced-match-npm-1.0.2-a53c126459-9706c088a2.zip/node_modules/balanced-match/",\ - "packageDependencies": [\ - ["balanced-match", "npm:1.0.2"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["brace-expansion", [\ - ["npm:1.1.11", {\ - "packageLocation": "./.yarn/cache/brace-expansion-npm-1.1.11-fb95eb05ad-faf34a7bb0.zip/node_modules/brace-expansion/",\ - "packageDependencies": [\ - ["brace-expansion", "npm:1.1.11"],\ - ["balanced-match", "npm:1.0.2"],\ - ["concat-map", "npm:0.0.1"]\ - ],\ - "linkType": "HARD"\ - }],\ - ["npm:2.0.1", {\ - "packageLocation": "./.yarn/cache/brace-expansion-npm-2.0.1-17aa2616f9-a61e7cd2e8.zip/node_modules/brace-expansion/",\ - "packageDependencies": [\ - ["brace-expansion", "npm:2.0.1"],\ - ["balanced-match", "npm:1.0.2"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["buffer-from", [\ - ["npm:1.1.2", {\ - "packageLocation": "./.yarn/cache/buffer-from-npm-1.1.2-03d2f20d7e-0448524a56.zip/node_modules/buffer-from/",\ - "packageDependencies": [\ - ["buffer-from", "npm:1.1.2"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["cacache", [\ - ["npm:17.1.4", {\ - "packageLocation": "./.yarn/cache/cacache-npm-17.1.4-51ef53d0a8-b7751df756.zip/node_modules/cacache/",\ - "packageDependencies": [\ - ["cacache", "npm:17.1.4"],\ - ["@npmcli/fs", "npm:3.1.0"],\ - ["fs-minipass", "npm:3.0.3"],\ - ["glob", "npm:10.3.10"],\ - ["lru-cache", "npm:7.18.3"],\ - ["minipass", "npm:7.0.4"],\ - ["minipass-collect", "npm:1.0.2"],\ - ["minipass-flush", "npm:1.0.5"],\ - ["minipass-pipeline", "npm:1.2.4"],\ - ["p-map", "npm:4.0.0"],\ - ["ssri", "npm:10.0.5"],\ - ["tar", "npm:6.2.0"],\ - ["unique-filename", "npm:3.0.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["callsites", [\ - ["npm:3.1.0", {\ - "packageLocation": "./.yarn/cache/callsites-npm-3.1.0-268f989910-072d17b6ab.zip/node_modules/callsites/",\ - "packageDependencies": [\ - ["callsites", "npm:3.1.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["chalk", [\ - ["npm:4.1.2", {\ - "packageLocation": "./.yarn/cache/chalk-npm-4.1.2-ba8b67ab80-fe75c9d5c7.zip/node_modules/chalk/",\ - "packageDependencies": [\ - ["chalk", "npm:4.1.2"],\ - ["ansi-styles", "npm:4.3.0"],\ - ["supports-color", "npm:7.2.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["chownr", [\ - ["npm:2.0.0", {\ - "packageLocation": "./.yarn/cache/chownr-npm-2.0.0-638f1c9c61-c57cf9dd07.zip/node_modules/chownr/",\ - "packageDependencies": [\ - ["chownr", "npm:2.0.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["clean-stack", [\ - ["npm:2.2.0", {\ - "packageLocation": "./.yarn/cache/clean-stack-npm-2.2.0-a8ce435a5c-2ac8cd2b2f.zip/node_modules/clean-stack/",\ - "packageDependencies": [\ - ["clean-stack", "npm:2.2.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["color-convert", [\ - ["npm:2.0.1", {\ - "packageLocation": "./.yarn/cache/color-convert-npm-2.0.1-79730e935b-79e6bdb9fd.zip/node_modules/color-convert/",\ - "packageDependencies": [\ - ["color-convert", "npm:2.0.1"],\ - ["color-name", "npm:1.1.4"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["color-name", [\ - ["npm:1.1.4", {\ - "packageLocation": "./.yarn/cache/color-name-npm-1.1.4-025792b0ea-b044585952.zip/node_modules/color-name/",\ - "packageDependencies": [\ - ["color-name", "npm:1.1.4"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["color-support", [\ - ["npm:1.1.3", {\ - "packageLocation": "./.yarn/cache/color-support-npm-1.1.3-3be5c53455-9b73568176.zip/node_modules/color-support/",\ - "packageDependencies": [\ - ["color-support", "npm:1.1.3"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["commander", [\ - ["npm:2.20.3", {\ - "packageLocation": "./.yarn/cache/commander-npm-2.20.3-d8dcbaa39b-ab8c07884e.zip/node_modules/commander/",\ - "packageDependencies": [\ - ["commander", "npm:2.20.3"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["concat-map", [\ - ["npm:0.0.1", {\ - "packageLocation": "./.yarn/cache/concat-map-npm-0.0.1-85a921b7ee-902a9f5d89.zip/node_modules/concat-map/",\ - "packageDependencies": [\ - ["concat-map", "npm:0.0.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["console-control-strings", [\ - ["npm:1.1.0", {\ - "packageLocation": "./.yarn/cache/console-control-strings-npm-1.1.0-e3160e5275-8755d76787.zip/node_modules/console-control-strings/",\ - "packageDependencies": [\ - ["console-control-strings", "npm:1.1.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["cross-spawn", [\ - ["npm:7.0.3", {\ - "packageLocation": "./.yarn/cache/cross-spawn-npm-7.0.3-e4ff3e65b3-671cc7c728.zip/node_modules/cross-spawn/",\ - "packageDependencies": [\ - ["cross-spawn", "npm:7.0.3"],\ - ["path-key", "npm:3.1.1"],\ - ["shebang-command", "npm:2.0.0"],\ - ["which", "npm:2.0.2"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["debug", [\ - ["npm:4.3.4", {\ - "packageLocation": "./.yarn/cache/debug-npm-4.3.4-4513954577-3dbad3f94e.zip/node_modules/debug/",\ - "packageDependencies": [\ - ["debug", "npm:4.3.4"]\ - ],\ - "linkType": "SOFT"\ - }],\ - ["virtual:feb0771c9f8eadaf509cfed41e14a8bebbea5442233275c1c87085111077a08ef71eb773b899665b154d8203a55a489610a54117ae059fce5f5b8b844493b1b1#npm:4.3.4", {\ - "packageLocation": "./.yarn/__virtual__/debug-virtual-954df360d3/0/cache/debug-npm-4.3.4-4513954577-3dbad3f94e.zip/node_modules/debug/",\ - "packageDependencies": [\ - ["debug", "virtual:feb0771c9f8eadaf509cfed41e14a8bebbea5442233275c1c87085111077a08ef71eb773b899665b154d8203a55a489610a54117ae059fce5f5b8b844493b1b1#npm:4.3.4"],\ - ["@types/supports-color", null],\ - ["ms", "npm:2.1.2"],\ - ["supports-color", null]\ - ],\ - "packagePeers": [\ - "@types/supports-color",\ - "supports-color"\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["deep-is", [\ - ["npm:0.1.4", {\ - "packageLocation": "./.yarn/cache/deep-is-npm-0.1.4-88938b5a67-edb65dd0d7.zip/node_modules/deep-is/",\ - "packageDependencies": [\ - ["deep-is", "npm:0.1.4"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["delegates", [\ - ["npm:1.0.0", {\ - "packageLocation": "./.yarn/cache/delegates-npm-1.0.0-9b1942d75f-a51744d9b5.zip/node_modules/delegates/",\ - "packageDependencies": [\ - ["delegates", "npm:1.0.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["doctrine", [\ - ["npm:3.0.0", {\ - "packageLocation": "./.yarn/cache/doctrine-npm-3.0.0-c6f1615f04-fd7673ca77.zip/node_modules/doctrine/",\ - "packageDependencies": [\ - ["doctrine", "npm:3.0.0"],\ - ["esutils", "npm:2.0.3"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["eastasianwidth", [\ - ["npm:0.2.0", {\ - "packageLocation": "./.yarn/cache/eastasianwidth-npm-0.2.0-c37eb16bd1-7d00d7cd8e.zip/node_modules/eastasianwidth/",\ - "packageDependencies": [\ - ["eastasianwidth", "npm:0.2.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["emoji-regex", [\ - ["npm:8.0.0", {\ - "packageLocation": "./.yarn/cache/emoji-regex-npm-8.0.0-213764015c-d4c5c39d5a.zip/node_modules/emoji-regex/",\ - "packageDependencies": [\ - ["emoji-regex", "npm:8.0.0"]\ - ],\ - "linkType": "HARD"\ - }],\ - ["npm:9.2.2", {\ - "packageLocation": "./.yarn/cache/emoji-regex-npm-9.2.2-e6fac8d058-8487182da7.zip/node_modules/emoji-regex/",\ - "packageDependencies": [\ - ["emoji-regex", "npm:9.2.2"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["encoding", [\ - ["npm:0.1.13", {\ - "packageLocation": "./.yarn/cache/encoding-npm-0.1.13-82a1837d30-bb98632f8f.zip/node_modules/encoding/",\ - "packageDependencies": [\ - ["encoding", "npm:0.1.13"],\ - ["iconv-lite", "npm:0.6.3"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["env-paths", [\ - ["npm:2.2.1", {\ - "packageLocation": "./.yarn/cache/env-paths-npm-2.2.1-7c7577428c-65b5df55a8.zip/node_modules/env-paths/",\ - "packageDependencies": [\ - ["env-paths", "npm:2.2.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["err-code", [\ - ["npm:2.0.3", {\ - "packageLocation": "./.yarn/cache/err-code-npm-2.0.3-082e0ff9a7-8b7b1be20d.zip/node_modules/err-code/",\ - "packageDependencies": [\ - ["err-code", "npm:2.0.3"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["escape-string-regexp", [\ - ["npm:4.0.0", {\ - "packageLocation": "./.yarn/cache/escape-string-regexp-npm-4.0.0-4b531d8d59-98b48897d9.zip/node_modules/escape-string-regexp/",\ - "packageDependencies": [\ - ["escape-string-regexp", "npm:4.0.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["eslint", [\ - ["npm:8.52.0", {\ - "packageLocation": "./.yarn/cache/eslint-npm-8.52.0-e7f048a439-fd22d1e9bd.zip/node_modules/eslint/",\ - "packageDependencies": [\ - ["eslint", "npm:8.52.0"],\ - ["@eslint-community/eslint-utils", "virtual:e7f048a4398cf12bbd1cde95eff45a3327b9fe42e04c31ed99d0e926830d0b78ff78b511118c2bd3bc6add84782ab97a5b001e972071d6fdbfe85a86c150922a#npm:4.4.0"],\ - ["@eslint-community/regexpp", "npm:4.10.0"],\ - ["@eslint/eslintrc", "npm:2.1.2"],\ - ["@eslint/js", "npm:8.52.0"],\ - ["@humanwhocodes/config-array", "npm:0.11.13"],\ - ["@humanwhocodes/module-importer", "npm:1.0.1"],\ - ["@nodelib/fs.walk", "npm:1.2.8"],\ - ["@ungap/structured-clone", "npm:1.2.0"],\ - ["ajv", "npm:6.12.6"],\ - ["chalk", "npm:4.1.2"],\ - ["cross-spawn", "npm:7.0.3"],\ - ["debug", "virtual:feb0771c9f8eadaf509cfed41e14a8bebbea5442233275c1c87085111077a08ef71eb773b899665b154d8203a55a489610a54117ae059fce5f5b8b844493b1b1#npm:4.3.4"],\ - ["doctrine", "npm:3.0.0"],\ - ["escape-string-regexp", "npm:4.0.0"],\ - ["eslint-scope", "npm:7.2.2"],\ - ["eslint-visitor-keys", "npm:3.4.3"],\ - ["espree", "npm:9.6.1"],\ - ["esquery", "npm:1.5.0"],\ - ["esutils", "npm:2.0.3"],\ - ["fast-deep-equal", "npm:3.1.3"],\ - ["file-entry-cache", "npm:6.0.1"],\ - ["find-up", "npm:5.0.0"],\ - ["glob-parent", "npm:6.0.2"],\ - ["globals", "npm:13.23.0"],\ - ["graphemer", "npm:1.4.0"],\ - ["ignore", "npm:5.2.4"],\ - ["imurmurhash", "npm:0.1.4"],\ - ["is-glob", "npm:4.0.3"],\ - ["is-path-inside", "npm:3.0.3"],\ - ["js-yaml", "npm:4.1.0"],\ - ["json-stable-stringify-without-jsonify", "npm:1.0.1"],\ - ["levn", "npm:0.4.1"],\ - ["lodash.merge", "npm:4.6.2"],\ - ["minimatch", "npm:3.1.2"],\ - ["natural-compare", "npm:1.4.0"],\ - ["optionator", "npm:0.9.3"],\ - ["strip-ansi", "npm:6.0.1"],\ - ["text-table", "npm:0.2.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["eslint-scope", [\ - ["npm:7.2.2", {\ - "packageLocation": "./.yarn/cache/eslint-scope-npm-7.2.2-53cb0df8e8-ec97dbf5fb.zip/node_modules/eslint-scope/",\ - "packageDependencies": [\ - ["eslint-scope", "npm:7.2.2"],\ - ["esrecurse", "npm:4.3.0"],\ - ["estraverse", "npm:5.3.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["eslint-visitor-keys", [\ - ["npm:3.4.3", {\ - "packageLocation": "./.yarn/cache/eslint-visitor-keys-npm-3.4.3-a356ac7e46-36e9ef87fc.zip/node_modules/eslint-visitor-keys/",\ - "packageDependencies": [\ - ["eslint-visitor-keys", "npm:3.4.3"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["esm", [\ - ["npm:3.2.25", {\ - "packageLocation": "./.yarn/cache/esm-npm-3.2.25-762b3ebd40-978aabe2de.zip/node_modules/esm/",\ - "packageDependencies": [\ - ["esm", "npm:3.2.25"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["espree", [\ - ["npm:9.6.1", {\ - "packageLocation": "./.yarn/cache/espree-npm-9.6.1-a50722a5a9-eb8c149c7a.zip/node_modules/espree/",\ - "packageDependencies": [\ - ["espree", "npm:9.6.1"],\ - ["acorn", "npm:8.10.0"],\ - ["acorn-jsx", "virtual:a50722a5a9326b6a5f12350c494c4db3aa0f4caeac45e3e9e5fe071da20014ecfe738fe2ebe2c9c98abae81a4ea86b42f56d776b3bd5ec37f9ad3670c242b242#npm:5.3.2"],\ - ["eslint-visitor-keys", "npm:3.4.3"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["esquery", [\ - ["npm:1.5.0", {\ - "packageLocation": "./.yarn/cache/esquery-npm-1.5.0-d8f8a06879-aefb0d2596.zip/node_modules/esquery/",\ - "packageDependencies": [\ - ["esquery", "npm:1.5.0"],\ - ["estraverse", "npm:5.3.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["esrecurse", [\ - ["npm:4.3.0", {\ - "packageLocation": "./.yarn/cache/esrecurse-npm-4.3.0-10b86a887a-ebc17b1a33.zip/node_modules/esrecurse/",\ - "packageDependencies": [\ - ["esrecurse", "npm:4.3.0"],\ - ["estraverse", "npm:5.3.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["estraverse", [\ - ["npm:5.3.0", {\ - "packageLocation": "./.yarn/cache/estraverse-npm-5.3.0-03284f8f63-072780882d.zip/node_modules/estraverse/",\ - "packageDependencies": [\ - ["estraverse", "npm:5.3.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["esutils", [\ - ["npm:2.0.3", {\ - "packageLocation": "./.yarn/cache/esutils-npm-2.0.3-f865beafd5-22b5b08f74.zip/node_modules/esutils/",\ - "packageDependencies": [\ - ["esutils", "npm:2.0.3"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["exponential-backoff", [\ - ["npm:3.1.1", {\ - "packageLocation": "./.yarn/cache/exponential-backoff-npm-3.1.1-04df458b30-3d21519a4f.zip/node_modules/exponential-backoff/",\ - "packageDependencies": [\ - ["exponential-backoff", "npm:3.1.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["fast-deep-equal", [\ - ["npm:3.1.3", {\ - "packageLocation": "./.yarn/cache/fast-deep-equal-npm-3.1.3-790edcfcf5-e21a9d8d84.zip/node_modules/fast-deep-equal/",\ - "packageDependencies": [\ - ["fast-deep-equal", "npm:3.1.3"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["fast-json-stable-stringify", [\ - ["npm:2.1.0", {\ - "packageLocation": "./.yarn/cache/fast-json-stable-stringify-npm-2.1.0-02e8905fda-b191531e36.zip/node_modules/fast-json-stable-stringify/",\ - "packageDependencies": [\ - ["fast-json-stable-stringify", "npm:2.1.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["fast-levenshtein", [\ - ["npm:2.0.6", {\ - "packageLocation": "./.yarn/cache/fast-levenshtein-npm-2.0.6-fcd74b8df5-92cfec0a8d.zip/node_modules/fast-levenshtein/",\ - "packageDependencies": [\ - ["fast-levenshtein", "npm:2.0.6"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["fastq", [\ - ["npm:1.15.0", {\ - "packageLocation": "./.yarn/cache/fastq-npm-1.15.0-1013f6514e-0170e6bfcd.zip/node_modules/fastq/",\ - "packageDependencies": [\ - ["fastq", "npm:1.15.0"],\ - ["reusify", "npm:1.0.4"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["file-entry-cache", [\ - ["npm:6.0.1", {\ - "packageLocation": "./.yarn/cache/file-entry-cache-npm-6.0.1-31965cf0af-f49701feaa.zip/node_modules/file-entry-cache/",\ - "packageDependencies": [\ - ["file-entry-cache", "npm:6.0.1"],\ - ["flat-cache", "npm:3.1.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["find-up", [\ - ["npm:5.0.0", {\ - "packageLocation": "./.yarn/cache/find-up-npm-5.0.0-e03e9b796d-07955e3573.zip/node_modules/find-up/",\ - "packageDependencies": [\ - ["find-up", "npm:5.0.0"],\ - ["locate-path", "npm:6.0.0"],\ - ["path-exists", "npm:4.0.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["flat-cache", [\ - ["npm:3.1.1", {\ - "packageLocation": "./.yarn/cache/flat-cache-npm-3.1.1-b79e22b54f-4958cfe0f4.zip/node_modules/flat-cache/",\ - "packageDependencies": [\ - ["flat-cache", "npm:3.1.1"],\ - ["flatted", "npm:3.2.9"],\ - ["keyv", "npm:4.5.4"],\ - ["rimraf", "npm:3.0.2"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["flatted", [\ - ["npm:3.2.9", {\ - "packageLocation": "./.yarn/cache/flatted-npm-3.2.9-0462256d3c-f14167fbe2.zip/node_modules/flatted/",\ - "packageDependencies": [\ - ["flatted", "npm:3.2.9"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["foreground-child", [\ - ["npm:3.1.1", {\ - "packageLocation": "./.yarn/cache/foreground-child-npm-3.1.1-77e78ed774-139d270bc8.zip/node_modules/foreground-child/",\ - "packageDependencies": [\ - ["foreground-child", "npm:3.1.1"],\ - ["cross-spawn", "npm:7.0.3"],\ - ["signal-exit", "npm:4.1.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["fs-minipass", [\ - ["npm:2.1.0", {\ - "packageLocation": "./.yarn/cache/fs-minipass-npm-2.1.0-501ef87306-1b8d128dae.zip/node_modules/fs-minipass/",\ - "packageDependencies": [\ - ["fs-minipass", "npm:2.1.0"],\ - ["minipass", "npm:3.3.6"]\ - ],\ - "linkType": "HARD"\ - }],\ - ["npm:3.0.3", {\ - "packageLocation": "./.yarn/cache/fs-minipass-npm-3.0.3-d148d6ac19-8722a41109.zip/node_modules/fs-minipass/",\ - "packageDependencies": [\ - ["fs-minipass", "npm:3.0.3"],\ - ["minipass", "npm:7.0.4"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["fs.realpath", [\ - ["npm:1.0.0", {\ - "packageLocation": "./.yarn/cache/fs.realpath-npm-1.0.0-c8f05d8126-99ddea01a7.zip/node_modules/fs.realpath/",\ - "packageDependencies": [\ - ["fs.realpath", "npm:1.0.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["fsevents", [\ - ["patch:fsevents@npm%3A2.3.3#~builtin::version=2.3.3&hash=df0bf1", {\ - "packageLocation": "./.yarn/unplugged/fsevents-patch-21ad2b1333/node_modules/fsevents/",\ - "packageDependencies": [\ - ["fsevents", "patch:fsevents@npm%3A2.3.3#~builtin::version=2.3.3&hash=df0bf1"],\ - ["node-gyp", "npm:9.4.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["gauge", [\ - ["npm:4.0.4", {\ - "packageLocation": "./.yarn/cache/gauge-npm-4.0.4-8f878385e9-788b6bfe52.zip/node_modules/gauge/",\ - "packageDependencies": [\ - ["gauge", "npm:4.0.4"],\ - ["aproba", "npm:2.0.0"],\ - ["color-support", "npm:1.1.3"],\ - ["console-control-strings", "npm:1.1.0"],\ - ["has-unicode", "npm:2.0.1"],\ - ["signal-exit", "npm:3.0.7"],\ - ["string-width", "npm:4.2.3"],\ - ["strip-ansi", "npm:6.0.1"],\ - ["wide-align", "npm:1.1.5"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["glob", [\ - ["npm:10.3.10", {\ - "packageLocation": "./.yarn/cache/glob-npm-10.3.10-da1ef8b112-4f2fe2511e.zip/node_modules/glob/",\ - "packageDependencies": [\ - ["glob", "npm:10.3.10"],\ - ["foreground-child", "npm:3.1.1"],\ - ["jackspeak", "npm:2.3.6"],\ - ["minimatch", "npm:9.0.3"],\ - ["minipass", "npm:7.0.4"],\ - ["path-scurry", "npm:1.10.1"]\ - ],\ - "linkType": "HARD"\ - }],\ - ["npm:7.2.3", {\ - "packageLocation": "./.yarn/cache/glob-npm-7.2.3-2d866d17a5-29452e97b3.zip/node_modules/glob/",\ - "packageDependencies": [\ - ["glob", "npm:7.2.3"],\ - ["fs.realpath", "npm:1.0.0"],\ - ["inflight", "npm:1.0.6"],\ - ["inherits", "npm:2.0.4"],\ - ["minimatch", "npm:3.1.2"],\ - ["once", "npm:1.4.0"],\ - ["path-is-absolute", "npm:1.0.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["glob-parent", [\ - ["npm:6.0.2", {\ - "packageLocation": "./.yarn/cache/glob-parent-npm-6.0.2-2cbef12738-c13ee97978.zip/node_modules/glob-parent/",\ - "packageDependencies": [\ - ["glob-parent", "npm:6.0.2"],\ - ["is-glob", "npm:4.0.3"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["globals", [\ - ["npm:13.23.0", {\ - "packageLocation": "./.yarn/cache/globals-npm-13.23.0-7f02426fd5-194c97cf8d.zip/node_modules/globals/",\ - "packageDependencies": [\ - ["globals", "npm:13.23.0"],\ - ["type-fest", "npm:0.20.2"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["graceful-fs", [\ - ["npm:4.2.11", {\ - "packageLocation": "./.yarn/cache/graceful-fs-npm-4.2.11-24bb648a68-ac85f94da9.zip/node_modules/graceful-fs/",\ - "packageDependencies": [\ - ["graceful-fs", "npm:4.2.11"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["graphemer", [\ - ["npm:1.4.0", {\ - "packageLocation": "./.yarn/cache/graphemer-npm-1.4.0-0627732d35-bab8f0be9b.zip/node_modules/graphemer/",\ - "packageDependencies": [\ - ["graphemer", "npm:1.4.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["has-flag", [\ - ["npm:4.0.0", {\ - "packageLocation": "./.yarn/cache/has-flag-npm-4.0.0-32af9f0536-261a135703.zip/node_modules/has-flag/",\ - "packageDependencies": [\ - ["has-flag", "npm:4.0.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["has-unicode", [\ - ["npm:2.0.1", {\ - "packageLocation": "./.yarn/cache/has-unicode-npm-2.0.1-893adb4747-1eab07a743.zip/node_modules/has-unicode/",\ - "packageDependencies": [\ - ["has-unicode", "npm:2.0.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["http-cache-semantics", [\ - ["npm:4.1.1", {\ - "packageLocation": "./.yarn/cache/http-cache-semantics-npm-4.1.1-1120131375-83ac0bc60b.zip/node_modules/http-cache-semantics/",\ - "packageDependencies": [\ - ["http-cache-semantics", "npm:4.1.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["http-proxy-agent", [\ - ["npm:5.0.0", {\ - "packageLocation": "./.yarn/cache/http-proxy-agent-npm-5.0.0-7f1f121b83-e2ee1ff165.zip/node_modules/http-proxy-agent/",\ - "packageDependencies": [\ - ["http-proxy-agent", "npm:5.0.0"],\ - ["@tootallnate/once", "npm:2.0.0"],\ - ["agent-base", "npm:6.0.2"],\ - ["debug", "virtual:feb0771c9f8eadaf509cfed41e14a8bebbea5442233275c1c87085111077a08ef71eb773b899665b154d8203a55a489610a54117ae059fce5f5b8b844493b1b1#npm:4.3.4"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["https-proxy-agent", [\ - ["npm:5.0.1", {\ - "packageLocation": "./.yarn/cache/https-proxy-agent-npm-5.0.1-42d65f358e-571fccdf38.zip/node_modules/https-proxy-agent/",\ - "packageDependencies": [\ - ["https-proxy-agent", "npm:5.0.1"],\ - ["agent-base", "npm:6.0.2"],\ - ["debug", "virtual:feb0771c9f8eadaf509cfed41e14a8bebbea5442233275c1c87085111077a08ef71eb773b899665b154d8203a55a489610a54117ae059fce5f5b8b844493b1b1#npm:4.3.4"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["humanize-ms", [\ - ["npm:1.2.1", {\ - "packageLocation": "./.yarn/cache/humanize-ms-npm-1.2.1-e942bd7329-9c7a74a282.zip/node_modules/humanize-ms/",\ - "packageDependencies": [\ - ["humanize-ms", "npm:1.2.1"],\ - ["ms", "npm:2.1.3"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["iconv-lite", [\ - ["npm:0.6.3", {\ - "packageLocation": "./.yarn/cache/iconv-lite-npm-0.6.3-24b8aae27e-3f60d47a5c.zip/node_modules/iconv-lite/",\ - "packageDependencies": [\ - ["iconv-lite", "npm:0.6.3"],\ - ["safer-buffer", "npm:2.1.2"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["ignore", [\ - ["npm:5.2.4", {\ - "packageLocation": "./.yarn/cache/ignore-npm-5.2.4-fbe6e989e5-3d4c309c60.zip/node_modules/ignore/",\ - "packageDependencies": [\ - ["ignore", "npm:5.2.4"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["import-fresh", [\ - ["npm:3.3.0", {\ - "packageLocation": "./.yarn/cache/import-fresh-npm-3.3.0-3e34265ca9-2cacfad06e.zip/node_modules/import-fresh/",\ - "packageDependencies": [\ - ["import-fresh", "npm:3.3.0"],\ - ["parent-module", "npm:1.0.1"],\ - ["resolve-from", "npm:4.0.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["imurmurhash", [\ - ["npm:0.1.4", {\ - "packageLocation": "./.yarn/cache/imurmurhash-npm-0.1.4-610c5068a0-7cae75c8cd.zip/node_modules/imurmurhash/",\ - "packageDependencies": [\ - ["imurmurhash", "npm:0.1.4"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["indent-string", [\ - ["npm:4.0.0", {\ - "packageLocation": "./.yarn/cache/indent-string-npm-4.0.0-7b717435b2-824cfb9929.zip/node_modules/indent-string/",\ - "packageDependencies": [\ - ["indent-string", "npm:4.0.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["inflight", [\ - ["npm:1.0.6", {\ - "packageLocation": "./.yarn/cache/inflight-npm-1.0.6-ccedb4b908-f4f76aa072.zip/node_modules/inflight/",\ - "packageDependencies": [\ - ["inflight", "npm:1.0.6"],\ - ["once", "npm:1.4.0"],\ - ["wrappy", "npm:1.0.2"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["inherits", [\ - ["npm:2.0.4", {\ - "packageLocation": "./.yarn/cache/inherits-npm-2.0.4-c66b3957a0-4a48a73384.zip/node_modules/inherits/",\ - "packageDependencies": [\ - ["inherits", "npm:2.0.4"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["ip", [\ - ["npm:2.0.0", {\ - "packageLocation": "./.yarn/cache/ip-npm-2.0.0-204facb3cc-cfcfac6b87.zip/node_modules/ip/",\ - "packageDependencies": [\ - ["ip", "npm:2.0.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["is-extglob", [\ - ["npm:2.1.1", {\ - "packageLocation": "./.yarn/cache/is-extglob-npm-2.1.1-0870ea68b5-df033653d0.zip/node_modules/is-extglob/",\ - "packageDependencies": [\ - ["is-extglob", "npm:2.1.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["is-fullwidth-code-point", [\ - ["npm:3.0.0", {\ - "packageLocation": "./.yarn/cache/is-fullwidth-code-point-npm-3.0.0-1ecf4ebee5-44a30c2945.zip/node_modules/is-fullwidth-code-point/",\ - "packageDependencies": [\ - ["is-fullwidth-code-point", "npm:3.0.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["is-glob", [\ - ["npm:4.0.3", {\ - "packageLocation": "./.yarn/cache/is-glob-npm-4.0.3-cb87bf1bdb-d381c1319f.zip/node_modules/is-glob/",\ - "packageDependencies": [\ - ["is-glob", "npm:4.0.3"],\ - ["is-extglob", "npm:2.1.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["is-lambda", [\ - ["npm:1.0.1", {\ - "packageLocation": "./.yarn/cache/is-lambda-npm-1.0.1-7ab55bc8a8-93a32f0194.zip/node_modules/is-lambda/",\ - "packageDependencies": [\ - ["is-lambda", "npm:1.0.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["is-path-inside", [\ - ["npm:3.0.3", {\ - "packageLocation": "./.yarn/cache/is-path-inside-npm-3.0.3-2ea0ef44fd-abd50f0618.zip/node_modules/is-path-inside/",\ - "packageDependencies": [\ - ["is-path-inside", "npm:3.0.3"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["isexe", [\ - ["npm:2.0.0", {\ - "packageLocation": "./.yarn/cache/isexe-npm-2.0.0-b58870bd2e-26bf6c5480.zip/node_modules/isexe/",\ - "packageDependencies": [\ - ["isexe", "npm:2.0.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["jackspeak", [\ - ["npm:2.3.6", {\ - "packageLocation": "./.yarn/cache/jackspeak-npm-2.3.6-42e1233172-57d43ad11e.zip/node_modules/jackspeak/",\ - "packageDependencies": [\ - ["jackspeak", "npm:2.3.6"],\ - ["@isaacs/cliui", "npm:8.0.2"],\ - ["@pkgjs/parseargs", "npm:0.11.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["js-yaml", [\ - ["npm:4.1.0", {\ - "packageLocation": "./.yarn/cache/js-yaml-npm-4.1.0-3606f32312-c7830dfd45.zip/node_modules/js-yaml/",\ - "packageDependencies": [\ - ["js-yaml", "npm:4.1.0"],\ - ["argparse", "npm:2.0.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["json-buffer", [\ - ["npm:3.0.1", {\ - "packageLocation": "./.yarn/cache/json-buffer-npm-3.0.1-f8f6d20603-9026b03edc.zip/node_modules/json-buffer/",\ - "packageDependencies": [\ - ["json-buffer", "npm:3.0.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["json-schema-traverse", [\ - ["npm:0.4.1", {\ - "packageLocation": "./.yarn/cache/json-schema-traverse-npm-0.4.1-4759091693-7486074d3b.zip/node_modules/json-schema-traverse/",\ - "packageDependencies": [\ - ["json-schema-traverse", "npm:0.4.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["json-stable-stringify-without-jsonify", [\ - ["npm:1.0.1", {\ - "packageLocation": "./.yarn/cache/json-stable-stringify-without-jsonify-npm-1.0.1-b65772b28b-cff44156dd.zip/node_modules/json-stable-stringify-without-jsonify/",\ - "packageDependencies": [\ - ["json-stable-stringify-without-jsonify", "npm:1.0.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["keyv", [\ - ["npm:4.5.4", {\ - "packageLocation": "./.yarn/cache/keyv-npm-4.5.4-4c8e2cf7f7-74a24395b1.zip/node_modules/keyv/",\ - "packageDependencies": [\ - ["keyv", "npm:4.5.4"],\ - ["json-buffer", "npm:3.0.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["levn", [\ - ["npm:0.4.1", {\ - "packageLocation": "./.yarn/cache/levn-npm-0.4.1-d183b2d7bb-12c5021c85.zip/node_modules/levn/",\ - "packageDependencies": [\ - ["levn", "npm:0.4.1"],\ - ["prelude-ls", "npm:1.2.1"],\ - ["type-check", "npm:0.4.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["locate-path", [\ - ["npm:6.0.0", {\ - "packageLocation": "./.yarn/cache/locate-path-npm-6.0.0-06a1e4c528-72eb661788.zip/node_modules/locate-path/",\ - "packageDependencies": [\ - ["locate-path", "npm:6.0.0"],\ - ["p-locate", "npm:5.0.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["lodash.merge", [\ - ["npm:4.6.2", {\ - "packageLocation": "./.yarn/cache/lodash.merge-npm-4.6.2-77cb4416bf-ad580b4bdb.zip/node_modules/lodash.merge/",\ - "packageDependencies": [\ - ["lodash.merge", "npm:4.6.2"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["lru-cache", [\ - ["npm:10.0.1", {\ - "packageLocation": "./.yarn/cache/lru-cache-npm-10.0.1-0e1abf4c13-06f8d0e1ce.zip/node_modules/lru-cache/",\ - "packageDependencies": [\ - ["lru-cache", "npm:10.0.1"]\ - ],\ - "linkType": "HARD"\ - }],\ - ["npm:6.0.0", {\ - "packageLocation": "./.yarn/cache/lru-cache-npm-6.0.0-b4c8668fe1-f97f499f89.zip/node_modules/lru-cache/",\ - "packageDependencies": [\ - ["lru-cache", "npm:6.0.0"],\ - ["yallist", "npm:4.0.0"]\ - ],\ - "linkType": "HARD"\ - }],\ - ["npm:7.18.3", {\ - "packageLocation": "./.yarn/cache/lru-cache-npm-7.18.3-e68be5b11c-e550d77238.zip/node_modules/lru-cache/",\ - "packageDependencies": [\ - ["lru-cache", "npm:7.18.3"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["make-fetch-happen", [\ - ["npm:11.1.1", {\ - "packageLocation": "./.yarn/cache/make-fetch-happen-npm-11.1.1-f32b79aaaa-7268bf274a.zip/node_modules/make-fetch-happen/",\ - "packageDependencies": [\ - ["make-fetch-happen", "npm:11.1.1"],\ - ["agentkeepalive", "npm:4.5.0"],\ - ["cacache", "npm:17.1.4"],\ - ["http-cache-semantics", "npm:4.1.1"],\ - ["http-proxy-agent", "npm:5.0.0"],\ - ["https-proxy-agent", "npm:5.0.1"],\ - ["is-lambda", "npm:1.0.1"],\ - ["lru-cache", "npm:7.18.3"],\ - ["minipass", "npm:5.0.0"],\ - ["minipass-fetch", "npm:3.0.4"],\ - ["minipass-flush", "npm:1.0.5"],\ - ["minipass-pipeline", "npm:1.2.4"],\ - ["negotiator", "npm:0.6.3"],\ - ["promise-retry", "npm:2.0.1"],\ - ["socks-proxy-agent", "npm:7.0.0"],\ - ["ssri", "npm:10.0.5"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["minimatch", [\ - ["npm:3.1.2", {\ - "packageLocation": "./.yarn/cache/minimatch-npm-3.1.2-9405269906-c154e56640.zip/node_modules/minimatch/",\ - "packageDependencies": [\ - ["minimatch", "npm:3.1.2"],\ - ["brace-expansion", "npm:1.1.11"]\ - ],\ - "linkType": "HARD"\ - }],\ - ["npm:9.0.3", {\ - "packageLocation": "./.yarn/cache/minimatch-npm-9.0.3-69d7d6fad5-253487976b.zip/node_modules/minimatch/",\ - "packageDependencies": [\ - ["minimatch", "npm:9.0.3"],\ - ["brace-expansion", "npm:2.0.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["minipass", [\ - ["npm:3.3.6", {\ - "packageLocation": "./.yarn/cache/minipass-npm-3.3.6-b8d93a945b-a30d083c80.zip/node_modules/minipass/",\ - "packageDependencies": [\ - ["minipass", "npm:3.3.6"],\ - ["yallist", "npm:4.0.0"]\ - ],\ - "linkType": "HARD"\ - }],\ - ["npm:5.0.0", {\ - "packageLocation": "./.yarn/cache/minipass-npm-5.0.0-c64fb63c92-425dab2887.zip/node_modules/minipass/",\ - "packageDependencies": [\ - ["minipass", "npm:5.0.0"]\ - ],\ - "linkType": "HARD"\ - }],\ - ["npm:7.0.4", {\ - "packageLocation": "./.yarn/cache/minipass-npm-7.0.4-eacb4e042e-87585e258b.zip/node_modules/minipass/",\ - "packageDependencies": [\ - ["minipass", "npm:7.0.4"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["minipass-collect", [\ - ["npm:1.0.2", {\ - "packageLocation": "./.yarn/cache/minipass-collect-npm-1.0.2-3b4676eab5-14df761028.zip/node_modules/minipass-collect/",\ - "packageDependencies": [\ - ["minipass-collect", "npm:1.0.2"],\ - ["minipass", "npm:3.3.6"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["minipass-fetch", [\ - ["npm:3.0.4", {\ - "packageLocation": "./.yarn/cache/minipass-fetch-npm-3.0.4-200ac7c66d-af7aad15d5.zip/node_modules/minipass-fetch/",\ - "packageDependencies": [\ - ["minipass-fetch", "npm:3.0.4"],\ - ["encoding", "npm:0.1.13"],\ - ["minipass", "npm:7.0.4"],\ - ["minipass-sized", "npm:1.0.3"],\ - ["minizlib", "npm:2.1.2"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["minipass-flush", [\ - ["npm:1.0.5", {\ - "packageLocation": "./.yarn/cache/minipass-flush-npm-1.0.5-efe79d9826-56269a0b22.zip/node_modules/minipass-flush/",\ - "packageDependencies": [\ - ["minipass-flush", "npm:1.0.5"],\ - ["minipass", "npm:3.3.6"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["minipass-pipeline", [\ - ["npm:1.2.4", {\ - "packageLocation": "./.yarn/cache/minipass-pipeline-npm-1.2.4-5924cb077f-b14240dac0.zip/node_modules/minipass-pipeline/",\ - "packageDependencies": [\ - ["minipass-pipeline", "npm:1.2.4"],\ - ["minipass", "npm:3.3.6"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["minipass-sized", [\ - ["npm:1.0.3", {\ - "packageLocation": "./.yarn/cache/minipass-sized-npm-1.0.3-306d86f432-79076749fc.zip/node_modules/minipass-sized/",\ - "packageDependencies": [\ - ["minipass-sized", "npm:1.0.3"],\ - ["minipass", "npm:3.3.6"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["minizlib", [\ - ["npm:2.1.2", {\ - "packageLocation": "./.yarn/cache/minizlib-npm-2.1.2-ea89cd0cfb-f1fdeac0b0.zip/node_modules/minizlib/",\ - "packageDependencies": [\ - ["minizlib", "npm:2.1.2"],\ - ["minipass", "npm:3.3.6"],\ - ["yallist", "npm:4.0.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["mkdirp", [\ - ["npm:1.0.4", {\ - "packageLocation": "./.yarn/cache/mkdirp-npm-1.0.4-37f6ef56b9-a96865108c.zip/node_modules/mkdirp/",\ - "packageDependencies": [\ - ["mkdirp", "npm:1.0.4"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["ms", [\ - ["npm:2.1.2", {\ - "packageLocation": "./.yarn/cache/ms-npm-2.1.2-ec0c1512ff-673cdb2c31.zip/node_modules/ms/",\ - "packageDependencies": [\ - ["ms", "npm:2.1.2"]\ - ],\ - "linkType": "HARD"\ - }],\ - ["npm:2.1.3", {\ - "packageLocation": "./.yarn/cache/ms-npm-2.1.3-81ff3cfac1-aa92de6080.zip/node_modules/ms/",\ - "packageDependencies": [\ - ["ms", "npm:2.1.3"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["natural-compare", [\ - ["npm:1.4.0", {\ - "packageLocation": "./.yarn/cache/natural-compare-npm-1.4.0-97b75b362d-23ad088b08.zip/node_modules/natural-compare/",\ - "packageDependencies": [\ - ["natural-compare", "npm:1.4.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["negotiator", [\ - ["npm:0.6.3", {\ - "packageLocation": "./.yarn/cache/negotiator-npm-0.6.3-9d50e36171-b8ffeb1e26.zip/node_modules/negotiator/",\ - "packageDependencies": [\ - ["negotiator", "npm:0.6.3"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["node-gyp", [\ - ["npm:9.4.0", {\ - "packageLocation": "./.yarn/unplugged/node-gyp-npm-9.4.0-ebf5f5573e/node_modules/node-gyp/",\ - "packageDependencies": [\ - ["node-gyp", "npm:9.4.0"],\ - ["env-paths", "npm:2.2.1"],\ - ["exponential-backoff", "npm:3.1.1"],\ - ["glob", "npm:7.2.3"],\ - ["graceful-fs", "npm:4.2.11"],\ - ["make-fetch-happen", "npm:11.1.1"],\ - ["nopt", "npm:6.0.0"],\ - ["npmlog", "npm:6.0.2"],\ - ["rimraf", "npm:3.0.2"],\ - ["semver", "npm:7.5.4"],\ - ["tar", "npm:6.2.0"],\ - ["which", "npm:2.0.2"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["nopt", [\ - ["npm:6.0.0", {\ - "packageLocation": "./.yarn/cache/nopt-npm-6.0.0-5ea8050815-82149371f8.zip/node_modules/nopt/",\ - "packageDependencies": [\ - ["nopt", "npm:6.0.0"],\ - ["abbrev", "npm:1.1.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["npmlog", [\ - ["npm:6.0.2", {\ - "packageLocation": "./.yarn/cache/npmlog-npm-6.0.2-e0e69455c7-ae238cd264.zip/node_modules/npmlog/",\ - "packageDependencies": [\ - ["npmlog", "npm:6.0.2"],\ - ["are-we-there-yet", "npm:3.0.1"],\ - ["console-control-strings", "npm:1.1.0"],\ - ["gauge", "npm:4.0.4"],\ - ["set-blocking", "npm:2.0.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["once", [\ - ["npm:1.4.0", {\ - "packageLocation": "./.yarn/cache/once-npm-1.4.0-ccf03ef07a-cd0a885013.zip/node_modules/once/",\ - "packageDependencies": [\ - ["once", "npm:1.4.0"],\ - ["wrappy", "npm:1.0.2"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["optionator", [\ - ["npm:0.9.3", {\ - "packageLocation": "./.yarn/cache/optionator-npm-0.9.3-56c3a4bf80-0928199944.zip/node_modules/optionator/",\ - "packageDependencies": [\ - ["optionator", "npm:0.9.3"],\ - ["@aashutoshrathi/word-wrap", "npm:1.2.6"],\ - ["deep-is", "npm:0.1.4"],\ - ["fast-levenshtein", "npm:2.0.6"],\ - ["levn", "npm:0.4.1"],\ - ["prelude-ls", "npm:1.2.1"],\ - ["type-check", "npm:0.4.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["p-limit", [\ - ["npm:3.1.0", {\ - "packageLocation": "./.yarn/cache/p-limit-npm-3.1.0-05d2ede37f-7c3690c4db.zip/node_modules/p-limit/",\ - "packageDependencies": [\ - ["p-limit", "npm:3.1.0"],\ - ["yocto-queue", "npm:0.1.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["p-locate", [\ - ["npm:5.0.0", {\ - "packageLocation": "./.yarn/cache/p-locate-npm-5.0.0-92cc7c7a3e-1623088f36.zip/node_modules/p-locate/",\ - "packageDependencies": [\ - ["p-locate", "npm:5.0.0"],\ - ["p-limit", "npm:3.1.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["p-map", [\ - ["npm:4.0.0", {\ - "packageLocation": "./.yarn/cache/p-map-npm-4.0.0-4677ae07c7-cb0ab21ec0.zip/node_modules/p-map/",\ - "packageDependencies": [\ - ["p-map", "npm:4.0.0"],\ - ["aggregate-error", "npm:3.1.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["parent-module", [\ - ["npm:1.0.1", {\ - "packageLocation": "./.yarn/cache/parent-module-npm-1.0.1-1fae11b095-6ba8b25514.zip/node_modules/parent-module/",\ - "packageDependencies": [\ - ["parent-module", "npm:1.0.1"],\ - ["callsites", "npm:3.1.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["path-exists", [\ - ["npm:4.0.0", {\ - "packageLocation": "./.yarn/cache/path-exists-npm-4.0.0-e9e4f63eb0-505807199d.zip/node_modules/path-exists/",\ - "packageDependencies": [\ - ["path-exists", "npm:4.0.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["path-is-absolute", [\ - ["npm:1.0.1", {\ - "packageLocation": "./.yarn/cache/path-is-absolute-npm-1.0.1-31bc695ffd-060840f92c.zip/node_modules/path-is-absolute/",\ - "packageDependencies": [\ - ["path-is-absolute", "npm:1.0.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["path-key", [\ - ["npm:3.1.1", {\ - "packageLocation": "./.yarn/cache/path-key-npm-3.1.1-0e66ea8321-55cd7a9dd4.zip/node_modules/path-key/",\ - "packageDependencies": [\ - ["path-key", "npm:3.1.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["path-scurry", [\ - ["npm:1.10.1", {\ - "packageLocation": "./.yarn/cache/path-scurry-npm-1.10.1-52bd946f2e-e2557cff3a.zip/node_modules/path-scurry/",\ - "packageDependencies": [\ - ["path-scurry", "npm:1.10.1"],\ - ["lru-cache", "npm:10.0.1"],\ - ["minipass", "npm:7.0.4"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["prelude-ls", [\ - ["npm:1.2.1", {\ - "packageLocation": "./.yarn/cache/prelude-ls-npm-1.2.1-3e4d272a55-cd192ec0d0.zip/node_modules/prelude-ls/",\ - "packageDependencies": [\ - ["prelude-ls", "npm:1.2.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["promise-retry", [\ - ["npm:2.0.1", {\ - "packageLocation": "./.yarn/cache/promise-retry-npm-2.0.1-871f0b01b7-f96a3f6d90.zip/node_modules/promise-retry/",\ - "packageDependencies": [\ - ["promise-retry", "npm:2.0.1"],\ - ["err-code", "npm:2.0.3"],\ - ["retry", "npm:0.12.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["punycode", [\ - ["npm:2.3.0", {\ - "packageLocation": "./.yarn/cache/punycode-npm-2.3.0-df4bdce06b-39f760e09a.zip/node_modules/punycode/",\ - "packageDependencies": [\ - ["punycode", "npm:2.3.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["queue-microtask", [\ - ["npm:1.2.3", {\ - "packageLocation": "./.yarn/cache/queue-microtask-npm-1.2.3-fcc98e4e2d-b676f8c040.zip/node_modules/queue-microtask/",\ - "packageDependencies": [\ - ["queue-microtask", "npm:1.2.3"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["readable-stream", [\ - ["npm:3.6.2", {\ - "packageLocation": "./.yarn/cache/readable-stream-npm-3.6.2-d2a6069158-bdcbe6c22e.zip/node_modules/readable-stream/",\ - "packageDependencies": [\ - ["readable-stream", "npm:3.6.2"],\ - ["inherits", "npm:2.0.4"],\ - ["string_decoder", "npm:1.3.0"],\ - ["util-deprecate", "npm:1.0.2"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["resolve-from", [\ - ["npm:4.0.0", {\ - "packageLocation": "./.yarn/cache/resolve-from-npm-4.0.0-f758ec21bf-f4ba0b8494.zip/node_modules/resolve-from/",\ - "packageDependencies": [\ - ["resolve-from", "npm:4.0.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["retry", [\ - ["npm:0.12.0", {\ - "packageLocation": "./.yarn/cache/retry-npm-0.12.0-72ac7fb4cc-623bd7d2e5.zip/node_modules/retry/",\ - "packageDependencies": [\ - ["retry", "npm:0.12.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["reusify", [\ - ["npm:1.0.4", {\ - "packageLocation": "./.yarn/cache/reusify-npm-1.0.4-95ac4aec11-c3076ebcc2.zip/node_modules/reusify/",\ - "packageDependencies": [\ - ["reusify", "npm:1.0.4"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["rimraf", [\ - ["npm:3.0.2", {\ - "packageLocation": "./.yarn/cache/rimraf-npm-3.0.2-2cb7dac69a-87f4164e39.zip/node_modules/rimraf/",\ - "packageDependencies": [\ - ["rimraf", "npm:3.0.2"],\ - ["glob", "npm:7.2.3"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["rollup", [\ - ["npm:2.79.1", {\ - "packageLocation": "./.yarn/cache/rollup-npm-2.79.1-94e707a9a3-6a2bf167b3.zip/node_modules/rollup/",\ - "packageDependencies": [\ - ["rollup", "npm:2.79.1"],\ - ["fsevents", "patch:fsevents@npm%3A2.3.3#~builtin::version=2.3.3&hash=df0bf1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["run-parallel", [\ - ["npm:1.2.0", {\ - "packageLocation": "./.yarn/cache/run-parallel-npm-1.2.0-3f47ff2034-cb4f97ad25.zip/node_modules/run-parallel/",\ - "packageDependencies": [\ - ["run-parallel", "npm:1.2.0"],\ - ["queue-microtask", "npm:1.2.3"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["safe-buffer", [\ - ["npm:5.2.1", {\ - "packageLocation": "./.yarn/cache/safe-buffer-npm-5.2.1-3481c8aa9b-b99c4b41fd.zip/node_modules/safe-buffer/",\ - "packageDependencies": [\ - ["safe-buffer", "npm:5.2.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["safer-buffer", [\ - ["npm:2.1.2", {\ - "packageLocation": "./.yarn/cache/safer-buffer-npm-2.1.2-8d5c0b705e-cab8f25ae6.zip/node_modules/safer-buffer/",\ - "packageDependencies": [\ - ["safer-buffer", "npm:2.1.2"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["semver", [\ - ["npm:7.5.4", {\ - "packageLocation": "./.yarn/cache/semver-npm-7.5.4-c4ad957fcd-12d8ad952f.zip/node_modules/semver/",\ - "packageDependencies": [\ - ["semver", "npm:7.5.4"],\ - ["lru-cache", "npm:6.0.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["set-blocking", [\ - ["npm:2.0.0", {\ - "packageLocation": "./.yarn/cache/set-blocking-npm-2.0.0-49e2cffa24-6e65a05f7c.zip/node_modules/set-blocking/",\ - "packageDependencies": [\ - ["set-blocking", "npm:2.0.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["shebang-command", [\ - ["npm:2.0.0", {\ - "packageLocation": "./.yarn/cache/shebang-command-npm-2.0.0-eb2b01921d-6b52fe8727.zip/node_modules/shebang-command/",\ - "packageDependencies": [\ - ["shebang-command", "npm:2.0.0"],\ - ["shebang-regex", "npm:3.0.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["shebang-regex", [\ - ["npm:3.0.0", {\ - "packageLocation": "./.yarn/cache/shebang-regex-npm-3.0.0-899a0cd65e-1a2bcae50d.zip/node_modules/shebang-regex/",\ - "packageDependencies": [\ - ["shebang-regex", "npm:3.0.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["signal-exit", [\ - ["npm:3.0.7", {\ - "packageLocation": "./.yarn/cache/signal-exit-npm-3.0.7-bd270458a3-a2f098f247.zip/node_modules/signal-exit/",\ - "packageDependencies": [\ - ["signal-exit", "npm:3.0.7"]\ - ],\ - "linkType": "HARD"\ - }],\ - ["npm:4.1.0", {\ - "packageLocation": "./.yarn/cache/signal-exit-npm-4.1.0-61fb957687-64c757b498.zip/node_modules/signal-exit/",\ - "packageDependencies": [\ - ["signal-exit", "npm:4.1.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["smart-buffer", [\ - ["npm:4.2.0", {\ - "packageLocation": "./.yarn/cache/smart-buffer-npm-4.2.0-5ac3f668bb-b5167a7142.zip/node_modules/smart-buffer/",\ - "packageDependencies": [\ - ["smart-buffer", "npm:4.2.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["socks", [\ - ["npm:2.7.1", {\ - "packageLocation": "./.yarn/cache/socks-npm-2.7.1-17f2b53052-259d9e3e8e.zip/node_modules/socks/",\ - "packageDependencies": [\ - ["socks", "npm:2.7.1"],\ - ["ip", "npm:2.0.0"],\ - ["smart-buffer", "npm:4.2.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["socks-proxy-agent", [\ - ["npm:7.0.0", {\ - "packageLocation": "./.yarn/cache/socks-proxy-agent-npm-7.0.0-7aacf32ea0-7205543701.zip/node_modules/socks-proxy-agent/",\ - "packageDependencies": [\ - ["socks-proxy-agent", "npm:7.0.0"],\ - ["agent-base", "npm:6.0.2"],\ - ["debug", "virtual:feb0771c9f8eadaf509cfed41e14a8bebbea5442233275c1c87085111077a08ef71eb773b899665b154d8203a55a489610a54117ae059fce5f5b8b844493b1b1#npm:4.3.4"],\ - ["socks", "npm:2.7.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["source-map", [\ - ["npm:0.6.1", {\ - "packageLocation": "./.yarn/cache/source-map-npm-0.6.1-1a3621db16-59ce8640cf.zip/node_modules/source-map/",\ - "packageDependencies": [\ - ["source-map", "npm:0.6.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["source-map-support", [\ - ["npm:0.5.21", {\ - "packageLocation": "./.yarn/cache/source-map-support-npm-0.5.21-09ca99e250-43e98d700d.zip/node_modules/source-map-support/",\ - "packageDependencies": [\ - ["source-map-support", "npm:0.5.21"],\ - ["buffer-from", "npm:1.1.2"],\ - ["source-map", "npm:0.6.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["ssri", [\ - ["npm:10.0.5", {\ - "packageLocation": "./.yarn/cache/ssri-npm-10.0.5-1a7557d04d-0a31b65f21.zip/node_modules/ssri/",\ - "packageDependencies": [\ - ["ssri", "npm:10.0.5"],\ - ["minipass", "npm:7.0.4"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["string-width", [\ - ["npm:4.2.3", {\ - "packageLocation": "./.yarn/cache/string-width-npm-4.2.3-2c27177bae-e52c10dc3f.zip/node_modules/string-width/",\ - "packageDependencies": [\ - ["string-width", "npm:4.2.3"],\ - ["emoji-regex", "npm:8.0.0"],\ - ["is-fullwidth-code-point", "npm:3.0.0"],\ - ["strip-ansi", "npm:6.0.1"]\ - ],\ - "linkType": "HARD"\ - }],\ - ["npm:5.1.2", {\ - "packageLocation": "./.yarn/cache/string-width-npm-5.1.2-bf60531341-7369deaa29.zip/node_modules/string-width/",\ - "packageDependencies": [\ - ["string-width", "npm:5.1.2"],\ - ["eastasianwidth", "npm:0.2.0"],\ - ["emoji-regex", "npm:9.2.2"],\ - ["strip-ansi", "npm:7.1.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["string_decoder", [\ - ["npm:1.3.0", {\ - "packageLocation": "./.yarn/cache/string_decoder-npm-1.3.0-2422117fd0-8417646695.zip/node_modules/string_decoder/",\ - "packageDependencies": [\ - ["string_decoder", "npm:1.3.0"],\ - ["safe-buffer", "npm:5.2.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["strip-ansi", [\ - ["npm:6.0.1", {\ - "packageLocation": "./.yarn/cache/strip-ansi-npm-6.0.1-caddc7cb40-f3cd25890a.zip/node_modules/strip-ansi/",\ - "packageDependencies": [\ - ["strip-ansi", "npm:6.0.1"],\ - ["ansi-regex", "npm:5.0.1"]\ - ],\ - "linkType": "HARD"\ - }],\ - ["npm:7.1.0", {\ - "packageLocation": "./.yarn/cache/strip-ansi-npm-7.1.0-7453b80b79-859c73fcf2.zip/node_modules/strip-ansi/",\ - "packageDependencies": [\ - ["strip-ansi", "npm:7.1.0"],\ - ["ansi-regex", "npm:6.0.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["strip-json-comments", [\ - ["npm:3.1.1", {\ - "packageLocation": "./.yarn/cache/strip-json-comments-npm-3.1.1-dcb2324823-492f73e272.zip/node_modules/strip-json-comments/",\ - "packageDependencies": [\ - ["strip-json-comments", "npm:3.1.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["supports-color", [\ - ["npm:7.2.0", {\ - "packageLocation": "./.yarn/cache/supports-color-npm-7.2.0-606bfcf7da-3dda818de0.zip/node_modules/supports-color/",\ - "packageDependencies": [\ - ["supports-color", "npm:7.2.0"],\ - ["has-flag", "npm:4.0.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["tar", [\ - ["npm:6.2.0", {\ - "packageLocation": "./.yarn/cache/tar-npm-6.2.0-3eb25205a7-db4d9fe74a.zip/node_modules/tar/",\ - "packageDependencies": [\ - ["tar", "npm:6.2.0"],\ - ["chownr", "npm:2.0.0"],\ - ["fs-minipass", "npm:2.1.0"],\ - ["minipass", "npm:5.0.0"],\ - ["minizlib", "npm:2.1.2"],\ - ["mkdirp", "npm:1.0.4"],\ - ["yallist", "npm:4.0.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["temml", [\ - ["workspace:.", {\ - "packageLocation": "./",\ - "packageDependencies": [\ - ["temml", "workspace:."],\ - ["eslint", "npm:8.52.0"],\ - ["esm", "npm:3.2.25"],\ - ["rollup", "npm:2.79.1"],\ - ["terser", "npm:5.22.0"]\ - ],\ - "linkType": "SOFT"\ - }]\ - ]],\ - ["terser", [\ - ["npm:5.22.0", {\ - "packageLocation": "./.yarn/cache/terser-npm-5.22.0-e83cb45628-ee95981c54.zip/node_modules/terser/",\ - "packageDependencies": [\ - ["terser", "npm:5.22.0"],\ - ["@jridgewell/source-map", "npm:0.3.5"],\ - ["acorn", "npm:8.10.0"],\ - ["commander", "npm:2.20.3"],\ - ["source-map-support", "npm:0.5.21"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["text-table", [\ - ["npm:0.2.0", {\ - "packageLocation": "./.yarn/cache/text-table-npm-0.2.0-d92a778b59-b6937a38c8.zip/node_modules/text-table/",\ - "packageDependencies": [\ - ["text-table", "npm:0.2.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["type-check", [\ - ["npm:0.4.0", {\ - "packageLocation": "./.yarn/cache/type-check-npm-0.4.0-60565800ce-ec688ebfc9.zip/node_modules/type-check/",\ - "packageDependencies": [\ - ["type-check", "npm:0.4.0"],\ - ["prelude-ls", "npm:1.2.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["type-fest", [\ - ["npm:0.20.2", {\ - "packageLocation": "./.yarn/cache/type-fest-npm-0.20.2-b36432617f-4fb3272df2.zip/node_modules/type-fest/",\ - "packageDependencies": [\ - ["type-fest", "npm:0.20.2"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["unique-filename", [\ - ["npm:3.0.0", {\ - "packageLocation": "./.yarn/cache/unique-filename-npm-3.0.0-77d68e0a45-8e2f59b356.zip/node_modules/unique-filename/",\ - "packageDependencies": [\ - ["unique-filename", "npm:3.0.0"],\ - ["unique-slug", "npm:4.0.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["unique-slug", [\ - ["npm:4.0.0", {\ - "packageLocation": "./.yarn/cache/unique-slug-npm-4.0.0-e6b08f28aa-0884b58365.zip/node_modules/unique-slug/",\ - "packageDependencies": [\ - ["unique-slug", "npm:4.0.0"],\ - ["imurmurhash", "npm:0.1.4"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["uri-js", [\ - ["npm:4.4.1", {\ - "packageLocation": "./.yarn/cache/uri-js-npm-4.4.1-66d11cbcaf-7167432de6.zip/node_modules/uri-js/",\ - "packageDependencies": [\ - ["uri-js", "npm:4.4.1"],\ - ["punycode", "npm:2.3.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["util-deprecate", [\ - ["npm:1.0.2", {\ - "packageLocation": "./.yarn/cache/util-deprecate-npm-1.0.2-e3fe1a219c-474acf1146.zip/node_modules/util-deprecate/",\ - "packageDependencies": [\ - ["util-deprecate", "npm:1.0.2"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["which", [\ - ["npm:2.0.2", {\ - "packageLocation": "./.yarn/cache/which-npm-2.0.2-320ddf72f7-1a5c563d3c.zip/node_modules/which/",\ - "packageDependencies": [\ - ["which", "npm:2.0.2"],\ - ["isexe", "npm:2.0.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["wide-align", [\ - ["npm:1.1.5", {\ - "packageLocation": "./.yarn/cache/wide-align-npm-1.1.5-889d77e592-d5fc37cd56.zip/node_modules/wide-align/",\ - "packageDependencies": [\ - ["wide-align", "npm:1.1.5"],\ - ["string-width", "npm:4.2.3"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["wrap-ansi", [\ - ["npm:7.0.0", {\ - "packageLocation": "./.yarn/cache/wrap-ansi-npm-7.0.0-ad6e1a0554-a790b846fd.zip/node_modules/wrap-ansi/",\ - "packageDependencies": [\ - ["wrap-ansi", "npm:7.0.0"],\ - ["ansi-styles", "npm:4.3.0"],\ - ["string-width", "npm:4.2.3"],\ - ["strip-ansi", "npm:6.0.1"]\ - ],\ - "linkType": "HARD"\ - }],\ - ["npm:8.1.0", {\ - "packageLocation": "./.yarn/cache/wrap-ansi-npm-8.1.0-26a4e6ae28-371733296d.zip/node_modules/wrap-ansi/",\ - "packageDependencies": [\ - ["wrap-ansi", "npm:8.1.0"],\ - ["ansi-styles", "npm:6.2.1"],\ - ["string-width", "npm:5.1.2"],\ - ["strip-ansi", "npm:7.1.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["wrappy", [\ - ["npm:1.0.2", {\ - "packageLocation": "./.yarn/cache/wrappy-npm-1.0.2-916de4d4b3-159da4805f.zip/node_modules/wrappy/",\ - "packageDependencies": [\ - ["wrappy", "npm:1.0.2"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["yallist", [\ - ["npm:4.0.0", {\ - "packageLocation": "./.yarn/cache/yallist-npm-4.0.0-b493d9e907-343617202a.zip/node_modules/yallist/",\ - "packageDependencies": [\ - ["yallist", "npm:4.0.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["yocto-queue", [\ - ["npm:0.1.0", {\ - "packageLocation": "./.yarn/cache/yocto-queue-npm-0.1.0-c6c9a7db29-f77b3d8d00.zip/node_modules/yocto-queue/",\ - "packageDependencies": [\ - ["yocto-queue", "npm:0.1.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]]\ - ]\ - }'), {basePath: basePath || __dirname}); - } - -const fs = require('fs'); -const path = require('path'); -const require$$0 = require('module'); -const StringDecoder = require('string_decoder'); -const url = require('url'); -const os = require('os'); -const nodeUtils = require('util'); -const readline = require('readline'); -const assert = require('assert'); -const stream = require('stream'); -const zlib = require('zlib'); -const events = require('events'); - -const _interopDefaultLegacy = e => e && typeof e === 'object' && 'default' in e ? e : { default: e }; - -function _interopNamespace(e) { - if (e && e.__esModule) return e; - const n = Object.create(null); - if (e) { - for (const k in e) { - if (k !== 'default') { - const d = Object.getOwnPropertyDescriptor(e, k); - Object.defineProperty(n, k, d.get ? d : { - enumerable: true, - get: () => e[k] - }); - } - } - } - n.default = e; - return Object.freeze(n); -} - -const fs__default = /*#__PURE__*/_interopDefaultLegacy(fs); -const path__default = /*#__PURE__*/_interopDefaultLegacy(path); -const require$$0__default = /*#__PURE__*/_interopDefaultLegacy(require$$0); -const StringDecoder__default = /*#__PURE__*/_interopDefaultLegacy(StringDecoder); -const nodeUtils__namespace = /*#__PURE__*/_interopNamespace(nodeUtils); -const assert__default = /*#__PURE__*/_interopDefaultLegacy(assert); -const zlib__default = /*#__PURE__*/_interopDefaultLegacy(zlib); - -const S_IFMT = 61440; -const S_IFDIR = 16384; -const S_IFREG = 32768; -const S_IFLNK = 40960; -const SAFE_TIME = 456789e3; - -const DEFAULT_MODE = S_IFREG | 420; -class StatEntry { - constructor() { - this.uid = 0; - this.gid = 0; - this.size = 0; - this.blksize = 0; - this.atimeMs = 0; - this.mtimeMs = 0; - this.ctimeMs = 0; - this.birthtimeMs = 0; - this.atime = new Date(0); - this.mtime = new Date(0); - this.ctime = new Date(0); - this.birthtime = new Date(0); - this.dev = 0; - this.ino = 0; - this.mode = DEFAULT_MODE; - this.nlink = 1; - this.rdev = 0; - this.blocks = 1; - } - isBlockDevice() { - return false; - } - isCharacterDevice() { - return false; - } - isDirectory() { - return (this.mode & S_IFMT) === S_IFDIR; - } - isFIFO() { - return false; - } - isFile() { - return (this.mode & S_IFMT) === S_IFREG; - } - isSocket() { - return false; - } - isSymbolicLink() { - return (this.mode & S_IFMT) === S_IFLNK; - } -} -class BigIntStatsEntry { - constructor() { - this.uid = BigInt(0); - this.gid = BigInt(0); - this.size = BigInt(0); - this.blksize = BigInt(0); - this.atimeMs = BigInt(0); - this.mtimeMs = BigInt(0); - this.ctimeMs = BigInt(0); - this.birthtimeMs = BigInt(0); - this.atimeNs = BigInt(0); - this.mtimeNs = BigInt(0); - this.ctimeNs = BigInt(0); - this.birthtimeNs = BigInt(0); - this.atime = new Date(0); - this.mtime = new Date(0); - this.ctime = new Date(0); - this.birthtime = new Date(0); - this.dev = BigInt(0); - this.ino = BigInt(0); - this.mode = BigInt(DEFAULT_MODE); - this.nlink = BigInt(1); - this.rdev = BigInt(0); - this.blocks = BigInt(1); - } - isBlockDevice() { - return false; - } - isCharacterDevice() { - return false; - } - isDirectory() { - return (this.mode & BigInt(S_IFMT)) === BigInt(S_IFDIR); - } - isFIFO() { - return false; - } - isFile() { - return (this.mode & BigInt(S_IFMT)) === BigInt(S_IFREG); - } - isSocket() { - return false; - } - isSymbolicLink() { - return (this.mode & BigInt(S_IFMT)) === BigInt(S_IFLNK); - } -} -function makeDefaultStats() { - return new StatEntry(); -} -function clearStats(stats) { - for (const key in stats) { - if (Object.prototype.hasOwnProperty.call(stats, key)) { - const element = stats[key]; - if (typeof element === `number`) { - stats[key] = 0; - } else if (typeof element === `bigint`) { - stats[key] = BigInt(0); - } else if (nodeUtils__namespace.types.isDate(element)) { - stats[key] = new Date(0); - } - } - } - return stats; -} -function convertToBigIntStats(stats) { - const bigintStats = new BigIntStatsEntry(); - for (const key in stats) { - if (Object.prototype.hasOwnProperty.call(stats, key)) { - const element = stats[key]; - if (typeof element === `number`) { - bigintStats[key] = BigInt(element); - } else if (nodeUtils__namespace.types.isDate(element)) { - bigintStats[key] = new Date(element); - } - } - } - bigintStats.atimeNs = bigintStats.atimeMs * BigInt(1e6); - bigintStats.mtimeNs = bigintStats.mtimeMs * BigInt(1e6); - bigintStats.ctimeNs = bigintStats.ctimeMs * BigInt(1e6); - bigintStats.birthtimeNs = bigintStats.birthtimeMs * BigInt(1e6); - return bigintStats; -} -function areStatsEqual(a, b) { - if (a.atimeMs !== b.atimeMs) - return false; - if (a.birthtimeMs !== b.birthtimeMs) - return false; - if (a.blksize !== b.blksize) - return false; - if (a.blocks !== b.blocks) - return false; - if (a.ctimeMs !== b.ctimeMs) - return false; - if (a.dev !== b.dev) - return false; - if (a.gid !== b.gid) - return false; - if (a.ino !== b.ino) - return false; - if (a.isBlockDevice() !== b.isBlockDevice()) - return false; - if (a.isCharacterDevice() !== b.isCharacterDevice()) - return false; - if (a.isDirectory() !== b.isDirectory()) - return false; - if (a.isFIFO() !== b.isFIFO()) - return false; - if (a.isFile() !== b.isFile()) - return false; - if (a.isSocket() !== b.isSocket()) - return false; - if (a.isSymbolicLink() !== b.isSymbolicLink()) - return false; - if (a.mode !== b.mode) - return false; - if (a.mtimeMs !== b.mtimeMs) - return false; - if (a.nlink !== b.nlink) - return false; - if (a.rdev !== b.rdev) - return false; - if (a.size !== b.size) - return false; - if (a.uid !== b.uid) - return false; - const aN = a; - const bN = b; - if (aN.atimeNs !== bN.atimeNs) - return false; - if (aN.mtimeNs !== bN.mtimeNs) - return false; - if (aN.ctimeNs !== bN.ctimeNs) - return false; - if (aN.birthtimeNs !== bN.birthtimeNs) - return false; - return true; -} - -const PortablePath = { - root: `/`, - dot: `.`, - parent: `..` -}; -const Filename = { - nodeModules: `node_modules`, - manifest: `package.json`, - lockfile: `yarn.lock`, - virtual: `__virtual__`, - pnpJs: `.pnp.js`, - pnpCjs: `.pnp.cjs`, - rc: `.yarnrc.yml` -}; -const npath = Object.create(path__default.default); -const ppath = Object.create(path__default.default.posix); -npath.cwd = () => process.cwd(); -ppath.cwd = () => toPortablePath(process.cwd()); -ppath.resolve = (...segments) => { - if (segments.length > 0 && ppath.isAbsolute(segments[0])) { - return path__default.default.posix.resolve(...segments); - } else { - return path__default.default.posix.resolve(ppath.cwd(), ...segments); - } -}; -const contains = function(pathUtils, from, to) { - from = pathUtils.normalize(from); - to = pathUtils.normalize(to); - if (from === to) - return `.`; - if (!from.endsWith(pathUtils.sep)) - from = from + pathUtils.sep; - if (to.startsWith(from)) { - return to.slice(from.length); - } else { - return null; - } -}; -npath.fromPortablePath = fromPortablePath; -npath.toPortablePath = toPortablePath; -npath.contains = (from, to) => contains(npath, from, to); -ppath.contains = (from, to) => contains(ppath, from, to); -const WINDOWS_PATH_REGEXP = /^([a-zA-Z]:.*)$/; -const UNC_WINDOWS_PATH_REGEXP = /^\/\/(\.\/)?(.*)$/; -const PORTABLE_PATH_REGEXP = /^\/([a-zA-Z]:.*)$/; -const UNC_PORTABLE_PATH_REGEXP = /^\/unc\/(\.dot\/)?(.*)$/; -function fromPortablePath(p) { - if (process.platform !== `win32`) - return p; - let portablePathMatch, uncPortablePathMatch; - if (portablePathMatch = p.match(PORTABLE_PATH_REGEXP)) - p = portablePathMatch[1]; - else if (uncPortablePathMatch = p.match(UNC_PORTABLE_PATH_REGEXP)) - p = `\\\\${uncPortablePathMatch[1] ? `.\\` : ``}${uncPortablePathMatch[2]}`; - else - return p; - return p.replace(/\//g, `\\`); -} -function toPortablePath(p) { - if (process.platform !== `win32`) - return p; - p = p.replace(/\\/g, `/`); - let windowsPathMatch, uncWindowsPathMatch; - if (windowsPathMatch = p.match(WINDOWS_PATH_REGEXP)) - p = `/${windowsPathMatch[1]}`; - else if (uncWindowsPathMatch = p.match(UNC_WINDOWS_PATH_REGEXP)) - p = `/unc/${uncWindowsPathMatch[1] ? `.dot/` : ``}${uncWindowsPathMatch[2]}`; - return p; -} -function convertPath(targetPathUtils, sourcePath) { - return targetPathUtils === npath ? fromPortablePath(sourcePath) : toPortablePath(sourcePath); -} - -const defaultTime = new Date(SAFE_TIME * 1e3); -async function copyPromise(destinationFs, destination, sourceFs, source, opts) { - const normalizedDestination = destinationFs.pathUtils.normalize(destination); - const normalizedSource = sourceFs.pathUtils.normalize(source); - const prelayout = []; - const postlayout = []; - const { atime, mtime } = opts.stableTime ? { atime: defaultTime, mtime: defaultTime } : await sourceFs.lstatPromise(normalizedSource); - await destinationFs.mkdirpPromise(destinationFs.pathUtils.dirname(destination), { utimes: [atime, mtime] }); - const updateTime = typeof destinationFs.lutimesPromise === `function` ? destinationFs.lutimesPromise.bind(destinationFs) : destinationFs.utimesPromise.bind(destinationFs); - await copyImpl(prelayout, postlayout, updateTime, destinationFs, normalizedDestination, sourceFs, normalizedSource, { ...opts, didParentExist: true }); - for (const operation of prelayout) - await operation(); - await Promise.all(postlayout.map((operation) => { - return operation(); - })); -} -async function copyImpl(prelayout, postlayout, updateTime, destinationFs, destination, sourceFs, source, opts) { - var _a, _b; - const destinationStat = opts.didParentExist ? await maybeLStat(destinationFs, destination) : null; - const sourceStat = await sourceFs.lstatPromise(source); - const { atime, mtime } = opts.stableTime ? { atime: defaultTime, mtime: defaultTime } : sourceStat; - let updated; - switch (true) { - case sourceStat.isDirectory(): - { - updated = await copyFolder(prelayout, postlayout, updateTime, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts); - } - break; - case sourceStat.isFile(): - { - updated = await copyFile(prelayout, postlayout, updateTime, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts); - } - break; - case sourceStat.isSymbolicLink(): - { - updated = await copySymlink(prelayout, postlayout, updateTime, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts); - } - break; - default: - { - throw new Error(`Unsupported file type (${sourceStat.mode})`); - } - } - if (updated || ((_a = destinationStat == null ? void 0 : destinationStat.mtime) == null ? void 0 : _a.getTime()) !== mtime.getTime() || ((_b = destinationStat == null ? void 0 : destinationStat.atime) == null ? void 0 : _b.getTime()) !== atime.getTime()) { - postlayout.push(() => updateTime(destination, atime, mtime)); - updated = true; - } - if (destinationStat === null || (destinationStat.mode & 511) !== (sourceStat.mode & 511)) { - postlayout.push(() => destinationFs.chmodPromise(destination, sourceStat.mode & 511)); - updated = true; - } - return updated; -} -async function maybeLStat(baseFs, p) { - try { - return await baseFs.lstatPromise(p); - } catch (e) { - return null; - } -} -async function copyFolder(prelayout, postlayout, updateTime, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts) { - if (destinationStat !== null && !destinationStat.isDirectory()) { - if (opts.overwrite) { - prelayout.push(async () => destinationFs.removePromise(destination)); - destinationStat = null; - } else { - return false; - } - } - let updated = false; - if (destinationStat === null) { - prelayout.push(async () => { - try { - await destinationFs.mkdirPromise(destination, { mode: sourceStat.mode }); - } catch (err) { - if (err.code !== `EEXIST`) { - throw err; - } - } - }); - updated = true; - } - const entries = await sourceFs.readdirPromise(source); - const nextOpts = opts.didParentExist && !destinationStat ? { ...opts, didParentExist: false } : opts; - if (opts.stableSort) { - for (const entry of entries.sort()) { - if (await copyImpl(prelayout, postlayout, updateTime, destinationFs, destinationFs.pathUtils.join(destination, entry), sourceFs, sourceFs.pathUtils.join(source, entry), nextOpts)) { - updated = true; - } - } - } else { - const entriesUpdateStatus = await Promise.all(entries.map(async (entry) => { - await copyImpl(prelayout, postlayout, updateTime, destinationFs, destinationFs.pathUtils.join(destination, entry), sourceFs, sourceFs.pathUtils.join(source, entry), nextOpts); - })); - if (entriesUpdateStatus.some((status) => status)) { - updated = true; - } - } - return updated; -} -const isCloneSupportedCache = /* @__PURE__ */ new WeakMap(); -function makeLinkOperation(opFs, destination, source, sourceStat, linkStrategy) { - return async () => { - await opFs.linkPromise(source, destination); - if (linkStrategy === "readOnly" /* ReadOnly */) { - sourceStat.mode &= ~146; - await opFs.chmodPromise(destination, sourceStat.mode); - } - }; -} -function makeCloneLinkOperation(opFs, destination, source, sourceStat, linkStrategy) { - const isCloneSupported = isCloneSupportedCache.get(opFs); - if (typeof isCloneSupported === `undefined`) { - return async () => { - try { - await opFs.copyFilePromise(source, destination, fs__default.default.constants.COPYFILE_FICLONE_FORCE); - isCloneSupportedCache.set(opFs, true); - } catch (err) { - if (err.code === `ENOSYS` || err.code === `ENOTSUP`) { - isCloneSupportedCache.set(opFs, false); - await makeLinkOperation(opFs, destination, source, sourceStat, linkStrategy)(); - } else { - throw err; - } - } - }; - } else { - if (isCloneSupported) { - return async () => opFs.copyFilePromise(source, destination, fs__default.default.constants.COPYFILE_FICLONE_FORCE); - } else { - return makeLinkOperation(opFs, destination, source, sourceStat, linkStrategy); - } - } -} -async function copyFile(prelayout, postlayout, updateTime, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts) { - var _a; - if (destinationStat !== null) { - if (opts.overwrite) { - prelayout.push(async () => destinationFs.removePromise(destination)); - destinationStat = null; - } else { - return false; - } - } - const linkStrategy = (_a = opts.linkStrategy) != null ? _a : null; - const op = destinationFs === sourceFs ? linkStrategy !== null ? makeCloneLinkOperation(destinationFs, destination, source, sourceStat, linkStrategy) : async () => destinationFs.copyFilePromise(source, destination, fs__default.default.constants.COPYFILE_FICLONE) : linkStrategy !== null ? makeLinkOperation(destinationFs, destination, source, sourceStat, linkStrategy) : async () => destinationFs.writeFilePromise(destination, await sourceFs.readFilePromise(source)); - prelayout.push(async () => op()); - return true; -} -async function copySymlink(prelayout, postlayout, updateTime, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts) { - if (destinationStat !== null) { - if (opts.overwrite) { - prelayout.push(async () => destinationFs.removePromise(destination)); - destinationStat = null; - } else { - return false; - } - } - prelayout.push(async () => { - await destinationFs.symlinkPromise(convertPath(destinationFs.pathUtils, await sourceFs.readlinkPromise(source)), destination); - }); - return true; -} - -function makeError$1(code, message) { - return Object.assign(new Error(`${code}: ${message}`), { code }); -} -function EBUSY(message) { - return makeError$1(`EBUSY`, message); -} -function ENOSYS(message, reason) { - return makeError$1(`ENOSYS`, `${message}, ${reason}`); -} -function EINVAL(reason) { - return makeError$1(`EINVAL`, `invalid argument, ${reason}`); -} -function EBADF(reason) { - return makeError$1(`EBADF`, `bad file descriptor, ${reason}`); -} -function ENOENT(reason) { - return makeError$1(`ENOENT`, `no such file or directory, ${reason}`); -} -function ENOTDIR(reason) { - return makeError$1(`ENOTDIR`, `not a directory, ${reason}`); -} -function EISDIR(reason) { - return makeError$1(`EISDIR`, `illegal operation on a directory, ${reason}`); -} -function EEXIST(reason) { - return makeError$1(`EEXIST`, `file already exists, ${reason}`); -} -function EROFS(reason) { - return makeError$1(`EROFS`, `read-only filesystem, ${reason}`); -} -function ENOTEMPTY(reason) { - return makeError$1(`ENOTEMPTY`, `directory not empty, ${reason}`); -} -function EOPNOTSUPP(reason) { - return makeError$1(`EOPNOTSUPP`, `operation not supported, ${reason}`); -} -function ERR_DIR_CLOSED() { - return makeError$1(`ERR_DIR_CLOSED`, `Directory handle was closed`); -} -class LibzipError extends Error { - constructor(message, code) { - super(message); - this.name = `Libzip Error`; - this.code = code; - } -} - -class CustomDir { - constructor(path, nextDirent, opts = {}) { - this.path = path; - this.nextDirent = nextDirent; - this.opts = opts; - this.closed = false; - } - throwIfClosed() { - if (this.closed) { - throw ERR_DIR_CLOSED(); - } - } - async *[Symbol.asyncIterator]() { - try { - let dirent; - while ((dirent = await this.read()) !== null) { - yield dirent; - } - } finally { - await this.close(); - } - } - read(cb) { - const dirent = this.readSync(); - if (typeof cb !== `undefined`) - return cb(null, dirent); - return Promise.resolve(dirent); - } - readSync() { - this.throwIfClosed(); - return this.nextDirent(); - } - close(cb) { - this.closeSync(); - if (typeof cb !== `undefined`) - return cb(null); - return Promise.resolve(); - } - closeSync() { - var _a, _b; - this.throwIfClosed(); - (_b = (_a = this.opts).onClose) == null ? void 0 : _b.call(_a); - this.closed = true; - } -} -function opendir(fakeFs, path, entries, opts) { - const nextDirent = () => { - const filename = entries.shift(); - if (typeof filename === `undefined`) - return null; - return Object.assign(fakeFs.statSync(fakeFs.pathUtils.join(path, filename)), { - name: filename - }); - }; - return new CustomDir(path, nextDirent, opts); -} - -class FakeFS { - constructor(pathUtils) { - this.pathUtils = pathUtils; - } - async *genTraversePromise(init, { stableSort = false } = {}) { - const stack = [init]; - while (stack.length > 0) { - const p = stack.shift(); - const entry = await this.lstatPromise(p); - if (entry.isDirectory()) { - const entries = await this.readdirPromise(p); - if (stableSort) { - for (const entry2 of entries.sort()) { - stack.push(this.pathUtils.join(p, entry2)); - } - } else { - throw new Error(`Not supported`); - } - } else { - yield p; - } - } - } - async removePromise(p, { recursive = true, maxRetries = 5 } = {}) { - let stat; - try { - stat = await this.lstatPromise(p); - } catch (error) { - if (error.code === `ENOENT`) { - return; - } else { - throw error; - } - } - if (stat.isDirectory()) { - if (recursive) { - const entries = await this.readdirPromise(p); - await Promise.all(entries.map((entry) => { - return this.removePromise(this.pathUtils.resolve(p, entry)); - })); - } - for (let t = 0; t <= maxRetries; t++) { - try { - await this.rmdirPromise(p); - break; - } catch (error) { - if (error.code !== `EBUSY` && error.code !== `ENOTEMPTY`) { - throw error; - } else if (t < maxRetries) { - await new Promise((resolve) => setTimeout(resolve, t * 100)); - } - } - } - } else { - await this.unlinkPromise(p); - } - } - removeSync(p, { recursive = true } = {}) { - let stat; - try { - stat = this.lstatSync(p); - } catch (error) { - if (error.code === `ENOENT`) { - return; - } else { - throw error; - } - } - if (stat.isDirectory()) { - if (recursive) - for (const entry of this.readdirSync(p)) - this.removeSync(this.pathUtils.resolve(p, entry)); - this.rmdirSync(p); - } else { - this.unlinkSync(p); - } - } - async mkdirpPromise(p, { chmod, utimes } = {}) { - p = this.resolve(p); - if (p === this.pathUtils.dirname(p)) - return void 0; - const parts = p.split(this.pathUtils.sep); - let createdDirectory; - for (let u = 2; u <= parts.length; ++u) { - const subPath = parts.slice(0, u).join(this.pathUtils.sep); - if (!this.existsSync(subPath)) { - try { - await this.mkdirPromise(subPath); - } catch (error) { - if (error.code === `EEXIST`) { - continue; - } else { - throw error; - } - } - createdDirectory != null ? createdDirectory : createdDirectory = subPath; - if (chmod != null) - await this.chmodPromise(subPath, chmod); - if (utimes != null) { - await this.utimesPromise(subPath, utimes[0], utimes[1]); - } else { - const parentStat = await this.statPromise(this.pathUtils.dirname(subPath)); - await this.utimesPromise(subPath, parentStat.atime, parentStat.mtime); - } - } - } - return createdDirectory; - } - mkdirpSync(p, { chmod, utimes } = {}) { - p = this.resolve(p); - if (p === this.pathUtils.dirname(p)) - return void 0; - const parts = p.split(this.pathUtils.sep); - let createdDirectory; - for (let u = 2; u <= parts.length; ++u) { - const subPath = parts.slice(0, u).join(this.pathUtils.sep); - if (!this.existsSync(subPath)) { - try { - this.mkdirSync(subPath); - } catch (error) { - if (error.code === `EEXIST`) { - continue; - } else { - throw error; - } - } - createdDirectory != null ? createdDirectory : createdDirectory = subPath; - if (chmod != null) - this.chmodSync(subPath, chmod); - if (utimes != null) { - this.utimesSync(subPath, utimes[0], utimes[1]); - } else { - const parentStat = this.statSync(this.pathUtils.dirname(subPath)); - this.utimesSync(subPath, parentStat.atime, parentStat.mtime); - } - } - } - return createdDirectory; - } - async copyPromise(destination, source, { baseFs = this, overwrite = true, stableSort = false, stableTime = false, linkStrategy = null } = {}) { - return await copyPromise(this, destination, baseFs, source, { overwrite, stableSort, stableTime, linkStrategy }); - } - copySync(destination, source, { baseFs = this, overwrite = true } = {}) { - const stat = baseFs.lstatSync(source); - const exists = this.existsSync(destination); - if (stat.isDirectory()) { - this.mkdirpSync(destination); - const directoryListing = baseFs.readdirSync(source); - for (const entry of directoryListing) { - this.copySync(this.pathUtils.join(destination, entry), baseFs.pathUtils.join(source, entry), { baseFs, overwrite }); - } - } else if (stat.isFile()) { - if (!exists || overwrite) { - if (exists) - this.removeSync(destination); - const content = baseFs.readFileSync(source); - this.writeFileSync(destination, content); - } - } else if (stat.isSymbolicLink()) { - if (!exists || overwrite) { - if (exists) - this.removeSync(destination); - const target = baseFs.readlinkSync(source); - this.symlinkSync(convertPath(this.pathUtils, target), destination); - } - } else { - throw new Error(`Unsupported file type (file: ${source}, mode: 0o${stat.mode.toString(8).padStart(6, `0`)})`); - } - const mode = stat.mode & 511; - this.chmodSync(destination, mode); - } - async changeFilePromise(p, content, opts = {}) { - if (Buffer.isBuffer(content)) { - return this.changeFileBufferPromise(p, content, opts); - } else { - return this.changeFileTextPromise(p, content, opts); - } - } - async changeFileBufferPromise(p, content, { mode } = {}) { - let current = Buffer.alloc(0); - try { - current = await this.readFilePromise(p); - } catch (error) { - } - if (Buffer.compare(current, content) === 0) - return; - await this.writeFilePromise(p, content, { mode }); - } - async changeFileTextPromise(p, content, { automaticNewlines, mode } = {}) { - let current = ``; - try { - current = await this.readFilePromise(p, `utf8`); - } catch (error) { - } - const normalizedContent = automaticNewlines ? normalizeLineEndings(current, content) : content; - if (current === normalizedContent) - return; - await this.writeFilePromise(p, normalizedContent, { mode }); - } - changeFileSync(p, content, opts = {}) { - if (Buffer.isBuffer(content)) { - return this.changeFileBufferSync(p, content, opts); - } else { - return this.changeFileTextSync(p, content, opts); - } - } - changeFileBufferSync(p, content, { mode } = {}) { - let current = Buffer.alloc(0); - try { - current = this.readFileSync(p); - } catch (error) { - } - if (Buffer.compare(current, content) === 0) - return; - this.writeFileSync(p, content, { mode }); - } - changeFileTextSync(p, content, { automaticNewlines = false, mode } = {}) { - let current = ``; - try { - current = this.readFileSync(p, `utf8`); - } catch (error) { - } - const normalizedContent = automaticNewlines ? normalizeLineEndings(current, content) : content; - if (current === normalizedContent) - return; - this.writeFileSync(p, normalizedContent, { mode }); - } - async movePromise(fromP, toP) { - try { - await this.renamePromise(fromP, toP); - } catch (error) { - if (error.code === `EXDEV`) { - await this.copyPromise(toP, fromP); - await this.removePromise(fromP); - } else { - throw error; - } - } - } - moveSync(fromP, toP) { - try { - this.renameSync(fromP, toP); - } catch (error) { - if (error.code === `EXDEV`) { - this.copySync(toP, fromP); - this.removeSync(fromP); - } else { - throw error; - } - } - } - async lockPromise(affectedPath, callback) { - const lockPath = `${affectedPath}.flock`; - const interval = 1e3 / 60; - const startTime = Date.now(); - let fd = null; - const isAlive = async () => { - let pid; - try { - [pid] = await this.readJsonPromise(lockPath); - } catch (error) { - return Date.now() - startTime < 500; - } - try { - process.kill(pid, 0); - return true; - } catch (error) { - return false; - } - }; - while (fd === null) { - try { - fd = await this.openPromise(lockPath, `wx`); - } catch (error) { - if (error.code === `EEXIST`) { - if (!await isAlive()) { - try { - await this.unlinkPromise(lockPath); - continue; - } catch (error2) { - } - } - if (Date.now() - startTime < 60 * 1e3) { - await new Promise((resolve) => setTimeout(resolve, interval)); - } else { - throw new Error(`Couldn't acquire a lock in a reasonable time (via ${lockPath})`); - } - } else { - throw error; - } - } - } - await this.writePromise(fd, JSON.stringify([process.pid])); - try { - return await callback(); - } finally { - try { - await this.closePromise(fd); - await this.unlinkPromise(lockPath); - } catch (error) { - } - } - } - async readJsonPromise(p) { - const content = await this.readFilePromise(p, `utf8`); - try { - return JSON.parse(content); - } catch (error) { - error.message += ` (in ${p})`; - throw error; - } - } - readJsonSync(p) { - const content = this.readFileSync(p, `utf8`); - try { - return JSON.parse(content); - } catch (error) { - error.message += ` (in ${p})`; - throw error; - } - } - async writeJsonPromise(p, data) { - return await this.writeFilePromise(p, `${JSON.stringify(data, null, 2)} -`); - } - writeJsonSync(p, data) { - return this.writeFileSync(p, `${JSON.stringify(data, null, 2)} -`); - } - async preserveTimePromise(p, cb) { - const stat = await this.lstatPromise(p); - const result = await cb(); - if (typeof result !== `undefined`) - p = result; - if (this.lutimesPromise) { - await this.lutimesPromise(p, stat.atime, stat.mtime); - } else if (!stat.isSymbolicLink()) { - await this.utimesPromise(p, stat.atime, stat.mtime); - } - } - async preserveTimeSync(p, cb) { - const stat = this.lstatSync(p); - const result = cb(); - if (typeof result !== `undefined`) - p = result; - if (this.lutimesSync) { - this.lutimesSync(p, stat.atime, stat.mtime); - } else if (!stat.isSymbolicLink()) { - this.utimesSync(p, stat.atime, stat.mtime); - } - } -} -class BasePortableFakeFS extends FakeFS { - constructor() { - super(ppath); - } -} -function getEndOfLine(content) { - const matches = content.match(/\r?\n/g); - if (matches === null) - return os.EOL; - const crlf = matches.filter((nl) => nl === `\r -`).length; - const lf = matches.length - crlf; - return crlf > lf ? `\r -` : ` -`; -} -function normalizeLineEndings(originalContent, newContent) { - return newContent.replace(/\r?\n/g, getEndOfLine(originalContent)); -} - -class NodeFS extends BasePortableFakeFS { - constructor(realFs = fs__default.default) { - super(); - this.realFs = realFs; - if (typeof this.realFs.lutimes !== `undefined`) { - this.lutimesPromise = this.lutimesPromiseImpl; - this.lutimesSync = this.lutimesSyncImpl; - } - } - getExtractHint() { - return false; - } - getRealPath() { - return PortablePath.root; - } - resolve(p) { - return ppath.resolve(p); - } - async openPromise(p, flags, mode) { - return await new Promise((resolve, reject) => { - this.realFs.open(npath.fromPortablePath(p), flags, mode, this.makeCallback(resolve, reject)); - }); - } - openSync(p, flags, mode) { - return this.realFs.openSync(npath.fromPortablePath(p), flags, mode); - } - async opendirPromise(p, opts) { - return await new Promise((resolve, reject) => { - if (typeof opts !== `undefined`) { - this.realFs.opendir(npath.fromPortablePath(p), opts, this.makeCallback(resolve, reject)); - } else { - this.realFs.opendir(npath.fromPortablePath(p), this.makeCallback(resolve, reject)); - } - }).then((dir) => { - return Object.defineProperty(dir, `path`, { value: p, configurable: true, writable: true }); - }); - } - opendirSync(p, opts) { - const dir = typeof opts !== `undefined` ? this.realFs.opendirSync(npath.fromPortablePath(p), opts) : this.realFs.opendirSync(npath.fromPortablePath(p)); - return Object.defineProperty(dir, `path`, { value: p, configurable: true, writable: true }); - } - async readPromise(fd, buffer, offset = 0, length = 0, position = -1) { - return await new Promise((resolve, reject) => { - this.realFs.read(fd, buffer, offset, length, position, (error, bytesRead) => { - if (error) { - reject(error); - } else { - resolve(bytesRead); - } - }); - }); - } - readSync(fd, buffer, offset, length, position) { - return this.realFs.readSync(fd, buffer, offset, length, position); - } - async writePromise(fd, buffer, offset, length, position) { - return await new Promise((resolve, reject) => { - if (typeof buffer === `string`) { - return this.realFs.write(fd, buffer, offset, this.makeCallback(resolve, reject)); - } else { - return this.realFs.write(fd, buffer, offset, length, position, this.makeCallback(resolve, reject)); - } - }); - } - writeSync(fd, buffer, offset, length, position) { - if (typeof buffer === `string`) { - return this.realFs.writeSync(fd, buffer, offset); - } else { - return this.realFs.writeSync(fd, buffer, offset, length, position); - } - } - async closePromise(fd) { - await new Promise((resolve, reject) => { - this.realFs.close(fd, this.makeCallback(resolve, reject)); - }); - } - closeSync(fd) { - this.realFs.closeSync(fd); - } - createReadStream(p, opts) { - const realPath = p !== null ? npath.fromPortablePath(p) : p; - return this.realFs.createReadStream(realPath, opts); - } - createWriteStream(p, opts) { - const realPath = p !== null ? npath.fromPortablePath(p) : p; - return this.realFs.createWriteStream(realPath, opts); - } - async realpathPromise(p) { - return await new Promise((resolve, reject) => { - this.realFs.realpath(npath.fromPortablePath(p), {}, this.makeCallback(resolve, reject)); - }).then((path) => { - return npath.toPortablePath(path); - }); - } - realpathSync(p) { - return npath.toPortablePath(this.realFs.realpathSync(npath.fromPortablePath(p), {})); - } - async existsPromise(p) { - return await new Promise((resolve) => { - this.realFs.exists(npath.fromPortablePath(p), resolve); - }); - } - accessSync(p, mode) { - return this.realFs.accessSync(npath.fromPortablePath(p), mode); - } - async accessPromise(p, mode) { - return await new Promise((resolve, reject) => { - this.realFs.access(npath.fromPortablePath(p), mode, this.makeCallback(resolve, reject)); - }); - } - existsSync(p) { - return this.realFs.existsSync(npath.fromPortablePath(p)); - } - async statPromise(p, opts) { - return await new Promise((resolve, reject) => { - if (opts) { - this.realFs.stat(npath.fromPortablePath(p), opts, this.makeCallback(resolve, reject)); - } else { - this.realFs.stat(npath.fromPortablePath(p), this.makeCallback(resolve, reject)); - } - }); - } - statSync(p, opts) { - if (opts) { - return this.realFs.statSync(npath.fromPortablePath(p), opts); - } else { - return this.realFs.statSync(npath.fromPortablePath(p)); - } - } - async fstatPromise(fd, opts) { - return await new Promise((resolve, reject) => { - if (opts) { - this.realFs.fstat(fd, opts, this.makeCallback(resolve, reject)); - } else { - this.realFs.fstat(fd, this.makeCallback(resolve, reject)); - } - }); - } - fstatSync(fd, opts) { - if (opts) { - return this.realFs.fstatSync(fd, opts); - } else { - return this.realFs.fstatSync(fd); - } - } - async lstatPromise(p, opts) { - return await new Promise((resolve, reject) => { - if (opts) { - this.realFs.lstat(npath.fromPortablePath(p), opts, this.makeCallback(resolve, reject)); - } else { - this.realFs.lstat(npath.fromPortablePath(p), this.makeCallback(resolve, reject)); - } - }); - } - lstatSync(p, opts) { - if (opts) { - return this.realFs.lstatSync(npath.fromPortablePath(p), opts); - } else { - return this.realFs.lstatSync(npath.fromPortablePath(p)); - } - } - async fchmodPromise(fd, mask) { - return await new Promise((resolve, reject) => { - this.realFs.fchmod(fd, mask, this.makeCallback(resolve, reject)); - }); - } - fchmodSync(fd, mask) { - return this.realFs.fchmodSync(fd, mask); - } - async chmodPromise(p, mask) { - return await new Promise((resolve, reject) => { - this.realFs.chmod(npath.fromPortablePath(p), mask, this.makeCallback(resolve, reject)); - }); - } - chmodSync(p, mask) { - return this.realFs.chmodSync(npath.fromPortablePath(p), mask); - } - async fchownPromise(fd, uid, gid) { - return await new Promise((resolve, reject) => { - this.realFs.fchown(fd, uid, gid, this.makeCallback(resolve, reject)); - }); - } - fchownSync(fd, uid, gid) { - return this.realFs.fchownSync(fd, uid, gid); - } - async chownPromise(p, uid, gid) { - return await new Promise((resolve, reject) => { - this.realFs.chown(npath.fromPortablePath(p), uid, gid, this.makeCallback(resolve, reject)); - }); - } - chownSync(p, uid, gid) { - return this.realFs.chownSync(npath.fromPortablePath(p), uid, gid); - } - async renamePromise(oldP, newP) { - return await new Promise((resolve, reject) => { - this.realFs.rename(npath.fromPortablePath(oldP), npath.fromPortablePath(newP), this.makeCallback(resolve, reject)); - }); - } - renameSync(oldP, newP) { - return this.realFs.renameSync(npath.fromPortablePath(oldP), npath.fromPortablePath(newP)); - } - async copyFilePromise(sourceP, destP, flags = 0) { - return await new Promise((resolve, reject) => { - this.realFs.copyFile(npath.fromPortablePath(sourceP), npath.fromPortablePath(destP), flags, this.makeCallback(resolve, reject)); - }); - } - copyFileSync(sourceP, destP, flags = 0) { - return this.realFs.copyFileSync(npath.fromPortablePath(sourceP), npath.fromPortablePath(destP), flags); - } - async appendFilePromise(p, content, opts) { - return await new Promise((resolve, reject) => { - const fsNativePath = typeof p === `string` ? npath.fromPortablePath(p) : p; - if (opts) { - this.realFs.appendFile(fsNativePath, content, opts, this.makeCallback(resolve, reject)); - } else { - this.realFs.appendFile(fsNativePath, content, this.makeCallback(resolve, reject)); - } - }); - } - appendFileSync(p, content, opts) { - const fsNativePath = typeof p === `string` ? npath.fromPortablePath(p) : p; - if (opts) { - this.realFs.appendFileSync(fsNativePath, content, opts); - } else { - this.realFs.appendFileSync(fsNativePath, content); - } - } - async writeFilePromise(p, content, opts) { - return await new Promise((resolve, reject) => { - const fsNativePath = typeof p === `string` ? npath.fromPortablePath(p) : p; - if (opts) { - this.realFs.writeFile(fsNativePath, content, opts, this.makeCallback(resolve, reject)); - } else { - this.realFs.writeFile(fsNativePath, content, this.makeCallback(resolve, reject)); - } - }); - } - writeFileSync(p, content, opts) { - const fsNativePath = typeof p === `string` ? npath.fromPortablePath(p) : p; - if (opts) { - this.realFs.writeFileSync(fsNativePath, content, opts); - } else { - this.realFs.writeFileSync(fsNativePath, content); - } - } - async unlinkPromise(p) { - return await new Promise((resolve, reject) => { - this.realFs.unlink(npath.fromPortablePath(p), this.makeCallback(resolve, reject)); - }); - } - unlinkSync(p) { - return this.realFs.unlinkSync(npath.fromPortablePath(p)); - } - async utimesPromise(p, atime, mtime) { - return await new Promise((resolve, reject) => { - this.realFs.utimes(npath.fromPortablePath(p), atime, mtime, this.makeCallback(resolve, reject)); - }); - } - utimesSync(p, atime, mtime) { - this.realFs.utimesSync(npath.fromPortablePath(p), atime, mtime); - } - async lutimesPromiseImpl(p, atime, mtime) { - const lutimes = this.realFs.lutimes; - if (typeof lutimes === `undefined`) - throw ENOSYS(`unavailable Node binding`, `lutimes '${p}'`); - return await new Promise((resolve, reject) => { - lutimes.call(this.realFs, npath.fromPortablePath(p), atime, mtime, this.makeCallback(resolve, reject)); - }); - } - lutimesSyncImpl(p, atime, mtime) { - const lutimesSync = this.realFs.lutimesSync; - if (typeof lutimesSync === `undefined`) - throw ENOSYS(`unavailable Node binding`, `lutimes '${p}'`); - lutimesSync.call(this.realFs, npath.fromPortablePath(p), atime, mtime); - } - async mkdirPromise(p, opts) { - return await new Promise((resolve, reject) => { - this.realFs.mkdir(npath.fromPortablePath(p), opts, this.makeCallback(resolve, reject)); - }); - } - mkdirSync(p, opts) { - return this.realFs.mkdirSync(npath.fromPortablePath(p), opts); - } - async rmdirPromise(p, opts) { - return await new Promise((resolve, reject) => { - if (opts) { - this.realFs.rmdir(npath.fromPortablePath(p), opts, this.makeCallback(resolve, reject)); - } else { - this.realFs.rmdir(npath.fromPortablePath(p), this.makeCallback(resolve, reject)); - } - }); - } - rmdirSync(p, opts) { - return this.realFs.rmdirSync(npath.fromPortablePath(p), opts); - } - async linkPromise(existingP, newP) { - return await new Promise((resolve, reject) => { - this.realFs.link(npath.fromPortablePath(existingP), npath.fromPortablePath(newP), this.makeCallback(resolve, reject)); - }); - } - linkSync(existingP, newP) { - return this.realFs.linkSync(npath.fromPortablePath(existingP), npath.fromPortablePath(newP)); - } - async symlinkPromise(target, p, type) { - return await new Promise((resolve, reject) => { - this.realFs.symlink(npath.fromPortablePath(target.replace(/\/+$/, ``)), npath.fromPortablePath(p), type, this.makeCallback(resolve, reject)); - }); - } - symlinkSync(target, p, type) { - return this.realFs.symlinkSync(npath.fromPortablePath(target.replace(/\/+$/, ``)), npath.fromPortablePath(p), type); - } - async readFilePromise(p, encoding) { - return await new Promise((resolve, reject) => { - const fsNativePath = typeof p === `string` ? npath.fromPortablePath(p) : p; - this.realFs.readFile(fsNativePath, encoding, this.makeCallback(resolve, reject)); - }); - } - readFileSync(p, encoding) { - const fsNativePath = typeof p === `string` ? npath.fromPortablePath(p) : p; - return this.realFs.readFileSync(fsNativePath, encoding); - } - async readdirPromise(p, opts) { - return await new Promise((resolve, reject) => { - if (opts == null ? void 0 : opts.withFileTypes) { - this.realFs.readdir(npath.fromPortablePath(p), { withFileTypes: true }, this.makeCallback(resolve, reject)); - } else { - this.realFs.readdir(npath.fromPortablePath(p), this.makeCallback((value) => resolve(value), reject)); - } - }); - } - readdirSync(p, opts) { - if (opts == null ? void 0 : opts.withFileTypes) { - return this.realFs.readdirSync(npath.fromPortablePath(p), { withFileTypes: true }); - } else { - return this.realFs.readdirSync(npath.fromPortablePath(p)); - } - } - async readlinkPromise(p) { - return await new Promise((resolve, reject) => { - this.realFs.readlink(npath.fromPortablePath(p), this.makeCallback(resolve, reject)); - }).then((path) => { - return npath.toPortablePath(path); - }); - } - readlinkSync(p) { - return npath.toPortablePath(this.realFs.readlinkSync(npath.fromPortablePath(p))); - } - async truncatePromise(p, len) { - return await new Promise((resolve, reject) => { - this.realFs.truncate(npath.fromPortablePath(p), len, this.makeCallback(resolve, reject)); - }); - } - truncateSync(p, len) { - return this.realFs.truncateSync(npath.fromPortablePath(p), len); - } - async ftruncatePromise(fd, len) { - return await new Promise((resolve, reject) => { - this.realFs.ftruncate(fd, len, this.makeCallback(resolve, reject)); - }); - } - ftruncateSync(fd, len) { - return this.realFs.ftruncateSync(fd, len); - } - watch(p, a, b) { - return this.realFs.watch( - npath.fromPortablePath(p), - a, - b - ); - } - watchFile(p, a, b) { - return this.realFs.watchFile( - npath.fromPortablePath(p), - a, - b - ); - } - unwatchFile(p, cb) { - return this.realFs.unwatchFile(npath.fromPortablePath(p), cb); - } - makeCallback(resolve, reject) { - return (err, result) => { - if (err) { - reject(err); - } else { - resolve(result); - } - }; - } -} - -function assertStatus(current, expected) { - if (current !== expected) { - throw new Error(`Invalid StatWatcher status: expected '${expected}', got '${current}'`); - } -} -class CustomStatWatcher extends events.EventEmitter { - constructor(fakeFs, path, { bigint = false } = {}) { - super(); - this.status = "ready" /* Ready */; - this.changeListeners = /* @__PURE__ */ new Map(); - this.startTimeout = null; - this.fakeFs = fakeFs; - this.path = path; - this.bigint = bigint; - this.lastStats = this.stat(); - } - static create(fakeFs, path, opts) { - const statWatcher = new CustomStatWatcher(fakeFs, path, opts); - statWatcher.start(); - return statWatcher; - } - start() { - assertStatus(this.status, "ready" /* Ready */); - this.status = "running" /* Running */; - this.startTimeout = setTimeout(() => { - this.startTimeout = null; - if (!this.fakeFs.existsSync(this.path)) { - this.emit("change" /* Change */, this.lastStats, this.lastStats); - } - }, 3); - } - stop() { - assertStatus(this.status, "running" /* Running */); - this.status = "stopped" /* Stopped */; - if (this.startTimeout !== null) { - clearTimeout(this.startTimeout); - this.startTimeout = null; - } - this.emit("stop" /* Stop */); - } - stat() { - try { - return this.fakeFs.statSync(this.path, { bigint: this.bigint }); - } catch (error) { - const statInstance = this.bigint ? new BigIntStatsEntry() : new StatEntry(); - return clearStats(statInstance); - } - } - makeInterval(opts) { - const interval = setInterval(() => { - const currentStats = this.stat(); - const previousStats = this.lastStats; - if (areStatsEqual(currentStats, previousStats)) - return; - this.lastStats = currentStats; - this.emit("change" /* Change */, currentStats, previousStats); - }, opts.interval); - return opts.persistent ? interval : interval.unref(); - } - registerChangeListener(listener, opts) { - this.addListener("change" /* Change */, listener); - this.changeListeners.set(listener, this.makeInterval(opts)); - } - unregisterChangeListener(listener) { - this.removeListener("change" /* Change */, listener); - const interval = this.changeListeners.get(listener); - if (typeof interval !== `undefined`) - clearInterval(interval); - this.changeListeners.delete(listener); - } - unregisterAllChangeListeners() { - for (const listener of this.changeListeners.keys()) { - this.unregisterChangeListener(listener); - } - } - hasChangeListeners() { - return this.changeListeners.size > 0; - } - ref() { - for (const interval of this.changeListeners.values()) - interval.ref(); - return this; - } - unref() { - for (const interval of this.changeListeners.values()) - interval.unref(); - return this; - } -} - -const statWatchersByFakeFS = /* @__PURE__ */ new WeakMap(); -function watchFile(fakeFs, path, a, b) { - let bigint; - let persistent; - let interval; - let listener; - switch (typeof a) { - case `function`: - { - bigint = false; - persistent = true; - interval = 5007; - listener = a; - } - break; - default: - { - ({ - bigint = false, - persistent = true, - interval = 5007 - } = a); - listener = b; - } - break; - } - let statWatchers = statWatchersByFakeFS.get(fakeFs); - if (typeof statWatchers === `undefined`) - statWatchersByFakeFS.set(fakeFs, statWatchers = /* @__PURE__ */ new Map()); - let statWatcher = statWatchers.get(path); - if (typeof statWatcher === `undefined`) { - statWatcher = CustomStatWatcher.create(fakeFs, path, { bigint }); - statWatchers.set(path, statWatcher); - } - statWatcher.registerChangeListener(listener, { persistent, interval }); - return statWatcher; -} -function unwatchFile(fakeFs, path, cb) { - const statWatchers = statWatchersByFakeFS.get(fakeFs); - if (typeof statWatchers === `undefined`) - return; - const statWatcher = statWatchers.get(path); - if (typeof statWatcher === `undefined`) - return; - if (typeof cb === `undefined`) - statWatcher.unregisterAllChangeListeners(); - else - statWatcher.unregisterChangeListener(cb); - if (!statWatcher.hasChangeListeners()) { - statWatcher.stop(); - statWatchers.delete(path); - } -} -function unwatchAllFiles(fakeFs) { - const statWatchers = statWatchersByFakeFS.get(fakeFs); - if (typeof statWatchers === `undefined`) - return; - for (const path of statWatchers.keys()) { - unwatchFile(fakeFs, path); - } -} - -const DEFAULT_COMPRESSION_LEVEL = `mixed`; -function toUnixTimestamp(time) { - if (typeof time === `string` && String(+time) === time) - return +time; - if (Number.isFinite(time)) { - if (time < 0) { - return Date.now() / 1e3; - } else { - return time; - } - } - if (nodeUtils.types.isDate(time)) - return time.getTime() / 1e3; - throw new Error(`Invalid time`); -} -function makeEmptyArchive() { - return Buffer.from([ - 80, - 75, - 5, - 6, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ]); -} -class ZipFS extends BasePortableFakeFS { - constructor(source, opts) { - super(); - this.lzSource = null; - this.listings = /* @__PURE__ */ new Map(); - this.entries = /* @__PURE__ */ new Map(); - this.fileSources = /* @__PURE__ */ new Map(); - this.fds = /* @__PURE__ */ new Map(); - this.nextFd = 0; - this.ready = false; - this.readOnly = false; - this.libzip = opts.libzip; - const pathOptions = opts; - this.level = typeof pathOptions.level !== `undefined` ? pathOptions.level : DEFAULT_COMPRESSION_LEVEL; - source != null ? source : source = makeEmptyArchive(); - if (typeof source === `string`) { - const { baseFs = new NodeFS() } = pathOptions; - this.baseFs = baseFs; - this.path = source; - } else { - this.path = null; - this.baseFs = null; - } - if (opts.stats) { - this.stats = opts.stats; - } else { - if (typeof source === `string`) { - try { - this.stats = this.baseFs.statSync(source); - } catch (error) { - if (error.code === `ENOENT` && pathOptions.create) { - this.stats = makeDefaultStats(); - } else { - throw error; - } - } - } else { - this.stats = makeDefaultStats(); - } - } - const errPtr = this.libzip.malloc(4); - try { - let flags = 0; - if (typeof source === `string` && pathOptions.create) - flags |= this.libzip.ZIP_CREATE | this.libzip.ZIP_TRUNCATE; - if (opts.readOnly) { - flags |= this.libzip.ZIP_RDONLY; - this.readOnly = true; - } - if (typeof source === `string`) { - this.zip = this.libzip.open(npath.fromPortablePath(source), flags, errPtr); - } else { - const lzSource = this.allocateUnattachedSource(source); - try { - this.zip = this.libzip.openFromSource(lzSource, flags, errPtr); - this.lzSource = lzSource; - } catch (error) { - this.libzip.source.free(lzSource); - throw error; - } - } - if (this.zip === 0) { - const error = this.libzip.struct.errorS(); - this.libzip.error.initWithCode(error, this.libzip.getValue(errPtr, `i32`)); - throw this.makeLibzipError(error); - } - } finally { - this.libzip.free(errPtr); - } - this.listings.set(PortablePath.root, /* @__PURE__ */ new Set()); - const entryCount = this.libzip.getNumEntries(this.zip, 0); - for (let t = 0; t < entryCount; ++t) { - const raw = this.libzip.getName(this.zip, t, 0); - if (ppath.isAbsolute(raw)) - continue; - const p = ppath.resolve(PortablePath.root, raw); - this.registerEntry(p, t); - if (raw.endsWith(`/`)) { - this.registerListing(p); - } - } - this.symlinkCount = this.libzip.ext.countSymlinks(this.zip); - if (this.symlinkCount === -1) - throw this.makeLibzipError(this.libzip.getError(this.zip)); - this.ready = true; - } - makeLibzipError(error) { - const errorCode = this.libzip.struct.errorCodeZip(error); - const strerror = this.libzip.error.strerror(error); - const libzipError = new LibzipError(strerror, this.libzip.errors[errorCode]); - if (errorCode === this.libzip.errors.ZIP_ER_CHANGED) - throw new Error(`Assertion failed: Unexpected libzip error: ${libzipError.message}`); - return libzipError; - } - getExtractHint(hints) { - for (const fileName of this.entries.keys()) { - const ext = this.pathUtils.extname(fileName); - if (hints.relevantExtensions.has(ext)) { - return true; - } - } - return false; - } - getAllFiles() { - return Array.from(this.entries.keys()); - } - getRealPath() { - if (!this.path) - throw new Error(`ZipFS don't have real paths when loaded from a buffer`); - return this.path; - } - getBufferAndClose() { - this.prepareClose(); - if (!this.lzSource) - throw new Error(`ZipFS was not created from a Buffer`); - try { - this.libzip.source.keep(this.lzSource); - if (this.libzip.close(this.zip) === -1) - throw this.makeLibzipError(this.libzip.getError(this.zip)); - if (this.libzip.source.open(this.lzSource) === -1) - throw this.makeLibzipError(this.libzip.source.error(this.lzSource)); - if (this.libzip.source.seek(this.lzSource, 0, 0, this.libzip.SEEK_END) === -1) - throw this.makeLibzipError(this.libzip.source.error(this.lzSource)); - const size = this.libzip.source.tell(this.lzSource); - if (size === -1) - throw this.makeLibzipError(this.libzip.source.error(this.lzSource)); - if (this.libzip.source.seek(this.lzSource, 0, 0, this.libzip.SEEK_SET) === -1) - throw this.makeLibzipError(this.libzip.source.error(this.lzSource)); - const buffer = this.libzip.malloc(size); - if (!buffer) - throw new Error(`Couldn't allocate enough memory`); - try { - const rc = this.libzip.source.read(this.lzSource, buffer, size); - if (rc === -1) - throw this.makeLibzipError(this.libzip.source.error(this.lzSource)); - else if (rc < size) - throw new Error(`Incomplete read`); - else if (rc > size) - throw new Error(`Overread`); - const memory = this.libzip.HEAPU8.subarray(buffer, buffer + size); - return Buffer.from(memory); - } finally { - this.libzip.free(buffer); - } - } finally { - this.libzip.source.close(this.lzSource); - this.libzip.source.free(this.lzSource); - this.ready = false; - } - } - prepareClose() { - if (!this.ready) - throw EBUSY(`archive closed, close`); - unwatchAllFiles(this); - } - saveAndClose() { - if (!this.path || !this.baseFs) - throw new Error(`ZipFS cannot be saved and must be discarded when loaded from a buffer`); - this.prepareClose(); - if (this.readOnly) { - this.discardAndClose(); - return; - } - const newMode = this.baseFs.existsSync(this.path) || this.stats.mode === DEFAULT_MODE ? void 0 : this.stats.mode; - if (this.entries.size === 0) { - this.discardAndClose(); - this.baseFs.writeFileSync(this.path, makeEmptyArchive(), { mode: newMode }); - } else { - const rc = this.libzip.close(this.zip); - if (rc === -1) - throw this.makeLibzipError(this.libzip.getError(this.zip)); - if (typeof newMode !== `undefined`) { - this.baseFs.chmodSync(this.path, newMode); - } - } - this.ready = false; - } - discardAndClose() { - this.prepareClose(); - this.libzip.discard(this.zip); - this.ready = false; - } - resolve(p) { - return ppath.resolve(PortablePath.root, p); - } - async openPromise(p, flags, mode) { - return this.openSync(p, flags, mode); - } - openSync(p, flags, mode) { - const fd = this.nextFd++; - this.fds.set(fd, { cursor: 0, p }); - return fd; - } - hasOpenFileHandles() { - return !!this.fds.size; - } - async opendirPromise(p, opts) { - return this.opendirSync(p, opts); - } - opendirSync(p, opts = {}) { - const resolvedP = this.resolveFilename(`opendir '${p}'`, p); - if (!this.entries.has(resolvedP) && !this.listings.has(resolvedP)) - throw ENOENT(`opendir '${p}'`); - const directoryListing = this.listings.get(resolvedP); - if (!directoryListing) - throw ENOTDIR(`opendir '${p}'`); - const entries = [...directoryListing]; - const fd = this.openSync(resolvedP, `r`); - const onClose = () => { - this.closeSync(fd); - }; - return opendir(this, resolvedP, entries, { onClose }); - } - async readPromise(fd, buffer, offset, length, position) { - return this.readSync(fd, buffer, offset, length, position); - } - readSync(fd, buffer, offset = 0, length = buffer.byteLength, position = -1) { - const entry = this.fds.get(fd); - if (typeof entry === `undefined`) - throw EBADF(`read`); - const realPosition = position === -1 || position === null ? entry.cursor : position; - const source = this.readFileSync(entry.p); - source.copy(buffer, offset, realPosition, realPosition + length); - const bytesRead = Math.max(0, Math.min(source.length - realPosition, length)); - if (position === -1 || position === null) - entry.cursor += bytesRead; - return bytesRead; - } - async writePromise(fd, buffer, offset, length, position) { - if (typeof buffer === `string`) { - return this.writeSync(fd, buffer, position); - } else { - return this.writeSync(fd, buffer, offset, length, position); - } - } - writeSync(fd, buffer, offset, length, position) { - const entry = this.fds.get(fd); - if (typeof entry === `undefined`) - throw EBADF(`read`); - throw new Error(`Unimplemented`); - } - async closePromise(fd) { - return this.closeSync(fd); - } - closeSync(fd) { - const entry = this.fds.get(fd); - if (typeof entry === `undefined`) - throw EBADF(`read`); - this.fds.delete(fd); - } - createReadStream(p, { encoding } = {}) { - if (p === null) - throw new Error(`Unimplemented`); - const fd = this.openSync(p, `r`); - const stream$1 = Object.assign( - new stream.PassThrough({ - emitClose: true, - autoDestroy: true, - destroy: (error, callback) => { - clearImmediate(immediate); - this.closeSync(fd); - callback(error); - } - }), - { - close() { - stream$1.destroy(); - }, - bytesRead: 0, - path: p - } - ); - const immediate = setImmediate(async () => { - try { - const data = await this.readFilePromise(p, encoding); - stream$1.bytesRead = data.length; - stream$1.end(data); - } catch (error) { - stream$1.destroy(error); - } - }); - return stream$1; - } - createWriteStream(p, { encoding } = {}) { - if (this.readOnly) - throw EROFS(`open '${p}'`); - if (p === null) - throw new Error(`Unimplemented`); - const chunks = []; - const fd = this.openSync(p, `w`); - const stream$1 = Object.assign( - new stream.PassThrough({ - autoDestroy: true, - emitClose: true, - destroy: (error, callback) => { - try { - if (error) { - callback(error); - } else { - this.writeFileSync(p, Buffer.concat(chunks), encoding); - callback(null); - } - } catch (err) { - callback(err); - } finally { - this.closeSync(fd); - } - } - }), - { - bytesWritten: 0, - path: p, - close() { - stream$1.destroy(); - } - } - ); - stream$1.on(`data`, (chunk) => { - const chunkBuffer = Buffer.from(chunk); - stream$1.bytesWritten += chunkBuffer.length; - chunks.push(chunkBuffer); - }); - return stream$1; - } - async realpathPromise(p) { - return this.realpathSync(p); - } - realpathSync(p) { - const resolvedP = this.resolveFilename(`lstat '${p}'`, p); - if (!this.entries.has(resolvedP) && !this.listings.has(resolvedP)) - throw ENOENT(`lstat '${p}'`); - return resolvedP; - } - async existsPromise(p) { - return this.existsSync(p); - } - existsSync(p) { - if (!this.ready) - throw EBUSY(`archive closed, existsSync '${p}'`); - if (this.symlinkCount === 0) { - const resolvedP2 = ppath.resolve(PortablePath.root, p); - return this.entries.has(resolvedP2) || this.listings.has(resolvedP2); - } - let resolvedP; - try { - resolvedP = this.resolveFilename(`stat '${p}'`, p, void 0, false); - } catch (error) { - return false; - } - if (resolvedP === void 0) - return false; - return this.entries.has(resolvedP) || this.listings.has(resolvedP); - } - async accessPromise(p, mode) { - return this.accessSync(p, mode); - } - accessSync(p, mode = fs.constants.F_OK) { - const resolvedP = this.resolveFilename(`access '${p}'`, p); - if (!this.entries.has(resolvedP) && !this.listings.has(resolvedP)) - throw ENOENT(`access '${p}'`); - if (this.readOnly && mode & fs.constants.W_OK) { - throw EROFS(`access '${p}'`); - } - } - async statPromise(p, opts = { bigint: false }) { - if (opts.bigint) - return this.statSync(p, { bigint: true }); - return this.statSync(p); - } - statSync(p, opts = { bigint: false, throwIfNoEntry: true }) { - const resolvedP = this.resolveFilename(`stat '${p}'`, p, void 0, opts.throwIfNoEntry); - if (resolvedP === void 0) - return void 0; - if (!this.entries.has(resolvedP) && !this.listings.has(resolvedP)) { - if (opts.throwIfNoEntry === false) - return void 0; - throw ENOENT(`stat '${p}'`); - } - if (p[p.length - 1] === `/` && !this.listings.has(resolvedP)) - throw ENOTDIR(`stat '${p}'`); - return this.statImpl(`stat '${p}'`, resolvedP, opts); - } - async fstatPromise(fd, opts) { - return this.fstatSync(fd, opts); - } - fstatSync(fd, opts) { - const entry = this.fds.get(fd); - if (typeof entry === `undefined`) - throw EBADF(`fstatSync`); - const { p } = entry; - const resolvedP = this.resolveFilename(`stat '${p}'`, p); - if (!this.entries.has(resolvedP) && !this.listings.has(resolvedP)) - throw ENOENT(`stat '${p}'`); - if (p[p.length - 1] === `/` && !this.listings.has(resolvedP)) - throw ENOTDIR(`stat '${p}'`); - return this.statImpl(`fstat '${p}'`, resolvedP, opts); - } - async lstatPromise(p, opts = { bigint: false }) { - if (opts.bigint) - return this.lstatSync(p, { bigint: true }); - return this.lstatSync(p); - } - lstatSync(p, opts = { bigint: false, throwIfNoEntry: true }) { - const resolvedP = this.resolveFilename(`lstat '${p}'`, p, false, opts.throwIfNoEntry); - if (resolvedP === void 0) - return void 0; - if (!this.entries.has(resolvedP) && !this.listings.has(resolvedP)) { - if (opts.throwIfNoEntry === false) - return void 0; - throw ENOENT(`lstat '${p}'`); - } - if (p[p.length - 1] === `/` && !this.listings.has(resolvedP)) - throw ENOTDIR(`lstat '${p}'`); - return this.statImpl(`lstat '${p}'`, resolvedP, opts); - } - statImpl(reason, p, opts = {}) { - const entry = this.entries.get(p); - if (typeof entry !== `undefined`) { - const stat = this.libzip.struct.statS(); - const rc = this.libzip.statIndex(this.zip, entry, 0, 0, stat); - if (rc === -1) - throw this.makeLibzipError(this.libzip.getError(this.zip)); - const uid = this.stats.uid; - const gid = this.stats.gid; - const size = this.libzip.struct.statSize(stat) >>> 0; - const blksize = 512; - const blocks = Math.ceil(size / blksize); - const mtimeMs = (this.libzip.struct.statMtime(stat) >>> 0) * 1e3; - const atimeMs = mtimeMs; - const birthtimeMs = mtimeMs; - const ctimeMs = mtimeMs; - const atime = new Date(atimeMs); - const birthtime = new Date(birthtimeMs); - const ctime = new Date(ctimeMs); - const mtime = new Date(mtimeMs); - const type = this.listings.has(p) ? S_IFDIR : this.isSymbolicLink(entry) ? S_IFLNK : S_IFREG; - const defaultMode = type === S_IFDIR ? 493 : 420; - const mode = type | this.getUnixMode(entry, defaultMode) & 511; - const crc = this.libzip.struct.statCrc(stat); - const statInstance = Object.assign(new StatEntry(), { uid, gid, size, blksize, blocks, atime, birthtime, ctime, mtime, atimeMs, birthtimeMs, ctimeMs, mtimeMs, mode, crc }); - return opts.bigint === true ? convertToBigIntStats(statInstance) : statInstance; - } - if (this.listings.has(p)) { - const uid = this.stats.uid; - const gid = this.stats.gid; - const size = 0; - const blksize = 512; - const blocks = 0; - const atimeMs = this.stats.mtimeMs; - const birthtimeMs = this.stats.mtimeMs; - const ctimeMs = this.stats.mtimeMs; - const mtimeMs = this.stats.mtimeMs; - const atime = new Date(atimeMs); - const birthtime = new Date(birthtimeMs); - const ctime = new Date(ctimeMs); - const mtime = new Date(mtimeMs); - const mode = S_IFDIR | 493; - const crc = 0; - const statInstance = Object.assign(new StatEntry(), { uid, gid, size, blksize, blocks, atime, birthtime, ctime, mtime, atimeMs, birthtimeMs, ctimeMs, mtimeMs, mode, crc }); - return opts.bigint === true ? convertToBigIntStats(statInstance) : statInstance; - } - throw new Error(`Unreachable`); - } - getUnixMode(index, defaultMode) { - const rc = this.libzip.file.getExternalAttributes(this.zip, index, 0, 0, this.libzip.uint08S, this.libzip.uint32S); - if (rc === -1) - throw this.makeLibzipError(this.libzip.getError(this.zip)); - const opsys = this.libzip.getValue(this.libzip.uint08S, `i8`) >>> 0; - if (opsys !== this.libzip.ZIP_OPSYS_UNIX) - return defaultMode; - return this.libzip.getValue(this.libzip.uint32S, `i32`) >>> 16; - } - registerListing(p) { - const existingListing = this.listings.get(p); - if (existingListing) - return existingListing; - const parentListing = this.registerListing(ppath.dirname(p)); - parentListing.add(ppath.basename(p)); - const newListing = /* @__PURE__ */ new Set(); - this.listings.set(p, newListing); - return newListing; - } - registerEntry(p, index) { - const parentListing = this.registerListing(ppath.dirname(p)); - parentListing.add(ppath.basename(p)); - this.entries.set(p, index); - } - unregisterListing(p) { - this.listings.delete(p); - const parentListing = this.listings.get(ppath.dirname(p)); - parentListing == null ? void 0 : parentListing.delete(ppath.basename(p)); - } - unregisterEntry(p) { - this.unregisterListing(p); - const entry = this.entries.get(p); - this.entries.delete(p); - if (typeof entry === `undefined`) - return; - this.fileSources.delete(entry); - if (this.isSymbolicLink(entry)) { - this.symlinkCount--; - } - } - deleteEntry(p, index) { - this.unregisterEntry(p); - const rc = this.libzip.delete(this.zip, index); - if (rc === -1) { - throw this.makeLibzipError(this.libzip.getError(this.zip)); - } - } - resolveFilename(reason, p, resolveLastComponent = true, throwIfNoEntry = true) { - if (!this.ready) - throw EBUSY(`archive closed, ${reason}`); - let resolvedP = ppath.resolve(PortablePath.root, p); - if (resolvedP === `/`) - return PortablePath.root; - const fileIndex = this.entries.get(resolvedP); - if (resolveLastComponent && fileIndex !== void 0) { - if (this.symlinkCount !== 0 && this.isSymbolicLink(fileIndex)) { - const target = this.getFileSource(fileIndex).toString(); - return this.resolveFilename(reason, ppath.resolve(ppath.dirname(resolvedP), target), true, throwIfNoEntry); - } else { - return resolvedP; - } - } - while (true) { - const parentP = this.resolveFilename(reason, ppath.dirname(resolvedP), true, throwIfNoEntry); - if (parentP === void 0) - return parentP; - const isDir = this.listings.has(parentP); - const doesExist = this.entries.has(parentP); - if (!isDir && !doesExist) { - if (throwIfNoEntry === false) - return void 0; - throw ENOENT(reason); - } - if (!isDir) - throw ENOTDIR(reason); - resolvedP = ppath.resolve(parentP, ppath.basename(resolvedP)); - if (!resolveLastComponent || this.symlinkCount === 0) - break; - const index = this.libzip.name.locate(this.zip, resolvedP.slice(1)); - if (index === -1) - break; - if (this.isSymbolicLink(index)) { - const target = this.getFileSource(index).toString(); - resolvedP = ppath.resolve(ppath.dirname(resolvedP), target); - } else { - break; - } - } - return resolvedP; - } - allocateBuffer(content) { - if (!Buffer.isBuffer(content)) - content = Buffer.from(content); - const buffer = this.libzip.malloc(content.byteLength); - if (!buffer) - throw new Error(`Couldn't allocate enough memory`); - const heap = new Uint8Array(this.libzip.HEAPU8.buffer, buffer, content.byteLength); - heap.set(content); - return { buffer, byteLength: content.byteLength }; - } - allocateUnattachedSource(content) { - const error = this.libzip.struct.errorS(); - const { buffer, byteLength } = this.allocateBuffer(content); - const source = this.libzip.source.fromUnattachedBuffer(buffer, byteLength, 0, true, error); - if (source === 0) { - this.libzip.free(error); - throw this.makeLibzipError(error); - } - return source; - } - allocateSource(content) { - const { buffer, byteLength } = this.allocateBuffer(content); - const source = this.libzip.source.fromBuffer(this.zip, buffer, byteLength, 0, true); - if (source === 0) { - this.libzip.free(buffer); - throw this.makeLibzipError(this.libzip.getError(this.zip)); - } - return source; - } - setFileSource(p, content) { - const buffer = Buffer.isBuffer(content) ? content : Buffer.from(content); - const target = ppath.relative(PortablePath.root, p); - const lzSource = this.allocateSource(content); - try { - const newIndex = this.libzip.file.add(this.zip, target, lzSource, this.libzip.ZIP_FL_OVERWRITE); - if (newIndex === -1) - throw this.makeLibzipError(this.libzip.getError(this.zip)); - if (this.level !== `mixed`) { - const method = this.level === 0 ? this.libzip.ZIP_CM_STORE : this.libzip.ZIP_CM_DEFLATE; - const rc = this.libzip.file.setCompression(this.zip, newIndex, 0, method, this.level); - if (rc === -1) { - throw this.makeLibzipError(this.libzip.getError(this.zip)); - } - } - this.fileSources.set(newIndex, buffer); - return newIndex; - } catch (error) { - this.libzip.source.free(lzSource); - throw error; - } - } - isSymbolicLink(index) { - if (this.symlinkCount === 0) - return false; - const attrs = this.libzip.file.getExternalAttributes(this.zip, index, 0, 0, this.libzip.uint08S, this.libzip.uint32S); - if (attrs === -1) - throw this.makeLibzipError(this.libzip.getError(this.zip)); - const opsys = this.libzip.getValue(this.libzip.uint08S, `i8`) >>> 0; - if (opsys !== this.libzip.ZIP_OPSYS_UNIX) - return false; - const attributes = this.libzip.getValue(this.libzip.uint32S, `i32`) >>> 16; - return (attributes & S_IFMT) === S_IFLNK; - } - getFileSource(index, opts = { asyncDecompress: false }) { - const cachedFileSource = this.fileSources.get(index); - if (typeof cachedFileSource !== `undefined`) - return cachedFileSource; - const stat = this.libzip.struct.statS(); - const rc = this.libzip.statIndex(this.zip, index, 0, 0, stat); - if (rc === -1) - throw this.makeLibzipError(this.libzip.getError(this.zip)); - const size = this.libzip.struct.statCompSize(stat); - const compressionMethod = this.libzip.struct.statCompMethod(stat); - const buffer = this.libzip.malloc(size); - try { - const file = this.libzip.fopenIndex(this.zip, index, 0, this.libzip.ZIP_FL_COMPRESSED); - if (file === 0) - throw this.makeLibzipError(this.libzip.getError(this.zip)); - try { - const rc2 = this.libzip.fread(file, buffer, size, 0); - if (rc2 === -1) - throw this.makeLibzipError(this.libzip.file.getError(file)); - else if (rc2 < size) - throw new Error(`Incomplete read`); - else if (rc2 > size) - throw new Error(`Overread`); - const memory = this.libzip.HEAPU8.subarray(buffer, buffer + size); - const data = Buffer.from(memory); - if (compressionMethod === 0) { - this.fileSources.set(index, data); - return data; - } else if (opts.asyncDecompress) { - return new Promise((resolve, reject) => { - zlib__default.default.inflateRaw(data, (error, result) => { - if (error) { - reject(error); - } else { - this.fileSources.set(index, result); - resolve(result); - } - }); - }); - } else { - const decompressedData = zlib__default.default.inflateRawSync(data); - this.fileSources.set(index, decompressedData); - return decompressedData; - } - } finally { - this.libzip.fclose(file); - } - } finally { - this.libzip.free(buffer); - } - } - async fchmodPromise(fd, mask) { - return this.chmodPromise(this.fdToPath(fd, `fchmod`), mask); - } - fchmodSync(fd, mask) { - return this.chmodSync(this.fdToPath(fd, `fchmodSync`), mask); - } - async chmodPromise(p, mask) { - return this.chmodSync(p, mask); - } - chmodSync(p, mask) { - if (this.readOnly) - throw EROFS(`chmod '${p}'`); - mask &= 493; - const resolvedP = this.resolveFilename(`chmod '${p}'`, p, false); - const entry = this.entries.get(resolvedP); - if (typeof entry === `undefined`) - throw new Error(`Assertion failed: The entry should have been registered (${resolvedP})`); - const oldMod = this.getUnixMode(entry, S_IFREG | 0); - const newMod = oldMod & ~511 | mask; - const rc = this.libzip.file.setExternalAttributes(this.zip, entry, 0, 0, this.libzip.ZIP_OPSYS_UNIX, newMod << 16); - if (rc === -1) { - throw this.makeLibzipError(this.libzip.getError(this.zip)); - } - } - async fchownPromise(fd, uid, gid) { - return this.chownPromise(this.fdToPath(fd, `fchown`), uid, gid); - } - fchownSync(fd, uid, gid) { - return this.chownSync(this.fdToPath(fd, `fchownSync`), uid, gid); - } - async chownPromise(p, uid, gid) { - return this.chownSync(p, uid, gid); - } - chownSync(p, uid, gid) { - throw new Error(`Unimplemented`); - } - async renamePromise(oldP, newP) { - return this.renameSync(oldP, newP); - } - renameSync(oldP, newP) { - throw new Error(`Unimplemented`); - } - async copyFilePromise(sourceP, destP, flags) { - const { indexSource, indexDest, resolvedDestP } = this.prepareCopyFile(sourceP, destP, flags); - const source = await this.getFileSource(indexSource, { asyncDecompress: true }); - const newIndex = this.setFileSource(resolvedDestP, source); - if (newIndex !== indexDest) { - this.registerEntry(resolvedDestP, newIndex); - } - } - copyFileSync(sourceP, destP, flags = 0) { - const { indexSource, indexDest, resolvedDestP } = this.prepareCopyFile(sourceP, destP, flags); - const source = this.getFileSource(indexSource); - const newIndex = this.setFileSource(resolvedDestP, source); - if (newIndex !== indexDest) { - this.registerEntry(resolvedDestP, newIndex); - } - } - prepareCopyFile(sourceP, destP, flags = 0) { - if (this.readOnly) - throw EROFS(`copyfile '${sourceP} -> '${destP}'`); - if ((flags & fs.constants.COPYFILE_FICLONE_FORCE) !== 0) - throw ENOSYS(`unsupported clone operation`, `copyfile '${sourceP}' -> ${destP}'`); - const resolvedSourceP = this.resolveFilename(`copyfile '${sourceP} -> ${destP}'`, sourceP); - const indexSource = this.entries.get(resolvedSourceP); - if (typeof indexSource === `undefined`) - throw EINVAL(`copyfile '${sourceP}' -> '${destP}'`); - const resolvedDestP = this.resolveFilename(`copyfile '${sourceP}' -> ${destP}'`, destP); - const indexDest = this.entries.get(resolvedDestP); - if ((flags & (fs.constants.COPYFILE_EXCL | fs.constants.COPYFILE_FICLONE_FORCE)) !== 0 && typeof indexDest !== `undefined`) - throw EEXIST(`copyfile '${sourceP}' -> '${destP}'`); - return { - indexSource, - resolvedDestP, - indexDest - }; - } - async appendFilePromise(p, content, opts) { - if (this.readOnly) - throw EROFS(`open '${p}'`); - if (typeof opts === `undefined`) - opts = { flag: `a` }; - else if (typeof opts === `string`) - opts = { flag: `a`, encoding: opts }; - else if (typeof opts.flag === `undefined`) - opts = { flag: `a`, ...opts }; - return this.writeFilePromise(p, content, opts); - } - appendFileSync(p, content, opts = {}) { - if (this.readOnly) - throw EROFS(`open '${p}'`); - if (typeof opts === `undefined`) - opts = { flag: `a` }; - else if (typeof opts === `string`) - opts = { flag: `a`, encoding: opts }; - else if (typeof opts.flag === `undefined`) - opts = { flag: `a`, ...opts }; - return this.writeFileSync(p, content, opts); - } - fdToPath(fd, reason) { - var _a; - const path = (_a = this.fds.get(fd)) == null ? void 0 : _a.p; - if (typeof path === `undefined`) - throw EBADF(reason); - return path; - } - async writeFilePromise(p, content, opts) { - const { encoding, mode, index, resolvedP } = this.prepareWriteFile(p, opts); - if (index !== void 0 && typeof opts === `object` && opts.flag && opts.flag.includes(`a`)) - content = Buffer.concat([await this.getFileSource(index, { asyncDecompress: true }), Buffer.from(content)]); - if (encoding !== null) - content = content.toString(encoding); - const newIndex = this.setFileSource(resolvedP, content); - if (newIndex !== index) - this.registerEntry(resolvedP, newIndex); - if (mode !== null) { - await this.chmodPromise(resolvedP, mode); - } - } - writeFileSync(p, content, opts) { - const { encoding, mode, index, resolvedP } = this.prepareWriteFile(p, opts); - if (index !== void 0 && typeof opts === `object` && opts.flag && opts.flag.includes(`a`)) - content = Buffer.concat([this.getFileSource(index), Buffer.from(content)]); - if (encoding !== null) - content = content.toString(encoding); - const newIndex = this.setFileSource(resolvedP, content); - if (newIndex !== index) - this.registerEntry(resolvedP, newIndex); - if (mode !== null) { - this.chmodSync(resolvedP, mode); - } - } - prepareWriteFile(p, opts) { - if (typeof p === `number`) - p = this.fdToPath(p, `read`); - if (this.readOnly) - throw EROFS(`open '${p}'`); - const resolvedP = this.resolveFilename(`open '${p}'`, p); - if (this.listings.has(resolvedP)) - throw EISDIR(`open '${p}'`); - let encoding = null, mode = null; - if (typeof opts === `string`) { - encoding = opts; - } else if (typeof opts === `object`) { - ({ - encoding = null, - mode = null - } = opts); - } - const index = this.entries.get(resolvedP); - return { - encoding, - mode, - resolvedP, - index - }; - } - async unlinkPromise(p) { - return this.unlinkSync(p); - } - unlinkSync(p) { - if (this.readOnly) - throw EROFS(`unlink '${p}'`); - const resolvedP = this.resolveFilename(`unlink '${p}'`, p); - if (this.listings.has(resolvedP)) - throw EISDIR(`unlink '${p}'`); - const index = this.entries.get(resolvedP); - if (typeof index === `undefined`) - throw EINVAL(`unlink '${p}'`); - this.deleteEntry(resolvedP, index); - } - async utimesPromise(p, atime, mtime) { - return this.utimesSync(p, atime, mtime); - } - utimesSync(p, atime, mtime) { - if (this.readOnly) - throw EROFS(`utimes '${p}'`); - const resolvedP = this.resolveFilename(`utimes '${p}'`, p); - this.utimesImpl(resolvedP, mtime); - } - async lutimesPromise(p, atime, mtime) { - return this.lutimesSync(p, atime, mtime); - } - lutimesSync(p, atime, mtime) { - if (this.readOnly) - throw EROFS(`lutimes '${p}'`); - const resolvedP = this.resolveFilename(`utimes '${p}'`, p, false); - this.utimesImpl(resolvedP, mtime); - } - utimesImpl(resolvedP, mtime) { - if (this.listings.has(resolvedP)) { - if (!this.entries.has(resolvedP)) - this.hydrateDirectory(resolvedP); - } - const entry = this.entries.get(resolvedP); - if (entry === void 0) - throw new Error(`Unreachable`); - const rc = this.libzip.file.setMtime(this.zip, entry, 0, toUnixTimestamp(mtime), 0); - if (rc === -1) { - throw this.makeLibzipError(this.libzip.getError(this.zip)); - } - } - async mkdirPromise(p, opts) { - return this.mkdirSync(p, opts); - } - mkdirSync(p, { mode = 493, recursive = false } = {}) { - if (recursive) - return this.mkdirpSync(p, { chmod: mode }); - if (this.readOnly) - throw EROFS(`mkdir '${p}'`); - const resolvedP = this.resolveFilename(`mkdir '${p}'`, p); - if (this.entries.has(resolvedP) || this.listings.has(resolvedP)) - throw EEXIST(`mkdir '${p}'`); - this.hydrateDirectory(resolvedP); - this.chmodSync(resolvedP, mode); - return void 0; - } - async rmdirPromise(p, opts) { - return this.rmdirSync(p, opts); - } - rmdirSync(p, { recursive = false } = {}) { - if (this.readOnly) - throw EROFS(`rmdir '${p}'`); - if (recursive) { - this.removeSync(p); - return; - } - const resolvedP = this.resolveFilename(`rmdir '${p}'`, p); - const directoryListing = this.listings.get(resolvedP); - if (!directoryListing) - throw ENOTDIR(`rmdir '${p}'`); - if (directoryListing.size > 0) - throw ENOTEMPTY(`rmdir '${p}'`); - const index = this.entries.get(resolvedP); - if (typeof index === `undefined`) - throw EINVAL(`rmdir '${p}'`); - this.deleteEntry(p, index); - } - hydrateDirectory(resolvedP) { - const index = this.libzip.dir.add(this.zip, ppath.relative(PortablePath.root, resolvedP)); - if (index === -1) - throw this.makeLibzipError(this.libzip.getError(this.zip)); - this.registerListing(resolvedP); - this.registerEntry(resolvedP, index); - return index; - } - async linkPromise(existingP, newP) { - return this.linkSync(existingP, newP); - } - linkSync(existingP, newP) { - throw EOPNOTSUPP(`link '${existingP}' -> '${newP}'`); - } - async symlinkPromise(target, p) { - return this.symlinkSync(target, p); - } - symlinkSync(target, p) { - if (this.readOnly) - throw EROFS(`symlink '${target}' -> '${p}'`); - const resolvedP = this.resolveFilename(`symlink '${target}' -> '${p}'`, p); - if (this.listings.has(resolvedP)) - throw EISDIR(`symlink '${target}' -> '${p}'`); - if (this.entries.has(resolvedP)) - throw EEXIST(`symlink '${target}' -> '${p}'`); - const index = this.setFileSource(resolvedP, target); - this.registerEntry(resolvedP, index); - const rc = this.libzip.file.setExternalAttributes(this.zip, index, 0, 0, this.libzip.ZIP_OPSYS_UNIX, (S_IFLNK | 511) << 16); - if (rc === -1) - throw this.makeLibzipError(this.libzip.getError(this.zip)); - this.symlinkCount += 1; - } - async readFilePromise(p, encoding) { - if (typeof encoding === `object`) - encoding = encoding ? encoding.encoding : void 0; - const data = await this.readFileBuffer(p, { asyncDecompress: true }); - return encoding ? data.toString(encoding) : data; - } - readFileSync(p, encoding) { - if (typeof encoding === `object`) - encoding = encoding ? encoding.encoding : void 0; - const data = this.readFileBuffer(p); - return encoding ? data.toString(encoding) : data; - } - readFileBuffer(p, opts = { asyncDecompress: false }) { - if (typeof p === `number`) - p = this.fdToPath(p, `read`); - const resolvedP = this.resolveFilename(`open '${p}'`, p); - if (!this.entries.has(resolvedP) && !this.listings.has(resolvedP)) - throw ENOENT(`open '${p}'`); - if (p[p.length - 1] === `/` && !this.listings.has(resolvedP)) - throw ENOTDIR(`open '${p}'`); - if (this.listings.has(resolvedP)) - throw EISDIR(`read`); - const entry = this.entries.get(resolvedP); - if (entry === void 0) - throw new Error(`Unreachable`); - return this.getFileSource(entry, opts); - } - async readdirPromise(p, opts) { - return this.readdirSync(p, opts); - } - readdirSync(p, opts) { - const resolvedP = this.resolveFilename(`scandir '${p}'`, p); - if (!this.entries.has(resolvedP) && !this.listings.has(resolvedP)) - throw ENOENT(`scandir '${p}'`); - const directoryListing = this.listings.get(resolvedP); - if (!directoryListing) - throw ENOTDIR(`scandir '${p}'`); - const entries = [...directoryListing]; - if (!(opts == null ? void 0 : opts.withFileTypes)) - return entries; - return entries.map((name) => { - return Object.assign(this.statImpl(`lstat`, ppath.join(p, name)), { - name - }); - }); - } - async readlinkPromise(p) { - const entry = this.prepareReadlink(p); - return (await this.getFileSource(entry, { asyncDecompress: true })).toString(); - } - readlinkSync(p) { - const entry = this.prepareReadlink(p); - return this.getFileSource(entry).toString(); - } - prepareReadlink(p) { - const resolvedP = this.resolveFilename(`readlink '${p}'`, p, false); - if (!this.entries.has(resolvedP) && !this.listings.has(resolvedP)) - throw ENOENT(`readlink '${p}'`); - if (p[p.length - 1] === `/` && !this.listings.has(resolvedP)) - throw ENOTDIR(`open '${p}'`); - if (this.listings.has(resolvedP)) - throw EINVAL(`readlink '${p}'`); - const entry = this.entries.get(resolvedP); - if (entry === void 0) - throw new Error(`Unreachable`); - if (!this.isSymbolicLink(entry)) - throw EINVAL(`readlink '${p}'`); - return entry; - } - async truncatePromise(p, len = 0) { - const resolvedP = this.resolveFilename(`open '${p}'`, p); - const index = this.entries.get(resolvedP); - if (typeof index === `undefined`) - throw EINVAL(`open '${p}'`); - const source = await this.getFileSource(index, { asyncDecompress: true }); - const truncated = Buffer.alloc(len, 0); - source.copy(truncated); - return await this.writeFilePromise(p, truncated); - } - truncateSync(p, len = 0) { - const resolvedP = this.resolveFilename(`open '${p}'`, p); - const index = this.entries.get(resolvedP); - if (typeof index === `undefined`) - throw EINVAL(`open '${p}'`); - const source = this.getFileSource(index); - const truncated = Buffer.alloc(len, 0); - source.copy(truncated); - return this.writeFileSync(p, truncated); - } - async ftruncatePromise(fd, len) { - return this.truncatePromise(this.fdToPath(fd, `ftruncate`), len); - } - ftruncateSync(fd, len) { - return this.truncateSync(this.fdToPath(fd, `ftruncateSync`), len); - } - watch(p, a, b) { - let persistent; - switch (typeof a) { - case `function`: - case `string`: - case `undefined`: - { - persistent = true; - } - break; - default: - { - ({ persistent = true } = a); - } - break; - } - if (!persistent) - return { on: () => { - }, close: () => { - } }; - const interval = setInterval(() => { - }, 24 * 60 * 60 * 1e3); - return { on: () => { - }, close: () => { - clearInterval(interval); - } }; - } - watchFile(p, a, b) { - const resolvedP = ppath.resolve(PortablePath.root, p); - return watchFile(this, resolvedP, a, b); - } - unwatchFile(p, cb) { - const resolvedP = ppath.resolve(PortablePath.root, p); - return unwatchFile(this, resolvedP, cb); - } -} - -class ProxiedFS extends FakeFS { - getExtractHint(hints) { - return this.baseFs.getExtractHint(hints); - } - resolve(path) { - return this.mapFromBase(this.baseFs.resolve(this.mapToBase(path))); - } - getRealPath() { - return this.mapFromBase(this.baseFs.getRealPath()); - } - async openPromise(p, flags, mode) { - return this.baseFs.openPromise(this.mapToBase(p), flags, mode); - } - openSync(p, flags, mode) { - return this.baseFs.openSync(this.mapToBase(p), flags, mode); - } - async opendirPromise(p, opts) { - return Object.assign(await this.baseFs.opendirPromise(this.mapToBase(p), opts), { path: p }); - } - opendirSync(p, opts) { - return Object.assign(this.baseFs.opendirSync(this.mapToBase(p), opts), { path: p }); - } - async readPromise(fd, buffer, offset, length, position) { - return await this.baseFs.readPromise(fd, buffer, offset, length, position); - } - readSync(fd, buffer, offset, length, position) { - return this.baseFs.readSync(fd, buffer, offset, length, position); - } - async writePromise(fd, buffer, offset, length, position) { - if (typeof buffer === `string`) { - return await this.baseFs.writePromise(fd, buffer, offset); - } else { - return await this.baseFs.writePromise(fd, buffer, offset, length, position); - } - } - writeSync(fd, buffer, offset, length, position) { - if (typeof buffer === `string`) { - return this.baseFs.writeSync(fd, buffer, offset); - } else { - return this.baseFs.writeSync(fd, buffer, offset, length, position); - } - } - async closePromise(fd) { - return this.baseFs.closePromise(fd); - } - closeSync(fd) { - this.baseFs.closeSync(fd); - } - createReadStream(p, opts) { - return this.baseFs.createReadStream(p !== null ? this.mapToBase(p) : p, opts); - } - createWriteStream(p, opts) { - return this.baseFs.createWriteStream(p !== null ? this.mapToBase(p) : p, opts); - } - async realpathPromise(p) { - return this.mapFromBase(await this.baseFs.realpathPromise(this.mapToBase(p))); - } - realpathSync(p) { - return this.mapFromBase(this.baseFs.realpathSync(this.mapToBase(p))); - } - async existsPromise(p) { - return this.baseFs.existsPromise(this.mapToBase(p)); - } - existsSync(p) { - return this.baseFs.existsSync(this.mapToBase(p)); - } - accessSync(p, mode) { - return this.baseFs.accessSync(this.mapToBase(p), mode); - } - async accessPromise(p, mode) { - return this.baseFs.accessPromise(this.mapToBase(p), mode); - } - async statPromise(p, opts) { - return this.baseFs.statPromise(this.mapToBase(p), opts); - } - statSync(p, opts) { - return this.baseFs.statSync(this.mapToBase(p), opts); - } - async fstatPromise(fd, opts) { - return this.baseFs.fstatPromise(fd, opts); - } - fstatSync(fd, opts) { - return this.baseFs.fstatSync(fd, opts); - } - lstatPromise(p, opts) { - return this.baseFs.lstatPromise(this.mapToBase(p), opts); - } - lstatSync(p, opts) { - return this.baseFs.lstatSync(this.mapToBase(p), opts); - } - async fchmodPromise(fd, mask) { - return this.baseFs.fchmodPromise(fd, mask); - } - fchmodSync(fd, mask) { - return this.baseFs.fchmodSync(fd, mask); - } - async chmodPromise(p, mask) { - return this.baseFs.chmodPromise(this.mapToBase(p), mask); - } - chmodSync(p, mask) { - return this.baseFs.chmodSync(this.mapToBase(p), mask); - } - async fchownPromise(fd, uid, gid) { - return this.baseFs.fchownPromise(fd, uid, gid); - } - fchownSync(fd, uid, gid) { - return this.baseFs.fchownSync(fd, uid, gid); - } - async chownPromise(p, uid, gid) { - return this.baseFs.chownPromise(this.mapToBase(p), uid, gid); - } - chownSync(p, uid, gid) { - return this.baseFs.chownSync(this.mapToBase(p), uid, gid); - } - async renamePromise(oldP, newP) { - return this.baseFs.renamePromise(this.mapToBase(oldP), this.mapToBase(newP)); - } - renameSync(oldP, newP) { - return this.baseFs.renameSync(this.mapToBase(oldP), this.mapToBase(newP)); - } - async copyFilePromise(sourceP, destP, flags = 0) { - return this.baseFs.copyFilePromise(this.mapToBase(sourceP), this.mapToBase(destP), flags); - } - copyFileSync(sourceP, destP, flags = 0) { - return this.baseFs.copyFileSync(this.mapToBase(sourceP), this.mapToBase(destP), flags); - } - async appendFilePromise(p, content, opts) { - return this.baseFs.appendFilePromise(this.fsMapToBase(p), content, opts); - } - appendFileSync(p, content, opts) { - return this.baseFs.appendFileSync(this.fsMapToBase(p), content, opts); - } - async writeFilePromise(p, content, opts) { - return this.baseFs.writeFilePromise(this.fsMapToBase(p), content, opts); - } - writeFileSync(p, content, opts) { - return this.baseFs.writeFileSync(this.fsMapToBase(p), content, opts); - } - async unlinkPromise(p) { - return this.baseFs.unlinkPromise(this.mapToBase(p)); - } - unlinkSync(p) { - return this.baseFs.unlinkSync(this.mapToBase(p)); - } - async utimesPromise(p, atime, mtime) { - return this.baseFs.utimesPromise(this.mapToBase(p), atime, mtime); - } - utimesSync(p, atime, mtime) { - return this.baseFs.utimesSync(this.mapToBase(p), atime, mtime); - } - async mkdirPromise(p, opts) { - return this.baseFs.mkdirPromise(this.mapToBase(p), opts); - } - mkdirSync(p, opts) { - return this.baseFs.mkdirSync(this.mapToBase(p), opts); - } - async rmdirPromise(p, opts) { - return this.baseFs.rmdirPromise(this.mapToBase(p), opts); - } - rmdirSync(p, opts) { - return this.baseFs.rmdirSync(this.mapToBase(p), opts); - } - async linkPromise(existingP, newP) { - return this.baseFs.linkPromise(this.mapToBase(existingP), this.mapToBase(newP)); - } - linkSync(existingP, newP) { - return this.baseFs.linkSync(this.mapToBase(existingP), this.mapToBase(newP)); - } - async symlinkPromise(target, p, type) { - const mappedP = this.mapToBase(p); - if (this.pathUtils.isAbsolute(target)) - return this.baseFs.symlinkPromise(this.mapToBase(target), mappedP, type); - const mappedAbsoluteTarget = this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(p), target)); - const mappedTarget = this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(mappedP), mappedAbsoluteTarget); - return this.baseFs.symlinkPromise(mappedTarget, mappedP, type); - } - symlinkSync(target, p, type) { - const mappedP = this.mapToBase(p); - if (this.pathUtils.isAbsolute(target)) - return this.baseFs.symlinkSync(this.mapToBase(target), mappedP, type); - const mappedAbsoluteTarget = this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(p), target)); - const mappedTarget = this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(mappedP), mappedAbsoluteTarget); - return this.baseFs.symlinkSync(mappedTarget, mappedP, type); - } - async readFilePromise(p, encoding) { - if (encoding === `utf8`) { - return this.baseFs.readFilePromise(this.fsMapToBase(p), encoding); - } else { - return this.baseFs.readFilePromise(this.fsMapToBase(p), encoding); - } - } - readFileSync(p, encoding) { - if (encoding === `utf8`) { - return this.baseFs.readFileSync(this.fsMapToBase(p), encoding); - } else { - return this.baseFs.readFileSync(this.fsMapToBase(p), encoding); - } - } - async readdirPromise(p, opts) { - return this.baseFs.readdirPromise(this.mapToBase(p), opts); - } - readdirSync(p, opts) { - return this.baseFs.readdirSync(this.mapToBase(p), opts); - } - async readlinkPromise(p) { - return this.mapFromBase(await this.baseFs.readlinkPromise(this.mapToBase(p))); - } - readlinkSync(p) { - return this.mapFromBase(this.baseFs.readlinkSync(this.mapToBase(p))); - } - async truncatePromise(p, len) { - return this.baseFs.truncatePromise(this.mapToBase(p), len); - } - truncateSync(p, len) { - return this.baseFs.truncateSync(this.mapToBase(p), len); - } - async ftruncatePromise(fd, len) { - return this.baseFs.ftruncatePromise(fd, len); - } - ftruncateSync(fd, len) { - return this.baseFs.ftruncateSync(fd, len); - } - watch(p, a, b) { - return this.baseFs.watch( - this.mapToBase(p), - a, - b - ); - } - watchFile(p, a, b) { - return this.baseFs.watchFile( - this.mapToBase(p), - a, - b - ); - } - unwatchFile(p, cb) { - return this.baseFs.unwatchFile(this.mapToBase(p), cb); - } - fsMapToBase(p) { - if (typeof p === `number`) { - return p; - } else { - return this.mapToBase(p); - } - } -} - -class PosixFS extends ProxiedFS { - constructor(baseFs) { - super(npath); - this.baseFs = baseFs; - } - mapFromBase(path) { - return npath.fromPortablePath(path); - } - mapToBase(path) { - return npath.toPortablePath(path); - } -} - -const NUMBER_REGEXP = /^[0-9]+$/; -const VIRTUAL_REGEXP = /^(\/(?:[^/]+\/)*?(?:\$\$virtual|__virtual__))((?:\/((?:[^/]+-)?[a-f0-9]+)(?:\/([^/]+))?)?((?:\/.*)?))$/; -const VALID_COMPONENT = /^([^/]+-)?[a-f0-9]+$/; -class VirtualFS extends ProxiedFS { - constructor({ baseFs = new NodeFS() } = {}) { - super(ppath); - this.baseFs = baseFs; - } - static makeVirtualPath(base, component, to) { - if (ppath.basename(base) !== `__virtual__`) - throw new Error(`Assertion failed: Virtual folders must be named "__virtual__"`); - if (!ppath.basename(component).match(VALID_COMPONENT)) - throw new Error(`Assertion failed: Virtual components must be ended by an hexadecimal hash`); - const target = ppath.relative(ppath.dirname(base), to); - const segments = target.split(`/`); - let depth = 0; - while (depth < segments.length && segments[depth] === `..`) - depth += 1; - const finalSegments = segments.slice(depth); - const fullVirtualPath = ppath.join(base, component, String(depth), ...finalSegments); - return fullVirtualPath; - } - static resolveVirtual(p) { - const match = p.match(VIRTUAL_REGEXP); - if (!match || !match[3] && match[5]) - return p; - const target = ppath.dirname(match[1]); - if (!match[3] || !match[4]) - return target; - const isnum = NUMBER_REGEXP.test(match[4]); - if (!isnum) - return p; - const depth = Number(match[4]); - const backstep = `../`.repeat(depth); - const subpath = match[5] || `.`; - return VirtualFS.resolveVirtual(ppath.join(target, backstep, subpath)); - } - getExtractHint(hints) { - return this.baseFs.getExtractHint(hints); - } - getRealPath() { - return this.baseFs.getRealPath(); - } - realpathSync(p) { - const match = p.match(VIRTUAL_REGEXP); - if (!match) - return this.baseFs.realpathSync(p); - if (!match[5]) - return p; - const realpath = this.baseFs.realpathSync(this.mapToBase(p)); - return VirtualFS.makeVirtualPath(match[1], match[3], realpath); - } - async realpathPromise(p) { - const match = p.match(VIRTUAL_REGEXP); - if (!match) - return await this.baseFs.realpathPromise(p); - if (!match[5]) - return p; - const realpath = await this.baseFs.realpathPromise(this.mapToBase(p)); - return VirtualFS.makeVirtualPath(match[1], match[3], realpath); - } - mapToBase(p) { - if (p === ``) - return p; - if (this.pathUtils.isAbsolute(p)) - return VirtualFS.resolveVirtual(p); - const resolvedRoot = VirtualFS.resolveVirtual(this.baseFs.resolve(PortablePath.dot)); - const resolvedP = VirtualFS.resolveVirtual(this.baseFs.resolve(p)); - return ppath.relative(resolvedRoot, resolvedP) || PortablePath.dot; - } - mapFromBase(p) { - return p; - } -} - -const ZIP_MASK = 4278190080; -const ZIP_MAGIC = 704643072; -const getArchivePart = (path, extension) => { - let idx = path.indexOf(extension); - if (idx <= 0) - return null; - let nextCharIdx = idx; - while (idx >= 0) { - nextCharIdx = idx + extension.length; - if (path[nextCharIdx] === ppath.sep) - break; - if (path[idx - 1] === ppath.sep) - return null; - idx = path.indexOf(extension, nextCharIdx); - } - if (path.length > nextCharIdx && path[nextCharIdx] !== ppath.sep) - return null; - return path.slice(0, nextCharIdx); -}; -class ZipOpenFS extends BasePortableFakeFS { - constructor({ libzip, baseFs = new NodeFS(), filter = null, maxOpenFiles = Infinity, readOnlyArchives = false, useCache = true, maxAge = 5e3, fileExtensions = null }) { - super(); - this.fdMap = /* @__PURE__ */ new Map(); - this.nextFd = 3; - this.isZip = /* @__PURE__ */ new Set(); - this.notZip = /* @__PURE__ */ new Set(); - this.realPaths = /* @__PURE__ */ new Map(); - this.limitOpenFilesTimeout = null; - this.libzipFactory = typeof libzip !== `function` ? () => libzip : libzip; - this.baseFs = baseFs; - this.zipInstances = useCache ? /* @__PURE__ */ new Map() : null; - this.filter = filter; - this.maxOpenFiles = maxOpenFiles; - this.readOnlyArchives = readOnlyArchives; - this.maxAge = maxAge; - this.fileExtensions = fileExtensions; - } - static async openPromise(fn, opts) { - const zipOpenFs = new ZipOpenFS(opts); - try { - return await fn(zipOpenFs); - } finally { - zipOpenFs.saveAndClose(); - } - } - get libzip() { - if (typeof this.libzipInstance === `undefined`) - this.libzipInstance = this.libzipFactory(); - return this.libzipInstance; - } - getExtractHint(hints) { - return this.baseFs.getExtractHint(hints); - } - getRealPath() { - return this.baseFs.getRealPath(); - } - saveAndClose() { - unwatchAllFiles(this); - if (this.zipInstances) { - for (const [path, { zipFs }] of this.zipInstances.entries()) { - zipFs.saveAndClose(); - this.zipInstances.delete(path); - } - } - } - discardAndClose() { - unwatchAllFiles(this); - if (this.zipInstances) { - for (const [path, { zipFs }] of this.zipInstances.entries()) { - zipFs.discardAndClose(); - this.zipInstances.delete(path); - } - } - } - resolve(p) { - return this.baseFs.resolve(p); - } - remapFd(zipFs, fd) { - const remappedFd = this.nextFd++ | ZIP_MAGIC; - this.fdMap.set(remappedFd, [zipFs, fd]); - return remappedFd; - } - async openPromise(p, flags, mode) { - return await this.makeCallPromise(p, async () => { - return await this.baseFs.openPromise(p, flags, mode); - }, async (zipFs, { subPath }) => { - return this.remapFd(zipFs, await zipFs.openPromise(subPath, flags, mode)); - }); - } - openSync(p, flags, mode) { - return this.makeCallSync(p, () => { - return this.baseFs.openSync(p, flags, mode); - }, (zipFs, { subPath }) => { - return this.remapFd(zipFs, zipFs.openSync(subPath, flags, mode)); - }); - } - async opendirPromise(p, opts) { - return await this.makeCallPromise(p, async () => { - return await this.baseFs.opendirPromise(p, opts); - }, async (zipFs, { subPath }) => { - return await zipFs.opendirPromise(subPath, opts); - }, { - requireSubpath: false - }); - } - opendirSync(p, opts) { - return this.makeCallSync(p, () => { - return this.baseFs.opendirSync(p, opts); - }, (zipFs, { subPath }) => { - return zipFs.opendirSync(subPath, opts); - }, { - requireSubpath: false - }); - } - async readPromise(fd, buffer, offset, length, position) { - if ((fd & ZIP_MASK) !== ZIP_MAGIC) - return await this.baseFs.readPromise(fd, buffer, offset, length, position); - const entry = this.fdMap.get(fd); - if (typeof entry === `undefined`) - throw EBADF(`read`); - const [zipFs, realFd] = entry; - return await zipFs.readPromise(realFd, buffer, offset, length, position); - } - readSync(fd, buffer, offset, length, position) { - if ((fd & ZIP_MASK) !== ZIP_MAGIC) - return this.baseFs.readSync(fd, buffer, offset, length, position); - const entry = this.fdMap.get(fd); - if (typeof entry === `undefined`) - throw EBADF(`readSync`); - const [zipFs, realFd] = entry; - return zipFs.readSync(realFd, buffer, offset, length, position); - } - async writePromise(fd, buffer, offset, length, position) { - if ((fd & ZIP_MASK) !== ZIP_MAGIC) { - if (typeof buffer === `string`) { - return await this.baseFs.writePromise(fd, buffer, offset); - } else { - return await this.baseFs.writePromise(fd, buffer, offset, length, position); - } - } - const entry = this.fdMap.get(fd); - if (typeof entry === `undefined`) - throw EBADF(`write`); - const [zipFs, realFd] = entry; - if (typeof buffer === `string`) { - return await zipFs.writePromise(realFd, buffer, offset); - } else { - return await zipFs.writePromise(realFd, buffer, offset, length, position); - } - } - writeSync(fd, buffer, offset, length, position) { - if ((fd & ZIP_MASK) !== ZIP_MAGIC) { - if (typeof buffer === `string`) { - return this.baseFs.writeSync(fd, buffer, offset); - } else { - return this.baseFs.writeSync(fd, buffer, offset, length, position); - } - } - const entry = this.fdMap.get(fd); - if (typeof entry === `undefined`) - throw EBADF(`writeSync`); - const [zipFs, realFd] = entry; - if (typeof buffer === `string`) { - return zipFs.writeSync(realFd, buffer, offset); - } else { - return zipFs.writeSync(realFd, buffer, offset, length, position); - } - } - async closePromise(fd) { - if ((fd & ZIP_MASK) !== ZIP_MAGIC) - return await this.baseFs.closePromise(fd); - const entry = this.fdMap.get(fd); - if (typeof entry === `undefined`) - throw EBADF(`close`); - this.fdMap.delete(fd); - const [zipFs, realFd] = entry; - return await zipFs.closePromise(realFd); - } - closeSync(fd) { - if ((fd & ZIP_MASK) !== ZIP_MAGIC) - return this.baseFs.closeSync(fd); - const entry = this.fdMap.get(fd); - if (typeof entry === `undefined`) - throw EBADF(`closeSync`); - this.fdMap.delete(fd); - const [zipFs, realFd] = entry; - return zipFs.closeSync(realFd); - } - createReadStream(p, opts) { - if (p === null) - return this.baseFs.createReadStream(p, opts); - return this.makeCallSync(p, () => { - return this.baseFs.createReadStream(p, opts); - }, (zipFs, { archivePath, subPath }) => { - const stream = zipFs.createReadStream(subPath, opts); - stream.path = npath.fromPortablePath(this.pathUtils.join(archivePath, subPath)); - return stream; - }); - } - createWriteStream(p, opts) { - if (p === null) - return this.baseFs.createWriteStream(p, opts); - return this.makeCallSync(p, () => { - return this.baseFs.createWriteStream(p, opts); - }, (zipFs, { subPath }) => { - return zipFs.createWriteStream(subPath, opts); - }); - } - async realpathPromise(p) { - return await this.makeCallPromise(p, async () => { - return await this.baseFs.realpathPromise(p); - }, async (zipFs, { archivePath, subPath }) => { - let realArchivePath = this.realPaths.get(archivePath); - if (typeof realArchivePath === `undefined`) { - realArchivePath = await this.baseFs.realpathPromise(archivePath); - this.realPaths.set(archivePath, realArchivePath); - } - return this.pathUtils.join(realArchivePath, this.pathUtils.relative(PortablePath.root, await zipFs.realpathPromise(subPath))); - }); - } - realpathSync(p) { - return this.makeCallSync(p, () => { - return this.baseFs.realpathSync(p); - }, (zipFs, { archivePath, subPath }) => { - let realArchivePath = this.realPaths.get(archivePath); - if (typeof realArchivePath === `undefined`) { - realArchivePath = this.baseFs.realpathSync(archivePath); - this.realPaths.set(archivePath, realArchivePath); - } - return this.pathUtils.join(realArchivePath, this.pathUtils.relative(PortablePath.root, zipFs.realpathSync(subPath))); - }); - } - async existsPromise(p) { - return await this.makeCallPromise(p, async () => { - return await this.baseFs.existsPromise(p); - }, async (zipFs, { subPath }) => { - return await zipFs.existsPromise(subPath); - }); - } - existsSync(p) { - return this.makeCallSync(p, () => { - return this.baseFs.existsSync(p); - }, (zipFs, { subPath }) => { - return zipFs.existsSync(subPath); - }); - } - async accessPromise(p, mode) { - return await this.makeCallPromise(p, async () => { - return await this.baseFs.accessPromise(p, mode); - }, async (zipFs, { subPath }) => { - return await zipFs.accessPromise(subPath, mode); - }); - } - accessSync(p, mode) { - return this.makeCallSync(p, () => { - return this.baseFs.accessSync(p, mode); - }, (zipFs, { subPath }) => { - return zipFs.accessSync(subPath, mode); - }); - } - async statPromise(p, opts) { - return await this.makeCallPromise(p, async () => { - return await this.baseFs.statPromise(p, opts); - }, async (zipFs, { subPath }) => { - return await zipFs.statPromise(subPath, opts); - }); - } - statSync(p, opts) { - return this.makeCallSync(p, () => { - return this.baseFs.statSync(p, opts); - }, (zipFs, { subPath }) => { - return zipFs.statSync(subPath, opts); - }); - } - async fstatPromise(fd, opts) { - if ((fd & ZIP_MASK) !== ZIP_MAGIC) - return this.baseFs.fstatPromise(fd, opts); - const entry = this.fdMap.get(fd); - if (typeof entry === `undefined`) - throw EBADF(`fstat`); - const [zipFs, realFd] = entry; - return zipFs.fstatPromise(realFd, opts); - } - fstatSync(fd, opts) { - if ((fd & ZIP_MASK) !== ZIP_MAGIC) - return this.baseFs.fstatSync(fd, opts); - const entry = this.fdMap.get(fd); - if (typeof entry === `undefined`) - throw EBADF(`fstatSync`); - const [zipFs, realFd] = entry; - return zipFs.fstatSync(realFd, opts); - } - async lstatPromise(p, opts) { - return await this.makeCallPromise(p, async () => { - return await this.baseFs.lstatPromise(p, opts); - }, async (zipFs, { subPath }) => { - return await zipFs.lstatPromise(subPath, opts); - }); - } - lstatSync(p, opts) { - return this.makeCallSync(p, () => { - return this.baseFs.lstatSync(p, opts); - }, (zipFs, { subPath }) => { - return zipFs.lstatSync(subPath, opts); - }); - } - async fchmodPromise(fd, mask) { - if ((fd & ZIP_MASK) !== ZIP_MAGIC) - return this.baseFs.fchmodPromise(fd, mask); - const entry = this.fdMap.get(fd); - if (typeof entry === `undefined`) - throw EBADF(`fchmod`); - const [zipFs, realFd] = entry; - return zipFs.fchmodPromise(realFd, mask); - } - fchmodSync(fd, mask) { - if ((fd & ZIP_MASK) !== ZIP_MAGIC) - return this.baseFs.fchmodSync(fd, mask); - const entry = this.fdMap.get(fd); - if (typeof entry === `undefined`) - throw EBADF(`fchmodSync`); - const [zipFs, realFd] = entry; - return zipFs.fchmodSync(realFd, mask); - } - async chmodPromise(p, mask) { - return await this.makeCallPromise(p, async () => { - return await this.baseFs.chmodPromise(p, mask); - }, async (zipFs, { subPath }) => { - return await zipFs.chmodPromise(subPath, mask); - }); - } - chmodSync(p, mask) { - return this.makeCallSync(p, () => { - return this.baseFs.chmodSync(p, mask); - }, (zipFs, { subPath }) => { - return zipFs.chmodSync(subPath, mask); - }); - } - async fchownPromise(fd, uid, gid) { - if ((fd & ZIP_MASK) !== ZIP_MAGIC) - return this.baseFs.fchownPromise(fd, uid, gid); - const entry = this.fdMap.get(fd); - if (typeof entry === `undefined`) - throw EBADF(`fchown`); - const [zipFs, realFd] = entry; - return zipFs.fchownPromise(realFd, uid, gid); - } - fchownSync(fd, uid, gid) { - if ((fd & ZIP_MASK) !== ZIP_MAGIC) - return this.baseFs.fchownSync(fd, uid, gid); - const entry = this.fdMap.get(fd); - if (typeof entry === `undefined`) - throw EBADF(`fchownSync`); - const [zipFs, realFd] = entry; - return zipFs.fchownSync(realFd, uid, gid); - } - async chownPromise(p, uid, gid) { - return await this.makeCallPromise(p, async () => { - return await this.baseFs.chownPromise(p, uid, gid); - }, async (zipFs, { subPath }) => { - return await zipFs.chownPromise(subPath, uid, gid); - }); - } - chownSync(p, uid, gid) { - return this.makeCallSync(p, () => { - return this.baseFs.chownSync(p, uid, gid); - }, (zipFs, { subPath }) => { - return zipFs.chownSync(subPath, uid, gid); - }); - } - async renamePromise(oldP, newP) { - return await this.makeCallPromise(oldP, async () => { - return await this.makeCallPromise(newP, async () => { - return await this.baseFs.renamePromise(oldP, newP); - }, async () => { - throw Object.assign(new Error(`EEXDEV: cross-device link not permitted`), { code: `EEXDEV` }); - }); - }, async (zipFsO, { subPath: subPathO }) => { - return await this.makeCallPromise(newP, async () => { - throw Object.assign(new Error(`EEXDEV: cross-device link not permitted`), { code: `EEXDEV` }); - }, async (zipFsN, { subPath: subPathN }) => { - if (zipFsO !== zipFsN) { - throw Object.assign(new Error(`EEXDEV: cross-device link not permitted`), { code: `EEXDEV` }); - } else { - return await zipFsO.renamePromise(subPathO, subPathN); - } - }); - }); - } - renameSync(oldP, newP) { - return this.makeCallSync(oldP, () => { - return this.makeCallSync(newP, () => { - return this.baseFs.renameSync(oldP, newP); - }, () => { - throw Object.assign(new Error(`EEXDEV: cross-device link not permitted`), { code: `EEXDEV` }); - }); - }, (zipFsO, { subPath: subPathO }) => { - return this.makeCallSync(newP, () => { - throw Object.assign(new Error(`EEXDEV: cross-device link not permitted`), { code: `EEXDEV` }); - }, (zipFsN, { subPath: subPathN }) => { - if (zipFsO !== zipFsN) { - throw Object.assign(new Error(`EEXDEV: cross-device link not permitted`), { code: `EEXDEV` }); - } else { - return zipFsO.renameSync(subPathO, subPathN); - } - }); - }); - } - async copyFilePromise(sourceP, destP, flags = 0) { - const fallback = async (sourceFs, sourceP2, destFs, destP2) => { - if ((flags & fs.constants.COPYFILE_FICLONE_FORCE) !== 0) - throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${sourceP2}' -> ${destP2}'`), { code: `EXDEV` }); - if (flags & fs.constants.COPYFILE_EXCL && await this.existsPromise(sourceP2)) - throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${sourceP2}' -> '${destP2}'`), { code: `EEXIST` }); - let content; - try { - content = await sourceFs.readFilePromise(sourceP2); - } catch (error) { - throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${sourceP2}' -> '${destP2}'`), { code: `EINVAL` }); - } - await destFs.writeFilePromise(destP2, content); - }; - return await this.makeCallPromise(sourceP, async () => { - return await this.makeCallPromise(destP, async () => { - return await this.baseFs.copyFilePromise(sourceP, destP, flags); - }, async (zipFsD, { subPath: subPathD }) => { - return await fallback(this.baseFs, sourceP, zipFsD, subPathD); - }); - }, async (zipFsS, { subPath: subPathS }) => { - return await this.makeCallPromise(destP, async () => { - return await fallback(zipFsS, subPathS, this.baseFs, destP); - }, async (zipFsD, { subPath: subPathD }) => { - if (zipFsS !== zipFsD) { - return await fallback(zipFsS, subPathS, zipFsD, subPathD); - } else { - return await zipFsS.copyFilePromise(subPathS, subPathD, flags); - } - }); - }); - } - copyFileSync(sourceP, destP, flags = 0) { - const fallback = (sourceFs, sourceP2, destFs, destP2) => { - if ((flags & fs.constants.COPYFILE_FICLONE_FORCE) !== 0) - throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${sourceP2}' -> ${destP2}'`), { code: `EXDEV` }); - if (flags & fs.constants.COPYFILE_EXCL && this.existsSync(sourceP2)) - throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${sourceP2}' -> '${destP2}'`), { code: `EEXIST` }); - let content; - try { - content = sourceFs.readFileSync(sourceP2); - } catch (error) { - throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${sourceP2}' -> '${destP2}'`), { code: `EINVAL` }); - } - destFs.writeFileSync(destP2, content); - }; - return this.makeCallSync(sourceP, () => { - return this.makeCallSync(destP, () => { - return this.baseFs.copyFileSync(sourceP, destP, flags); - }, (zipFsD, { subPath: subPathD }) => { - return fallback(this.baseFs, sourceP, zipFsD, subPathD); - }); - }, (zipFsS, { subPath: subPathS }) => { - return this.makeCallSync(destP, () => { - return fallback(zipFsS, subPathS, this.baseFs, destP); - }, (zipFsD, { subPath: subPathD }) => { - if (zipFsS !== zipFsD) { - return fallback(zipFsS, subPathS, zipFsD, subPathD); - } else { - return zipFsS.copyFileSync(subPathS, subPathD, flags); - } - }); - }); - } - async appendFilePromise(p, content, opts) { - return await this.makeCallPromise(p, async () => { - return await this.baseFs.appendFilePromise(p, content, opts); - }, async (zipFs, { subPath }) => { - return await zipFs.appendFilePromise(subPath, content, opts); - }); - } - appendFileSync(p, content, opts) { - return this.makeCallSync(p, () => { - return this.baseFs.appendFileSync(p, content, opts); - }, (zipFs, { subPath }) => { - return zipFs.appendFileSync(subPath, content, opts); - }); - } - async writeFilePromise(p, content, opts) { - return await this.makeCallPromise(p, async () => { - return await this.baseFs.writeFilePromise(p, content, opts); - }, async (zipFs, { subPath }) => { - return await zipFs.writeFilePromise(subPath, content, opts); - }); - } - writeFileSync(p, content, opts) { - return this.makeCallSync(p, () => { - return this.baseFs.writeFileSync(p, content, opts); - }, (zipFs, { subPath }) => { - return zipFs.writeFileSync(subPath, content, opts); - }); - } - async unlinkPromise(p) { - return await this.makeCallPromise(p, async () => { - return await this.baseFs.unlinkPromise(p); - }, async (zipFs, { subPath }) => { - return await zipFs.unlinkPromise(subPath); - }); - } - unlinkSync(p) { - return this.makeCallSync(p, () => { - return this.baseFs.unlinkSync(p); - }, (zipFs, { subPath }) => { - return zipFs.unlinkSync(subPath); - }); - } - async utimesPromise(p, atime, mtime) { - return await this.makeCallPromise(p, async () => { - return await this.baseFs.utimesPromise(p, atime, mtime); - }, async (zipFs, { subPath }) => { - return await zipFs.utimesPromise(subPath, atime, mtime); - }); - } - utimesSync(p, atime, mtime) { - return this.makeCallSync(p, () => { - return this.baseFs.utimesSync(p, atime, mtime); - }, (zipFs, { subPath }) => { - return zipFs.utimesSync(subPath, atime, mtime); - }); - } - async mkdirPromise(p, opts) { - return await this.makeCallPromise(p, async () => { - return await this.baseFs.mkdirPromise(p, opts); - }, async (zipFs, { subPath }) => { - return await zipFs.mkdirPromise(subPath, opts); - }); - } - mkdirSync(p, opts) { - return this.makeCallSync(p, () => { - return this.baseFs.mkdirSync(p, opts); - }, (zipFs, { subPath }) => { - return zipFs.mkdirSync(subPath, opts); - }); - } - async rmdirPromise(p, opts) { - return await this.makeCallPromise(p, async () => { - return await this.baseFs.rmdirPromise(p, opts); - }, async (zipFs, { subPath }) => { - return await zipFs.rmdirPromise(subPath, opts); - }); - } - rmdirSync(p, opts) { - return this.makeCallSync(p, () => { - return this.baseFs.rmdirSync(p, opts); - }, (zipFs, { subPath }) => { - return zipFs.rmdirSync(subPath, opts); - }); - } - async linkPromise(existingP, newP) { - return await this.makeCallPromise(newP, async () => { - return await this.baseFs.linkPromise(existingP, newP); - }, async (zipFs, { subPath }) => { - return await zipFs.linkPromise(existingP, subPath); - }); - } - linkSync(existingP, newP) { - return this.makeCallSync(newP, () => { - return this.baseFs.linkSync(existingP, newP); - }, (zipFs, { subPath }) => { - return zipFs.linkSync(existingP, subPath); - }); - } - async symlinkPromise(target, p, type) { - return await this.makeCallPromise(p, async () => { - return await this.baseFs.symlinkPromise(target, p, type); - }, async (zipFs, { subPath }) => { - return await zipFs.symlinkPromise(target, subPath); - }); - } - symlinkSync(target, p, type) { - return this.makeCallSync(p, () => { - return this.baseFs.symlinkSync(target, p, type); - }, (zipFs, { subPath }) => { - return zipFs.symlinkSync(target, subPath); - }); - } - async readFilePromise(p, encoding) { - return this.makeCallPromise(p, async () => { - switch (encoding) { - case `utf8`: - return await this.baseFs.readFilePromise(p, encoding); - default: - return await this.baseFs.readFilePromise(p, encoding); - } - }, async (zipFs, { subPath }) => { - return await zipFs.readFilePromise(subPath, encoding); - }); - } - readFileSync(p, encoding) { - return this.makeCallSync(p, () => { - switch (encoding) { - case `utf8`: - return this.baseFs.readFileSync(p, encoding); - default: - return this.baseFs.readFileSync(p, encoding); - } - }, (zipFs, { subPath }) => { - return zipFs.readFileSync(subPath, encoding); - }); - } - async readdirPromise(p, opts) { - return await this.makeCallPromise(p, async () => { - return await this.baseFs.readdirPromise(p, opts); - }, async (zipFs, { subPath }) => { - return await zipFs.readdirPromise(subPath, opts); - }, { - requireSubpath: false - }); - } - readdirSync(p, opts) { - return this.makeCallSync(p, () => { - return this.baseFs.readdirSync(p, opts); - }, (zipFs, { subPath }) => { - return zipFs.readdirSync(subPath, opts); - }, { - requireSubpath: false - }); - } - async readlinkPromise(p) { - return await this.makeCallPromise(p, async () => { - return await this.baseFs.readlinkPromise(p); - }, async (zipFs, { subPath }) => { - return await zipFs.readlinkPromise(subPath); - }); - } - readlinkSync(p) { - return this.makeCallSync(p, () => { - return this.baseFs.readlinkSync(p); - }, (zipFs, { subPath }) => { - return zipFs.readlinkSync(subPath); - }); - } - async truncatePromise(p, len) { - return await this.makeCallPromise(p, async () => { - return await this.baseFs.truncatePromise(p, len); - }, async (zipFs, { subPath }) => { - return await zipFs.truncatePromise(subPath, len); - }); - } - truncateSync(p, len) { - return this.makeCallSync(p, () => { - return this.baseFs.truncateSync(p, len); - }, (zipFs, { subPath }) => { - return zipFs.truncateSync(subPath, len); - }); - } - async ftruncatePromise(fd, len) { - if ((fd & ZIP_MASK) !== ZIP_MAGIC) - return this.baseFs.ftruncatePromise(fd, len); - const entry = this.fdMap.get(fd); - if (typeof entry === `undefined`) - throw EBADF(`ftruncate`); - const [zipFs, realFd] = entry; - return zipFs.ftruncatePromise(realFd, len); - } - ftruncateSync(fd, len) { - if ((fd & ZIP_MASK) !== ZIP_MAGIC) - return this.baseFs.ftruncateSync(fd, len); - const entry = this.fdMap.get(fd); - if (typeof entry === `undefined`) - throw EBADF(`ftruncateSync`); - const [zipFs, realFd] = entry; - return zipFs.ftruncateSync(realFd, len); - } - watch(p, a, b) { - return this.makeCallSync(p, () => { - return this.baseFs.watch( - p, - a, - b - ); - }, (zipFs, { subPath }) => { - return zipFs.watch( - subPath, - a, - b - ); - }); - } - watchFile(p, a, b) { - return this.makeCallSync(p, () => { - return this.baseFs.watchFile( - p, - a, - b - ); - }, () => { - return watchFile(this, p, a, b); - }); - } - unwatchFile(p, cb) { - return this.makeCallSync(p, () => { - return this.baseFs.unwatchFile(p, cb); - }, () => { - return unwatchFile(this, p, cb); - }); - } - async makeCallPromise(p, discard, accept, { requireSubpath = true } = {}) { - if (typeof p !== `string`) - return await discard(); - const normalizedP = this.resolve(p); - const zipInfo = this.findZip(normalizedP); - if (!zipInfo) - return await discard(); - if (requireSubpath && zipInfo.subPath === `/`) - return await discard(); - return await this.getZipPromise(zipInfo.archivePath, async (zipFs) => await accept(zipFs, zipInfo)); - } - makeCallSync(p, discard, accept, { requireSubpath = true } = {}) { - if (typeof p !== `string`) - return discard(); - const normalizedP = this.resolve(p); - const zipInfo = this.findZip(normalizedP); - if (!zipInfo) - return discard(); - if (requireSubpath && zipInfo.subPath === `/`) - return discard(); - return this.getZipSync(zipInfo.archivePath, (zipFs) => accept(zipFs, zipInfo)); - } - findZip(p) { - if (this.filter && !this.filter.test(p)) - return null; - let filePath = ``; - while (true) { - const pathPartWithArchive = p.substring(filePath.length); - let archivePart; - if (!this.fileExtensions) { - archivePart = getArchivePart(pathPartWithArchive, `.zip`); - } else { - for (const ext of this.fileExtensions) { - archivePart = getArchivePart(pathPartWithArchive, ext); - if (archivePart) { - break; - } - } - } - if (!archivePart) - return null; - filePath = this.pathUtils.join(filePath, archivePart); - if (this.isZip.has(filePath) === false) { - if (this.notZip.has(filePath)) - continue; - try { - if (!this.baseFs.lstatSync(filePath).isFile()) { - this.notZip.add(filePath); - continue; - } - } catch { - return null; - } - this.isZip.add(filePath); - } - return { - archivePath: filePath, - subPath: this.pathUtils.join(PortablePath.root, p.substring(filePath.length)) - }; - } - } - limitOpenFiles(max) { - if (this.zipInstances === null) - return; - const now = Date.now(); - let nextExpiresAt = now + this.maxAge; - let closeCount = max === null ? 0 : this.zipInstances.size - max; - for (const [path, { zipFs, expiresAt, refCount }] of this.zipInstances.entries()) { - if (refCount !== 0 || zipFs.hasOpenFileHandles()) { - continue; - } else if (now >= expiresAt) { - zipFs.saveAndClose(); - this.zipInstances.delete(path); - closeCount -= 1; - continue; - } else if (max === null || closeCount <= 0) { - nextExpiresAt = expiresAt; - break; - } - zipFs.saveAndClose(); - this.zipInstances.delete(path); - closeCount -= 1; - } - if (this.limitOpenFilesTimeout === null && (max === null && this.zipInstances.size > 0 || max !== null)) { - this.limitOpenFilesTimeout = setTimeout(() => { - this.limitOpenFilesTimeout = null; - this.limitOpenFiles(null); - }, nextExpiresAt - now).unref(); - } - } - async getZipPromise(p, accept) { - const getZipOptions = async () => ({ - baseFs: this.baseFs, - libzip: this.libzip, - readOnly: this.readOnlyArchives, - stats: await this.baseFs.statPromise(p) - }); - if (this.zipInstances) { - let cachedZipFs = this.zipInstances.get(p); - if (!cachedZipFs) { - const zipOptions = await getZipOptions(); - cachedZipFs = this.zipInstances.get(p); - if (!cachedZipFs) { - cachedZipFs = { - zipFs: new ZipFS(p, zipOptions), - expiresAt: 0, - refCount: 0 - }; - } - } - this.zipInstances.delete(p); - this.limitOpenFiles(this.maxOpenFiles - 1); - this.zipInstances.set(p, cachedZipFs); - cachedZipFs.expiresAt = Date.now() + this.maxAge; - cachedZipFs.refCount += 1; - try { - return await accept(cachedZipFs.zipFs); - } finally { - cachedZipFs.refCount -= 1; - } - } else { - const zipFs = new ZipFS(p, await getZipOptions()); - try { - return await accept(zipFs); - } finally { - zipFs.saveAndClose(); - } - } - } - getZipSync(p, accept) { - const getZipOptions = () => ({ - baseFs: this.baseFs, - libzip: this.libzip, - readOnly: this.readOnlyArchives, - stats: this.baseFs.statSync(p) - }); - if (this.zipInstances) { - let cachedZipFs = this.zipInstances.get(p); - if (!cachedZipFs) { - cachedZipFs = { - zipFs: new ZipFS(p, getZipOptions()), - expiresAt: 0, - refCount: 0 - }; - } - this.zipInstances.delete(p); - this.limitOpenFiles(this.maxOpenFiles - 1); - this.zipInstances.set(p, cachedZipFs); - cachedZipFs.expiresAt = Date.now() + this.maxAge; - return accept(cachedZipFs.zipFs); - } else { - const zipFs = new ZipFS(p, getZipOptions()); - try { - return accept(zipFs); - } finally { - zipFs.saveAndClose(); - } - } - } -} - -class NodePathFS extends ProxiedFS { - constructor(baseFs) { - super(npath); - this.baseFs = baseFs; - } - mapFromBase(path) { - return path; - } - mapToBase(path) { - if (typeof path === `string`) - return path; - if (path instanceof url.URL) - return url.fileURLToPath(path); - if (Buffer.isBuffer(path)) { - const str = path.toString(); - if (Buffer.byteLength(str) !== path.byteLength) - throw new Error(`Non-utf8 buffers are not supported at the moment. Please upvote the following issue if you encounter this error: https://github.com/yarnpkg/berry/issues/4942`); - return str; - } - throw new Error(`Unsupported path type: ${nodeUtils.inspect(path)}`); - } -} - -var _a, _b, _c, _d; -const kBaseFs = Symbol(`kBaseFs`); -const kFd = Symbol(`kFd`); -const kClosePromise = Symbol(`kClosePromise`); -const kCloseResolve = Symbol(`kCloseResolve`); -const kCloseReject = Symbol(`kCloseReject`); -const kRefs = Symbol(`kRefs`); -const kRef = Symbol(`kRef`); -const kUnref = Symbol(`kUnref`); -class FileHandle { - constructor(fd, baseFs) { - this[_a] = 1; - this[_b] = void 0; - this[_c] = void 0; - this[_d] = void 0; - this[kBaseFs] = baseFs; - this[kFd] = fd; - } - get fd() { - return this[kFd]; - } - async appendFile(data, options) { - var _a2; - try { - this[kRef](this.appendFile); - const encoding = (_a2 = typeof options === `string` ? options : options == null ? void 0 : options.encoding) != null ? _a2 : void 0; - return await this[kBaseFs].appendFilePromise(this.fd, data, encoding ? { encoding } : void 0); - } finally { - this[kUnref](); - } - } - async chown(uid, gid) { - try { - this[kRef](this.chown); - return await this[kBaseFs].fchownPromise(this.fd, uid, gid); - } finally { - this[kUnref](); - } - } - async chmod(mode) { - try { - this[kRef](this.chmod); - return await this[kBaseFs].fchmodPromise(this.fd, mode); - } finally { - this[kUnref](); - } - } - createReadStream(options) { - return this[kBaseFs].createReadStream(null, { ...options, fd: this.fd }); - } - createWriteStream(options) { - return this[kBaseFs].createWriteStream(null, { ...options, fd: this.fd }); - } - datasync() { - throw new Error(`Method not implemented.`); - } - sync() { - throw new Error(`Method not implemented.`); - } - async read(bufferOrOptions, offset, length, position) { - var _a2, _b2, _c2; - try { - this[kRef](this.read); - let buffer; - if (!Buffer.isBuffer(bufferOrOptions)) { - bufferOrOptions != null ? bufferOrOptions : bufferOrOptions = {}; - buffer = (_a2 = bufferOrOptions.buffer) != null ? _a2 : Buffer.alloc(16384); - offset = bufferOrOptions.offset || 0; - length = (_b2 = bufferOrOptions.length) != null ? _b2 : buffer.byteLength; - position = (_c2 = bufferOrOptions.position) != null ? _c2 : null; - } else { - buffer = bufferOrOptions; - } - offset != null ? offset : offset = 0; - length != null ? length : length = 0; - if (length === 0) { - return { - bytesRead: length, - buffer - }; - } - const bytesRead = await this[kBaseFs].readPromise(this.fd, buffer, offset, length, position); - return { - bytesRead, - buffer - }; - } finally { - this[kUnref](); - } - } - async readFile(options) { - var _a2; - try { - this[kRef](this.readFile); - const encoding = (_a2 = typeof options === `string` ? options : options == null ? void 0 : options.encoding) != null ? _a2 : void 0; - return await this[kBaseFs].readFilePromise(this.fd, encoding); - } finally { - this[kUnref](); - } - } - readLines(options) { - return readline.createInterface({ - input: this.createReadStream(options), - crlfDelay: Infinity - }); - } - async stat(opts) { - try { - this[kRef](this.stat); - return await this[kBaseFs].fstatPromise(this.fd, opts); - } finally { - this[kUnref](); - } - } - async truncate(len) { - try { - this[kRef](this.truncate); - return await this[kBaseFs].ftruncatePromise(this.fd, len); - } finally { - this[kUnref](); - } - } - utimes(atime, mtime) { - throw new Error(`Method not implemented.`); - } - async writeFile(data, options) { - var _a2; - try { - this[kRef](this.writeFile); - const encoding = (_a2 = typeof options === `string` ? options : options == null ? void 0 : options.encoding) != null ? _a2 : void 0; - await this[kBaseFs].writeFilePromise(this.fd, data, encoding); - } finally { - this[kUnref](); - } - } - async write(...args) { - try { - this[kRef](this.write); - if (ArrayBuffer.isView(args[0])) { - const [buffer, offset, length, position] = args; - const bytesWritten = await this[kBaseFs].writePromise(this.fd, buffer, offset != null ? offset : void 0, length != null ? length : void 0, position != null ? position : void 0); - return { bytesWritten, buffer }; - } else { - const [data, position, encoding] = args; - const bytesWritten = await this[kBaseFs].writePromise(this.fd, data, position, encoding); - return { bytesWritten, buffer: data }; - } - } finally { - this[kUnref](); - } - } - async writev(buffers, position) { - try { - this[kRef](this.writev); - let bytesWritten = 0; - if (typeof position !== `undefined`) { - for (const buffer of buffers) { - const writeResult = await this.write(buffer, void 0, void 0, position); - bytesWritten += writeResult.bytesWritten; - position += writeResult.bytesWritten; - } - } else { - for (const buffer of buffers) { - const writeResult = await this.write(buffer); - bytesWritten += writeResult.bytesWritten; - } - } - return { - buffers, - bytesWritten - }; - } finally { - this[kUnref](); - } - } - readv(buffers, position) { - throw new Error(`Method not implemented.`); - } - close() { - if (this[kFd] === -1) - return Promise.resolve(); - if (this[kClosePromise]) - return this[kClosePromise]; - this[kRefs]--; - if (this[kRefs] === 0) { - const fd = this[kFd]; - this[kFd] = -1; - this[kClosePromise] = this[kBaseFs].closePromise(fd).finally(() => { - this[kClosePromise] = void 0; - }); - } else { - this[kClosePromise] = new Promise((resolve, reject) => { - this[kCloseResolve] = resolve; - this[kCloseReject] = reject; - }).finally(() => { - this[kClosePromise] = void 0; - this[kCloseReject] = void 0; - this[kCloseResolve] = void 0; - }); - } - return this[kClosePromise]; - } - [(_a = kRefs, _b = kClosePromise, _c = kCloseResolve, _d = kCloseReject, kRef)](caller) { - if (this[kFd] === -1) { - const err = new Error(`file closed`); - err.code = `EBADF`; - err.syscall = caller.name; - throw err; - } - this[kRefs]++; - } - [kUnref]() { - this[kRefs]--; - if (this[kRefs] === 0) { - const fd = this[kFd]; - this[kFd] = -1; - this[kBaseFs].closePromise(fd).then(this[kCloseResolve], this[kCloseReject]); - } - } -} - -const SYNC_IMPLEMENTATIONS = /* @__PURE__ */ new Set([ - `accessSync`, - `appendFileSync`, - `createReadStream`, - `createWriteStream`, - `chmodSync`, - `fchmodSync`, - `chownSync`, - `fchownSync`, - `closeSync`, - `copyFileSync`, - `linkSync`, - `lstatSync`, - `fstatSync`, - `lutimesSync`, - `mkdirSync`, - `openSync`, - `opendirSync`, - `readlinkSync`, - `readFileSync`, - `readdirSync`, - `readlinkSync`, - `realpathSync`, - `renameSync`, - `rmdirSync`, - `statSync`, - `symlinkSync`, - `truncateSync`, - `ftruncateSync`, - `unlinkSync`, - `unwatchFile`, - `utimesSync`, - `watch`, - `watchFile`, - `writeFileSync`, - `writeSync` -]); -const ASYNC_IMPLEMENTATIONS = /* @__PURE__ */ new Set([ - `accessPromise`, - `appendFilePromise`, - `fchmodPromise`, - `chmodPromise`, - `fchownPromise`, - `chownPromise`, - `closePromise`, - `copyFilePromise`, - `linkPromise`, - `fstatPromise`, - `lstatPromise`, - `lutimesPromise`, - `mkdirPromise`, - `openPromise`, - `opendirPromise`, - `readdirPromise`, - `realpathPromise`, - `readFilePromise`, - `readdirPromise`, - `readlinkPromise`, - `renamePromise`, - `rmdirPromise`, - `statPromise`, - `symlinkPromise`, - `truncatePromise`, - `ftruncatePromise`, - `unlinkPromise`, - `utimesPromise`, - `writeFilePromise`, - `writeSync` -]); -function patchFs(patchedFs, fakeFs) { - fakeFs = new NodePathFS(fakeFs); - const setupFn = (target, name, replacement) => { - const orig = target[name]; - target[name] = replacement; - if (typeof (orig == null ? void 0 : orig[nodeUtils.promisify.custom]) !== `undefined`) { - replacement[nodeUtils.promisify.custom] = orig[nodeUtils.promisify.custom]; - } - }; - { - setupFn(patchedFs, `exists`, (p, ...args) => { - const hasCallback = typeof args[args.length - 1] === `function`; - const callback = hasCallback ? args.pop() : () => { - }; - process.nextTick(() => { - fakeFs.existsPromise(p).then((exists) => { - callback(exists); - }, () => { - callback(false); - }); - }); - }); - setupFn(patchedFs, `read`, (...args) => { - let [fd, buffer, offset, length, position, callback] = args; - if (args.length <= 3) { - let options = {}; - if (args.length < 3) { - callback = args[1]; - } else { - options = args[1]; - callback = args[2]; - } - ({ - buffer = Buffer.alloc(16384), - offset = 0, - length = buffer.byteLength, - position - } = options); - } - if (offset == null) - offset = 0; - length |= 0; - if (length === 0) { - process.nextTick(() => { - callback(null, 0, buffer); - }); - return; - } - if (position == null) - position = -1; - process.nextTick(() => { - fakeFs.readPromise(fd, buffer, offset, length, position).then((bytesRead) => { - callback(null, bytesRead, buffer); - }, (error) => { - callback(error, 0, buffer); - }); - }); - }); - for (const fnName of ASYNC_IMPLEMENTATIONS) { - const origName = fnName.replace(/Promise$/, ``); - if (typeof patchedFs[origName] === `undefined`) - continue; - const fakeImpl = fakeFs[fnName]; - if (typeof fakeImpl === `undefined`) - continue; - const wrapper = (...args) => { - const hasCallback = typeof args[args.length - 1] === `function`; - const callback = hasCallback ? args.pop() : () => { - }; - process.nextTick(() => { - fakeImpl.apply(fakeFs, args).then((result) => { - callback(null, result); - }, (error) => { - callback(error); - }); - }); - }; - setupFn(patchedFs, origName, wrapper); - } - patchedFs.realpath.native = patchedFs.realpath; - } - { - setupFn(patchedFs, `existsSync`, (p) => { - try { - return fakeFs.existsSync(p); - } catch (error) { - return false; - } - }); - setupFn(patchedFs, `readSync`, (...args) => { - let [fd, buffer, offset, length, position] = args; - if (args.length <= 3) { - const options = args[2] || {}; - ({ offset = 0, length = buffer.byteLength, position } = options); - } - if (offset == null) - offset = 0; - length |= 0; - if (length === 0) - return 0; - if (position == null) - position = -1; - return fakeFs.readSync(fd, buffer, offset, length, position); - }); - for (const fnName of SYNC_IMPLEMENTATIONS) { - const origName = fnName; - if (typeof patchedFs[origName] === `undefined`) - continue; - const fakeImpl = fakeFs[fnName]; - if (typeof fakeImpl === `undefined`) - continue; - setupFn(patchedFs, origName, fakeImpl.bind(fakeFs)); - } - patchedFs.realpathSync.native = patchedFs.realpathSync; - } - { - const origEmitWarning = process.emitWarning; - process.emitWarning = () => { - }; - let patchedFsPromises; - try { - patchedFsPromises = patchedFs.promises; - } finally { - process.emitWarning = origEmitWarning; - } - if (typeof patchedFsPromises !== `undefined`) { - for (const fnName of ASYNC_IMPLEMENTATIONS) { - const origName = fnName.replace(/Promise$/, ``); - if (typeof patchedFsPromises[origName] === `undefined`) - continue; - const fakeImpl = fakeFs[fnName]; - if (typeof fakeImpl === `undefined`) - continue; - if (fnName === `open`) - continue; - setupFn(patchedFsPromises, origName, (pathLike, ...args) => { - if (pathLike instanceof FileHandle) { - return pathLike[origName].apply(pathLike, args); - } else { - return fakeImpl.call(fakeFs, pathLike, ...args); - } - }); - } - setupFn(patchedFsPromises, `open`, async (...args) => { - const fd = await fakeFs.openPromise(...args); - return new FileHandle(fd, fakeFs); - }); - } - } - { - patchedFs.read[nodeUtils.promisify.custom] = async (fd, buffer, ...args) => { - const res = fakeFs.readPromise(fd, buffer, ...args); - return { bytesRead: await res, buffer }; - }; - patchedFs.write[nodeUtils.promisify.custom] = async (fd, buffer, ...args) => { - const res = fakeFs.writePromise(fd, buffer, ...args); - return { bytesWritten: await res, buffer }; - }; - } -} - -var libzipSync = {exports: {}}; - -(function (module, exports) { -var frozenFs = Object.assign({}, fs__default.default); -var createModule = function() { - var _scriptDir = void 0; - if (typeof __filename !== "undefined") - _scriptDir = _scriptDir || __filename; - return function(createModule2) { - createModule2 = createModule2 || {}; - var Module = typeof createModule2 !== "undefined" ? createModule2 : {}; - var readyPromiseResolve, readyPromiseReject; - Module["ready"] = new Promise(function(resolve, reject) { - readyPromiseResolve = resolve; - readyPromiseReject = reject; - }); - var moduleOverrides = {}; - var key; - for (key in Module) { - if (Module.hasOwnProperty(key)) { - moduleOverrides[key] = Module[key]; - } - } - var scriptDirectory = ""; - function locateFile(path) { - if (Module["locateFile"]) { - return Module["locateFile"](path, scriptDirectory); - } - return scriptDirectory + path; - } - var read_, readBinary; - var nodeFS; - var nodePath; - { - { - scriptDirectory = __dirname + "/"; - } - read_ = function shell_read(filename, binary) { - var ret = tryParseAsDataURI(filename); - if (ret) { - return binary ? ret : ret.toString(); - } - if (!nodeFS) - nodeFS = frozenFs; - if (!nodePath) - nodePath = path__default.default; - filename = nodePath["normalize"](filename); - return nodeFS["readFileSync"](filename, binary ? null : "utf8"); - }; - readBinary = function readBinary2(filename) { - var ret = read_(filename, true); - if (!ret.buffer) { - ret = new Uint8Array(ret); - } - assert(ret.buffer); - return ret; - }; - if (process["argv"].length > 1) { - process["argv"][1].replace(/\\/g, "/"); - } - process["argv"].slice(2); - Module["inspect"] = function() { - return "[Emscripten Module object]"; - }; - } - var out = Module["print"] || console.log.bind(console); - var err = Module["printErr"] || console.warn.bind(console); - for (key in moduleOverrides) { - if (moduleOverrides.hasOwnProperty(key)) { - Module[key] = moduleOverrides[key]; - } - } - moduleOverrides = null; - if (Module["arguments"]) - ; - if (Module["thisProgram"]) - ; - if (Module["quit"]) - ; - var STACK_ALIGN = 16; - function alignMemory(size, factor) { - if (!factor) - factor = STACK_ALIGN; - return Math.ceil(size / factor) * factor; - } - var wasmBinary; - if (Module["wasmBinary"]) - wasmBinary = Module["wasmBinary"]; - Module["noExitRuntime"] || true; - if (typeof WebAssembly !== "object") { - abort("no native wasm support detected"); - } - function getValue(ptr, type, noSafe) { - type = type || "i8"; - if (type.charAt(type.length - 1) === "*") - type = "i32"; - switch (type) { - case "i1": - return HEAP8[ptr >> 0]; - case "i8": - return HEAP8[ptr >> 0]; - case "i16": - return HEAP16[ptr >> 1]; - case "i32": - return HEAP32[ptr >> 2]; - case "i64": - return HEAP32[ptr >> 2]; - case "float": - return HEAPF32[ptr >> 2]; - case "double": - return HEAPF64[ptr >> 3]; - default: - abort("invalid type for getValue: " + type); - } - return null; - } - var wasmMemory; - var ABORT = false; - function assert(condition, text) { - if (!condition) { - abort("Assertion failed: " + text); - } - } - function getCFunc(ident) { - var func = Module["_" + ident]; - assert( - func, - "Cannot call unknown function " + ident + ", make sure it is exported" - ); - return func; - } - function ccall(ident, returnType, argTypes, args, opts) { - var toC = { - string: function(str) { - var ret2 = 0; - if (str !== null && str !== void 0 && str !== 0) { - var len = (str.length << 2) + 1; - ret2 = stackAlloc(len); - stringToUTF8(str, ret2, len); - } - return ret2; - }, - array: function(arr) { - var ret2 = stackAlloc(arr.length); - writeArrayToMemory(arr, ret2); - return ret2; - } - }; - function convertReturnValue(ret2) { - if (returnType === "string") - return UTF8ToString(ret2); - if (returnType === "boolean") - return Boolean(ret2); - return ret2; - } - var func = getCFunc(ident); - var cArgs = []; - var stack = 0; - if (args) { - for (var i = 0; i < args.length; i++) { - var converter = toC[argTypes[i]]; - if (converter) { - if (stack === 0) - stack = stackSave(); - cArgs[i] = converter(args[i]); - } else { - cArgs[i] = args[i]; - } - } - } - var ret = func.apply(null, cArgs); - ret = convertReturnValue(ret); - if (stack !== 0) - stackRestore(stack); - return ret; - } - function cwrap(ident, returnType, argTypes, opts) { - argTypes = argTypes || []; - var numericArgs = argTypes.every(function(type) { - return type === "number"; - }); - var numericRet = returnType !== "string"; - if (numericRet && numericArgs && !opts) { - return getCFunc(ident); - } - return function() { - return ccall(ident, returnType, argTypes, arguments); - }; - } - var UTF8Decoder = typeof TextDecoder !== "undefined" ? new TextDecoder("utf8") : void 0; - function UTF8ArrayToString(heap, idx, maxBytesToRead) { - var endIdx = idx + maxBytesToRead; - var endPtr = idx; - while (heap[endPtr] && !(endPtr >= endIdx)) - ++endPtr; - if (endPtr - idx > 16 && heap.subarray && UTF8Decoder) { - return UTF8Decoder.decode(heap.subarray(idx, endPtr)); - } else { - var str = ""; - while (idx < endPtr) { - var u0 = heap[idx++]; - if (!(u0 & 128)) { - str += String.fromCharCode(u0); - continue; - } - var u1 = heap[idx++] & 63; - if ((u0 & 224) == 192) { - str += String.fromCharCode((u0 & 31) << 6 | u1); - continue; - } - var u2 = heap[idx++] & 63; - if ((u0 & 240) == 224) { - u0 = (u0 & 15) << 12 | u1 << 6 | u2; - } else { - u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heap[idx++] & 63; - } - if (u0 < 65536) { - str += String.fromCharCode(u0); - } else { - var ch = u0 - 65536; - str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023); - } - } - } - return str; - } - function UTF8ToString(ptr, maxBytesToRead) { - return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ""; - } - function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) { - if (!(maxBytesToWrite > 0)) - return 0; - var startIdx = outIdx; - var endIdx = outIdx + maxBytesToWrite - 1; - for (var i = 0; i < str.length; ++i) { - var u = str.charCodeAt(i); - if (u >= 55296 && u <= 57343) { - var u1 = str.charCodeAt(++i); - u = 65536 + ((u & 1023) << 10) | u1 & 1023; - } - if (u <= 127) { - if (outIdx >= endIdx) - break; - heap[outIdx++] = u; - } else if (u <= 2047) { - if (outIdx + 1 >= endIdx) - break; - heap[outIdx++] = 192 | u >> 6; - heap[outIdx++] = 128 | u & 63; - } else if (u <= 65535) { - if (outIdx + 2 >= endIdx) - break; - heap[outIdx++] = 224 | u >> 12; - heap[outIdx++] = 128 | u >> 6 & 63; - heap[outIdx++] = 128 | u & 63; - } else { - if (outIdx + 3 >= endIdx) - break; - heap[outIdx++] = 240 | u >> 18; - heap[outIdx++] = 128 | u >> 12 & 63; - heap[outIdx++] = 128 | u >> 6 & 63; - heap[outIdx++] = 128 | u & 63; - } - } - heap[outIdx] = 0; - return outIdx - startIdx; - } - function stringToUTF8(str, outPtr, maxBytesToWrite) { - return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); - } - function lengthBytesUTF8(str) { - var len = 0; - for (var i = 0; i < str.length; ++i) { - var u = str.charCodeAt(i); - if (u >= 55296 && u <= 57343) - u = 65536 + ((u & 1023) << 10) | str.charCodeAt(++i) & 1023; - if (u <= 127) - ++len; - else if (u <= 2047) - len += 2; - else if (u <= 65535) - len += 3; - else - len += 4; - } - return len; - } - function allocateUTF8(str) { - var size = lengthBytesUTF8(str) + 1; - var ret = _malloc(size); - if (ret) - stringToUTF8Array(str, HEAP8, ret, size); - return ret; - } - function writeArrayToMemory(array, buffer2) { - HEAP8.set(array, buffer2); - } - function alignUp(x, multiple) { - if (x % multiple > 0) { - x += multiple - x % multiple; - } - return x; - } - var buffer, HEAP8, HEAPU8, HEAP16, HEAP32, HEAPF32, HEAPF64; - function updateGlobalBufferAndViews(buf) { - buffer = buf; - Module["HEAP8"] = HEAP8 = new Int8Array(buf); - Module["HEAP16"] = HEAP16 = new Int16Array(buf); - Module["HEAP32"] = HEAP32 = new Int32Array(buf); - Module["HEAPU8"] = HEAPU8 = new Uint8Array(buf); - Module["HEAPU16"] = new Uint16Array(buf); - Module["HEAPU32"] = new Uint32Array(buf); - Module["HEAPF32"] = HEAPF32 = new Float32Array(buf); - Module["HEAPF64"] = HEAPF64 = new Float64Array(buf); - } - Module["INITIAL_MEMORY"] || 16777216; - var wasmTable; - var __ATPRERUN__ = []; - var __ATINIT__ = []; - var __ATPOSTRUN__ = []; - function preRun() { - if (Module["preRun"]) { - if (typeof Module["preRun"] == "function") - Module["preRun"] = [Module["preRun"]]; - while (Module["preRun"].length) { - addOnPreRun(Module["preRun"].shift()); - } - } - callRuntimeCallbacks(__ATPRERUN__); - } - function initRuntime() { - if (!Module["noFSInit"] && !FS.init.initialized) - FS.init(); - callRuntimeCallbacks(__ATINIT__); - } - function postRun() { - if (Module["postRun"]) { - if (typeof Module["postRun"] == "function") - Module["postRun"] = [Module["postRun"]]; - while (Module["postRun"].length) { - addOnPostRun(Module["postRun"].shift()); - } - } - callRuntimeCallbacks(__ATPOSTRUN__); - } - function addOnPreRun(cb) { - __ATPRERUN__.unshift(cb); - } - function addOnInit(cb) { - __ATINIT__.unshift(cb); - } - function addOnPostRun(cb) { - __ATPOSTRUN__.unshift(cb); - } - var runDependencies = 0; - var dependenciesFulfilled = null; - function addRunDependency(id) { - runDependencies++; - if (Module["monitorRunDependencies"]) { - Module["monitorRunDependencies"](runDependencies); - } - } - function removeRunDependency(id) { - runDependencies--; - if (Module["monitorRunDependencies"]) { - Module["monitorRunDependencies"](runDependencies); - } - if (runDependencies == 0) { - if (dependenciesFulfilled) { - var callback = dependenciesFulfilled; - dependenciesFulfilled = null; - callback(); - } - } - } - Module["preloadedImages"] = {}; - Module["preloadedAudios"] = {}; - function abort(what) { - if (Module["onAbort"]) { - Module["onAbort"](what); - } - what += ""; - err(what); - ABORT = true; - what = "abort(" + what + "). Build with -s ASSERTIONS=1 for more info."; - var e = new WebAssembly.RuntimeError(what); - readyPromiseReject(e); - throw e; - } - var dataURIPrefix = "data:application/octet-stream;base64,"; - function isDataURI(filename) { - return filename.startsWith(dataURIPrefix); - } - var wasmBinaryFile = "data:application/octet-stream;base64,AGFzbQEAAAABlAInYAF/AX9gA39/fwF/YAF/AGACf38Bf2ACf38AYAV/f39/fwF/YAR/f39/AX9gA39/fwBgBH9+f38Bf2AAAX9gBX9/f35/AX5gA39+fwF/YAF/AX5gAn9+AX9gBH9/fn8BfmADf35/AX5gA39/fgF/YAR/f35/AX9gBn9/f39/fwF/YAR/f39/AGADf39+AX5gAn5/AX9gA398fwBgBH9/f38BfmADf39/AX5gBn98f39/fwF/YAV/f35/fwF/YAV/fn9/fwF/YAV/f39/fwBgAn9+AGACf38BfmACf3wAYAh/fn5/f39+fwF/YAV/f39+fwBgAABgBX5+f35/AX5gBX9/f39/AX5gAnx/AXxgAn9+AX4CeRQBYQFhAAIBYQFiAAABYQFjAAMBYQFkAAYBYQFlAAEBYQFmAAABYQFnAAYBYQFoAAABYQFpAAMBYQFqAAMBYQFrAAMBYQFsAAEBYQFtAAABYQFuAAUBYQFvAAEBYQFwAAMBYQFxAAEBYQFyAAABYQFzAAMBYQF0AAADggKAAgcCAgQAAQECAgANBA4EBwICAhwLEw0AFA0dAAAMDAIHHgwQAgIDAwICAQAIAAcIFBUEBgAADAAECAgDAQYAAgIBBgAfFwEBAwITAiAPBgIFEQMFAxgBCAIBAAAHBQEYABoSAQIABwQDIREIAyIGAAEBAwMAIwUbASQHAQsVAQMABQMEAA0bFw0BBAALCwMDDAwAAwAHJQMBAAgaAQECBQMBAgMDAAcHBwICAgImEQsICAsECQoJAgAAAAAAAAkFAAUFBQEGAwYGBgUSBgYBARIBAAIJBgABDgABAQ8ACQEEGQkJCQAAAAMECgoBAQIQAAAAAgEDAwAEAQoFAA4ACQAEBQFwAR8fBQcBAYACgIACBgkBfwFB0KDBAgsHvgI8AXUCAAF2AIABAXcAkwIBeADjAQF5APEBAXoA0QEBQQDQAQFCAM8BAUMAzgEBRADMAQFFAMsBAUYAyQEBRwCSAgFIAJECAUkAjwIBSgCKAgFLAOkBAUwA4gEBTQDhAQFOADwBTwD8AQFQAPkBAVEA+AEBUgDwAQFTAPoBAVQA4AEBVQAVAVYAGAFXAMcBAVgAzQEBWQDfAQFaAN4BAV8A3QEBJADkAQJhYQDcAQJiYQDbAQJjYQDaAQJkYQDZAQJlYQDYAQJmYQDXAQJnYQDqAQJoYQCcAQJpYQDWAQJqYQDVAQJrYQDUAQJsYQAvAm1hABsCbmEAygECb2EASAJwYQEAAnFhAGcCcmEA0wECc2EA6AECdGEA0gECdWEA9wECdmEA9gECd2EA9QECeGEA5wECeWEA5gECemEA5QEJQQEAQQELHsgBkAKNAo4CjAKLArcBiQKIAocChgKFAoQCgwKCAoECgAL/Af4B/QH7AVv0AfMB8gHvAe4B7QHsAesBCu+QCYACQAEBfyMAQRBrIgMgADYCDCADIAE2AgggAyACNgIEIAMoAgwEQCADKAIMIAMoAgg2AgAgAygCDCADKAIENgIECwvMDAEHfwJAIABFDQAgAEEIayIDIABBBGsoAgAiAUF4cSIAaiEFAkAgAUEBcQ0AIAFBA3FFDQEgAyADKAIAIgFrIgNB9JsBKAIASQ0BIAAgAWohACADQfibASgCAEcEQCABQf8BTQRAIAMoAggiAiABQQN2IgRBA3RBjJwBakYaIAIgAygCDCIBRgRAQeSbAUHkmwEoAgBBfiAEd3E2AgAMAwsgAiABNgIMIAEgAjYCCAwCCyADKAIYIQYCQCADIAMoAgwiAUcEQCADKAIIIgIgATYCDCABIAI2AggMAQsCQCADQRRqIgIoAgAiBA0AIANBEGoiAigCACIEDQBBACEBDAELA0AgAiEHIAQiAUEUaiICKAIAIgQNACABQRBqIQIgASgCECIEDQALIAdBADYCAAsgBkUNAQJAIAMgAygCHCICQQJ0QZSeAWoiBCgCAEYEQCAEIAE2AgAgAQ0BQeibAUHomwEoAgBBfiACd3E2AgAMAwsgBkEQQRQgBigCECADRhtqIAE2AgAgAUUNAgsgASAGNgIYIAMoAhAiAgRAIAEgAjYCECACIAE2AhgLIAMoAhQiAkUNASABIAI2AhQgAiABNgIYDAELIAUoAgQiAUEDcUEDRw0AQeybASAANgIAIAUgAUF+cTYCBCADIABBAXI2AgQgACADaiAANgIADwsgAyAFTw0AIAUoAgQiAUEBcUUNAAJAIAFBAnFFBEAgBUH8mwEoAgBGBEBB/JsBIAM2AgBB8JsBQfCbASgCACAAaiIANgIAIAMgAEEBcjYCBCADQfibASgCAEcNA0HsmwFBADYCAEH4mwFBADYCAA8LIAVB+JsBKAIARgRAQfibASADNgIAQeybAUHsmwEoAgAgAGoiADYCACADIABBAXI2AgQgACADaiAANgIADwsgAUF4cSAAaiEAAkAgAUH/AU0EQCAFKAIIIgIgAUEDdiIEQQN0QYycAWpGGiACIAUoAgwiAUYEQEHkmwFB5JsBKAIAQX4gBHdxNgIADAILIAIgATYCDCABIAI2AggMAQsgBSgCGCEGAkAgBSAFKAIMIgFHBEAgBSgCCCICQfSbASgCAEkaIAIgATYCDCABIAI2AggMAQsCQCAFQRRqIgIoAgAiBA0AIAVBEGoiAigCACIEDQBBACEBDAELA0AgAiEHIAQiAUEUaiICKAIAIgQNACABQRBqIQIgASgCECIEDQALIAdBADYCAAsgBkUNAAJAIAUgBSgCHCICQQJ0QZSeAWoiBCgCAEYEQCAEIAE2AgAgAQ0BQeibAUHomwEoAgBBfiACd3E2AgAMAgsgBkEQQRQgBigCECAFRhtqIAE2AgAgAUUNAQsgASAGNgIYIAUoAhAiAgRAIAEgAjYCECACIAE2AhgLIAUoAhQiAkUNACABIAI2AhQgAiABNgIYCyADIABBAXI2AgQgACADaiAANgIAIANB+JsBKAIARw0BQeybASAANgIADwsgBSABQX5xNgIEIAMgAEEBcjYCBCAAIANqIAA2AgALIABB/wFNBEAgAEEDdiIBQQN0QYycAWohAAJ/QeSbASgCACICQQEgAXQiAXFFBEBB5JsBIAEgAnI2AgAgAAwBCyAAKAIICyECIAAgAzYCCCACIAM2AgwgAyAANgIMIAMgAjYCCA8LQR8hAiADQgA3AhAgAEH///8HTQRAIABBCHYiASABQYD+P2pBEHZBCHEiAXQiAiACQYDgH2pBEHZBBHEiAnQiBCAEQYCAD2pBEHZBAnEiBHRBD3YgASACciAEcmsiAUEBdCAAIAFBFWp2QQFxckEcaiECCyADIAI2AhwgAkECdEGUngFqIQECQAJAAkBB6JsBKAIAIgRBASACdCIHcUUEQEHomwEgBCAHcjYCACABIAM2AgAgAyABNgIYDAELIABBAEEZIAJBAXZrIAJBH0YbdCECIAEoAgAhAQNAIAEiBCgCBEF4cSAARg0CIAJBHXYhASACQQF0IQIgBCABQQRxaiIHQRBqKAIAIgENAAsgByADNgIQIAMgBDYCGAsgAyADNgIMIAMgAzYCCAwBCyAEKAIIIgAgAzYCDCAEIAM2AgggA0EANgIYIAMgBDYCDCADIAA2AggLQYScAUGEnAEoAgBBAWsiAEF/IAAbNgIACwtCAQF/IwBBEGsiASQAIAEgADYCDCABKAIMBEAgASgCDC0AAUEBcQRAIAEoAgwoAgQQFQsgASgCDBAVCyABQRBqJAALQwEBfyMAQRBrIgIkACACIAA2AgwgAiABNgIIIAIoAgwCfyMAQRBrIgAgAigCCDYCDCAAKAIMQQxqCxBFIAJBEGokAAuiLgEMfyMAQRBrIgwkAAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAQfQBTQRAQeSbASgCACIFQRAgAEELakF4cSAAQQtJGyIIQQN2IgJ2IgFBA3EEQCABQX9zQQFxIAJqIgNBA3QiAUGUnAFqKAIAIgRBCGohAAJAIAQoAggiAiABQYycAWoiAUYEQEHkmwEgBUF+IAN3cTYCAAwBCyACIAE2AgwgASACNgIICyAEIANBA3QiAUEDcjYCBCABIARqIgEgASgCBEEBcjYCBAwNCyAIQeybASgCACIKTQ0BIAEEQAJAQQIgAnQiAEEAIABrciABIAJ0cSIAQQAgAGtxQQFrIgAgAEEMdkEQcSICdiIBQQV2QQhxIgAgAnIgASAAdiIBQQJ2QQRxIgByIAEgAHYiAUEBdkECcSIAciABIAB2IgFBAXZBAXEiAHIgASAAdmoiA0EDdCIAQZScAWooAgAiBCgCCCIBIABBjJwBaiIARgRAQeSbASAFQX4gA3dxIgU2AgAMAQsgASAANgIMIAAgATYCCAsgBEEIaiEAIAQgCEEDcjYCBCAEIAhqIgIgA0EDdCIBIAhrIgNBAXI2AgQgASAEaiADNgIAIAoEQCAKQQN2IgFBA3RBjJwBaiEHQfibASgCACEEAn8gBUEBIAF0IgFxRQRAQeSbASABIAVyNgIAIAcMAQsgBygCCAshASAHIAQ2AgggASAENgIMIAQgBzYCDCAEIAE2AggLQfibASACNgIAQeybASADNgIADA0LQeibASgCACIGRQ0BIAZBACAGa3FBAWsiACAAQQx2QRBxIgJ2IgFBBXZBCHEiACACciABIAB2IgFBAnZBBHEiAHIgASAAdiIBQQF2QQJxIgByIAEgAHYiAUEBdkEBcSIAciABIAB2akECdEGUngFqKAIAIgEoAgRBeHEgCGshAyABIQIDQAJAIAIoAhAiAEUEQCACKAIUIgBFDQELIAAoAgRBeHEgCGsiAiADIAIgA0kiAhshAyAAIAEgAhshASAAIQIMAQsLIAEgCGoiCSABTQ0CIAEoAhghCyABIAEoAgwiBEcEQCABKAIIIgBB9JsBKAIASRogACAENgIMIAQgADYCCAwMCyABQRRqIgIoAgAiAEUEQCABKAIQIgBFDQQgAUEQaiECCwNAIAIhByAAIgRBFGoiAigCACIADQAgBEEQaiECIAQoAhAiAA0ACyAHQQA2AgAMCwtBfyEIIABBv39LDQAgAEELaiIAQXhxIQhB6JsBKAIAIglFDQBBACAIayEDAkACQAJAAn9BACAIQYACSQ0AGkEfIAhB////B0sNABogAEEIdiIAIABBgP4/akEQdkEIcSICdCIAIABBgOAfakEQdkEEcSIBdCIAIABBgIAPakEQdkECcSIAdEEPdiABIAJyIAByayIAQQF0IAggAEEVanZBAXFyQRxqCyIFQQJ0QZSeAWooAgAiAkUEQEEAIQAMAQtBACEAIAhBAEEZIAVBAXZrIAVBH0YbdCEBA0ACQCACKAIEQXhxIAhrIgcgA08NACACIQQgByIDDQBBACEDIAIhAAwDCyAAIAIoAhQiByAHIAIgAUEddkEEcWooAhAiAkYbIAAgBxshACABQQF0IQEgAg0ACwsgACAEckUEQEECIAV0IgBBACAAa3IgCXEiAEUNAyAAQQAgAGtxQQFrIgAgAEEMdkEQcSICdiIBQQV2QQhxIgAgAnIgASAAdiIBQQJ2QQRxIgByIAEgAHYiAUEBdkECcSIAciABIAB2IgFBAXZBAXEiAHIgASAAdmpBAnRBlJ4BaigCACEACyAARQ0BCwNAIAAoAgRBeHEgCGsiASADSSECIAEgAyACGyEDIAAgBCACGyEEIAAoAhAiAQR/IAEFIAAoAhQLIgANAAsLIARFDQAgA0HsmwEoAgAgCGtPDQAgBCAIaiIGIARNDQEgBCgCGCEFIAQgBCgCDCIBRwRAIAQoAggiAEH0mwEoAgBJGiAAIAE2AgwgASAANgIIDAoLIARBFGoiAigCACIARQRAIAQoAhAiAEUNBCAEQRBqIQILA0AgAiEHIAAiAUEUaiICKAIAIgANACABQRBqIQIgASgCECIADQALIAdBADYCAAwJCyAIQeybASgCACICTQRAQfibASgCACEDAkAgAiAIayIBQRBPBEBB7JsBIAE2AgBB+JsBIAMgCGoiADYCACAAIAFBAXI2AgQgAiADaiABNgIAIAMgCEEDcjYCBAwBC0H4mwFBADYCAEHsmwFBADYCACADIAJBA3I2AgQgAiADaiIAIAAoAgRBAXI2AgQLIANBCGohAAwLCyAIQfCbASgCACIGSQRAQfCbASAGIAhrIgE2AgBB/JsBQfybASgCACICIAhqIgA2AgAgACABQQFyNgIEIAIgCEEDcjYCBCACQQhqIQAMCwtBACEAIAhBL2oiCQJ/QbyfASgCAARAQcSfASgCAAwBC0HInwFCfzcCAEHAnwFCgKCAgICABDcCAEG8nwEgDEEMakFwcUHYqtWqBXM2AgBB0J8BQQA2AgBBoJ8BQQA2AgBBgCALIgFqIgVBACABayIHcSICIAhNDQpBnJ8BKAIAIgQEQEGUnwEoAgAiAyACaiIBIANNDQsgASAESw0LC0GgnwEtAABBBHENBQJAAkBB/JsBKAIAIgMEQEGknwEhAANAIAMgACgCACIBTwRAIAEgACgCBGogA0sNAwsgACgCCCIADQALC0EAED4iAUF/Rg0GIAIhBUHAnwEoAgAiA0EBayIAIAFxBEAgAiABayAAIAFqQQAgA2txaiEFCyAFIAhNDQYgBUH+////B0sNBkGcnwEoAgAiBARAQZSfASgCACIDIAVqIgAgA00NByAAIARLDQcLIAUQPiIAIAFHDQEMCAsgBSAGayAHcSIFQf7///8HSw0FIAUQPiIBIAAoAgAgACgCBGpGDQQgASEACwJAIABBf0YNACAIQTBqIAVNDQBBxJ8BKAIAIgEgCSAFa2pBACABa3EiAUH+////B0sEQCAAIQEMCAsgARA+QX9HBEAgASAFaiEFIAAhAQwIC0EAIAVrED4aDAULIAAiAUF/Rw0GDAQLAAtBACEEDAcLQQAhAQwFCyABQX9HDQILQaCfAUGgnwEoAgBBBHI2AgALIAJB/v///wdLDQEgAhA+IQFBABA+IQAgAUF/Rg0BIABBf0YNASAAIAFNDQEgACABayIFIAhBKGpNDQELQZSfAUGUnwEoAgAgBWoiADYCAEGYnwEoAgAgAEkEQEGYnwEgADYCAAsCQAJAAkBB/JsBKAIAIgcEQEGknwEhAANAIAEgACgCACIDIAAoAgQiAmpGDQIgACgCCCIADQALDAILQfSbASgCACIAQQAgACABTRtFBEBB9JsBIAE2AgALQQAhAEGonwEgBTYCAEGknwEgATYCAEGEnAFBfzYCAEGInAFBvJ8BKAIANgIAQbCfAUEANgIAA0AgAEEDdCIDQZScAWogA0GMnAFqIgI2AgAgA0GYnAFqIAI2AgAgAEEBaiIAQSBHDQALQfCbASAFQShrIgNBeCABa0EHcUEAIAFBCGpBB3EbIgBrIgI2AgBB/JsBIAAgAWoiADYCACAAIAJBAXI2AgQgASADakEoNgIEQYCcAUHMnwEoAgA2AgAMAgsgAC0ADEEIcQ0AIAMgB0sNACABIAdNDQAgACACIAVqNgIEQfybASAHQXggB2tBB3FBACAHQQhqQQdxGyIAaiICNgIAQfCbAUHwmwEoAgAgBWoiASAAayIANgIAIAIgAEEBcjYCBCABIAdqQSg2AgRBgJwBQcyfASgCADYCAAwBC0H0mwEoAgAgAUsEQEH0mwEgATYCAAsgASAFaiECQaSfASEAAkACQAJAAkACQAJAA0AgAiAAKAIARwRAIAAoAggiAA0BDAILCyAALQAMQQhxRQ0BC0GknwEhAANAIAcgACgCACICTwRAIAIgACgCBGoiBCAHSw0DCyAAKAIIIQAMAAsACyAAIAE2AgAgACAAKAIEIAVqNgIEIAFBeCABa0EHcUEAIAFBCGpBB3EbaiIJIAhBA3I2AgQgAkF4IAJrQQdxQQAgAkEIakEHcRtqIgUgCCAJaiIGayECIAUgB0YEQEH8mwEgBjYCAEHwmwFB8JsBKAIAIAJqIgA2AgAgBiAAQQFyNgIEDAMLIAVB+JsBKAIARgRAQfibASAGNgIAQeybAUHsmwEoAgAgAmoiADYCACAGIABBAXI2AgQgACAGaiAANgIADAMLIAUoAgQiAEEDcUEBRgRAIABBeHEhBwJAIABB/wFNBEAgBSgCCCIDIABBA3YiAEEDdEGMnAFqRhogAyAFKAIMIgFGBEBB5JsBQeSbASgCAEF+IAB3cTYCAAwCCyADIAE2AgwgASADNgIIDAELIAUoAhghCAJAIAUgBSgCDCIBRwRAIAUoAggiACABNgIMIAEgADYCCAwBCwJAIAVBFGoiACgCACIDDQAgBUEQaiIAKAIAIgMNAEEAIQEMAQsDQCAAIQQgAyIBQRRqIgAoAgAiAw0AIAFBEGohACABKAIQIgMNAAsgBEEANgIACyAIRQ0AAkAgBSAFKAIcIgNBAnRBlJ4BaiIAKAIARgRAIAAgATYCACABDQFB6JsBQeibASgCAEF+IAN3cTYCAAwCCyAIQRBBFCAIKAIQIAVGG2ogATYCACABRQ0BCyABIAg2AhggBSgCECIABEAgASAANgIQIAAgATYCGAsgBSgCFCIARQ0AIAEgADYCFCAAIAE2AhgLIAUgB2ohBSACIAdqIQILIAUgBSgCBEF+cTYCBCAGIAJBAXI2AgQgAiAGaiACNgIAIAJB/wFNBEAgAkEDdiIAQQN0QYycAWohAgJ/QeSbASgCACIBQQEgAHQiAHFFBEBB5JsBIAAgAXI2AgAgAgwBCyACKAIICyEAIAIgBjYCCCAAIAY2AgwgBiACNgIMIAYgADYCCAwDC0EfIQAgAkH///8HTQRAIAJBCHYiACAAQYD+P2pBEHZBCHEiA3QiACAAQYDgH2pBEHZBBHEiAXQiACAAQYCAD2pBEHZBAnEiAHRBD3YgASADciAAcmsiAEEBdCACIABBFWp2QQFxckEcaiEACyAGIAA2AhwgBkIANwIQIABBAnRBlJ4BaiEEAkBB6JsBKAIAIgNBASAAdCIBcUUEQEHomwEgASADcjYCACAEIAY2AgAgBiAENgIYDAELIAJBAEEZIABBAXZrIABBH0YbdCEAIAQoAgAhAQNAIAEiAygCBEF4cSACRg0DIABBHXYhASAAQQF0IQAgAyABQQRxaiIEKAIQIgENAAsgBCAGNgIQIAYgAzYCGAsgBiAGNgIMIAYgBjYCCAwCC0HwmwEgBUEoayIDQXggAWtBB3FBACABQQhqQQdxGyIAayICNgIAQfybASAAIAFqIgA2AgAgACACQQFyNgIEIAEgA2pBKDYCBEGAnAFBzJ8BKAIANgIAIAcgBEEnIARrQQdxQQAgBEEna0EHcRtqQS9rIgAgACAHQRBqSRsiAkEbNgIEIAJBrJ8BKQIANwIQIAJBpJ8BKQIANwIIQayfASACQQhqNgIAQaifASAFNgIAQaSfASABNgIAQbCfAUEANgIAIAJBGGohAANAIABBBzYCBCAAQQhqIQEgAEEEaiEAIAEgBEkNAAsgAiAHRg0DIAIgAigCBEF+cTYCBCAHIAIgB2siBEEBcjYCBCACIAQ2AgAgBEH/AU0EQCAEQQN2IgBBA3RBjJwBaiECAn9B5JsBKAIAIgFBASAAdCIAcUUEQEHkmwEgACABcjYCACACDAELIAIoAggLIQAgAiAHNgIIIAAgBzYCDCAHIAI2AgwgByAANgIIDAQLQR8hACAHQgA3AhAgBEH///8HTQRAIARBCHYiACAAQYD+P2pBEHZBCHEiAnQiACAAQYDgH2pBEHZBBHEiAXQiACAAQYCAD2pBEHZBAnEiAHRBD3YgASACciAAcmsiAEEBdCAEIABBFWp2QQFxckEcaiEACyAHIAA2AhwgAEECdEGUngFqIQMCQEHomwEoAgAiAkEBIAB0IgFxRQRAQeibASABIAJyNgIAIAMgBzYCACAHIAM2AhgMAQsgBEEAQRkgAEEBdmsgAEEfRht0IQAgAygCACEBA0AgASICKAIEQXhxIARGDQQgAEEddiEBIABBAXQhACACIAFBBHFqIgMoAhAiAQ0ACyADIAc2AhAgByACNgIYCyAHIAc2AgwgByAHNgIIDAMLIAMoAggiACAGNgIMIAMgBjYCCCAGQQA2AhggBiADNgIMIAYgADYCCAsgCUEIaiEADAULIAIoAggiACAHNgIMIAIgBzYCCCAHQQA2AhggByACNgIMIAcgADYCCAtB8JsBKAIAIgAgCE0NAEHwmwEgACAIayIBNgIAQfybAUH8mwEoAgAiAiAIaiIANgIAIAAgAUEBcjYCBCACIAhBA3I2AgQgAkEIaiEADAMLQbSbAUEwNgIAQQAhAAwCCwJAIAVFDQACQCAEKAIcIgJBAnRBlJ4BaiIAKAIAIARGBEAgACABNgIAIAENAUHomwEgCUF+IAJ3cSIJNgIADAILIAVBEEEUIAUoAhAgBEYbaiABNgIAIAFFDQELIAEgBTYCGCAEKAIQIgAEQCABIAA2AhAgACABNgIYCyAEKAIUIgBFDQAgASAANgIUIAAgATYCGAsCQCADQQ9NBEAgBCADIAhqIgBBA3I2AgQgACAEaiIAIAAoAgRBAXI2AgQMAQsgBCAIQQNyNgIEIAYgA0EBcjYCBCADIAZqIAM2AgAgA0H/AU0EQCADQQN2IgBBA3RBjJwBaiECAn9B5JsBKAIAIgFBASAAdCIAcUUEQEHkmwEgACABcjYCACACDAELIAIoAggLIQAgAiAGNgIIIAAgBjYCDCAGIAI2AgwgBiAANgIIDAELQR8hACADQf///wdNBEAgA0EIdiIAIABBgP4/akEQdkEIcSICdCIAIABBgOAfakEQdkEEcSIBdCIAIABBgIAPakEQdkECcSIAdEEPdiABIAJyIAByayIAQQF0IAMgAEEVanZBAXFyQRxqIQALIAYgADYCHCAGQgA3AhAgAEECdEGUngFqIQICQAJAIAlBASAAdCIBcUUEQEHomwEgASAJcjYCACACIAY2AgAgBiACNgIYDAELIANBAEEZIABBAXZrIABBH0YbdCEAIAIoAgAhCANAIAgiASgCBEF4cSADRg0CIABBHXYhAiAAQQF0IQAgASACQQRxaiICKAIQIggNAAsgAiAGNgIQIAYgATYCGAsgBiAGNgIMIAYgBjYCCAwBCyABKAIIIgAgBjYCDCABIAY2AgggBkEANgIYIAYgATYCDCAGIAA2AggLIARBCGohAAwBCwJAIAtFDQACQCABKAIcIgJBAnRBlJ4BaiIAKAIAIAFGBEAgACAENgIAIAQNAUHomwEgBkF+IAJ3cTYCAAwCCyALQRBBFCALKAIQIAFGG2ogBDYCACAERQ0BCyAEIAs2AhggASgCECIABEAgBCAANgIQIAAgBDYCGAsgASgCFCIARQ0AIAQgADYCFCAAIAQ2AhgLAkAgA0EPTQRAIAEgAyAIaiIAQQNyNgIEIAAgAWoiACAAKAIEQQFyNgIEDAELIAEgCEEDcjYCBCAJIANBAXI2AgQgAyAJaiADNgIAIAoEQCAKQQN2IgBBA3RBjJwBaiEEQfibASgCACECAn9BASAAdCIAIAVxRQRAQeSbASAAIAVyNgIAIAQMAQsgBCgCCAshACAEIAI2AgggACACNgIMIAIgBDYCDCACIAA2AggLQfibASAJNgIAQeybASADNgIACyABQQhqIQALIAxBEGokACAAC4MEAQN/IAJBgARPBEAgACABIAIQCxogAA8LIAAgAmohAwJAIAAgAXNBA3FFBEACQCAAQQNxRQRAIAAhAgwBCyACQQFIBEAgACECDAELIAAhAgNAIAIgAS0AADoAACABQQFqIQEgAkEBaiICQQNxRQ0BIAIgA0kNAAsLAkAgA0F8cSIEQcAASQ0AIAIgBEFAaiIFSw0AA0AgAiABKAIANgIAIAIgASgCBDYCBCACIAEoAgg2AgggAiABKAIMNgIMIAIgASgCEDYCECACIAEoAhQ2AhQgAiABKAIYNgIYIAIgASgCHDYCHCACIAEoAiA2AiAgAiABKAIkNgIkIAIgASgCKDYCKCACIAEoAiw2AiwgAiABKAIwNgIwIAIgASgCNDYCNCACIAEoAjg2AjggAiABKAI8NgI8IAFBQGshASACQUBrIgIgBU0NAAsLIAIgBE8NAQNAIAIgASgCADYCACABQQRqIQEgAkEEaiICIARJDQALDAELIANBBEkEQCAAIQIMAQsgACADQQRrIgRLBEAgACECDAELIAAhAgNAIAIgAS0AADoAACACIAEtAAE6AAEgAiABLQACOgACIAIgAS0AAzoAAyABQQRqIQEgAkEEaiICIARNDQALCyACIANJBEADQCACIAEtAAA6AAAgAUEBaiEBIAJBAWoiAiADRw0ACwsgAAvBGAECfyMAQRBrIgQkACAEIAA2AgwgBCABNgIIIAQgAjYCBCAEKAIMIQAgBCgCCCECIAQoAgQhAyMAQSBrIgEkACABIAA2AhggASACNgIUIAEgAzYCEAJAIAEoAhRFBEAgAUEANgIcDAELIAFBATYCDCABLQAMBEAgASgCFCECIAEoAhAhAyMAQSBrIgAgASgCGDYCHCAAIAI2AhggACADNgIUIAAgACgCHDYCECAAIAAoAhBBf3M2AhADQCAAKAIUBH8gACgCGEEDcUEARwVBAAtBAXEEQCAAKAIQIQIgACAAKAIYIgNBAWo2AhggACADLQAAIAJzQf8BcUECdEGgGWooAgAgACgCEEEIdnM2AhAgACAAKAIUQQFrNgIUDAELCyAAIAAoAhg2AgwDQCAAKAIUQSBPBEAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGgGWooAgAgACgCEEEQdkH/AXFBAnRBoCFqKAIAIAAoAhBB/wFxQQJ0QaAxaigCACAAKAIQQQh2Qf8BcUECdEGgKWooAgBzc3M2AhAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGgGWooAgAgACgCEEEQdkH/AXFBAnRBoCFqKAIAIAAoAhBB/wFxQQJ0QaAxaigCACAAKAIQQQh2Qf8BcUECdEGgKWooAgBzc3M2AhAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGgGWooAgAgACgCEEEQdkH/AXFBAnRBoCFqKAIAIAAoAhBB/wFxQQJ0QaAxaigCACAAKAIQQQh2Qf8BcUECdEGgKWooAgBzc3M2AhAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGgGWooAgAgACgCEEEQdkH/AXFBAnRBoCFqKAIAIAAoAhBB/wFxQQJ0QaAxaigCACAAKAIQQQh2Qf8BcUECdEGgKWooAgBzc3M2AhAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGgGWooAgAgACgCEEEQdkH/AXFBAnRBoCFqKAIAIAAoAhBB/wFxQQJ0QaAxaigCACAAKAIQQQh2Qf8BcUECdEGgKWooAgBzc3M2AhAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGgGWooAgAgACgCEEEQdkH/AXFBAnRBoCFqKAIAIAAoAhBB/wFxQQJ0QaAxaigCACAAKAIQQQh2Qf8BcUECdEGgKWooAgBzc3M2AhAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGgGWooAgAgACgCEEEQdkH/AXFBAnRBoCFqKAIAIAAoAhBB/wFxQQJ0QaAxaigCACAAKAIQQQh2Qf8BcUECdEGgKWooAgBzc3M2AhAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGgGWooAgAgACgCEEEQdkH/AXFBAnRBoCFqKAIAIAAoAhBB/wFxQQJ0QaAxaigCACAAKAIQQQh2Qf8BcUECdEGgKWooAgBzc3M2AhAgACAAKAIUQSBrNgIUDAELCwNAIAAoAhRBBE8EQCAAIAAoAgwiAkEEajYCDCAAIAIoAgAgACgCEHM2AhAgACAAKAIQQRh2QQJ0QaAZaigCACAAKAIQQRB2Qf8BcUECdEGgIWooAgAgACgCEEH/AXFBAnRBoDFqKAIAIAAoAhBBCHZB/wFxQQJ0QaApaigCAHNzczYCECAAIAAoAhRBBGs2AhQMAQsLIAAgACgCDDYCGCAAKAIUBEADQCAAKAIQIQIgACAAKAIYIgNBAWo2AhggACADLQAAIAJzQf8BcUECdEGgGWooAgAgACgCEEEIdnM2AhAgACAAKAIUQQFrIgI2AhQgAg0ACwsgACAAKAIQQX9zNgIQIAEgACgCEDYCHAwBCyABKAIUIQIgASgCECEDIwBBIGsiACABKAIYNgIcIAAgAjYCGCAAIAM2AhQgACAAKAIcQQh2QYD+A3EgACgCHEEYdmogACgCHEGA/gNxQQh0aiAAKAIcQf8BcUEYdGo2AhAgACAAKAIQQX9zNgIQA0AgACgCFAR/IAAoAhhBA3FBAEcFQQALQQFxBEAgACgCEEEYdiECIAAgACgCGCIDQQFqNgIYIAAgAy0AACACc0ECdEGgOWooAgAgACgCEEEIdHM2AhAgACAAKAIUQQFrNgIUDAELCyAAIAAoAhg2AgwDQCAAKAIUQSBPBEAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGg0QBqKAIAIAAoAhBBEHZB/wFxQQJ0QaDJAGooAgAgACgCEEH/AXFBAnRBoDlqKAIAIAAoAhBBCHZB/wFxQQJ0QaDBAGooAgBzc3M2AhAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGg0QBqKAIAIAAoAhBBEHZB/wFxQQJ0QaDJAGooAgAgACgCEEH/AXFBAnRBoDlqKAIAIAAoAhBBCHZB/wFxQQJ0QaDBAGooAgBzc3M2AhAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGg0QBqKAIAIAAoAhBBEHZB/wFxQQJ0QaDJAGooAgAgACgCEEH/AXFBAnRBoDlqKAIAIAAoAhBBCHZB/wFxQQJ0QaDBAGooAgBzc3M2AhAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGg0QBqKAIAIAAoAhBBEHZB/wFxQQJ0QaDJAGooAgAgACgCEEH/AXFBAnRBoDlqKAIAIAAoAhBBCHZB/wFxQQJ0QaDBAGooAgBzc3M2AhAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGg0QBqKAIAIAAoAhBBEHZB/wFxQQJ0QaDJAGooAgAgACgCEEH/AXFBAnRBoDlqKAIAIAAoAhBBCHZB/wFxQQJ0QaDBAGooAgBzc3M2AhAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGg0QBqKAIAIAAoAhBBEHZB/wFxQQJ0QaDJAGooAgAgACgCEEH/AXFBAnRBoDlqKAIAIAAoAhBBCHZB/wFxQQJ0QaDBAGooAgBzc3M2AhAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGg0QBqKAIAIAAoAhBBEHZB/wFxQQJ0QaDJAGooAgAgACgCEEH/AXFBAnRBoDlqKAIAIAAoAhBBCHZB/wFxQQJ0QaDBAGooAgBzc3M2AhAgACAAKAIMIgJBBGo2AgwgACACKAIAIAAoAhBzNgIQIAAgACgCEEEYdkECdEGg0QBqKAIAIAAoAhBBEHZB/wFxQQJ0QaDJAGooAgAgACgCEEH/AXFBAnRBoDlqKAIAIAAoAhBBCHZB/wFxQQJ0QaDBAGooAgBzc3M2AhAgACAAKAIUQSBrNgIUDAELCwNAIAAoAhRBBE8EQCAAIAAoAgwiAkEEajYCDCAAIAIoAgAgACgCEHM2AhAgACAAKAIQQRh2QQJ0QaDRAGooAgAgACgCEEEQdkH/AXFBAnRBoMkAaigCACAAKAIQQf8BcUECdEGgOWooAgAgACgCEEEIdkH/AXFBAnRBoMEAaigCAHNzczYCECAAIAAoAhRBBGs2AhQMAQsLIAAgACgCDDYCGCAAKAIUBEADQCAAKAIQQRh2IQIgACAAKAIYIgNBAWo2AhggACADLQAAIAJzQQJ0QaA5aigCACAAKAIQQQh0czYCECAAIAAoAhRBAWsiAjYCFCACDQALCyAAIAAoAhBBf3M2AhAgASAAKAIQQQh2QYD+A3EgACgCEEEYdmogACgCEEGA/gNxQQh0aiAAKAIQQf8BcUEYdGo2AhwLIAEoAhwhACABQSBqJAAgBEEQaiQAIAAL7AIBAn8jAEEQayIBJAAgASAANgIMAkAgASgCDEUNACABKAIMKAIwBEAgASgCDCIAIAAoAjBBAWs2AjALIAEoAgwoAjANACABKAIMKAIgBEAgASgCDEEBNgIgIAEoAgwQLxoLIAEoAgwoAiRBAUYEQCABKAIMEGILAkAgASgCDCgCLEUNACABKAIMLQAoQQFxDQAgASgCDCECIwBBEGsiACABKAIMKAIsNgIMIAAgAjYCCCAAQQA2AgQDQCAAKAIEIAAoAgwoAkRJBEAgACgCDCgCTCAAKAIEQQJ0aigCACAAKAIIRgRAIAAoAgwoAkwgACgCBEECdGogACgCDCgCTCAAKAIMKAJEQQFrQQJ0aigCADYCACAAKAIMIgAgACgCREEBazYCRAUgACAAKAIEQQFqNgIEDAILCwsLIAEoAgxBAEIAQQUQIBogASgCDCgCAARAIAEoAgwoAgAQGwsgASgCDBAVCyABQRBqJAALnwIBAn8jAEEQayIBJAAgASAANgIMIAEgASgCDCgCHDYCBCABKAIEIQIjAEEQayIAJAAgACACNgIMIAAoAgwQvAEgAEEQaiQAIAEgASgCBCgCFDYCCCABKAIIIAEoAgwoAhBLBEAgASABKAIMKAIQNgIICwJAIAEoAghFDQAgASgCDCgCDCABKAIEKAIQIAEoAggQGRogASgCDCIAIAEoAgggACgCDGo2AgwgASgCBCIAIAEoAgggACgCEGo2AhAgASgCDCIAIAEoAgggACgCFGo2AhQgASgCDCIAIAAoAhAgASgCCGs2AhAgASgCBCIAIAAoAhQgASgCCGs2AhQgASgCBCgCFA0AIAEoAgQgASgCBCgCCDYCEAsgAUEQaiQAC2ABAX8jAEEQayIBJAAgASAANgIIIAEgASgCCEICEB42AgQCQCABKAIERQRAIAFBADsBDgwBCyABIAEoAgQtAAAgASgCBC0AAUEIdGo7AQ4LIAEvAQ4hACABQRBqJAAgAAvpAQEBfyMAQSBrIgIkACACIAA2AhwgAiABNwMQIAIpAxAhASMAQSBrIgAgAigCHDYCGCAAIAE3AxACQAJAAkAgACgCGC0AAEEBcUUNACAAKQMQIAAoAhgpAxAgACkDEHxWDQAgACgCGCkDCCAAKAIYKQMQIAApAxB8Wg0BCyAAKAIYQQA6AAAgAEEANgIcDAELIAAgACgCGCgCBCAAKAIYKQMQp2o2AgwgACAAKAIMNgIcCyACIAAoAhw2AgwgAigCDARAIAIoAhwiACACKQMQIAApAxB8NwMQCyACKAIMIQAgAkEgaiQAIAALbwEBfyMAQRBrIgIkACACIAA2AgggAiABOwEGIAIgAigCCEICEB42AgACQCACKAIARQRAIAJBfzYCDAwBCyACKAIAIAIvAQY6AAAgAigCACACLwEGQQh2OgABIAJBADYCDAsgAigCDBogAkEQaiQAC7YCAQF/IwBBMGsiBCQAIAQgADYCJCAEIAE2AiAgBCACNwMYIAQgAzYCFAJAIAQoAiQpAxhCASAEKAIUrYaDUARAIAQoAiRBDGpBHEEAEBQgBEJ/NwMoDAELAkAgBCgCJCgCAEUEQCAEIAQoAiQoAgggBCgCICAEKQMYIAQoAhQgBCgCJCgCBBEOADcDCAwBCyAEIAQoAiQoAgAgBCgCJCgCCCAEKAIgIAQpAxggBCgCFCAEKAIkKAIEEQoANwMICyAEKQMIQgBTBEACQCAEKAIUQQRGDQAgBCgCFEEORg0AAkAgBCgCJCAEQghBBBAgQgBTBEAgBCgCJEEMakEUQQAQFAwBCyAEKAIkQQxqIAQoAgAgBCgCBBAUCwsLIAQgBCkDCDcDKAsgBCkDKCECIARBMGokACACC48BAQF/IwBBEGsiAiQAIAIgADYCCCACIAE2AgQgAiACKAIIQgQQHjYCAAJAIAIoAgBFBEAgAkF/NgIMDAELIAIoAgAgAigCBDoAACACKAIAIAIoAgRBCHY6AAEgAigCACACKAIEQRB2OgACIAIoAgAgAigCBEEYdjoAAyACQQA2AgwLIAIoAgwaIAJBEGokAAsXACAALQAAQSBxRQRAIAEgAiAAEHEaCwtQAQF/IwBBEGsiASQAIAEgADYCDANAIAEoAgwEQCABIAEoAgwoAgA2AgggASgCDCgCDBAVIAEoAgwQFSABIAEoAgg2AgwMAQsLIAFBEGokAAs+AQF/IwBBEGsiASQAIAEgADYCDCABKAIMBEAgASgCDCgCABAVIAEoAgwoAgwQFSABKAIMEBULIAFBEGokAAt9AQF/IwBBEGsiASQAIAEgADYCDCABKAIMBEAgAUIANwMAA0AgASkDACABKAIMKQMIWkUEQCABKAIMKAIAIAEpAwCnQQR0ahB3IAEgASkDAEIBfDcDAAwBCwsgASgCDCgCABAVIAEoAgwoAigQJCABKAIMEBULIAFBEGokAAtuAQF/IwBBgAJrIgUkAAJAIARBgMAEcQ0AIAIgA0wNACAFIAFB/wFxIAIgA2siAkGAAiACQYACSSIBGxAzIAFFBEADQCAAIAVBgAIQIiACQYACayICQf8BSw0ACwsgACAFIAIQIgsgBUGAAmokAAvRAQEBfyMAQTBrIgMkACADIAA2AiggAyABNwMgIAMgAjYCHAJAIAMoAigtAChBAXEEQCADQX82AiwMAQsCQCADKAIoKAIgBEAgAygCHEUNASADKAIcQQFGDQEgAygCHEECRg0BCyADKAIoQQxqQRJBABAUIANBfzYCLAwBCyADIAMpAyA3AwggAyADKAIcNgIQIAMoAiggA0EIakIQQQYQIEIAUwRAIANBfzYCLAwBCyADKAIoQQA6ADQgA0EANgIsCyADKAIsIQAgA0EwaiQAIAALmBcBAn8jAEEwayIEJAAgBCAANgIsIAQgATYCKCAEIAI2AiQgBCADNgIgIARBADYCFAJAIAQoAiwoAoQBQQBKBEAgBCgCLCgCACgCLEECRgRAIwBBEGsiACAEKAIsNgIIIABB/4D/n382AgQgAEEANgIAAkADQCAAKAIAQR9MBEACQCAAKAIEQQFxRQ0AIAAoAghBlAFqIAAoAgBBAnRqLwEARQ0AIABBADYCDAwDCyAAIAAoAgBBAWo2AgAgACAAKAIEQQF2NgIEDAELCwJAAkAgACgCCC8BuAENACAAKAIILwG8AQ0AIAAoAggvAcgBRQ0BCyAAQQE2AgwMAQsgAEEgNgIAA0AgACgCAEGAAkgEQCAAKAIIQZQBaiAAKAIAQQJ0ai8BAARAIABBATYCDAwDBSAAIAAoAgBBAWo2AgAMAgsACwsgAEEANgIMCyAAKAIMIQAgBCgCLCgCACAANgIsCyAEKAIsIAQoAixBmBZqEHogBCgCLCAEKAIsQaQWahB6IAQoAiwhASMAQRBrIgAkACAAIAE2AgwgACgCDCAAKAIMQZQBaiAAKAIMKAKcFhC6ASAAKAIMIAAoAgxBiBNqIAAoAgwoAqgWELoBIAAoAgwgACgCDEGwFmoQeiAAQRI2AggDQAJAIAAoAghBA0gNACAAKAIMQfwUaiAAKAIILQDgbEECdGovAQINACAAIAAoAghBAWs2AggMAQsLIAAoAgwiASABKAKoLSAAKAIIQQNsQRFqajYCqC0gACgCCCEBIABBEGokACAEIAE2AhQgBCAEKAIsKAKoLUEKakEDdjYCHCAEIAQoAiwoAqwtQQpqQQN2NgIYIAQoAhggBCgCHE0EQCAEIAQoAhg2AhwLDAELIAQgBCgCJEEFaiIANgIYIAQgADYCHAsCQAJAIAQoAhwgBCgCJEEEakkNACAEKAIoRQ0AIAQoAiwgBCgCKCAEKAIkIAQoAiAQXQwBCwJAAkAgBCgCLCgCiAFBBEcEQCAEKAIYIAQoAhxHDQELIARBAzYCEAJAIAQoAiwoArwtQRAgBCgCEGtKBEAgBCAEKAIgQQJqNgIMIAQoAiwiACAALwG4LSAEKAIMQf//A3EgBCgCLCgCvC10cjsBuC0gBCgCLC8BuC1B/wFxIQEgBCgCLCgCCCECIAQoAiwiAygCFCEAIAMgAEEBajYCFCAAIAJqIAE6AAAgBCgCLC8BuC1BCHYhASAEKAIsKAIIIQIgBCgCLCIDKAIUIQAgAyAAQQFqNgIUIAAgAmogAToAACAEKAIsIAQoAgxB//8DcUEQIAQoAiwoArwta3U7AbgtIAQoAiwiACAAKAK8LSAEKAIQQRBrajYCvC0MAQsgBCgCLCIAIAAvAbgtIAQoAiBBAmpB//8DcSAEKAIsKAK8LXRyOwG4LSAEKAIsIgAgBCgCECAAKAK8LWo2ArwtCyAEKAIsQZDgAEGQ6QAQuwEMAQsgBEEDNgIIAkAgBCgCLCgCvC1BECAEKAIIa0oEQCAEIAQoAiBBBGo2AgQgBCgCLCIAIAAvAbgtIAQoAgRB//8DcSAEKAIsKAK8LXRyOwG4LSAEKAIsLwG4LUH/AXEhASAEKAIsKAIIIQIgBCgCLCIDKAIUIQAgAyAAQQFqNgIUIAAgAmogAToAACAEKAIsLwG4LUEIdiEBIAQoAiwoAgghAiAEKAIsIgMoAhQhACADIABBAWo2AhQgACACaiABOgAAIAQoAiwgBCgCBEH//wNxQRAgBCgCLCgCvC1rdTsBuC0gBCgCLCIAIAAoArwtIAQoAghBEGtqNgK8LQwBCyAEKAIsIgAgAC8BuC0gBCgCIEEEakH//wNxIAQoAiwoArwtdHI7AbgtIAQoAiwiACAEKAIIIAAoArwtajYCvC0LIAQoAiwhASAEKAIsKAKcFkEBaiECIAQoAiwoAqgWQQFqIQMgBCgCFEEBaiEFIwBBQGoiACQAIAAgATYCPCAAIAI2AjggACADNgI0IAAgBTYCMCAAQQU2AigCQCAAKAI8KAK8LUEQIAAoAihrSgRAIAAgACgCOEGBAms2AiQgACgCPCIBIAEvAbgtIAAoAiRB//8DcSAAKAI8KAK8LXRyOwG4LSAAKAI8LwG4LUH/AXEhAiAAKAI8KAIIIQMgACgCPCIFKAIUIQEgBSABQQFqNgIUIAEgA2ogAjoAACAAKAI8LwG4LUEIdiECIAAoAjwoAgghAyAAKAI8IgUoAhQhASAFIAFBAWo2AhQgASADaiACOgAAIAAoAjwgACgCJEH//wNxQRAgACgCPCgCvC1rdTsBuC0gACgCPCIBIAEoArwtIAAoAihBEGtqNgK8LQwBCyAAKAI8IgEgAS8BuC0gACgCOEGBAmtB//8DcSAAKAI8KAK8LXRyOwG4LSAAKAI8IgEgACgCKCABKAK8LWo2ArwtCyAAQQU2AiACQCAAKAI8KAK8LUEQIAAoAiBrSgRAIAAgACgCNEEBazYCHCAAKAI8IgEgAS8BuC0gACgCHEH//wNxIAAoAjwoArwtdHI7AbgtIAAoAjwvAbgtQf8BcSECIAAoAjwoAgghAyAAKAI8IgUoAhQhASAFIAFBAWo2AhQgASADaiACOgAAIAAoAjwvAbgtQQh2IQIgACgCPCgCCCEDIAAoAjwiBSgCFCEBIAUgAUEBajYCFCABIANqIAI6AAAgACgCPCAAKAIcQf//A3FBECAAKAI8KAK8LWt1OwG4LSAAKAI8IgEgASgCvC0gACgCIEEQa2o2ArwtDAELIAAoAjwiASABLwG4LSAAKAI0QQFrQf//A3EgACgCPCgCvC10cjsBuC0gACgCPCIBIAAoAiAgASgCvC1qNgK8LQsgAEEENgIYAkAgACgCPCgCvC1BECAAKAIYa0oEQCAAIAAoAjBBBGs2AhQgACgCPCIBIAEvAbgtIAAoAhRB//8DcSAAKAI8KAK8LXRyOwG4LSAAKAI8LwG4LUH/AXEhAiAAKAI8KAIIIQMgACgCPCIFKAIUIQEgBSABQQFqNgIUIAEgA2ogAjoAACAAKAI8LwG4LUEIdiECIAAoAjwoAgghAyAAKAI8IgUoAhQhASAFIAFBAWo2AhQgASADaiACOgAAIAAoAjwgACgCFEH//wNxQRAgACgCPCgCvC1rdTsBuC0gACgCPCIBIAEoArwtIAAoAhhBEGtqNgK8LQwBCyAAKAI8IgEgAS8BuC0gACgCMEEEa0H//wNxIAAoAjwoArwtdHI7AbgtIAAoAjwiASAAKAIYIAEoArwtajYCvC0LIABBADYCLANAIAAoAiwgACgCMEgEQCAAQQM2AhACQCAAKAI8KAK8LUEQIAAoAhBrSgRAIAAgACgCPEH8FGogACgCLC0A4GxBAnRqLwECNgIMIAAoAjwiASABLwG4LSAAKAIMQf//A3EgACgCPCgCvC10cjsBuC0gACgCPC8BuC1B/wFxIQIgACgCPCgCCCEDIAAoAjwiBSgCFCEBIAUgAUEBajYCFCABIANqIAI6AAAgACgCPC8BuC1BCHYhAiAAKAI8KAIIIQMgACgCPCIFKAIUIQEgBSABQQFqNgIUIAEgA2ogAjoAACAAKAI8IAAoAgxB//8DcUEQIAAoAjwoArwta3U7AbgtIAAoAjwiASABKAK8LSAAKAIQQRBrajYCvC0MAQsgACgCPCIBIAEvAbgtIAAoAjxB/BRqIAAoAiwtAOBsQQJ0ai8BAiAAKAI8KAK8LXRyOwG4LSAAKAI8IgEgACgCECABKAK8LWo2ArwtCyAAIAAoAixBAWo2AiwMAQsLIAAoAjwgACgCPEGUAWogACgCOEEBaxC5ASAAKAI8IAAoAjxBiBNqIAAoAjRBAWsQuQEgAEFAayQAIAQoAiwgBCgCLEGUAWogBCgCLEGIE2oQuwELCyAEKAIsEL4BIAQoAiAEQCAEKAIsEL0BCyAEQTBqJAAL1AEBAX8jAEEgayICJAAgAiAANgIYIAIgATcDECACIAIoAhhFOgAPAkAgAigCGEUEQCACIAIpAxCnEBgiADYCGCAARQRAIAJBADYCHAwCCwsgAkEYEBgiADYCCCAARQRAIAItAA9BAXEEQCACKAIYEBULIAJBADYCHAwBCyACKAIIQQE6AAAgAigCCCACKAIYNgIEIAIoAgggAikDEDcDCCACKAIIQgA3AxAgAigCCCACLQAPQQFxOgABIAIgAigCCDYCHAsgAigCHCEAIAJBIGokACAAC3gBAX8jAEEQayIBJAAgASAANgIIIAEgASgCCEIEEB42AgQCQCABKAIERQRAIAFBADYCDAwBCyABIAEoAgQtAAAgASgCBC0AASABKAIELQACIAEoAgQtAANBCHRqQQh0akEIdGo2AgwLIAEoAgwhACABQRBqJAAgAAuHAwEBfyMAQTBrIgMkACADIAA2AiQgAyABNgIgIAMgAjcDGAJAIAMoAiQtAChBAXEEQCADQn83AygMAQsCQAJAIAMoAiQoAiBFDQAgAykDGEL///////////8AVg0AIAMpAxhQDQEgAygCIA0BCyADKAIkQQxqQRJBABAUIANCfzcDKAwBCyADKAIkLQA1QQFxBEAgA0J/NwMoDAELAn8jAEEQayIAIAMoAiQ2AgwgACgCDC0ANEEBcQsEQCADQgA3AygMAQsgAykDGFAEQCADQgA3AygMAQsgA0IANwMQA0AgAykDECADKQMYVARAIAMgAygCJCADKAIgIAMpAxCnaiADKQMYIAMpAxB9QQEQICICNwMIIAJCAFMEQCADKAIkQQE6ADUgAykDEFAEQCADQn83AygMBAsgAyADKQMQNwMoDAMLIAMpAwhQBEAgAygCJEEBOgA0BSADIAMpAwggAykDEHw3AxAMAgsLCyADIAMpAxA3AygLIAMpAyghAiADQTBqJAAgAgthAQF/IwBBEGsiAiAANgIIIAIgATcDAAJAIAIpAwAgAigCCCkDCFYEQCACKAIIQQA6AAAgAkF/NgIMDAELIAIoAghBAToAACACKAIIIAIpAwA3AxAgAkEANgIMCyACKAIMC+8BAQF/IwBBIGsiAiQAIAIgADYCGCACIAE3AxAgAiACKAIYQggQHjYCDAJAIAIoAgxFBEAgAkF/NgIcDAELIAIoAgwgAikDEEL/AYM8AAAgAigCDCACKQMQQgiIQv8BgzwAASACKAIMIAIpAxBCEIhC/wGDPAACIAIoAgwgAikDEEIYiEL/AYM8AAMgAigCDCACKQMQQiCIQv8BgzwABCACKAIMIAIpAxBCKIhC/wGDPAAFIAIoAgwgAikDEEIwiEL/AYM8AAYgAigCDCACKQMQQjiIQv8BgzwAByACQQA2AhwLIAIoAhwaIAJBIGokAAt/AQN/IAAhAQJAIABBA3EEQANAIAEtAABFDQIgAUEBaiIBQQNxDQALCwNAIAEiAkEEaiEBIAIoAgAiA0F/cyADQYGChAhrcUGAgYKEeHFFDQALIANB/wFxRQRAIAIgAGsPCwNAIAItAAEhAyACQQFqIgEhAiADDQALCyABIABrC6YBAQF/IwBBEGsiASQAIAEgADYCCAJAIAEoAggoAiBFBEAgASgCCEEMakESQQAQFCABQX82AgwMAQsgASgCCCIAIAAoAiBBAWs2AiAgASgCCCgCIEUEQCABKAIIQQBCAEECECAaIAEoAggoAgAEQCABKAIIKAIAEC9BAEgEQCABKAIIQQxqQRRBABAUCwsLIAFBADYCDAsgASgCDCEAIAFBEGokACAACzYBAX8jAEEQayIBIAA2AgwCfiABKAIMLQAAQQFxBEAgASgCDCkDCCABKAIMKQMQfQwBC0IACwuyAQIBfwF+IwBBEGsiASQAIAEgADYCBCABIAEoAgRCCBAeNgIAAkAgASgCAEUEQCABQgA3AwgMAQsgASABKAIALQAArSABKAIALQAHrUI4hiABKAIALQAGrUIwhnwgASgCAC0ABa1CKIZ8IAEoAgAtAAStQiCGfCABKAIALQADrUIYhnwgASgCAC0AAq1CEIZ8IAEoAgAtAAGtQgiGfHw3AwgLIAEpAwghAiABQRBqJAAgAgvcAQEBfyMAQRBrIgEkACABIAA2AgwgASgCDARAIAEoAgwoAigEQCABKAIMKAIoQQA2AiggASgCDCgCKEIANwMgIAEoAgwCfiABKAIMKQMYIAEoAgwpAyBWBEAgASgCDCkDGAwBCyABKAIMKQMgCzcDGAsgASABKAIMKQMYNwMAA0AgASkDACABKAIMKQMIWkUEQCABKAIMKAIAIAEpAwCnQQR0aigCABAVIAEgASkDAEIBfDcDAAwBCwsgASgCDCgCABAVIAEoAgwoAgQQFSABKAIMEBULIAFBEGokAAvwAgICfwF+AkAgAkUNACAAIAJqIgNBAWsgAToAACAAIAE6AAAgAkEDSQ0AIANBAmsgAToAACAAIAE6AAEgA0EDayABOgAAIAAgAToAAiACQQdJDQAgA0EEayABOgAAIAAgAToAAyACQQlJDQAgAEEAIABrQQNxIgRqIgMgAUH/AXFBgYKECGwiADYCACADIAIgBGtBfHEiAmoiAUEEayAANgIAIAJBCUkNACADIAA2AgggAyAANgIEIAFBCGsgADYCACABQQxrIAA2AgAgAkEZSQ0AIAMgADYCGCADIAA2AhQgAyAANgIQIAMgADYCDCABQRBrIAA2AgAgAUEUayAANgIAIAFBGGsgADYCACABQRxrIAA2AgAgAiADQQRxQRhyIgFrIgJBIEkNACAArUKBgICAEH4hBSABIANqIQEDQCABIAU3AxggASAFNwMQIAEgBTcDCCABIAU3AwAgAUEgaiEBIAJBIGsiAkEfSw0ACwsLawEBfyMAQSBrIgIgADYCHCACQgEgAigCHK2GNwMQIAJBDGogATYCAANAIAIgAigCDCIAQQRqNgIMIAIgACgCADYCCCACKAIIQQBIRQRAIAIgAikDEEIBIAIoAgithoQ3AxAMAQsLIAIpAxALYAIBfwF+IwBBEGsiASQAIAEgADYCBAJAIAEoAgQoAiRBAUcEQCABKAIEQQxqQRJBABAUIAFCfzcDCAwBCyABIAEoAgRBAEIAQQ0QIDcDCAsgASkDCCECIAFBEGokACACC6UCAQJ/IwBBIGsiAyQAIAMgADYCGCADIAE2AhQgAyACNwMIIAMoAhgoAgAhASADKAIUIQQgAykDCCECIwBBIGsiACQAIAAgATYCFCAAIAQ2AhAgACACNwMIAkACQCAAKAIUKAIkQQFGBEAgACkDCEL///////////8AWA0BCyAAKAIUQQxqQRJBABAUIABCfzcDGAwBCyAAIAAoAhQgACgCECAAKQMIQQsQIDcDGAsgACkDGCECIABBIGokACADIAI3AwACQCACQgBTBEAgAygCGEEIaiADKAIYKAIAEBcgA0F/NgIcDAELIAMpAwAgAykDCFIEQCADKAIYQQhqQQZBGxAUIANBfzYCHAwBCyADQQA2AhwLIAMoAhwhACADQSBqJAAgAAsxAQF/IwBBEGsiASQAIAEgADYCDCABKAIMBEAgASgCDBBSIAEoAgwQFQsgAUEQaiQACy8BAX8jAEEQayIBJAAgASAANgIMIAEoAgwoAggQFSABKAIMQQA2AgggAUEQaiQAC80BAQF/IwBBEGsiAiQAIAIgADYCCCACIAE2AgQCQCACKAIILQAoQQFxBEAgAkF/NgIMDAELIAIoAgRFBEAgAigCCEEMakESQQAQFCACQX82AgwMAQsgAigCBBA7IAIoAggoAgAEQCACKAIIKAIAIAIoAgQQOUEASARAIAIoAghBDGogAigCCCgCABAXIAJBfzYCDAwCCwsgAigCCCACKAIEQjhBAxAgQgBTBEAgAkF/NgIMDAELIAJBADYCDAsgAigCDCEAIAJBEGokACAAC98EAQF/IwBBIGsiAiAANgIYIAIgATYCFAJAIAIoAhhFBEAgAkEBNgIcDAELIAIgAigCGCgCADYCDAJAIAIoAhgoAggEQCACIAIoAhgoAgg2AhAMAQsgAkEBNgIQIAJBADYCCANAAkAgAigCCCACKAIYLwEETw0AAkAgAigCDCACKAIIai0AAEEfSwRAIAIoAgwgAigCCGotAABBgAFJDQELIAIoAgwgAigCCGotAABBDUYNACACKAIMIAIoAghqLQAAQQpGDQAgAigCDCACKAIIai0AAEEJRgRADAELIAJBAzYCEAJAIAIoAgwgAigCCGotAABB4AFxQcABRgRAIAJBATYCAAwBCwJAIAIoAgwgAigCCGotAABB8AFxQeABRgRAIAJBAjYCAAwBCwJAIAIoAgwgAigCCGotAABB+AFxQfABRgRAIAJBAzYCAAwBCyACQQQ2AhAMBAsLCyACKAIYLwEEIAIoAgggAigCAGpNBEAgAkEENgIQDAILIAJBATYCBANAIAIoAgQgAigCAE0EQCACKAIMIAIoAgggAigCBGpqLQAAQcABcUGAAUcEQCACQQQ2AhAMBgUgAiACKAIEQQFqNgIEDAILAAsLIAIgAigCACACKAIIajYCCAsgAiACKAIIQQFqNgIIDAELCwsgAigCGCACKAIQNgIIIAIoAhQEQAJAIAIoAhRBAkcNACACKAIQQQNHDQAgAkECNgIQIAIoAhhBAjYCCAsCQCACKAIUIAIoAhBGDQAgAigCEEEBRg0AIAJBBTYCHAwCCwsgAiACKAIQNgIcCyACKAIcC2oBAX8jAEEQayIBIAA2AgwgASgCDEIANwMAIAEoAgxBADYCCCABKAIMQn83AxAgASgCDEEANgIsIAEoAgxBfzYCKCABKAIMQgA3AxggASgCDEIANwMgIAEoAgxBADsBMCABKAIMQQA7ATILjQUBA38jAEEQayIBJAAgASAANgIMIAEoAgwEQCABKAIMKAIABEAgASgCDCgCABAvGiABKAIMKAIAEBsLIAEoAgwoAhwQFSABKAIMKAIgECQgASgCDCgCJBAkIAEoAgwoAlAhAiMAQRBrIgAkACAAIAI2AgwgACgCDARAIAAoAgwoAhAEQCAAQQA2AggDQCAAKAIIIAAoAgwoAgBJBEAgACgCDCgCECAAKAIIQQJ0aigCAARAIAAoAgwoAhAgACgCCEECdGooAgAhAyMAQRBrIgIkACACIAM2AgwDQCACKAIMBEAgAiACKAIMKAIYNgIIIAIoAgwQFSACIAIoAgg2AgwMAQsLIAJBEGokAAsgACAAKAIIQQFqNgIIDAELCyAAKAIMKAIQEBULIAAoAgwQFQsgAEEQaiQAIAEoAgwoAkAEQCABQgA3AwADQCABKQMAIAEoAgwpAzBUBEAgASgCDCgCQCABKQMAp0EEdGoQdyABIAEpAwBCAXw3AwAMAQsLIAEoAgwoAkAQFQsgAUIANwMAA0AgASkDACABKAIMKAJErVQEQCABKAIMKAJMIAEpAwCnQQJ0aigCACECIwBBEGsiACQAIAAgAjYCDCAAKAIMQQE6ACgCfyMAQRBrIgIgACgCDEEMajYCDCACKAIMKAIARQsEQCAAKAIMQQxqQQhBABAUCyAAQRBqJAAgASABKQMAQgF8NwMADAELCyABKAIMKAJMEBUgASgCDCgCVCECIwBBEGsiACQAIAAgAjYCDCAAKAIMBEAgACgCDCgCCARAIAAoAgwoAgwgACgCDCgCCBECAAsgACgCDBAVCyAAQRBqJAAgASgCDEEIahA4IAEoAgwQFQsgAUEQaiQAC48OAQF/IwBBEGsiAyQAIAMgADYCDCADIAE2AgggAyACNgIEIAMoAgghASADKAIEIQIjAEEgayIAIAMoAgw2AhggACABNgIUIAAgAjYCECAAIAAoAhhBEHY2AgwgACAAKAIYQf//A3E2AhgCQCAAKAIQQQFGBEAgACAAKAIULQAAIAAoAhhqNgIYIAAoAhhB8f8DTwRAIAAgACgCGEHx/wNrNgIYCyAAIAAoAhggACgCDGo2AgwgACgCDEHx/wNPBEAgACAAKAIMQfH/A2s2AgwLIAAgACgCGCAAKAIMQRB0cjYCHAwBCyAAKAIURQRAIABBATYCHAwBCyAAKAIQQRBJBEADQCAAIAAoAhAiAUEBazYCECABBEAgACAAKAIUIgFBAWo2AhQgACABLQAAIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDAwBCwsgACgCGEHx/wNPBEAgACAAKAIYQfH/A2s2AhgLIAAgACgCDEHx/wNwNgIMIAAgACgCGCAAKAIMQRB0cjYCHAwBCwNAIAAoAhBBsCtPBEAgACAAKAIQQbArazYCECAAQdsCNgIIA0AgACAAKAIULQAAIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAEgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0AAiAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQADIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAQgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ABSAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAGIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAcgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ACCAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAJIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAogACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ACyAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAMIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAA0gACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ADiAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAPIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhRBEGo2AhQgACAAKAIIQQFrIgE2AgggAQ0ACyAAIAAoAhhB8f8DcDYCGCAAIAAoAgxB8f8DcDYCDAwBCwsgACgCEARAA0AgACgCEEEQTwRAIAAgACgCEEEQazYCECAAIAAoAhQtAAAgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0AASAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQACIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAMgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0ABCAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAFIAAoAhhqNgIYIAAgACgCGCAAKAIMajYCDCAAIAAoAhQtAAYgACgCGGo2AhggACAAKAIYIAAoAgxqNgIMIAAgACgCFC0AByAAKAIYajYCGCAAIAAoAhggACgCDGo2AgwgACAAKAIULQAIIAAoAhhqNgIYIAAgACgCGCAAKAIMajYC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NgIYIAEoAgxCADcDICABKAIMQgA3AyggASgCDEEANgIwIAEoAgxBADYCNCABKAIMQQA2AjggASgCDEEANgI8IAEoAgxBADsBQCABKAIMQYCA2I14NgJEIAEoAgxCADcDSCABKAIMQQA7AVAgASgCDEEAOwFSIAEoAgxBADYCVAvSEwEBfyMAQbABayIDJAAgAyAANgKoASADIAE2AqQBIAMgAjYCoAEgA0EANgKQASADIAMoAqQBKAIwQQAQOjYClAEgAyADKAKkASgCOEEAEDo2ApgBAkACQAJAAkAgAygClAFBAkYEQCADKAKYAUEBRg0BCyADKAKUAUEBRgRAIAMoApgBQQJGDQELIAMoApQBQQJHDQEgAygCmAFBAkcNAQsgAygCpAEiACAALwEMQYAQcjsBDAwBCyADKAKkASIAIAAvAQxB/+8DcTsBDCADKAKUAUECRgRAIANB9eABIAMoAqQBKAIwIAMoAqgBQQhqEI4BNgKQASADKAKQAUUEQCADQX82AqwBDAMLCwJAIAMoAqABQYACcQ0AIAMoApgBQQJHDQAgA0H1xgEgAygCpAEoAjggAygCqAFBCGoQjgE2AkggAygCSEUEQCADKAKQARAjIANBfzYCrAEMAwsgAygCSCADKAKQATYCACADIAMoAkg2ApABCwsCQCADKAKkAS8BUkUEQCADKAKkASIAIAAvAQxB/v8DcTsBDAwBCyADKAKkASIAIAAvAQxBAXI7AQwLIAMgAygCpAEgAygCoAEQZUEBcToAhgEgAyADKAKgAUGACnFBgApHBH8gAy0AhgEFQQELQQFxOgCHASADAn9BASADKAKkAS8BUkGBAkYNABpBASADKAKkAS8BUkGCAkYNABogAygCpAEvAVJBgwJGC0EBcToAhQEgAy0AhwFBAXEEQCADIANBIGpCHBApNgIcIAMoAhxFBEAgAygCqAFBCGpBDkEAEBQgAygCkAEQIyADQX82AqwBDAILAkAgAygCoAFBgAJxBEACQCADKAKgAUGACHENACADKAKkASkDIEL/////D1YNACADKAKkASkDKEL/////D1gNAgsgAygCHCADKAKkASkDKBAtIAMoAhwgAygCpAEpAyAQLQwBCwJAAkAgAygCoAFBgAhxDQAgAygCpAEpAyBC/////w9WDQAgAygCpAEpAyhC/////w9WDQAgAygCpAEpA0hC/////w9YDQELIAMoAqQBKQMoQv////8PWgRAIAMoAhwgAygCpAEpAygQLQsgAygCpAEpAyBC/////w9aBEAgAygCHCADKAKkASkDIBAtCyADKAKkASkDSEL/////D1oEQCADKAIcIAMoAqQBKQNIEC0LCwsCfyMAQRBrIgAgAygCHDYCDCAAKAIMLQAAQQFxRQsEQCADKAKoAUEIakEUQQAQFCADKAIcEBYgAygCkAEQIyADQX82AqwBDAILIANBAQJ/IwBBEGsiACADKAIcNgIMAn4gACgCDC0AAEEBcQRAIAAoAgwpAxAMAQtCAAunQf//A3ELIANBIGpBgAYQVTYCjAEgAygCHBAWIAMoAowBIAMoApABNgIAIAMgAygCjAE2ApABCyADLQCFAUEBcQRAIAMgA0EVakIHECk2AhAgAygCEEUEQCADKAKoAUEIakEOQQAQFCADKAKQARAjIANBfzYCrAEMAgsgAygCEEECEB8gAygCEEG9EkECEEEgAygCECADKAKkAS8BUkH/AXEQlgEgAygCECADKAKkASgCEEH//wNxEB8CfyMAQRBrIgAgAygCEDYCDCAAKAIMLQAAQQFxRQsEQCADKAKoAUEIakEUQQAQFCADKAIQEBYgAygCkAEQIyADQX82AqwBDAILIANBgbICQQcgA0EVakGABhBVNgIMIAMoAhAQFiADKAIMIAMoApABNgIAIAMgAygCDDYCkAELIAMgA0HQAGpCLhApIgA2AkwgAEUEQCADKAKoAUEIakEOQQAQFCADKAKQARAjIANBfzYCrAEMAQsgAygCTEHxEkH2EiADKAKgAUGAAnEbQQQQQSADKAKgAUGAAnFFBEAgAygCTCADLQCGAUEBcQR/QS0FIAMoAqQBLwEIC0H//wNxEB8LIAMoAkwgAy0AhgFBAXEEf0EtBSADKAKkAS8BCgtB//8DcRAfIAMoAkwgAygCpAEvAQwQHwJAIAMtAIUBQQFxBEAgAygCTEHjABAfDAELIAMoAkwgAygCpAEoAhBB//8DcRAfCyADKAKkASgCFCADQZ4BaiADQZwBahCNASADKAJMIAMvAZ4BEB8gAygCTCADLwGcARAfAkACQCADLQCFAUEBcUUNACADKAKkASkDKEIUWg0AIAMoAkxBABAhDAELIAMoAkwgAygCpAEoAhgQIQsCQAJAIAMoAqABQYACcUGAAkcNACADKAKkASkDIEL/////D1QEQCADKAKkASkDKEL/////D1QNAQsgAygCTEF/ECEgAygCTEF/ECEMAQsCQCADKAKkASkDIEL/////D1QEQCADKAJMIAMoAqQBKQMgpxAhDAELIAMoAkxBfxAhCwJAIAMoAqQBKQMoQv////8PVARAIAMoAkwgAygCpAEpAyinECEMAQsgAygCTEF/ECELCyADKAJMIAMoAqQBKAIwEFFB//8DcRAfIAMgAygCpAEoAjQgAygCoAEQkgFB//8DcSADKAKQAUGABhCSAUH//wNxajYCiAEgAygCTCADKAKIAUH//wNxEB8gAygCoAFBgAJxRQRAIAMoAkwgAygCpAEoAjgQUUH//wNxEB8gAygCTCADKAKkASgCPEH//wNxEB8gAygCTCADKAKkAS8BQBAfIAMoAkwgAygCpAEoAkQQIQJAIAMoAqQBKQNIQv////8PVARAIAMoAkwgAygCpAEpA0inECEMAQsgAygCTEF/ECELCwJ/IwBBEGsiACADKAJMNgIMIAAoAgwtAABBAXFFCwRAIAMoAqgBQQhqQRRBABAUIAMoAkwQFiADKAKQARAjIANBfzYCrAEMAQsgAygCqAEgA0HQAGoCfiMAQRBrIgAgAygCTDYCDAJ+IAAoAgwtAABBAXEEQCAAKAIMKQMQDAELQgALCxA2QQBIBEAgAygCTBAWIAMoApABECMgA0F/NgKsAQwBCyADKAJMEBYgAygCpAEoAjAEQCADKAKoASADKAKkASgCMBCFAUEASARAIAMoApABECMgA0F/NgKsAQwCCwsgAygCkAEEQCADKAKoASADKAKQAUGABhCRAUEASARAIAMoApABECMgA0F/NgKsAQwCCwsgAygCkAEQIyADKAKkASgCNARAIAMoAqgBIAMoAqQBKAI0IAMoAqABEJEBQQBIBEAgA0F/NgKsAQwCCwsgAygCoAFBgAJxRQRAIAMoAqQBKAI4BEAgAygCqAEgAygCpAEoAjgQhQFBAEgEQCADQX82AqwBDAMLCwsgAyADLQCHAUEBcTYCrAELIAMoAqwBIQAgA0GwAWokACAAC+ACAQF/IwBBIGsiBCQAIAQgADsBGiAEIAE7ARggBCACNgIUIAQgAzYCECAEQRAQGCIANgIMAkAg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AAAgAygCHEHcFmogAygCDEECdGooAgAgAygCHEHYKGpqLQAASg0ADAELIAMoAhxB3BZqIAMoAhRBAnRqIAMoAhxB3BZqIAMoAgxBAnRqKAIANgIAIAMgAygCDDYCFCADIAMoAgxBAXQ2AgwMAQsLIAMoAhxB3BZqIAMoAhRBAnRqIAMoAhA2AgAL1xMBA38jAEEwayICJAAgAiAANgIsIAIgATYCKCACIAIoAigoAgA2AiQgAiACKAIoKAIIKAIANgIgIAIgAigCKCgCCCgCDDYCHCACQX82AhAgAigCLEEANgLQKCACKAIsQb0ENgLUKCACQQA2AhgDQCACKAIYIAIoAhxIBEACQCACKAIkIAIoAhhBAnRqLwEABEAgAiACKAIYIgE2AhAgAigCLEHcFmohAyACKAIsIgQoAtAoQQFqIQAgBCAANgLQKCAAQQJ0IANqIAE2AgAgAigCGCACKAIsQdgoampBADoAAAwBCyACKAIkIAIoAhhBAnRqQQA7AQILIAIgAigCGEEBajYCGAwBCwsDQCACKAIsKALQKEECSARAAkAgAigCEEECSARAIAIgAigCEEEBaiIANgIQDAELQQAhAAsgAigCLEHcFmohAyACKAIsIgQoAtAoQQFqIQEgBCABNgLQKCABQQJ0IANqIAA2AgAgAiAANgIMIAIoAiQgAigCDEECdGpBATsBACACKAIMIAIoAixB2ChqakEAOgAAIAIoAiwiACAAKAKoLUEBazYCqC0gAigCIARAIAIoAiwiACAAKAKsLSACKAIgIAIoAgxBAnRqLwECazYCrC0LDAELCyACKAIoIAIoAhA2AgQgAiACKAIsKALQKEECbTYCGANAIAIoAhhBAU4EQCACKAIsIAIoAiQgAigCGBB5IAIgAigCGEEBazYCGAwBCwsgAiACKAIcNgIMA0AgAiACKAIsKALgFjYCGCACKAIsQdwWaiEBIAIoAiwiAygC0CghACADIABBAWs2AtAoIAIoAiwgAEECdCABaigCADYC4BYgAigCLCACKAIkQQEQeSACIAIoAiwoAuAWNgIUIAIoAhghASACKAIsQdwWaiEDIAIoAiwiBCgC1ChBAWshACAEIAA2AtQoIABBAnQgA2ogATYCACACKAIUIQEgAigCLEHcFmohAyACKAIsIgQoAtQoQQFrIQAgBCAANgLUKCAA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AQsgAigCCEEANgIAIAIoAghCADcDECACKAIIQgA3AwggAigCCEIANwMgIAIoAghCADcDGCACKAIIQQA2AiggAigCCEEAOgAsIAIoAgggAikDECACKAIMEI8BQQFxRQRAIAIoAggQJSACQQA2AhwMAQsgAiACKAIINgIcCyACKAIcIQEgAkEgaiQAIAEL1gIBAX8jAEEgayIDJAAgAyAANgIYIAMgATYCFCADIAI2AhAgAyADQQxqQgQQKTYCCAJAIAMoAghFBEAgA0F/NgIcDAELA0AgAygCFARAIAMoAhQoAgQgAygCEHFBgAZxBEAgAygCCEIAECwaIAMoAgggAygCFC8BCBAfIAMoAgggAygCFC8BChAfAn8jAEEQayIAIAMoAgg2AgwgACgCDC0AAEEBcUULBEAgAygCGEEIakEUQQAQFCADKAIIEBYgA0F/NgIcDAQLIAMoAhggA0EMakIEEDZBAEgEQCADKAIIEBYgA0F/NgIcDAQLIAMoAhQvAQoEQCADKAIYIAMoAhQoAgwgAygCFC8BCq0QNkEASARAIAMoAggQFiADQX82AhwMBQsLCyADIAMoAhQoAgA2AhQMAQsLIAMoAggQFiADQQA2AhwLIAMoAhwhACADQSBqJAAgAAtoAQF/IwBBEGsiAiAANgIMIAIgATYCCCACQQA7AQYDQCACKAIMBEAgAigCDCgCBCACKAIIcUGABnEEQCACIAIoAgwvAQogAi8BBkEEamo7AQYLIAIgAigCDCgCADYCDAwBCwsgAi8BBgvwAQEBfyMAQRBrIgEkACABIAA2AgwgASABKAIMNgIIIAFBADYCBANAIAEoAgwEQAJAAkAgASgCDC8BCEH1xgFGDQAgASgCDC8BCEH14AFGDQAgASgCDC8BCEGBsgJGDQAgASgCDC8BCEEBRw0BCyABIAEoAgwoAgA2AgAgASgCCCABKAIMRgRAIAEgASgCADYCCAsgASgCDEEANgIAIAEoAgwQIyABKAIEBEAgASgCBCABKAIANgIACyABIAEoAgA2AgwMAgsgASABKAIMNgIEIAEgASgCDCgCADYCDAwBCwsgASgCCCEAIAFBEGokACAAC7IEAQF/IwBBQGoiBSQAIAUgADYCOCAFIAE7ATYgBSACNgIwIAUgAzYCLCAFIAQ2AiggBSAFKAI4IAUvATatECkiADYC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IAEoAhBB//8DRgRAIAEgASgCDDYCEAsgASgCCEH//wNGBEAgASABKAIENgIICwJAIAEoApQBQQRxRQ0AIAEoAgggASgCBEYEQCABKAIQIAEoAgxGDQELIAEoApABQRVBABAUIAEtABdBAXEEQCABKAKkARAWCyABQQA2AqwBDAELAkAgASgCEEUEQCABKAIIRQ0BCyABKAKQAUEBQQAQFCABLQAXQQFxBEAgASgCpAEQFgsgAUEANgKsAQwBCyABIAEoAqQBEDE3AyggASABKAKkARAxNwMgIAEpAyggASkDIFIEQCABKAKQAUEBQQAQFCABLQAXQQFxBEAgASgCpAEQFgsgAUEANgKsAQwBCyABIAEoAqQBEDE3AzAgASABKAKkARAxNwOAAQJ/IwBBEGsiBSABKAKkATYCDCAFKAIMLQAAQQFxRQsEQCABKAKQAUEUQQAQFCABLQAXQQFxBEAgASgCpAEQFgsgAUEANgKsAQwBCyABLQAXQQFxBEAgASgCpAEQFgsCQCABKQOAAUL///////////8AWARAIAEpA4ABIAEpA4ABIAEpAzB8WA0BCyABKAKQAUEEQRYQFCABQQA2AqwBDAELIAEpA4ABIAEpAzB8IAEpA5gBIAEpAzh8VgRAIAEoApABQRVBABAUIAFBADYCrAEMAQsCQCABKAKUAUEEcUUNACABKQOAASABKQMwfCABKQOYASABKQM4fFENACABKAKQAUEVQQAQFCABQQA2AqwBDAELIAEpAyggASkDMEIugFYEQCABKAKQAUEVQQAQFCABQQA2AqwBDAELIAEgASkDKCABKAKQARCQASIFNgKMASAFRQRAIAFBADYCrAEMAQsgASgCjAFBAToALCABKAKMASABKQMwNwMYIAEoAowBIAEpA4ABNwMgIAEgASgCjAE2AqwBCyABKAKsASEFIAFBsAFqJAAgACAFNgJQDAELIAAoAmQgACkDMBAsGiAAKAJkIQUgACkDWCEJIAAoAmgoAhQhBiAAKAJUIQcjAEHQAGsiASQAIAEgBTYCSCABIAk3A0AgASAGNgI8IAEgBzYCOAJAIAEoAkgQMEIWVARAIAEoAjhBFUEAEBQgAUEANgJMDAELIwBBEGsiBSABKAJINgIMIAECfiAFKAIMLQAAQQFxBEAgBSgCDCkDEAwBC0IACzcDCCABKAJI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ECADQcgAEBgiADYCDAJAIABFBEAgAygCEEEBQbSbASgCABAUIANBADYCHAwBCyADKAIMIAMoAhA2AgAgAygCDCADLQAbQQFxOgAEIAMoAgwgAygCFDYCCAJAIAMoAgwoAghBAU4EQCADKAIMKAIIQQlMDQELIAMoAgxBCTYCCAsgAygCDEEAOgAMIAMoAgxBADYCMCADKAIMQQA2AjQgAygCDEEANgI4IAMgAygCDDYCHAsgAygCHCEAIANBIGokACAACzgBAX8jAEEQayIBIAA2AgwgASgCDEEANgIAIAEoAgxBADYCBCABKAIMQQA2AgggASgCDEEAOgAMC+MIAQF/IwBBQGoiAiAANgI4IAIgATYCNCACIAIoAjgoAnw2AjAgAiACKAI4KAI4IAIoAjgoAmxqNgIsIAIgAigCOCgCeDYCICACIAIoAjgoApABNgIcIAICfyACKAI4KAJsIAIoAjgoAixBhgJrSwRAIAIoAjgoAmwgAigCOCgCLEGGAmtrDAELQQALNgIYIAIgAigCOCgCQDYCFCACIAIoAjgoAjQ2AhAgAiACKAI4KAI4IAIoAjgoAmxqQYICajYCDCACIAIoAiwgAigCIEEBa2otAAA6AAsgAiACKAIsIAIoAiBqLQAAOgAKIAIoAjgoAnggAigCOCgCjAFPBEAgAiACKAIwQQJ2NgIwCyACKAIcIAIoAjgoAnRLBEAgAiACKAI4KAJ0NgIcCwNAAkAgAiACKAI4KAI4IAIoAjRqNgIoAkAgAigCKCACKAIgai0AACACLQAKRw0AIAIoAiggAigCIEEBa2otAAAgAi0AC0cNACACKAIoLQAAIAIoAiwtAABHDQAgAiACKAIoIgBBAWo2AiggAC0AASACKAIsLQABRwRADAELIAIgAigCLEECajYCLCACIAIoAihBAWo2AigDQCACIAIoAiwiAEEBajYCLCAALQABIQEgAiACKAIoIgBBAWo2AigCf0EAIAAtAAEgAUcNABogAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoQQAgAC0AASABRw0AGiACIAIoAiwiAEEBajYCLCAALQABIQEgAiACKAIoIgBBAWo2AihBACAALQABIAFHDQAaIAIgAigCLCIAQQFqNgIsIAAtAAEhASACIAIoAigiAEEBajYCKEEAIAAtAAEgAUcNABogAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoQQAgAC0AASABRw0AGiACIAIoAiwiAEEBajYCLCAALQABIQEgAiACKAIoIgBBAWo2AihBACAALQABIAFHDQAaIAIgAigCLCIAQQFqNgIsIAAtAAEhASACIAIoAigiAEEBajYCKEEAIAAtAAEgAUcNABogAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoQQAgAC0AASABRw0AGiACKAIsIAIoAgxJC0EBcQ0ACyACQYICIAIoAgwgAigCLGtrNgIkIAIgAigCDEGCAms2AiwgAigCJCACKAIgSgRAIAIoAjggAigCNDYCcCACIAIoAiQ2AiAgAigCJCACKAIcTg0CIAIgAigCLCACKAIgQQFrai0AADoACyACIAIoAiwgAigCIGotAAA6AAoLCyACIAIoAhQgAigCNCACKAIQcUEBdGovAQAiATYCNEEAIQAgASACKAIYSwR/IAIgAigCMEEBayIANgIwIABBAEcFQQALQQFxDQELCwJAIAIoAiAgAigCOCgCdE0EQCACIAIoAiA2AjwMAQsgAiACKAI4KAJ0NgI8CyACKAI8C5IQAQF/IwBBMGsiAiQAIAIgADYCKCACIAE2AiQgAgJ/IAIoAigoAiwgAigCKCgCDEEFa0kEQCACKAIoKAIsDAELIAIoAigoAgxBBWsLNgIgIAJBADYCECACIAIoAigoAgAoAgQ2AgwDQAJAIAJB//8DNgIcIAIgAigCKCgCvC1BKmpBA3U2AhQgAigCKCgCACgCECACKAIUSQ0AIAIgAigCKCgCACgCECACKAIUazYCFCACIAIoAigoAmwgAigCKCgCXGs2AhggAigCHCACKAIYIAIoAigoAgAoAgRqSwRAIAIgAigCGCACKAIoKAIAKAIEajYCHAsgAigCHCACKAIUSwRAIAIgAigCFDYCHAsCQCACKAIcIAIoAiBPDQACQCACKAIcRQRAIAIoAiRBBEcNAQsgAigCJEUNACACKAIcIAIoAhggAigCKCgCACgCBGpGDQELDAELQQAhACACIAIoAiRBBEYEfyACKAIcIAIoAhggAigCKCgCACgCBGpGBUEAC0EBcTYCECACKAIoQQBBACACKAIQEF0gAigCKCgCCCACKAIoKAIUQQRraiACKAIcOgAAIAIoAigoAgggAigCKCgCFEEDa2ogAigCHEEIdjoAACACKAIoKAIIIAIoAigoAhRBAmtqIAIoAhxBf3M6AAAgAigCKCgCCCACKAIoKAIUQQFraiACKAIcQX9zQQh2OgAAIAIoAigoAgAQHCACKAIYBEAgAigCGCACKAIcSwRAIAIgAigCHDYCGAsgAigCKCgCACgCDCACKAIoKAI4IAIoAigoAlxqIAIoAhgQGRogAigCKCgCACIAIAIoAhggACgCDGo2AgwgAigCKCgCACIAIAAoAhAgAigCGGs2AhAgAigCKCgCACIAIAIoAhggACgCFGo2AhQgAigCKCIAIAIoAhggACgCXGo2AlwgAiACKAIcIAIoAhhrNgIcCyACKAIcBEAgAigCKCgCACACKAIoKAIAKAIMIAIoAhwQdhogAigCKCgCACIAIAIoAhwgACgCDGo2AgwgAigCKCgCACIAIAAoAhAgAigCHGs2AhAgAigCKCgCACIAIAIoAhwgACgCFGo2AhQLIAIoAhBFDQELCyACIAIoAgwgAigCKCgCACgCBGs2AgwgAigCDARAAkAgAigCDCACKAIoKAIsTwRAIAIoAihBAjYCsC0gAigCKCgCOCACKAIoKAIAKAIAIAIoAigoAixrIAIoAigoAiwQGRogAigCKCACKAIoKAIsNgJsDAELIAIoAgwgAigCKCgCPCACKAIoKAJsa08EQCACKAIoIgAgACgCbCACKAIoKAIsazYCbCACKAIoKAI4IAIoAigoAjggAigCKCgCLGogAigCKCgCbBAZGiACKAIoKAKwLUECSQRAIAIoAigiACAAKAKwLUEBajYCsC0LCyACKAIoKAI4IAIoAigoAmxqIAIoAigoAgAoAgAgAigCDGsgAigCDBAZGiACKAIoIgAgAigCDCAAKAJsajYCbAsgAigCKCACKAIoKAJsNgJcIAIoAigiAQJ/IAIoAgwgAigCKCgCLCACKAIoKAK0LWtLBEAgAigCKCgCLCACKAIoKAK0LWsMAQsgAigCDAsgASgCtC1qNgK0LQsgAigCKCgCwC0gAigCKCgCbEkEQCACKAIoIAIoAigoAmw2AsAtCwJAIAIoAhAEQCACQQM2AiwMAQsCQCACKAIkRQ0AIAIoAiRBBEYNACACKAIoKAIAKAIEDQAgAigCKCgCbCACKAIoKAJcRw0AIAJBATYCLAwBCyACIAIoAigoAjwgAigCKCgCbGtBAWs2AhQCQCACKAIoKAIAKAIEIAIoAhRNDQAgAigCKCgCXCACKAIoKAIsSA0AIAIoAigiACAAKAJcIAIoAigoAixrNgJcIAIoAigiACAAKAJsIAIoAigoAixrNgJsIAIoAigoAjggAigCKCgCOCACKAIoKAIsaiACKAIoKAJsEBkaIAIoAigoArAtQQJJBEAgAigCKCIAIAAoArAtQQFqNgKwLQsgAiACKAIoKAIsIAIoAhRqNgIUCyACKAIUIAIoAigoAgAoAgRLBEAgAiACKAIoKAIAKAIENgIUCyACKAIUBEAgAigCKCgCACACKAIoKAI4IAIoAigoAmxqIAIoAhQQdhogAigCKCIAIAIoAhQgACgCbGo2AmwLIAIoAigoAsAtIAIoAigoAmxJBEAgAigCKCACKAIoKAJsNgLALQsgAiACKAIoKAK8LUEqakEDdTYCFCACIAIoAigoAgwgAigCFGtB//8DSwR/Qf//AwUgAigCKCgCDCACKAIUaws2AhQgAgJ/IAIoAhQgAigCKCgCLEsEQCACKAIoKAIsDAELIAIoAhQLNgIgIAIgAigCKCgCbCACKAIoKAJcazYCGAJAIAIoAhggAigCIEkEQCACKAIYRQRAIAIoAiRBBEcNAgsgAigCJEUNASACKAIoKAIAKAIEDQEgAigCGCACKAIUSw0BCyACAn8gAigCGCACKAIUSwRAIAIoAhQMAQsgAigCGAs2AhwgAgJ/QQAgAigCJEEERw0AGkEAIAIoAigoAgAoAgQNABogAigCHCACKAIYRgtBAXE2AhAgAigCKCACKAIoKAI4IAIoAigoAlxqIAIoAhwgAigCEBBdIAIoAigiACACKAIcIAAoAlxqNgJcIAIoAigoAgAQHAsgAkECQQAgAigCEBs2AiwLIAIoAiwhACACQTBqJAAgAAuyAgEBfyMAQRBrIgEkACABIAA2AggCQCABKAIIEHgEQCABQX42AgwMAQsgASABKAIIKAIcKAIENgIEIAEoAggoAhwoAggEQCABKAIIKAIoIAEoAggoAhwoAgggASgCCCgCJBEEAAsgASgCCCgCHCgCRARAIAEoAggoAiggASgCCCgCHCgCRCABKAIIKAIkEQQACyABKAIIKAIc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DQAgAiEAIANBAWsiAw0ACwsgBCgCFBogASACNgKgAQwCCyMAQRBrIgAgASgCqAEoAgQ2AgwgAUEAIAAoAgxrQQJ0QajZAGooAgA2AqABDAELIAFBADYCoAELCwJAIAEoAqABRQRAIAEgASgCpAE2AqwBDAELIAEgASgCoAEQLgJ/IAEoAqQBBEAgASgCpAEQLkECagwBC0EAC2pBAWoQGCIANgIcIABFBEAgAUG4EygCADYCrAEMAQsgASgCHCEAAn8gASgCpAEEQCABKAKkAQwBC0H6EgshA0HfEkH6EiABKAKkARshAiABIAEoAqABNgIIIAEgAjYCBCABIAM2AgAgAEG+CiABEG8gASgCqAEgASgCHDYCCCABIAEoAhw2AqwBCyABKAKsASEAIAFBsAFqJAAgAAsIAEEBQTgQfwszAQF/IAAoAhQiAyABIAIgACgCECADayIBIAEgAksbIgEQGRogACAAKAIUIAFqNgIUIAILjwUCBn4BfyABIAEoAgBBD2pBcHEiAUEQajYCACAAAnwgASkDACEDIAEpAwghBiMAQSBrIggkAAJAIAZC////////////AIMiBEKAgICAgIDAgDx9IARCgICAgICAwP/DAH1UBEAgBkIEhiADQjyIhCEEIANC//////////8PgyIDQoGAgICAgICACFoEQCAEQoGAgICAgICAwAB8IQIMAgsgBEKAgICAgICAgEB9IQIgA0KAgICAgICAgAiFQgBSDQEgAiAEQgGDfCECDAELIANQIARCgICAgICAwP//AFQgBEKAgICAgIDA//8AURtFBEAgBkIEhiADQjyIhEL/////////A4NCgICAgICAgPz/AIQhAgwBC0KAgICAgICA+P8AIQIgBEL///////+//8MAVg0AQgAhAiAEQjCIpyIAQZH3AEkNACADIQIgBkL///////8/g0KAgICAgIDAAIQiBSEHAkAgAEGB9wBrIgFBwABxBEAgAiABQUBqrYYhB0IAIQIMAQsgAUUNACAHIAGtIgSGIAJBwAAgAWutiIQhByACIASGIQILIAggAjcDECAIIAc3AxgCQEGB+AAgAGsiAEHAAHEEQCAFIABBQGqtiCEDQgAhBQwBCyAARQ0AIAVBwAAgAGuthiADIACtIgKIhCEDIAUgAoghBQsgCCADNwMAIAggBTcDCCAIKQMI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ADYCtC0gASgCFEEERgRAIAEoAhgCfyABKAIYKAJcQQBOBEAgASgCGCgCOCABKAIYKAJcagwBC0EACyABKAIYKAJsIAEoAhgoAlxrQQEQKCABKAIYIAEoAhgoAmw2AlwgASgCGCgCABAcIAEoAhgoAgAoAhBFBEAgAUECNgIcDAILIAFBAzYCHAwBCyABKAIYKAKgLQRAIAEoAhgCfyABKAIYKAJcQQBOBEAgASgCGCgCOCABKAIYKAJcagwBC0EACyABKAIYKAJsIAEoAhgoAlxrQQAQKCABKAIYIAEoAhgoAmw2AlwgASgCGCgCABAcIAEoAhgoAgAoAhBFBEAgAUEANgIcDAILCyABQQE2AhwLIAEoAhwhAiABQSBqJAAgAgwBCwJ/IAAoAiwoAogBQQNGBEAgACgCLCECIAAoAjQhAyMAQTBrIgEkACABIAI2AiggASADNgIkAkADQAJAIAEoAigoAnRBggJNBEAgASgCKBBcAkAgASgCKCgCdEGCAksNACABKAIkDQAgAUEANgIsDAQLIAEoAigoAnRFDQELIAEoAihBADYCYAJAIAEoAigoAnRBA0kNACABKAIoKAJsRQ0AIAEgASgCKCgCOCABKAIoKAJsakEBazYCGCABIAEoAhgtAAA2AhwgASgCHCECIAEgASgCGCIDQQFqNgIYAkAgAy0AASACRw0AIAEoAhwhAiABIAEoAhgiA0EBajYCGCADLQABIAJHDQAgASgCHCECIAEgASgCGCIDQQFqNgIYIAMtAAEgAkcNACABIAEoAigoAjggASgCKCgCbGpBggJqNgIUA0AgASgCHCECIAEgASgCGCIDQQFqNgIYAn9BACADLQABIAJHDQAaIAEoAhwhAiABIAEoAhgiA0EBajYCGEEAIAMtAAEgAkcNABogASgCHCECIAEgASgCGCIDQQFqNgIYQQAgAy0AASACRw0AGiABKAIcIQIgASABKAIYIgNBAWo2AhhBACADLQABIAJHDQAaIAEoAhwhAiABIAEoAhgiA0EBajYCGEEAIAMtAAEgAkcNABogASgCHCECIAEgASgCGCIDQQFqNgIYQQAgAy0AASACRw0AGiABKAIcIQIgASABKAIYIgNBAWo2AhhBACADLQABIAJHDQAaIAEoAhwhAiABIAEoAhgiA0EBajYCGEEAIAMtAAEgAkcNABog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AS8BEiECIAEgASgCSCIDQQFqNgJIIAMgAjoAAAwCCyABKAIMQRBxBEAgASABLwESNgIIIAEgASgCDEEPcTYCDCABKAIMBEAgASgCKCABKAIMSQRAIAEgASgCUCICQQFqNgJQIAEgASgCLCACLQAAIAEoAih0ajYCLCABIAEoAihBCGo2AigLIAEgASgCCCABKAIsQQEgASgCDHRBAWtxajYCCCABIAEoAiwgASgCDHY2AiwgASABKAIoIAEoAgxrNgIoCyABKAIoQQ9JBEAgASABKAJQIgJBAWo2AlAgASABKAIsIAItAAAgASgCKHRqNgIsIAEgASgCKEEIajYCKCABIAEoAlAiAkEBajYCUCABIAEoAiwgAi0AACABKAIodGo2AiwgASABKAIoQQhqNgIoCyABIAEoAiAgASgCLCABKAIYcUECdGooAQA2ARACQANAIAEgAS0AETYCDCABIAEoAiwgASgCDHY2AiwgASABKAIoIAEoAgxrNgIoIAEgAS0AEDYCDCABKAIMQRBxBEAgASABLwESNgIEIAEgASgCDEEPcTYCDCABKAIoIAEoAgxJBEAgASABKAJQIgJBAWo2AlAgASABKAIsIAItAAAgASgCKHRqNgIsIAEgASgCKEEIajYCKCABKAIoIAEoAgxJBEAgASABKAJQIgJBAWo2AlAgASABKAIsIAItAAAgASgCKHRqNgIsIAEgASgCKEEIajYCKAsLIAEgASgCBCABKAIsQQEgASgCDHRBAWtxajYCBCABIAEoAiwgASgCDHY2AiwgASABKAIoIAEoAgxrNgIoIAEgASgCSCABKAJEazYCDAJAIAEoAgQgASgCDEsEQCABIAEoAgQgASgCDGs2AgwgASgCDCABKAI4SwRAIAEoAlQoAsQ3BEAgASgCXEHdDDYCGCABKAJUQdH+ADYCBAwKCwsgASABKAIwNgIAAkAgASgCNEUEQCABIAEoAgAgASgCPCABKAIMa2o2AgAgASgCDCABKAIISQRAIAEgASgCCCABKAIMazYCCANAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIMQQFrIgI2AgwgAg0ACyABIAEoAkggASgCBGs2AgALDAELAkAgASgCNCABKAIMSQRAIAEgASgCACABKAI8IAEoAjRqIAEoAgxrajYCACABIAEoAgwgASgCNGs2AgwgASgCDCABKAIISQRAIAEgASgCCCABKAIMazYCCANAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIMQQFrIgI2AgwgAg0ACyABIAEoAjA2AgAgASgCNCABKAIISQRAIAEgASgCNDYCDCABIAEoAgggASgCDGs2AggDQCABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCDEEBayICNgIMIAINAAsgASABKAJIIAEoAgRrNgIACwsMAQsgASABKAIAIAEoAjQgASgCDGtqNgIAIAEoAgwgASgCCEkEQCABIAEoAgggASgCDGs2AggDQCABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCDEEBayICNgIMIAINAAsgASABKAJIIAEoAgRrNgIACwsLA0AgASgCCEECSwRAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIAIgJBAWo2AgAgAi0AACECIAEgASgCSCIDQQFqNgJIIAMgAjoAACABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCCEEDazYCCAwBCwsMAQsgASABKAJIIAEoAgRrNgIAA0AgASABKAIAIgJBAWo2AgAgAi0AACECIAEgASgCSCIDQQFqNgJIIAMgAjoAACABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIIQQNrNgIIIAEoAghBAksNAAsLIAEoAggEQCABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEoAghBAUsEQCABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAACwsMAgsgASgCDEHAAHFFBEAgASABKAIgIAEvARIgASgCLEEBIAEoAgx0QQFrcWpBAnRqKAEANgEQDAELCyAB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AG5hbgAvZGV2L3VyYW5kb20AaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrAGluY29ycmVjdCBoZWFkZXIgY2hlY2sAaW5jb3JyZWN0IGxlbmd0aCBjaGVjawBpbmNvcnJlY3QgZGF0YSBjaGVjawBpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjawBoZWFkZXIgY3JjIG1pc21hdGNoAGluZgBpbnZhbGlkIHdpbmRvdyBzaXplAFJlYWQtb25seSBhcmNoaXZlAE5vdCBhIHppcCBhcmNoaXZlAFJlc291cmNlIHN0aWxsIGluIHVzZQBNYWxsb2MgZmFpbHVyZQBpbnZhbGlkIGJsb2NrIHR5cGUARmFpbHVyZSB0byBjcmVhdGUgdGVtcG9yYXJ5IGZpbGUAQ2FuJ3Qgb3BlbiBmaWxlAE5vIHN1Y2ggZmlsZQBQcmVtYXR1cmUgZW5kIG9mIGZpbGUAQ2FuJ3QgcmVtb3ZlIGZpbGUAaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlAGludmFsaWQgZGlzdGFuY2UgY29kZQB1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZABzdHJlYW0gZW5kAENvbXByZXNzZWQgZGF0YSBpbnZhbGlkAE11bHRpLWRpc2sgemlwIGFyY2hpdmVzIG5vdCBzdXBwb3J0ZWQAT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQARW5jcnlwdGlvbiBtZXRob2Qgbm90IHN1cHBvcnRlZABDb21wcmVzc2lvbiBtZXRob2Qgbm90IHN1cHBvcnRlZABFbnRyeSBoYXMgYmVlbiBkZWxldGVkAENvbnRhaW5pbmcgemlwIGFyY2hpdmUgd2FzIGNsb3NlZABDbG9zaW5nIHppcCBhcmNoaXZlIGZhaWxlZABSZW5hbWluZyB0ZW1wb3JhcnkgZmlsZSBmYWlsZWQARW50cnkgaGFzIGJlZW4gY2hhbmdlZABObyBwYXNzd29yZCBwcm92aWRlZABXcm9uZyBwYXNzd29yZCBwcm92aWRlZABVbmtub3duIGVycm9yICVkAHJiAHIrYgByd2EAJXMuWFhYWFhYAE5BTgBJTkYAQUUAMS4yLjExAC9wcm9jL3NlbGYvZmQvAC4AKG51bGwpADogAFBLBgcA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0gAIADIACACyAAgAcgAIAPIACAAKAAgAigAIAEoACADKAAgAKgAIAKoACABqAAgA6gAIABoACACaAAgAWgAIANoACAA6AAgAugAIAHoACAD6AAgABgAIAIYACABGAAgAxgAIACYACACmAAgAZgAIAOYACAAWAAgAlgAIAFYACADWAAgANgAIALYACAB2AAgA9gAIAA4ACACOAAgATgAIAM4ACAAuAAgArgAIAG4ACADuAAgAHgAIAJ4ACABeAAgA3gAIAD4ACAC+AAgAfgAIAP4ACAABAAgAgQAIAEEACADBAAgAIQAIAKEACABhAAgA4QAIABEACACRAAgAUQAIANEACAAxAAgAsQAIAHEACADxAAgACQAIAIkACABJAAgAyQAIACkACACpAAgAaQAIAOkACAAZAAgAmQAIAFkACADZAAgAOQAIALkACAB5AAgA+QAIAAUACACFAAgARQAIAMUACAAlAAgApQAIAGUACADlAAgAFQAIAJUACABVAAgA1QAIADUACAC1AAgAdQAIAPUACAANAAgAjQAIAE0ACADNAAgALQAIAK0ACABtAAgA7QAIAB0ACACdAAgAXQAIAN0ACAA9AAgAvQAIAH0ACAD9AAgAEwAJABMBCQCTAAkAkwEJAFMACQBTAQkA0wAJANMBCQAzAAkAMwEJALMACQCzAQkAcwAJAHMBCQDzAAkA8wEJAAsACQALAQkAiwAJAIsBCQBLAAkASwEJAMsACQDLAQkAKwAJACsBCQCrAAkAqwEJAGsACQBrAQkA6wAJAOsBCQAbAAkAGwEJAJsACQCbAQkAWwAJAFsBCQDbAAkA2wEJADsACQA7AQkAuwAJALsBCQB7AAkAewEJAPsACQD7AQkABwAJAAcBCQCHAAkAhwEJAEcACQBHAQkAxwAJAMcBCQAnAAkAJwEJAKcACQCnAQkAZwAJAGcBCQDnAAkA5wEJABcACQAXAQkAlwAJAJcBCQBXAAkAVwEJANcACQDXAQkANwAJADcBCQC3AAkAtwEJAHcACQB3AQkA9wAJAPcBCQAPAAkADwEJAI8ACQCPAQkATwAJAE8BCQDPAAkAzwEJAC8ACQAvAQkArwAJAK8BCQBvAAkAbwEJAO8ACQDvAQkAHwAJAB8BCQCfAAkAnwEJAF8ACQBfAQkA3wAJAN8BCQA/AAkAPwEJAL8ACQC/AQkAfwAJAH8BCQD/AAkA/wEJAAAABwBAAAcAIAAHAGAABwAQAAcAUAAHADAABwBwAAcACAAHAEgABwAoAAcAaAAHABgABwBYAAcAOAAHAHgABwAEAAcARAAHACQABwBkAAcAFAAHAFQABwA0AAcAdAAHAAMACACDAAgAQwAIAMMACAAjAAgAowAIAGMACADjAAgAAAAFABAABQAIAAUAGAAFAAQABQAUAAUADAAFABwABQACAAUAEgAFAAoABQAaAAUABgAFABYABQAOAAUAHgAFAAEABQARAAUACQAFABkABQAFAAUAFQAFAA0ABQAdAAUAAwAFABMABQALAAUAGwAFAAcABQAXAAUAQbDqAAtNAQAAAAEAAAABAAAAAQAAAAIAAAACAAAAAgAAAAIAAAADAAAAAwAAAAMAAAADAAAABAAAAAQAAAAEAAAABAAAAAUAAAAFAAAABQAAAAUAQaDrAAtlAQAAAAEAAAACAAAAAgAAAAMAAAADAAAABAAAAAQAAAAFAAAABQAAAAYAAAAGAAAABwAAAAcAAAAIAAAACAAAAAkAAAAJAAAACgAAAAoAAAALAAAACwAAAAwAAAAMAAAADQAAAA0AQdDsAAsjAgAAAAMAAAAHAAAAAAAAABAREgAIBwkGCgULBAwDDQIOAQ8AQYTtAAtpAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAKAAAADAAAAA4AAAAQAAAAFAAAABgAAAAcAAAAIAAAACgAAAAwAAAAOAAAAEAAAABQAAAAYAAAAHAAAACAAAAAoAAAAMAAAADgAEGE7gALegEAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAAABAACAAQAAAAIAAAADAAAABAAAAAYAAAAIAAAADAAAABAAAAAYAAAAIAAAADAAAABAAAAAYAAAMS4yLjExAEGI7wALbQcAAAAEAAQACAAEAAgAAAAEAAUAEAAIAAgAAAAEAAYAIAAgAAgAAAAEAAQAEAAQAAkAAAAIABAAIAAgAAkAAAAIABAAgACAAAkAAAAIACAAgAAAAQkAAAAgAIAAAgEABAkAAAAgAAIBAgEAEAkAQYDwAAulAgMABAAFAAYABwAIAAkACgALAA0ADwARABMAFwAbAB8AIwArADMAOwBDAFMAYwBzAIMAowDDAOMAAgEAAAAAAAAQABAAEAAQABAAEAAQABAAEQARABEAEQASABIAEgASABMAEwATABMAFAAUABQAFAAVABUAFQAVABAATQDKAAAAAQACAAMABAAFAAcACQANABEAGQAhADEAQQBhAIEAwQABAYEBAQIBAwEEAQYBCAEMARABGAEgATABQAFgAAAAABAAEAAQABAAEQARABIAEgATABMAFAAUABUAFQAWABYAFwAXABgAGAAZABkAGgAaABsAGwAcABwAHQAdAEAAQAAQABEAEgAAAAgABwAJAAYACgAFAAsABAAMAAMADQACAA4AAQAPAEGw8gALwRFgBwAAAAhQAAAIEAAUCHMAEgcfAAAIcAAACDAAAAnAABAHCgAACGAAAAggAAAJoAAACAAAAAiAAAAIQAAACeAAEAcGAAAIWAAACBgAAAmQABMHOwAACHgAAAg4AAAJ0AARBxEAAAhoAAAIKAAACbAAAAgIAAAIiAAACEgAAAnwABAHBAAACFQAAAgUABUI4wATBysAAAh0AAAINAAACcgAEQcNAAAIZAAACCQAAAmoAAAIBAAACIQAAAhEAAAJ6AAQBwgAAAhcAAAIHAAACZgAFAdTAAAIfAAACDwAAAnYABIHFwAACGwAAAgsAAAJuAAACAwAAAiMAAAITAAACfgAEAcDAAAIUgAACBIAFQijABMHIwAACHIAAAgyAAAJxAARBwsAAAhiAAAIIgAACaQAAAgCAAAIggAACEIAAAnkABAHBwAACFoAAAgaAAAJlAAUB0MAAAh6AAAIOgAACdQAEgcTAAAIagAACCoAAAm0AAAICgAACIoAAAhKAAAJ9AAQBwUAAAhWAAAIFgBACAAAEwczAAAIdgAACDYAAAnMABEHDwAACGYAAAgmAAAJrAAACAYAAAiGAAAIRgAACewAEAcJAAAIXgAACB4AAAmcABQHYwAACH4AAAg+AAAJ3AASBxsAAAhuAAAILgAACbwAAAgOAAAIjgAACE4AAAn8AGAHAAAACFEAAAgRABUIgwASBx8AAAhxAAAIMQAACcIAEAcKAAAIYQAACCEAAAmiAAAIAQAACIEAAAhBAAAJ4gAQBwYAAAhZAAAIGQAACZIAEwc7AAAIeQAACDkAAAnSABEHEQAACGkAAAgpAAAJsgAACAkAAAiJAAAISQAACfIAEAcEAAAIVQAACBUAEAgCARMHKwAACHUAAAg1AAAJygARBw0AAAhlAAAIJQAACaoAAAgFAAAIhQAACEUAAAnqABAHCAAACF0AAAgdAAAJmgAUB1MAAAh9AAAIPQAACdoAEgcXAAAIbQAACC0AAAm6AAAIDQAACI0AAAhNAAAJ+gAQBwMAAAhTAAAIEwAVCMMAEwcjAAAIcwAACDMAAAnGABEHCwAACGMAAAgjAAAJpgAACAMAAAiDAAAIQwAACeYAEAcHAAAIWwAACBsAAAmWABQHQwAACHsAAAg7AAAJ1gASBxMAAAhrAAAIKwAACbYAAAgLAAAIiwAACEsAAAn2ABAHBQAACFcAAAgXAEAIAAATBzMAAAh3AAAINwAACc4AEQcPAAAIZwAACCcAAAmuAAAIBwAACIcAAAhHAAAJ7gAQBwkAAAhfAAAIHwAACZ4AFAdjAAAIfwAACD8AAAneABIHGwAACG8AAAgvAAAJvgAACA8AAAiPAAAITwAACf4AYAcAAAAIUAAACBAAFAhzABIHHwAACHAAAAgwAAAJwQAQBwoAAAhgAAAIIAAACaEAAAgAAAAIgAAACEAAAAnhABAHBgAACFgAAAgYAAAJkQATBzsAAAh4AAAIOAAACdEAEQcRAAAIaAAACCgAAAmxAAAICAAACIgAAAhIAAAJ8QAQBwQAAAhUAAAIFAAVCOMAEwcrAAAIdAAACDQAAAnJABEHDQAACGQAAAgkAAAJqQAACAQAAAiEAAAIRAAACekAEAcIAAAIXAAACBwAAAmZABQHUwAACHwAAAg8AAAJ2QASBxcAAAhsAAAILAAACbkAAAgMAAAIjAAACEwAAAn5ABAHAwAACFIAAAgSABUIowATByMAAAhyAAAIMgAACcUAEQcLAAAIYgAACCIAAAmlAAAIAgAACIIAAAhCAAAJ5QAQBwcAAAhaAAAIGgAACZUAFAdDAAAIegAACDoAAAnVABIHEwAACGoAAAgqAAAJtQAACAoAAAiKAAAISgAACfUAEAcFAAAIVgAACBYAQAgAABMHMwAACHYAAAg2AAAJzQARBw8AAAhmAAAIJgAACa0AAAgGAAAIhgAACEYAAAntABAHCQAACF4AAAgeAAAJnQAUB2MAAAh+AAAIPgAACd0AEgcbAAAIbgAACC4AAAm9AAAIDgAACI4AAAhOAAAJ/QBgBwAAAAhRAAAIEQAVCIMAEgcfAAAIcQAACDEAAAnDABAHCgAACGEAAAghAAAJowAACAEAAAiBAAAIQQAACeMAEAcGAAAIWQAACBkAAAmTABMHOwAACHkAAAg5AAAJ0wARBxEAAAhpAAAIKQAACbMAAAgJAAAIiQAACEkAAAnzABAHBAAACFUAAAgVABAIAgETBysAAAh1AAAINQAACcsAEQcNAAAIZQAACCUAAAmrAAAIBQAACIUAAAhFAAAJ6wAQBwgAAAhdAAAIHQAACZsAFAdTAAAIfQAACD0AAAnbABIHFwAACG0AAAgtAAAJuwAACA0AAAiNAAAITQAACfsAEAcDAAAIUwAACBMAFQjDABMHIwAACHMAAAgzAAAJxwARBwsAAAhjAAAIIwAACacAAAgDAAAIgwAACEMAAAnnABAHBwAACFsAAAgbAAAJlwAUB0MAAAh7AAAIOwAACdcAEgcTAAAIawAACCsAAAm3AAAICwAACIsAAAhLAAAJ9wAQBwUAAAhXAAAIFwBACAAAEwczAAAIdwAACDcAAAnPABEHDwAACGcAAAgnAAAJrwAACAcAAAiHAAAIRwAACe8AEAcJAAAIXwAACB8AAAmfABQHYwAACH8AAAg/AAAJ3wASBxsAAAhvAAAILwAACb8AAAgPAAAIjwAACE8AAAn/ABAFAQAXBQEBEwURABsFARARBQUAGQUBBBUFQQAdBQFAEAUDABgFAQIUBSEAHAUBIBIFCQAaBQEIFgWBAEAFAAAQBQIAFwWBARMFGQAbBQEYEQUHABkFAQYVBWEAHQUBYBAFBAAYBQEDFAUxABwFATASBQ0AGgUBDBYFwQBABQAAEQAKABEREQAAAAAFAAAAAAAACQAAAAALAAAAAAAAAAARAA8KERERAwoHAAEACQsLAAAJBgsAAAsABhEAAAAREREAQYGEAQshCwAAAAAAAAAAEQAKChEREQAKAAACAAkLAAAACQALAAALAEG7hAELAQwAQceEAQsVDAAAAAAMAAAAAAkMAAAAAAAMAAAMAEH1hAELAQ4AQYGFAQsVDQAAAAQNAAAAAAkOAAAAAAAOAAAOAEGvhQELARAAQbuFAQseDwAAAAAPAAAAAAkQAAAAAAAQAAAQAAASAAAAEhISAEHyhQELDhIAAAASEhIAAAAAAAAJAEGjhgELAQsAQa+GAQsVCgAAAAAKAAAAAAkLAAAAAAALAAALAEHdhgELAQwAQemGAQsnDAAAAAAMAAAAAAkMAAAAAAAMAAAMAAAwMTIzNDU2Nzg5QUJDREVGAEG0hwELARkAQduHAQsF//////8AQaCIAQtXGRJEOwI/LEcUPTMwChsGRktFNw9JDo4XA0AdPGkrNh9KLRwBICUpIQgMFRYiLhA4Pgs0MRhkdHV2L0EJfzkRI0MyQomKiwUEJignDSoeNYwHGkiTE5SVAEGAiQELig5JbGxlZ2FsIGJ5dGUgc2VxdWVuY2UARG9tYWluIGVycm9yAFJlc3VsdCBub3QgcmVwcmVzZW50YWJsZQBOb3QgYSB0dHkAUGVybWlzc2lvbiBkZW5pZWQAT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQATm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQBObyBzdWNoIHByb2Nlc3MARmlsZSBleGlzdHMAVmFsdWUgdG9vIGxhcmdlIGZvciBkYXRhIHR5cGUATm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UAT3V0IG9mIG1lbW9yeQBSZXNvdXJjZSBidXN5AEludGVycnVwdGVkIHN5c3RlbSBjYWxsAFJlc291cmNlIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlAEludmFsaWQgc2VlawBDcm9zcy1kZXZpY2UgbGluawBSZWFkLW9ubHkgZmlsZSBzeXN0ZW0ARGlyZWN0b3J5IG5vdCBlbXB0eQBDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIAT3BlcmF0aW9uIHRpbWVkIG91dABDb25uZWN0aW9uIHJlZnVzZWQASG9zdCBpcyBkb3duAEhvc3QgaXMgdW5yZWFjaGFibGUAQWRkcmVzcyBpbiB1c2UAQnJva2VuIHBpcGUASS9PIGVycm9yAE5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MAQmxvY2sgZGV2aWNlIHJlcXVpcmVkAE5vIHN1Y2ggZGV2aWNlAE5vdCBhIGRpcmVjdG9yeQBJcyBhIGRpcmVjdG9yeQBUZXh0IGZpbGUgYnVzeQBFeGVjIGZvcm1hdCBlcnJvcgBJbnZhbGlkIGFyZ3VtZW50AEFyZ3VtZW50IGxpc3QgdG9vIGxvbmcAU3ltYm9saWMgbGluayBsb29wAEZpbGVuYW1lIHRvbyBsb25nAFRvbyBtYW55IG9wZW4gZmlsZXMgaW4gc3lzdGVtAE5vIGZpbGUgZGVzY3JpcHRvcnMgYXZhaWxhYmxlAEJhZCBmaWxlIGRlc2NyaXB0b3IATm8gY2hpbGQgcHJvY2VzcwBCYWQgYWRkcmVzcwBGaWxlIHRvbyBsYXJnZQBUb28gbWFueSBsaW5rcwBObyBsb2NrcyBhdmFpbGFibGUAUmVzb3VyY2UgZGVhZGxvY2sgd291bGQgb2NjdXIAU3RhdGUgbm90IHJlY292ZXJhYmxlAFByZXZpb3VzIG93bmVyIGRpZWQAT3BlcmF0aW9uIGNhbmNlbGVkAEZ1bmN0aW9uIG5vdCBpbXBsZW1lbnRlZABObyBtZXNzYWdlIG9mIGRlc2lyZWQgdHlwZQBJZGVudGlmaWVyIHJlbW92ZWQARGV2aWNlIG5vdCBhIHN0cmVhbQBObyBkYXRhIGF2YWlsYWJsZQBEZXZpY2UgdGltZW91dABPdXQgb2Ygc3RyZWFtcyByZXNvdXJjZXMATGluayBoYXMgYmVlbiBzZXZlcmVkAFByb3RvY29sIGVycm9yAEJhZCBtZXNzYWdlAEZpbGUgZGVzY3JpcHRvciBpbiBiYWQgc3RhdGUATm90IGEgc29ja2V0AERlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQATWVzc2FnZSB0b28gbGFyZ2UAUHJvdG9jb2wgd3JvbmcgdHlwZSBmb3Igc29ja2V0AFByb3RvY29sIG5vdCBhdmFpbGFibGUAUHJvdG9jb2wgbm90IHN1cHBvcnRlZABTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkAE5vdCBzdXBwb3J0ZWQAUHJvdG9jb2wgZmFtaWx5IG5vdCBzdXBwb3J0ZWQAQWRkcmVzcyBmYW1pbHkgbm90IHN1cHBvcnRlZCBieSBwcm90b2NvbABBZGRyZXNzIG5vdCBhdmFpbGFibGUATmV0d29yayBpcyBkb3duAE5ldHdvcmsgdW5yZWFjaGFibGUAQ29ubmVjdGlvbiByZXNldCBieSBuZXR3b3JrAENvbm5lY3Rpb24gYWJvcnRlZABObyBidWZmZXIgc3BhY2UgYXZhaWxhYmxlAFNvY2tldCBpcyBjb25uZWN0ZWQAU29ja2V0IG5vdCBjb25uZWN0ZWQAQ2Fubm90IHNlbmQgYWZ0ZXIgc29ja2V0IHNodXRkb3duAE9wZXJhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzAE9wZXJhdGlvbiBpbiBwcm9ncmVzcwBTdGFsZSBmaWxlIGhhbmRsZQBSZW1vdGUgSS9PIGVycm9yAFF1b3RhIGV4Y2VlZGVkAE5vIG1lZGl1bSBmb3VuZABXcm9uZyBtZWRpdW0gdHlwZQBObyBlcnJvciBpbmZvcm1hdGlvbgBBkJcBC1JQUFAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAASAAAACwAAAAwAAAANAAAADgAAAA8AAAAQAAAAEQAAAAEAAAAIAAAAlEsAALRLAEGQmQELAgxQAEHImQELCR8AAADkTAAAAwBB5JkBC4wBLfRRWM+MscBG9rXLKTEDxwRbcDC0Xf0geH+LmthZKVBoSImrp1YDbP+3zYg/1He0K6WjcPG65Kj8QYP92W/hinovLXSWBx8NCV4Ddixw90ClLKdvV0GoqnTfoFhkA0rHxDxTrq9fGAQVseNtKIarDKS/Q/DpUIE5VxZSN/////////////////////8="; - if (!isDataURI(wasmBinaryFile)) { - wasmBinaryFile = locateFile(wasmBinaryFile); - } - function getBinary(file) { - try { - if (file == wasmBinaryFile && wasmBinary) { - return new Uint8Array(wasmBinary); - } - var binary = tryParseAsDataURI(file); - if (binary) { - return binary; - } - if (readBinary) { - return readBinary(file); - } else { - throw "sync fetching of the wasm failed: you can preload it to Module['wasmBinary'] manually, or emcc.py will do that for you when generating HTML (but not JS)"; - } - } catch (err2) { - abort(err2); - } - } - function instantiateSync(file, info) { - var instance; - var module2; - var binary; - try { - binary = getBinary(file); - module2 = new WebAssembly.Module(binary); - instance = new WebAssembly.Instance(module2, info); - } catch (e) { - var str = e.toString(); - err("failed to compile wasm module: " + str); - if (str.includes("imported Memory") || str.includes("memory import")) { - err( - "Memory size incompatibility issues may be due to changing INITIAL_MEMORY at runtime to something too large. Use ALLOW_MEMORY_GROWTH to allow any size memory (and also make sure not to set INITIAL_MEMORY at runtime to something smaller than it was at compile time)." - ); - } - throw e; - } - return [instance, module2]; - } - function createWasm() { - var info = { a: asmLibraryArg }; - function receiveInstance(instance, module2) { - var exports3 = instance.exports; - Module["asm"] = exports3; - wasmMemory = Module["asm"]["u"]; - updateGlobalBufferAndViews(wasmMemory.buffer); - wasmTable = Module["asm"]["pa"]; - addOnInit(Module["asm"]["v"]); - removeRunDependency(); - } - addRunDependency(); - if (Module["instantiateWasm"]) { - try { - var exports2 = Module["instantiateWasm"](info, receiveInstance); - return exports2; - } catch (e) { - err("Module.instantiateWasm callback failed with error: " + e); - return false; - } - } - var result = instantiateSync(wasmBinaryFile, info); - receiveInstance(result[0]); - return Module["asm"]; - } - var tempDouble; - var tempI64; - function callRuntimeCallbacks(callbacks) { - while (callbacks.length > 0) { - var callback = callbacks.shift(); - if (typeof callback == "function") { - callback(Module); - continue; - } - var func = callback.func; - if (typeof func === "number") { - if (callback.arg === void 0) { - wasmTable.get(func)(); - } else { - wasmTable.get(func)(callback.arg); - } - } else { - func(callback.arg === void 0 ? null : callback.arg); - } - } - } - function _gmtime_r(time, tmPtr) { - var date = new Date(HEAP32[time >> 2] * 1e3); - HEAP32[tmPtr >> 2] = date.getUTCSeconds(); - HEAP32[tmPtr + 4 >> 2] = date.getUTCMinutes(); - HEAP32[tmPtr + 8 >> 2] = date.getUTCHours(); - HEAP32[tmPtr + 12 >> 2] = date.getUTCDate(); - HEAP32[tmPtr + 16 >> 2] = date.getUTCMonth(); - HEAP32[tmPtr + 20 >> 2] = date.getUTCFullYear() - 1900; - HEAP32[tmPtr + 24 >> 2] = date.getUTCDay(); - HEAP32[tmPtr + 36 >> 2] = 0; - HEAP32[tmPtr + 32 >> 2] = 0; - var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); - var yday = (date.getTime() - start) / (1e3 * 60 * 60 * 24) | 0; - HEAP32[tmPtr + 28 >> 2] = yday; - if (!_gmtime_r.GMTString) - _gmtime_r.GMTString = allocateUTF8("GMT"); - HEAP32[tmPtr + 40 >> 2] = _gmtime_r.GMTString; - return tmPtr; - } - function ___gmtime_r(a0, a1) { - return _gmtime_r(a0, a1); - } - var PATH = { - splitPath: function(filename) { - var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; - return splitPathRe.exec(filename).slice(1); - }, - normalizeArray: function(parts, allowAboveRoot) { - var up = 0; - for (var i = parts.length - 1; i >= 0; i--) { - var last = parts[i]; - if (last === ".") { - parts.splice(i, 1); - } else if (last === "..") { - parts.splice(i, 1); - up++; - } else if (up) { - parts.splice(i, 1); - up--; - } - } - if (allowAboveRoot) { - for (; up; up--) { - parts.unshift(".."); - } - } - return parts; - }, - normalize: function(path) { - var isAbsolute = path.charAt(0) === "/", trailingSlash = path.substr(-1) === "/"; - path = PATH.normalizeArray( - path.split("/").filter(function(p) { - return !!p; - }), - !isAbsolute - ).join("/"); - if (!path && !isAbsolute) { - path = "."; - } - if (path && trailingSlash) { - path += "/"; - } - return (isAbsolute ? "/" : "") + path; - }, - dirname: function(path) { - var result = PATH.splitPath(path), root = result[0], dir = result[1]; - if (!root && !dir) { - return "."; - } - if (dir) { - dir = dir.substr(0, dir.length - 1); - } - return root + dir; - }, - basename: function(path) { - if (path === "/") - return "/"; - path = PATH.normalize(path); - path = path.replace(/\/$/, ""); - var lastSlash = path.lastIndexOf("/"); - if (lastSlash === -1) - return path; - return path.substr(lastSlash + 1); - }, - extname: function(path) { - return PATH.splitPath(path)[3]; - }, - join: function() { - var paths = Array.prototype.slice.call(arguments, 0); - return PATH.normalize(paths.join("/")); - }, - join2: function(l, r) { - return PATH.normalize(l + "/" + r); - } - }; - function getRandomDevice() { - { - try { - var crypto_module = require("crypto"); - return function() { - return crypto_module["randomBytes"](1)[0]; - }; - } catch (e) { - } - } - return function() { - abort("randomDevice"); - }; - } - var PATH_FS = { - resolve: function() { - var resolvedPath = "", resolvedAbsolute = false; - for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { - var path = i >= 0 ? arguments[i] : FS.cwd(); - if (typeof path !== "string") { - throw new TypeError("Arguments to path.resolve must be strings"); - } else if (!path) { - return ""; - } - resolvedPath = path + "/" + resolvedPath; - resolvedAbsolute = path.charAt(0) === "/"; - } - resolvedPath = PATH.normalizeArray( - resolvedPath.split("/").filter(function(p) { - return !!p; - }), - !resolvedAbsolute - ).join("/"); - return (resolvedAbsolute ? "/" : "") + resolvedPath || "."; - }, - relative: function(from, to) { - from = PATH_FS.resolve(from).substr(1); - to = PATH_FS.resolve(to).substr(1); - function trim(arr) { - var start = 0; - for (; start < arr.length; start++) { - if (arr[start] !== "") - break; - } - var end = arr.length - 1; - for (; end >= 0; end--) { - if (arr[end] !== "") - break; - } - if (start > end) - return []; - return arr.slice(start, end - start + 1); - } - var fromParts = trim(from.split("/")); - var toParts = trim(to.split("/")); - var length = Math.min(fromParts.length, toParts.length); - var samePartsLength = length; - for (var i = 0; i < length; i++) { - if (fromParts[i] !== toParts[i]) { - samePartsLength = i; - break; - } - } - var outputParts = []; - for (var i = samePartsLength; i < fromParts.length; i++) { - outputParts.push(".."); - } - outputParts = outputParts.concat(toParts.slice(samePartsLength)); - return outputParts.join("/"); - } - }; - var TTY = { - ttys: [], - init: function() { - }, - shutdown: function() { - }, - register: function(dev, ops) { - TTY.ttys[dev] = { input: [], output: [], ops }; - FS.registerDevice(dev, TTY.stream_ops); - }, - stream_ops: { - open: function(stream) { - var tty = TTY.ttys[stream.node.rdev]; - if (!tty) { - throw new FS.ErrnoError(43); - } - stream.tty = tty; - stream.seekable = false; - }, - close: function(stream) { - stream.tty.ops.flush(stream.tty); - }, - flush: function(stream) { - stream.tty.ops.flush(stream.tty); - }, - read: function(stream, buffer2, offset, length, pos) { - if (!stream.tty || !stream.tty.ops.get_char) { - throw new FS.ErrnoError(60); - } - var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = stream.tty.ops.get_char(stream.tty); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === void 0 && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === void 0) - break; - bytesRead++; - buffer2[offset + i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - }, - write: function(stream, buffer2, offset, length, pos) { - if (!stream.tty || !stream.tty.ops.put_char) { - throw new FS.ErrnoError(60); - } - try { - for (var i = 0; i < length; i++) { - stream.tty.ops.put_char(stream.tty, buffer2[offset + i]); - } - } catch (e) { - throw new FS.ErrnoError(29); - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }, - default_tty_ops: { - get_char: function(tty) { - if (!tty.input.length) { - var result = null; - { - var BUFSIZE = 256; - var buf = Buffer.alloc ? Buffer.alloc(BUFSIZE) : new Buffer(BUFSIZE); - var bytesRead = 0; - try { - bytesRead = nodeFS.readSync( - process.stdin.fd, - buf, - 0, - BUFSIZE, - null - ); - } catch (e) { - if (e.toString().includes("EOF")) - bytesRead = 0; - else - throw e; - } - if (bytesRead > 0) { - result = buf.slice(0, bytesRead).toString("utf-8"); - } else { - result = null; - } - } - if (!result) { - return null; - } - tty.input = intArrayFromString(result, true); - } - return tty.input.shift(); - }, - put_char: function(tty, val) { - if (val === null || val === 10) { - out(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } else { - if (val != 0) - tty.output.push(val); - } - }, - flush: function(tty) { - if (tty.output && tty.output.length > 0) { - out(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } - } - }, - default_tty1_ops: { - put_char: function(tty, val) { - if (val === null || val === 10) { - err(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } else { - if (val != 0) - tty.output.push(val); - } - }, - flush: function(tty) { - if (tty.output && tty.output.length > 0) { - err(UTF8ArrayToString(tty.output, 0)); - tty.output = []; - } - } - } - }; - function mmapAlloc(size) { - var alignedSize = alignMemory(size, 65536); - var ptr = _malloc(alignedSize); - while (size < alignedSize) - HEAP8[ptr + size++] = 0; - return ptr; - } - var MEMFS = { - ops_table: null, - mount: function(mount) { - return MEMFS.createNode(null, "/", 16384 | 511, 0); - }, - createNode: function(parent, name, mode, dev) { - if (FS.isBlkdev(mode) || FS.isFIFO(mode)) { - throw new FS.ErrnoError(63); - } - if (!MEMFS.ops_table) { - MEMFS.ops_table = { - dir: { - node: { - getattr: MEMFS.node_ops.getattr, - setattr: MEMFS.node_ops.setattr, - lookup: MEMFS.node_ops.lookup, - mknod: MEMFS.node_ops.mknod, - rename: MEMFS.node_ops.rename, - unlink: MEMFS.node_ops.unlink, - rmdir: MEMFS.node_ops.rmdir, - readdir: MEMFS.node_ops.readdir, - symlink: MEMFS.node_ops.symlink - }, - stream: { llseek: MEMFS.stream_ops.llseek } - }, - file: { - node: { - getattr: MEMFS.node_ops.getattr, - setattr: MEMFS.node_ops.setattr - }, - stream: { - llseek: MEMFS.stream_ops.llseek, - read: MEMFS.stream_ops.read, - write: MEMFS.stream_ops.write, - allocate: MEMFS.stream_ops.allocate, - mmap: MEMFS.stream_ops.mmap, - msync: MEMFS.stream_ops.msync - } - }, - link: { - node: { - getattr: MEMFS.node_ops.getattr, - setattr: MEMFS.node_ops.setattr, - readlink: MEMFS.node_ops.readlink - }, - stream: {} - }, - chrdev: { - node: { - getattr: MEMFS.node_ops.getattr, - setattr: MEMFS.node_ops.setattr - }, - stream: FS.chrdev_stream_ops - } - }; - } - var node = FS.createNode(parent, name, mode, dev); - if (FS.isDir(node.mode)) { - node.node_ops = MEMFS.ops_table.dir.node; - node.stream_ops = MEMFS.ops_table.dir.stream; - node.contents = {}; - } else if (FS.isFile(node.mode)) { - node.node_ops = MEMFS.ops_table.file.node; - node.stream_ops = MEMFS.ops_table.file.stream; - node.usedBytes = 0; - node.contents = null; - } else if (FS.isLink(node.mode)) { - node.node_ops = MEMFS.ops_table.link.node; - node.stream_ops = MEMFS.ops_table.link.stream; - } else if (FS.isChrdev(node.mode)) { - node.node_ops = MEMFS.ops_table.chrdev.node; - node.stream_ops = MEMFS.ops_table.chrdev.stream; - } - node.timestamp = Date.now(); - if (parent) { - parent.contents[name] = node; - parent.timestamp = node.timestamp; - } - return node; - }, - getFileDataAsTypedArray: function(node) { - if (!node.contents) - return new Uint8Array(0); - if (node.contents.subarray) - return node.contents.subarray(0, node.usedBytes); - return new Uint8Array(node.contents); - }, - expandFileStorage: function(node, newCapacity) { - var prevCapacity = node.contents ? node.contents.length : 0; - if (prevCapacity >= newCapacity) - return; - var CAPACITY_DOUBLING_MAX = 1024 * 1024; - newCapacity = Math.max( - newCapacity, - prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125) >>> 0 - ); - if (prevCapacity != 0) - newCapacity = Math.max(newCapacity, 256); - var oldContents = node.contents; - node.contents = new Uint8Array(newCapacity); - if (node.usedBytes > 0) - node.contents.set(oldContents.subarray(0, node.usedBytes), 0); - }, - resizeFileStorage: function(node, newSize) { - if (node.usedBytes == newSize) - return; - if (newSize == 0) { - node.contents = null; - node.usedBytes = 0; - } else { - var oldContents = node.contents; - node.contents = new Uint8Array(newSize); - if (oldContents) { - node.contents.set( - oldContents.subarray(0, Math.min(newSize, node.usedBytes)) - ); - } - node.usedBytes = newSize; - } - }, - node_ops: { - getattr: function(node) { - var attr = {}; - attr.dev = FS.isChrdev(node.mode) ? node.id : 1; - attr.ino = node.id; - attr.mode = node.mode; - attr.nlink = 1; - attr.uid = 0; - attr.gid = 0; - attr.rdev = node.rdev; - if (FS.isDir(node.mode)) { - attr.size = 4096; - } else if (FS.isFile(node.mode)) { - attr.size = node.usedBytes; - } else if (FS.isLink(node.mode)) { - attr.size = node.link.length; - } else { - attr.size = 0; - } - attr.atime = new Date(node.timestamp); - attr.mtime = new Date(node.timestamp); - attr.ctime = new Date(node.timestamp); - attr.blksize = 4096; - attr.blocks = Math.ceil(attr.size / attr.blksize); - return attr; - }, - setattr: function(node, attr) { - if (attr.mode !== void 0) { - node.mode = attr.mode; - } - if (attr.timestamp !== void 0) { - node.timestamp = attr.timestamp; - } - if (attr.size !== void 0) { - MEMFS.resizeFileStorage(node, attr.size); - } - }, - lookup: function(parent, name) { - throw FS.genericErrors[44]; - }, - mknod: function(parent, name, mode, dev) { - return MEMFS.createNode(parent, name, mode, dev); - }, - rename: function(old_node, new_dir, new_name) { - if (FS.isDir(old_node.mode)) { - var new_node; - try { - new_node = FS.lookupNode(new_dir, new_name); - } catch (e) { - } - if (new_node) { - for (var i in new_node.contents) { - throw new FS.ErrnoError(55); - } - } - } - delete old_node.parent.contents[old_node.name]; - old_node.parent.timestamp = Date.now(); - old_node.name = new_name; - new_dir.contents[new_name] = old_node; - new_dir.timestamp = old_node.parent.timestamp; - old_node.parent = new_dir; - }, - unlink: function(parent, name) { - delete parent.contents[name]; - parent.timestamp = Date.now(); - }, - rmdir: function(parent, name) { - var node = FS.lookupNode(parent, name); - for (var i in node.contents) { - throw new FS.ErrnoError(55); - } - delete parent.contents[name]; - parent.timestamp = Date.now(); - }, - readdir: function(node) { - var entries = [".", ".."]; - for (var key2 in node.contents) { - if (!node.contents.hasOwnProperty(key2)) { - continue; - } - entries.push(key2); - } - return entries; - }, - symlink: function(parent, newname, oldpath) { - var node = MEMFS.createNode(parent, newname, 511 | 40960, 0); - node.link = oldpath; - return node; - }, - readlink: function(node) { - if (!FS.isLink(node.mode)) { - throw new FS.ErrnoError(28); - } - return node.link; - } - }, - stream_ops: { - read: function(stream, buffer2, offset, length, position) { - var contents = stream.node.contents; - if (position >= stream.node.usedBytes) - return 0; - var size = Math.min(stream.node.usedBytes - position, length); - if (size > 8 && contents.subarray) { - buffer2.set(contents.subarray(position, position + size), offset); - } else { - for (var i = 0; i < size; i++) - buffer2[offset + i] = contents[position + i]; - } - return size; - }, - write: function(stream, buffer2, offset, length, position, canOwn) { - if (buffer2.buffer === HEAP8.buffer) { - canOwn = false; - } - if (!length) - return 0; - var node = stream.node; - node.timestamp = Date.now(); - if (buffer2.subarray && (!node.contents || node.contents.subarray)) { - if (canOwn) { - node.contents = buffer2.subarray(offset, offset + length); - node.usedBytes = length; - return length; - } else if (node.usedBytes === 0 && position === 0) { - node.contents = buffer2.slice(offset, offset + length); - node.usedBytes = length; - return length; - } else if (position + length <= node.usedBytes) { - node.contents.set( - buffer2.subarray(offset, offset + length), - position - ); - return length; - } - } - MEMFS.expandFileStorage(node, position + length); - if (node.contents.subarray && buffer2.subarray) { - node.contents.set( - buffer2.subarray(offset, offset + length), - position - ); - } else { - for (var i = 0; i < length; i++) { - node.contents[position + i] = buffer2[offset + i]; - } - } - node.usedBytes = Math.max(node.usedBytes, position + length); - return length; - }, - llseek: function(stream, offset, whence) { - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - if (FS.isFile(stream.node.mode)) { - position += stream.node.usedBytes; - } - } - if (position < 0) { - throw new FS.ErrnoError(28); - } - return position; - }, - allocate: function(stream, offset, length) { - MEMFS.expandFileStorage(stream.node, offset + length); - stream.node.usedBytes = Math.max( - stream.node.usedBytes, - offset + length - ); - }, - mmap: function(stream, address, length, position, prot, flags) { - if (address !== 0) { - throw new FS.ErrnoError(28); - } - if (!FS.isFile(stream.node.mode)) { - throw new FS.ErrnoError(43); - } - var ptr; - var allocated; - var contents = stream.node.contents; - if (!(flags & 2) && contents.buffer === buffer) { - allocated = false; - ptr = contents.byteOffset; - } else { - if (position > 0 || position + length < contents.length) { - if (contents.subarray) { - contents = contents.subarray(position, position + length); - } else { - contents = Array.prototype.slice.call( - contents, - position, - position + length - ); - } - } - allocated = true; - ptr = mmapAlloc(length); - if (!ptr) { - throw new FS.ErrnoError(48); - } - HEAP8.set(contents, ptr); - } - return { ptr, allocated }; - }, - msync: function(stream, buffer2, offset, length, mmapFlags) { - if (!FS.isFile(stream.node.mode)) { - throw new FS.ErrnoError(43); - } - if (mmapFlags & 2) { - return 0; - } - MEMFS.stream_ops.write( - stream, - buffer2, - 0, - length, - offset, - false - ); - return 0; - } - } - }; - var ERRNO_CODES = { - EPERM: 63, - ENOENT: 44, - ESRCH: 71, - EINTR: 27, - EIO: 29, - ENXIO: 60, - E2BIG: 1, - ENOEXEC: 45, - EBADF: 8, - ECHILD: 12, - EAGAIN: 6, - EWOULDBLOCK: 6, - ENOMEM: 48, - EACCES: 2, - EFAULT: 21, - ENOTBLK: 105, - EBUSY: 10, - EEXIST: 20, - EXDEV: 75, - ENODEV: 43, - ENOTDIR: 54, - EISDIR: 31, - EINVAL: 28, - ENFILE: 41, - EMFILE: 33, - ENOTTY: 59, - ETXTBSY: 74, - EFBIG: 22, - ENOSPC: 51, - ESPIPE: 70, - EROFS: 69, - EMLINK: 34, - EPIPE: 64, - EDOM: 18, - ERANGE: 68, - ENOMSG: 49, - EIDRM: 24, - ECHRNG: 106, - EL2NSYNC: 156, - EL3HLT: 107, - EL3RST: 108, - ELNRNG: 109, - EUNATCH: 110, - ENOCSI: 111, - EL2HLT: 112, - EDEADLK: 16, - ENOLCK: 46, - EBADE: 113, - EBADR: 114, - EXFULL: 115, - ENOANO: 104, - EBADRQC: 103, - EBADSLT: 102, - EDEADLOCK: 16, - EBFONT: 101, - ENOSTR: 100, - ENODATA: 116, - ETIME: 117, - ENOSR: 118, - ENONET: 119, - ENOPKG: 120, - EREMOTE: 121, - ENOLINK: 47, - EADV: 122, - ESRMNT: 123, - ECOMM: 124, - EPROTO: 65, - EMULTIHOP: 36, - EDOTDOT: 125, - EBADMSG: 9, - ENOTUNIQ: 126, - EBADFD: 127, - EREMCHG: 128, - ELIBACC: 129, - ELIBBAD: 130, - ELIBSCN: 131, - ELIBMAX: 132, - ELIBEXEC: 133, - ENOSYS: 52, - ENOTEMPTY: 55, - ENAMETOOLONG: 37, - ELOOP: 32, - EOPNOTSUPP: 138, - EPFNOSUPPORT: 139, - ECONNRESET: 15, - ENOBUFS: 42, - EAFNOSUPPORT: 5, - EPROTOTYPE: 67, - ENOTSOCK: 57, - ENOPROTOOPT: 50, - ESHUTDOWN: 140, - ECONNREFUSED: 14, - EADDRINUSE: 3, - ECONNABORTED: 13, - ENETUNREACH: 40, - ENETDOWN: 38, - ETIMEDOUT: 73, - EHOSTDOWN: 142, - EHOSTUNREACH: 23, - EINPROGRESS: 26, - EALREADY: 7, - EDESTADDRREQ: 17, - EMSGSIZE: 35, - EPROTONOSUPPORT: 66, - ESOCKTNOSUPPORT: 137, - EADDRNOTAVAIL: 4, - ENETRESET: 39, - EISCONN: 30, - ENOTCONN: 53, - ETOOMANYREFS: 141, - EUSERS: 136, - EDQUOT: 19, - ESTALE: 72, - ENOTSUP: 138, - ENOMEDIUM: 148, - EILSEQ: 25, - EOVERFLOW: 61, - ECANCELED: 11, - ENOTRECOVERABLE: 56, - EOWNERDEAD: 62, - ESTRPIPE: 135 - }; - var NODEFS = { - isWindows: false, - staticInit: function() { - NODEFS.isWindows = !!process.platform.match(/^win/); - var flags = { fs: fs.constants }; - if (flags["fs"]) { - flags = flags["fs"]; - } - NODEFS.flagsForNodeMap = { - 1024: flags["O_APPEND"], - 64: flags["O_CREAT"], - 128: flags["O_EXCL"], - 256: flags["O_NOCTTY"], - 0: flags["O_RDONLY"], - 2: flags["O_RDWR"], - 4096: flags["O_SYNC"], - 512: flags["O_TRUNC"], - 1: flags["O_WRONLY"] - }; - }, - bufferFrom: function(arrayBuffer) { - return Buffer["alloc"] ? Buffer.from(arrayBuffer) : new Buffer(arrayBuffer); - }, - convertNodeCode: function(e) { - var code = e.code; - return ERRNO_CODES[code]; - }, - mount: function(mount) { - return NODEFS.createNode(null, "/", NODEFS.getMode(mount.opts.root), 0); - }, - createNode: function(parent, name, mode, dev) { - if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) { - throw new FS.ErrnoError(28); - } - var node = FS.createNode(parent, name, mode); - node.node_ops = NODEFS.node_ops; - node.stream_ops = NODEFS.stream_ops; - return node; - }, - getMode: function(path) { - var stat; - try { - stat = fs.lstatSync(path); - if (NODEFS.isWindows) { - stat.mode = stat.mode | (stat.mode & 292) >> 2; - } - } catch (e) { - if (!e.code) - throw e; - throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); - } - return stat.mode; - }, - realPath: function(node) { - var parts = []; - while (node.parent !== node) { - parts.push(node.name); - node = node.parent; - } - parts.push(node.mount.opts.root); - parts.reverse(); - return PATH.join.apply(null, parts); - }, - flagsForNode: function(flags) { - flags &= ~2097152; - flags &= ~2048; - flags &= ~32768; - flags &= ~524288; - var newFlags = 0; - for (var k in NODEFS.flagsForNodeMap) { - if (flags & k) { - newFlags |= NODEFS.flagsForNodeMap[k]; - flags ^= k; - } - } - if (!flags) { - return newFlags; - } else { - throw new FS.ErrnoError(28); - } - }, - node_ops: { - getattr: function(node) { - var path = NODEFS.realPath(node); - var stat; - try { - stat = fs.lstatSync(path); - } catch (e) { - if (!e.code) - throw e; - throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); - } - if (NODEFS.isWindows && !stat.blksize) { - stat.blksize = 4096; - } - if (NODEFS.isWindows && !stat.blocks) { - stat.blocks = (stat.size + stat.blksize - 1) / stat.blksize | 0; - } - return { - dev: stat.dev, - ino: stat.ino, - mode: stat.mode, - nlink: stat.nlink, - uid: stat.uid, - gid: stat.gid, - rdev: stat.rdev, - size: stat.size, - atime: stat.atime, - mtime: stat.mtime, - ctime: stat.ctime, - blksize: stat.blksize, - blocks: stat.blocks - }; - }, - setattr: function(node, attr) { - var path = NODEFS.realPath(node); - try { - if (attr.mode !== void 0) { - fs.chmodSync(path, attr.mode); - node.mode = attr.mode; - } - if (attr.timestamp !== void 0) { - var date = new Date(attr.timestamp); - fs.utimesSync(path, date, date); - } - if (attr.size !== void 0) { - fs.truncateSync(path, attr.size); - } - } catch (e) { - if (!e.code) - throw e; - throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); - } - }, - lookup: function(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - var mode = NODEFS.getMode(path); - return NODEFS.createNode(parent, name, mode); - }, - mknod: function(parent, name, mode, dev) { - var node = NODEFS.createNode(parent, name, mode, dev); - var path = NODEFS.realPath(node); - try { - if (FS.isDir(node.mode)) { - fs.mkdirSync(path, node.mode); - } else { - fs.writeFileSync(path, "", { mode: node.mode }); - } - } catch (e) { - if (!e.code) - throw e; - throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); - } - return node; - }, - rename: function(oldNode, newDir, newName) { - var oldPath = NODEFS.realPath(oldNode); - var newPath = PATH.join2(NODEFS.realPath(newDir), newName); - try { - fs.renameSync(oldPath, newPath); - } catch (e) { - if (!e.code) - throw e; - throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); - } - oldNode.name = newName; - }, - unlink: function(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - try { - fs.unlinkSync(path); - } catch (e) { - if (!e.code) - throw e; - throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); - } - }, - rmdir: function(parent, name) { - var path = PATH.join2(NODEFS.realPath(parent), name); - try { - fs.rmdirSync(path); - } catch (e) { - if (!e.code) - throw e; - throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); - } - }, - readdir: function(node) { - var path = NODEFS.realPath(node); - try { - return fs.readdirSync(path); - } catch (e) { - if (!e.code) - throw e; - throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); - } - }, - symlink: function(parent, newName, oldPath) { - var newPath = PATH.join2(NODEFS.realPath(parent), newName); - try { - fs.symlinkSync(oldPath, newPath); - } catch (e) { - if (!e.code) - throw e; - throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); - } - }, - readlink: function(node) { - var path = NODEFS.realPath(node); - try { - path = fs.readlinkSync(path); - path = NODEJS_PATH.relative( - NODEJS_PATH.resolve(node.mount.opts.root), - path - ); - return path; - } catch (e) { - if (!e.code) - throw e; - throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); - } - } - }, - stream_ops: { - open: function(stream) { - var path = NODEFS.realPath(stream.node); - try { - if (FS.isFile(stream.node.mode)) { - stream.nfd = fs.openSync(path, NODEFS.flagsForNode(stream.flags)); - } - } catch (e) { - if (!e.code) - throw e; - throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); - } - }, - close: function(stream) { - try { - if (FS.isFile(stream.node.mode) && stream.nfd) { - fs.closeSync(stream.nfd); - } - } catch (e) { - if (!e.code) - throw e; - throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); - } - }, - read: function(stream, buffer2, offset, length, position) { - if (length === 0) - return 0; - try { - return fs.readSync( - stream.nfd, - NODEFS.bufferFrom(buffer2.buffer), - offset, - length, - position - ); - } catch (e) { - throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); - } - }, - write: function(stream, buffer2, offset, length, position) { - try { - return fs.writeSync( - stream.nfd, - NODEFS.bufferFrom(buffer2.buffer), - offset, - length, - position - ); - } catch (e) { - throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); - } - }, - llseek: function(stream, offset, whence) { - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - if (FS.isFile(stream.node.mode)) { - try { - var stat = fs.fstatSync(stream.nfd); - position += stat.size; - } catch (e) { - throw new FS.ErrnoError(NODEFS.convertNodeCode(e)); - } - } - } - if (position < 0) { - throw new FS.ErrnoError(28); - } - return position; - }, - mmap: function(stream, address, length, position, prot, flags) { - if (address !== 0) { - throw new FS.ErrnoError(28); - } - if (!FS.isFile(stream.node.mode)) { - throw new FS.ErrnoError(43); - } - var ptr = mmapAlloc(length); - NODEFS.stream_ops.read(stream, HEAP8, ptr, length, position); - return { ptr, allocated: true }; - }, - msync: function(stream, buffer2, offset, length, mmapFlags) { - if (!FS.isFile(stream.node.mode)) { - throw new FS.ErrnoError(43); - } - if (mmapFlags & 2) { - return 0; - } - NODEFS.stream_ops.write( - stream, - buffer2, - 0, - length, - offset, - false - ); - return 0; - } - } - }; - var NODERAWFS = { - lookupPath: function(path) { - return { path, node: { mode: NODEFS.getMode(path) } }; - }, - createStandardStreams: function() { - FS.streams[0] = { - fd: 0, - nfd: 0, - position: 0, - path: "", - flags: 0, - tty: true, - seekable: false - }; - for (var i = 1; i < 3; i++) { - FS.streams[i] = { - fd: i, - nfd: i, - position: 0, - path: "", - flags: 577, - tty: true, - seekable: false - }; - } - }, - cwd: function() { - return process.cwd(); - }, - chdir: function() { - process.chdir.apply(void 0, arguments); - }, - mknod: function(path, mode) { - if (FS.isDir(path)) { - fs.mkdirSync(path, mode); - } else { - fs.writeFileSync(path, "", { mode }); - } - }, - mkdir: function() { - fs.mkdirSync.apply(void 0, arguments); - }, - symlink: function() { - fs.symlinkSync.apply(void 0, arguments); - }, - rename: function() { - fs.renameSync.apply(void 0, arguments); - }, - rmdir: function() { - fs.rmdirSync.apply(void 0, arguments); - }, - readdir: function() { - fs.readdirSync.apply(void 0, arguments); - }, - unlink: function() { - fs.unlinkSync.apply(void 0, arguments); - }, - readlink: function() { - return fs.readlinkSync.apply(void 0, arguments); - }, - stat: function() { - return fs.statSync.apply(void 0, arguments); - }, - lstat: function() { - return fs.lstatSync.apply(void 0, arguments); - }, - chmod: function() { - fs.chmodSync.apply(void 0, arguments); - }, - fchmod: function() { - fs.fchmodSync.apply(void 0, arguments); - }, - chown: function() { - fs.chownSync.apply(void 0, arguments); - }, - fchown: function() { - fs.fchownSync.apply(void 0, arguments); - }, - truncate: function() { - fs.truncateSync.apply(void 0, arguments); - }, - ftruncate: function(fd, len) { - if (len < 0) { - throw new FS.ErrnoError(28); - } - fs.ftruncateSync.apply(void 0, arguments); - }, - utime: function() { - fs.utimesSync.apply(void 0, arguments); - }, - open: function(path, flags, mode, suggestFD) { - if (typeof flags === "string") { - flags = VFS.modeStringToFlags(flags); - } - var nfd = fs.openSync(path, NODEFS.flagsForNode(flags), mode); - var fd = suggestFD != null ? suggestFD : FS.nextfd(nfd); - var stream = { - fd, - nfd, - position: 0, - path, - flags, - seekable: true - }; - FS.streams[fd] = stream; - return stream; - }, - close: function(stream) { - if (!stream.stream_ops) { - fs.closeSync(stream.nfd); - } - FS.closeStream(stream.fd); - }, - llseek: function(stream, offset, whence) { - if (stream.stream_ops) { - return VFS.llseek(stream, offset, whence); - } - var position = offset; - if (whence === 1) { - position += stream.position; - } else if (whence === 2) { - position += fs.fstatSync(stream.nfd).size; - } else if (whence !== 0) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - if (position < 0) { - throw new FS.ErrnoError(ERRNO_CODES.EINVAL); - } - stream.position = position; - return position; - }, - read: function(stream, buffer2, offset, length, position) { - if (stream.stream_ops) { - return VFS.read(stream, buffer2, offset, length, position); - } - var seeking = typeof position !== "undefined"; - if (!seeking && stream.seekable) - position = stream.position; - var bytesRead = fs.readSync( - stream.nfd, - NODEFS.bufferFrom(buffer2.buffer), - offset, - length, - position - ); - if (!seeking) - stream.position += bytesRead; - return bytesRead; - }, - write: function(stream, buffer2, offset, length, position) { - if (stream.stream_ops) { - return VFS.write(stream, buffer2, offset, length, position); - } - if (stream.flags & +"1024") { - FS.llseek(stream, 0, +"2"); - } - var seeking = typeof position !== "undefined"; - if (!seeking && stream.seekable) - position = stream.position; - var bytesWritten = fs.writeSync( - stream.nfd, - NODEFS.bufferFrom(buffer2.buffer), - offset, - length, - position - ); - if (!seeking) - stream.position += bytesWritten; - return bytesWritten; - }, - allocate: function() { - throw new FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP); - }, - mmap: function(stream, address, length, position, prot, flags) { - if (stream.stream_ops) { - return VFS.mmap(stream, address, length, position, prot, flags); - } - if (address !== 0) { - throw new FS.ErrnoError(28); - } - var ptr = mmapAlloc(length); - FS.read(stream, HEAP8, ptr, length, position); - return { ptr, allocated: true }; - }, - msync: function(stream, buffer2, offset, length, mmapFlags) { - if (stream.stream_ops) { - return VFS.msync(stream, buffer2, offset, length, mmapFlags); - } - if (mmapFlags & 2) { - return 0; - } - FS.write(stream, buffer2, 0, length, offset); - return 0; - }, - munmap: function() { - return 0; - }, - ioctl: function() { - throw new FS.ErrnoError(ERRNO_CODES.ENOTTY); - } - }; - var FS = { - root: null, - mounts: [], - devices: {}, - streams: [], - nextInode: 1, - nameTable: null, - currentPath: "/", - initialized: false, - ignorePermissions: true, - trackingDelegate: {}, - tracking: { openFlags: { READ: 1, WRITE: 2 } }, - ErrnoError: null, - genericErrors: {}, - filesystems: null, - syncFSRequests: 0, - lookupPath: function(path, opts) { - path = PATH_FS.resolve(FS.cwd(), path); - opts = opts || {}; - if (!path) - return { path: "", node: null }; - var defaults = { follow_mount: true, recurse_count: 0 }; - for (var key2 in defaults) { - if (opts[key2] === void 0) { - opts[key2] = defaults[key2]; - } - } - if (opts.recurse_count > 8) { - throw new FS.ErrnoError(32); - } - var parts = PATH.normalizeArray( - path.split("/").filter(function(p) { - return !!p; - }), - false - ); - var current = FS.root; - var current_path = "/"; - for (var i = 0; i < parts.length; i++) { - var islast = i === parts.length - 1; - if (islast && opts.parent) { - break; - } - current = FS.lookupNode(current, parts[i]); - current_path = PATH.join2(current_path, parts[i]); - if (FS.isMountpoint(current)) { - if (!islast || islast && opts.follow_mount) { - current = current.mounted.root; - } - } - if (!islast || opts.follow) { - var count = 0; - while (FS.isLink(current.mode)) { - var link = FS.readlink(current_path); - current_path = PATH_FS.resolve(PATH.dirname(current_path), link); - var lookup = FS.lookupPath(current_path, { - recurse_count: opts.recurse_count - }); - current = lookup.node; - if (count++ > 40) { - throw new FS.ErrnoError(32); - } - } - } - } - return { path: current_path, node: current }; - }, - getPath: function(node) { - var path; - while (true) { - if (FS.isRoot(node)) { - var mount = node.mount.mountpoint; - if (!path) - return mount; - return mount[mount.length - 1] !== "/" ? mount + "/" + path : mount + path; - } - path = path ? node.name + "/" + path : node.name; - node = node.parent; - } - }, - hashName: function(parentid, name) { - var hash = 0; - for (var i = 0; i < name.length; i++) { - hash = (hash << 5) - hash + name.charCodeAt(i) | 0; - } - return (parentid + hash >>> 0) % FS.nameTable.length; - }, - hashAddNode: function(node) { - var hash = FS.hashName(node.parent.id, node.name); - node.name_next = FS.nameTable[hash]; - FS.nameTable[hash] = node; - }, - hashRemoveNode: function(node) { - var hash = FS.hashName(node.parent.id, node.name); - if (FS.nameTable[hash] === node) { - FS.nameTable[hash] = node.name_next; - } else { - var current = FS.nameTable[hash]; - while (current) { - if (current.name_next === node) { - current.name_next = node.name_next; - break; - } - current = current.name_next; - } - } - }, - lookupNode: function(parent, name) { - var errCode = FS.mayLookup(parent); - if (errCode) { - throw new FS.ErrnoError(errCode, parent); - } - var hash = FS.hashName(parent.id, name); - for (var node = FS.nameTable[hash]; node; node = node.name_next) { - var nodeName = node.name; - if (node.parent.id === parent.id && nodeName === name) { - return node; - } - } - return FS.lookup(parent, name); - }, - createNode: function(parent, name, mode, rdev) { - var node = new FS.FSNode(parent, name, mode, rdev); - FS.hashAddNode(node); - return node; - }, - destroyNode: function(node) { - FS.hashRemoveNode(node); - }, - isRoot: function(node) { - return node === node.parent; - }, - isMountpoint: function(node) { - return !!node.mounted; - }, - isFile: function(mode) { - return (mode & 61440) === 32768; - }, - isDir: function(mode) { - return (mode & 61440) === 16384; - }, - isLink: function(mode) { - return (mode & 61440) === 40960; - }, - isChrdev: function(mode) { - return (mode & 61440) === 8192; - }, - isBlkdev: function(mode) { - return (mode & 61440) === 24576; - }, - isFIFO: function(mode) { - return (mode & 61440) === 4096; - }, - isSocket: function(mode) { - return (mode & 49152) === 49152; - }, - flagModes: { r: 0, "r+": 2, w: 577, "w+": 578, a: 1089, "a+": 1090 }, - modeStringToFlags: function(str) { - var flags = FS.flagModes[str]; - if (typeof flags === "undefined") { - throw new Error("Unknown file open mode: " + str); - } - return flags; - }, - flagsToPermissionString: function(flag) { - var perms = ["r", "w", "rw"][flag & 3]; - if (flag & 512) { - perms += "w"; - } - return perms; - }, - nodePermissions: function(node, perms) { - if (FS.ignorePermissions) { - return 0; - } - if (perms.includes("r") && !(node.mode & 292)) { - return 2; - } else if (perms.includes("w") && !(node.mode & 146)) { - return 2; - } else if (perms.includes("x") && !(node.mode & 73)) { - return 2; - } - return 0; - }, - mayLookup: function(dir) { - var errCode = FS.nodePermissions(dir, "x"); - if (errCode) - return errCode; - if (!dir.node_ops.lookup) - return 2; - return 0; - }, - mayCreate: function(dir, name) { - try { - var node = FS.lookupNode(dir, name); - return 20; - } catch (e) { - } - return FS.nodePermissions(dir, "wx"); - }, - mayDelete: function(dir, name, isdir) { - var node; - try { - node = FS.lookupNode(dir, name); - } catch (e) { - return e.errno; - } - var errCode = FS.nodePermissions(dir, "wx"); - if (errCode) { - return errCode; - } - if (isdir) { - if (!FS.isDir(node.mode)) { - return 54; - } - if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) { - return 10; - } - } else { - if (FS.isDir(node.mode)) { - return 31; - } - } - return 0; - }, - mayOpen: function(node, flags) { - if (!node) { - return 44; - } - if (FS.isLink(node.mode)) { - return 32; - } else if (FS.isDir(node.mode)) { - if (FS.flagsToPermissionString(flags) !== "r" || flags & 512) { - return 31; - } - } - return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); - }, - MAX_OPEN_FDS: 4096, - nextfd: function(fd_start, fd_end) { - fd_start = fd_start || 0; - fd_end = fd_end || FS.MAX_OPEN_FDS; - for (var fd = fd_start; fd <= fd_end; fd++) { - if (!FS.streams[fd]) { - return fd; - } - } - throw new FS.ErrnoError(33); - }, - getStream: function(fd) { - return FS.streams[fd]; - }, - createStream: function(stream, fd_start, fd_end) { - if (!FS.FSStream) { - FS.FSStream = function() { - }; - FS.FSStream.prototype = { - object: { - get: function() { - return this.node; - }, - set: function(val) { - this.node = val; - } - }, - isRead: { - get: function() { - return (this.flags & 2097155) !== 1; - } - }, - isWrite: { - get: function() { - return (this.flags & 2097155) !== 0; - } - }, - isAppend: { - get: function() { - return this.flags & 1024; - } - } - }; - } - var newStream = new FS.FSStream(); - for (var p in stream) { - newStream[p] = stream[p]; - } - stream = newStream; - var fd = FS.nextfd(fd_start, fd_end); - stream.fd = fd; - FS.streams[fd] = stream; - return stream; - }, - closeStream: function(fd) { - FS.streams[fd] = null; - }, - chrdev_stream_ops: { - open: function(stream) { - var device = FS.getDevice(stream.node.rdev); - stream.stream_ops = device.stream_ops; - if (stream.stream_ops.open) { - stream.stream_ops.open(stream); - } - }, - llseek: function() { - throw new FS.ErrnoError(70); - } - }, - major: function(dev) { - return dev >> 8; - }, - minor: function(dev) { - return dev & 255; - }, - makedev: function(ma, mi) { - return ma << 8 | mi; - }, - registerDevice: function(dev, ops) { - FS.devices[dev] = { stream_ops: ops }; - }, - getDevice: function(dev) { - return FS.devices[dev]; - }, - getMounts: function(mount) { - var mounts = []; - var check = [mount]; - while (check.length) { - var m = check.pop(); - mounts.push(m); - check.push.apply(check, m.mounts); - } - return mounts; - }, - syncfs: function(populate, callback) { - if (typeof populate === "function") { - callback = populate; - populate = false; - } - FS.syncFSRequests++; - if (FS.syncFSRequests > 1) { - err( - "warning: " + FS.syncFSRequests + " FS.syncfs operations in flight at once, probably just doing extra work" - ); - } - var mounts = FS.getMounts(FS.root.mount); - var completed = 0; - function doCallback(errCode) { - FS.syncFSRequests--; - return callback(errCode); - } - function done(errCode) { - if (errCode) { - if (!done.errored) { - done.errored = true; - return doCallback(errCode); - } - return; - } - if (++completed >= mounts.length) { - doCallback(null); - } - } - mounts.forEach(function(mount) { - if (!mount.type.syncfs) { - return done(null); - } - mount.type.syncfs(mount, populate, done); - }); - }, - mount: function(type, opts, mountpoint) { - var root = mountpoint === "/"; - var pseudo = !mountpoint; - var node; - if (root && FS.root) { - throw new FS.ErrnoError(10); - } else if (!root && !pseudo) { - var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); - mountpoint = lookup.path; - node = lookup.node; - if (FS.isMountpoint(node)) { - throw new FS.ErrnoError(10); - } - if (!FS.isDir(node.mode)) { - throw new FS.ErrnoError(54); - } - } - var mount = { - type, - opts, - mountpoint, - mounts: [] - }; - var mountRoot = type.mount(mount); - mountRoot.mount = mount; - mount.root = mountRoot; - if (root) { - FS.root = mountRoot; - } else if (node) { - node.mounted = mount; - if (node.mount) { - node.mount.mounts.push(mount); - } - } - return mountRoot; - }, - unmount: function(mountpoint) { - var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); - if (!FS.isMountpoint(lookup.node)) { - throw new FS.ErrnoError(28); - } - var node = lookup.node; - var mount = node.mounted; - var mounts = FS.getMounts(mount); - Object.keys(FS.nameTable).forEach(function(hash) { - var current = FS.nameTable[hash]; - while (current) { - var next = current.name_next; - if (mounts.includes(current.mount)) { - FS.destroyNode(current); - } - current = next; - } - }); - node.mounted = null; - var idx = node.mount.mounts.indexOf(mount); - node.mount.mounts.splice(idx, 1); - }, - lookup: function(parent, name) { - return parent.node_ops.lookup(parent, name); - }, - mknod: function(path, mode, dev) { - var lookup = FS.lookupPath(path, { parent: true }); - var parent = lookup.node; - var name = PATH.basename(path); - if (!name || name === "." || name === "..") { - throw new FS.ErrnoError(28); - } - var errCode = FS.mayCreate(parent, name); - if (errCode) { - throw new FS.ErrnoError(errCode); - } - if (!parent.node_ops.mknod) { - throw new FS.ErrnoError(63); - } - return parent.node_ops.mknod(parent, name, mode, dev); - }, - create: function(path, mode) { - mode = mode !== void 0 ? mode : 438; - mode &= 4095; - mode |= 32768; - return FS.mknod(path, mode, 0); - }, - mkdir: function(path, mode) { - mode = mode !== void 0 ? mode : 511; - mode &= 511 | 512; - mode |= 16384; - return FS.mknod(path, mode, 0); - }, - mkdirTree: function(path, mode) { - var dirs = path.split("/"); - var d = ""; - for (var i = 0; i < dirs.length; ++i) { - if (!dirs[i]) - continue; - d += "/" + dirs[i]; - try { - FS.mkdir(d, mode); - } catch (e) { - if (e.errno != 20) - throw e; - } - } - }, - mkdev: function(path, mode, dev) { - if (typeof dev === "undefined") { - dev = mode; - mode = 438; - } - mode |= 8192; - return FS.mknod(path, mode, dev); - }, - symlink: function(oldpath, newpath) { - if (!PATH_FS.resolve(oldpath)) { - throw new FS.ErrnoError(44); - } - var lookup = FS.lookupPath(newpath, { parent: true }); - var parent = lookup.node; - if (!parent) { - throw new FS.ErrnoError(44); - } - var newname = PATH.basename(newpath); - var errCode = FS.mayCreate(parent, newname); - if (errCode) { - throw new FS.ErrnoError(errCode); - } - if (!parent.node_ops.symlink) { - throw new FS.ErrnoError(63); - } - return parent.node_ops.symlink(parent, newname, oldpath); - }, - rename: function(old_path, new_path) { - var old_dirname = PATH.dirname(old_path); - var new_dirname = PATH.dirname(new_path); - var old_name = PATH.basename(old_path); - var new_name = PATH.basename(new_path); - var lookup, old_dir, new_dir; - lookup = FS.lookupPath(old_path, { parent: true }); - old_dir = lookup.node; - lookup = FS.lookupPath(new_path, { parent: true }); - new_dir = lookup.node; - if (!old_dir || !new_dir) - throw new FS.ErrnoError(44); - if (old_dir.mount !== new_dir.mount) { - throw new FS.ErrnoError(75); - } - var old_node = FS.lookupNode(old_dir, old_name); - var relative = PATH_FS.relative(old_path, new_dirname); - if (relative.charAt(0) !== ".") { - throw new FS.ErrnoError(28); - } - relative = PATH_FS.relative(new_path, old_dirname); - if (relative.charAt(0) !== ".") { - throw new FS.ErrnoError(55); - } - var new_node; - try { - new_node = FS.lookupNode(new_dir, new_name); - } catch (e) { - } - if (old_node === new_node) { - return; - } - var isdir = FS.isDir(old_node.mode); - var errCode = FS.mayDelete(old_dir, old_name, isdir); - if (errCode) { - throw new FS.ErrnoError(errCode); - } - errCode = new_node ? FS.mayDelete(new_dir, new_name, isdir) : FS.mayCreate(new_dir, new_name); - if (errCode) { - throw new FS.ErrnoError(errCode); - } - if (!old_dir.node_ops.rename) { - throw new FS.ErrnoError(63); - } - if (FS.isMountpoint(old_node) || new_node && FS.isMountpoint(new_node)) { - throw new FS.ErrnoError(10); - } - if (new_dir !== old_dir) { - errCode = FS.nodePermissions(old_dir, "w"); - if (errCode) { - throw new FS.ErrnoError(errCode); - } - } - try { - if (FS.trackingDelegate["willMovePath"]) { - FS.trackingDelegate["willMovePath"](old_path, new_path); - } - } catch (e) { - err( - "FS.trackingDelegate['willMovePath']('" + old_path + "', '" + new_path + "') threw an exception: " + e.message - ); - } - FS.hashRemoveNode(old_node); - try { - old_dir.node_ops.rename(old_node, new_dir, new_name); - } catch (e) { - throw e; - } finally { - FS.hashAddNode(old_node); - } - try { - if (FS.trackingDelegate["onMovePath"]) - FS.trackingDelegate["onMovePath"](old_path, new_path); - } catch (e) { - err( - "FS.trackingDelegate['onMovePath']('" + old_path + "', '" + new_path + "') threw an exception: " + e.message - ); - } - }, - rmdir: function(path) { - var lookup = FS.lookupPath(path, { parent: true }); - var parent = lookup.node; - var name = PATH.basename(path); - var node = FS.lookupNode(parent, name); - var errCode = FS.mayDelete(parent, name, true); - if (errCode) { - throw new FS.ErrnoError(errCode); - } - if (!parent.node_ops.rmdir) { - throw new FS.ErrnoError(63); - } - if (FS.isMountpoint(node)) { - throw new FS.ErrnoError(10); - } - try { - if (FS.trackingDelegate["willDeletePath"]) { - FS.trackingDelegate["willDeletePath"](path); - } - } catch (e) { - err( - "FS.trackingDelegate['willDeletePath']('" + path + "') threw an exception: " + e.message - ); - } - parent.node_ops.rmdir(parent, name); - FS.destroyNode(node); - try { - if (FS.trackingDelegate["onDeletePath"]) - FS.trackingDelegate["onDeletePath"](path); - } catch (e) { - err( - "FS.trackingDelegate['onDeletePath']('" + path + "') threw an exception: " + e.message - ); - } - }, - readdir: function(path) { - var lookup = FS.lookupPath(path, { follow: true }); - var node = lookup.node; - if (!node.node_ops.readdir) { - throw new FS.ErrnoError(54); - } - return node.node_ops.readdir(node); - }, - unlink: function(path) { - var lookup = FS.lookupPath(path, { parent: true }); - var parent = lookup.node; - var name = PATH.basename(path); - var node = FS.lookupNode(parent, name); - var errCode = FS.mayDelete(parent, name, false); - if (errCode) { - throw new FS.ErrnoError(errCode); - } - if (!parent.node_ops.unlink) { - throw new FS.ErrnoError(63); - } - if (FS.isMountpoint(node)) { - throw new FS.ErrnoError(10); - } - try { - if (FS.trackingDelegate["willDeletePath"]) { - FS.trackingDelegate["willDeletePath"](path); - } - } catch (e) { - err( - "FS.trackingDelegate['willDeletePath']('" + path + "') threw an exception: " + e.message - ); - } - parent.node_ops.unlink(parent, name); - FS.destroyNode(node); - try { - if (FS.trackingDelegate["onDeletePath"]) - FS.trackingDelegate["onDeletePath"](path); - } catch (e) { - err( - "FS.trackingDelegate['onDeletePath']('" + path + "') threw an exception: " + e.message - ); - } - }, - readlink: function(path) { - var lookup = FS.lookupPath(path); - var link = lookup.node; - if (!link) { - throw new FS.ErrnoError(44); - } - if (!link.node_ops.readlink) { - throw new FS.ErrnoError(28); - } - return PATH_FS.resolve( - FS.getPath(link.parent), - link.node_ops.readlink(link) - ); - }, - stat: function(path, dontFollow) { - var lookup = FS.lookupPath(path, { follow: !dontFollow }); - var node = lookup.node; - if (!node) { - throw new FS.ErrnoError(44); - } - if (!node.node_ops.getattr) { - throw new FS.ErrnoError(63); - } - return node.node_ops.getattr(node); - }, - lstat: function(path) { - return FS.stat(path, true); - }, - chmod: function(path, mode, dontFollow) { - var node; - if (typeof path === "string") { - var lookup = FS.lookupPath(path, { follow: !dontFollow }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { - mode: mode & 4095 | node.mode & ~4095, - timestamp: Date.now() - }); - }, - lchmod: function(path, mode) { - FS.chmod(path, mode, true); - }, - fchmod: function(fd, mode) { - var stream = FS.getStream(fd); - if (!stream) { - throw new FS.ErrnoError(8); - } - FS.chmod(stream.node, mode); - }, - chown: function(path, uid, gid, dontFollow) { - var node; - if (typeof path === "string") { - var lookup = FS.lookupPath(path, { follow: !dontFollow }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - node.node_ops.setattr(node, { timestamp: Date.now() }); - }, - lchown: function(path, uid, gid) { - FS.chown(path, uid, gid, true); - }, - fchown: function(fd, uid, gid) { - var stream = FS.getStream(fd); - if (!stream) { - throw new FS.ErrnoError(8); - } - FS.chown(stream.node, uid, gid); - }, - truncate: function(path, len) { - if (len < 0) { - throw new FS.ErrnoError(28); - } - var node; - if (typeof path === "string") { - var lookup = FS.lookupPath(path, { follow: true }); - node = lookup.node; - } else { - node = path; - } - if (!node.node_ops.setattr) { - throw new FS.ErrnoError(63); - } - if (FS.isDir(node.mode)) { - throw new FS.ErrnoError(31); - } - if (!FS.isFile(node.mode)) { - throw new FS.ErrnoError(28); - } - var errCode = FS.nodePermissions(node, "w"); - if (errCode) { - throw new FS.ErrnoError(errCode); - } - node.node_ops.setattr(node, { size: len, timestamp: Date.now() }); - }, - ftruncate: function(fd, len) { - var stream = FS.getStream(fd); - if (!stream) { - throw new FS.ErrnoError(8); - } - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(28); - } - FS.truncate(stream.node, len); - }, - utime: function(path, atime, mtime) { - var lookup = FS.lookupPath(path, { follow: true }); - var node = lookup.node; - node.node_ops.setattr(node, { timestamp: Math.max(atime, mtime) }); - }, - open: function(path, flags, mode, fd_start, fd_end) { - if (path === "") { - throw new FS.ErrnoError(44); - } - flags = typeof flags === "string" ? FS.modeStringToFlags(flags) : flags; - mode = typeof mode === "undefined" ? 438 : mode; - if (flags & 64) { - mode = mode & 4095 | 32768; - } else { - mode = 0; - } - var node; - if (typeof path === "object") { - node = path; - } else { - path = PATH.normalize(path); - try { - var lookup = FS.lookupPath(path, { follow: !(flags & 131072) }); - node = lookup.node; - } catch (e) { - } - } - var created = false; - if (flags & 64) { - if (node) { - if (flags & 128) { - throw new FS.ErrnoError(20); - } - } else { - node = FS.mknod(path, mode, 0); - created = true; - } - } - if (!node) { - throw new FS.ErrnoError(44); - } - if (FS.isChrdev(node.mode)) { - flags &= ~512; - } - if (flags & 65536 && !FS.isDir(node.mode)) { - throw new FS.ErrnoError(54); - } - if (!created) { - var errCode = FS.mayOpen(node, flags); - if (errCode) { - throw new FS.ErrnoError(errCode); - } - } - if (flags & 512) { - FS.truncate(node, 0); - } - flags &= ~(128 | 512 | 131072); - var stream = FS.createStream( - { - node, - path: FS.getPath(node), - flags, - seekable: true, - position: 0, - stream_ops: node.stream_ops, - ungotten: [], - error: false - }, - fd_start, - fd_end - ); - if (stream.stream_ops.open) { - stream.stream_ops.open(stream); - } - if (Module["logReadFiles"] && !(flags & 1)) { - if (!FS.readFiles) - FS.readFiles = {}; - if (!(path in FS.readFiles)) { - FS.readFiles[path] = 1; - err("FS.trackingDelegate error on read file: " + path); - } - } - try { - if (FS.trackingDelegate["onOpenFile"]) { - var trackingFlags = 0; - if ((flags & 2097155) !== 1) { - trackingFlags |= FS.tracking.openFlags.READ; - } - if ((flags & 2097155) !== 0) { - trackingFlags |= FS.tracking.openFlags.WRITE; - } - FS.trackingDelegate["onOpenFile"](path, trackingFlags); - } - } catch (e) { - err( - "FS.trackingDelegate['onOpenFile']('" + path + "', flags) threw an exception: " + e.message - ); - } - return stream; - }, - close: function(stream) { - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(8); - } - if (stream.getdents) - stream.getdents = null; - try { - if (stream.stream_ops.close) { - stream.stream_ops.close(stream); - } - } catch (e) { - throw e; - } finally { - FS.closeStream(stream.fd); - } - stream.fd = null; - }, - isClosed: function(stream) { - return stream.fd === null; - }, - llseek: function(stream, offset, whence) { - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(8); - } - if (!stream.seekable || !stream.stream_ops.llseek) { - throw new FS.ErrnoError(70); - } - if (whence != 0 && whence != 1 && whence != 2) { - throw new FS.ErrnoError(28); - } - stream.position = stream.stream_ops.llseek(stream, offset, whence); - stream.ungotten = []; - return stream.position; - }, - read: function(stream, buffer2, offset, length, position) { - if (length < 0 || position < 0) { - throw new FS.ErrnoError(28); - } - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(8); - } - if ((stream.flags & 2097155) === 1) { - throw new FS.ErrnoError(8); - } - if (FS.isDir(stream.node.mode)) { - throw new FS.ErrnoError(31); - } - if (!stream.stream_ops.read) { - throw new FS.ErrnoError(28); - } - var seeking = typeof position !== "undefined"; - if (!seeking) { - position = stream.position; - } else if (!stream.seekable) { - throw new FS.ErrnoError(70); - } - var bytesRead = stream.stream_ops.read( - stream, - buffer2, - offset, - length, - position - ); - if (!seeking) - stream.position += bytesRead; - return bytesRead; - }, - write: function(stream, buffer2, offset, length, position, canOwn) { - if (length < 0 || position < 0) { - throw new FS.ErrnoError(28); - } - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(8); - } - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(8); - } - if (FS.isDir(stream.node.mode)) { - throw new FS.ErrnoError(31); - } - if (!stream.stream_ops.write) { - throw new FS.ErrnoError(28); - } - if (stream.seekable && stream.flags & 1024) { - FS.llseek(stream, 0, 2); - } - var seeking = typeof position !== "undefined"; - if (!seeking) { - position = stream.position; - } else if (!stream.seekable) { - throw new FS.ErrnoError(70); - } - var bytesWritten = stream.stream_ops.write( - stream, - buffer2, - offset, - length, - position, - canOwn - ); - if (!seeking) - stream.position += bytesWritten; - try { - if (stream.path && FS.trackingDelegate["onWriteToFile"]) - FS.trackingDelegate["onWriteToFile"](stream.path); - } catch (e) { - err( - "FS.trackingDelegate['onWriteToFile']('" + stream.path + "') threw an exception: " + e.message - ); - } - return bytesWritten; - }, - allocate: function(stream, offset, length) { - if (FS.isClosed(stream)) { - throw new FS.ErrnoError(8); - } - if (offset < 0 || length <= 0) { - throw new FS.ErrnoError(28); - } - if ((stream.flags & 2097155) === 0) { - throw new FS.ErrnoError(8); - } - if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { - throw new FS.ErrnoError(43); - } - if (!stream.stream_ops.allocate) { - throw new FS.ErrnoError(138); - } - stream.stream_ops.allocate(stream, offset, length); - }, - mmap: function(stream, address, length, position, prot, flags) { - if ((prot & 2) !== 0 && (flags & 2) === 0 && (stream.flags & 2097155) !== 2) { - throw new FS.ErrnoError(2); - } - if ((stream.flags & 2097155) === 1) { - throw new FS.ErrnoError(2); - } - if (!stream.stream_ops.mmap) { - throw new FS.ErrnoError(43); - } - return stream.stream_ops.mmap( - stream, - address, - length, - position, - prot, - flags - ); - }, - msync: function(stream, buffer2, offset, length, mmapFlags) { - if (!stream || !stream.stream_ops.msync) { - return 0; - } - return stream.stream_ops.msync( - stream, - buffer2, - offset, - length, - mmapFlags - ); - }, - munmap: function(stream) { - return 0; - }, - ioctl: function(stream, cmd, arg) { - if (!stream.stream_ops.ioctl) { - throw new FS.ErrnoError(59); - } - return stream.stream_ops.ioctl(stream, cmd, arg); - }, - readFile: function(path, opts) { - opts = opts || {}; - opts.flags = opts.flags || 0; - opts.encoding = opts.encoding || "binary"; - if (opts.encoding !== "utf8" && opts.encoding !== "binary") { - throw new Error('Invalid encoding type "' + opts.encoding + '"'); - } - var ret; - var stream = FS.open(path, opts.flags); - var stat = FS.stat(path); - var length = stat.size; - var buf = new Uint8Array(length); - FS.read(stream, buf, 0, length, 0); - if (opts.encoding === "utf8") { - ret = UTF8ArrayToString(buf, 0); - } else if (opts.encoding === "binary") { - ret = buf; - } - FS.close(stream); - return ret; - }, - writeFile: function(path, data, opts) { - opts = opts || {}; - opts.flags = opts.flags || 577; - var stream = FS.open(path, opts.flags, opts.mode); - if (typeof data === "string") { - var buf = new Uint8Array(lengthBytesUTF8(data) + 1); - var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length); - FS.write(stream, buf, 0, actualNumBytes, void 0, opts.canOwn); - } else if (ArrayBuffer.isView(data)) { - FS.write(stream, data, 0, data.byteLength, void 0, opts.canOwn); - } else { - throw new Error("Unsupported data type"); - } - FS.close(stream); - }, - cwd: function() { - return FS.currentPath; - }, - chdir: function(path) { - var lookup = FS.lookupPath(path, { follow: true }); - if (lookup.node === null) { - throw new FS.ErrnoError(44); - } - if (!FS.isDir(lookup.node.mode)) { - throw new FS.ErrnoError(54); - } - var errCode = FS.nodePermissions(lookup.node, "x"); - if (errCode) { - throw new FS.ErrnoError(errCode); - } - FS.currentPath = lookup.path; - }, - createDefaultDirectories: function() { - FS.mkdir("/tmp"); - FS.mkdir("/home"); - FS.mkdir("/home/web_user"); - }, - createDefaultDevices: function() { - FS.mkdir("/dev"); - FS.registerDevice(FS.makedev(1, 3), { - read: function() { - return 0; - }, - write: function(stream, buffer2, offset, length, pos) { - return length; - } - }); - FS.mkdev("/dev/null", FS.makedev(1, 3)); - TTY.register(FS.makedev(5, 0), TTY.default_tty_ops); - TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops); - FS.mkdev("/dev/tty", FS.makedev(5, 0)); - FS.mkdev("/dev/tty1", FS.makedev(6, 0)); - var random_device = getRandomDevice(); - FS.createDevice("/dev", "random", random_device); - FS.createDevice("/dev", "urandom", random_device); - FS.mkdir("/dev/shm"); - FS.mkdir("/dev/shm/tmp"); - }, - createSpecialDirectories: function() { - FS.mkdir("/proc"); - var proc_self = FS.mkdir("/proc/self"); - FS.mkdir("/proc/self/fd"); - FS.mount( - { - mount: function() { - var node = FS.createNode(proc_self, "fd", 16384 | 511, 73); - node.node_ops = { - lookup: function(parent, name) { - var fd = +name; - var stream = FS.getStream(fd); - if (!stream) - throw new FS.ErrnoError(8); - var ret = { - parent: null, - mount: { mountpoint: "fake" }, - node_ops: { - readlink: function() { - return stream.path; - } - } - }; - ret.parent = ret; - return ret; - } - }; - return node; - } - }, - {}, - "/proc/self/fd" - ); - }, - createStandardStreams: function() { - if (Module["stdin"]) { - FS.createDevice("/dev", "stdin", Module["stdin"]); - } else { - FS.symlink("/dev/tty", "/dev/stdin"); - } - if (Module["stdout"]) { - FS.createDevice("/dev", "stdout", null, Module["stdout"]); - } else { - FS.symlink("/dev/tty", "/dev/stdout"); - } - if (Module["stderr"]) { - FS.createDevice("/dev", "stderr", null, Module["stderr"]); - } else { - FS.symlink("/dev/tty1", "/dev/stderr"); - } - FS.open("/dev/stdin", 0); - FS.open("/dev/stdout", 1); - FS.open("/dev/stderr", 1); - }, - ensureErrnoError: function() { - if (FS.ErrnoError) - return; - FS.ErrnoError = function ErrnoError(errno, node) { - this.node = node; - this.setErrno = function(errno2) { - this.errno = errno2; - }; - this.setErrno(errno); - this.message = "FS error"; - }; - FS.ErrnoError.prototype = new Error(); - FS.ErrnoError.prototype.constructor = FS.ErrnoError; - [44].forEach(function(code) { - FS.genericErrors[code] = new FS.ErrnoError(code); - FS.genericErrors[code].stack = ""; - }); - }, - staticInit: function() { - FS.ensureErrnoError(); - FS.nameTable = new Array(4096); - FS.mount(MEMFS, {}, "/"); - FS.createDefaultDirectories(); - FS.createDefaultDevices(); - FS.createSpecialDirectories(); - FS.filesystems = { MEMFS, NODEFS }; - }, - init: function(input, output, error) { - FS.init.initialized = true; - FS.ensureErrnoError(); - Module["stdin"] = input || Module["stdin"]; - Module["stdout"] = output || Module["stdout"]; - Module["stderr"] = error || Module["stderr"]; - FS.createStandardStreams(); - }, - quit: function() { - FS.init.initialized = false; - var fflush = Module["_fflush"]; - if (fflush) - fflush(0); - for (var i = 0; i < FS.streams.length; i++) { - var stream = FS.streams[i]; - if (!stream) { - continue; - } - FS.close(stream); - } - }, - getMode: function(canRead, canWrite) { - var mode = 0; - if (canRead) - mode |= 292 | 73; - if (canWrite) - mode |= 146; - return mode; - }, - findObject: function(path, dontResolveLastLink) { - var ret = FS.analyzePath(path, dontResolveLastLink); - if (ret.exists) { - return ret.object; - } else { - return null; - } - }, - analyzePath: function(path, dontResolveLastLink) { - try { - var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); - path = lookup.path; - } catch (e) { - } - var ret = { - isRoot: false, - exists: false, - error: 0, - name: null, - path: null, - object: null, - parentExists: false, - parentPath: null, - parentObject: null - }; - try { - var lookup = FS.lookupPath(path, { parent: true }); - ret.parentExists = true; - ret.parentPath = lookup.path; - ret.parentObject = lookup.node; - ret.name = PATH.basename(path); - lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); - ret.exists = true; - ret.path = lookup.path; - ret.object = lookup.node; - ret.name = lookup.node.name; - ret.isRoot = lookup.path === "/"; - } catch (e) { - ret.error = e.errno; - } - return ret; - }, - createPath: function(parent, path, canRead, canWrite) { - parent = typeof parent === "string" ? parent : FS.getPath(parent); - var parts = path.split("/").reverse(); - while (parts.length) { - var part = parts.pop(); - if (!part) - continue; - var current = PATH.join2(parent, part); - try { - FS.mkdir(current); - } catch (e) { - } - parent = current; - } - return current; - }, - createFile: function(parent, name, properties, canRead, canWrite) { - var path = PATH.join2( - typeof parent === "string" ? parent : FS.getPath(parent), - name - ); - var mode = FS.getMode(canRead, canWrite); - return FS.create(path, mode); - }, - createDataFile: function(parent, name, data, canRead, canWrite, canOwn) { - var path = name ? PATH.join2( - typeof parent === "string" ? parent : FS.getPath(parent), - name - ) : parent; - var mode = FS.getMode(canRead, canWrite); - var node = FS.create(path, mode); - if (data) { - if (typeof data === "string") { - var arr = new Array(data.length); - for (var i = 0, len = data.length; i < len; ++i) - arr[i] = data.charCodeAt(i); - data = arr; - } - FS.chmod(node, mode | 146); - var stream = FS.open(node, 577); - FS.write(stream, data, 0, data.length, 0, canOwn); - FS.close(stream); - FS.chmod(node, mode); - } - return node; - }, - createDevice: function(parent, name, input, output) { - var path = PATH.join2( - typeof parent === "string" ? parent : FS.getPath(parent), - name - ); - var mode = FS.getMode(!!input, !!output); - if (!FS.createDevice.major) - FS.createDevice.major = 64; - var dev = FS.makedev(FS.createDevice.major++, 0); - FS.registerDevice(dev, { - open: function(stream) { - stream.seekable = false; - }, - close: function(stream) { - if (output && output.buffer && output.buffer.length) { - output(10); - } - }, - read: function(stream, buffer2, offset, length, pos) { - var bytesRead = 0; - for (var i = 0; i < length; i++) { - var result; - try { - result = input(); - } catch (e) { - throw new FS.ErrnoError(29); - } - if (result === void 0 && bytesRead === 0) { - throw new FS.ErrnoError(6); - } - if (result === null || result === void 0) - break; - bytesRead++; - buffer2[offset + i] = result; - } - if (bytesRead) { - stream.node.timestamp = Date.now(); - } - return bytesRead; - }, - write: function(stream, buffer2, offset, length, pos) { - for (var i = 0; i < length; i++) { - try { - output(buffer2[offset + i]); - } catch (e) { - throw new FS.ErrnoError(29); - } - } - if (length) { - stream.node.timestamp = Date.now(); - } - return i; - } - }); - return FS.mkdev(path, mode, dev); - }, - forceLoadFile: function(obj) { - if (obj.isDevice || obj.isFolder || obj.link || obj.contents) - return true; - if (read_) { - try { - obj.contents = intArrayFromString(read_(obj.url), true); - obj.usedBytes = obj.contents.length; - } catch (e) { - throw new FS.ErrnoError(29); - } - } else { - throw new Error("Cannot load without read() or XMLHttpRequest."); - } - }, - createLazyFile: function(parent, name, url, canRead, canWrite) { - var properties; { - var properties = { isDevice: false, url }; - } - var node = FS.createFile(parent, name, properties, canRead, canWrite); - if (properties.contents) { - node.contents = properties.contents; - } else if (properties.url) { - node.contents = null; - node.url = properties.url; - } - Object.defineProperties(node, { - usedBytes: { - get: function() { - return this.contents.length; - } - } - }); - var stream_ops = {}; - var keys = Object.keys(node.stream_ops); - keys.forEach(function(key2) { - var fn = node.stream_ops[key2]; - stream_ops[key2] = function forceLoadLazyFile() { - FS.forceLoadFile(node); - return fn.apply(null, arguments); - }; - }); - stream_ops.read = function stream_ops_read(stream, buffer2, offset, length, position) { - FS.forceLoadFile(node); - var contents = stream.node.contents; - if (position >= contents.length) - return 0; - var size = Math.min(contents.length - position, length); - if (contents.slice) { - for (var i = 0; i < size; i++) { - buffer2[offset + i] = contents[position + i]; - } - } else { - for (var i = 0; i < size; i++) { - buffer2[offset + i] = contents.get(position + i); - } - } - return size; - }; - node.stream_ops = stream_ops; - return node; - }, - createPreloadedFile: function(parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) { - Browser.init(); - var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent; - function processData(byteArray) { - function finish(byteArray2) { - if (preFinish) - preFinish(); - if (!dontCreateFile) { - FS.createDataFile( - parent, - name, - byteArray2, - canRead, - canWrite, - canOwn - ); - } - if (onload) - onload(); - removeRunDependency(); - } - var handled = false; - Module["preloadPlugins"].forEach(function(plugin) { - if (handled) - return; - if (plugin["canHandle"](fullname)) { - plugin["handle"](byteArray, fullname, finish, function() { - if (onerror) - onerror(); - removeRunDependency(); - }); - handled = true; - } - }); - if (!handled) - finish(byteArray); - } - addRunDependency(); - if (typeof url == "string") { - Browser.asyncLoad( - url, - function(byteArray) { - processData(byteArray); - }, - onerror - ); - } else { - processData(url); - } - }, - indexedDB: function() { - return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB; - }, - DB_NAME: function() { - return "EM_FS_" + window.location.pathname; - }, - DB_VERSION: 20, - DB_STORE_NAME: "FILE_DATA", - saveFilesToDB: function(paths, onload, onerror) { - onload = onload || function() { - }; - onerror = onerror || function() { - }; - var indexedDB = FS.indexedDB(); - try { - var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION); - } catch (e) { - return onerror(e); - } - openRequest.onupgradeneeded = function openRequest_onupgradeneeded() { - out("creating db"); - var db = openRequest.result; - db.createObjectStore(FS.DB_STORE_NAME); - }; - openRequest.onsuccess = function openRequest_onsuccess() { - var db = openRequest.result; - var transaction = db.transaction([FS.DB_STORE_NAME], "readwrite"); - var files = transaction.objectStore(FS.DB_STORE_NAME); - var ok = 0, fail = 0, total = paths.length; - function finish() { - if (fail == 0) - onload(); - else - onerror(); - } - paths.forEach(function(path) { - var putRequest = files.put( - FS.analyzePath(path).object.contents, - path - ); - putRequest.onsuccess = function putRequest_onsuccess() { - ok++; - if (ok + fail == total) - finish(); - }; - putRequest.onerror = function putRequest_onerror() { - fail++; - if (ok + fail == total) - finish(); - }; - }); - transaction.onerror = onerror; - }; - openRequest.onerror = onerror; - }, - loadFilesFromDB: function(paths, onload, onerror) { - onload = onload || function() { - }; - onerror = onerror || function() { - }; - var indexedDB = FS.indexedDB(); - try { - var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION); - } catch (e) { - return onerror(e); - } - openRequest.onupgradeneeded = onerror; - openRequest.onsuccess = function openRequest_onsuccess() { - var db = openRequest.result; - try { - var transaction = db.transaction([FS.DB_STORE_NAME], "readonly"); - } catch (e) { - onerror(e); - return; - } - var files = transaction.objectStore(FS.DB_STORE_NAME); - var ok = 0, fail = 0, total = paths.length; - function finish() { - if (fail == 0) - onload(); - else - onerror(); - } - paths.forEach(function(path) { - var getRequest = files.get(path); - getRequest.onsuccess = function getRequest_onsuccess() { - if (FS.analyzePath(path).exists) { - FS.unlink(path); - } - FS.createDataFile( - PATH.dirname(path), - PATH.basename(path), - getRequest.result, - true, - true, - true - ); - ok++; - if (ok + fail == total) - finish(); - }; - getRequest.onerror = function getRequest_onerror() { - fail++; - if (ok + fail == total) - finish(); - }; - }); - transaction.onerror = onerror; - }; - openRequest.onerror = onerror; - } - }; - var SYSCALLS = { - mappings: {}, - DEFAULT_POLLMASK: 5, - umask: 511, - calculateAt: function(dirfd, path, allowEmpty) { - if (path[0] === "/") { - return path; - } - var dir; - if (dirfd === -100) { - dir = FS.cwd(); - } else { - var dirstream = FS.getStream(dirfd); - if (!dirstream) - throw new FS.ErrnoError(8); - dir = dirstream.path; - } - if (path.length == 0) { - if (!allowEmpty) { - throw new FS.ErrnoError(44); - } - return dir; - } - return PATH.join2(dir, path); - }, - doStat: function(func, path, buf) { - try { - var stat = func(path); - } catch (e) { - if (e && e.node && PATH.normalize(path) !== PATH.normalize(FS.getPath(e.node))) { - return -54; - } - throw e; - } - HEAP32[buf >> 2] = stat.dev; - HEAP32[buf + 4 >> 2] = 0; - HEAP32[buf + 8 >> 2] = stat.ino; - HEAP32[buf + 12 >> 2] = stat.mode; - HEAP32[buf + 16 >> 2] = stat.nlink; - HEAP32[buf + 20 >> 2] = stat.uid; - HEAP32[buf + 24 >> 2] = stat.gid; - HEAP32[buf + 28 >> 2] = stat.rdev; - HEAP32[buf + 32 >> 2] = 0; - tempI64 = [ - stat.size >>> 0, - (tempDouble = stat.size, +Math.abs(tempDouble) >= 1 ? tempDouble > 0 ? (Math.min(+Math.floor(tempDouble / 4294967296), 4294967295) | 0) >>> 0 : ~~+Math.ceil( - (tempDouble - +(~~tempDouble >>> 0)) / 4294967296 - ) >>> 0 : 0) - ], HEAP32[buf + 40 >> 2] = tempI64[0], HEAP32[buf + 44 >> 2] = tempI64[1]; - HEAP32[buf + 48 >> 2] = 4096; - HEAP32[buf + 52 >> 2] = stat.blocks; - HEAP32[buf + 56 >> 2] = stat.atime.getTime() / 1e3 | 0; - HEAP32[buf + 60 >> 2] = 0; - HEAP32[buf + 64 >> 2] = stat.mtime.getTime() / 1e3 | 0; - HEAP32[buf + 68 >> 2] = 0; - HEAP32[buf + 72 >> 2] = stat.ctime.getTime() / 1e3 | 0; - HEAP32[buf + 76 >> 2] = 0; - tempI64 = [ - stat.ino >>> 0, - (tempDouble = stat.ino, +Math.abs(tempDouble) >= 1 ? tempDouble > 0 ? (Math.min(+Math.floor(tempDouble / 4294967296), 4294967295) | 0) >>> 0 : ~~+Math.ceil( - (tempDouble - +(~~tempDouble >>> 0)) / 4294967296 - ) >>> 0 : 0) - ], HEAP32[buf + 80 >> 2] = tempI64[0], HEAP32[buf + 84 >> 2] = tempI64[1]; - return 0; - }, - doMsync: function(addr, stream, len, flags, offset) { - var buffer2 = HEAPU8.slice(addr, addr + len); - FS.msync(stream, buffer2, offset, len, flags); - }, - doMkdir: function(path, mode) { - path = PATH.normalize(path); - if (path[path.length - 1] === "/") - path = path.substr(0, path.length - 1); - FS.mkdir(path, mode, 0); - return 0; - }, - doMknod: function(path, mode, dev) { - switch (mode & 61440) { - case 32768: - case 8192: - case 24576: - case 4096: - case 49152: - break; - default: - return -28; - } - FS.mknod(path, mode, dev); - return 0; - }, - doReadlink: function(path, buf, bufsize) { - if (bufsize <= 0) - return -28; - var ret = FS.readlink(path); - var len = Math.min(bufsize, lengthBytesUTF8(ret)); - var endChar = HEAP8[buf + len]; - stringToUTF8(ret, buf, bufsize + 1); - HEAP8[buf + len] = endChar; - return len; - }, - doAccess: function(path, amode) { - if (amode & ~7) { - return -28; - } - var node; - var lookup = FS.lookupPath(path, { follow: true }); - node = lookup.node; - if (!node) { - return -44; - } - var perms = ""; - if (amode & 4) - perms += "r"; - if (amode & 2) - perms += "w"; - if (amode & 1) - perms += "x"; - if (perms && FS.nodePermissions(node, perms)) { - return -2; - } - return 0; - }, - doDup: function(path, flags, suggestFD) { - var suggest = FS.getStream(suggestFD); - if (suggest) - FS.close(suggest); - return FS.open(path, flags, 0, suggestFD, suggestFD).fd; - }, - doReadv: function(stream, iov, iovcnt, offset) { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAP32[iov + i * 8 >> 2]; - var len = HEAP32[iov + (i * 8 + 4) >> 2]; - var curr = FS.read(stream, HEAP8, ptr, len, offset); - if (curr < 0) - return -1; - ret += curr; - if (curr < len) - break; - } - return ret; - }, - doWritev: function(stream, iov, iovcnt, offset) { - var ret = 0; - for (var i = 0; i < iovcnt; i++) { - var ptr = HEAP32[iov + i * 8 >> 2]; - var len = HEAP32[iov + (i * 8 + 4) >> 2]; - var curr = FS.write(stream, HEAP8, ptr, len, offset); - if (curr < 0) - return -1; - ret += curr; - } - return ret; - }, - varargs: void 0, - get: function() { - SYSCALLS.varargs += 4; - var ret = HEAP32[SYSCALLS.varargs - 4 >> 2]; - return ret; - }, - getStr: function(ptr) { - var ret = UTF8ToString(ptr); - return ret; - }, - getStreamFromFD: function(fd) { - var stream = FS.getStream(fd); - if (!stream) - throw new FS.ErrnoError(8); - return stream; - }, - get64: function(low, high) { - return low; - } - }; - function ___sys_chmod(path, mode) { - try { - path = SYSCALLS.getStr(path); - FS.chmod(path, mode); - return 0; - } catch (e) { - if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) - abort(e); - return -e.errno; - } - } - function setErrNo(value) { - HEAP32[___errno_location() >> 2] = value; - return value; - } - function ___sys_fcntl64(fd, cmd, varargs) { - SYSCALLS.varargs = varargs; - try { - var stream = SYSCALLS.getStreamFromFD(fd); - switch (cmd) { - case 0: { - var arg = SYSCALLS.get(); - if (arg < 0) { - return -28; - } - var newStream; - newStream = FS.open(stream.path, stream.flags, 0, arg); - return newStream.fd; - } - case 1: - case 2: - return 0; - case 3: - return stream.flags; - case 4: { - var arg = SYSCALLS.get(); - stream.flags |= arg; - return 0; - } - case 12: { - var arg = SYSCALLS.get(); - var offset = 0; - HEAP16[arg + offset >> 1] = 2; - return 0; - } - case 13: - case 14: - return 0; - case 16: - case 8: - return -28; - case 9: - setErrNo(28); - return -1; - default: { - return -28; - } - } - } catch (e) { - if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) - abort(e); - return -e.errno; - } - } - function ___sys_fstat64(fd, buf) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - return SYSCALLS.doStat(FS.stat, stream.path, buf); - } catch (e) { - if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) - abort(e); - return -e.errno; - } - } - function ___sys_ioctl(fd, op, varargs) { - SYSCALLS.varargs = varargs; - try { - var stream = SYSCALLS.getStreamFromFD(fd); - switch (op) { - case 21509: - case 21505: { - if (!stream.tty) - return -59; - return 0; - } - case 21510: - case 21511: - case 21512: - case 21506: - case 21507: - case 21508: { - if (!stream.tty) - return -59; - return 0; - } - case 21519: { - if (!stream.tty) - return -59; - var argp = SYSCALLS.get(); - HEAP32[argp >> 2] = 0; - return 0; - } - case 21520: { - if (!stream.tty) - return -59; - return -28; - } - case 21531: { - var argp = SYSCALLS.get(); - return FS.ioctl(stream, op, argp); - } - case 21523: { - if (!stream.tty) - return -59; - return 0; - } - case 21524: { - if (!stream.tty) - return -59; - return 0; - } - default: - abort("bad ioctl syscall " + op); - } - } catch (e) { - if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) - abort(e); - return -e.errno; - } - } - function ___sys_open(path, flags, varargs) { - SYSCALLS.varargs = varargs; - try { - var pathname = SYSCALLS.getStr(path); - var mode = varargs ? SYSCALLS.get() : 0; - var stream = FS.open(pathname, flags, mode); - return stream.fd; - } catch (e) { - if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) - abort(e); - return -e.errno; - } - } - function ___sys_rename(old_path, new_path) { - try { - old_path = SYSCALLS.getStr(old_path); - new_path = SYSCALLS.getStr(new_path); - FS.rename(old_path, new_path); - return 0; - } catch (e) { - if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) - abort(e); - return -e.errno; - } - } - function ___sys_rmdir(path) { - try { - path = SYSCALLS.getStr(path); - FS.rmdir(path); - return 0; - } catch (e) { - if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) - abort(e); - return -e.errno; - } - } - function ___sys_stat64(path, buf) { - try { - path = SYSCALLS.getStr(path); - return SYSCALLS.doStat(FS.stat, path, buf); - } catch (e) { - if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) - abort(e); - return -e.errno; - } - } - function ___sys_unlink(path) { - try { - path = SYSCALLS.getStr(path); - FS.unlink(path); - return 0; - } catch (e) { - if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) - abort(e); - return -e.errno; - } - } - function _emscripten_memcpy_big(dest, src, num) { - HEAPU8.copyWithin(dest, src, src + num); - } - function emscripten_realloc_buffer(size) { - try { - wasmMemory.grow(size - buffer.byteLength + 65535 >>> 16); - updateGlobalBufferAndViews(wasmMemory.buffer); - return 1; - } catch (e) { - } - } - function _emscripten_resize_heap(requestedSize) { - var oldSize = HEAPU8.length; - requestedSize = requestedSize >>> 0; - var maxHeapSize = 2147483648; - if (requestedSize > maxHeapSize) { - return false; - } - for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { - var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); - overGrownHeapSize = Math.min( - overGrownHeapSize, - requestedSize + 100663296 - ); - var newSize = Math.min( - maxHeapSize, - alignUp(Math.max(requestedSize, overGrownHeapSize), 65536) - ); - var replacement = emscripten_realloc_buffer(newSize); - if (replacement) { - return true; - } - } - return false; - } - function _fd_close(fd) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - FS.close(stream); - return 0; - } catch (e) { - if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) - abort(e); - return e.errno; - } - } - function _fd_fdstat_get(fd, pbuf) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - var type = stream.tty ? 2 : FS.isDir(stream.mode) ? 3 : FS.isLink(stream.mode) ? 7 : 4; - HEAP8[pbuf >> 0] = type; - return 0; - } catch (e) { - if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) - abort(e); - return e.errno; - } - } - function _fd_read(fd, iov, iovcnt, pnum) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - var num = SYSCALLS.doReadv(stream, iov, iovcnt); - HEAP32[pnum >> 2] = num; - return 0; - } catch (e) { - if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) - abort(e); - return e.errno; - } - } - function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - var HIGH_OFFSET = 4294967296; - var offset = offset_high * HIGH_OFFSET + (offset_low >>> 0); - var DOUBLE_LIMIT = 9007199254740992; - if (offset <= -DOUBLE_LIMIT || offset >= DOUBLE_LIMIT) { - return -61; - } - FS.llseek(stream, offset, whence); - tempI64 = [ - stream.position >>> 0, - (tempDouble = stream.position, +Math.abs(tempDouble) >= 1 ? tempDouble > 0 ? (Math.min(+Math.floor(tempDouble / 4294967296), 4294967295) | 0) >>> 0 : ~~+Math.ceil( - (tempDouble - +(~~tempDouble >>> 0)) / 4294967296 - ) >>> 0 : 0) - ], HEAP32[newOffset >> 2] = tempI64[0], HEAP32[newOffset + 4 >> 2] = tempI64[1]; - if (stream.getdents && offset === 0 && whence === 0) - stream.getdents = null; - return 0; - } catch (e) { - if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) - abort(e); - return e.errno; - } - } - function _fd_write(fd, iov, iovcnt, pnum) { - try { - var stream = SYSCALLS.getStreamFromFD(fd); - var num = SYSCALLS.doWritev(stream, iov, iovcnt); - HEAP32[pnum >> 2] = num; - return 0; - } catch (e) { - if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) - abort(e); - return e.errno; - } - } - function _setTempRet0(val) { - } - function _time(ptr) { - var ret = Date.now() / 1e3 | 0; - if (ptr) { - HEAP32[ptr >> 2] = ret; - } - return ret; - } - function _tzset() { - if (_tzset.called) - return; - _tzset.called = true; - var currentYear = new Date().getFullYear(); - var winter = new Date(currentYear, 0, 1); - var summer = new Date(currentYear, 6, 1); - var winterOffset = winter.getTimezoneOffset(); - var summerOffset = summer.getTimezoneOffset(); - var stdTimezoneOffset = Math.max(winterOffset, summerOffset); - HEAP32[__get_timezone() >> 2] = stdTimezoneOffset * 60; - HEAP32[__get_daylight() >> 2] = Number(winterOffset != summerOffset); - function extractZone(date) { - var match = date.toTimeString().match(/\(([A-Za-z ]+)\)$/); - return match ? match[1] : "GMT"; - } - var winterName = extractZone(winter); - var summerName = extractZone(summer); - var winterNamePtr = allocateUTF8(winterName); - var summerNamePtr = allocateUTF8(summerName); - if (summerOffset < winterOffset) { - HEAP32[__get_tzname() >> 2] = winterNamePtr; - HEAP32[__get_tzname() + 4 >> 2] = summerNamePtr; - } else { - HEAP32[__get_tzname() >> 2] = summerNamePtr; - HEAP32[__get_tzname() + 4 >> 2] = winterNamePtr; - } - } - function _timegm(tmPtr) { - _tzset(); - var time = Date.UTC( - HEAP32[tmPtr + 20 >> 2] + 1900, - HEAP32[tmPtr + 16 >> 2], - HEAP32[tmPtr + 12 >> 2], - HEAP32[tmPtr + 8 >> 2], - HEAP32[tmPtr + 4 >> 2], - HEAP32[tmPtr >> 2], - 0 - ); - var date = new Date(time); - HEAP32[tmPtr + 24 >> 2] = date.getUTCDay(); - var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); - var yday = (date.getTime() - start) / (1e3 * 60 * 60 * 24) | 0; - HEAP32[tmPtr + 28 >> 2] = yday; - return date.getTime() / 1e3 | 0; - } - var FSNode = function(parent, name, mode, rdev) { - if (!parent) { - parent = this; - } - this.parent = parent; - this.mount = parent.mount; - this.mounted = null; - this.id = FS.nextInode++; - this.name = name; - this.mode = mode; - this.node_ops = {}; - this.stream_ops = {}; - this.rdev = rdev; - }; - var readMode = 292 | 73; - var writeMode = 146; - Object.defineProperties(FSNode.prototype, { - read: { - get: function() { - return (this.mode & readMode) === readMode; - }, - set: function(val) { - val ? this.mode |= readMode : this.mode &= ~readMode; - } - }, - write: { - get: function() { - return (this.mode & writeMode) === writeMode; - }, - set: function(val) { - val ? this.mode |= writeMode : this.mode &= ~writeMode; - } - }, - isFolder: { - get: function() { - return FS.isDir(this.mode); - } - }, - isDevice: { - get: function() { - return FS.isChrdev(this.mode); - } - } - }); - FS.FSNode = FSNode; - FS.staticInit(); - { - var fs = frozenFs; - var NODEJS_PATH = path__default.default; - NODEFS.staticInit(); - } - { - var _wrapNodeError = function(func) { - return function() { - try { - return func.apply(this, arguments); - } catch (e) { - if (!e.code) - throw e; - throw new FS.ErrnoError(ERRNO_CODES[e.code]); - } - }; - }; - var VFS = Object.assign({}, FS); - for (var _key in NODERAWFS) - FS[_key] = _wrapNodeError(NODERAWFS[_key]); - } - function intArrayFromString(stringy, dontAddNull, length) { - var len = length > 0 ? length : lengthBytesUTF8(stringy) + 1; - var u8array = new Array(len); - var numBytesWritten = stringToUTF8Array( - stringy, - u8array, - 0, - u8array.length - ); - if (dontAddNull) - u8array.length = numBytesWritten; - return u8array; - } - function intArrayFromBase64(s) { - { - var buf; - try { - buf = Buffer.from(s, "base64"); - } catch (_) { - buf = new Buffer(s, "base64"); - } - return new Uint8Array( - buf["buffer"], - buf["byteOffset"], - buf["byteLength"] - ); - } - } - function tryParseAsDataURI(filename) { - if (!isDataURI(filename)) { - return; - } - return intArrayFromBase64(filename.slice(dataURIPrefix.length)); - } - var asmLibraryArg = { - s: ___gmtime_r, - p: ___sys_chmod, - e: ___sys_fcntl64, - k: ___sys_fstat64, - o: ___sys_ioctl, - q: ___sys_open, - i: ___sys_rename, - r: ___sys_rmdir, - c: ___sys_stat64, - h: ___sys_unlink, - l: _emscripten_memcpy_big, - m: _emscripten_resize_heap, - f: _fd_close, - j: _fd_fdstat_get, - g: _fd_read, - n: _fd_seek, - d: _fd_write, - a: _setTempRet0, - b: _time, - t: _timegm - }; - var asm = createWasm(); - Module["___wasm_call_ctors"] = asm["v"]; - Module["_zip_ext_count_symlinks"] = asm["w"]; - Module["_zip_file_get_external_attributes"] = asm["x"]; - Module["_zipstruct_stat"] = asm["y"]; - Module["_zipstruct_statS"] = asm["z"]; - Module["_zipstruct_stat_name"] = asm["A"]; - Module["_zipstruct_stat_index"] = asm["B"]; - Module["_zipstruct_stat_size"] = asm["C"]; - Module["_zipstruct_stat_mtime"] = asm["D"]; - Module["_zipstruct_stat_crc"] = asm["E"]; - Module["_zipstruct_error"] = asm["F"]; - Module["_zipstruct_errorS"] = asm["G"]; - Module["_zipstruct_error_code_zip"] = asm["H"]; - Module["_zipstruct_stat_comp_size"] = asm["I"]; - Module["_zipstruct_stat_comp_method"] = asm["J"]; - Module["_zip_close"] = asm["K"]; - Module["_zip_delete"] = asm["L"]; - Module["_zip_dir_add"] = asm["M"]; - Module["_zip_discard"] = asm["N"]; - Module["_zip_error_init_with_code"] = asm["O"]; - Module["_zip_get_error"] = asm["P"]; - Module["_zip_file_get_error"] = asm["Q"]; - Module["_zip_error_strerror"] = asm["R"]; - Module["_zip_fclose"] = asm["S"]; - Module["_zip_file_add"] = asm["T"]; - Module["_free"] = asm["U"]; - var _malloc = Module["_malloc"] = asm["V"]; - var ___errno_location = Module["___errno_location"] = asm["W"]; - Module["_zip_source_error"] = asm["X"]; - Module["_zip_source_seek"] = asm["Y"]; - Module["_zip_file_set_external_attributes"] = asm["Z"]; - Module["_zip_file_set_mtime"] = asm["_"]; - Module["_zip_fopen"] = asm["$"]; - Module["_zip_fopen_index"] = asm["aa"]; - Module["_zip_fread"] = asm["ba"]; - Module["_zip_get_name"] = asm["ca"]; - Module["_zip_get_num_entries"] = asm["da"]; - Module["_zip_source_read"] = asm["ea"]; - Module["_zip_name_locate"] = asm["fa"]; - Module["_zip_open"] = asm["ga"]; - Module["_zip_open_from_source"] = asm["ha"]; - Module["_zip_set_file_compression"] = asm["ia"]; - Module["_zip_source_buffer"] = asm["ja"]; - Module["_zip_source_buffer_create"] = asm["ka"]; - Module["_zip_source_close"] = asm["la"]; - Module["_zip_source_free"] = asm["ma"]; - Module["_zip_source_keep"] = asm["na"]; - Module["_zip_source_open"] = asm["oa"]; - Module["_zip_source_set_mtime"] = asm["qa"]; - Module["_zip_source_tell"] = asm["ra"]; - Module["_zip_stat"] = asm["sa"]; - Module["_zip_stat_index"] = asm["ta"]; - var __get_tzname = Module["__get_tzname"] = asm["ua"]; - var __get_daylight = Module["__get_daylight"] = asm["va"]; - var __get_timezone = Module["__get_timezone"] = asm["wa"]; - var stackSave = Module["stackSave"] = asm["xa"]; - var stackRestore = Module["stackRestore"] = asm["ya"]; - var stackAlloc = Module["stackAlloc"] = asm["za"]; - Module["cwrap"] = cwrap; - Module["getValue"] = getValue; - var calledRun; - dependenciesFulfilled = function runCaller() { - if (!calledRun) - run(); - if (!calledRun) - dependenciesFulfilled = runCaller; - }; - function run(args) { - if (runDependencies > 0) { - return; - } - preRun(); - if (runDependencies > 0) { - return; - } - function doRun() { - if (calledRun) - return; - calledRun = true; - Module["calledRun"] = true; - if (ABORT) - return; - initRuntime(); - readyPromiseResolve(Module); - if (Module["onRuntimeInitialized"]) - Module["onRuntimeInitialized"](); - postRun(); - } - if (Module["setStatus"]) { - Module["setStatus"]("Running..."); - setTimeout(function() { - setTimeout(function() { - Module["setStatus"](""); - }, 1); - doRun(); - }, 1); - } else { - doRun(); - } - } - Module["run"] = run; - if (Module["preInit"]) { - if (typeof Module["preInit"] == "function") - Module["preInit"] = [Module["preInit"]]; - while (Module["preInit"].length > 0) { - Module["preInit"].pop()(); - } - } - run(); - return createModule2; - }; -}(); -module.exports = createModule; -}(libzipSync)); - -const createModule = libzipSync.exports; - -const number64 = [ - `number`, - `number` -]; -var Errors = /* @__PURE__ */ ((Errors2) => { - Errors2[Errors2["ZIP_ER_OK"] = 0] = "ZIP_ER_OK"; - Errors2[Errors2["ZIP_ER_MULTIDISK"] = 1] = "ZIP_ER_MULTIDISK"; - Errors2[Errors2["ZIP_ER_RENAME"] = 2] = "ZIP_ER_RENAME"; - Errors2[Errors2["ZIP_ER_CLOSE"] = 3] = "ZIP_ER_CLOSE"; - Errors2[Errors2["ZIP_ER_SEEK"] = 4] = "ZIP_ER_SEEK"; - Errors2[Errors2["ZIP_ER_READ"] = 5] = "ZIP_ER_READ"; - Errors2[Errors2["ZIP_ER_WRITE"] = 6] = "ZIP_ER_WRITE"; - Errors2[Errors2["ZIP_ER_CRC"] = 7] = "ZIP_ER_CRC"; - Errors2[Errors2["ZIP_ER_ZIPCLOSED"] = 8] = "ZIP_ER_ZIPCLOSED"; - Errors2[Errors2["ZIP_ER_NOENT"] = 9] = "ZIP_ER_NOENT"; - Errors2[Errors2["ZIP_ER_EXISTS"] = 10] = "ZIP_ER_EXISTS"; - Errors2[Errors2["ZIP_ER_OPEN"] = 11] = "ZIP_ER_OPEN"; - Errors2[Errors2["ZIP_ER_TMPOPEN"] = 12] = "ZIP_ER_TMPOPEN"; - Errors2[Errors2["ZIP_ER_ZLIB"] = 13] = "ZIP_ER_ZLIB"; - Errors2[Errors2["ZIP_ER_MEMORY"] = 14] = "ZIP_ER_MEMORY"; - Errors2[Errors2["ZIP_ER_CHANGED"] = 15] = "ZIP_ER_CHANGED"; - Errors2[Errors2["ZIP_ER_COMPNOTSUPP"] = 16] = "ZIP_ER_COMPNOTSUPP"; - Errors2[Errors2["ZIP_ER_EOF"] = 17] = "ZIP_ER_EOF"; - Errors2[Errors2["ZIP_ER_INVAL"] = 18] = "ZIP_ER_INVAL"; - Errors2[Errors2["ZIP_ER_NOZIP"] = 19] = "ZIP_ER_NOZIP"; - Errors2[Errors2["ZIP_ER_INTERNAL"] = 20] = "ZIP_ER_INTERNAL"; - Errors2[Errors2["ZIP_ER_INCONS"] = 21] = "ZIP_ER_INCONS"; - Errors2[Errors2["ZIP_ER_REMOVE"] = 22] = "ZIP_ER_REMOVE"; - Errors2[Errors2["ZIP_ER_DELETED"] = 23] = "ZIP_ER_DELETED"; - Errors2[Errors2["ZIP_ER_ENCRNOTSUPP"] = 24] = "ZIP_ER_ENCRNOTSUPP"; - Errors2[Errors2["ZIP_ER_RDONLY"] = 25] = "ZIP_ER_RDONLY"; - Errors2[Errors2["ZIP_ER_NOPASSWD"] = 26] = "ZIP_ER_NOPASSWD"; - Errors2[Errors2["ZIP_ER_WRONGPASSWD"] = 27] = "ZIP_ER_WRONGPASSWD"; - Errors2[Errors2["ZIP_ER_OPNOTSUPP"] = 28] = "ZIP_ER_OPNOTSUPP"; - Errors2[Errors2["ZIP_ER_INUSE"] = 29] = "ZIP_ER_INUSE"; - Errors2[Errors2["ZIP_ER_TELL"] = 30] = "ZIP_ER_TELL"; - Errors2[Errors2["ZIP_ER_COMPRESSED_DATA"] = 31] = "ZIP_ER_COMPRESSED_DATA"; - return Errors2; -})(Errors || {}); -const makeInterface = (libzip) => ({ - get HEAP8() { - return libzip.HEAP8; - }, - get HEAPU8() { - return libzip.HEAPU8; - }, - errors: Errors, - SEEK_SET: 0, - SEEK_CUR: 1, - SEEK_END: 2, - ZIP_CHECKCONS: 4, - ZIP_CREATE: 1, - ZIP_EXCL: 2, - ZIP_TRUNCATE: 8, - ZIP_RDONLY: 16, - ZIP_FL_OVERWRITE: 8192, - ZIP_FL_COMPRESSED: 4, - ZIP_OPSYS_DOS: 0, - ZIP_OPSYS_AMIGA: 1, - ZIP_OPSYS_OPENVMS: 2, - ZIP_OPSYS_UNIX: 3, - ZIP_OPSYS_VM_CMS: 4, - ZIP_OPSYS_ATARI_ST: 5, - ZIP_OPSYS_OS_2: 6, - ZIP_OPSYS_MACINTOSH: 7, - ZIP_OPSYS_Z_SYSTEM: 8, - ZIP_OPSYS_CPM: 9, - ZIP_OPSYS_WINDOWS_NTFS: 10, - ZIP_OPSYS_MVS: 11, - ZIP_OPSYS_VSE: 12, - ZIP_OPSYS_ACORN_RISC: 13, - ZIP_OPSYS_VFAT: 14, - ZIP_OPSYS_ALTERNATE_MVS: 15, - ZIP_OPSYS_BEOS: 16, - ZIP_OPSYS_TANDEM: 17, - ZIP_OPSYS_OS_400: 18, - ZIP_OPSYS_OS_X: 19, - ZIP_CM_DEFAULT: -1, - ZIP_CM_STORE: 0, - ZIP_CM_DEFLATE: 8, - uint08S: libzip._malloc(1), - uint16S: libzip._malloc(2), - uint32S: libzip._malloc(4), - uint64S: libzip._malloc(8), - malloc: libzip._malloc, - free: libzip._free, - getValue: libzip.getValue, - open: libzip.cwrap(`zip_open`, `number`, [`string`, `number`, `number`]), - openFromSource: libzip.cwrap(`zip_open_from_source`, `number`, [`number`, `number`, `number`]), - close: libzip.cwrap(`zip_close`, `number`, [`number`]), - discard: libzip.cwrap(`zip_discard`, null, [`number`]), - getError: libzip.cwrap(`zip_get_error`, `number`, [`number`]), - getName: libzip.cwrap(`zip_get_name`, `string`, [`number`, `number`, `number`]), - getNumEntries: libzip.cwrap(`zip_get_num_entries`, `number`, [`number`, `number`]), - delete: libzip.cwrap(`zip_delete`, `number`, [`number`, `number`]), - stat: libzip.cwrap(`zip_stat`, `number`, [`number`, `string`, `number`, `number`]), - statIndex: libzip.cwrap(`zip_stat_index`, `number`, [`number`, ...number64, `number`, `number`]), - fopen: libzip.cwrap(`zip_fopen`, `number`, [`number`, `string`, `number`]), - fopenIndex: libzip.cwrap(`zip_fopen_index`, `number`, [`number`, ...number64, `number`]), - fread: libzip.cwrap(`zip_fread`, `number`, [`number`, `number`, `number`, `number`]), - fclose: libzip.cwrap(`zip_fclose`, `number`, [`number`]), - dir: { - add: libzip.cwrap(`zip_dir_add`, `number`, [`number`, `string`]) - }, - file: { - add: libzip.cwrap(`zip_file_add`, `number`, [`number`, `string`, `number`, `number`]), - getError: libzip.cwrap(`zip_file_get_error`, `number`, [`number`]), - getExternalAttributes: libzip.cwrap(`zip_file_get_external_attributes`, `number`, [`number`, ...number64, `number`, `number`, `number`]), - setExternalAttributes: libzip.cwrap(`zip_file_set_external_attributes`, `number`, [`number`, ...number64, `number`, `number`, `number`]), - setMtime: libzip.cwrap(`zip_file_set_mtime`, `number`, [`number`, ...number64, `number`, `number`]), - setCompression: libzip.cwrap(`zip_set_file_compression`, `number`, [`number`, ...number64, `number`, `number`]) - }, - ext: { - countSymlinks: libzip.cwrap(`zip_ext_count_symlinks`, `number`, [`number`]) - }, - error: { - initWithCode: libzip.cwrap(`zip_error_init_with_code`, null, [`number`, `number`]), - strerror: libzip.cwrap(`zip_error_strerror`, `string`, [`number`]) - }, - name: { - locate: libzip.cwrap(`zip_name_locate`, `number`, [`number`, `string`, `number`]) - }, - source: { - fromUnattachedBuffer: libzip.cwrap(`zip_source_buffer_create`, `number`, [`number`, `number`, `number`, `number`]), - fromBuffer: libzip.cwrap(`zip_source_buffer`, `number`, [`number`, `number`, ...number64, `number`]), - free: libzip.cwrap(`zip_source_free`, null, [`number`]), - keep: libzip.cwrap(`zip_source_keep`, null, [`number`]), - open: libzip.cwrap(`zip_source_open`, `number`, [`number`]), - close: libzip.cwrap(`zip_source_close`, `number`, [`number`]), - seek: libzip.cwrap(`zip_source_seek`, `number`, [`number`, ...number64, `number`]), - tell: libzip.cwrap(`zip_source_tell`, `number`, [`number`]), - read: libzip.cwrap(`zip_source_read`, `number`, [`number`, `number`, `number`]), - error: libzip.cwrap(`zip_source_error`, `number`, [`number`]), - setMtime: libzip.cwrap(`zip_source_set_mtime`, `number`, [`number`, `number`]) - }, - struct: { - stat: libzip.cwrap(`zipstruct_stat`, `number`, []), - statS: libzip.cwrap(`zipstruct_statS`, `number`, []), - statName: libzip.cwrap(`zipstruct_stat_name`, `string`, [`number`]), - statIndex: libzip.cwrap(`zipstruct_stat_index`, `number`, [`number`]), - statSize: libzip.cwrap(`zipstruct_stat_size`, `number`, [`number`]), - statCompSize: libzip.cwrap(`zipstruct_stat_comp_size`, `number`, [`number`]), - statCompMethod: libzip.cwrap(`zipstruct_stat_comp_method`, `number`, [`number`]), - statMtime: libzip.cwrap(`zipstruct_stat_mtime`, `number`, [`number`]), - statCrc: libzip.cwrap(`zipstruct_stat_crc`, `number`, [`number`]), - error: libzip.cwrap(`zipstruct_error`, `number`, []), - errorS: libzip.cwrap(`zipstruct_errorS`, `number`, []), - errorCodeZip: libzip.cwrap(`zipstruct_error_code_zip`, `number`, [`number`]) - } -}); - -let mod = null; -function getLibzipSync() { - if (mod === null) - mod = makeInterface(createModule()); - return mod; -} - -var ErrorCode = /* @__PURE__ */ ((ErrorCode2) => { - ErrorCode2["API_ERROR"] = `API_ERROR`; - ErrorCode2["BUILTIN_NODE_RESOLUTION_FAILED"] = `BUILTIN_NODE_RESOLUTION_FAILED`; - ErrorCode2["EXPORTS_RESOLUTION_FAILED"] = `EXPORTS_RESOLUTION_FAILED`; - ErrorCode2["MISSING_DEPENDENCY"] = `MISSING_DEPENDENCY`; - ErrorCode2["MISSING_PEER_DEPENDENCY"] = `MISSING_PEER_DEPENDENCY`; - ErrorCode2["QUALIFIED_PATH_RESOLUTION_FAILED"] = `QUALIFIED_PATH_RESOLUTION_FAILED`; - ErrorCode2["INTERNAL"] = `INTERNAL`; - ErrorCode2["UNDECLARED_DEPENDENCY"] = `UNDECLARED_DEPENDENCY`; - ErrorCode2["UNSUPPORTED"] = `UNSUPPORTED`; - return ErrorCode2; -})(ErrorCode || {}); -const MODULE_NOT_FOUND_ERRORS = /* @__PURE__ */ new Set([ - "BUILTIN_NODE_RESOLUTION_FAILED" /* BUILTIN_NODE_RESOLUTION_FAILED */, - "MISSING_DEPENDENCY" /* MISSING_DEPENDENCY */, - "MISSING_PEER_DEPENDENCY" /* MISSING_PEER_DEPENDENCY */, - "QUALIFIED_PATH_RESOLUTION_FAILED" /* QUALIFIED_PATH_RESOLUTION_FAILED */, - "UNDECLARED_DEPENDENCY" /* UNDECLARED_DEPENDENCY */ -]); -function makeError(pnpCode, message, data = {}, code) { - code != null ? code : code = MODULE_NOT_FOUND_ERRORS.has(pnpCode) ? `MODULE_NOT_FOUND` : pnpCode; - const propertySpec = { - configurable: true, - writable: true, - enumerable: false - }; - return Object.defineProperties(new Error(message), { - code: { - ...propertySpec, - value: code - }, - pnpCode: { - ...propertySpec, - value: pnpCode - }, - data: { - ...propertySpec, - value: data - } - }); -} -function getIssuerModule(parent) { - let issuer = parent; - while (issuer && (issuer.id === `[eval]` || issuer.id === `` || !issuer.filename)) - issuer = issuer.parent; - return issuer || null; -} -function getPathForDisplay(p) { - return npath.normalize(npath.fromPortablePath(p)); -} - -const [major, minor] = process.versions.node.split(`.`).map((value) => parseInt(value, 10)); -const WATCH_MODE_MESSAGE_USES_ARRAYS = major > 19 || major === 19 && minor >= 2; - -const builtinModules = new Set(require$$0.Module.builtinModules || Object.keys(process.binding(`natives`))); -const isBuiltinModule = (request) => request.startsWith(`node:`) || builtinModules.has(request); -function readPackageScope(checkPath) { - const rootSeparatorIndex = checkPath.indexOf(npath.sep); - let separatorIndex; - do { - separatorIndex = checkPath.lastIndexOf(npath.sep); - checkPath = checkPath.slice(0, separatorIndex); - if (checkPath.endsWith(`${npath.sep}node_modules`)) - return false; - const pjson = readPackage(checkPath + npath.sep); - if (pjson) { - return { - data: pjson, - path: checkPath - }; - } - } while (separatorIndex > rootSeparatorIndex); - return false; -} -function readPackage(requestPath) { - const jsonPath = npath.resolve(requestPath, `package.json`); - if (!fs__default.default.existsSync(jsonPath)) - return null; - return JSON.parse(fs__default.default.readFileSync(jsonPath, `utf8`)); -} -function ERR_REQUIRE_ESM(filename, parentPath = null) { - const basename = parentPath && path__default.default.basename(filename) === path__default.default.basename(parentPath) ? filename : path__default.default.basename(filename); - const msg = `require() of ES Module ${filename}${parentPath ? ` from ${parentPath}` : ``} not supported. -Instead change the require of ${basename} in ${parentPath} to a dynamic import() which is available in all CommonJS modules.`; - const err = new Error(msg); - err.code = `ERR_REQUIRE_ESM`; - return err; -} -function reportRequiredFilesToWatchMode(files) { - if (process.env.WATCH_REPORT_DEPENDENCIES && process.send) { - files = files.map((filename) => npath.fromPortablePath(VirtualFS.resolveVirtual(npath.toPortablePath(filename)))); - if (WATCH_MODE_MESSAGE_USES_ARRAYS) { - process.send({ "watch:require": files }); - } else { - for (const filename of files) { - process.send({ "watch:require": filename }); - } - } - } -} - -function applyPatch(pnpapi, opts) { - const defaultCache = {}; - let enableNativeHooks = true; - process.versions.pnp = String(pnpapi.VERSIONS.std); - const moduleExports = require$$0__default.default; - moduleExports.findPnpApi = (lookupSource) => { - const lookupPath = lookupSource instanceof url.URL ? url.fileURLToPath(lookupSource) : lookupSource; - const apiPath = opts.manager.findApiPathFor(lookupPath); - if (apiPath === null) - return null; - const apiEntry = opts.manager.getApiEntry(apiPath, true); - return apiEntry.instance.findPackageLocator(lookupPath) ? apiEntry.instance : null; - }; - function getRequireStack(parent) { - const requireStack = []; - for (let cursor = parent; cursor; cursor = cursor.parent) - requireStack.push(cursor.filename || cursor.id); - return requireStack; - } - const originalModuleLoad = require$$0.Module._load; - require$$0.Module._load = function(request, parent, isMain) { - if (!enableNativeHooks) - return originalModuleLoad.call(require$$0.Module, request, parent, isMain); - if (isBuiltinModule(request)) { - try { - enableNativeHooks = false; - return originalModuleLoad.call(require$$0.Module, request, parent, isMain); - } finally { - enableNativeHooks = true; - } - } - const parentApiPath = opts.manager.getApiPathFromParent(parent); - const parentApi = parentApiPath !== null ? opts.manager.getApiEntry(parentApiPath, true).instance : null; - if (parentApi === null) - return originalModuleLoad(request, parent, isMain); - if (request === `pnpapi`) - return parentApi; - const modulePath = require$$0.Module._resolveFilename(request, parent, isMain); - const isOwnedByRuntime = parentApi !== null ? parentApi.findPackageLocator(modulePath) !== null : false; - const moduleApiPath = isOwnedByRuntime ? parentApiPath : opts.manager.findApiPathFor(npath.dirname(modulePath)); - const entry = moduleApiPath !== null ? opts.manager.getApiEntry(moduleApiPath) : { instance: null, cache: defaultCache }; - const cacheEntry = entry.cache[modulePath]; - if (cacheEntry) { - if (cacheEntry.loaded === false && cacheEntry.isLoading !== true) { - try { - cacheEntry.isLoading = true; - if (isMain) { - process.mainModule = cacheEntry; - cacheEntry.id = `.`; - } - cacheEntry.load(modulePath); - } finally { - cacheEntry.isLoading = false; - } - } - return cacheEntry.exports; - } - const module = new require$$0.Module(modulePath, parent != null ? parent : void 0); - module.pnpApiPath = moduleApiPath; - reportRequiredFilesToWatchMode([modulePath]); - entry.cache[modulePath] = module; - if (isMain) { - process.mainModule = module; - module.id = `.`; - } - let hasThrown = true; - try { - module.isLoading = true; - module.load(modulePath); - hasThrown = false; - } finally { - module.isLoading = false; - if (hasThrown) { - delete require$$0.Module._cache[modulePath]; - } - } - return module.exports; - }; - function getIssuerSpecsFromPaths(paths) { - return paths.map((path) => ({ - apiPath: opts.manager.findApiPathFor(path), - path, - module: null - })); - } - function getIssuerSpecsFromModule(module) { - var _a; - if (module && module.id !== `` && module.id !== `internal/preload` && !module.parent && !module.filename && module.paths.length > 0) { - return [{ - apiPath: opts.manager.findApiPathFor(module.paths[0]), - path: module.paths[0], - module - }]; - } - const issuer = getIssuerModule(module); - if (issuer !== null) { - const path = npath.dirname(issuer.filename); - const apiPath = opts.manager.getApiPathFromParent(issuer); - return [{ apiPath, path, module }]; - } else { - const path = process.cwd(); - const apiPath = (_a = opts.manager.findApiPathFor(npath.join(path, `[file]`))) != null ? _a : opts.manager.getApiPathFromParent(null); - return [{ apiPath, path, module }]; - } - } - function makeFakeParent(path) { - const fakeParent = new require$$0.Module(``); - const fakeFilePath = npath.join(path, `[file]`); - fakeParent.paths = require$$0.Module._nodeModulePaths(fakeFilePath); - return fakeParent; - } - const pathRegExp = /^(?![a-zA-Z]:[\\/]|\\\\|\.{0,2}(?:\/|$))((?:@[^/]+\/)?[^/]+)\/*(.*|)$/; - const originalModuleResolveFilename = require$$0.Module._resolveFilename; - require$$0.Module._resolveFilename = function(request, parent, isMain, options) { - if (isBuiltinModule(request)) - return request; - if (!enableNativeHooks) - return originalModuleResolveFilename.call(require$$0.Module, request, parent, isMain, options); - if (options && options.plugnplay === false) { - const { plugnplay, ...rest } = options; - const forwardedOptions = Object.keys(rest).length > 0 ? rest : void 0; - try { - enableNativeHooks = false; - return originalModuleResolveFilename.call(require$$0.Module, request, parent, isMain, forwardedOptions); - } finally { - enableNativeHooks = true; - } - } - if (options) { - const optionNames = new Set(Object.keys(options)); - optionNames.delete(`paths`); - optionNames.delete(`plugnplay`); - if (optionNames.size > 0) { - throw makeError( - ErrorCode.UNSUPPORTED, - `Some options passed to require() aren't supported by PnP yet (${Array.from(optionNames).join(`, `)})` - ); - } - } - const issuerSpecs = options && options.paths ? getIssuerSpecsFromPaths(options.paths) : getIssuerSpecsFromModule(parent); - if (request.match(pathRegExp) === null) { - const parentDirectory = (parent == null ? void 0 : parent.filename) != null ? npath.dirname(parent.filename) : null; - const absoluteRequest = npath.isAbsolute(request) ? request : parentDirectory !== null ? npath.resolve(parentDirectory, request) : null; - if (absoluteRequest !== null) { - const apiPath = parentDirectory === npath.dirname(absoluteRequest) && (parent == null ? void 0 : parent.pnpApiPath) ? parent.pnpApiPath : opts.manager.findApiPathFor(absoluteRequest); - if (apiPath !== null) { - issuerSpecs.unshift({ - apiPath, - path: parentDirectory, - module: null - }); - } - } - } - let firstError; - for (const { apiPath, path, module } of issuerSpecs) { - let resolution; - const issuerApi = apiPath !== null ? opts.manager.getApiEntry(apiPath, true).instance : null; - try { - if (issuerApi !== null) { - resolution = issuerApi.resolveRequest(request, path !== null ? `${path}/` : null); - } else { - if (path === null) - throw new Error(`Assertion failed: Expected the path to be set`); - resolution = originalModuleResolveFilename.call(require$$0.Module, request, module || makeFakeParent(path), isMain); - } - } catch (error) { - firstError = firstError || error; - continue; - } - if (resolution !== null) { - return resolution; - } - } - const requireStack = getRequireStack(parent); - Object.defineProperty(firstError, `requireStack`, { - configurable: true, - writable: true, - enumerable: false, - value: requireStack - }); - if (requireStack.length > 0) - firstError.message += ` -Require stack: -- ${requireStack.join(` -- `)}`; - if (typeof firstError.pnpCode === `string`) - Error.captureStackTrace(firstError); - throw firstError; - }; - const originalFindPath = require$$0.Module._findPath; - require$$0.Module._findPath = function(request, paths, isMain) { - if (request === `pnpapi`) - return false; - if (!enableNativeHooks) - return originalFindPath.call(require$$0.Module, request, paths, isMain); - const isAbsolute = npath.isAbsolute(request); - if (isAbsolute) - paths = [``]; - else if (!paths || paths.length === 0) - return false; - for (const path of paths) { - let resolution; - try { - const pnpApiPath = opts.manager.findApiPathFor(isAbsolute ? request : path); - if (pnpApiPath !== null) { - const api = opts.manager.getApiEntry(pnpApiPath, true).instance; - resolution = api.resolveRequest(request, path) || false; - } else { - resolution = originalFindPath.call(require$$0.Module, request, [path], isMain); - } - } catch (error) { - continue; - } - if (resolution) { - return resolution; - } - } - return false; - }; - const originalExtensionJSFunction = require$$0.Module._extensions[`.js`]; - require$$0.Module._extensions[`.js`] = function(module, filename) { - var _a, _b; - if (filename.endsWith(`.js`)) { - const pkg = readPackageScope(filename); - if (pkg && ((_a = pkg.data) == null ? void 0 : _a.type) === `module`) { - const err = ERR_REQUIRE_ESM(filename, (_b = module.parent) == null ? void 0 : _b.filename); - Error.captureStackTrace(err); - throw err; - } - } - originalExtensionJSFunction.call(this, module, filename); - }; - const originalDlopen = process.dlopen; - process.dlopen = function(...args) { - const [module, filename, ...rest] = args; - return originalDlopen.call( - this, - module, - npath.fromPortablePath(VirtualFS.resolveVirtual(npath.toPortablePath(filename))), - ...rest - ); - }; - const originalEmit = process.emit; - process.emit = function(name, data, ...args) { - if (name === `warning` && typeof data === `object` && data.name === `ExperimentalWarning` && (data.message.includes(`--experimental-loader`) || data.message.includes(`Custom ESM Loaders is an experimental feature`))) - return false; - return originalEmit.apply(process, arguments); - }; - patchFs(fs__default.default, new PosixFS(opts.fakeFs)); -} - -function hydrateRuntimeState(data, { basePath }) { - const portablePath = npath.toPortablePath(basePath); - const absolutePortablePath = ppath.resolve(portablePath); - const ignorePattern = data.ignorePatternData !== null ? new RegExp(data.ignorePatternData) : null; - const packageLocatorsByLocations = /* @__PURE__ */ new Map(); - const packageRegistry = new Map(data.packageRegistryData.map(([packageName, packageStoreData]) => { - return [packageName, new Map(packageStoreData.map(([packageReference, packageInformationData]) => { - var _a; - if (packageName === null !== (packageReference === null)) - throw new Error(`Assertion failed: The name and reference should be null, or neither should`); - const discardFromLookup = (_a = packageInformationData.discardFromLookup) != null ? _a : false; - const packageLocator = { name: packageName, reference: packageReference }; - const entry = packageLocatorsByLocations.get(packageInformationData.packageLocation); - if (!entry) { - packageLocatorsByLocations.set(packageInformationData.packageLocation, { locator: packageLocator, discardFromLookup }); - } else { - entry.discardFromLookup = entry.discardFromLookup && discardFromLookup; - if (!discardFromLookup) { - entry.locator = packageLocator; - } - } - let resolvedPackageLocation = null; - return [packageReference, { - packageDependencies: new Map(packageInformationData.packageDependencies), - packagePeers: new Set(packageInformationData.packagePeers), - linkType: packageInformationData.linkType, - discardFromLookup, - get packageLocation() { - return resolvedPackageLocation || (resolvedPackageLocation = ppath.join(absolutePortablePath, packageInformationData.packageLocation)); - } - }]; - }))]; - })); - const fallbackExclusionList = new Map(data.fallbackExclusionList.map(([packageName, packageReferences]) => { - return [packageName, new Set(packageReferences)]; - })); - const fallbackPool = new Map(data.fallbackPool); - const dependencyTreeRoots = data.dependencyTreeRoots; - const enableTopLevelFallback = data.enableTopLevelFallback; - return { - basePath: portablePath, - dependencyTreeRoots, - enableTopLevelFallback, - fallbackExclusionList, - fallbackPool, - ignorePattern, - packageLocatorsByLocations, - packageRegistry - }; -} - -/** - * @param {object} exports - * @param {Set} keys - */ -function loop(exports, keys) { - if (typeof exports === 'string') { - return exports; - } - - if (exports) { - let idx, tmp; - if (Array.isArray(exports)) { - for (idx=0; idx < exports.length; idx++) { - if (tmp = loop(exports[idx], keys)) return tmp; - } - } else { - for (idx in exports) { - if (keys.has(idx)) { - return loop(exports[idx], keys); - } - } - } - } -} - -/** - * @param {string} name The package name - * @param {string} entry The target entry, eg "." - * @param {number} [condition] Unmatched condition? - */ -function bail(name, entry, condition) { - throw new Error( - condition - ? `No known conditions for "${entry}" entry in "${name}" package` - : `Missing "${entry}" export in "${name}" package` - ); -} - -/** - * @param {string} name the package name - * @param {string} entry the target path/import - */ -function toName(name, entry) { - return entry === name ? '.' - : entry[0] === '.' ? entry - : entry.replace(new RegExp('^' + name + '\/'), './'); -} - -/** - * @param {object} pkg package.json contents - * @param {string} [entry] entry name or import path - * @param {object} [options] - * @param {boolean} [options.browser] - * @param {boolean} [options.require] - * @param {string[]} [options.conditions] - * @param {boolean} [options.unsafe] - */ -function resolve(pkg, entry='.', options={}) { - let { name, exports } = pkg; - - if (exports) { - let { browser, require, unsafe, conditions=[] } = options; - - let target = toName(name, entry); - if (target[0] !== '.') target = './' + target; - - if (typeof exports === 'string') { - return target === '.' ? exports : bail(name, target); - } - - let allows = new Set(['default', ...conditions]); - unsafe || allows.add(require ? 'require' : 'import'); - unsafe || allows.add(browser ? 'browser' : 'node'); - - let key, tmp, isSingle=false; - - for (key in exports) { - isSingle = key[0] !== '.'; - break; - } - - if (isSingle) { - return target === '.' - ? loop(exports, allows) || bail(name, target, 1) - : bail(name, target); - } - - if (tmp = exports[target]) { - return loop(tmp, allows) || bail(name, target, 1); - } - - for (key in exports) { - tmp = key[key.length - 1]; - if (tmp === '/' && target.startsWith(key)) { - return (tmp = loop(exports[key], allows)) - ? (tmp + target.substring(key.length)) - : bail(name, target, 1); - } - if (tmp === '*' && target.startsWith(key.slice(0, -1))) { - // do not trigger if no *content* to inject - if (target.substring(key.length - 1).length > 0) { - return (tmp = loop(exports[key], allows)) - ? tmp.replace('*', target.substring(key.length - 1)) - : bail(name, target, 1); - } - } - } - - return bail(name, target); - } -} - -const ArrayIsArray = Array.isArray; -const JSONStringify = JSON.stringify; -const ObjectGetOwnPropertyNames = Object.getOwnPropertyNames; -const ObjectPrototypeHasOwnProperty = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop); -const RegExpPrototypeExec = (obj, string) => RegExp.prototype.exec.call(obj, string); -const RegExpPrototypeSymbolReplace = (obj, ...rest) => RegExp.prototype[Symbol.replace].apply(obj, rest); -const StringPrototypeEndsWith = (str, ...rest) => String.prototype.endsWith.apply(str, rest); -const StringPrototypeIncludes = (str, ...rest) => String.prototype.includes.apply(str, rest); -const StringPrototypeLastIndexOf = (str, ...rest) => String.prototype.lastIndexOf.apply(str, rest); -const StringPrototypeIndexOf = (str, ...rest) => String.prototype.indexOf.apply(str, rest); -const StringPrototypeReplace = (str, ...rest) => String.prototype.replace.apply(str, rest); -const StringPrototypeSlice = (str, ...rest) => String.prototype.slice.apply(str, rest); -const StringPrototypeStartsWith = (str, ...rest) => String.prototype.startsWith.apply(str, rest); -const SafeMap = Map; -const JSONParse = JSON.parse; - -function createErrorType(code, messageCreator, errorType) { - return class extends errorType { - constructor(...args) { - super(messageCreator(...args)); - this.code = code; - this.name = `${errorType.name} [${code}]`; - } - }; -} -const ERR_PACKAGE_IMPORT_NOT_DEFINED = createErrorType( - `ERR_PACKAGE_IMPORT_NOT_DEFINED`, - (specifier, packagePath, base) => { - return `Package import specifier "${specifier}" is not defined${packagePath ? ` in package ${packagePath}package.json` : ``} imported from ${base}`; - }, - TypeError -); -const ERR_INVALID_MODULE_SPECIFIER = createErrorType( - `ERR_INVALID_MODULE_SPECIFIER`, - (request, reason, base = void 0) => { - return `Invalid module "${request}" ${reason}${base ? ` imported from ${base}` : ``}`; - }, - TypeError -); -const ERR_INVALID_PACKAGE_TARGET = createErrorType( - `ERR_INVALID_PACKAGE_TARGET`, - (pkgPath, key, target, isImport = false, base = void 0) => { - const relError = typeof target === `string` && !isImport && target.length && !StringPrototypeStartsWith(target, `./`); - if (key === `.`) { - assert__default.default(isImport === false); - return `Invalid "exports" main target ${JSONStringify(target)} defined in the package config ${pkgPath}package.json${base ? ` imported from ${base}` : ``}${relError ? `; targets must start with "./"` : ``}`; - } - return `Invalid "${isImport ? `imports` : `exports`}" target ${JSONStringify( - target - )} defined for '${key}' in the package config ${pkgPath}package.json${base ? ` imported from ${base}` : ``}${relError ? `; targets must start with "./"` : ``}`; - }, - Error -); -const ERR_INVALID_PACKAGE_CONFIG = createErrorType( - `ERR_INVALID_PACKAGE_CONFIG`, - (path, base, message) => { - return `Invalid package config ${path}${base ? ` while importing ${base}` : ``}${message ? `. ${message}` : ``}`; - }, - Error -); - -function filterOwnProperties(source, keys) { - const filtered = /* @__PURE__ */ Object.create(null); - for (let i = 0; i < keys.length; i++) { - const key = keys[i]; - if (ObjectPrototypeHasOwnProperty(source, key)) { - filtered[key] = source[key]; - } - } - return filtered; -} - -const packageJSONCache = new SafeMap(); -function getPackageConfig(path, specifier, base, readFileSyncFn) { - const existing = packageJSONCache.get(path); - if (existing !== void 0) { - return existing; - } - const source = readFileSyncFn(path); - if (source === void 0) { - const packageConfig2 = { - pjsonPath: path, - exists: false, - main: void 0, - name: void 0, - type: "none", - exports: void 0, - imports: void 0 - }; - packageJSONCache.set(path, packageConfig2); - return packageConfig2; - } - let packageJSON; - try { - packageJSON = JSONParse(source); - } catch (error) { - throw new ERR_INVALID_PACKAGE_CONFIG( - path, - (base ? `"${specifier}" from ` : "") + url.fileURLToPath(base || specifier), - error.message - ); - } - let { imports, main, name, type } = filterOwnProperties(packageJSON, [ - "imports", - "main", - "name", - "type" - ]); - const exports = ObjectPrototypeHasOwnProperty(packageJSON, "exports") ? packageJSON.exports : void 0; - if (typeof imports !== "object" || imports === null) { - imports = void 0; - } - if (typeof main !== "string") { - main = void 0; - } - if (typeof name !== "string") { - name = void 0; - } - if (type !== "module" && type !== "commonjs") { - type = "none"; - } - const packageConfig = { - pjsonPath: path, - exists: true, - main, - name, - type, - exports, - imports - }; - packageJSONCache.set(path, packageConfig); - return packageConfig; -} -function getPackageScopeConfig(resolved, readFileSyncFn) { - let packageJSONUrl = new URL("./package.json", resolved); - while (true) { - const packageJSONPath2 = packageJSONUrl.pathname; - if (StringPrototypeEndsWith(packageJSONPath2, "node_modules/package.json")) { - break; - } - const packageConfig2 = getPackageConfig( - url.fileURLToPath(packageJSONUrl), - resolved, - void 0, - readFileSyncFn - ); - if (packageConfig2.exists) { - return packageConfig2; - } - const lastPackageJSONUrl = packageJSONUrl; - packageJSONUrl = new URL("../package.json", packageJSONUrl); - if (packageJSONUrl.pathname === lastPackageJSONUrl.pathname) { - break; - } - } - const packageJSONPath = url.fileURLToPath(packageJSONUrl); - const packageConfig = { - pjsonPath: packageJSONPath, - exists: false, - main: void 0, - name: void 0, - type: "none", - exports: void 0, - imports: void 0 - }; - packageJSONCache.set(packageJSONPath, packageConfig); - return packageConfig; -} - -/** - @license - Copyright Node.js contributors. All rights reserved. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to - deal in the Software without restriction, including without limitation the - rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - sell copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - IN THE SOFTWARE. -*/ -function throwImportNotDefined(specifier, packageJSONUrl, base) { - throw new ERR_PACKAGE_IMPORT_NOT_DEFINED( - specifier, - packageJSONUrl && url.fileURLToPath(new URL(".", packageJSONUrl)), - url.fileURLToPath(base) - ); -} -function throwInvalidSubpath(subpath, packageJSONUrl, internal, base) { - const reason = `request is not a valid subpath for the "${internal ? "imports" : "exports"}" resolution of ${url.fileURLToPath(packageJSONUrl)}`; - throw new ERR_INVALID_MODULE_SPECIFIER( - subpath, - reason, - base && url.fileURLToPath(base) - ); -} -function throwInvalidPackageTarget(subpath, target, packageJSONUrl, internal, base) { - if (typeof target === "object" && target !== null) { - target = JSONStringify(target, null, ""); - } else { - target = `${target}`; - } - throw new ERR_INVALID_PACKAGE_TARGET( - url.fileURLToPath(new URL(".", packageJSONUrl)), - subpath, - target, - internal, - base && url.fileURLToPath(base) - ); -} -const invalidSegmentRegEx = /(^|\\|\/)((\.|%2e)(\.|%2e)?|(n|%6e|%4e)(o|%6f|%4f)(d|%64|%44)(e|%65|%45)(_|%5f)(m|%6d|%4d)(o|%6f|%4f)(d|%64|%44)(u|%75|%55)(l|%6c|%4c)(e|%65|%45)(s|%73|%53))(\\|\/|$)/i; -const patternRegEx = /\*/g; -function resolvePackageTargetString(target, subpath, match, packageJSONUrl, base, pattern, internal, conditions) { - if (subpath !== "" && !pattern && target[target.length - 1] !== "/") - throwInvalidPackageTarget(match, target, packageJSONUrl, internal, base); - if (!StringPrototypeStartsWith(target, "./")) { - if (internal && !StringPrototypeStartsWith(target, "../") && !StringPrototypeStartsWith(target, "/")) { - let isURL = false; - try { - new URL(target); - isURL = true; - } catch { - } - if (!isURL) { - const exportTarget = pattern ? RegExpPrototypeSymbolReplace(patternRegEx, target, () => subpath) : target + subpath; - return exportTarget; - } - } - throwInvalidPackageTarget(match, target, packageJSONUrl, internal, base); - } - if (RegExpPrototypeExec( - invalidSegmentRegEx, - StringPrototypeSlice(target, 2) - ) !== null) - throwInvalidPackageTarget(match, target, packageJSONUrl, internal, base); - const resolved = new URL(target, packageJSONUrl); - const resolvedPath = resolved.pathname; - const packagePath = new URL(".", packageJSONUrl).pathname; - if (!StringPrototypeStartsWith(resolvedPath, packagePath)) - throwInvalidPackageTarget(match, target, packageJSONUrl, internal, base); - if (subpath === "") - return resolved; - if (RegExpPrototypeExec(invalidSegmentRegEx, subpath) !== null) { - const request = pattern ? StringPrototypeReplace(match, "*", () => subpath) : match + subpath; - throwInvalidSubpath(request, packageJSONUrl, internal, base); - } - if (pattern) { - return new URL( - RegExpPrototypeSymbolReplace(patternRegEx, resolved.href, () => subpath) - ); - } - return new URL(subpath, resolved); -} -function isArrayIndex(key) { - const keyNum = +key; - if (`${keyNum}` !== key) - return false; - return keyNum >= 0 && keyNum < 4294967295; -} -function resolvePackageTarget(packageJSONUrl, target, subpath, packageSubpath, base, pattern, internal, conditions) { - if (typeof target === "string") { - return resolvePackageTargetString( - target, - subpath, - packageSubpath, - packageJSONUrl, - base, - pattern, - internal); - } else if (ArrayIsArray(target)) { - if (target.length === 0) { - return null; - } - let lastException; - for (let i = 0; i < target.length; i++) { - const targetItem = target[i]; - let resolveResult; - try { - resolveResult = resolvePackageTarget( - packageJSONUrl, - targetItem, - subpath, - packageSubpath, - base, - pattern, - internal, - conditions - ); - } catch (e) { - lastException = e; - if (e.code === "ERR_INVALID_PACKAGE_TARGET") { - continue; - } - throw e; - } - if (resolveResult === void 0) { - continue; - } - if (resolveResult === null) { - lastException = null; - continue; - } - return resolveResult; - } - if (lastException === void 0 || lastException === null) - return lastException; - throw lastException; - } else if (typeof target === "object" && target !== null) { - const keys = ObjectGetOwnPropertyNames(target); - for (let i = 0; i < keys.length; i++) { - const key = keys[i]; - if (isArrayIndex(key)) { - throw new ERR_INVALID_PACKAGE_CONFIG( - url.fileURLToPath(packageJSONUrl), - base, - '"exports" cannot contain numeric property keys.' - ); - } - } - for (let i = 0; i < keys.length; i++) { - const key = keys[i]; - if (key === "default" || conditions.has(key)) { - const conditionalTarget = target[key]; - const resolveResult = resolvePackageTarget( - packageJSONUrl, - conditionalTarget, - subpath, - packageSubpath, - base, - pattern, - internal, - conditions - ); - if (resolveResult === void 0) - continue; - return resolveResult; - } - } - return void 0; - } else if (target === null) { - return null; - } - throwInvalidPackageTarget( - packageSubpath, - target, - packageJSONUrl, - internal, - base - ); -} -function patternKeyCompare(a, b) { - const aPatternIndex = StringPrototypeIndexOf(a, "*"); - const bPatternIndex = StringPrototypeIndexOf(b, "*"); - const baseLenA = aPatternIndex === -1 ? a.length : aPatternIndex + 1; - const baseLenB = bPatternIndex === -1 ? b.length : bPatternIndex + 1; - if (baseLenA > baseLenB) - return -1; - if (baseLenB > baseLenA) - return 1; - if (aPatternIndex === -1) - return 1; - if (bPatternIndex === -1) - return -1; - if (a.length > b.length) - return -1; - if (b.length > a.length) - return 1; - return 0; -} -function packageImportsResolve({ - name, - base, - conditions, - readFileSyncFn -}) { - if (name === "#" || StringPrototypeStartsWith(name, "#/") || StringPrototypeEndsWith(name, "/")) { - const reason = "is not a valid internal imports specifier name"; - throw new ERR_INVALID_MODULE_SPECIFIER(name, reason, url.fileURLToPath(base)); - } - let packageJSONUrl; - const packageConfig = getPackageScopeConfig(base, readFileSyncFn); - if (packageConfig.exists) { - packageJSONUrl = url.pathToFileURL(packageConfig.pjsonPath); - const imports = packageConfig.imports; - if (imports) { - if (ObjectPrototypeHasOwnProperty(imports, name) && !StringPrototypeIncludes(name, "*")) { - const resolveResult = resolvePackageTarget( - packageJSONUrl, - imports[name], - "", - name, - base, - false, - true, - conditions - ); - if (resolveResult != null) { - return resolveResult; - } - } else { - let bestMatch = ""; - let bestMatchSubpath; - const keys = ObjectGetOwnPropertyNames(imports); - for (let i = 0; i < keys.length; i++) { - const key = keys[i]; - const patternIndex = StringPrototypeIndexOf(key, "*"); - if (patternIndex !== -1 && StringPrototypeStartsWith( - name, - StringPrototypeSlice(key, 0, patternIndex) - )) { - const patternTrailer = StringPrototypeSlice(key, patternIndex + 1); - if (name.length >= key.length && StringPrototypeEndsWith(name, patternTrailer) && patternKeyCompare(bestMatch, key) === 1 && StringPrototypeLastIndexOf(key, "*") === patternIndex) { - bestMatch = key; - bestMatchSubpath = StringPrototypeSlice( - name, - patternIndex, - name.length - patternTrailer.length - ); - } - } - } - if (bestMatch) { - const target = imports[bestMatch]; - const resolveResult = resolvePackageTarget( - packageJSONUrl, - target, - bestMatchSubpath, - bestMatch, - base, - true, - true, - conditions - ); - if (resolveResult != null) { - return resolveResult; - } - } - } - } - } - throwImportNotDefined(name, packageJSONUrl, base); -} - -function makeApi(runtimeState, opts) { - const alwaysWarnOnFallback = Number(process.env.PNP_ALWAYS_WARN_ON_FALLBACK) > 0; - const debugLevel = Number(process.env.PNP_DEBUG_LEVEL); - const pathRegExp = /^(?![a-zA-Z]:[\\/]|\\\\|\.{0,2}(?:\/|$))((?:node:)?(?:@[^/]+\/)?[^/]+)\/*(.*|)$/; - const isStrictRegExp = /^(\/|\.{1,2}(\/|$))/; - const isDirRegExp = /\/$/; - const isRelativeRegexp = /^\.{0,2}\//; - const topLevelLocator = { name: null, reference: null }; - const fallbackLocators = []; - const emittedWarnings = /* @__PURE__ */ new Set(); - if (runtimeState.enableTopLevelFallback === true) - fallbackLocators.push(topLevelLocator); - if (opts.compatibilityMode !== false) { - for (const name of [`react-scripts`, `gatsby`]) { - const packageStore = runtimeState.packageRegistry.get(name); - if (packageStore) { - for (const reference of packageStore.keys()) { - if (reference === null) { - throw new Error(`Assertion failed: This reference shouldn't be null`); - } else { - fallbackLocators.push({ name, reference }); - } - } - } - } - } - const { - ignorePattern, - packageRegistry, - packageLocatorsByLocations - } = runtimeState; - function makeLogEntry(name, args) { - return { - fn: name, - args, - error: null, - result: null - }; - } - function trace(entry) { - var _a, _b, _c, _d, _e, _f; - const colors = (_c = (_b = (_a = process.stderr) == null ? void 0 : _a.hasColors) == null ? void 0 : _b.call(_a)) != null ? _c : process.stdout.isTTY; - const c = (n, str) => `\x1B[${n}m${str}\x1B[0m`; - const error = entry.error; - if (error) - console.error(c(`31;1`, `\u2716 ${(_d = entry.error) == null ? void 0 : _d.message.replace(/\n.*/s, ``)}`)); - else - console.error(c(`33;1`, `\u203C Resolution`)); - if (entry.args.length > 0) - console.error(); - for (const arg of entry.args) - console.error(` ${c(`37;1`, `In \u2190`)} ${nodeUtils.inspect(arg, { colors, compact: true })}`); - if (entry.result) { - console.error(); - console.error(` ${c(`37;1`, `Out \u2192`)} ${nodeUtils.inspect(entry.result, { colors, compact: true })}`); - } - const stack = (_f = (_e = new Error().stack.match(/(?<=^ +)at.*/gm)) == null ? void 0 : _e.slice(2)) != null ? _f : []; - if (stack.length > 0) { - console.error(); - for (const line of stack) { - console.error(` ${c(`38;5;244`, line)}`); - } - } - console.error(); - } - function maybeLog(name, fn) { - if (opts.allowDebug === false) - return fn; - if (Number.isFinite(debugLevel)) { - if (debugLevel >= 2) { - return (...args) => { - const logEntry = makeLogEntry(name, args); - try { - return logEntry.result = fn(...args); - } catch (error) { - throw logEntry.error = error; - } finally { - trace(logEntry); - } - }; - } else if (debugLevel >= 1) { - return (...args) => { - try { - return fn(...args); - } catch (error) { - const logEntry = makeLogEntry(name, args); - logEntry.error = error; - trace(logEntry); - throw error; - } - }; - } - } - return fn; - } - function getPackageInformationSafe(packageLocator) { - const packageInformation = getPackageInformation(packageLocator); - if (!packageInformation) { - throw makeError( - ErrorCode.INTERNAL, - `Couldn't find a matching entry in the dependency tree for the specified parent (this is probably an internal error)` - ); - } - return packageInformation; - } - function isDependencyTreeRoot(packageLocator) { - if (packageLocator.name === null) - return true; - for (const dependencyTreeRoot of runtimeState.dependencyTreeRoots) - if (dependencyTreeRoot.name === packageLocator.name && dependencyTreeRoot.reference === packageLocator.reference) - return true; - return false; - } - const defaultExportsConditions = /* @__PURE__ */ new Set([`default`, `node`, `require`]); - function applyNodeExportsResolution(unqualifiedPath, conditions = defaultExportsConditions) { - const locator = findPackageLocator(ppath.join(unqualifiedPath, `internal.js`), { - resolveIgnored: true, - includeDiscardFromLookup: true - }); - if (locator === null) { - throw makeError( - ErrorCode.INTERNAL, - `The locator that owns the "${unqualifiedPath}" path can't be found inside the dependency tree (this is probably an internal error)` - ); - } - const { packageLocation } = getPackageInformationSafe(locator); - const manifestPath = ppath.join(packageLocation, Filename.manifest); - if (!opts.fakeFs.existsSync(manifestPath)) - return null; - const pkgJson = JSON.parse(opts.fakeFs.readFileSync(manifestPath, `utf8`)); - let subpath = ppath.contains(packageLocation, unqualifiedPath); - if (subpath === null) { - throw makeError( - ErrorCode.INTERNAL, - `unqualifiedPath doesn't contain the packageLocation (this is probably an internal error)` - ); - } - if (!isRelativeRegexp.test(subpath)) - subpath = `./${subpath}`; - let resolvedExport; - try { - resolvedExport = resolve(pkgJson, ppath.normalize(subpath), { - conditions, - unsafe: true - }); - } catch (error) { - throw makeError( - ErrorCode.EXPORTS_RESOLUTION_FAILED, - error.message, - { unqualifiedPath: getPathForDisplay(unqualifiedPath), locator, pkgJson, subpath: getPathForDisplay(subpath), conditions }, - `ERR_PACKAGE_PATH_NOT_EXPORTED` - ); - } - if (typeof resolvedExport === `string`) - return ppath.join(packageLocation, resolvedExport); - return null; - } - function applyNodeExtensionResolution(unqualifiedPath, candidates, { extensions }) { - let stat; - try { - candidates.push(unqualifiedPath); - stat = opts.fakeFs.statSync(unqualifiedPath); - } catch (error) { - } - if (stat && !stat.isDirectory()) - return opts.fakeFs.realpathSync(unqualifiedPath); - if (stat && stat.isDirectory()) { - let pkgJson; - try { - pkgJson = JSON.parse(opts.fakeFs.readFileSync(ppath.join(unqualifiedPath, Filename.manifest), `utf8`)); - } catch (error) { - } - let nextUnqualifiedPath; - if (pkgJson && pkgJson.main) - nextUnqualifiedPath = ppath.resolve(unqualifiedPath, pkgJson.main); - if (nextUnqualifiedPath && nextUnqualifiedPath !== unqualifiedPath) { - const resolution = applyNodeExtensionResolution(nextUnqualifiedPath, candidates, { extensions }); - if (resolution !== null) { - return resolution; - } - } - } - for (let i = 0, length = extensions.length; i < length; i++) { - const candidateFile = `${unqualifiedPath}${extensions[i]}`; - candidates.push(candidateFile); - if (opts.fakeFs.existsSync(candidateFile)) { - return candidateFile; - } - } - if (stat && stat.isDirectory()) { - for (let i = 0, length = extensions.length; i < length; i++) { - const candidateFile = ppath.format({ dir: unqualifiedPath, name: `index`, ext: extensions[i] }); - candidates.push(candidateFile); - if (opts.fakeFs.existsSync(candidateFile)) { - return candidateFile; - } - } - } - return null; - } - function makeFakeModule(path) { - const fakeModule = new require$$0.Module(path, null); - fakeModule.filename = path; - fakeModule.paths = require$$0.Module._nodeModulePaths(path); - return fakeModule; - } - function callNativeResolution(request, issuer) { - if (issuer.endsWith(`/`)) - issuer = ppath.join(issuer, `internal.js`); - return require$$0.Module._resolveFilename(npath.fromPortablePath(request), makeFakeModule(npath.fromPortablePath(issuer)), false, { plugnplay: false }); - } - function isPathIgnored(path) { - if (ignorePattern === null) - return false; - const subPath = ppath.contains(runtimeState.basePath, path); - if (subPath === null) - return false; - if (ignorePattern.test(subPath.replace(/\/$/, ``))) { - return true; - } else { - return false; - } - } - const VERSIONS = { std: 3, resolveVirtual: 1, getAllLocators: 1 }; - const topLevel = topLevelLocator; - function getPackageInformation({ name, reference }) { - const packageInformationStore = packageRegistry.get(name); - if (!packageInformationStore) - return null; - const packageInformation = packageInformationStore.get(reference); - if (!packageInformation) - return null; - return packageInformation; - } - function findPackageDependents({ name, reference }) { - const dependents = []; - for (const [dependentName, packageInformationStore] of packageRegistry) { - if (dependentName === null) - continue; - for (const [dependentReference, packageInformation] of packageInformationStore) { - if (dependentReference === null) - continue; - const dependencyReference = packageInformation.packageDependencies.get(name); - if (dependencyReference !== reference) - continue; - if (dependentName === name && dependentReference === reference) - continue; - dependents.push({ - name: dependentName, - reference: dependentReference - }); - } - } - return dependents; - } - function findBrokenPeerDependencies(dependency, initialPackage) { - const brokenPackages = /* @__PURE__ */ new Map(); - const alreadyVisited = /* @__PURE__ */ new Set(); - const traversal = (currentPackage) => { - const identifier = JSON.stringify(currentPackage.name); - if (alreadyVisited.has(identifier)) - return; - alreadyVisited.add(identifier); - const dependents = findPackageDependents(currentPackage); - for (const dependent of dependents) { - const dependentInformation = getPackageInformationSafe(dependent); - if (dependentInformation.packagePeers.has(dependency)) { - traversal(dependent); - } else { - let brokenSet = brokenPackages.get(dependent.name); - if (typeof brokenSet === `undefined`) - brokenPackages.set(dependent.name, brokenSet = /* @__PURE__ */ new Set()); - brokenSet.add(dependent.reference); - } - } - }; - traversal(initialPackage); - const brokenList = []; - for (const name of [...brokenPackages.keys()].sort()) - for (const reference of [...brokenPackages.get(name)].sort()) - brokenList.push({ name, reference }); - return brokenList; - } - function findPackageLocator(location, { resolveIgnored = false, includeDiscardFromLookup = false } = {}) { - if (isPathIgnored(location) && !resolveIgnored) - return null; - let relativeLocation = ppath.relative(runtimeState.basePath, location); - if (!relativeLocation.match(isStrictRegExp)) - relativeLocation = `./${relativeLocation}`; - if (!relativeLocation.endsWith(`/`)) - relativeLocation = `${relativeLocation}/`; - do { - const entry = packageLocatorsByLocations.get(relativeLocation); - if (typeof entry === `undefined` || entry.discardFromLookup && !includeDiscardFromLookup) { - relativeLocation = relativeLocation.substring(0, relativeLocation.lastIndexOf(`/`, relativeLocation.length - 2) + 1); - continue; - } - return entry.locator; - } while (relativeLocation !== ``); - return null; - } - function tryReadFile(filePath) { - try { - return opts.fakeFs.readFileSync(npath.toPortablePath(filePath), `utf8`); - } catch (err) { - if (err.code === `ENOENT`) - return void 0; - throw err; - } - } - function resolveToUnqualified(request, issuer, { considerBuiltins = true } = {}) { - if (request.startsWith(`#`)) - throw new Error(`resolveToUnqualified can not handle private import mappings`); - if (request === `pnpapi`) - return npath.toPortablePath(opts.pnpapiResolution); - if (considerBuiltins && isBuiltinModule(request)) - return null; - const requestForDisplay = getPathForDisplay(request); - const issuerForDisplay = issuer && getPathForDisplay(issuer); - if (issuer && isPathIgnored(issuer)) { - if (!ppath.isAbsolute(request) || findPackageLocator(request) === null) { - const result = callNativeResolution(request, issuer); - if (result === false) { - throw makeError( - ErrorCode.BUILTIN_NODE_RESOLUTION_FAILED, - `The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer was explicitely ignored by the regexp) - -Require request: "${requestForDisplay}" -Required by: ${issuerForDisplay} -`, - { request: requestForDisplay, issuer: issuerForDisplay } - ); - } - return npath.toPortablePath(result); - } - } - let unqualifiedPath; - const dependencyNameMatch = request.match(pathRegExp); - if (!dependencyNameMatch) { - if (ppath.isAbsolute(request)) { - unqualifiedPath = ppath.normalize(request); - } else { - if (!issuer) { - throw makeError( - ErrorCode.API_ERROR, - `The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute`, - { request: requestForDisplay, issuer: issuerForDisplay } - ); - } - const absoluteIssuer = ppath.resolve(issuer); - if (issuer.match(isDirRegExp)) { - unqualifiedPath = ppath.normalize(ppath.join(absoluteIssuer, request)); - } else { - unqualifiedPath = ppath.normalize(ppath.join(ppath.dirname(absoluteIssuer), request)); - } - } - } else { - if (!issuer) { - throw makeError( - ErrorCode.API_ERROR, - `The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute`, - { request: requestForDisplay, issuer: issuerForDisplay } - ); - } - const [, dependencyName, subPath] = dependencyNameMatch; - const issuerLocator = findPackageLocator(issuer); - if (!issuerLocator) { - const result = callNativeResolution(request, issuer); - if (result === false) { - throw makeError( - ErrorCode.BUILTIN_NODE_RESOLUTION_FAILED, - `The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer doesn't seem to be part of the Yarn-managed dependency tree). - -Require path: "${requestForDisplay}" -Required by: ${issuerForDisplay} -`, - { request: requestForDisplay, issuer: issuerForDisplay } - ); - } - return npath.toPortablePath(result); - } - const issuerInformation = getPackageInformationSafe(issuerLocator); - let dependencyReference = issuerInformation.packageDependencies.get(dependencyName); - let fallbackReference = null; - if (dependencyReference == null) { - if (issuerLocator.name !== null) { - const exclusionEntry = runtimeState.fallbackExclusionList.get(issuerLocator.name); - const canUseFallbacks = !exclusionEntry || !exclusionEntry.has(issuerLocator.reference); - if (canUseFallbacks) { - for (let t = 0, T = fallbackLocators.length; t < T; ++t) { - const fallbackInformation = getPackageInformationSafe(fallbackLocators[t]); - const reference = fallbackInformation.packageDependencies.get(dependencyName); - if (reference == null) - continue; - if (alwaysWarnOnFallback) - fallbackReference = reference; - else - dependencyReference = reference; - break; - } - if (runtimeState.enableTopLevelFallback) { - if (dependencyReference == null && fallbackReference === null) { - const reference = runtimeState.fallbackPool.get(dependencyName); - if (reference != null) { - fallbackReference = reference; - } - } - } - } - } - } - let error = null; - if (dependencyReference === null) { - if (isDependencyTreeRoot(issuerLocator)) { - error = makeError( - ErrorCode.MISSING_PEER_DEPENDENCY, - `Your application tried to access ${dependencyName} (a peer dependency); this isn't allowed as there is no ancestor to satisfy the requirement. Use a devDependency if needed. - -Required package: ${dependencyName}${dependencyName !== requestForDisplay ? ` (via "${requestForDisplay}")` : ``} -Required by: ${issuerForDisplay} -`, - { request: requestForDisplay, issuer: issuerForDisplay, dependencyName } - ); - } else { - const brokenAncestors = findBrokenPeerDependencies(dependencyName, issuerLocator); - if (brokenAncestors.every((ancestor) => isDependencyTreeRoot(ancestor))) { - error = makeError( - ErrorCode.MISSING_PEER_DEPENDENCY, - `${issuerLocator.name} tried to access ${dependencyName} (a peer dependency) but it isn't provided by your application; this makes the require call ambiguous and unsound. - -Required package: ${dependencyName}${dependencyName !== requestForDisplay ? ` (via "${requestForDisplay}")` : ``} -Required by: ${issuerLocator.name}@${issuerLocator.reference} (via ${issuerForDisplay}) -${brokenAncestors.map((ancestorLocator) => `Ancestor breaking the chain: ${ancestorLocator.name}@${ancestorLocator.reference} -`).join(``)} -`, - { request: requestForDisplay, issuer: issuerForDisplay, issuerLocator: Object.assign({}, issuerLocator), dependencyName, brokenAncestors } - ); - } else { - error = makeError( - ErrorCode.MISSING_PEER_DEPENDENCY, - `${issuerLocator.name} tried to access ${dependencyName} (a peer dependency) but it isn't provided by its ancestors; this makes the require call ambiguous and unsound. - -Required package: ${dependencyName}${dependencyName !== requestForDisplay ? ` (via "${requestForDisplay}")` : ``} -Required by: ${issuerLocator.name}@${issuerLocator.reference} (via ${issuerForDisplay}) - -${brokenAncestors.map((ancestorLocator) => `Ancestor breaking the chain: ${ancestorLocator.name}@${ancestorLocator.reference} -`).join(``)} -`, - { request: requestForDisplay, issuer: issuerForDisplay, issuerLocator: Object.assign({}, issuerLocator), dependencyName, brokenAncestors } - ); - } - } - } else if (dependencyReference === void 0) { - if (!considerBuiltins && isBuiltinModule(request)) { - if (isDependencyTreeRoot(issuerLocator)) { - error = makeError( - ErrorCode.UNDECLARED_DEPENDENCY, - `Your application tried to access ${dependencyName}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${dependencyName} isn't otherwise declared in your dependencies, this makes the require call ambiguous and unsound. - -Required package: ${dependencyName}${dependencyName !== requestForDisplay ? ` (via "${requestForDisplay}")` : ``} -Required by: ${issuerForDisplay} -`, - { request: requestForDisplay, issuer: issuerForDisplay, dependencyName } - ); - } else { - error = makeError( - ErrorCode.UNDECLARED_DEPENDENCY, - `${issuerLocator.name} tried to access ${dependencyName}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${dependencyName} isn't otherwise declared in ${issuerLocator.name}'s dependencies, this makes the require call ambiguous and unsound. - -Required package: ${dependencyName}${dependencyName !== requestForDisplay ? ` (via "${requestForDisplay}")` : ``} -Required by: ${issuerForDisplay} -`, - { request: requestForDisplay, issuer: issuerForDisplay, issuerLocator: Object.assign({}, issuerLocator), dependencyName } - ); - } - } else { - if (isDependencyTreeRoot(issuerLocator)) { - error = makeError( - ErrorCode.UNDECLARED_DEPENDENCY, - `Your application tried to access ${dependencyName}, but it isn't declared in your dependencies; this makes the require call ambiguous and unsound. - -Required package: ${dependencyName}${dependencyName !== requestForDisplay ? ` (via "${requestForDisplay}")` : ``} -Required by: ${issuerForDisplay} -`, - { request: requestForDisplay, issuer: issuerForDisplay, dependencyName } - ); - } else { - error = makeError( - ErrorCode.UNDECLARED_DEPENDENCY, - `${issuerLocator.name} tried to access ${dependencyName}, but it isn't declared in its dependencies; this makes the require call ambiguous and unsound. - -Required package: ${dependencyName}${dependencyName !== requestForDisplay ? ` (via "${requestForDisplay}")` : ``} -Required by: ${issuerLocator.name}@${issuerLocator.reference} (via ${issuerForDisplay}) -`, - { request: requestForDisplay, issuer: issuerForDisplay, issuerLocator: Object.assign({}, issuerLocator), dependencyName } - ); - } - } - } - if (dependencyReference == null) { - if (fallbackReference === null || error === null) - throw error || new Error(`Assertion failed: Expected an error to have been set`); - dependencyReference = fallbackReference; - const message = error.message.replace(/\n.*/g, ``); - error.message = message; - if (!emittedWarnings.has(message) && debugLevel !== 0) { - emittedWarnings.add(message); - process.emitWarning(error); - } - } - const dependencyLocator = Array.isArray(dependencyReference) ? { name: dependencyReference[0], reference: dependencyReference[1] } : { name: dependencyName, reference: dependencyReference }; - const dependencyInformation = getPackageInformationSafe(dependencyLocator); - if (!dependencyInformation.packageLocation) { - throw makeError( - ErrorCode.MISSING_DEPENDENCY, - `A dependency seems valid but didn't get installed for some reason. This might be caused by a partial install, such as dev vs prod. - -Required package: ${dependencyLocator.name}@${dependencyLocator.reference}${dependencyLocator.name !== requestForDisplay ? ` (via "${requestForDisplay}")` : ``} -Required by: ${issuerLocator.name}@${issuerLocator.reference} (via ${issuerForDisplay}) -`, - { request: requestForDisplay, issuer: issuerForDisplay, dependencyLocator: Object.assign({}, dependencyLocator) } - ); - } - const dependencyLocation = dependencyInformation.packageLocation; - if (subPath) { - unqualifiedPath = ppath.join(dependencyLocation, subPath); - } else { - unqualifiedPath = dependencyLocation; - } - } - return ppath.normalize(unqualifiedPath); - } - function resolveUnqualifiedExport(request, unqualifiedPath, conditions = defaultExportsConditions) { - if (isStrictRegExp.test(request)) - return unqualifiedPath; - const unqualifiedExportPath = applyNodeExportsResolution(unqualifiedPath, conditions); - if (unqualifiedExportPath) { - return ppath.normalize(unqualifiedExportPath); - } else { - return unqualifiedPath; - } - } - function resolveUnqualified(unqualifiedPath, { extensions = Object.keys(require$$0.Module._extensions) } = {}) { - var _a, _b; - const candidates = []; - const qualifiedPath = applyNodeExtensionResolution(unqualifiedPath, candidates, { extensions }); - if (qualifiedPath) { - return ppath.normalize(qualifiedPath); - } else { - reportRequiredFilesToWatchMode(candidates.map((candidate) => npath.fromPortablePath(candidate))); - const unqualifiedPathForDisplay = getPathForDisplay(unqualifiedPath); - const containingPackage = findPackageLocator(unqualifiedPath); - if (containingPackage) { - const { packageLocation } = getPackageInformationSafe(containingPackage); - let exists = true; - try { - opts.fakeFs.accessSync(packageLocation); - } catch (err) { - if ((err == null ? void 0 : err.code) === `ENOENT`) { - exists = false; - } else { - const readableError = ((_b = (_a = err == null ? void 0 : err.message) != null ? _a : err) != null ? _b : `empty exception thrown`).replace(/^[A-Z]/, ($0) => $0.toLowerCase()); - throw makeError(ErrorCode.QUALIFIED_PATH_RESOLUTION_FAILED, `Required package exists but could not be accessed (${readableError}). - -Missing package: ${containingPackage.name}@${containingPackage.reference} -Expected package location: ${getPathForDisplay(packageLocation)} -`, { unqualifiedPath: unqualifiedPathForDisplay, extensions }); - } - } - if (!exists) { - const errorMessage = packageLocation.includes(`/unplugged/`) ? `Required unplugged package missing from disk. This may happen when switching branches without running installs (unplugged packages must be fully materialized on disk to work).` : `Required package missing from disk. If you keep your packages inside your repository then restarting the Node process may be enough. Otherwise, try to run an install first.`; - throw makeError( - ErrorCode.QUALIFIED_PATH_RESOLUTION_FAILED, - `${errorMessage} - -Missing package: ${containingPackage.name}@${containingPackage.reference} -Expected package location: ${getPathForDisplay(packageLocation)} -`, - { unqualifiedPath: unqualifiedPathForDisplay, extensions } - ); - } - } - throw makeError( - ErrorCode.QUALIFIED_PATH_RESOLUTION_FAILED, - `Qualified path resolution failed: we looked for the following paths, but none could be accessed. - -Source path: ${unqualifiedPathForDisplay} -${candidates.map((candidate) => `Not found: ${getPathForDisplay(candidate)} -`).join(``)}`, - { unqualifiedPath: unqualifiedPathForDisplay, extensions } - ); - } - } - function resolvePrivateRequest(request, issuer, opts2) { - var _a; - if (!issuer) - throw new Error(`Assertion failed: An issuer is required to resolve private import mappings`); - const resolved = packageImportsResolve({ - name: request, - base: url.pathToFileURL(npath.fromPortablePath(issuer)), - conditions: (_a = opts2.conditions) != null ? _a : defaultExportsConditions, - readFileSyncFn: tryReadFile - }); - if (resolved instanceof URL) { - return resolveUnqualified(npath.toPortablePath(url.fileURLToPath(resolved)), { extensions: opts2.extensions }); - } else { - if (resolved.startsWith(`#`)) - throw new Error(`Mapping from one private import to another isn't allowed`); - return resolveRequest(resolved, issuer, opts2); - } - } - function resolveRequest(request, issuer, opts2 = {}) { - try { - if (request.startsWith(`#`)) - return resolvePrivateRequest(request, issuer, opts2); - const { considerBuiltins, extensions, conditions } = opts2; - const unqualifiedPath = resolveToUnqualified(request, issuer, { considerBuiltins }); - if (request === `pnpapi`) - return unqualifiedPath; - if (unqualifiedPath === null) - return null; - const isIssuerIgnored = () => issuer !== null ? isPathIgnored(issuer) : false; - const remappedPath = (!considerBuiltins || !isBuiltinModule(request)) && !isIssuerIgnored() ? resolveUnqualifiedExport(request, unqualifiedPath, conditions) : unqualifiedPath; - return resolveUnqualified(remappedPath, { extensions }); - } catch (error) { - if (Object.prototype.hasOwnProperty.call(error, `pnpCode`)) - Object.assign(error.data, { request: getPathForDisplay(request), issuer: issuer && getPathForDisplay(issuer) }); - throw error; - } - } - function resolveVirtual(request) { - const normalized = ppath.normalize(request); - const resolved = VirtualFS.resolveVirtual(normalized); - return resolved !== normalized ? resolved : null; - } - return { - VERSIONS, - topLevel, - getLocator: (name, referencish) => { - if (Array.isArray(referencish)) { - return { name: referencish[0], reference: referencish[1] }; - } else { - return { name, reference: referencish }; - } - }, - getDependencyTreeRoots: () => { - return [...runtimeState.dependencyTreeRoots]; - }, - getAllLocators() { - const locators = []; - for (const [name, entry] of packageRegistry) - for (const reference of entry.keys()) - if (name !== null && reference !== null) - locators.push({ name, reference }); - return locators; - }, - getPackageInformation: (locator) => { - const info = getPackageInformation(locator); - if (info === null) - return null; - const packageLocation = npath.fromPortablePath(info.packageLocation); - const nativeInfo = { ...info, packageLocation }; - return nativeInfo; - }, - findPackageLocator: (path) => { - return findPackageLocator(npath.toPortablePath(path)); - }, - resolveToUnqualified: maybeLog(`resolveToUnqualified`, (request, issuer, opts2) => { - const portableIssuer = issuer !== null ? npath.toPortablePath(issuer) : null; - const resolution = resolveToUnqualified(npath.toPortablePath(request), portableIssuer, opts2); - if (resolution === null) - return null; - return npath.fromPortablePath(resolution); - }), - resolveUnqualified: maybeLog(`resolveUnqualified`, (unqualifiedPath, opts2) => { - return npath.fromPortablePath(resolveUnqualified(npath.toPortablePath(unqualifiedPath), opts2)); - }), - resolveRequest: maybeLog(`resolveRequest`, (request, issuer, opts2) => { - const portableIssuer = issuer !== null ? npath.toPortablePath(issuer) : null; - const resolution = resolveRequest(npath.toPortablePath(request), portableIssuer, opts2); - if (resolution === null) - return null; - return npath.fromPortablePath(resolution); - }), - resolveVirtual: maybeLog(`resolveVirtual`, (path) => { - const result = resolveVirtual(npath.toPortablePath(path)); - if (result !== null) { - return npath.fromPortablePath(result); - } else { - return null; - } - }) - }; -} - -function makeManager(pnpapi, opts) { - const initialApiPath = npath.toPortablePath(pnpapi.resolveToUnqualified(`pnpapi`, null)); - const initialApiStats = opts.fakeFs.statSync(npath.toPortablePath(initialApiPath)); - const apiMetadata = /* @__PURE__ */ new Map([ - [initialApiPath, { - cache: require$$0.Module._cache, - instance: pnpapi, - stats: initialApiStats, - lastRefreshCheck: Date.now() - }] - ]); - function loadApiInstance(pnpApiPath) { - const nativePath = npath.fromPortablePath(pnpApiPath); - const module = new require$$0.Module(nativePath, null); - module.load(nativePath); - return module.exports; - } - function refreshApiEntry(pnpApiPath, apiEntry) { - const timeNow = Date.now(); - if (timeNow - apiEntry.lastRefreshCheck < 500) - return; - apiEntry.lastRefreshCheck = timeNow; - const stats = opts.fakeFs.statSync(pnpApiPath); - if (stats.mtime > apiEntry.stats.mtime) { - process.emitWarning(`[Warning] The runtime detected new informations in a PnP file; reloading the API instance (${npath.fromPortablePath(pnpApiPath)})`); - apiEntry.stats = stats; - apiEntry.instance = loadApiInstance(pnpApiPath); - } - } - function getApiEntry(pnpApiPath, refresh = false) { - let apiEntry = apiMetadata.get(pnpApiPath); - if (typeof apiEntry !== `undefined`) { - if (refresh) { - refreshApiEntry(pnpApiPath, apiEntry); - } - } else { - apiMetadata.set(pnpApiPath, apiEntry = { - cache: {}, - instance: loadApiInstance(pnpApiPath), - stats: opts.fakeFs.statSync(pnpApiPath), - lastRefreshCheck: Date.now() - }); - } - return apiEntry; - } - const findApiPathCache = /* @__PURE__ */ new Map(); - function addToCacheAndReturn(start, end, target) { - if (target !== null) - target = VirtualFS.resolveVirtual(target); - let curr; - let next = start; - do { - curr = next; - findApiPathCache.set(curr, target); - next = ppath.dirname(curr); - } while (curr !== end); - return target; - } - function findApiPathFor(modulePath) { - let bestCandidate = null; - for (const [apiPath, apiEntry] of apiMetadata) { - const locator = apiEntry.instance.findPackageLocator(modulePath); - if (!locator) - continue; - if (apiMetadata.size === 1) - return apiPath; - const packageInformation = apiEntry.instance.getPackageInformation(locator); - if (!packageInformation) - throw new Error(`Assertion failed: Couldn't get package information for '${modulePath}'`); - if (!bestCandidate) - bestCandidate = { packageLocation: packageInformation.packageLocation, apiPaths: [] }; - if (packageInformation.packageLocation === bestCandidate.packageLocation) { - bestCandidate.apiPaths.push(apiPath); - } else if (packageInformation.packageLocation.length > bestCandidate.packageLocation.length) { - bestCandidate = { packageLocation: packageInformation.packageLocation, apiPaths: [apiPath] }; - } - } - if (bestCandidate) { - if (bestCandidate.apiPaths.length === 1) - return bestCandidate.apiPaths[0]; - const controlSegment = bestCandidate.apiPaths.map((apiPath) => ` ${npath.fromPortablePath(apiPath)}`).join(` -`); - throw new Error(`Unable to locate pnpapi, the module '${modulePath}' is controlled by multiple pnpapi instances. -This is usually caused by using the global cache (enableGlobalCache: true) - -Controlled by: -${controlSegment} -`); - } - const start = ppath.resolve(npath.toPortablePath(modulePath)); - let curr; - let next = start; - do { - curr = next; - const cached = findApiPathCache.get(curr); - if (cached !== void 0) - return addToCacheAndReturn(start, curr, cached); - const cjsCandidate = ppath.join(curr, Filename.pnpCjs); - if (opts.fakeFs.existsSync(cjsCandidate) && opts.fakeFs.statSync(cjsCandidate).isFile()) - return addToCacheAndReturn(start, curr, cjsCandidate); - const legacyCjsCandidate = ppath.join(curr, Filename.pnpJs); - if (opts.fakeFs.existsSync(legacyCjsCandidate) && opts.fakeFs.statSync(legacyCjsCandidate).isFile()) - return addToCacheAndReturn(start, curr, legacyCjsCandidate); - next = ppath.dirname(curr); - } while (curr !== PortablePath.root); - return addToCacheAndReturn(start, curr, null); - } - function getApiPathFromParent(parent) { - if (parent == null) - return initialApiPath; - if (typeof parent.pnpApiPath === `undefined`) { - if (parent.filename !== null) { - return parent.pnpApiPath = findApiPathFor(parent.filename); - } else { - return initialApiPath; - } - } - if (parent.pnpApiPath !== null) - return parent.pnpApiPath; - return null; - } - return { - getApiPathFromParent, - findApiPathFor, - getApiEntry - }; -} - -const localFs = { ...fs__default.default }; -const nodeFs = new NodeFS(localFs); -const defaultRuntimeState = $$SETUP_STATE(hydrateRuntimeState); -const defaultPnpapiResolution = __filename; -const defaultFsLayer = new VirtualFS({ - baseFs: new ZipOpenFS({ - baseFs: nodeFs, - libzip: () => getLibzipSync(), - maxOpenFiles: 80, - readOnlyArchives: true - }) -}); -class DynamicFS extends ProxiedFS { - constructor() { - super(ppath); - this.baseFs = defaultFsLayer; - } - mapToBase(p) { - return p; - } - mapFromBase(p) { - return p; - } -} -const dynamicFsLayer = new DynamicFS(); -let manager; -const defaultApi = Object.assign(makeApi(defaultRuntimeState, { - fakeFs: dynamicFsLayer, - pnpapiResolution: defaultPnpapiResolution -}), { - makeApi: ({ - basePath = void 0, - fakeFs = dynamicFsLayer, - pnpapiResolution = defaultPnpapiResolution, - ...rest - }) => { - const apiRuntimeState = typeof basePath !== `undefined` ? $$SETUP_STATE(hydrateRuntimeState, basePath) : defaultRuntimeState; - return makeApi(apiRuntimeState, { - fakeFs, - pnpapiResolution, - ...rest - }); - }, - setup: (api) => { - applyPatch(api || defaultApi, { - fakeFs: defaultFsLayer, - manager - }); - dynamicFsLayer.baseFs = new NodeFS(fs__default.default); - } -}); -manager = makeManager(defaultApi, { - fakeFs: dynamicFsLayer -}); -if (module.parent && module.parent.id === `internal/preload`) { - defaultApi.setup(); - if (module.filename) { - delete require$$0__default.default._cache[module.filename]; - } -} -if (process.mainModule === module) { - const reportError = (code, message, data) => { - process.stdout.write(`${JSON.stringify([{ code, message, data }, null])} -`); - }; - const reportSuccess = (resolution) => { - process.stdout.write(`${JSON.stringify([null, resolution])} -`); - }; - const processResolution = (request, issuer) => { - try { - reportSuccess(defaultApi.resolveRequest(request, issuer)); - } catch (error) { - reportError(error.code, error.message, error.data); - } - }; - const processRequest = (data) => { - try { - const [request, issuer] = JSON.parse(data); - processResolution(request, issuer); - } catch (error) { - reportError(`INVALID_JSON`, error.message, error.data); - } - }; - if (process.argv.length > 2) { - if (process.argv.length !== 4) { - process.stderr.write(`Usage: ${process.argv[0]} ${process.argv[1]} -`); - process.exitCode = 64; - } else { - processResolution(process.argv[2], process.argv[3]); - } - } else { - let buffer = ``; - const decoder = new StringDecoder__default.default.StringDecoder(); - process.stdin.on(`data`, (chunk) => { - buffer += decoder.write(chunk); - do { - const index = buffer.indexOf(` -`); - if (index === -1) - break; - const line = buffer.slice(0, index); - buffer = buffer.slice(index + 1); - processRequest(line); - } while (true); - }); - } -} - -module.exports = defaultApi; diff --git a/.pnp.loader.mjs b/.pnp.loader.mjs deleted file mode 100644 index 78226f53..00000000 --- a/.pnp.loader.mjs +++ /dev/null @@ -1,2042 +0,0 @@ -import { URL as URL$1, fileURLToPath, pathToFileURL } from 'url'; -import fs from 'fs'; -import path from 'path'; -import moduleExports, { Module } from 'module'; -import { EOL } from 'os'; -import assert from 'assert'; - -const SAFE_TIME = 456789e3; - -const PortablePath = { - root: `/`, - dot: `.`, - parent: `..` -}; -const npath = Object.create(path); -const ppath = Object.create(path.posix); -npath.cwd = () => process.cwd(); -ppath.cwd = () => toPortablePath(process.cwd()); -ppath.resolve = (...segments) => { - if (segments.length > 0 && ppath.isAbsolute(segments[0])) { - return path.posix.resolve(...segments); - } else { - return path.posix.resolve(ppath.cwd(), ...segments); - } -}; -const contains = function(pathUtils, from, to) { - from = pathUtils.normalize(from); - to = pathUtils.normalize(to); - if (from === to) - return `.`; - if (!from.endsWith(pathUtils.sep)) - from = from + pathUtils.sep; - if (to.startsWith(from)) { - return to.slice(from.length); - } else { - return null; - } -}; -npath.fromPortablePath = fromPortablePath; -npath.toPortablePath = toPortablePath; -npath.contains = (from, to) => contains(npath, from, to); -ppath.contains = (from, to) => contains(ppath, from, to); -const WINDOWS_PATH_REGEXP = /^([a-zA-Z]:.*)$/; -const UNC_WINDOWS_PATH_REGEXP = /^\/\/(\.\/)?(.*)$/; -const PORTABLE_PATH_REGEXP = /^\/([a-zA-Z]:.*)$/; -const UNC_PORTABLE_PATH_REGEXP = /^\/unc\/(\.dot\/)?(.*)$/; -function fromPortablePath(p) { - if (process.platform !== `win32`) - return p; - let portablePathMatch, uncPortablePathMatch; - if (portablePathMatch = p.match(PORTABLE_PATH_REGEXP)) - p = portablePathMatch[1]; - else if (uncPortablePathMatch = p.match(UNC_PORTABLE_PATH_REGEXP)) - p = `\\\\${uncPortablePathMatch[1] ? `.\\` : ``}${uncPortablePathMatch[2]}`; - else - return p; - return p.replace(/\//g, `\\`); -} -function toPortablePath(p) { - if (process.platform !== `win32`) - return p; - p = p.replace(/\\/g, `/`); - let windowsPathMatch, uncWindowsPathMatch; - if (windowsPathMatch = p.match(WINDOWS_PATH_REGEXP)) - p = `/${windowsPathMatch[1]}`; - else if (uncWindowsPathMatch = p.match(UNC_WINDOWS_PATH_REGEXP)) - p = `/unc/${uncWindowsPathMatch[1] ? `.dot/` : ``}${uncWindowsPathMatch[2]}`; - return p; -} -function convertPath(targetPathUtils, sourcePath) { - return targetPathUtils === npath ? fromPortablePath(sourcePath) : toPortablePath(sourcePath); -} - -const defaultTime = new Date(SAFE_TIME * 1e3); -async function copyPromise(destinationFs, destination, sourceFs, source, opts) { - const normalizedDestination = destinationFs.pathUtils.normalize(destination); - const normalizedSource = sourceFs.pathUtils.normalize(source); - const prelayout = []; - const postlayout = []; - const { atime, mtime } = opts.stableTime ? { atime: defaultTime, mtime: defaultTime } : await sourceFs.lstatPromise(normalizedSource); - await destinationFs.mkdirpPromise(destinationFs.pathUtils.dirname(destination), { utimes: [atime, mtime] }); - const updateTime = typeof destinationFs.lutimesPromise === `function` ? destinationFs.lutimesPromise.bind(destinationFs) : destinationFs.utimesPromise.bind(destinationFs); - await copyImpl(prelayout, postlayout, updateTime, destinationFs, normalizedDestination, sourceFs, normalizedSource, { ...opts, didParentExist: true }); - for (const operation of prelayout) - await operation(); - await Promise.all(postlayout.map((operation) => { - return operation(); - })); -} -async function copyImpl(prelayout, postlayout, updateTime, destinationFs, destination, sourceFs, source, opts) { - var _a, _b; - const destinationStat = opts.didParentExist ? await maybeLStat(destinationFs, destination) : null; - const sourceStat = await sourceFs.lstatPromise(source); - const { atime, mtime } = opts.stableTime ? { atime: defaultTime, mtime: defaultTime } : sourceStat; - let updated; - switch (true) { - case sourceStat.isDirectory(): - { - updated = await copyFolder(prelayout, postlayout, updateTime, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts); - } - break; - case sourceStat.isFile(): - { - updated = await copyFile(prelayout, postlayout, updateTime, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts); - } - break; - case sourceStat.isSymbolicLink(): - { - updated = await copySymlink(prelayout, postlayout, updateTime, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts); - } - break; - default: - { - throw new Error(`Unsupported file type (${sourceStat.mode})`); - } - } - if (updated || ((_a = destinationStat == null ? void 0 : destinationStat.mtime) == null ? void 0 : _a.getTime()) !== mtime.getTime() || ((_b = destinationStat == null ? void 0 : destinationStat.atime) == null ? void 0 : _b.getTime()) !== atime.getTime()) { - postlayout.push(() => updateTime(destination, atime, mtime)); - updated = true; - } - if (destinationStat === null || (destinationStat.mode & 511) !== (sourceStat.mode & 511)) { - postlayout.push(() => destinationFs.chmodPromise(destination, sourceStat.mode & 511)); - updated = true; - } - return updated; -} -async function maybeLStat(baseFs, p) { - try { - return await baseFs.lstatPromise(p); - } catch (e) { - return null; - } -} -async function copyFolder(prelayout, postlayout, updateTime, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts) { - if (destinationStat !== null && !destinationStat.isDirectory()) { - if (opts.overwrite) { - prelayout.push(async () => destinationFs.removePromise(destination)); - destinationStat = null; - } else { - return false; - } - } - let updated = false; - if (destinationStat === null) { - prelayout.push(async () => { - try { - await destinationFs.mkdirPromise(destination, { mode: sourceStat.mode }); - } catch (err) { - if (err.code !== `EEXIST`) { - throw err; - } - } - }); - updated = true; - } - const entries = await sourceFs.readdirPromise(source); - const nextOpts = opts.didParentExist && !destinationStat ? { ...opts, didParentExist: false } : opts; - if (opts.stableSort) { - for (const entry of entries.sort()) { - if (await copyImpl(prelayout, postlayout, updateTime, destinationFs, destinationFs.pathUtils.join(destination, entry), sourceFs, sourceFs.pathUtils.join(source, entry), nextOpts)) { - updated = true; - } - } - } else { - const entriesUpdateStatus = await Promise.all(entries.map(async (entry) => { - await copyImpl(prelayout, postlayout, updateTime, destinationFs, destinationFs.pathUtils.join(destination, entry), sourceFs, sourceFs.pathUtils.join(source, entry), nextOpts); - })); - if (entriesUpdateStatus.some((status) => status)) { - updated = true; - } - } - return updated; -} -const isCloneSupportedCache = /* @__PURE__ */ new WeakMap(); -function makeLinkOperation(opFs, destination, source, sourceStat, linkStrategy) { - return async () => { - await opFs.linkPromise(source, destination); - if (linkStrategy === "readOnly" /* ReadOnly */) { - sourceStat.mode &= ~146; - await opFs.chmodPromise(destination, sourceStat.mode); - } - }; -} -function makeCloneLinkOperation(opFs, destination, source, sourceStat, linkStrategy) { - const isCloneSupported = isCloneSupportedCache.get(opFs); - if (typeof isCloneSupported === `undefined`) { - return async () => { - try { - await opFs.copyFilePromise(source, destination, fs.constants.COPYFILE_FICLONE_FORCE); - isCloneSupportedCache.set(opFs, true); - } catch (err) { - if (err.code === `ENOSYS` || err.code === `ENOTSUP`) { - isCloneSupportedCache.set(opFs, false); - await makeLinkOperation(opFs, destination, source, sourceStat, linkStrategy)(); - } else { - throw err; - } - } - }; - } else { - if (isCloneSupported) { - return async () => opFs.copyFilePromise(source, destination, fs.constants.COPYFILE_FICLONE_FORCE); - } else { - return makeLinkOperation(opFs, destination, source, sourceStat, linkStrategy); - } - } -} -async function copyFile(prelayout, postlayout, updateTime, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts) { - var _a; - if (destinationStat !== null) { - if (opts.overwrite) { - prelayout.push(async () => destinationFs.removePromise(destination)); - destinationStat = null; - } else { - return false; - } - } - const linkStrategy = (_a = opts.linkStrategy) != null ? _a : null; - const op = destinationFs === sourceFs ? linkStrategy !== null ? makeCloneLinkOperation(destinationFs, destination, source, sourceStat, linkStrategy) : async () => destinationFs.copyFilePromise(source, destination, fs.constants.COPYFILE_FICLONE) : linkStrategy !== null ? makeLinkOperation(destinationFs, destination, source, sourceStat, linkStrategy) : async () => destinationFs.writeFilePromise(destination, await sourceFs.readFilePromise(source)); - prelayout.push(async () => op()); - return true; -} -async function copySymlink(prelayout, postlayout, updateTime, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts) { - if (destinationStat !== null) { - if (opts.overwrite) { - prelayout.push(async () => destinationFs.removePromise(destination)); - destinationStat = null; - } else { - return false; - } - } - prelayout.push(async () => { - await destinationFs.symlinkPromise(convertPath(destinationFs.pathUtils, await sourceFs.readlinkPromise(source)), destination); - }); - return true; -} - -function makeError(code, message) { - return Object.assign(new Error(`${code}: ${message}`), { code }); -} -function ENOSYS(message, reason) { - return makeError(`ENOSYS`, `${message}, ${reason}`); -} - -class FakeFS { - constructor(pathUtils) { - this.pathUtils = pathUtils; - } - async *genTraversePromise(init, { stableSort = false } = {}) { - const stack = [init]; - while (stack.length > 0) { - const p = stack.shift(); - const entry = await this.lstatPromise(p); - if (entry.isDirectory()) { - const entries = await this.readdirPromise(p); - if (stableSort) { - for (const entry2 of entries.sort()) { - stack.push(this.pathUtils.join(p, entry2)); - } - } else { - throw new Error(`Not supported`); - } - } else { - yield p; - } - } - } - async removePromise(p, { recursive = true, maxRetries = 5 } = {}) { - let stat; - try { - stat = await this.lstatPromise(p); - } catch (error) { - if (error.code === `ENOENT`) { - return; - } else { - throw error; - } - } - if (stat.isDirectory()) { - if (recursive) { - const entries = await this.readdirPromise(p); - await Promise.all(entries.map((entry) => { - return this.removePromise(this.pathUtils.resolve(p, entry)); - })); - } - for (let t = 0; t <= maxRetries; t++) { - try { - await this.rmdirPromise(p); - break; - } catch (error) { - if (error.code !== `EBUSY` && error.code !== `ENOTEMPTY`) { - throw error; - } else if (t < maxRetries) { - await new Promise((resolve) => setTimeout(resolve, t * 100)); - } - } - } - } else { - await this.unlinkPromise(p); - } - } - removeSync(p, { recursive = true } = {}) { - let stat; - try { - stat = this.lstatSync(p); - } catch (error) { - if (error.code === `ENOENT`) { - return; - } else { - throw error; - } - } - if (stat.isDirectory()) { - if (recursive) - for (const entry of this.readdirSync(p)) - this.removeSync(this.pathUtils.resolve(p, entry)); - this.rmdirSync(p); - } else { - this.unlinkSync(p); - } - } - async mkdirpPromise(p, { chmod, utimes } = {}) { - p = this.resolve(p); - if (p === this.pathUtils.dirname(p)) - return void 0; - const parts = p.split(this.pathUtils.sep); - let createdDirectory; - for (let u = 2; u <= parts.length; ++u) { - const subPath = parts.slice(0, u).join(this.pathUtils.sep); - if (!this.existsSync(subPath)) { - try { - await this.mkdirPromise(subPath); - } catch (error) { - if (error.code === `EEXIST`) { - continue; - } else { - throw error; - } - } - createdDirectory != null ? createdDirectory : createdDirectory = subPath; - if (chmod != null) - await this.chmodPromise(subPath, chmod); - if (utimes != null) { - await this.utimesPromise(subPath, utimes[0], utimes[1]); - } else { - const parentStat = await this.statPromise(this.pathUtils.dirname(subPath)); - await this.utimesPromise(subPath, parentStat.atime, parentStat.mtime); - } - } - } - return createdDirectory; - } - mkdirpSync(p, { chmod, utimes } = {}) { - p = this.resolve(p); - if (p === this.pathUtils.dirname(p)) - return void 0; - const parts = p.split(this.pathUtils.sep); - let createdDirectory; - for (let u = 2; u <= parts.length; ++u) { - const subPath = parts.slice(0, u).join(this.pathUtils.sep); - if (!this.existsSync(subPath)) { - try { - this.mkdirSync(subPath); - } catch (error) { - if (error.code === `EEXIST`) { - continue; - } else { - throw error; - } - } - createdDirectory != null ? createdDirectory : createdDirectory = subPath; - if (chmod != null) - this.chmodSync(subPath, chmod); - if (utimes != null) { - this.utimesSync(subPath, utimes[0], utimes[1]); - } else { - const parentStat = this.statSync(this.pathUtils.dirname(subPath)); - this.utimesSync(subPath, parentStat.atime, parentStat.mtime); - } - } - } - return createdDirectory; - } - async copyPromise(destination, source, { baseFs = this, overwrite = true, stableSort = false, stableTime = false, linkStrategy = null } = {}) { - return await copyPromise(this, destination, baseFs, source, { overwrite, stableSort, stableTime, linkStrategy }); - } - copySync(destination, source, { baseFs = this, overwrite = true } = {}) { - const stat = baseFs.lstatSync(source); - const exists = this.existsSync(destination); - if (stat.isDirectory()) { - this.mkdirpSync(destination); - const directoryListing = baseFs.readdirSync(source); - for (const entry of directoryListing) { - this.copySync(this.pathUtils.join(destination, entry), baseFs.pathUtils.join(source, entry), { baseFs, overwrite }); - } - } else if (stat.isFile()) { - if (!exists || overwrite) { - if (exists) - this.removeSync(destination); - const content = baseFs.readFileSync(source); - this.writeFileSync(destination, content); - } - } else if (stat.isSymbolicLink()) { - if (!exists || overwrite) { - if (exists) - this.removeSync(destination); - const target = baseFs.readlinkSync(source); - this.symlinkSync(convertPath(this.pathUtils, target), destination); - } - } else { - throw new Error(`Unsupported file type (file: ${source}, mode: 0o${stat.mode.toString(8).padStart(6, `0`)})`); - } - const mode = stat.mode & 511; - this.chmodSync(destination, mode); - } - async changeFilePromise(p, content, opts = {}) { - if (Buffer.isBuffer(content)) { - return this.changeFileBufferPromise(p, content, opts); - } else { - return this.changeFileTextPromise(p, content, opts); - } - } - async changeFileBufferPromise(p, content, { mode } = {}) { - let current = Buffer.alloc(0); - try { - current = await this.readFilePromise(p); - } catch (error) { - } - if (Buffer.compare(current, content) === 0) - return; - await this.writeFilePromise(p, content, { mode }); - } - async changeFileTextPromise(p, content, { automaticNewlines, mode } = {}) { - let current = ``; - try { - current = await this.readFilePromise(p, `utf8`); - } catch (error) { - } - const normalizedContent = automaticNewlines ? normalizeLineEndings(current, content) : content; - if (current === normalizedContent) - return; - await this.writeFilePromise(p, normalizedContent, { mode }); - } - changeFileSync(p, content, opts = {}) { - if (Buffer.isBuffer(content)) { - return this.changeFileBufferSync(p, content, opts); - } else { - return this.changeFileTextSync(p, content, opts); - } - } - changeFileBufferSync(p, content, { mode } = {}) { - let current = Buffer.alloc(0); - try { - current = this.readFileSync(p); - } catch (error) { - } - if (Buffer.compare(current, content) === 0) - return; - this.writeFileSync(p, content, { mode }); - } - changeFileTextSync(p, content, { automaticNewlines = false, mode } = {}) { - let current = ``; - try { - current = this.readFileSync(p, `utf8`); - } catch (error) { - } - const normalizedContent = automaticNewlines ? normalizeLineEndings(current, content) : content; - if (current === normalizedContent) - return; - this.writeFileSync(p, normalizedContent, { mode }); - } - async movePromise(fromP, toP) { - try { - await this.renamePromise(fromP, toP); - } catch (error) { - if (error.code === `EXDEV`) { - await this.copyPromise(toP, fromP); - await this.removePromise(fromP); - } else { - throw error; - } - } - } - moveSync(fromP, toP) { - try { - this.renameSync(fromP, toP); - } catch (error) { - if (error.code === `EXDEV`) { - this.copySync(toP, fromP); - this.removeSync(fromP); - } else { - throw error; - } - } - } - async lockPromise(affectedPath, callback) { - const lockPath = `${affectedPath}.flock`; - const interval = 1e3 / 60; - const startTime = Date.now(); - let fd = null; - const isAlive = async () => { - let pid; - try { - [pid] = await this.readJsonPromise(lockPath); - } catch (error) { - return Date.now() - startTime < 500; - } - try { - process.kill(pid, 0); - return true; - } catch (error) { - return false; - } - }; - while (fd === null) { - try { - fd = await this.openPromise(lockPath, `wx`); - } catch (error) { - if (error.code === `EEXIST`) { - if (!await isAlive()) { - try { - await this.unlinkPromise(lockPath); - continue; - } catch (error2) { - } - } - if (Date.now() - startTime < 60 * 1e3) { - await new Promise((resolve) => setTimeout(resolve, interval)); - } else { - throw new Error(`Couldn't acquire a lock in a reasonable time (via ${lockPath})`); - } - } else { - throw error; - } - } - } - await this.writePromise(fd, JSON.stringify([process.pid])); - try { - return await callback(); - } finally { - try { - await this.closePromise(fd); - await this.unlinkPromise(lockPath); - } catch (error) { - } - } - } - async readJsonPromise(p) { - const content = await this.readFilePromise(p, `utf8`); - try { - return JSON.parse(content); - } catch (error) { - error.message += ` (in ${p})`; - throw error; - } - } - readJsonSync(p) { - const content = this.readFileSync(p, `utf8`); - try { - return JSON.parse(content); - } catch (error) { - error.message += ` (in ${p})`; - throw error; - } - } - async writeJsonPromise(p, data) { - return await this.writeFilePromise(p, `${JSON.stringify(data, null, 2)} -`); - } - writeJsonSync(p, data) { - return this.writeFileSync(p, `${JSON.stringify(data, null, 2)} -`); - } - async preserveTimePromise(p, cb) { - const stat = await this.lstatPromise(p); - const result = await cb(); - if (typeof result !== `undefined`) - p = result; - if (this.lutimesPromise) { - await this.lutimesPromise(p, stat.atime, stat.mtime); - } else if (!stat.isSymbolicLink()) { - await this.utimesPromise(p, stat.atime, stat.mtime); - } - } - async preserveTimeSync(p, cb) { - const stat = this.lstatSync(p); - const result = cb(); - if (typeof result !== `undefined`) - p = result; - if (this.lutimesSync) { - this.lutimesSync(p, stat.atime, stat.mtime); - } else if (!stat.isSymbolicLink()) { - this.utimesSync(p, stat.atime, stat.mtime); - } - } -} -class BasePortableFakeFS extends FakeFS { - constructor() { - super(ppath); - } -} -function getEndOfLine(content) { - const matches = content.match(/\r?\n/g); - if (matches === null) - return EOL; - const crlf = matches.filter((nl) => nl === `\r -`).length; - const lf = matches.length - crlf; - return crlf > lf ? `\r -` : ` -`; -} -function normalizeLineEndings(originalContent, newContent) { - return newContent.replace(/\r?\n/g, getEndOfLine(originalContent)); -} - -class NodeFS extends BasePortableFakeFS { - constructor(realFs = fs) { - super(); - this.realFs = realFs; - if (typeof this.realFs.lutimes !== `undefined`) { - this.lutimesPromise = this.lutimesPromiseImpl; - this.lutimesSync = this.lutimesSyncImpl; - } - } - getExtractHint() { - return false; - } - getRealPath() { - return PortablePath.root; - } - resolve(p) { - return ppath.resolve(p); - } - async openPromise(p, flags, mode) { - return await new Promise((resolve, reject) => { - this.realFs.open(npath.fromPortablePath(p), flags, mode, this.makeCallback(resolve, reject)); - }); - } - openSync(p, flags, mode) { - return this.realFs.openSync(npath.fromPortablePath(p), flags, mode); - } - async opendirPromise(p, opts) { - return await new Promise((resolve, reject) => { - if (typeof opts !== `undefined`) { - this.realFs.opendir(npath.fromPortablePath(p), opts, this.makeCallback(resolve, reject)); - } else { - this.realFs.opendir(npath.fromPortablePath(p), this.makeCallback(resolve, reject)); - } - }).then((dir) => { - return Object.defineProperty(dir, `path`, { value: p, configurable: true, writable: true }); - }); - } - opendirSync(p, opts) { - const dir = typeof opts !== `undefined` ? this.realFs.opendirSync(npath.fromPortablePath(p), opts) : this.realFs.opendirSync(npath.fromPortablePath(p)); - return Object.defineProperty(dir, `path`, { value: p, configurable: true, writable: true }); - } - async readPromise(fd, buffer, offset = 0, length = 0, position = -1) { - return await new Promise((resolve, reject) => { - this.realFs.read(fd, buffer, offset, length, position, (error, bytesRead) => { - if (error) { - reject(error); - } else { - resolve(bytesRead); - } - }); - }); - } - readSync(fd, buffer, offset, length, position) { - return this.realFs.readSync(fd, buffer, offset, length, position); - } - async writePromise(fd, buffer, offset, length, position) { - return await new Promise((resolve, reject) => { - if (typeof buffer === `string`) { - return this.realFs.write(fd, buffer, offset, this.makeCallback(resolve, reject)); - } else { - return this.realFs.write(fd, buffer, offset, length, position, this.makeCallback(resolve, reject)); - } - }); - } - writeSync(fd, buffer, offset, length, position) { - if (typeof buffer === `string`) { - return this.realFs.writeSync(fd, buffer, offset); - } else { - return this.realFs.writeSync(fd, buffer, offset, length, position); - } - } - async closePromise(fd) { - await new Promise((resolve, reject) => { - this.realFs.close(fd, this.makeCallback(resolve, reject)); - }); - } - closeSync(fd) { - this.realFs.closeSync(fd); - } - createReadStream(p, opts) { - const realPath = p !== null ? npath.fromPortablePath(p) : p; - return this.realFs.createReadStream(realPath, opts); - } - createWriteStream(p, opts) { - const realPath = p !== null ? npath.fromPortablePath(p) : p; - return this.realFs.createWriteStream(realPath, opts); - } - async realpathPromise(p) { - return await new Promise((resolve, reject) => { - this.realFs.realpath(npath.fromPortablePath(p), {}, this.makeCallback(resolve, reject)); - }).then((path) => { - return npath.toPortablePath(path); - }); - } - realpathSync(p) { - return npath.toPortablePath(this.realFs.realpathSync(npath.fromPortablePath(p), {})); - } - async existsPromise(p) { - return await new Promise((resolve) => { - this.realFs.exists(npath.fromPortablePath(p), resolve); - }); - } - accessSync(p, mode) { - return this.realFs.accessSync(npath.fromPortablePath(p), mode); - } - async accessPromise(p, mode) { - return await new Promise((resolve, reject) => { - this.realFs.access(npath.fromPortablePath(p), mode, this.makeCallback(resolve, reject)); - }); - } - existsSync(p) { - return this.realFs.existsSync(npath.fromPortablePath(p)); - } - async statPromise(p, opts) { - return await new Promise((resolve, reject) => { - if (opts) { - this.realFs.stat(npath.fromPortablePath(p), opts, this.makeCallback(resolve, reject)); - } else { - this.realFs.stat(npath.fromPortablePath(p), this.makeCallback(resolve, reject)); - } - }); - } - statSync(p, opts) { - if (opts) { - return this.realFs.statSync(npath.fromPortablePath(p), opts); - } else { - return this.realFs.statSync(npath.fromPortablePath(p)); - } - } - async fstatPromise(fd, opts) { - return await new Promise((resolve, reject) => { - if (opts) { - this.realFs.fstat(fd, opts, this.makeCallback(resolve, reject)); - } else { - this.realFs.fstat(fd, this.makeCallback(resolve, reject)); - } - }); - } - fstatSync(fd, opts) { - if (opts) { - return this.realFs.fstatSync(fd, opts); - } else { - return this.realFs.fstatSync(fd); - } - } - async lstatPromise(p, opts) { - return await new Promise((resolve, reject) => { - if (opts) { - this.realFs.lstat(npath.fromPortablePath(p), opts, this.makeCallback(resolve, reject)); - } else { - this.realFs.lstat(npath.fromPortablePath(p), this.makeCallback(resolve, reject)); - } - }); - } - lstatSync(p, opts) { - if (opts) { - return this.realFs.lstatSync(npath.fromPortablePath(p), opts); - } else { - return this.realFs.lstatSync(npath.fromPortablePath(p)); - } - } - async fchmodPromise(fd, mask) { - return await new Promise((resolve, reject) => { - this.realFs.fchmod(fd, mask, this.makeCallback(resolve, reject)); - }); - } - fchmodSync(fd, mask) { - return this.realFs.fchmodSync(fd, mask); - } - async chmodPromise(p, mask) { - return await new Promise((resolve, reject) => { - this.realFs.chmod(npath.fromPortablePath(p), mask, this.makeCallback(resolve, reject)); - }); - } - chmodSync(p, mask) { - return this.realFs.chmodSync(npath.fromPortablePath(p), mask); - } - async fchownPromise(fd, uid, gid) { - return await new Promise((resolve, reject) => { - this.realFs.fchown(fd, uid, gid, this.makeCallback(resolve, reject)); - }); - } - fchownSync(fd, uid, gid) { - return this.realFs.fchownSync(fd, uid, gid); - } - async chownPromise(p, uid, gid) { - return await new Promise((resolve, reject) => { - this.realFs.chown(npath.fromPortablePath(p), uid, gid, this.makeCallback(resolve, reject)); - }); - } - chownSync(p, uid, gid) { - return this.realFs.chownSync(npath.fromPortablePath(p), uid, gid); - } - async renamePromise(oldP, newP) { - return await new Promise((resolve, reject) => { - this.realFs.rename(npath.fromPortablePath(oldP), npath.fromPortablePath(newP), this.makeCallback(resolve, reject)); - }); - } - renameSync(oldP, newP) { - return this.realFs.renameSync(npath.fromPortablePath(oldP), npath.fromPortablePath(newP)); - } - async copyFilePromise(sourceP, destP, flags = 0) { - return await new Promise((resolve, reject) => { - this.realFs.copyFile(npath.fromPortablePath(sourceP), npath.fromPortablePath(destP), flags, this.makeCallback(resolve, reject)); - }); - } - copyFileSync(sourceP, destP, flags = 0) { - return this.realFs.copyFileSync(npath.fromPortablePath(sourceP), npath.fromPortablePath(destP), flags); - } - async appendFilePromise(p, content, opts) { - return await new Promise((resolve, reject) => { - const fsNativePath = typeof p === `string` ? npath.fromPortablePath(p) : p; - if (opts) { - this.realFs.appendFile(fsNativePath, content, opts, this.makeCallback(resolve, reject)); - } else { - this.realFs.appendFile(fsNativePath, content, this.makeCallback(resolve, reject)); - } - }); - } - appendFileSync(p, content, opts) { - const fsNativePath = typeof p === `string` ? npath.fromPortablePath(p) : p; - if (opts) { - this.realFs.appendFileSync(fsNativePath, content, opts); - } else { - this.realFs.appendFileSync(fsNativePath, content); - } - } - async writeFilePromise(p, content, opts) { - return await new Promise((resolve, reject) => { - const fsNativePath = typeof p === `string` ? npath.fromPortablePath(p) : p; - if (opts) { - this.realFs.writeFile(fsNativePath, content, opts, this.makeCallback(resolve, reject)); - } else { - this.realFs.writeFile(fsNativePath, content, this.makeCallback(resolve, reject)); - } - }); - } - writeFileSync(p, content, opts) { - const fsNativePath = typeof p === `string` ? npath.fromPortablePath(p) : p; - if (opts) { - this.realFs.writeFileSync(fsNativePath, content, opts); - } else { - this.realFs.writeFileSync(fsNativePath, content); - } - } - async unlinkPromise(p) { - return await new Promise((resolve, reject) => { - this.realFs.unlink(npath.fromPortablePath(p), this.makeCallback(resolve, reject)); - }); - } - unlinkSync(p) { - return this.realFs.unlinkSync(npath.fromPortablePath(p)); - } - async utimesPromise(p, atime, mtime) { - return await new Promise((resolve, reject) => { - this.realFs.utimes(npath.fromPortablePath(p), atime, mtime, this.makeCallback(resolve, reject)); - }); - } - utimesSync(p, atime, mtime) { - this.realFs.utimesSync(npath.fromPortablePath(p), atime, mtime); - } - async lutimesPromiseImpl(p, atime, mtime) { - const lutimes = this.realFs.lutimes; - if (typeof lutimes === `undefined`) - throw ENOSYS(`unavailable Node binding`, `lutimes '${p}'`); - return await new Promise((resolve, reject) => { - lutimes.call(this.realFs, npath.fromPortablePath(p), atime, mtime, this.makeCallback(resolve, reject)); - }); - } - lutimesSyncImpl(p, atime, mtime) { - const lutimesSync = this.realFs.lutimesSync; - if (typeof lutimesSync === `undefined`) - throw ENOSYS(`unavailable Node binding`, `lutimes '${p}'`); - lutimesSync.call(this.realFs, npath.fromPortablePath(p), atime, mtime); - } - async mkdirPromise(p, opts) { - return await new Promise((resolve, reject) => { - this.realFs.mkdir(npath.fromPortablePath(p), opts, this.makeCallback(resolve, reject)); - }); - } - mkdirSync(p, opts) { - return this.realFs.mkdirSync(npath.fromPortablePath(p), opts); - } - async rmdirPromise(p, opts) { - return await new Promise((resolve, reject) => { - if (opts) { - this.realFs.rmdir(npath.fromPortablePath(p), opts, this.makeCallback(resolve, reject)); - } else { - this.realFs.rmdir(npath.fromPortablePath(p), this.makeCallback(resolve, reject)); - } - }); - } - rmdirSync(p, opts) { - return this.realFs.rmdirSync(npath.fromPortablePath(p), opts); - } - async linkPromise(existingP, newP) { - return await new Promise((resolve, reject) => { - this.realFs.link(npath.fromPortablePath(existingP), npath.fromPortablePath(newP), this.makeCallback(resolve, reject)); - }); - } - linkSync(existingP, newP) { - return this.realFs.linkSync(npath.fromPortablePath(existingP), npath.fromPortablePath(newP)); - } - async symlinkPromise(target, p, type) { - return await new Promise((resolve, reject) => { - this.realFs.symlink(npath.fromPortablePath(target.replace(/\/+$/, ``)), npath.fromPortablePath(p), type, this.makeCallback(resolve, reject)); - }); - } - symlinkSync(target, p, type) { - return this.realFs.symlinkSync(npath.fromPortablePath(target.replace(/\/+$/, ``)), npath.fromPortablePath(p), type); - } - async readFilePromise(p, encoding) { - return await new Promise((resolve, reject) => { - const fsNativePath = typeof p === `string` ? npath.fromPortablePath(p) : p; - this.realFs.readFile(fsNativePath, encoding, this.makeCallback(resolve, reject)); - }); - } - readFileSync(p, encoding) { - const fsNativePath = typeof p === `string` ? npath.fromPortablePath(p) : p; - return this.realFs.readFileSync(fsNativePath, encoding); - } - async readdirPromise(p, opts) { - return await new Promise((resolve, reject) => { - if (opts == null ? void 0 : opts.withFileTypes) { - this.realFs.readdir(npath.fromPortablePath(p), { withFileTypes: true }, this.makeCallback(resolve, reject)); - } else { - this.realFs.readdir(npath.fromPortablePath(p), this.makeCallback((value) => resolve(value), reject)); - } - }); - } - readdirSync(p, opts) { - if (opts == null ? void 0 : opts.withFileTypes) { - return this.realFs.readdirSync(npath.fromPortablePath(p), { withFileTypes: true }); - } else { - return this.realFs.readdirSync(npath.fromPortablePath(p)); - } - } - async readlinkPromise(p) { - return await new Promise((resolve, reject) => { - this.realFs.readlink(npath.fromPortablePath(p), this.makeCallback(resolve, reject)); - }).then((path) => { - return npath.toPortablePath(path); - }); - } - readlinkSync(p) { - return npath.toPortablePath(this.realFs.readlinkSync(npath.fromPortablePath(p))); - } - async truncatePromise(p, len) { - return await new Promise((resolve, reject) => { - this.realFs.truncate(npath.fromPortablePath(p), len, this.makeCallback(resolve, reject)); - }); - } - truncateSync(p, len) { - return this.realFs.truncateSync(npath.fromPortablePath(p), len); - } - async ftruncatePromise(fd, len) { - return await new Promise((resolve, reject) => { - this.realFs.ftruncate(fd, len, this.makeCallback(resolve, reject)); - }); - } - ftruncateSync(fd, len) { - return this.realFs.ftruncateSync(fd, len); - } - watch(p, a, b) { - return this.realFs.watch( - npath.fromPortablePath(p), - a, - b - ); - } - watchFile(p, a, b) { - return this.realFs.watchFile( - npath.fromPortablePath(p), - a, - b - ); - } - unwatchFile(p, cb) { - return this.realFs.unwatchFile(npath.fromPortablePath(p), cb); - } - makeCallback(resolve, reject) { - return (err, result) => { - if (err) { - reject(err); - } else { - resolve(result); - } - }; - } -} - -class ProxiedFS extends FakeFS { - getExtractHint(hints) { - return this.baseFs.getExtractHint(hints); - } - resolve(path) { - return this.mapFromBase(this.baseFs.resolve(this.mapToBase(path))); - } - getRealPath() { - return this.mapFromBase(this.baseFs.getRealPath()); - } - async openPromise(p, flags, mode) { - return this.baseFs.openPromise(this.mapToBase(p), flags, mode); - } - openSync(p, flags, mode) { - return this.baseFs.openSync(this.mapToBase(p), flags, mode); - } - async opendirPromise(p, opts) { - return Object.assign(await this.baseFs.opendirPromise(this.mapToBase(p), opts), { path: p }); - } - opendirSync(p, opts) { - return Object.assign(this.baseFs.opendirSync(this.mapToBase(p), opts), { path: p }); - } - async readPromise(fd, buffer, offset, length, position) { - return await this.baseFs.readPromise(fd, buffer, offset, length, position); - } - readSync(fd, buffer, offset, length, position) { - return this.baseFs.readSync(fd, buffer, offset, length, position); - } - async writePromise(fd, buffer, offset, length, position) { - if (typeof buffer === `string`) { - return await this.baseFs.writePromise(fd, buffer, offset); - } else { - return await this.baseFs.writePromise(fd, buffer, offset, length, position); - } - } - writeSync(fd, buffer, offset, length, position) { - if (typeof buffer === `string`) { - return this.baseFs.writeSync(fd, buffer, offset); - } else { - return this.baseFs.writeSync(fd, buffer, offset, length, position); - } - } - async closePromise(fd) { - return this.baseFs.closePromise(fd); - } - closeSync(fd) { - this.baseFs.closeSync(fd); - } - createReadStream(p, opts) { - return this.baseFs.createReadStream(p !== null ? this.mapToBase(p) : p, opts); - } - createWriteStream(p, opts) { - return this.baseFs.createWriteStream(p !== null ? this.mapToBase(p) : p, opts); - } - async realpathPromise(p) { - return this.mapFromBase(await this.baseFs.realpathPromise(this.mapToBase(p))); - } - realpathSync(p) { - return this.mapFromBase(this.baseFs.realpathSync(this.mapToBase(p))); - } - async existsPromise(p) { - return this.baseFs.existsPromise(this.mapToBase(p)); - } - existsSync(p) { - return this.baseFs.existsSync(this.mapToBase(p)); - } - accessSync(p, mode) { - return this.baseFs.accessSync(this.mapToBase(p), mode); - } - async accessPromise(p, mode) { - return this.baseFs.accessPromise(this.mapToBase(p), mode); - } - async statPromise(p, opts) { - return this.baseFs.statPromise(this.mapToBase(p), opts); - } - statSync(p, opts) { - return this.baseFs.statSync(this.mapToBase(p), opts); - } - async fstatPromise(fd, opts) { - return this.baseFs.fstatPromise(fd, opts); - } - fstatSync(fd, opts) { - return this.baseFs.fstatSync(fd, opts); - } - lstatPromise(p, opts) { - return this.baseFs.lstatPromise(this.mapToBase(p), opts); - } - lstatSync(p, opts) { - return this.baseFs.lstatSync(this.mapToBase(p), opts); - } - async fchmodPromise(fd, mask) { - return this.baseFs.fchmodPromise(fd, mask); - } - fchmodSync(fd, mask) { - return this.baseFs.fchmodSync(fd, mask); - } - async chmodPromise(p, mask) { - return this.baseFs.chmodPromise(this.mapToBase(p), mask); - } - chmodSync(p, mask) { - return this.baseFs.chmodSync(this.mapToBase(p), mask); - } - async fchownPromise(fd, uid, gid) { - return this.baseFs.fchownPromise(fd, uid, gid); - } - fchownSync(fd, uid, gid) { - return this.baseFs.fchownSync(fd, uid, gid); - } - async chownPromise(p, uid, gid) { - return this.baseFs.chownPromise(this.mapToBase(p), uid, gid); - } - chownSync(p, uid, gid) { - return this.baseFs.chownSync(this.mapToBase(p), uid, gid); - } - async renamePromise(oldP, newP) { - return this.baseFs.renamePromise(this.mapToBase(oldP), this.mapToBase(newP)); - } - renameSync(oldP, newP) { - return this.baseFs.renameSync(this.mapToBase(oldP), this.mapToBase(newP)); - } - async copyFilePromise(sourceP, destP, flags = 0) { - return this.baseFs.copyFilePromise(this.mapToBase(sourceP), this.mapToBase(destP), flags); - } - copyFileSync(sourceP, destP, flags = 0) { - return this.baseFs.copyFileSync(this.mapToBase(sourceP), this.mapToBase(destP), flags); - } - async appendFilePromise(p, content, opts) { - return this.baseFs.appendFilePromise(this.fsMapToBase(p), content, opts); - } - appendFileSync(p, content, opts) { - return this.baseFs.appendFileSync(this.fsMapToBase(p), content, opts); - } - async writeFilePromise(p, content, opts) { - return this.baseFs.writeFilePromise(this.fsMapToBase(p), content, opts); - } - writeFileSync(p, content, opts) { - return this.baseFs.writeFileSync(this.fsMapToBase(p), content, opts); - } - async unlinkPromise(p) { - return this.baseFs.unlinkPromise(this.mapToBase(p)); - } - unlinkSync(p) { - return this.baseFs.unlinkSync(this.mapToBase(p)); - } - async utimesPromise(p, atime, mtime) { - return this.baseFs.utimesPromise(this.mapToBase(p), atime, mtime); - } - utimesSync(p, atime, mtime) { - return this.baseFs.utimesSync(this.mapToBase(p), atime, mtime); - } - async mkdirPromise(p, opts) { - return this.baseFs.mkdirPromise(this.mapToBase(p), opts); - } - mkdirSync(p, opts) { - return this.baseFs.mkdirSync(this.mapToBase(p), opts); - } - async rmdirPromise(p, opts) { - return this.baseFs.rmdirPromise(this.mapToBase(p), opts); - } - rmdirSync(p, opts) { - return this.baseFs.rmdirSync(this.mapToBase(p), opts); - } - async linkPromise(existingP, newP) { - return this.baseFs.linkPromise(this.mapToBase(existingP), this.mapToBase(newP)); - } - linkSync(existingP, newP) { - return this.baseFs.linkSync(this.mapToBase(existingP), this.mapToBase(newP)); - } - async symlinkPromise(target, p, type) { - const mappedP = this.mapToBase(p); - if (this.pathUtils.isAbsolute(target)) - return this.baseFs.symlinkPromise(this.mapToBase(target), mappedP, type); - const mappedAbsoluteTarget = this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(p), target)); - const mappedTarget = this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(mappedP), mappedAbsoluteTarget); - return this.baseFs.symlinkPromise(mappedTarget, mappedP, type); - } - symlinkSync(target, p, type) { - const mappedP = this.mapToBase(p); - if (this.pathUtils.isAbsolute(target)) - return this.baseFs.symlinkSync(this.mapToBase(target), mappedP, type); - const mappedAbsoluteTarget = this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(p), target)); - const mappedTarget = this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(mappedP), mappedAbsoluteTarget); - return this.baseFs.symlinkSync(mappedTarget, mappedP, type); - } - async readFilePromise(p, encoding) { - if (encoding === `utf8`) { - return this.baseFs.readFilePromise(this.fsMapToBase(p), encoding); - } else { - return this.baseFs.readFilePromise(this.fsMapToBase(p), encoding); - } - } - readFileSync(p, encoding) { - if (encoding === `utf8`) { - return this.baseFs.readFileSync(this.fsMapToBase(p), encoding); - } else { - return this.baseFs.readFileSync(this.fsMapToBase(p), encoding); - } - } - async readdirPromise(p, opts) { - return this.baseFs.readdirPromise(this.mapToBase(p), opts); - } - readdirSync(p, opts) { - return this.baseFs.readdirSync(this.mapToBase(p), opts); - } - async readlinkPromise(p) { - return this.mapFromBase(await this.baseFs.readlinkPromise(this.mapToBase(p))); - } - readlinkSync(p) { - return this.mapFromBase(this.baseFs.readlinkSync(this.mapToBase(p))); - } - async truncatePromise(p, len) { - return this.baseFs.truncatePromise(this.mapToBase(p), len); - } - truncateSync(p, len) { - return this.baseFs.truncateSync(this.mapToBase(p), len); - } - async ftruncatePromise(fd, len) { - return this.baseFs.ftruncatePromise(fd, len); - } - ftruncateSync(fd, len) { - return this.baseFs.ftruncateSync(fd, len); - } - watch(p, a, b) { - return this.baseFs.watch( - this.mapToBase(p), - a, - b - ); - } - watchFile(p, a, b) { - return this.baseFs.watchFile( - this.mapToBase(p), - a, - b - ); - } - unwatchFile(p, cb) { - return this.baseFs.unwatchFile(this.mapToBase(p), cb); - } - fsMapToBase(p) { - if (typeof p === `number`) { - return p; - } else { - return this.mapToBase(p); - } - } -} - -const NUMBER_REGEXP = /^[0-9]+$/; -const VIRTUAL_REGEXP = /^(\/(?:[^/]+\/)*?(?:\$\$virtual|__virtual__))((?:\/((?:[^/]+-)?[a-f0-9]+)(?:\/([^/]+))?)?((?:\/.*)?))$/; -const VALID_COMPONENT = /^([^/]+-)?[a-f0-9]+$/; -class VirtualFS extends ProxiedFS { - constructor({ baseFs = new NodeFS() } = {}) { - super(ppath); - this.baseFs = baseFs; - } - static makeVirtualPath(base, component, to) { - if (ppath.basename(base) !== `__virtual__`) - throw new Error(`Assertion failed: Virtual folders must be named "__virtual__"`); - if (!ppath.basename(component).match(VALID_COMPONENT)) - throw new Error(`Assertion failed: Virtual components must be ended by an hexadecimal hash`); - const target = ppath.relative(ppath.dirname(base), to); - const segments = target.split(`/`); - let depth = 0; - while (depth < segments.length && segments[depth] === `..`) - depth += 1; - const finalSegments = segments.slice(depth); - const fullVirtualPath = ppath.join(base, component, String(depth), ...finalSegments); - return fullVirtualPath; - } - static resolveVirtual(p) { - const match = p.match(VIRTUAL_REGEXP); - if (!match || !match[3] && match[5]) - return p; - const target = ppath.dirname(match[1]); - if (!match[3] || !match[4]) - return target; - const isnum = NUMBER_REGEXP.test(match[4]); - if (!isnum) - return p; - const depth = Number(match[4]); - const backstep = `../`.repeat(depth); - const subpath = match[5] || `.`; - return VirtualFS.resolveVirtual(ppath.join(target, backstep, subpath)); - } - getExtractHint(hints) { - return this.baseFs.getExtractHint(hints); - } - getRealPath() { - return this.baseFs.getRealPath(); - } - realpathSync(p) { - const match = p.match(VIRTUAL_REGEXP); - if (!match) - return this.baseFs.realpathSync(p); - if (!match[5]) - return p; - const realpath = this.baseFs.realpathSync(this.mapToBase(p)); - return VirtualFS.makeVirtualPath(match[1], match[3], realpath); - } - async realpathPromise(p) { - const match = p.match(VIRTUAL_REGEXP); - if (!match) - return await this.baseFs.realpathPromise(p); - if (!match[5]) - return p; - const realpath = await this.baseFs.realpathPromise(this.mapToBase(p)); - return VirtualFS.makeVirtualPath(match[1], match[3], realpath); - } - mapToBase(p) { - if (p === ``) - return p; - if (this.pathUtils.isAbsolute(p)) - return VirtualFS.resolveVirtual(p); - const resolvedRoot = VirtualFS.resolveVirtual(this.baseFs.resolve(PortablePath.dot)); - const resolvedP = VirtualFS.resolveVirtual(this.baseFs.resolve(p)); - return ppath.relative(resolvedRoot, resolvedP) || PortablePath.dot; - } - mapFromBase(p) { - return p; - } -} - -const [major, minor] = process.versions.node.split(`.`).map((value) => parseInt(value, 10)); -const HAS_CONSOLIDATED_HOOKS = major > 16 || major === 16 && minor >= 12; -const HAS_UNFLAGGED_JSON_MODULES = major > 17 || major === 17 && minor >= 5 || major === 16 && minor >= 15; -const HAS_JSON_IMPORT_ASSERTION_REQUIREMENT = major > 17 || major === 17 && minor >= 1 || major === 16 && minor > 14; -const WATCH_MODE_MESSAGE_USES_ARRAYS = major > 19 || major === 19 && minor >= 2; - -const builtinModules = new Set(Module.builtinModules || Object.keys(process.binding(`natives`))); -const isBuiltinModule = (request) => request.startsWith(`node:`) || builtinModules.has(request); -function readPackageScope(checkPath) { - const rootSeparatorIndex = checkPath.indexOf(npath.sep); - let separatorIndex; - do { - separatorIndex = checkPath.lastIndexOf(npath.sep); - checkPath = checkPath.slice(0, separatorIndex); - if (checkPath.endsWith(`${npath.sep}node_modules`)) - return false; - const pjson = readPackage(checkPath + npath.sep); - if (pjson) { - return { - data: pjson, - path: checkPath - }; - } - } while (separatorIndex > rootSeparatorIndex); - return false; -} -function readPackage(requestPath) { - const jsonPath = npath.resolve(requestPath, `package.json`); - if (!fs.existsSync(jsonPath)) - return null; - return JSON.parse(fs.readFileSync(jsonPath, `utf8`)); -} - -async function tryReadFile$1(path2) { - try { - return await fs.promises.readFile(path2, `utf8`); - } catch (error) { - if (error.code === `ENOENT`) - return null; - throw error; - } -} -function tryParseURL(str, base) { - try { - return new URL$1(str, base); - } catch { - return null; - } -} -let entrypointPath = null; -function setEntrypointPath(file) { - entrypointPath = file; -} -function getFileFormat(filepath) { - var _a, _b; - const ext = path.extname(filepath); - switch (ext) { - case `.mjs`: { - return `module`; - } - case `.cjs`: { - return `commonjs`; - } - case `.wasm`: { - throw new Error( - `Unknown file extension ".wasm" for ${filepath}` - ); - } - case `.json`: { - if (HAS_UNFLAGGED_JSON_MODULES) - return `json`; - throw new Error( - `Unknown file extension ".json" for ${filepath}` - ); - } - case `.js`: { - const pkg = readPackageScope(filepath); - if (!pkg) - return `commonjs`; - return (_a = pkg.data.type) != null ? _a : `commonjs`; - } - default: { - if (entrypointPath !== filepath) - return null; - const pkg = readPackageScope(filepath); - if (!pkg) - return `commonjs`; - if (pkg.data.type === `module`) - return null; - return (_b = pkg.data.type) != null ? _b : `commonjs`; - } - } -} - -async function getFormat$1(resolved, context, defaultGetFormat) { - const url = tryParseURL(resolved); - if ((url == null ? void 0 : url.protocol) !== `file:`) - return defaultGetFormat(resolved, context, defaultGetFormat); - const format = getFileFormat(fileURLToPath(url)); - if (format) { - return { - format - }; - } - return defaultGetFormat(resolved, context, defaultGetFormat); -} - -async function getSource$1(urlString, context, defaultGetSource) { - const url = tryParseURL(urlString); - if ((url == null ? void 0 : url.protocol) !== `file:`) - return defaultGetSource(urlString, context, defaultGetSource); - return { - source: await fs.promises.readFile(fileURLToPath(url), `utf8`) - }; -} - -async function load$1(urlString, context, nextLoad) { - var _a; - const url = tryParseURL(urlString); - if ((url == null ? void 0 : url.protocol) !== `file:`) - return nextLoad(urlString, context, nextLoad); - const filePath = fileURLToPath(url); - const format = getFileFormat(filePath); - if (!format) - return nextLoad(urlString, context, nextLoad); - if (HAS_JSON_IMPORT_ASSERTION_REQUIREMENT && format === `json` && ((_a = context.importAssertions) == null ? void 0 : _a.type) !== `json`) { - const err = new TypeError(`[ERR_IMPORT_ASSERTION_TYPE_MISSING]: Module "${urlString}" needs an import assertion of type "json"`); - err.code = `ERR_IMPORT_ASSERTION_TYPE_MISSING`; - throw err; - } - if (process.env.WATCH_REPORT_DEPENDENCIES && process.send) { - const pathToSend = pathToFileURL( - npath.fromPortablePath( - VirtualFS.resolveVirtual(npath.toPortablePath(filePath)) - ) - ).href; - process.send({ - "watch:import": WATCH_MODE_MESSAGE_USES_ARRAYS ? [pathToSend] : pathToSend - }); - } - return { - format, - source: await fs.promises.readFile(filePath, `utf8`), - shortCircuit: true - }; -} - -const ArrayIsArray = Array.isArray; -const JSONStringify = JSON.stringify; -const ObjectGetOwnPropertyNames = Object.getOwnPropertyNames; -const ObjectPrototypeHasOwnProperty = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop); -const RegExpPrototypeExec = (obj, string) => RegExp.prototype.exec.call(obj, string); -const RegExpPrototypeSymbolReplace = (obj, ...rest) => RegExp.prototype[Symbol.replace].apply(obj, rest); -const StringPrototypeEndsWith = (str, ...rest) => String.prototype.endsWith.apply(str, rest); -const StringPrototypeIncludes = (str, ...rest) => String.prototype.includes.apply(str, rest); -const StringPrototypeLastIndexOf = (str, ...rest) => String.prototype.lastIndexOf.apply(str, rest); -const StringPrototypeIndexOf = (str, ...rest) => String.prototype.indexOf.apply(str, rest); -const StringPrototypeReplace = (str, ...rest) => String.prototype.replace.apply(str, rest); -const StringPrototypeSlice = (str, ...rest) => String.prototype.slice.apply(str, rest); -const StringPrototypeStartsWith = (str, ...rest) => String.prototype.startsWith.apply(str, rest); -const SafeMap = Map; -const JSONParse = JSON.parse; - -function createErrorType(code, messageCreator, errorType) { - return class extends errorType { - constructor(...args) { - super(messageCreator(...args)); - this.code = code; - this.name = `${errorType.name} [${code}]`; - } - }; -} -const ERR_PACKAGE_IMPORT_NOT_DEFINED = createErrorType( - `ERR_PACKAGE_IMPORT_NOT_DEFINED`, - (specifier, packagePath, base) => { - return `Package import specifier "${specifier}" is not defined${packagePath ? ` in package ${packagePath}package.json` : ``} imported from ${base}`; - }, - TypeError -); -const ERR_INVALID_MODULE_SPECIFIER = createErrorType( - `ERR_INVALID_MODULE_SPECIFIER`, - (request, reason, base = void 0) => { - return `Invalid module "${request}" ${reason}${base ? ` imported from ${base}` : ``}`; - }, - TypeError -); -const ERR_INVALID_PACKAGE_TARGET = createErrorType( - `ERR_INVALID_PACKAGE_TARGET`, - (pkgPath, key, target, isImport = false, base = void 0) => { - const relError = typeof target === `string` && !isImport && target.length && !StringPrototypeStartsWith(target, `./`); - if (key === `.`) { - assert(isImport === false); - return `Invalid "exports" main target ${JSONStringify(target)} defined in the package config ${pkgPath}package.json${base ? ` imported from ${base}` : ``}${relError ? `; targets must start with "./"` : ``}`; - } - return `Invalid "${isImport ? `imports` : `exports`}" target ${JSONStringify( - target - )} defined for '${key}' in the package config ${pkgPath}package.json${base ? ` imported from ${base}` : ``}${relError ? `; targets must start with "./"` : ``}`; - }, - Error -); -const ERR_INVALID_PACKAGE_CONFIG = createErrorType( - `ERR_INVALID_PACKAGE_CONFIG`, - (path, base, message) => { - return `Invalid package config ${path}${base ? ` while importing ${base}` : ``}${message ? `. ${message}` : ``}`; - }, - Error -); - -function filterOwnProperties(source, keys) { - const filtered = /* @__PURE__ */ Object.create(null); - for (let i = 0; i < keys.length; i++) { - const key = keys[i]; - if (ObjectPrototypeHasOwnProperty(source, key)) { - filtered[key] = source[key]; - } - } - return filtered; -} - -const packageJSONCache = new SafeMap(); -function getPackageConfig(path, specifier, base, readFileSyncFn) { - const existing = packageJSONCache.get(path); - if (existing !== void 0) { - return existing; - } - const source = readFileSyncFn(path); - if (source === void 0) { - const packageConfig2 = { - pjsonPath: path, - exists: false, - main: void 0, - name: void 0, - type: "none", - exports: void 0, - imports: void 0 - }; - packageJSONCache.set(path, packageConfig2); - return packageConfig2; - } - let packageJSON; - try { - packageJSON = JSONParse(source); - } catch (error) { - throw new ERR_INVALID_PACKAGE_CONFIG( - path, - (base ? `"${specifier}" from ` : "") + fileURLToPath(base || specifier), - error.message - ); - } - let { imports, main, name, type } = filterOwnProperties(packageJSON, [ - "imports", - "main", - "name", - "type" - ]); - const exports = ObjectPrototypeHasOwnProperty(packageJSON, "exports") ? packageJSON.exports : void 0; - if (typeof imports !== "object" || imports === null) { - imports = void 0; - } - if (typeof main !== "string") { - main = void 0; - } - if (typeof name !== "string") { - name = void 0; - } - if (type !== "module" && type !== "commonjs") { - type = "none"; - } - const packageConfig = { - pjsonPath: path, - exists: true, - main, - name, - type, - exports, - imports - }; - packageJSONCache.set(path, packageConfig); - return packageConfig; -} -function getPackageScopeConfig(resolved, readFileSyncFn) { - let packageJSONUrl = new URL("./package.json", resolved); - while (true) { - const packageJSONPath2 = packageJSONUrl.pathname; - if (StringPrototypeEndsWith(packageJSONPath2, "node_modules/package.json")) { - break; - } - const packageConfig2 = getPackageConfig( - fileURLToPath(packageJSONUrl), - resolved, - void 0, - readFileSyncFn - ); - if (packageConfig2.exists) { - return packageConfig2; - } - const lastPackageJSONUrl = packageJSONUrl; - packageJSONUrl = new URL("../package.json", packageJSONUrl); - if (packageJSONUrl.pathname === lastPackageJSONUrl.pathname) { - break; - } - } - const packageJSONPath = fileURLToPath(packageJSONUrl); - const packageConfig = { - pjsonPath: packageJSONPath, - exists: false, - main: void 0, - name: void 0, - type: "none", - exports: void 0, - imports: void 0 - }; - packageJSONCache.set(packageJSONPath, packageConfig); - return packageConfig; -} - -/** - @license - Copyright Node.js contributors. All rights reserved. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to - deal in the Software without restriction, including without limitation the - rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - sell copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - IN THE SOFTWARE. -*/ -function throwImportNotDefined(specifier, packageJSONUrl, base) { - throw new ERR_PACKAGE_IMPORT_NOT_DEFINED( - specifier, - packageJSONUrl && fileURLToPath(new URL(".", packageJSONUrl)), - fileURLToPath(base) - ); -} -function throwInvalidSubpath(subpath, packageJSONUrl, internal, base) { - const reason = `request is not a valid subpath for the "${internal ? "imports" : "exports"}" resolution of ${fileURLToPath(packageJSONUrl)}`; - throw new ERR_INVALID_MODULE_SPECIFIER( - subpath, - reason, - base && fileURLToPath(base) - ); -} -function throwInvalidPackageTarget(subpath, target, packageJSONUrl, internal, base) { - if (typeof target === "object" && target !== null) { - target = JSONStringify(target, null, ""); - } else { - target = `${target}`; - } - throw new ERR_INVALID_PACKAGE_TARGET( - fileURLToPath(new URL(".", packageJSONUrl)), - subpath, - target, - internal, - base && fileURLToPath(base) - ); -} -const invalidSegmentRegEx = /(^|\\|\/)((\.|%2e)(\.|%2e)?|(n|%6e|%4e)(o|%6f|%4f)(d|%64|%44)(e|%65|%45)(_|%5f)(m|%6d|%4d)(o|%6f|%4f)(d|%64|%44)(u|%75|%55)(l|%6c|%4c)(e|%65|%45)(s|%73|%53))(\\|\/|$)/i; -const patternRegEx = /\*/g; -function resolvePackageTargetString(target, subpath, match, packageJSONUrl, base, pattern, internal, conditions) { - if (subpath !== "" && !pattern && target[target.length - 1] !== "/") - throwInvalidPackageTarget(match, target, packageJSONUrl, internal, base); - if (!StringPrototypeStartsWith(target, "./")) { - if (internal && !StringPrototypeStartsWith(target, "../") && !StringPrototypeStartsWith(target, "/")) { - let isURL = false; - try { - new URL(target); - isURL = true; - } catch { - } - if (!isURL) { - const exportTarget = pattern ? RegExpPrototypeSymbolReplace(patternRegEx, target, () => subpath) : target + subpath; - return exportTarget; - } - } - throwInvalidPackageTarget(match, target, packageJSONUrl, internal, base); - } - if (RegExpPrototypeExec( - invalidSegmentRegEx, - StringPrototypeSlice(target, 2) - ) !== null) - throwInvalidPackageTarget(match, target, packageJSONUrl, internal, base); - const resolved = new URL(target, packageJSONUrl); - const resolvedPath = resolved.pathname; - const packagePath = new URL(".", packageJSONUrl).pathname; - if (!StringPrototypeStartsWith(resolvedPath, packagePath)) - throwInvalidPackageTarget(match, target, packageJSONUrl, internal, base); - if (subpath === "") - return resolved; - if (RegExpPrototypeExec(invalidSegmentRegEx, subpath) !== null) { - const request = pattern ? StringPrototypeReplace(match, "*", () => subpath) : match + subpath; - throwInvalidSubpath(request, packageJSONUrl, internal, base); - } - if (pattern) { - return new URL( - RegExpPrototypeSymbolReplace(patternRegEx, resolved.href, () => subpath) - ); - } - return new URL(subpath, resolved); -} -function isArrayIndex(key) { - const keyNum = +key; - if (`${keyNum}` !== key) - return false; - return keyNum >= 0 && keyNum < 4294967295; -} -function resolvePackageTarget(packageJSONUrl, target, subpath, packageSubpath, base, pattern, internal, conditions) { - if (typeof target === "string") { - return resolvePackageTargetString( - target, - subpath, - packageSubpath, - packageJSONUrl, - base, - pattern, - internal); - } else if (ArrayIsArray(target)) { - if (target.length === 0) { - return null; - } - let lastException; - for (let i = 0; i < target.length; i++) { - const targetItem = target[i]; - let resolveResult; - try { - resolveResult = resolvePackageTarget( - packageJSONUrl, - targetItem, - subpath, - packageSubpath, - base, - pattern, - internal, - conditions - ); - } catch (e) { - lastException = e; - if (e.code === "ERR_INVALID_PACKAGE_TARGET") { - continue; - } - throw e; - } - if (resolveResult === void 0) { - continue; - } - if (resolveResult === null) { - lastException = null; - continue; - } - return resolveResult; - } - if (lastException === void 0 || lastException === null) - return lastException; - throw lastException; - } else if (typeof target === "object" && target !== null) { - const keys = ObjectGetOwnPropertyNames(target); - for (let i = 0; i < keys.length; i++) { - const key = keys[i]; - if (isArrayIndex(key)) { - throw new ERR_INVALID_PACKAGE_CONFIG( - fileURLToPath(packageJSONUrl), - base, - '"exports" cannot contain numeric property keys.' - ); - } - } - for (let i = 0; i < keys.length; i++) { - const key = keys[i]; - if (key === "default" || conditions.has(key)) { - const conditionalTarget = target[key]; - const resolveResult = resolvePackageTarget( - packageJSONUrl, - conditionalTarget, - subpath, - packageSubpath, - base, - pattern, - internal, - conditions - ); - if (resolveResult === void 0) - continue; - return resolveResult; - } - } - return void 0; - } else if (target === null) { - return null; - } - throwInvalidPackageTarget( - packageSubpath, - target, - packageJSONUrl, - internal, - base - ); -} -function patternKeyCompare(a, b) { - const aPatternIndex = StringPrototypeIndexOf(a, "*"); - const bPatternIndex = StringPrototypeIndexOf(b, "*"); - const baseLenA = aPatternIndex === -1 ? a.length : aPatternIndex + 1; - const baseLenB = bPatternIndex === -1 ? b.length : bPatternIndex + 1; - if (baseLenA > baseLenB) - return -1; - if (baseLenB > baseLenA) - return 1; - if (aPatternIndex === -1) - return 1; - if (bPatternIndex === -1) - return -1; - if (a.length > b.length) - return -1; - if (b.length > a.length) - return 1; - return 0; -} -function packageImportsResolve({ - name, - base, - conditions, - readFileSyncFn -}) { - if (name === "#" || StringPrototypeStartsWith(name, "#/") || StringPrototypeEndsWith(name, "/")) { - const reason = "is not a valid internal imports specifier name"; - throw new ERR_INVALID_MODULE_SPECIFIER(name, reason, fileURLToPath(base)); - } - let packageJSONUrl; - const packageConfig = getPackageScopeConfig(base, readFileSyncFn); - if (packageConfig.exists) { - packageJSONUrl = pathToFileURL(packageConfig.pjsonPath); - const imports = packageConfig.imports; - if (imports) { - if (ObjectPrototypeHasOwnProperty(imports, name) && !StringPrototypeIncludes(name, "*")) { - const resolveResult = resolvePackageTarget( - packageJSONUrl, - imports[name], - "", - name, - base, - false, - true, - conditions - ); - if (resolveResult != null) { - return resolveResult; - } - } else { - let bestMatch = ""; - let bestMatchSubpath; - const keys = ObjectGetOwnPropertyNames(imports); - for (let i = 0; i < keys.length; i++) { - const key = keys[i]; - const patternIndex = StringPrototypeIndexOf(key, "*"); - if (patternIndex !== -1 && StringPrototypeStartsWith( - name, - StringPrototypeSlice(key, 0, patternIndex) - )) { - const patternTrailer = StringPrototypeSlice(key, patternIndex + 1); - if (name.length >= key.length && StringPrototypeEndsWith(name, patternTrailer) && patternKeyCompare(bestMatch, key) === 1 && StringPrototypeLastIndexOf(key, "*") === patternIndex) { - bestMatch = key; - bestMatchSubpath = StringPrototypeSlice( - name, - patternIndex, - name.length - patternTrailer.length - ); - } - } - } - if (bestMatch) { - const target = imports[bestMatch]; - const resolveResult = resolvePackageTarget( - packageJSONUrl, - target, - bestMatchSubpath, - bestMatch, - base, - true, - true, - conditions - ); - if (resolveResult != null) { - return resolveResult; - } - } - } - } - } - throwImportNotDefined(name, packageJSONUrl, base); -} - -const pathRegExp = /^(?![a-zA-Z]:[\\/]|\\\\|\.{0,2}(?:\/|$))((?:node:)?(?:@[^/]+\/)?[^/]+)\/*(.*|)$/; -const isRelativeRegexp = /^\.{0,2}\//; -function tryReadFile(filePath) { - try { - return fs.readFileSync(filePath, `utf8`); - } catch (err) { - if (err.code === `ENOENT`) - return void 0; - throw err; - } -} -async function resolvePrivateRequest(specifier, issuer, context, nextResolve) { - const resolved = packageImportsResolve({ - name: specifier, - base: pathToFileURL(issuer), - conditions: new Set(context.conditions), - readFileSyncFn: tryReadFile - }); - if (resolved instanceof URL) { - return { url: resolved.href, shortCircuit: true }; - } else { - if (resolved.startsWith(`#`)) - throw new Error(`Mapping from one private import to another isn't allowed`); - return resolve$1(resolved, context, nextResolve); - } -} -async function resolve$1(originalSpecifier, context, nextResolve) { - var _a; - const { findPnpApi } = moduleExports; - if (!findPnpApi || isBuiltinModule(originalSpecifier)) - return nextResolve(originalSpecifier, context, nextResolve); - let specifier = originalSpecifier; - const url = tryParseURL(specifier, isRelativeRegexp.test(specifier) ? context.parentURL : void 0); - if (url) { - if (url.protocol !== `file:`) - return nextResolve(originalSpecifier, context, nextResolve); - specifier = fileURLToPath(url); - } - const { parentURL, conditions = [] } = context; - const issuer = parentURL ? fileURLToPath(parentURL) : process.cwd(); - const pnpapi = (_a = findPnpApi(issuer)) != null ? _a : url ? findPnpApi(specifier) : null; - if (!pnpapi) - return nextResolve(originalSpecifier, context, nextResolve); - if (specifier.startsWith(`#`)) - return resolvePrivateRequest(specifier, issuer, context, nextResolve); - const dependencyNameMatch = specifier.match(pathRegExp); - let allowLegacyResolve = false; - if (dependencyNameMatch) { - const [, dependencyName, subPath] = dependencyNameMatch; - if (subPath === ``) { - const resolved = pnpapi.resolveToUnqualified(`${dependencyName}/package.json`, issuer); - if (resolved) { - const content = await tryReadFile$1(resolved); - if (content) { - const pkg = JSON.parse(content); - allowLegacyResolve = pkg.exports == null; - } - } - } - } - const result = pnpapi.resolveRequest(specifier, issuer, { - conditions: new Set(conditions), - extensions: allowLegacyResolve ? void 0 : [] - }); - if (!result) - throw new Error(`Resolving '${specifier}' from '${issuer}' failed`); - const resultURL = pathToFileURL(result); - if (url) { - resultURL.search = url.search; - resultURL.hash = url.hash; - } - if (!parentURL) - setEntrypointPath(fileURLToPath(resultURL)); - return { - url: resultURL.href, - shortCircuit: true - }; -} - -const binding = process.binding(`fs`); -const originalfstat = binding.fstat; -const ZIP_MASK = 4278190080; -const ZIP_MAGIC = 704643072; -binding.fstat = function(...args) { - const [fd, useBigint, req] = args; - if ((fd & ZIP_MASK) === ZIP_MAGIC && useBigint === false && req === void 0) { - try { - const stats = fs.fstatSync(fd); - return new Float64Array([ - stats.dev, - stats.mode, - stats.nlink, - stats.uid, - stats.gid, - stats.rdev, - stats.blksize, - stats.ino, - stats.size, - stats.blocks - ]); - } catch { - } - } - return originalfstat.apply(this, args); -}; - -const resolve = resolve$1; -const getFormat = HAS_CONSOLIDATED_HOOKS ? void 0 : getFormat$1; -const getSource = HAS_CONSOLIDATED_HOOKS ? void 0 : getSource$1; -const load = HAS_CONSOLIDATED_HOOKS ? load$1 : void 0; - -export { getFormat, getSource, load, resolve }; diff --git a/.yarn/cache/@eslint-community-eslint-utils-npm-4.4.0-d1791bd5a3-cdfe3ae42b.zip b/.yarn/cache/@eslint-community-eslint-utils-npm-4.4.0-d1791bd5a3-cdfe3ae42b.zip deleted file mode 100644 index 4e483570203936628fda05a798a69b40ee31e9db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65295 zcmb5VQ>-vd5G8nR+xLFgwr$(CZQHhO+qP}nwz>cA&OFQ}yPN5U?tZAMR4R2kos(1Y zQotZ60RQLWuU&=szb^k{gZ=NcwKF!+v#~RFu{Lp{lmCA;#s7br@|!qWTi80&7}?p_ zxY$}ad;EVmQ~&=v|Bq-c&KB1HGYudBi2p0&!8I>oHy{82IuHN=rvJ@I(h@=<0<_JE#T8$VPyWK5!4 zB=+gmpnm?XY)cEI2t4TzsI#t65cgl^+vlT180HF*2gcV4r0+uAnG=Wh;G`gXoI&36 zAFqy$M$8G%aJKb;c!qWc3)_fMV;aRxruw!Zmpv`}mxgzAh@{wu$C`)Y{V_N87vn=( zUiM^eY6S1ueDuUUAkzH2$m}1pxaU@9>St5F_62hJPQpEX!qi}tvr*FIV`O{+^+Wyf z0|j>+S7BWqq1Aa71rNQ2{3%vynp= z>}n}Ma4c$?rCHfjZy;6v~JpN|ZlvJCmZs{VCSw|EN?@A&XoH3o|7U)FQE=Yp{MhAY$jemcrcx$3f;2s{YZ7 zcw_q-`T_jkaQdHp40DS8^hN^!pbG>D!2G}2#}>B6ChoMBPB%VQZrE&%`))sxXk*9; ztRfptU2oed)Lu9vxeK^`u_R<>v9x5C2?QGsO<5PVnu^4;c6umKcVccyir2@siB8n4 zc%b?6D�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 Ya+08bRXzX!kbke7zaL!l^FLbu7g=>v>Hq)$ diff --git a/.yarn/cache/@humanwhocodes-module-importer-npm-1.0.1-9d07ed2e4a-0fd22007db.zip b/.yarn/cache/@humanwhocodes-module-importer-npm-1.0.1-9d07ed2e4a-0fd22007db.zip deleted file mode 100644 index 7adb1e9f2884587e4d9c5ad831797e475c5ad22c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10603 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 diff --git a/.yarn/cache/@jridgewell-set-array-npm-1.1.2-45b82d7fb6-69a84d5980.zip b/.yarn/cache/@jridgewell-set-array-npm-1.1.2-45b82d7fb6-69a84d5980.zip deleted file mode 100644 index 3b901fc14bcdf6f7e79ed84ad96859e797b6f207..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8860 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 diff --git a/.yarn/cache/@nodelib-fs.stat-npm-2.0.5-01f4dd3030-012480b5ca.zip b/.yarn/cache/@nodelib-fs.stat-npm-2.0.5-01f4dd3030-012480b5ca.zip deleted file mode 100644 index e86d01e26b3fc64d8e7e1825be7772417c6a07d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8706 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 diff --git a/.yarn/cache/@tootallnate-once-npm-2.0.0-e36cf4f140-ad87447820.zip b/.yarn/cache/@tootallnate-once-npm-2.0.0-e36cf4f140-ad87447820.zip deleted file mode 100644 index d240a82ae2fce9fe5d87b7a358d1905a1178cbc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6906 zcma)A1z3}7*d8e%GDHLs5f2Oy1|uaE5Set0ZgF&tm~=>Y*C^?f?pB&1ARLqwMWjSh zT8V#n4!^(r=Nx%=z5BN7`ri9_zWaH;rxayyaIXMPmT1Wc!H*w*f01CW)(Ar*eJh0F z6H6m|h~mHAN`3ZLQ6vI^G_bU^Hb5Hv$GMyTc@AL>KRt{MAo!u*x?ORH12zBv!36*q ze}7n3N?bx-Swa^kgP7p}wtQC)burJ$*WRwkb)d1;@1EBH+4d?;IaNMC zge!wa`uE}6*RrY2P4}}@*$+SE&&`RiM;Sx(Vw@RyQ zqOi3?jy+-ti^DMi=_?*wx#dOV^b+35<%RzaD(K$Ej7nBeXD5f|I(j!KYtZ zF=&hb2*&n2`f;{u0mVIX*@7)5B>nX$fOgVa3Z^Ftyhk8_S2Tw>&O*zSi{~8Gce%}9JQ!oRdx=u#lK*hv%`O( zn>Is+a%e>PbL=e+mCTn~0s$#lXln5WRiS8VLFVbf9Gk#&Qs_eB({&P;HZ9F7-b2(= zJ5*hR3Phb#s2ekVF!R{i>rwKw;-SJ4N&x5Lk4`Ci)lgL%;@!M`DSqS;dm<7Skt6YJA=+`L5z7SL z0*j~##`>y$IOw~W+|b~FdIQ)i{wnhDkLOEE&MBe1$f0AYUc49WR~?7y)<52qEY*Ec zYLG!WWa)r2;>2zXN`?-t&N*u`7uuw~m}rXczwno3PwmnYa}=lQg-;&{xbV7j-!pcq#(G^h(_8;^yRy5{P|XZ2OK#Yc!H9})sj648{bP>k+l_Cz zUmO_fE4rtpgT8$6XiV9}mmkOTh1)J)W!6{*JJ`;V{`xeJi03HHPo4s^&+BDKXB(rx zv~MNy76sx@H!5&iCSYr>Ng*N`#7xFVUTAPSq7o@UF1szSDewxUg6Aiec2a=-5l%UH z&4&JC9vxkpvKDsjfR(Qr#&t<8RsQwUvW$3JLe;9nG?MmFf$SW4bBA^MkQ(kc3QHnh z$G_^_L9EPh6O$D@Fx#w3Xj z2i&V;>qLP3<9KRDbXNkWqLj%G)~1r#Zz*!r2%8KHB~HE~fs?bDql(67y?|28Ie23J z4NuX1?Is**nLF25Tc$&(*jleb@5Dwz@M&IgwR%t&<={c%=yt#inhv6$0Ib_eSU%jQ z!PM1}UVW7?t=??*j}Vb@fkAfDY(XUwSr*ypMR5Sl68gfFfu;f^6V)h#Z#Y z^r&jG3sv{& zI)!tu(vC~9((Q@?u3g<~0Z7?^L!b~}(ApG3-NM$4=k(Xm+>39!T_j{Es3CLAaf8bV z{I@k#mh}RTKMmQDR2i(XWOg;Hc+Om|+%3-w$DY8CnM5>Fy_)=#AAv4onmpDX$gVC< zR$OcF-K6K4?#d@7r0);lSXz$#)~xT2w5VCqid76VTCdhGsXGP>>CBp%>ZLRKNQ;@a z9o6Wo#N(rUZ&VU@^ExHVI~+~)2GDNEw;AKDhkw|Z%(yrBu%P?NlX$+gaXZdg(1rmg zo1#whzSG-qBKr*ddi8+@MGZIGH>Ofo@9j=Ab6i(6Q>qV&)do*GK@7Dd_jnKVhKZ+A z7pVM2E)%M+tET0M>3(n5&1-OH^KUblPZ#%*1~ zcMSN|&jh{gX~CEX%#Vq{9KZLoA2Iwi0<&8g*!aP86?{a22axYee$v!8ee>$G%m!6p z*F~s5;rvmYFN&ig7kWGee~k_5yl0cB>tMXVxGQ(lR*BIWI-oJg;v9j_U~mn8Q8XHj z8@FE*IP*og6#1e+#*Vh90%}AS)@P&oXI45`c0bMEtZtlPTuXhnK@?C9xRf+n&dJT_=+t zmq_Tv>QhtURmhmzAaA7a3wYw_d{{pgXKb?Gm~=8vNB2lM|HV^1t$ z70P+(DIE~^xPtewK{vN$7~atEqeyz13994OagFg6OXJ-(DG6+*x`9W8QPVFcBzCy_ z<#syPRNj^+zZBhLCg1K;ZH~aRep+1|TX1+&z11}GioW`%Rr^b3al7*#XZ*&jzE(&T zqqQ++pVx0rW9o^v&(&CD*jNVoUMp8{jVMXK>XTBffUy*SCD}$^v8es2#4-S3la?px zeGS11Zr|^eRvVIbarxFMf&K>U1a(T63raf&)jtxT0w|)7il~a*uf^%%L@U{m(_P45BK&B~yp*$vt$1@au&()p3L` zPPEjl`o+i)#!>`AQ1~OVr+Vwzif;>knto#~nVHh2Z%QqI=Z|5h-BI5bv5(s1>2)zu zH#?Z-AhcbdHmY?SKIi4U=&2yZ3EQ{@;76mcb4d(oO=k$Vq8~CKrQ%bSSRE2eQAviZ z_z)gKi%$PO@3uMV{HwILDx*OOt)~2|G^%AeW8t5Tu{yyf7GeFvMq4YU1As0>tWLY1 zj^tPp;_@4%x)G&ZQrU*Suk@6(c4Qhnz-62d6~zW-G%~Y%B#mvoT_zRQq1&8?RZnkF zAHa%QB_P{P%2X~=)MQyc8fxj(&tUHtqj^dlRs5NNcFSu<{khxi9|?8!hU}qxpkmuS z5gKslwNO(IN(Vq{0@>ll{w8{)9Vd8*MZ}MojHQ0~o+9x?9SMvbcmK6+};GG*bo-F`-IGYLNQ<4*+r1PkIGt3{m6z| z3o%)$X*y~XlO$Me1Rh4M%7!g4k*z-h1O1=(X=Qzm)yxtx-qrP_T&B6P5wrEMfH+D% zVttC0Z?WbXeFr}j==%U2Gwuipo8bdifCDs|Qfp=WzQ*Nh-bF9m_7n@&y9_ za0_axIWLlygw z(wo5M#Y44-sCjqV%duqrx#TW;w9^yXn=0FLEKG3p9Zm0QWQO+wR(Pcu@J5z zFweO~t1fUTzn{hZt&f6Ybfz!4a`fUtK|bHqte5B>yPhJNxWFhKz(O*wkZg4!V1T5F z%&j|$sIau}!&?#AEul9r;x#H&35vgj$L0i>(YA|6j9JrVrq5fmnia8ChWlR@7`b0N zedOo@HP5!cRmRv-HIUq(k9{z!nPBb6jSRKkD$||{>W@Q4l6-e(*4y28i}nYtddEe9 zcAV){2an!E6PNezl|53drFU}U=E{8KI^7pL%`b==ugkrj0&@?nfH9+^wu_J!? z+T5sp(SG9=?Thzqj#z>@Z|w_SO(~#K*J5e4Ky922_CqX+!83L#hi9sCu8RpAqnJRJ zfXUbFzYl2tCs!M?BkipsTTkln2WyAHogqYzSFOUF))}?di8H4pUs_Awk(M}c932U! zu-B^Kj^R_17NZ?}EGqa%hjv&KRTRV)SDLA$&^^#5V4LE02`eQ%zSC2Z7H`fLcITAC zo|@eI&z@{{**<7fMA6kgj_+Ken`st`67bBNFLc+cC^M_12^ym|m>?W02_GPDzl$aC z&L!cqBP?Fn#Uf}#XMk+kFC22+Nvg-y$r3kzRxFEe*=BTP(Mn69EE%?klDuNZ^i0ax zL;Z3YWZsO(PX!4kIQC??2{TOvDg0W_L{7w;$ztd!rUd}*os*(}PO2xAtwc}Bw}}G% z*4%^Z-z4WMAF-OcVK-0X-ErVy)aa?<1a42QSO;w*enIjvdaB&$r!yGJI}i zF;eOY$-@M>H&6}+6Fz1)b8%3Y3`QQGI&c7sAQW)j>rM?+fMR>3Wl?V7`Xb zJxG2Z{NdeV-O!V)1?Yz`uj}G`P-~mTytOh&IikF@e61W(fv700ScBf`G_Rx9EBHvl zQuMX32{dQbA-@f4K3FyCpDD0o%Ga@yFOcgtRVHc3XD+^y10#Rq)s9Th1buNiHfwfW zQ{Yn{o!`+2V>epJS$?4Fd_2&|FgOgYzgq-fsGwd>4Un<*7|pd9Yay&$zgx zDj}+{CNoO#!L^GmiqC_>EXBoQkM+7EONq4njmsemu50^K0tDEB4D-xU5a5=zpE=L8 z_YA;$%wSGhlEf8d8TmyDT?Hk)(38X5+PRcx7qC*kK+=037`){t3Ck2HPWt3Qm$Wri zh)#BSH{lW-;@y))gyJed`dkKahSFiZGoMuv>#ZBQ$W7|@fyphw_}aVni}$CYal)i# zkd2;LFOERvQlGpkLpMVGbcZ>eD-`2ZAp4hYK_&@FWB9!F_H3>eGAfOll}NUdz1Pl~ zlsP5S)>n`3ZyB;2&F>j}#S5}^^Gj2I-zNk;)KRe1A#{a*a}O2Jq!e8GV^`2gYBh-d zPBQQD^h``%LetV$2HH^8RUY)j$fUp8)Q#j-MiPQg{>)7CXyHD&gWmX*D`mCfV$3U_ zFMjmD9`w>ENl^+e;=x1 zUbP=Vr)x#*zx&+(!Z{hbo~{)!IOgXsD*XRy`V{Q67(Y9NJq645 zO8-6B-y_*m%#*Wc2hS(tvD398riJnP-zfO^uH5!6)ZG58q_e}ApOUcg&nM}$jW~;Zc4YDsx#suC|960L7WizB{1cd# z@O&zt(tgtUoJBv|2mVAyVH%h7xXHg!|4-7+_H93}pDh@EVy}>$5Bs0l|0h{zlip8RapdQd^)m%3%HUy~ S8UO%dK2exgRGH%B-~RwXeJ*7H diff --git a/.yarn/cache/abbrev-npm-1.1.1-3659247eab-a4a97ec07d.zip b/.yarn/cache/abbrev-npm-1.1.1-3659247eab-a4a97ec07d.zip deleted file mode 100644 index a8b40a5f9dce5ce4124ac2b22160791813cd9409..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2938 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≫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

mlpJkQG$}TQ!}LPd1JpFw9x5VTv48 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 L>E%YwzmEPND%*L* diff --git a/.yarn/cache/deep-is-npm-0.1.4-88938b5a67-edb65dd0d7.zip b/.yarn/cache/deep-is-npm-0.1.4-88938b5a67-edb65dd0d7.zip deleted file mode 100644 index 2078a471f04666f3e09d8e26157937a938c2de81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5430 zcmai22RPLKA3vMRjtbf15~s_aAPPT?|&UT!Ykxf=aW)j&tD@w>p=(0s-Mz%A{ zsI33>`~5uq^ZfMt-18mxJm2^0-mm+9-sAPw(I6sb0Q_7EB_GNEy7}isg}*vETOn>a zI$OCrAkdd|PJEQ{_@h<`1PW|>WI_la{|kLiYWCSMApkHy3;>)z$wX6K3979JMZi0q zMkQ(Mar~rGF9Ig>hTC6~2MG(aq79QMBc0N?!M$fZdHXmD^M>;$m|AR^86Xa5$*=oV zr~JKv+e09)!TRuL?XiYZeuo4_JDhyenVU_o4kx9zn)lY)UG~ZsIV7brjZz#BG^3gl|xX-=_RV zR9Q!@nxOP0^V8{cO%9KSYa`OQ`4tR86A!Egm$)zI_R^^5CONB zYMM~m*S9UZsW~Fv0Gx1*Pj!&$BX4=$O$NO(u=&hTKee7J^UV@6nGq49m~ILc;?BH# z)M`lT?6u{L+;FT7@Dq}^ww#!kH`@dTDBJ%`CD)DarUHBLM=nQLrtX9G{+vVV z^`}FLnr}QnRqo9X?naa)78uYQe+x6T3&a=^9Wc`LV2q8st~-P;&0(}f46Yl3HM(GL?cQyac1A7x zpBzQ3CxryU%iIy=fcPf>kD^J#{{A&Pyh%6y;QlXDOGlKD9a=y`5UvIm)auYJ)4xC{ zEF1+F>)+bk91tt6j{o{K@+%s?1s9GIeOk>B0KmYBI*0@9LX}AbLTyO6SxGEIjaWl@ zAl=HG23ZE-=b*R6(xiuCN&rP71G)vo{1Qqcbn0D{)|7^VJy^iWESXPo)eV7mJ4P`T z3Vv0Bf4-go0O0te-QWCT;T;go zEOf4AktT}B@xku8tX3z>LbPVXuUe%$Eo$3)Xu^sy&)ecbt=QxQqK{+w?02jWM>evX zuIB4MGD#txS^;ZGBz9nQT%|ep?k-(gk00#EWUA$|TmBf0`qV8|SS&9qWV)eZ8)?T% zp?){nH2Gm7miu+fCyP$U++0JlDck4i-_{4ylh>~3V*`!)}^#qGIYF7L4D zjLuXV^JOJ86TGKEOc=cs5|Xu6vIykwE-hDZNGoOwv-jRA5~JhM%5x9V{3>5<&>HTx z%Bbj5D$gfD@rjWnLM++9s?7g3v?WGFVNZ{DouV^3MKLl7R~Ls$WqUkGtfKw)RC5~v z^#}Xx=QW?lx4sK;#vp{z(8EyUD{815mi#3u9#bd(vp#Gs!2s!vp;E{*yC<%77SE)^ zysTa|d?s|A0J%A%sXaupsD{&xO$6fK!;2iK%P&*K$`#CzV|@McD{7Xg-W0r+RP`c8 zIbu|niz?=NiW0##a$C^Gf^c|pKMloxWZ3P@kS|!0D`Dr61+_%+;&KBgf9=L0y)&FVxLRug+RN3PYiTxQi^y68Vd( z`4cy78p%wQOEw1Wb8T6cD%ICgdSJ!}%xo+vMoERRk;x_zRj&9K5}=thf3~1t{?FwS za;}u`qtafZdv7gyOO$CBc*w+sd?ykTFHzg^)@Ovye4vUhq!OR0gLXDX&Ch4#*m+z6 z?7-Y5rh6Gb5tE0=-?0DXgHpQe7ya{B7nuenHj47l4~@&KHQi0ze|ceZH; z=$~yiMv`9raT9n|!f$`HX9`t$w+Z(tdTiPeCsmV0GPfg=Cw#skSwYPR!c*+f(-~|% zUf^4vz1`luKPRwivF%gW2ALgMtJ;9H-X}sazX6Ikn>n7T_0DMjAi0WuZ#k$LaX9CN zws2?M=Fk1)Df@hxvf=gX*H73aS5mD^_aQrsedc6^;3*RdH@c*^JJ=#=4?iz zwZQ~?-vim=*%yzu3F++4cqgK)*z98u?thNnae_gv*k1zGy5(r@!X&ans$fhN#@Y{X z4_mm92yAXvetNJ(-xHn$>2~{Z%B*#5$_vvm$Bg$X7(fc-Y0$A3OsPHIXsmapab+=B}E||ZI z@)$Lpe=5TTrLzm^PDwlqRI4^#UGsiUD?`Cvl!cSL2f%W|fzgdXgQ$a>)ZfMXd zN1RG#%lY90)ea%OD(WVoTGGYKI|Kr3ink7Ta;T7r)Sma8fi{$Nf8;SAq1nHJDkW`#|CwuTj zVw61ZLAg>6u3xn;awYV7HQ3txc||k5!2n-5S7@c3<0%}gU57`C&2`dzEPFK#Tbjlg z@ZI#qba$sddPtlutnKvo#$AbGLqS1>eUUz2@;mvn=xbq@pqCQNmi7lX0vv{|nA}L8 zwG5(ZerFXsy}p`+XJv?I#s9~e?W+B72mk>XuWqmBc%@ZnS1t8;feZ}TJX%(sd!@A_el zzVp0NbhX?(W%%kX>Zv)9wtuQAj(zKcem^NeHsAw4>YS1NR~Ki2wl3lgOdWE$z*b z2s|ZcCr5a@b~A+b^^O3>EKbK|R3T8fU zd0ESjcbY4xaT$|fqj{tP>OYG!alIn2td74IyO1*8Z$m9EVpcn+Ty$PY(EMYN3&U3T zggqbmX#vD50Rh5V%1Z7~VXLk=D+;p`a^iSB@_~BB>87~$^B$WO*f=y%>R0XC`%_Iy zYz)2;n#>pO(#ROt(y{d~hunnUv|eMZn91TE9WMu__klf>eTje_}b)T6k&-=JCOs?2mywrBh$JI%4@|9Q5Q$ ziXO9X9hTatf4hIqc%3qbs_J!};L@-~cIY9KMO;u+&nKR)%xX*9{*Q;|S5XtcI^ud3^Ao-bJxecqOx;O))V3Ck|J8=%)><(gN9xgEB{peKDLo1ZFd z%TK1XjIF#dczW{K_GNuOpw@ubVA&)90MAKp7!Flb)`AK-n!DOtIeR)KUcYf|6!KTM z;q&xCU!?#MDN)GVi!l*fft)K@MGS-WJfv-14rC)*yKA-Duu;c>);-$lt?K!VU4A-T z{g-72zjKd_B7E3fSLJHr)PtfM#Laf-Cu_>IL!ZA7^qHI_l8Cprr@bh^62laI){MB0 zxR@cCC)05>HR)f|&$Rqhu7F$IZL2TLAJ8jb>>+~w~9PNp$5!$~>4y&LPdy&gio zSWjX%Y7Fv*5@XIk%sM~Q1SSh2(^XmfVECcB;#vsFME?u-EHpGD1auo{4fkx=vMfI6kvlAnxUd#}$kzPQC64btX*w`U(;Bun}jM zje9Q|B(03HC_w(C5ZU{E0?(_<(XcErl(e^usOSMA{U#h0%v=qksEn!k@h1P7snIMS zNi6xGVe&L~-lcYnhcvPoxeWR}#Ys9Mp?vs_FN!}nP6_}aH&=5HTeQ#}M~8Ox4vkA% zn%7>y-?d*;kLkWR7u0891_agsNxiLgMhIan%qRl9-XS2ACpvkMg8!kv){5fK%dxS_ z$)-OCD@SWZQ2>AYo9VAH%ij=3mG}6d3+ium_b1-9aqG*WMQUB`OKN|CQ$BwJaBb=PT*gxX@?$yzM ze_Y4?Li53=+<*1zNYxz?Jc2sjK>dQ!0-gZ%7s0>VspDwJ8<$^b+^7D8cC3v#4tu<1 z_yr5VE7^bL`~MBZak%64=@;B*{6O+w;f__S64$}R#`1^5~{EfyS zkX8;D#65eY(`nrUw}SR>MIh~wx8ctJ7##x8{e^F>dmLU#-h7?{01!CX$PsRB2fvM! zvUS3sEhElg8o?~8s~ZfR0_rwZ(ylWNt%2+kr0iDPiC5n=bLqa5a8DZ=)<67AzE|GL z&NWJR9~=uF8$#wdh^L(3gcvWD&aaHBQwN(CC1X`8Oc zM41QmO1?0@gTZXj2&5a?iM26W;fY|D z!1;~fcLXR9r*I;-UpX%~n|Fm>B?uJQ9D|E=C>vGXSPfHHW6>ykG15i<%-y|h5j_05 z$u_2eL4MmlS_$F_^|^X0Mt%zDr50r#Q_#RI_Oif-87z7Z#%8s3s`8`ef)yQ8hx|O# zwH50o*}U5j7%$e^L~j8x!zRJ#4@L^D68# z(oq}WMm=L`t3w3DwMv^|b6ZV{nPf+dH6qp~(+PngNh;r(`itt1^kLH-D>x?3jyyfZ zgPlXuMKz?SP&-NxF!T$c;tsT%lip+-&bm864$fXi=d@ZDQ$P@^$(lV z@WXMLYcb2;8;tkccq6-nQq@j;#_>I*=u^m#=V!BTsL4>_9cEKp3Bh%oOQ~--?EOem zD5pW$387@+LB*jm7r{-}uQl7vKE3Eq_AxZZKorv`kq(nn{@As67$VOPYJ1*RHmur9 z$_+A|Q|M9KKpwv>NSfEkuV_Afy@YfhzrG&%T_)1>mNe0VmOSLNy_&d$(l{EiR31-azDimw*4W?jtqX2H=Ox9WIxr9}Heb`p&*-G?ie zf1Tv-r(n3y(DQQfr8kAX6_MMU@=vCK#->D@$PCdXv*llCr)J~ijJfMB<$wt7KBLnF z22zcU)=vn=X6j$7FL@l~6G?&B$-$-Ko5TDzeLLzO`Cg!4lS{3;s4{}`lT=lXqYR~- z8(0n(rM7o$TMokIi>3XT?a*>m5`ao_Jay>Pa!GVJT4=S*H6NKiS$W1kJUzP4`NIe^ zf~IQyfgR=SgC?a%B|juAy&nRHg;MA;TyHn_DpuD&W(iM~<7tyCq|1Wdj-8&U-m>7> z&LS$*6&;;B-yF|pYgW;5e<-5>ZJXUV$1OBMWpXzxT^{hK2Y8i+ti2Bb0CH3S0Pn%E zqG@A|L^~lZ^(-)nV4&Bu3HQerF{Un&E7Dp7ZpUCb-^e=&ANwdoDg+>nxAe9)!(dfq zPa`7c7Acru>&6!=7FMF;pe3xnGi+It`qvuUYz33z>7XV0AzvJWV{OrV9$T*7Y6|?u{mJ6ZP-4*A;IFIJI zX0&O5r0hm%fuGzkw2oD?hy0XC27@410#ojlY~7rCBiWf0i~F95RN^Dy%HdH}@e}6x z_WGW0OPM9$o|ub7URCASb!Ye^f3c~srS^Ak^%=y@cHf`v`!WDEZJ0skm5U6WTB;-T zm4f?QJO=V0$`P)-AWYG(r#!;7+t%HB3K_cJvxqE8K1R9>TkZM@jUk3^DJ?~C=}9|! z2)`PCc|)9Hu;d0ph4bo?i5SX=0@PrP>_%}?ibr`S7f(y-0+cAY-gdWhneLf)x^{rj8Ya79*06QhYRzu1Ob7Ri!>{iUa0AO-dr13{}Li z;cgF43AoF{BF|QVp4R)vS>So4={b4~g5wxDKZZ!$^@wTIg=r6;3XINgr%cx6Hly;# zC01*xW{dX=tO-SZKiR0wc3sVkkC+ZRO&0KOkeWn2bP8=Lh`bap!0ZC3M zrAB!4doWY&toUPuVp6&zj>q7ut}~A@mdk~`C=VH5HgF+I{58xEzAfJoMKD#n|2|Dr zQ~t+gSU8gfG=S$EF%8Ky_Nb7h?6bKgg~^f#m3dy5f0Q|X3^9G=ymhA#QGC{ID3rc6 zIQ<5n;<7~qzt>yhv}emGBWZ;vZ0u^M%f>L*xD2}|ZzkUUp2W3+mmHl=>4{J?ObH>b z=*Nu`bgA&TJ4eU@%?~{O-N1A_;%XadFYh`F&io z%+gCM85g_W`;2Q-m+!8j%!F8Io*aW5hUS@{Yt~@(&~cQ6j&lJO4aVv@E0tS`CfsD}u^*fQw0 zHGkIF)kF?2FBd(DFjdr=UM}5|MG+}h-j<5gM1rL?{Y-Ff&F2#zJn7nEF8kaPt%bii zV#L@kh{pC`VLQSED(RFu@!71t;8ATJZTFWK)jomiYrbGn*eiyu0;Qqs+-sdYUrXJK zGY(Z@b*mT9UE{7A{k|Je%_Qw+-<3|iE3&>ya_q;reNSJ0!M_k@kjPy(bNSn)>x0=s zh^F4?(CjG+ZPB+UZImCyF4^Gn@V2Qe&dF1Pv98L^Onu6b7AFouUUNk za;mPS;(O|3u85~RRJ#5n{m~S<;>d(Jo>80TpM@0bv}-i-jihCp9AbkAgQX7Rm=c5G z@lDLg>MyIWe7}Q_OzHoT!rTY*oUC!3|5nDk>P+^`+&3J#-mZ}&MDYJu?n<=LXgt~v z%oI3(DFDN--}0@%BSCnM+GW^A9S;;vC=$dP8Ic|wiC{%lAJ(eYg!(qGY`?eCO*cld zv|`JOs6#PYFV5WBJTjTs-XfFlcv>Qm12&Pa7braNvD<;W_xPzNS&$RA#oM{!NAzDm zOFjAUZR;Cg?u%l*g41A7C7|1I?)vL_XW^seDxJ;o8FxZgYyg$|vp5eC*;Q8d=fMto zoWp2k3R|LxO-X31VvN^3v9`7VbME<%V?|02?onceL5#h*dt zY!IYLCj2wK*tb6Oen!z1>iTpwwj1GRTe-EJq~AiI9^JyEe z@f|Nr^Y(PBqqfWx<9xMYLdE}T+Y3OMn9AEAz2H88Edhhwp+HWG6o(Wj5AK|HXtXotly;tfi1~jr-RY!u$DEQldHILwUZb!J zvP-)Coz*T#rq7LoLH@hX`VDw+!?FixPUiLjr`l^@_MdNm%d!WTeK6c^bnFM)uWI+e z`X~=P+n&bV54T?;?!ghrqVa%N{aY~Z$J$@B_prif55(H7;QPV$*V;WW0dnVez`_2h zyt`;SR{NX#os70S=9Cy24@CPrzx^irF4^{HxLu@7AC>=uw0EP_ z%1Z%*paA^G5~x{$_|MCKZLt5GwsyuQdNy{(F4iVa^z#2U6zzY88rvB;J6hP9{8tVT z0K|Vj|BD#H!U6;UFa!z!K=f~O>CZW0Ym=HW^^LPt_oL=v)(Bw+jTq z;I1vgbUZggVdafSREecRMc8FJzg`va>vKjZJR$P$coXH~{_2@Un`E-b>oiue097x= zPx~~1kXKnNU|sj$!oP~urD}n*Az3a8OjgEg61UuV)|Zj2Yj6dm4J%XEL@=+yX)I47M~C)1 zE5|MeI)4@TyO^g-yb!na6s>N3vWOmv?TNidyyg31hitBi!3=y!a%J*jb zI1g|uK^LgV!xK{Ldvr(4BY`jD=S6>Ba=yeEWEDAf1$FFl!9Ym zWIf2JPaXHHf0gLJ+|b4Y>IeU%YN6Yn2;@v9 zRvn7djb0xV_d*GW)u9Yf6PduGmJ}36m(tD!?D(4*l6bnIZNsJVf~q!nh%5QI;;10( z>!6+5)<9gV1r0%$F4k(;vPhGjp82$E-Ec2 zPG@7BqPFR{Ifm%7swQ2nTU4Fi9|9t&hNqf%98*2XmDr*!S=?d?z%r&0h_N)~kMzjw zv2%MDcYO{hAdlXWh`yK@ezUk;Du-`9FNdZ?Yo6lsd71 zx6xd4h%junSoo=j9`$u-%u-M_8|4BLf3%VF06*+8O~o-#ALSaJAoC4HNtO|E#ObfP zx3b*rFmCldt^tKzg|@1!wqHkES9kB%<@WJ1>B&Dw?EShH_S^p$07J@Ln^9>GoW=KC>ut&P|8+Z zB&{m4<@g?oL&uy-vtU&YsC_=^#k%)+P$mgrloFa*5-d;je$g zsVam3f6Xiuwp5Igt2i|IvZntMtVNlMHctmvIp$ZMA)*H6rD_57*)WhKXslq&6>Sma zl}b(?f_Bd&6zvse8$`+hS9&j=mxF2IXSd#xw<=Qvd~V&-WQXLMH$vd!Pq*?v*!f|k zM9jjfpLgcQ9Aj`_8|9@G`=Tshw2P)W9U$ocks`s%*`<6s5;N6{(WJo*OP87;H=2d> z=3X4pzac6v-lFjL)HVbNj~EkGGU36G$`izsI!i$1L~WqVSsQDxcznBl)A%b$X}*!n z2aRfxIBwvPL2d@)Qgo#O?ja6ivPsp~m2ykjCx_rHvxai+Il`~hQK!=sjLAP;x?TkF zT67b;lR{MprNP+445FJD9x5h>ynA*IgWn3}OrfwbEb%2(Q*`=j%p*6zfrRgDy6Z+n z_z|B`)7n#D$LHMyDUJ;Pk~U=#$BI{{h+`(1dEsFi!)~p}LV59+cWg~-- zkt!;!9*qUe_H}z-biIm!Z&|Fi(NS%UIE2@)(bxwRNrANxrofi+{-s~6(nw~?POn!f zZeCZrVTOOip6$GN(9BWkC>(cCNpru9Cdd*A4r0JWAaNRzJw0;JrC_oH)b>Ww0Ze3V zs(cMM<(E3Uh>^vH(8jHAj9t3%xLp1#P>~-pF6G@$rimaD>ly7$W-IVu-yzoqcku#R;H9)nTKq zfN&O6g_3g6Zz|QpJhFRCA+=}?;Jj0HnG^eH>%4P^7pJ_zMm;dWRp#+$M?;YzrGePj zYb;mEFrIWaLi{*&R&G{)H~p1X3u_s6k9P8ObGP{$ufGq?KbVtBW!Zz{tW^3w`K!(hC=xDh;KNw*6=*=2?4saQJJQ@h&VtN}Me z4bnL_mt>RrhyPF05Uj|8>`rSTpgB$t8-#e4K8ufmMX9hZKYc#As@*KyEMK>8xgsMS zbiV;*xUP$!Gd2cLf z0Fk?X>b&jp=GwMb=4z=z@3=9Fuld+gk!_jk%+N>E~xN4c52N#=gG#;b?1gU97e?=&3J385!XCPOo zNIIwVqHSh9o~VuCYxXJI{pmchuMjp9Z;Hd_p=pz<2Jd7o>eRBU-4r(jdu`5U@znQr zuM9(6{xB`=2)_zYsGdY?Qr|5l%`4cQ-ap-MGbp*6x!>FFrt2N8)V26`uK=oN1u64S zPhQCH3l6a!{XDyiM7#8twHLV#SaeXeE3rhoYWR3!$Gc8o4iAPes{H{{19C| znDoybR2iHu<*o5qiL13vp`Rd6Wzj!tCkXW9O89!JN7+>TY3Nb*}J)h z>JI-?xH^ym0O0=H0#jO2SX5R?bXil&X{!a*ceS?9yo7lHrrUL)$R?3|I59~Ecbs_q z`3O-eu(M1u5KyAJrMG976P%zPz0$XOB+0yes6FpiJD>S^VOFJfGDhLn#-c-irsr;@ zHyVD$#ea&`0CwIJhb;QjehOg(tj%q))mwU@uF za?|Sh<>tlny{)U$NB;KaW_dI$OK5x7yREnL=PeZv{cGjjHCeP(^r3`I2QRo-`#$51`HM$g|jYzIF^e+HJd|wG8{w1BV}p{P{;t>*aL* zRtvMPAPP>ypzOKB8i(EQV3)w*(&nHTJk->R?xB3^N!s6=gnErjv2BKN;u9nBKlMXm z=ZTagH}bf*fx&}m3KUj>b;0*wx0yl~b_-#lptKUeo?Nb|u_-k+I^b0Iq|MEPV&)Kq zA)co^kGJBx+(U!b{p00FQI8V)*~9P`1G*E8t*kx%Sv*~WQ#Rzi=$7^sOZGI~;7||g ztS=SIIl9=62=~xN?GZqzmYs}MOgvLOtcx-UloETkbV<_OZT?r)lkG z_i@&D#+3)tx0AKpKJDAt2@na4O?e$iHd!LhdTMK&QNH+3qx_u z3xB5iiz0oB?SBMliv;W_IdPy-mo*0$GBC| z&W$Dl4t^AdN4{R<5|0rSb(S5daV7wF$yP+2FEtl4h8RJ>c7+~(aW$Hhkv8Qp1`s3e z?DA;1qKlMHCmQKusw;UsM~)R&JIMePQudG*K&eY%O>YYg!V$mPaNV=NS~a>N@h*Q| zXq68;iCp>eD0oyFZB9G(T!J0N+k4A7{ zrNb1DUT-S{#)A}EWuQ%)>my~4ZFMbKi#PI|?3plYT$RpK-XilAF_(MI$yT`riGWJ( zx`+IBBL#%6kq;j{1!s*NxXMry|H=5Sw0$~eV4+cku`?BX|5DbJMBWb49e(1GBmgl{ zMH#CGHd0yeb3U?vSy984=gbL?Ti%HreBf^pFTDfE0p0NShaHDpOU{go?#Bq7wwj_N zDPY|j{2zb$ETq*nutAj9TNKWGIuxxtaCna}_oY%vt1wJe~JFrB{L zcGzxsSUI6cEBzyDt4}mIkXOzum6W?6jApbCHLbll+NoaWbI6>uc#wy@`1M(;9_(J& zZgM^bFk;Q}H$#7NHV3kqlWfgp6eEU#Sg#IIP7E_(`kmIgQYF_b>har|=S+)SMMpL%b%LBVS%V8uqDQApuPlww z*N)sriMtR_tlX0kK~5Hg(asTrl|qlIF`Nj;KYxqOAwi5BYtsqQzfBrny=9 zj(fG+@D;2~0$;D-_|7VmYfF}W@J8htmQTZ3QLcvMXq&p$L7Pa-Lb`ubA~P5038DnV z>(e2`i2;+S&W`1;n97j%BEeyilkRG#~_Z&#lZ>eot zAL1f>GM)KO*iybg9Rcxh@r7vbl#F?xpm|{)%&RI1gj_~VO?e}bb{3dFg#@;uMs`Bmd5@hrhZ8Q(BpT^a1W`&%OI>vrHfrE-x`6FCT0sYMZh5&3-C5&SDn^~>gxTFl%72`|PplpF1C=zUb|FcJD~iJU0!P`75wC$?x; zf@iEow6@TY#5u(R__`}nbHgXJ0AU=l5HU_}gEVDHSG#s{5J-!_m%?bQRF;J zcbayTX|dqBOkA!DgFmSKwd!U)&tNbCYeCmQD19hk9XqUNG?0@5>90brfiJq z89EA;lT4K%ds>K5D&gxth?kt-`Xt#8WEVt>Z;+ghUxj(?3P@#Ary6Aw4!z+>0u>48 zBrabBsG>#ubeW9-6;eVO2sTjGP!UlE_F{=9~UTlMq2UXhz-9xZbm}MU%*CJru!m#@qKWa?Oz> zs*c@1a~{sc`me`H^5ht2U2|y}N2cEq-R3zCZA0fLXMJ{}nOtJxmxWfJHaJUfz8miT z<#JJ3XCiM|C$Ca8OPEE)0Z!ro9rAvTMA?+#J2U?d_DH1aoKIiHV`u6@xVg$=d8Aac z%U~(}M%BFc7%6R*G!P;Cxz7Z7x0>ey8+;pTdG%C@+v&@r*)1A@ZiZ{F(PYlDv|;gKeaPs0X_Y$Yv# zGu?^t!ZVm|rX)sVnw$-@$9U`2KFe{nV!a!N!2U-1hyWOr-<#0Zb@mSnZe&`BWA9nG}r=Z4WFCnPr$MPAH77wOAOUNtH zp*e{#j$9E-h9qlUZR=~cGuO~nMtYxN(p^w!0U;;O;XSJS?^R0|eXM0y~n~%;8Z)w}dH^}Q%R%iRC;HSN-TddXK81Fvg#apnb z6$VRfr>9eI=g0B!bNbq-z_+*E z?~}Ty^TXra_x%lgbgc9E@OnCEi$QPyE3DGX{rK>+((8Hu@H?zC44cy55q)`X2Ako0YAsx?sFCkPY$Zl?RVj1Qu!Ds5g)O1$<}FXqn@}`sWhO?)0eM)c+JfWM#nX^=4%B52dU;Wh zKEE~WsVRYAmn9W*1To{gRI7VOk9l$2*@*x;tEp8;)wx^@$v;;RO+!O;Yz* zRc5Q*{`M}@KWIZr<5L*?PasGB8iNjJzSi%ujYW3+x)l=wHa#)d<&fX}9IFF2KWmeN z%q;cTTl$_I7=LO~XN*TB{Tp|!I1~S<4H+zM3z|srRLYQv){=G9#M0U4u}xF%as+AZ z3$3u^g)Vueq;BlaY%8Xmq2;z%V4F!g&|$a4y`HhuVNV(d770YMOw~t-) zdv-^XB7%dPIp*Hw+=ISv=a14&SqquB3A6k7}4SCDD60?9mxLmF6 z^>CcG#rR;a)xCcGY%j7o8L`!4?Mm@_214J_+x>1ri&{=`_iF6W+@ZHqwYtAKk@Z&B zLqE9rc)2;b7}Wae$SE^SanfdK7!Os*G1vovS3^1$$aoC#HFyGT7i@mq+XdA z;tl#xjoHe5pTofFJ$IK)IjZV1Sg$*hOQD+iqyOy64$*jU2M&zEFs7V@F_^s8To> z6lbbC5gmIl6w-54Y+7p#c+dax+>)O$w~(8H(0BwWWkK}VJjuIdImpRDXxzfSyu8{e;ZuHKviIAfh=rU}JSWp*+Uq1M&_Sv=RiMy>> z0n>ZS`UkYYzM|s_?hCig$eM!R(n|BKerp`A2@VoSVV=`lG1ULB9oBC>nqr-Ygf=5@ zewu@`v_zJ!kr1Zh489X|0)Ux+EjjqiJhbdb-`TZ1+^KCP745M7*`tvk%gZ7p#nryl zLb^Q!F>SH`%>bhzP~G`gy`~0WJdecom<;j*|6noDJPL4KGGDUsP>8>+KA1bl0Jats z-iom*Cyct*n2?|r{Q(eMKAy?u;7lDtKJGv^`ax1uk6PU$F^Q7VOWHV;+QbET-9ZqN zIRZO(EWp-b7wp%0H%W`2yf-l}S8btkl|6j4Z#dov)mG$INPFGxxno)YAcvJd7C?r@ zauAuCAxe;icP<1d8XKE85aQ0X2b+h1`f+lQ1mUIB+7wGNN}aTw3wUSt#}`T*u+(C8(=S4G1SU4o*p^OFf^sWlRy+Jmr_FC8JmGP$W} z2uYVEenC3%sqq_A#+n@q(J`Z?{}ME^ZNPHaa&lEXG#N>`pIaP>3w0@HE*UWlJXI0m z?NijO9-E7Sk8l3@ge;gPb48&@bM)Lqd=aMj8#h*GMvT~R*#hJxm2i6D?V33t{>6pI zZMwKGRx_V*L+Y{9A8~&urO)dc6_dm{X3Ei3RUIgY6}}xri8v-#(SG}DKR9R84>eYg zclZW!j+Fg+2(}W4N+|y+CX_#FCtya`9NTk0M0C69n2BGXKK3vkYc|1Y0L^_Cml0%3 z8hG;?;6|sPaRDyPV9psTkRTv93OiqX_Fk3o>R%I7m*Xuz^bjbtB%akFmJ2Q_zzWd& zr6+)51nw$51SprxOHGmvNiK|B7dKGTaEootE(0!0PEG9Uu{?=| zwsl3|m6N2ZCu}2){3oO{m~G8@LQTYa=yOkXooZE6OD1C$2jlxM(0fRu=OqRV7|4f**P8edL=6wQ8)o+Tn&26DCd}6Y(9{ z4{TOyeykh&*54O>zbrgdWJLD2-L4>NLdg@sosJF zYyu@yA&;_PUV`&PN>^V+8<#466wJ?CzEYt|8ieNjZ_mB3+N>)3>tyRHvqaBmz*UUJ>8rp* z&UKQR8W^A%)A3NlQLVJHIWOs(yy}usNxqWVbYwn>!%SAheZJUOA9w*Vik{)B^ppp5 zUNbc)_LzCH^P23jl4mc82{i)o+LMgD5*Th$by5hK!g22M{wK~9xnSz)voipxbB;Zj z)CrqPpVIpXTB&Mkz@>>2-7a=^y`oPtr3gVju(4TyfL8aAFy3D~uIyRC!RR3&NpqoF zx2+ID-<(X&NA?78+v3A`c+c>qE+XNKibJO;giD5u>CpzlN~m9(`rUD2rX(cgSG12r zX^OQEIGlvMh!08}JLQy%ih9^47bHeN^|oK=8=essCVLD+f6N&&WSPo*GebQ6(Ze^R zK^_-7hZT|XN`j3)gPvpn;z6}js1!qa#A=x0j#wI(!N<7SE79P469B%h-fqp>bF(AT))u-H@ zO&~bIOSaZy5U_Ui${2khS1}rf+ck_?IGz<>0L?yrh|i9U((&O0v03OAmd0DlRlnIR z{k(!fw*%zrijt%X?y}HoOBJx|nC@bc;Ldaqv*5Cqa;MCM*+6^WE$vG{>WY7O(A72+ zE`!rrn%^M4kgpuWB@tA%aoPfkXRx)ZK!A@#Ep-=AswChZ+iw#q(95XdU}LqGzASL` zWV5{@oM`>O)(vS>FEic@>UC>^9Qf&O{kq=m>G|kxZqO<}kDoQSwvJaH*l&jnpBvvk z9bG`3#UEksh-JlfxFX23%NrOiCI~WZ_(WjUIw?X zr#~_)X?M}s+#3NtUhB$Bw7@$u_G|31==M0RJS!7&7Xz%q>AZsv=m~Av=#MQ5o%$l~ z+5l^siH+S#mg;3pHRZB2V!L~%_MI3g={#$X#n_!adWI&b{ePT+&-d-35L?x47SIjro6fd8sR1oa0@kRxx8`p1 z2@3(%A6J5qFz_r6Lvzxz5U|W_3E1JNY4tFVQsG&#?qK1wcNkAI8cvPvp3QJG4=#Hf z+TUO0xX(ewZDYW#RWmN@vcF&5A)}Zqz9N+dk3otlccpe<(y9@!FBzqc!J_sv+Xe2? z0)W}s!tbbaLf}LTlbnqPanKXPEt)*%pC>lG)Y=Jvxf2JcVRyOD_}`uwDj3QLP=g!| z=b)F%n@Qd~gf01G){Lfw%<8s+qG{el?^9C9aFM57vp9k7s8SCg`*SVGyA~e^KkOx89o z73~=hsC5cMkO`^mKAYq`X=`g|+`!-a1ki{F-R%HJ>g%3{f9=N`8OPzaAq*r3l(@u3{rH+LwUr=WHa z!e(-4a{wQk+s9z=3~DlVzdzCU=4T?fbM1_JO@?@_a^y-1!&yw??x;I46ip84!QGvz z-9w+ldg5(2{QQagBq(plwZP&N{Shi_>jOXFPD|S@44;c5K(K#*ID8a1bUEFW4;;Zz zNH{Ro>0O^|l9m;7C5%5t82EOo&F%re>Cx2d1xc|OPh)s0Z42`|y%Oas&R(M~3#(-? zhUXdX`xXDd4QJ1=sa_HZK{yhzA~4-E-*yf52mS+KQo!xoI4dWGq~}(8n%VmX|F6zn ziqa7$;2$(_76bs`pXTkql865fC;YF@EuD#zy`zPVL9=4N?SIgLpVZ;GEB#|Pmka{+ z8R`B;9*NmY;_R+kfDtNdf1-ZADVjwWZTn<9Ntz^jUf(2GpIl#(x;Z^A#m+|XWFG-s zgV%FPz7h0nuhwK{?Jr9Xvj>u%U-wGhZe{s6J9c(9e9!?D&q@ICLeI^+@jczsw+gR0 z?_P6G^8y6nz+a6=xz{@DTMH~=Wk&n`2*?r@`E!nb3* zV9LWz$9J~9LIE&xT0aSoyK?sX%mI(G?XURD4JN(|8b=K@zf?eya@Oz20#7gHXs-Ou z{L|ivWN%+e4;emgY@~MG0b?7Hak%-VTezogO-Ert*B%kkBn_b!@{cF3f`#_lR2`)_ zPwK4uQ6Ms^v_vll1PCW_Qot0BzcevLCr2cF+YmCj=@a7-RG{5;sF$#cfHsy$88Hf} z6)=Tzfc{}mj+CpF^a09>0utGb+or}?;>rA40<`iRw%YWLU@{OQ#ax* zUw9 zt!d?sQPsqu6R2Pd1cA?AptyoQbV9uhZ%63|oM4Yld0;-?OQtts77Y9Yh*dGcXkf~_ z7TqHS6X8Ogg}9QZH%1VLbsDMQ_;$^*+`yWH674F+e``)Njqci`{Pfp$lV%g!PZsL zf}%vU=`R~0Ec&1lLuVxPGn0OMX1NQYhd3-=v!^YR=Ff6oeLcjad$Zu|?AAi1P$QlU zGHa3=Delw0`m3BU`PCP1OCEV5g-e+DCzl6Vl77e(Q4Q|Z7d*91Xb|=!YfDX0M_GNk zmGI7^Y_OpDL2m1`Rga!!C4Y29C@1kaq4B<>_j^Zav??EE%`iMyHinKY95By7rgq<)DwFr`}yD1f$$&-21Ks9v1E;ybJcNLg=-iPNhlVYPi$@7eD@mNsAzw zVd96q=SQ}RjKoKW9v=E4hHqda?q?v1{N@DG>Uky&6D+k(E!8@&HM@$YtZAQN%6P=A z7Q%aswpwR=6?VL>a`J@I`F0*PEoDv$bLxo>Cl+qLOI-^K^_CHo}K_OZT!->lY?oy39-&a ze|%@Z8_E)AWE6N*ve|zq&f9t5T|FrNvyUCVVHxB~aY#N=j3Qx<2-5D|FHVJa`FulR zmz=b=a-N?ej#2!A&r;hZmYX5PukLWPDQQ6VSu~a~Icwd4aA2_FEeII-%piBN=cOIR zutmP$wIv={N)&t;gT&3GSBf4YTObNb&~E*-VcsGH3b+!AM2;4Ol(@b1(vu-a-M6ARSo?eh ziW%#)>Yjf?)FtAuc@nO8$you-Dbc8+>pA;C9-r!zSY+K+MmraJ&2JN<5O{2^uyn=Y zPqID^pW4@@7*2|dWOffx1y|hx_h0l%J4D+r4!`xW!awq0>vC4(s0I^u5Od^86P(#B z5o>Q30kbQ4UXORyua61xsaVRW`nadoZ9XkDX;}^&upUB>ZsXMP27N?;(NGMo;T4O< z5d{AI%u~WaygWDLScnulMARl=LM4QO`Smf(*i_iOTcoHd=RQjaq+Un&nsT><8^z&1 z!=5%T^nM}3<4>ngZko6N8>8N`Yn4X2tXXG?#RQpGd(L^4-oqJLzqz$U2S9xlOuGKv zg;Q`8EOO)Qh`WyEF;{^16Xv;Qb%PB!#g683FI5U^SgiXa^6<)Y133jH{>@eaHeK4jp2vB0dV8am6*Ki1-njBp&DZq2{!3y*sQiSr@c*w1d zq=-otDK}?c0y$^ae1AnBnZeG!}*?hus69$UiN9OZx7b4{=LQ!Ld0j6z4d_~l8uY)?RIvkY(bZCJnKvSwWJ$FZ7 zgmZEMErCCKsvSfJLak~s(?$hv+qT;1S(PWTu_;$D+k3vuHP7ako5(C+Y`1pBpLv|u z7KrC3_+0^`0y)u`Ad+_ojE6U*{B0X+F=tW5pgbG^22auKU+@9C_Fg&bm~z0r`g_S` zJK5pXbvZv|Le!2qtkG6m;1el`Jxpq&gHlz4W}5thcsu= zY1vY2f8mW)j0u3<_t!b2(4vks;5zw(^bbeG6UajMNMs=i6T8v#R<>(`;TfAVVlGSov-`m-(Elc#hPeWzRp-7zf&`n(R+(lS~O?a z#n-)9e(`;FT9P$YKL-GWHw`6TUxy}lJGg7a{9`=1Z#EsPN{$p#q4vml^jG?g4B(*y zHmF`Q3iO;Zd&Y0*=_--nBa`c{R6L=Lc1%#bK_lezA8GVH;UaLEfwB(c1syfuUM1JE zBqDM22@sGP;S}`bd;ji0RY2Ls(fC1VH3@kR(`UM%CulO5FxKpsR-(+_d&WDR@@1 zLbUa3_ox2zO&?c>*)A*WWj8N=*P0q$S6-~A>-s3DD9sLEjP&HaGFl&y7wZ3)-o_LQ!G|1*${KAFa`q6GH9#{J8 zfWvJoQ94{Zi3U2ts!7{UquFyAux-Z9oM=1o8k+C_HF9TX4#&70Fiul%uV(p!YWsC^qNz5pcRxt?wO>i)6i zo{TnEXr!(hG#E7d=uhHmda{~Aog)}tFP_{jMQWRYC2kHtE?0--gOye>VO%~CeU={b zk|W^j3$)J8mU@1&*Yh>EaZozP{L||sK|IBQ&Bg@S>&gHp6L>GSZd}AP?$PF~DsES8 zBKzpIPC8@RrtxIAIjG6OFYEI*MsTJ4-+sboXhV?=m&mF)x=S7O8@l*@YP6xi_$AC~ zHEC^)R_mYSf@1vZ^;vk_880iltycf&h3t<0O?JBq8A(tLal{XxQKYn#3 zap6iIQ#2tGKYeN^B_`KCas0LN(#bTN7Ye(Wn+f^1uc*cE1FEcd9G&w)%{{1{8oQPTtqx!-{W&sS!_ z=&ThGzeS2+y?>UjDt!#;^1e|R(g57zZei>$*JsgBNo~22ni<|r*Wmm<-v;|X|CdQI ztbbb;TU!|Zk7=(3iddl zf48@{4(BzpGczDTl19`GGmQF~8^-v_mT_c(0iBxtO+?1od{FttBf0)t)vz3*FJ7sq zhEC|!JmE28G(QXK$E|nAa3PmCY}Gy3%40gpV^CYd11GvP>v3S=fgq=pzsE2o;!U=| z=`~z_R88^cgJ%#gC?{ve8ddIrAwr{c($)>*3#3xI4(2TPsNXy+lFnn|A*(q3z#VY2L_y2X&Pf?Vg5S-JidFOpWp>U)ASg zZ9ePIlN(Y1CkMeu|7u`@Ixwv-Ny-`hB8i;6h)7bqYk)o<)~o~0vBGTp5H*B zgp~$huhQU|vx>oRh0|G*cDGb&@E{(jK$zgx&huKxTzF2vk4rvC+eDS_8}bYWP~%7> zZilN9YcO&dH>mVnlrJu3%#G_sZ@I%@7~x+>eFInfrPzrdZp=oP=eY_Gr8 z6j`v>KY2d1)IB9XJ^Q|UlzKQ}9wc0xKbII(DUILXK4>)cE&xquAv`(2r3YIIcyDvQ zBy(1WDWq&b8krsm$y7}j zlhX6Tnj1vjX&bnD!-e<<;pWPQQNorPB1aUmFvumdm!ATmJhEF82^+dHa#(xX-M0dd zM@fIC3&jVWV17OUlZOl#eR(q?F-6eW4nf_U@(a}3)Wv{k*DDQsayi78KlY?)Oaqig zVNGGdu5iypI8Z6GB2B2sv>)J}MD8fHObmFyAGWGsFhm$=-r6GN4@(V^1fehT$gMGD z>DHFp!!b+E0Vxb365j;Y2b%~EFvP}d5>;4e4?yipcygm)1PdM~K@t(%l_4*&KsL)D z*m@U_sG!*zO2F>-x^ijXi^vK?)CI=O(gsj;tN7?M-P|n$HMOJ4`%h|N7aNGM{Wl9o!-aK509hydivsK^O5*W z4cWMtgYF9tgW~x8{OrGO=)>?4<;e9rxh{0jcrLrvvE%ZVsdt=row>ia<;V}6aV8DM z1hZX%xpj4i)hP9Pq|hkp;6UCwR)GC}Jwc>!^huTr_otDXkef`xLC`&wqLp(qKx?$h_HM8zfM}KK{hw0-)n3%a2u5f2@(%mo*5B5%1mi#jS66Z4IlY8e`|&e7 zh1NiS1E`Kq19KugFh)6^jKOLkmPa8uLYvpc8Tq?(U7Z<${(8)X`2F53#4*Sj^oLPU zxjZA}@hUZCktx(&V0IX(SDxg5*J}eAjKTHtr!aw!{wyKUb4cKvl1LKvsgvEKKvH%Z zsw9T?0prz|l0x()1dySs?<%^F+dBAQ&fZSoIm&?DXaN7!M|rbBU|0+=>NFzlzKuWu zA&ekmR8Flmr^#ZL6oym{$wbu$R`fYy9b+AU1p!`cAWQt_M_r=8E@X6;uKA~Lypm=} z@>G7X-!r__Gm0k$hJf)jFDjAT*Jdxu$AV4c&c_+nf72)i>gtT8G6G`>E!(+R;0RFc z|1#X1?mXq-Y(*`UHKeordo*mpk95zo%7|JiV>zE@xTSI(ChGOFv68EU9c88wNmpJ? zovfZHub!txL|y($Yhz<}hFo{kfK$`grzDfOFcJ5j?bCNho`R|gCag`5e23DqqrkDk z%qa_rR0#3C2XCyP$~kYCTAm!OV7eZ7d_$IQe`uDVk{~+n=wXzi@JC81!O`E_bKFQj zh1Lp(q`dqOP{DAoRLKEBT1Ng&8K3*o1bSg6Rz;PnAJF!v!3(?oM7;z$0|P_}#W%p@ z2YK7UXt=36@0V)L)u=`N$?LqlvwV55gLFGU+Jgf|h_b-^T?JoljjnHXJ<{A(a>je;kN z)}+l38ke;3O#?c1S^YSmdR#bHyPGtCQMl#u5;$a5GKyafl8v1S-^@0!pScc$qw225 zJWoBw8+`PBEJLX932T8BN*lgIw@8B*@8M{RtPhw{u?w3tGyaC8h@(xYe{Abr?~$Qgh!{aBclAmifI)yiE64y~n23WwVJ3^`iu*1E%sxJeSS^<5_AOPzdPKc<-~ZXcUg zt5|UFQmi3c&D_SutB+W{)?<;?5M7X4SQT9(%6oZmEiJW{Rh>KaA7%vQyy;BPnFz`~ zHBbU8;vy1X^GSP#>X7)_pKhNj+ zodvsW=G5oW%^oMN zv%{fS)$5qm&F7eC+o^P)Ty!|-bhud7!Q?zk{H-4R=y02b5&E>8H{jT@?wh2S)c8Mz zon>$w%eJM(3>LMR*8?Nc``-pCZ>C%yJpsAIB0g8TZL_QRCrH?-VQl3KZ9zyv>oe z`{`!Rw7r&2X@uKssb!2#(=2H=f>;6(q>2VGw#a!V?<@N*C!SCX5tV}$mWG)SrGd*a z-p@fL2N{B07KVHJi-B>ECBjkf@uj1HxmiziEY8KWJ&h4;EEE82f$54#_dVIjgKhx$ zgxJR}y_!A*&f81o{JP0((rFFzSQ0fnzg4Y;BsFi9687qH@l!MWjq@R^^stnoZru$6 zZ*h`3`_@xc%$t<5la;BmwlsAj9X9(djw9RV@H{#@yCeEfsgd5O(=Dt6faLvBkzK@9 zi@a(4SU)vBCGVM~%FobsMUPRyL*R414$*8)BDgX;ZHulw&b@72;FNm2>uRCdioLc> z7Mc&SIc7Sg2i`-1B&j2C1cOf4J<}{iFk`{A;-`7r2$jp5dP~b$3xq3dGEvNjgEx_< z1PPS7*tS#C?+psoj7N1+Smgyxv|_o#e%Md?;RBsK4=9*p6z#Cp*1&43GU*q_ z9}@bpzmSY+Onku+5nPK29V!~BJ}vi50?u!pn}_ZKKPOZ=8TB#yEL-Oh4)`h6TNGVu z5Iw7f37s-{$zywo`Oa5^pSDQpsXx)I{$e2kZd8x`Vw0o=%z3sZnZ5?y>Pn>qm(4UJs8E16u5afYs4e;PjioKv4z24`?x1Xc%FF zBMU&)Uf>6>x~YWHb7_Hrc-p zRs_D`oxj-j7#TC{=Ac}SEA3@5`yvI++Z^0mzg8_}ekvRmrj|xlHJ)0jLbABB<+F(n;OI2?O3`0nguE}3yug2g0v7(2T%KcQ}cZnz)fGWEpuyojzI zm}%H)RV@oE2xsn^b0VHDk$A-ok7)tnvmw?Uk2(hSW{|*aFYMpgAuN4B-2)2sm1>@d zT;v&DyjVbD#{V&S#8-?{TPMuYImz%`@2QsR_AG*cf2L*WRncAwx#$g;-m71LOm*3= zzCIPLaiH^_+{SDj$8D60?m&*EQmYngL@lg4;4-#GPGzb&LwbAk$v8y;gA>D+K+OtG zrLgw5GJkcd5amj0YG;;2Z6_e3ZQFh~Kb&kvkcP^v;xEi_yO2q0M`;^F-L{(Ym|RN> z&`}{n_s?*pe_5qU93!ESM}cN9?t)D^fGlMkfLw-;Mm*jhIyc_&O5l|SwhDbmsv5|4eWzjH4hA&R}xzz$<*XJCGvRw@fUbI1X@U(Sck8+~^7beYjH;HTTRQ{jW4z-PC!)RXdD z>oHL)EjHW?Bab%eWD3J0am_m(JJVEt_r^NHAdATD?yry*iNkJof#Y#R|@jGB91)+km;2z;n3VaI~|46M0ur&RVT z8cwDL@VNW@WI={M-vn;rDnH4#nk}HcdSFClZt(a#7=Qm7_&!OCZ_DSe zW+~$zmj9~Xmiet#?IX&V&;)J&2|?EBvjhQS@=fmcyC1f};Oam4O)Lv3HLeT;~55KW=!B@`eSU{DmikH7ZAdg#R+8m*x_vXlf~ z!WLjG!^L{RfI><=NNankK&kYO_CEIVL3i0jUlCrLC&EZ~4yY8i()-rtFiUoy97H3% zI%b3=FMl4AM@pXhbHQh)MSvyAu0VNRB2}gGd{9loLSbNPh6j2kW?T*iimHEjsaU}1 zuXeP8Pg;ki-}9mR1+S%Uhf44n7Ntv5mj&;$ZaP>&N*AHhF5)KYel<g zzYexYEKj(OVwUq~fTt|#qLz|@o{L4*ngw9t#Q~G@UCAKDA0jSf^wW{3kqJ)U8GTr- z9qEZIZ<51XYW92Uns`lb$vm-Jtfri8X2Y1yZ14ohDYO>D)Cs$Y_vKI06tfE zq1lym7wyH_?$5wV6{;5-ow@xX_Af>OThE`FIKSy`j8x>+^NquBjg+S>XO6TWIQ$S= zfeZ6lS_u)J^WbXKnyXDdaWS|5MTF>oT8$KiUUg#1PgSHcu$>rmWs#_Gxz_k)wP2ZI zBH;CF1N#CX_G*KVu@@Ss_)*2t z`B?_kR7#1hnd8zR%+p-;hjWr#+_*NZ@vR|eK#hhHhjD9bP9)*9_6?AF(@J#uT+EH@ zlrJa&UvgHsXN8;1#wKnevh3%YMx*ypf>|uuTQ{d~_cMe-u)u<7s=j-6@zQw+p8rIC$fC<-e>(sdG%+m0JAt4R*y07Tia4ZBgO z;gfvh!f%Hh->N~|yM?A4EM6dIqSeinr+<6M^Pz-wAu)eXv_iaognyy|$Fv^~a-+z_ zp((J8qN8uHX611&{d(;kaK6xDP(Y_V!Zf+O(dTgfwHx)t*q+?EJkq}3vB6tQcVK@t z!Mf#F$7S9J*Cb;HqyX>!x#)J+ec!g~ybiL$fixeItdX+rop&#uLSWkzDXWhe;R=ig z0zxstrto8OS4Tti_Lk%ALD#9?F+t2G5my4)QQSH`8E5%;0tGr>AtbYTyR$Y^2W0=t z9#vnKtKv(Nl4_^KQ$^Lq6wmB<>PCg9OKQnCsAA;i%h7=?0rjUKB~Ng{(F4%Q<|;Xx zxUC?~B#z<%oHeO6Aj>4}%h|Ng#ea#wo(sW_taW?=?f<@&Mzd(|^h zj@iybU!r;Z>uOKk;krj>Toh2>Wzc4SWFC3XAw4T-YM%_7uC~3UjGahy>a2Q0gCnT~ z@`=7<`^ObFJE<$872s5@AA%ai%*0>t#pC8}fLMZ;@h2-rE;uJ1CiVH~zyKlgNYUij zoLTi^U+VM;?YOO%3&uXdsmeRRCR|wEb?mOshPiJelF7cvsn+V0ECH&?VzaVWlhtry z@7ru4!5#2Bu9^+ENpNj?u94QyJWNr)EKaC~lucvQxw@YMolEZ-ySOiq{yQ4a2FRof zUY`~o{r~kWP9mlY>pTt^m{szBvi6LSpek*XWR2v?OJmNj|5cV_|%(rg|&+-dg|u%j?)ZffEUK)f1~ z2(yjLV)~`^!2ov16=x+5)G96%v@DLEZ-paix=C#nhh!=0|3j}2{_)(bvx9^FTBy6P|BBV(J4a|G=3972du3h z{lcc$=P12;s|Dj4y(*jq#Vh#X~IlU_tt7kDI^kYdPYW3vW$?_JU;E zAWB{r%PrMk;W)Q2b>G7T*GX&>Q02PIFP+2Y6nt0UxWSJA4^fnCQG{<}%5T`pvC!>nshx0^v$DJ6&E>X$ zDpum5tZSHL!0ug4F+Skemll5{HEy$P`#hyW)K0L3<%x(EZ{_<5gTN(X8qIv9nRdor zqj!)ujlc4Z4u zULAQcCd2*)Dk5ggn(%1@S=6uD5L%g!M|$o~v)?_Ep%z)gzx{r8SblzTbXy~~U+L6e zzJ{6cCe(BJA%o1A;Nj=EOAULO7<3Td-p+s3^XYMUeGu=SW@EIdn?&yY8X8#ZAax7&d zvMI#>Izz`+*>m%`D&Ite@>O+mZvh1$ozaJriq!S1`{idnuFD_`cuawzfJz>ma#dbB zxpp?c$~L?*Z62@6rTnW6XN0a08Qk#E7ZcNzu4eyx?uGqsX-)|4gIX{NBKkIxRlb1u zkxSH8Bumt;+bBQoWghBu8Ju3f3_F|MeP}hJs2||Etv8P#8$k%tWR~tGM<-~Up9c=i z;F${(Er}oaGi}nnO}+DDIh$)@lNDYL&bv=>1hB!UAIREfB~hMn%iOjVV!c*L)o_O_6LY9!+C}9Czp$ zVLq0@6s99Bo(6Sq5f|i;Tnv_5)aDW68@dE$t;#zI(|vXSHfud z;H*Op1!h6;A#Xs!n}66$*W8(#04=o^^jV{9W&zVn$|Fg|4cCo=fb-P;^xO0_sY}!& zG}$W5(4OW1Qz)4Cn}bs{;aNyExgbxZBMCz-$oHVLCuU)AAVhhhvLRP3RqoCn0w9QI z#P#ejgN*_PKj1)_!nS;(8dMVFpY^@#-PjBWwfKC>Srsiu`b|cWV&pto&+TyQoNCmN zZ!G=eLI4Fi(^cr4HUcDtAx05~7LBq9nrm?WINZ=ja#L4{L3LcCL!7|bwd5!R56v-- zBY%-1B__Bfc0!re&gaI2b^Koi=FtKt%D#1p zXQDBx<8HQ$!_Ci3btiy{ zWJP&@p!!LH{H6(G$Y0jdiA>Vph2`l2KiwfGTy~K0txr;|E7y&Xx)vtcx6FEp`P0j; zK9g+nZ%2lmAyIAy>kuyVJUnP_s!xdm15pA4X{c4eXk483#O+)Wm|%=@bZ7-ok!eJ& zY&dEmdyKhzZ`K$|Mw*Be7|ZV$RKLQqOsxn#HVCR5TOpHAfAaWiFG4p973F+m@q|VP zKPf(`#FGn;ulM#N4{bEo#OexDc-FSx|CqZlM|7;iOX&b~bsbMsNWCA*f8OFzt=#xmjBH-5u!{_V1{ z$6fVU#hSC1XO~==Y0ZR+KiWEqU*7D7d$4BGjP;R)Vi!>SiIPBAyt@_LUAWcTv zB57vTezgUgad%kaeywfKf2NiP8q5%UDEjvIebJ0{55=yq%%lX8v))zU}{FBcH6_vMzS9&xj_jz!ZE%l)eU!}Pmgoe&VH1z$v z)ki554nMgrFJv z+$d18QpYBrk(F4!rP7sk%n8i}O@#()!C7%Q=SMi9 zMlA46?J>90G1Zo8sNHF`cJpYu z=FzxzRlnS66uNsR*R{EaieFfJK&!@rKyEvB?aHI7rRckkDNEkw^mR*4Jo6?_)=X}O z^X2F;t?TIG$C%jrmQ@c=DnIfx`)ii@rRZ?nx9Gjp*1UGN?I|6|Xev0!2;?6MY`$(n z4OEQv?DV%$5zE<@R48&E&8PMcsS)`ICsdr!OzaVoNz|USu?Zp8>ZQIsvZfAzcIk0^ z+IUkRt+c0*zwd#A4xP~Dx?5|1WWH^?>qcu$`~o+P`~BjIQJbr&it*)`!QK|JOPZiS z7A*d8h?1()#I0i#8<|sp&qKBu^6bHr0DT=XC)~)H7$DiLx`u6psPJr@cv=Xj8gNkJ zKy}Y{VFM9@_XC;$UA)#7w3mYbP7^AI!kfFJGm+$)bW)^cTz z&-8{N`i+@!JkG53lAd6^0F>x#*5zU+R0H9~&L6S#LhcKW`vCu0CObiiO?tzwz!!G{;`yg^WzfGa&c$0jCpYj4LWTX>n14=OQB0oRY1{@Q|_*V?bPxR<%M1K+cKh zdZQDo)U7)R_2Ev}!l3)DCFJDV8M_s-K#hjE#1PsLDH0w_G31fNmHe0!EniCh71&DX z5aV2zF~;LMMVH^^p#mE%*WneiQrooCT|4A(T1+vId}7FuzZnVvA}fVX4lUO=oL9xr z;GXNc`ojL(nsSucWF>`I+c=!9WB3aUJ_xsE?3L(D9)efmRb@tLp*C;c9gAUKxF%z zBF=pakYKAmx?_^otV8|`fvAga5a-(9U%N(qyy5$m;>zNfLSbW`qfUR~*?`J^`dYRoaEa)n_l&N(8{8K!uaGd%+@eP3{&teT(2&5xS5X_0@MWCkr?gA> z4-fw*xcIvMbH5^6lfZ;!OHxI%;uqH3qng`FJ$OSgwo>_&+R+-1T9{%>r>bqo(v&2| z?KK~-u&YD=n5vMkFKtkf9vDB5*MwPcE*M4617ng9A>A@pAKYmPL!4~5^8LE;-u6Js zy~|swmN;~K_Mz3HRT?IjsBZ}tnz^!~(;iqh&a;HlDBUu--TR6*~*+;)~?$R|*RP2k$H%!>!P1&z!Of2}= z2D?R7a`}w_lg}3O|03A>OcLuihJ%2rDP6|G1J4A#;gELn;)Zx zQ$$aYtM1kt%xB9YvD6OmH7iM5#ZnE&U?JE~?O@t`$`cWoJGmUB7PM+eV}4kb39Exa zzL+ppr$^Z385eFj{Lpc$Cg$tI4jI#vrH)kW58R{Zcz!6CgZt5JAu9}J$HI3z`sFyU zifj%-EGiG}aB9?Lnd{yRSj+>@L{2OO1$ei$%Y%YDk!!gKXP1U%n~U6N$gL*IslT>cYf&wM+!Sy^C>JIEZ!=SUe#@j$we_vQux9c4Y>u6*OsZ-?rWdI? z!1wM;E3|=Lph}p__R^LlNVgs!-3GQy0CRMPoBoDt<1(J*HU`VO4O^->mnVt>BgyYh zUz%|Vaa=xt=Mmh3w3jm(^MC&4jmpC;Ko_}Vey!tBKteStM znNefLx;OUu&cku>GR>W#1OaEBA(9TcCjptW+&{Qtb?cS9U!c71Y(?E{F_g(aEC`vD ze|HW%p#8B6UPy+M9-P??GVU|n$%lgx_?2a7tbM3v{h>GbkS4Fi14m_!M=PQOhEqAa z8Ui1hOpTlf|Hqx1log*m+}tsc2@&4x>n+T?g^BoQ1=%hf7Wd~Js7I>*V zg$nWX(-olo#nMMjzcdCmsg~oyid{R$3;ih9jXd}IK#&>?{zJi z=v-a<>51fJY5mm>l>3YQoryyX?)0wW_00O#Vm}Y|h4Japv|J8f(4m@v*S)WDRq*eE zp&X(UTwZmT5qC0Mq^Eg|b)d%g?^?e5@~=?0>J5#_dan%;FHG6}Ik(pFr~TSmB6DB- zisXYa{lt89m*3*d-D?9@uYfS$e`NhUX{nTg?Hkz5%DivuL)&iN356S=IPV#@Kzt5zj=dbJZR4e~ zzK`tg*h3X*o5;ewAW`|u_<-m~Dk21TGWs=hc7VDQ$aw+K!RRLXU#ijP01m3wZ2d25qsAD3t@YShFeNz0k zRl);?x2K+I?{E_0o8WFgi`1G*5PM`XD|d197niK3bWa+Z>(J_{A!YO|C9vJgZyb;L zJeT=nqazp!GS`IGqswNRW49)p@>J|&6(VvAc|R{`$%ahx+kM(RMpONMWp>Ki+L(HC z<*TN3`eDd`WAojHqTa2I#h;FCTk~37;{Z&qT4`^iF(QRr>gv)64)`*HkWpTmd!YR6 z&^{@9AweUrcs3Qd;U*Wmu0;pwBVJ_bD(^erjO&Q2BY0mqFfb=*z4{N8BoY96g0bC+ z_abrqpU{x*_{@O zFj@p_&DnPB0aS$e&0SO1fmJ&`>fC!cqTtZy6V;`K1Zo{ISJM6zD4OJU%fU{9)mnOrA| z0fDNZL$+}rT3h6#fel)kfxSNxE1S|fZ#*&H2QA$j&QqLB7G6BMTA4arfmIU>1Idqt zEcu{-cP}L)Qp(QX=FBGb45N~EWxZFz)uL_rLpxJKDGD;ZFqXe6Oh;-@0^> z>um>BLl~oeK7?p~UmMXsw}g#oVlBQ&C$ue!FWiBO!#&CG4cM=`?rOPlZ73_1L-x)w ztW9e-%Giks>;;kS;P7oOqg*f3<)z|P< zR{*ifGUlY05yt-Po$gDeqRwgd&?e5pp|t0>*1h@y$9l+Ocz~ktoOYPk6-vt29OR1y zo2CvgD3rE00j`S{4%nHVoR9KViUy}rHm-XpZZ^<)SC^o?CLG+2d!p11>ufNIx3rP$ z%Divbq?A|2?eV#Xho&)s9+jz>So6faqr*P=!qyfAuXw)UTj}2jaS$V>7>a9rSwc1Y z#&OoMOy;>izjn{IrJhuK6SfS7TVK_m(4sWhajm(MG;Ci%R6}QzprqkbdqAaR;SW+r zkk^JUP^;OurA9+r*K{kTGqaF9MxQJ12LkW;7fI$feWV;6INKM!C2BC=0*M#L)3yp1*|=Ulo4E9_A0L*L3!>)7@r< zLJZ=B2VG!Nsw6DhhxHutCx%%V0yFR99K`vdL9iq4e&?%?nFD!n63hl=1o9ybDw;jy zCA#q%0cHH+Tnd_wVuVL%7O*a(M)|kOg9kltw;^q-_R8e^}GIRPC z`B9-1Aro*OeQTs#>SHuO3Hj0l01$vW^4lhr5hTtG8Cj*TC1*_9Uoh(C^mVHbm#`>E z$Bmxf4(CA~PgVhGROzxc{!JRuCR!fBC5G~O4<)i;7@h&qG@46j0Q6xd9(O)->Djjy zR!&)4G<0nQ@*$YE9kJ26ei$_s4B|P*F%s^^PZj4UU`Pi!ZD46Sq3)Pjx)nsMcZI|; zF=){XnH5qzdA@PP$$kTDn45XWnP`-6EV6Jpu{ZEj+F25v#5z-+=B{&jNnes1O{>73 z@_9(@==3mQpdb63x_s<@vBnu7mS1+XB OpS<6DXRy^@-~JcXoi1(w diff --git a/.yarn/cache/emoji-regex-npm-8.0.0-213764015c-d4c5c39d5a.zip b/.yarn/cache/emoji-regex-npm-8.0.0-213764015c-d4c5c39d5a.zip deleted file mode 100644 index d02d887971154b33a13ea77e651c16f17020cc5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11951 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 diff --git a/.yarn/cache/err-code-npm-2.0.3-082e0ff9a7-8b7b1be20d.zip b/.yarn/cache/err-code-npm-2.0.3-082e0ff9a7-8b7b1be20d.zip deleted file mode 100644 index 305858456866cb1a9e1ab5b9e5f2fa35cfc08583..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5769 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 diff --git a/.yarn/cache/esm-npm-3.2.25-762b3ebd40-978aabe2de.zip b/.yarn/cache/esm-npm-3.2.25-762b3ebd40-978aabe2de.zip deleted file mode 100644 index c1bfaf13f9a0a156a5dc47c58e2526ce041e4d58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 92145 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 Cz<;tf1N06z<+=dBAChqEHzU=g<>?Xa(@ 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 diff --git a/.yarn/cache/esquery-npm-1.5.0-d8f8a06879-aefb0d2596.zip b/.yarn/cache/esquery-npm-1.5.0-d8f8a06879-aefb0d2596.zip deleted file mode 100644 index 6006b96052dd98853626e3664e429b8493fb590f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163213 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 diff --git a/.yarn/cache/esrecurse-npm-4.3.0-10b86a887a-ebc17b1a33.zip b/.yarn/cache/esrecurse-npm-4.3.0-10b86a887a-ebc17b1a33.zip deleted file mode 100644 index 97e67b46e5d82fda74c822b3afec2570ca72bdd2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6250 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 ZD=9T4-K(nm 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 QDGZ4DAGfA1&A-0>AIrc@G5`Po diff --git a/.yarn/cache/esutils-npm-2.0.3-f865beafd5-22b5b08f74.zip b/.yarn/cache/esutils-npm-2.0.3-f865beafd5-22b5b08f74.zip deleted file mode 100644 index c163c32a0e8cabf023c1a51af37c47e3f8ece89e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14093 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

hbrUo;d(8S>Pm$&xbGnc(8o!Npb+x#oI zcW&;#6~c1ksU_rvRXrj2B-b~473K_n{pL5VwSmR*73T9qJ9+<>iJW7wg5-Mx;5fkm zVvGtxN%N`l?C!c<8m>47Jh#&wOI8#9p250*(aEEP=Vw|t1LdCblgOBzR*l>2!7A5N z8TvkNe7L^H`ukn)oRl%!djZGqb_r9v*>2O%kDY5^qt#dZoq=L;oAc=Ujx+1?qANIW zxj!Aox0BzC$xB-He*9s1>i5)R@ugSiWiD^Q?Aayumu@rulR>?e&n|u<4jr%hFw8Ip z?OAQ@a(RtU5(`L z(( z8bP@YdT5itoRMlF)MU_HVS-1PjSWq60;$+)3>R+7j~=8E2giCQlNH0$kk8

C=F& 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 diff --git a/.yarn/cache/fast-deep-equal-npm-3.1.3-790edcfcf5-e21a9d8d84.zip b/.yarn/cache/fast-deep-equal-npm-3.1.3-790edcfcf5-e21a9d8d84.zip deleted file mode 100644 index c06008992c95c9fc4ae89587b5390d65c567a28b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7393 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 Ax&QzG diff --git a/.yarn/cache/fast-levenshtein-npm-2.0.6-fcd74b8df5-92cfec0a8d.zip b/.yarn/cache/fast-levenshtein-npm-2.0.6-fcd74b8df5-92cfec0a8d.zip deleted file mode 100644 index ffb76eb13cdc54d544f86fd7d4b3587d25821ee9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4597 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 diff --git a/.yarn/cache/fastq-npm-1.15.0-1013f6514e-0170e6bfcd.zip b/.yarn/cache/fastq-npm-1.15.0-1013f6514e-0170e6bfcd.zip deleted file mode 100644 index fd84f16bf0e6f3798d7d7b1449c2a07814fad7c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12375 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 diff --git a/.yarn/cache/fs-minipass-npm-2.1.0-501ef87306-1b8d128dae.zip b/.yarn/cache/fs-minipass-npm-2.1.0-501ef87306-1b8d128dae.zip deleted file mode 100644 index 21a91aac75a5dea917a1e69dd3773187a21294e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5203 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 diff --git a/.yarn/cache/glob-npm-7.2.3-2d866d17a5-29452e97b3.zip b/.yarn/cache/glob-npm-7.2.3-2d866d17a5-29452e97b3.zip deleted file mode 100644 index b2fa0ac329c25e6e216c369384178f4d21ea2cff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19642 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 bIMjbDCBmGZT2cW3M(RUDwFOnoU%&nXV>L*- diff --git a/.yarn/cache/has-unicode-npm-2.0.1-893adb4747-1eab07a743.zip b/.yarn/cache/has-unicode-npm-2.0.1-893adb4747-1eab07a743.zip deleted file mode 100644 index 5988a7e8aa979e2e88805c45a1e28b45c88a6a96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2730 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 diff --git a/.yarn/cache/humanize-ms-npm-1.2.1-e942bd7329-9c7a74a282.zip b/.yarn/cache/humanize-ms-npm-1.2.1-e942bd7329-9c7a74a282.zip deleted file mode 100644 index c09856b3348783821ee3a4acaf6d5abf3a472163..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2775 zcmaJ@c{r47A0F!<$udNU%5E%UIUiBJQm*J=pY|t3$495`X9}89JSRF_rpHyF(41Q*&`{Mc z-P!bIzNyQVsBWM@1KIealJZG6npN$q9;7{Cs<>usf-|)b(JmBo@y9I4K65S^edYiQ z(py4Jwxxe6A|X&^+M9iIaX2)PXHp9c*Y~97v7SX_ikTz<-xZ~Kp7@-`HdR_YN?pW) zRW_G35he41&|F$+<;WK>75`=HK~)jBOim}S zw60H7wyDN&31WC#t+}|_<89wQ5x$!wTmQBta01Z9(RFNA?9UD%vN=(ux0;TEPS}Mi z77P_8FAO|SR(?PAqIYsJ#G3d}P50c$TZrf>1TG;W)~SFr3R@41ZfQS_Z&R;*cR4)Xa5@NMOYo>SaN-5xtcoAhn0CJ*EFPEt^s4$AnQ#LCu;$Q#>EGZIw-4XDPRy*VC708TMcmp0?unMx5kq`3h2VJ`3AOzv#uN@E zmCj{vfIH6OV!hs30L?$Pr?qR(G%ULfI68g)2-n5-Ry<5M&QA}O(+^pLi=BfWknyHa zUu@jO30s%I@7SRBnPp<4Tb=Bl^+@##HO%OdN1A-*J#;T*aWNMIV>cOHGWh z6cRW9wsYhwtneWht8|gbfB5CKxU3Fo5nd{Kvf__zdJo<51>c#-`06+Ox28DICFWa@AR#(_1yC=;_$`4OJPAEf>d42 z-8x|R*)x}_p5m6hSU1#YulT6CRk8nwWq37UW9wT>S=>JE=_J3!NgFlQb&C7KNdFOc zi50WHpo3C`M2p9oogH1PQhrgZ0xf-S*L6tk!ft^L!#wW?Ic|~dznZ+QJ<7R=-{#(C z`ZdB79)~Ivqsq2f007CoB8)IKgjra_T&-xt997=OE1;rVPMp|@A;Ag$3?D=4%itOoh4^IY3PDGOy^}vM(*Xv1trR`Dn+^_-~tJ2E(RGY6VD>*K58&IUvJ44)4Qg| zDsg0X3c^HBnf#zL{Bpda2GrTRvl31a`=o z_IgXx|AyvagmV5sBAZUj+)8=x4T+nCxVi{s?$9}q)hx6Jv3zo3606=yqum|bhPWg3 zrjcE_C)J+n_ao)$3aGr+gn_SPPw*g}Yry@-3mnQUCBs@e1vdFHhgh~<<=tLM+DauW z92D~}L@XOBbV398?9KK!%EcL@l%iR0+r+#wvcq3Te?>cI?2Ae+%I%XT%oj7W3tBr# zCEk+1!&81$(}WK4HMg1vl`qC*t+UzIux|=VAicr8rV5_Gkm_~`sahTRnqCdGnx(c- zgII12wnqXbtk97y=LvVDu3dncqOJH+p(9ktw9Qdyf_q^+Sl;-kdF7(WS+oD@<(pWo z2$T3VmC&VVJ`=KqQTugPg7l?(edUu~Fnrut;>}CE2Az&Xm+-vhF1lOcrC;-L$q6qZ z#^^W?81Iq2^3fNE#)LEa{%K^B1*7YaZGoO&zGbAr_CzQqotK3_;FH|(gC9`Cvvh zWR5STbV5_rY5W1lm9=G_>cRZ9p{|qmX0je8GX4%)X0*G0Q}HJ&k=!PkMuFgG>n+=} z9Q?zAj8>53qgjvL-an?kSe_?4>-|I5ruHK^xaqT zxjiC#RrzU(K*WTxk9M@tLLo;^5m83}YGLf^kOcPum*Va&uN zrh>9#J)M?1;OTPoosA7k;#8jYmL3j)QGaB(lK zMcVn+J7yx?NZ+~}k@7UVPZy0j&Lkge_9L(1>t#_{_%Bz&LS|k>FTztxd*&M_+d-;_ zX|e_&mrIMbR7LfaYpI%f_gBJ$bdNpRyu*uMc_Xl@w* diff --git a/.yarn/cache/iconv-lite-npm-0.6.3-24b8aae27e-3f60d47a5c.zip b/.yarn/cache/iconv-lite-npm-0.6.3-24b8aae27e-3f60d47a5c.zip deleted file mode 100644 index f3f767a22d78920e261df7488626c2af6ee4f2d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 195962 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%0DSL>&9o-q>Jx0u zigCs^Tr{FdwL~VeKBh>WS}6h$qkc5G{>Y`FT|KOc@3H(yMQ~DbL<317q?~|BfiHZd zT!zbJ2IMO;0wnI!Tq~Ni=dbMuY;K2`6Mh=9nA|4)XyCfD%@nqp>#GyA~&h zem2D}y)Va!O-W7o1SgD@m=6I1Kr^Gb1l<>&?JPfEr9X&MT1}q{qKP@oGn>kYH6e;V zsJ{C;=RGAnq7zX6m=|G3U2}$n(o%KS01+dpX&X(`CG?fhTuzJH3^x3iyAk00o&Qy@2EVYD3@Hhd@8{u((XLHXPhoWF34qPOHZe3{l%w@rZ&+pXxCj;F8Mfxp8>~5 z6I`I1Y%8S8E;hq0a&u@iRz-et?p-myhXHB!ZXIOuU1x)u^aFNZ^dreAU)vOf!+7JH zmQ15K)nNJ4(%njdxY``>-&!ju)S#T@jbAWG$l7YXvN{RMAEk`;`6GQn8=@ z-fh5^z}D8<2)Sr8&e>tb;=9yytSYkbzi5tOTf$rNv>P_hddcV`=6hE@QEV7*el%IA zDJ9&*n)yO)XlVDM{+QYYJrs1l4*r#=diY(2S3(*|Yu6D9oLH*5iP7?7@9Vh*yQZ$A z4D2a1r!#jJ*g6k>C;g~kwA1u*J=BxzvV3qqI9Yyci}>cQNMPpDs$4G7OyW>&4Jdf# zcIP`izcNp*+;IP2A+F@uD)Y8|WWimECRrV`$bhyGNoRcM=^Ga#xxwKP7zbhf^1-~@ z%C|H9VYo<4=g~FI8nEmxM}32x_SemD2x|Cx()PKS)21pz^v+`D0`y`sPdWGEoHJWl zw6S$t2U?xF$z`2jmNNf`YGCm)unH&Y4w>5q0|^4`?ru4Uw!WX6Wjfn*$id^MUso^| zO)&!;%c$23%27R?wL1S*Nw{9=S3)9o1GAsMaQIF%WF@~LFY9HLI6R&d6C9GPL zrb12uyQ2BW8J3ceX={H8J~W@qsTd`Zn05UpZtHYwLoT{zxaRf87tNn_wrM;S@M*A+ zfmQaJ+ZNvaJ;Yj&SI5u^`MThh#^JMTSIbR1N*7`H8K(w|QEQ@3$g&{D8jVzcaaz}p zq=k?Y68rMx3WamtwdSMz9|^9h4NEFp?g@bF*Griz6N;haVu?~MI+k?eK-V6loomIN z|47AJ|L#16Lp=OwFJZHeB$dR8Nm8h=lTj=A+$xB`U=21z?obY6!&lZ=@_c!2lZwjZ&=z+r}si?ri*q}ZR8WM?odzOr4%tI+2D>+-6Gl$44KQNQaKIJ zxaE{MRGeFPC}x?Z)-*N^PHUAYE_#7WQ0`W*m+m~@o&#YQZ?|v%{eQ(iqGf_>pFG~Z zb1VM;FZSVK|39&hFl@M?apW&u79*~l#Hd6sQkKppMdWH>8dD>L_yLgMrB0C zZ|(+YD4#6pvj&+jgvN?hyiNkcPU;V`Ju|Z2;&&!yq1(@$J@4k94!~>;oTeikn{h(rWK+0e-M+ zx7VU4;OqnL#%tfb*wQ9|;3bMOaQlI+_%?0&6<6%7ueR&YlTq|Dz0zynkx}$xnkg)* zQS9=WP5Mp#xBs;mV2@4uwdojWwFPN>NK<{5cYYO~6N5|xt>C}-_K#BXbuchB{KXsd zRTw4)*@U=06uWi(Sx=)5)Q2v-DKzZg6=%N{9Rr(Q=y|&S>~0VSG8}6SJ{|KLt?!Kr z1-jcBtzBtpJs+!g3huEvUhTzoflf!|-#80vlkP4e#Jq3l$KNDhKkqoBNuRL;Pf=m?=EfnAvxh~ z_o~!3aQae94#p_wsu`GjA_f^ZQhKh=m`F*eA9ZLv}HiI&~-TxLM? z3%uEQPPJ3FpRE=)*U+VVTbo*S6wvJ1CH4YTdzxDhY)&vb>(y$1oude7UNAZv)}nto zmNLp&(z1G*6ZLO~7@ds*n_m9~K5kfGIlMpu-&E-WpVQu6*#bjs-@`#RKO`;s10Rjv z4y;Ev9*thF?}3j-orCnrCoRwPC$QnCw*)57p|}5A$^~7p(YKd_8~=wljW_QHExF{u zx1-W)vA`Xp;-~wtx59hM0eIm|%@?i&QWya==Ki;A(qu3f}x z?+)f3K)OJ!2RT%r)FaI?Jwss92z_|~&ULaju;@c3s_y$HL^w_6F3%x!A0r%sdm9yxm%XI{>S%ebsE_tNdHpDQ#Wet z*^MbW{IP;g9ivPs4^B6FU*TIuyGhoa5$yWj3T=V{&hVFaQgt$Q`nhS}oe|QAbbvmA zlKq9B%gJMthMlN84@>O=9%m(fg?o09o>SCDq0{9$t*vyh8A<}8@ct)4D$OnLAS+ax z_tUIJ5Oirl-~Hu+QEdZiu1a|E7zZ~h(DPHp6M^%{gmFj5!@&tDSll>eefOmO7H zQfE>b&np3p3pBUQlBn3pRpU3u&kCxXC{&|)6WnqhUz7u9i~)u3<0ME7te*-Vvoy7q zhir%gOj~71fL7Pn`u>I;5W6SuaWOUlj7NGNQJah8OkfjCt`h#C$gKg6{gSTfTLY7J zlgY$}_ma(lP0-&f;#}V4m2g40(?4v#T zDaxWtbiA^N_}Z^F1b5P7y4e$Dwr^{}J}Aemvz5vV`85(9NVlA`r0hh!#veo8y`VkF zLen-cx;KIY-x<}sP$=xhiWrmhfgCa)7SA!@2?+G~9-`hPHh(SOJ^}*Yt8GoI?-CJS^9TBMaGGc zTJf&0u0W->qQ;XWty&M2L@yt&bpslX>0L#2_LAL2m!Qdp@DnO|nAYjV{1!l$_A48@ zKp!WT@ieRpTur2WBb=U{U{9yh>e-dIDLZ>B<-$eT7 zLOI}jUrP-pjWR=)XvxMe|~XXghSqlRF7p!>l3 z0rf*y;_F5yy>Qt#WrQ~jaq|C=Up^EdC~UA}8L$6(#Mzfjmu0``Sq<^V-&afLGx-Vj zLu!BLA$s~$N7}s}-ht>V$D+s2;KbO?5wSx$;m+Ug^s{Fvd=SZ$6z-y6gmO}Of71=%9@TmbAj{j;;TuGECE0+ie_CxSSeDfSTkC$PH|5z<}+;3N$E9C8yd0^SF8_e@#!bot*lOL&Y%=kV6EKSdm1LD3B!4(a}eU zVgtjEy53yD9M-0jJ!|M#n7PqjB-^bK2mj@|3zK@yLzx$@NdRoZqxb=Rjd7*4xgx@R z&_7!`{WHV>M`43Y{ec;Bh=%Y#=xV>~Z&XjlBK4uNPs!Lx98_isno(8MbHcU`<<0r? zA-Wv5G2Hx@I|{Gb_T9sv=00PWF%{2E@8 z9mFnr4jlZ~_aJ)be61*sz<;ZupR!1alPvw#LdYnDlpyk>E|pu2Zxn7ZhD z=#0dND2GW5dxpM2tR`MqPvq$3CF{m?$`0R}5$EXC4az3+pMKe*&(ZT!@Uu7xZjP{c z{BL81kxr9Rv~X}QPbzmScKd%T{1Au4y_>6$uY!F4;hda=m-}fme3LcbBq&R~5GjNZ zUE?Fgrz$FKarPi%%pSa8yb{qd^mGm5l3s;i543%kTH3lq#HbZt?UuT)y#<&tjLgj1 z+$L1_%kTFIwYiP+dwzasXE>!^^fcax=#cWFyc1c(+FXoC#-u-6NV*^oVC;Q-e}Iy0 z#$US$3c5y_AdGDPbWe5n`KP4tuf;Gc^jcAnAoOZ$E<6o+n0#8G2<^KTRCCkd7jp!2 znD8$@bZ?|bj4LvHENy<13PdH1RO5V|j0J&( zl%=)UqBU|Kw;D+oft&CDqy-lF#f7a>T#{VUmGPQb)u_4}+>X|_Q^NUk(xZ}ap8@eW zi>~TQ$CO@Pn(0B<8i7aFVspLTz)$RUo>Rs}_qvsVn*Z&?JH8Q~Oov)i|JWC|Cc!48 zA-I^djQZ?en{~mx?;^<2F^R}HhMd1TZ^ucZQ1Fr6Ie&dm-ESP%L;Mf>e7{9+lXcJx zHvs`8<)yQ|7kq$gXb&2LGLPaAu6rq6;%s||r12VNdd0&B`>%1?aP;rIjy9!xM^PXG zxws$&D0Qvnws%Y#f}tOL-2bt^;_VWGQfitN&BMrBX02K;`;>Y^euSe77p$9C4XF-Q z{GR(#DXE!b%T&Qq&Reh?Zp&qBv5UBSJ9MJfC53<@U`3*D!(FH%Gs8EImnrwaVVys7 zEL}uGOkAHV3=;BD$Ux*w|;Wyq0*oh8e=VK3UEwX=?L^NU_yiFv{<`yYQ=q8o0%HXfkB zi!dd+tfc_v=&AW^jpUX zrBU7k`n?RV0nYudHj^uX_poG7vB$&YEFkFGdvxFyVEDA#4_JTOZ3c+GfM_}0^HzT~ zpzU!G@vy72E3j7>FB)qbt9K_2zmxZ|N35$Cd zcMh^d%#^nN?x!Q!2!$Van2xD=<&rz^;F>fgIIgEY7!D&8KzAV`FtP4&Lht<;P8Dm* zzS>)d(#SiepDw^&*`u%>hZV!h?4m7IrwvvO>qjTB)4nm`h_HB1fO4u?m)6Y{0VkGF zomx3Dcb6m4BP(g}>o^_t6u(bE?t9hg(qWm=&hJ=Is@p<+C_T74%{{ z=rqbQN$Qz~hK3J9*kLR8nEx=X?cUvUO*#?kNmeCbD4(6j@fxTK?l5>+oJ8Slh&kC%OA@WP_>Xv$If~tMb@?(6y3!x<63uAMPqWJ^EBSvF&q$hCu6TD9hqHbY zCK0Lt7?U|~nPwMkKC5LQF=B9Ep>canf2P~`yiw4Tg~afPPx8pkI^7~|mNlS}nPOu( zsZgpDwhzecvfi355J!vA6sSgP8n#KEVkorxT|;7k-$vqAJ=rX^z*)@EVRtj3^SHJZ z_;wK52!GETi5?xv(MXshuJqT`(3G!Qu2Rw_uhTViA3FXs_lrquUh*%2eWksfy|g{X zVrHX(soj9bZ-4(E$}tcR%^_D=A}G-{GaYnuJs^m|dr`GNcU zexzd5A2-8Td1K-k{zZ$Lnt5J%f5hd)iG!w*i{D2}^$>nV{mP=8N?AUZg7TH%tB5iU zwV~)E#UJvoCxBNZ3xw#KRJE^weBlt6k134m_GN$asV^Z2y~u@#1Mgzro${!=mc``} z{Nf7U$I*4S#?ON{^P-Lub3-N>C9e^y3AnW;SH)fbV?oIDwXT7u5|kSS)dCUo|LNi| za#_n+$sl%pD5Q?nWp6Mp0x!a`kRVJr-{7QoI?RGFRg_t_j;vcXx|)S~urAiPHFys_ zm6sV~(P5LuVjlaBaB;&VFbqa<$G0eELfKpYfu2ywfq!nRAw(W2?E@VB&%EUlI!a!H z*rLBxAK`_3iDbxmwn@t~hq8|0)efyO+qx&17VGr%q5^}_(XOOO;R2$nI;U<^l$bBf zclFx+rf4y|1U$?>*56y&^QsF|%$mdRNY4;7SF~A7n`1SQE0LDjs^+Is7h7a}L+)@Y zHL8~3rWS|1gs`pnxc#?e2Pbqvti<^13Zz9SQ8#fuNl z9%v8$N4&0Alv(5KTy?m{} zWXz&uJ}*VeUZ{{VU!?(+XQZQ8|7m0xEK7#FIR)RY&J~= zm%j(lNCvqvt^JBG*#uxl8wC!+g_rRIW+VyLekD3tmhPExHoOHHvW-;Z|7E&c&zJW9 zA((!zKWQozBfz5BbU586WtYP%vYcvjGOYvN39TV-({f%R4&d>3AcQS-OOwt?KWc|s%PjC4h-M$jI( z6wu&r)!wTS=73T!UsJKsdsF*%L^|!ua-Own2h~?l$GrSRCPJMZ;_Qo$0h`_znb1D?v+mi2m%fLe6GB~2Z@eY0S*E-PSe|cTlaEb z5vd}+1b&p>dg*`E_{w;Yk%-Ed=F`YB8>NhpA1-0{v6_)vPra=GC-R4^x}VAs3IM-D z`G$Hb>;IBr!j7Or!~#D2j+#RZX)$b-ulsuShS7>z_Ex681S>b!ev(^=Vd$u$c#O)* z`Nop@ScnLyTwho7l|v**QTe{==ReuBJu3f{-1|5{5{saXQRf2(0o#Tc zAg{b{NA|$fKs@E+XT(&6vv)hf@5tZ~UaWkPpueaNxVrS#zLOq#YvJ?nm({HMCzmBx zBIXH}v71;YS--U-bYgZQcD^sfh67}?*jan6(F+-34cS@24@iZ`vAOKzz09F|uM?_^T3m;ZqH(zLt|iPc!lYgFd0tS@)Mv{_qFPdbbElXp&r8x2M5 z(h))frn%mbW}?I9T97B!x}=vU97c3cv@S~E!YrfBUB^GLjiZ4UqosbJJr=<781ANF z>K@!rS|LiHrruumSB0gJkxE1cE^I@*6+K4acB_i3|J!{`Y)3IKQ8iu%H-7yGXXaJc z`+%2G?U3fxt1#-?dX{nQXsd?fMXD6*{`Tv_VIA{$Rdm`0CK~^}qOH9DD`F3)x#ee9 z-hEubgoE9Fnze`JCak~fVDTV3)n2TxSL-$W)ggLUvZ!b37~esKnfn>$5ctdFeJ?^d zRk$L$Bmc0o%OEs#>%U&ia9MPX*dIja?966mCW~P9Zl|cNkG&}2(yO`7Z%@P}7n8IU zyk3jj&LQ_C>uP@bP%7uQ*aQ?&dq0KC-LIRa2&FSES*XB+* z)>2-OGv!6Y>fj&}rGa17r879f9@HmGOi2qGC6S{R5Zx~lEjL$|yONeU4!VhrjUD@M zNpuOJL8Kwe{Ju;xzfHzH`IvEz)(%u|SiGN}d2b}&N!9U~mkOv(T;{Tcl(V48UXdL) zmCevy$dD%sY8)?EPZo%WAR$~)?sg5QQ9mkm{uyV>w6`vpE|O^^9#7?7nWD~j51DsZ zj<;zqI{WokZ+XIosVDIJibxKr+xcXx;y=zc^|qYDw$hX28iutZ7t!fk3BK}dEVpEr zCxr#vV&aa7n{&0FYKDcNo@fYSGMWV|dCRUd!}fHzJQJ%NYI=jAIc(r5&I%>W!@M<%rpHtrI#_ZXm~48GN%_K0s~V7vyx0#*zrn#`!N%4ocv-q;pM%(7oYaU z5YvnJYIsu(2w@U+d<1P>Cqe8)*&gU-vf)EPUHrsOoH%fLlSckc7#!n7gQtW0v6vN( z`3{#LM(fA^@f8p76(PUr|6RM$*Ez~u`Eob4Q6q}#`vo{rBNFN!1r0d4R6cf7?NRH} zH>OiU(d!yF=LPqlI;x4jn${77;5!U75l136&62 ztY}s|{I5RBr@^yfo&Tla5?Qg=7_W9~2l0GhdS~};PIT6CQmI?5Tko3?BIEEM7?;&Ewv$Bf+Hr8bp-Fpzurl0W~5@ z6Tjfg4+HOG2S15W`ShF~yv}w74ECDb{%Y>KCY#65#xm~swT9?H&(FPS+?$UQAxNgk zuM0n8$HVo=YqVN4Hh=f1g=p`i3Tq_Jrl%+3eP)nQ4dxEBN4~%ZEkINGPYVQlwuxgr z)d#h&>hbcQz)2t0zEq%8Xw8~8;-=b`t=F3y%k`)t++vg9=zOVKI^;k6dRR5dG09M< z25a6Woz6iL#1?dSqdW9EJe^!JyN#c~&*2e7aI**z6$IF0)r$;zM4o*VA?y(JK|VdJ z_v~B8_w_s_ue&h42jh;ebK}(L2P%Q*&|h}?>QW| zILF1a_hlPJuPI2Ph?sF6+$h!!#lu0V8oI|#aLU@0YQFpZLXzWmBTwtIDNC8GNDrhl z;pG$?tx|&!50+&O8>^{_{2cYoFM^Om-Xgu6pYm;Ta~=6Bxj(Ji6c2ez^}hf6vbM|1 zq{7<#Z+3-%kVJo0+pclmblh~@qIv+{pM?{#QMFXXqto87ZoFn?)$g8?lYXM%F>q?F z|8J22Zp%IBn@Cy1Tu}6g*Z;Tlo5Ad0EPmL1sd(TPM@V#m>9lE)*x9i=1RKjoc=0l? zAHkb{Pdo=%GS`it(Mf$5+UJ^bpejlaBDt;@ucTsAGlZ=szARjL@z?5tNT3xHm7Hv~ zAivA238n;qswLs0-=^!x0UD626Yn7#D!p}`0>Kj9c+9>Q*l!>9jJrS#n0>&8_HN4p zDOttr1JEB-_Gz|g_G$M1vHj^#{weX>MTB5P=c}g*BkC>Pk8tG;iI`AcTzuI>mi&KV z6ew$-o|F$Y@)yDkvD=tHsZg>l9k6TQ|4y}922eQEw!ksEbBtwbRLTe!)^MmLeZl-h z%kecbhz_YinII&Zh^%juS>`X1ovA*7nSm4P%OR@i5Ker)?fzsso0qx)c> zXysM$OQe1-Jhr?a_JNYlX#L1|w40RQs(<|sxqSBp!S2I6Srvmel{WSw@?mUVW2h3Y zpzGmm-i~DHf8>OM*ls10zcHRBGrq}&C=m;C9TIKwbvuI1KjIS78Kk=zPe;h1(UGPv zvM=@Yh01+QMp9r-XE9d$75AQ$bly?hs_u0U3Xd=xqRs$*LWkR@FriIbkD-0Pq#~N$ zXUvZ2d0o`c4km?U#usB(5He#Z`N}(zL)WpN$xlfaYmJQtJ0oB? zaF=0iLG3mutZ}WDb|XE4hToib#2VU0ORJ~e}wFq>Ierp^I+m-RP?~+mJNIESaj<=cm7toAI74-eQAFenU zOs2sLBt~d{26C0Z=f5~eFaO~VX+pFSwb7g2FIp-Z|4y2uN#`J!Df<)?i?oDQVQYS1 z-Zd7Ns=TM zuJ5SJH&*IN34KRrVe+eT;ZO2>2BjJ`~aAUBa zrYT*Du@o3b)8CjDE-VI&in0tg*-yDhjZ#(1Hc`x+izA15G}M)@1y9fm8Xfu-`X>Jb zw6(jjO|Ipy{Av)fU>ceKlXKKjaG$iU#_FYi=u$t{k7GwaA79m9HLktV=wae;4KM6e zYbX|+#54<>kdWg4#9Q)r64`l*S|e?D_24@tIsFM&dx`9|Rb|(a*0-B_4*tyWl{|l3 zP2PNj2cmN#Ak04u*^z?glyFIFiLKG`s%UU3vXDTwVbgVX@9U;D`1i0%Rv{9^-%tv) z3_TvJM62Bg>0TZWouJmzjLCpf%Y3(+2P(;HB@EBJoA>6DwNThLK)P29yN$zEA#8L; zjDAy(s@vBYY>Y0aj!_iqB*k2;`{%#xu zNpuAcuSjufBmhTCOgC5Z|O!rwD1 z7Zv&}Xbq)*&r2=i9TCkUmia1M<@w~De>)3VMw)v+hj{zJ7GoCQno6D3xWbsAM^xMa zIfu^;{}3~8B}fSgZp0X!_&#RRDhnXYvU;q_KUp2l8R}QN~$q!wn z4<%9HjO0w8FeU-Jp*Hf2Y1Ucj9lkp5aM>8N?L!7TYJfBpo^Otc9&cXDcISyYmG8OA? zO}M6=SZVpX>6Z{g$I6_I<@DO^9ej;3QQK0sQxJVk&T5|xai$6q1m^?^ktPr-SlF6e z4Kzg!OT`-=^DjLWan@+PIi@s%qdONdr&4Y#B zIV{VIdl&jg+`T{3gHNAO&U8vVwt1$if7+A{CeAaPG85yReDbS@&Spb#Tzq~%byp)>%bgmB;{^Fsf3~f1FF}^> zm(mW28pO=rMgr18c%QNEw8#v+baxL&rjiTO3u6mu0ncRQULpt0<0n+Lv;>;oB3tgs z3p4+_Q}}o6-^MP;8+v-5U9~|@5P?O5MthCpX>>;Vo!k$9w|o;W90H26|MELHE$=rC zUwp?KD44`YG{Q4)rAL)i`6x~GDJLRL>?FoUSu0M~;Px?bSk*z6>N!6DD18fQ@ zFB~-u1s;y({@G74!P=C4PhWXm>zN`ARP<}MT?o@+yo#w6r7R`NKhPr1ewZaK1AN8L zFOnSom4t-<2EP;UY#D2I&-QS4R|VSyyN50lxA`8@P5Mh{rMey(=C=pKO#wWI?s@cB z7n362?my=LxAhTB6-xNg|Kt6qn$Ow2_Q-k+__&L@b*(+~;nkQCB4mG^w0letN*S^( zov=37gRMS7u!ZRpLlbYPh{bWf;fQmFD@2@rxIhLumaVDi<^7dq`Bojbw+%nqg!JWA zgbMzOpT+GVrk-f88@Gn~HF@O?QIfx?;-3`1-EFSEOgHQ=k(uymS{s%Zk=Qw%rgB zgPw+~&+BZny&XJC&B~*H>U6XX$2gOmmwHV?KT|ObGWUC;a1k~NShDz~ajcl|b~6vy zCtQ$NvW>;3D_*YkRK>`VHX>M>jmfB|+Q{$WrlgsBnPZme7TQLv;`1=uz90eM!QJgF z&sP>IJx_0AI*uQk>*F$(er}H1E57VI5c?8Fi;6_~%GDUoz;=fuoKr; zDpU&u5krUf)#3npow1LcyQA4`YMn#9E|A1pb!k)^`*=BT#CmK#a%A~Rw16IZJD1d${F8q2X zWkdCYUZp0ofodf6Yb7{ol2-hLs;Zg&A2<`W^7B{>yP644s0Q}DO1jn7S*RyYfZT({ zmR6`^q%m{221irhB=$}ekz?N?;g+<5B8Nk?jif@mDR!i^0ke!L$0sx`=4I2VPcgaL zVttluyvX$ikvVi8wDrD`YvTH&+qUp1vnsTjG#2pdf@L!r=iur_+ju>!dljWq4_yxQ&b0cxMM#cE;A-wFr-$;!j z_6UoHCWO6P9|uXy=~5xu9`zt_LsSZ5>V6dAlH+R$R` zDmPUwR!TwAaI0u4e<}JA$0$sHQDFp!u@)ogDo=ipjgb3;a} zz--N4xRo9*NfK|(UuZ3-0xV#WM$3fQXcTM2XVFu(GCtx>xxy3cSa*HHR%p`+vS2;Rd_OVgLr zURXM8nA-U}?2vJ?YUtwI?~t;B^v`qE(A9THG9}^*#fZdEFC&0X*x>qR4Bl42C!7QI z8^0ECH21l*?9IY;#9w~^=|C+ZS$vLYAeO8Bo-A@lR#59T-QG+%KuA>H-+9j}Y6o|) zL3#IK_%d!LbOxc6qm(d!?NNjCctiSj+8(xO;8%+fRZi1*W5ei#Fi^qaf&2zyp#C!B}4q?8;CFn$*sc~^+ z3aaM5cD=G#VL-nnMiw1!`y!c{+Brmk_urzh30L1fW(TzoBc=~O)Tw&2E$jrRMpFM7 zZuu1i&yg;W>n}Kq4CEv{i%>jy&2n6r27vuSABnEt@4FN_u%}Uk20s#9qwF({t)yS5 zutG+H8NXDVmUEVl#4-w1*q6H$kEGv_5?fSIl>3x~(;R={*`L)`tySotzO^T*vhm8# zA4}kVQ8{|MBgZP;3Jw<{A&1wOXapXAOa+x7W{w*CE76FU7a(VHtD4?Yj6f!L5R5&d zP6nh=8A!Cn9!?j=tSb9PZ`?4ez2rS808+Lw`icALeQa--mHmnz*ZVhhjJuqo$aYMR*s} zn^^wbOaHg;c(_>PV!s#rjo7cnekZPpxaQ(ziNq1fP$a%c0+9?v`WBf5P6+)r^!E_; zAnL+4hAhBJg!%=Wa$lUW`Nmcmn=fo8*nFV(z=4nc9M>0IZ*imII>B{}n`|su{-iwN!h;KUu2i|=ux@h4VQ6~obz+a&k;Y{oG6?boK;1!B8sXg>Y}_6<*lgHMXe=j zrl@(M7K++M)b^sb6}6+Nbw#Z&Y8}y$^Y4jHU3A)F5Q>2>20by5Zr@P&Q!$LhaQ-t) z-|=uU+=0yGH8E+5@Fk{iG0nv^6Vttz&&0AOHU+U&#kMSVj@Z@2t||_u zI2huPiGwZZz~temm(z{(vfH*6`` za&R!lL4cbXZe-raO_P)XDI-#rr1VJ%NNJPOCA~~~m5eT#AywmFOTH((`l3cgO_Q1t zc@^>`zKy6ip;3jVJ({0rwV~CDj&C|j(2D7p(eXhig`OLF?&vA8XGPC7y(Jo5=zXWR zB>$KzUGB&k4!E=CPMbSZ?##IJ;8DV3jmK3UJ$dxz*_dY|o_RbQ@~*%;pLbo}8NBQB zuEslucV*u7_^R{OrT?EA&%{Bx@?LQ(>3E;SLYUkug?Y*y>`dg)PZ^bMzOu*^(mn^O2M@>2<0m)O4s9 zQg24nIZf9z-O_YJn+k32bh7EB(y2<916_{%-qSOqXZmZ&_k_QSl-aB(T-E|42m#q!D$PRDppdgNN5bO<)hce!3sACZcDg%;r>hooAd#h3u=1Q zY*BATqb8l|^m6EB(>vvEhr2uO_IVufIOOq!$8zbddA8+w#=D<8(Es)w59i&3cNt%s z{4)6^?X)->@%tdkFHzr%`bE@lqAts^sGmiBBRZk*W8puAe-@)$Ocr7?6SIz3X=0^{ zl_HjJv5^qa5<6EMcj7n`_k*}!#iJIEb_-GGAnKku9KO|#i}n>1F`CeO;c=IV&jTaOPo65WH(S(}`_buF1 zoF3v7i{!!5R5urKpY)|zt;O~v;(?HU*XjIY$#)p&^DKUzK2&aC_n}t&#FbBMf1Z`k zs|th8pQR0_J!F?p>_Azbs(s@9=hgfq#ZO{<5*^B2uu`aQq4orS3{w@RTR7I?kz;3q z`wJdyJhn*BKk?}kr=Mi`N&HW;`XrN25`2@FSRZV0wUk0rn+0HsF}R z=?bR{#3gts@G3%Xpl+a1$7B1~lJ9$l$2*=>Jmz>z$lQ~8q?$?dm?hSCho7|eNxPqP z`$=w}wDn0&pH%rIk58(9(%_R8KdJUf!%y1$q@_=C{iF>jpFnSdZh&3~a}IV0_6Vv~ zsF_f&z+eJ{5%_!X*Wh1an!;RxnankqB`|x#>;bbJb{-ttaGb#@h0_a8(w;XwM)17B zs|0Bg(mrHY$lH*&Aa~I4(HNpJMPq`-9E}i-9vWjb`e@9sbHL6X{Wtng^keiB^k3-b z=%?sk@Yuyu8BYy7`FL{hWa6oXr=Mqc{_Q6WByqoRB4bGAmCPH}YSda&FQ?UwGM9~* zjg(D=jf{<)dsUvjMX@J}9Z~Fx;y@Hzq8p0tRCLFp8+|hGlO~@m{A9)_YksonCw+gi z#V2cgve73id@?!cyH9%gr1?j}by=>XC+I%tL(nH+?!erGZ9p}G>KSS^s5wwSLj3{t zHMlKsHK_NX?n8YB^5NHtC5Eu|x5Hw&~ zhM5BMIn28-AH%!@^BT-UnAc(Mzh&;AOzehL;X<%cL5l0c298-yv^6?m}LNdiQ+^QXQDV1#f2!!HF*@>rRW|+clU`epLh3@rJuL<$+FK| z`MfKi?EcBFpSSUOmp<9!li8nl=aa2J@BSxye%^A$#-Dfn^Y%aQ*5^I^yc?f)@$+tf zvdt&kLwN}06v}VVZ=jz+zkpE&{RCzTwh6Wcb_%ry)LPJ}fSW_301X!!MQG^YZoqwk z`v!Lg?iSoDxN~S!!99RG0e1|IF1Qi63vj0}c);KZ!2yCZ1Um>e5S$=5LU4zn0>KS} z1cD0$R|tN>qyP331`3uCWH7a1rosFM^A{`}Sjg3WhJ_7_0?h9)Php|L!h`t<<{2y$ zSm-dn!lDAZ5Oy=zH(}p~QwdHLIPc*+h4UEBH#i^QyoB=>&LcQSaNfZ=gtOc)3pfXG zp27JJ=Odiw5O*MMLEM9M326vv1nCsA7QBm)y&=mWA3{DuWrxZfl^!Z*RDQAQCk&)q zQ87{JpmIT_kIE30Eh-@@RaEMz>``f=;-X@sVxZ!q-a?Ef>uJO+4f;$@4M4PN$m>EZc~mlmFPcv;~2ftNa7iggwnD8p zc{X`n>K|xup}~m;M;hE{6w@fB(UV3Ajb6W&e9O<#gJwmV=Csgg71JuAO+u#|T_jrE zxae?k&&7y~lGWwmj`cB{W407FH*EIV?6Nsv^Ty_a%{`lv$%bsc*u1j2WOKsiimf7> zQ??|I+}RAdcjVrIdpqv!`Q≪N0T8$$6D?dD!M$GT&JgucCMm#fvCPe0hp)Cc3HU zzC=&`c1H0jmgh22}|h9jJLw>p`sxjTbZ~(AYs^2F;(Z!TsCsYmqA3RcJh*v4^GyjXN|o zXqKTd2KNY!6dEBkB+Q(lIfTX$hBp`vVK{=}6oxhoJ1`7jIDlabhFussFzmr_2E#rK z+Ym`HQ-xU*786(uVX=p$M28bB0$4~WkzgUQ;|_}{EF_>jU@?Hj3Kkbw++Z<=#Tyn9 zM|QAZ!pVk99WGtC$U+A$7F-6umV9&gWeAr(TnxBW;9|nXgG&=GEx0&v(cw~tOARg~ zxWw>yLOg*uggAm&((e>rM|jCRgx3IG5xi!QRv?vf)q{5#l?N(MEVQt2#=;N_8Wx&Z zs9?ds!T<|478EQLu`ohqiiHvux>%TFVUI=;4HYd1?JC+9S~s+7Xv>-nT2HiPy^U6k z)*WpH?IzkSv|ebp(Mr%dV!MEC6}>fjId<>ZonZHj-5Yj&?9QtDl(GEv84rQA;js`e-;mE*|i6a$9YaCg)UE;oo z`x5T&c<}Jh#lsknGEMNh#OoEWJG_qYn&LIbYXh$)Uix^w;I)L;9$sH~m4_}~B>)9@ zEB;#Y^QLJAPTqn%DUhEuD3Py|uaYkd8u=y-9yCa3 z@S@RzMoSu(Y3$OtL1T@^bs9S~uF=?_u}b46%}kovG_z=?(X2#^HZ7{OaA@JtqDJeV zx8(l*9R{M+n>H?O71|c)^rBNtrzf3qIxBQ8&{d_YPS*luU3$CpuG0I>N`;jgD-J6y zRvxT&S*@@-X4Pd?XSK*`omGw1h}9meKC33HZB`9d9acN6&RMN;C1+j2WQ(mHTW_|W zY**M?vaPVyX8Xm~hAoe+D_dK(CTyMAy0LAum9TYZ>&Vvn*OG71W=XJ>5G{LN*pe{& z;NF#cDfccsDe$DmlLb%KJX!Ig$;%QiD||b19&tY5e9!qboXw9J+LaPI<1~eDYyg+jbtv)n!XqBL)LvsTy7g`dnPd~%-^IBxfgk}QG2Q*`7 zj-ge9mI^Hk`~vtz7}+pB!>A3T1`J;?D#I{?VG6?-hEfmaFsi_)4#Ovm3NWp~%!FkR zmL4p3u#^DahNT0`4lHH;5SAC%ZDGHFy+mp0uB&kJ;3PqJ3zr-&d$^q7@_?%X7YVv6 zh?nq^X%DY8yta^DAU#61z(Rn9J{A_gmi)ZwUch3AMIDO@78_WUhXEE5!fFrg z9abx7U$EN8s*84v)ecq_tm@b{v0cWFOe%It*ePPq#NG&d73{g_H_&h5c!c9VP7EBM zaeTpXf)fiT4vsw>pK$Es_=e*Rj(0dd;G~9=5{|Dp4shJSaSO+D94~Ra$4M2(FC5Qs zJjU%7w+GzraC^e-6?Z!>N+{LwFvr8sGi`tWeJyf{hX@ZL9u|0<;q8UD2yauo-SJw* z+XU|oymj#w;%$ew1KwS{SMhPcTaNcK-iCNv;BAce4&IJkaNGQ8dJUMJNjwMnW=YCx(*>66ru)DEc)Qir6DNo|o@B~>G}OlpPH zKB+ZQCu9`Kh<`2l7H!6Zj62y1S<>&jlJzF*PS%C2gzN%2O>%nV%*gSmmXfm|Cn9G> zj!#a5oB=s4asqPt?T@?G-V#lb8f^{QHt1ZUvrA`_&NiKOI#=ne(RE1I zfUYiGYjo|>)uU^Zt|PiO=<3kbrp%{oLfMeAF=YW|1A2S(ZcwgLUZh-M#bZVC!jsh( zt7lea;l`x`s|lAB)(fm3Sf8am@3wZQhAZJ+J%*OG5YuNJvl zV|&2%nr)r!l&e*?WuGbAW40e`AJ|@TwZc`6t2S4gY!BJqa@Asc!Bw4mP3|?gA98=m zeUJN9?z`L{a=*g;4)@F4x47TuzQ+9-_j}x*aDT!5Hut;SuW>)%ex3U*o~S%2@npx7 z8&B>$IdiD+@cqt-%ZZfz zZ_aN*DRQ23o(QGHdCK`+sGd+I6ZM4J7iuKbkx*ws?Fw}u)Q(Vnp-zSNJK;ZJAgv}e zM^xIP5{gP+^nB49iGC`gNNh%8d-yzaC>)`%hQb62Lnw@)(1d~og#Zd?DCkhALZJYK z0TfIqNE&NHL4(2w3M(jVpb$Y}3WYKh6e#SWaDhSx3NBRYU~ItHfgyd2Jy;%CO|W-R z^Pzo%_8nR&w5!mrL+c8yHMCu5OVX0{H)tK9-GH|CYst4tZ`sf~Lwg2oNlQ;?>(JUk zD}lBGZAnok_>z7S7`I>)!sreoA4XRgD=^x@D1)&MqZq~(j4m*8U@RN&VHCkgQrZkg zTNq7XT!T>x<2sBMFfPE@hS3Q|D;OPNT!nE7WZ&+1f`Gl1Xt0Sydu&Thyg_Q@ZBCLGa zong0!Ljev7oO*B_!qtLn0M|ZT$8fdbx`b;Lu5-A~;QHg1{rx)(1lJ>68*q)_I)dvS z;y1)sc%9%S^C!H{@RH1Vhct%w0N&C|8DY`HVjYWREWWXL#NrFpCaNt|9aN{N_D~H_ zl~j5{RdVM8RoOmARYkRms&qfjSe;?b#99%n8P;SPVr_@D0BaqrZLn6u>H%vNtVxR9 zW9@*|8`gZR$~JqfrdX3Kn_zA9YsoiB_Q!vTgKh8Bin3=IsYIEitRVCZ6KV`$WUBk{aLmnBl|6M}Ut3KCbvM z@t)yhhmRxPU-)R_qlga&A3qN<{{1@)gpWEt&iH8JL$>bVL-KQk_k`3Jl_YsSs3aNn zN+p}rBb7>|UZ^CwHzhTvQkhCkDk-GKq~57yQK?9!8X0dg5;9UUaoshg6d;&7BR8mVspC?oPJM^^1`Q;UKFL3jza#%d{+awM`4{pt@@M2HU*_jp*E>bC=E@og=#5=$g?r zrt6)qFSt{BuT&r^};@XmHRj$6cdg0oXtFqqVT7heAu1Pk&ajnHQNu?RrRIb@v z3%EAm+L~(?SKnNlaqYl0oogMg9l4rwZO*j{*Y;e!bFI(49`_`_=G=e$TJp`|gCY+K zJdgzY;{K5bI`^O4zi>b1fzACZ_Y>}?JW#oxabL1%gF}PEHit_NLk`y*_BnJpoNzee zu*>0s!ybnN4m%u9Ioxt+bJ*mt#`7XCJYMv8(dOlmmkVBQc{$|claC3Xd_Dzy%J@9v zTgJD9Z%@9b{3!BW7IJ~3-u_} zt5DBEy$H1>)QwQLLR|^X6IxejeW5jlCRuqaDpyfCiONM(Vo{lj%2QN+z1Q#8B1L5* zDi2XvippNJU&1R3PZzyZ^md}R5xtY>9YjAD!CH(ZFh1vo<7rZ5SGw^oMen3wHF9fd%o(`S^ z-VMA0coBFF@TSntz_Y=dLpukr4c-L28u-##T*2@6sQ&)_S|p5nFdo8KvTFq6C5&z` z(P2D;u@B<`j4v?GVSI=29>z}?OS;~{cnjkMW)oN+VBLbXc$)FFosc_rCtpGR4y*XTOaC6~SgIgP}7r4IQCRsLv>j`c>xE100gqs1^7_KQ? z&v3oNO@W&R&k{TfkagibhxZKL8&nM}K2fz%4NYB^66uECpDqqncw$_P5ZG^xMMP32R4mYUs?+S)y}5N5w{f&IKJ4 zoiRFhblT{g(Yc{JL1%=uH#)L`k4_1lE;>zgis)3(vC*;6(b16??4Z-b)*0IiY_G9B z#kP;_CAMei+2{r64bj_Ur;eS*uO;6c-b=B!#a@Da1$!s#J+ZgO-WmM@PHl{uI4xo1 z<8+PD79*LTaOz;>Vf4UggV7YDJ5FV@Iz|_aCOEBNWaCuF*%8AlPF;)+7?p9_!YIZ_ zHp?(dFpAUSt@%hAO1D|t@Zy4Y4*{9N&N<%6gNKL4;r_zZ^5tU|C3aNCa(uhh+DoI^1 zAj2Y~Po_?$L1vjujZBN|2H7${k{yzLBKt!2g6uQdJF@3wM`Yi~mSn!C`j+ZPs&A<7 z{aW(P;q^Y%Csf~2{Y3RC)g!70R9{hjO!YH06KWl(Ez_1d3+nW#Goj9$IstV?)R|JJ zL;W`O8#L%sP^O?lL5YGY1sVk=1vLsR3Tzq;X|$!um?l%2%xL1%WJi+|P1ZEo)8t5# z6-|~j8PX)A*_CD&nw@EOq-BwoCM{K3+O#aux<{KiZKkx7j&MS|676)_*|e+CPN7|w zb{d^SIuGf*r1OMsUAi6U7SXLqH;--$x~=Kv&}~OIpKcqvHR#r&n$YD1B3! zQ}*-e&At&t1Z@4)=btKtU0VzxRkM0<U z^59C$l_%>Z)>GCq)^j#)Y$xnE>^!+1v7@lFsZ z>jicKc4q8!*~!_Nuw$`PW5;9X#*V>tndCKxTz9!H`xe=`{95wO;ZB>K7dsVpTz1x6 zZ?dDZvt?(`PKh1)n>y@-TpzF_)0+of9)vuY^PtIthzEThta%XdV8a8S2U{Mjc+la& zk_RqNbe?!Tk%a%^NK*Qf!zA60%-_~G%x=ZC|OHa~j&(D~8fhsMc)lLse1!IQs#$HO^!ax&*+&&iCF z8z&1+mYhhBf5XX%lPxD#PF6zM3FRu3gD90nX)8)4q2@wOMM)RxQ>ck36+}r9rHUwN zqNECKA~fmrkAxNqZ7lSH&`qJwgsuv`FZ8+49iiJoSA^aWm0VOZp_heT68b{uMWOpb zp9;Mv^p4Oqp?jj82(KzUTX=QRuZZ4T^z~m$zF(T^8=|j@z9I%iG0??86@!x)97V7d zfz0<}ToK_)L>qCLi{$xvsh?Nr^SVPZgJKS98H#&QOQ4!iyn?EODn-Z<)B+S=P&|QZ zfoecewvVCG0pkTm3`PP*3LO#1 z!@+|?7Y;o*j^KEKo74{x+)TL5;C6=F7H&hhE#bC+TL_OMJRNw};Az6M3Qr3X4H6rY zG919VW1%fkk5HeXK1D}E z=Y-A%>vgO*ux?;|jP>7}#NY97tY6Sou|C3j8|z)HKe7J6dWiK1>o(TsSU+NYiEaVw zH>@A9ZeqQUu7dR$))!cpDnjN1tnaZt!Fmnb2lN`)X=1;OeH;62?ANhxVc*1l5Bn|b z#psW5Hpkfrr!mfII16zmr9qA}4QFedK5kz2G#%nWXe1 z&SIQiakj#lg0ln8N;tdYtc$Y(&SbsR5ed$uOnBhT$C-mOsSD0HYv5EiPH>vyu8cbk zcPj3RxYKc0!2RIQvWkZU4?mA7|NS37_tKwuc;F$%*8md_6CGa;CJMer_-f*-g|9Kb zPWXCaQpTi#uMCp{zJ{1c74g8=5tAyu=9oD6I^*k&iHeDjNf%!|e987Te8~n=d`<9` z#Rv;}PEhOzsT1?uSvLnq*5^F|vqpAG)gsvm*)OUpR5ht;kXs_xB-bLhL9R<~ zhg^kRhuk{3HFAsOmdUM>+oI-#nmIM!)XbzjygB$WYq6b|3-s=f;I&s3dR&PDDWtddSOMuf`S$WJqmU-8dF%Iuuox& zLWjZ4Eo3dvS*EU7>rGZaLjGy1nRLqgz6Em2N5BZMwJUUZPt@_XcG<$~KfOC|gptrMJ`( zGkPy5A5iYIGGT4X+L*NmYd&i$)&{JFtVzW!PYqeSv$kOE@N3D>*J?_vO;``uFxV)u zp|DY8L*wR&>p8m~yLWb<+;F&2Wp~D|%dWzWGP?_|AK8_a8M}RUd+c7>y|5c_tHQ37 z4G*rrxGpPS?5ga>TtBm`aec*(Y;1A;z;2Q2J9bCx9=ZNxx5lo`ZiC$eH#Kh5xSp_E z;kpzs^2$qg-|UvSzF~LFZj0SLyLI+0_Dei?uy6C=#RHEAHx8;ih}o~PZ?IqB!JYjo z`x-|cM;1p_j%pkYIT~=(=g8)$&U20D173`HG2_J#5dP!mGr@}qFUGtGdExV7&Z|4G z%e=~YHQ}YqAG|K|T1tx>uT@?bcy;B~i;pRvEIyfhn(=AMr#YX?d@k`>C=f{d45kEqHEckKe$A%wQPRpF+ zoEA7$IMq0`b!v6OI(C86UI=OQeEtYVG5%xjGZvH!f=E!7REvt2ch4EF%gFBbrMEP z7?CjQ!Z-_~CXA*qY+-mpKMQXpJYRT2;SEH;A^J_xcSXM=1~oBwi9sd?u^8M$a1p^n z1hELtV(f@d!YN|M3$KuXMpwz$}2Z0&4^I5o%lLE}+|n zt_|G=bW-R#(Dk8PfNm4IMd-Ys8$eg85h+EU5K3v0LRg2e3t<_;0!(t4Tp_ez@`A7e zp$nl@9d`(e5b7{VAZ$VCK=g*$1~xuy_OO}3rVX1lZ2GX-!A90!U=zY-44VOLwy+t( zCV)*3HcQxyVE2H-|KF1D8!v|lP7&OTa97}#!MzN(7u*YQd%)d>wk{TpFByC7~kTf7^K~{oHg-j|CsW-M*TB24!ZHU?lwF_zu z)S4)E#)HbKopeTDi0b*V!(=vL7kpc|ljMfZ;G8C@wr zGIVd~&ap8^w}y=(x^yhsn-8M+T_U(g$4e}a9PkI>i9 zFQFge{Dkv6E`IK%|KlefJ|E+vhI0?+N1ShQp5olac@O8Za)I+I&Q~~pkYqJ{G(E=-*FapBW)WEEUX%EvrrVC8Fn9BMFCOiE7verMo zcBB6Y|e(+R7h01j*8&p=PtWmj0Wrwtc%4I4SsN5l=L`IX$4w-E-n^aY)TBWK>Rh!(9+zYuU za&P3G$z71Urrq#yu1(!GbzSP3)NN5ereT4Cl!h7&ixli>s8DdA z;7vo7!ZU?y3a=FID3pHwo5Br+LkedUO4{F27*aT;d6(uU%`KXHG;h$Kd^%B1CymIqocX*s9$lGYnqZ)vlqy-s_d_9pFJ+Sh6C(Y{K1oAv|R z*J!WNUV=r5_C4B9X$DV-&sFX;ZDN0IIk-PiOe&_khzM)!aoHF}ijQKpAQ z4@vb>5j^Sc(OokCi0*T`@9Dmx`-C0_Wf#gr$|K5Wln;L``Q~tC%7uUnK9>zHm$|HR zxx(ctmu)Uvthc$*;l`936K;&S@#1EUn?-JHxv}TQh8vRJuiPwfv&xM%H~QQ-akI{i zfEx>LB-{wO(c)%>n>IHF+*onrz>Ot0J#KWlap$H~2V-t_xG9@8xGCElx#4ne!v2N* zi2Wr88x9oq_v{Z@3KGA^{(u9O{VfLt_TLp*@9m z5#~&oQ(@eNIS|H6m}6nKgt-=G_1BVb4man*>5Y8Z+KqNhTnXa(OU?ZLRJ8V_h#IP;G<_X&ZY%8$UVC%qX z0rwu43`cr?zo)evVw~%EZ2ud{;0p_Arx-xW%{Z-^T2WSp%~= zW*vOD@ZH2Lz*NC(g4qVM46_Bk<=G~_EzDM!<@lDpBFr9`tud42cc$`z$^$ANsXV4~ zpUNvL->4i=c}C?Sm8Vpe+_|Q*Pvr%bFJyMf>{GQ%)dp3ER2@-uOx1v@1FBA_Do^!( zE%|xVJ)}m38U{5?YLux_AUC6iMh%_Zl-wt^bZS+o{ig1Wx4i@d-wBOP}Qs9C1PdZ3~ywOFYi%u7tE|S$G^9|@BX>UP~ z4m~CmtMqu$V@{7dJx=sE(qm7L5oLFJOPBUY?;YhbZ75$;zNLIl`H~Bg;1*ntxcn0j z|Hn@}ygcM`o68}WdtC0Y?y=#p(PX2+MxBis8!oq|+)B9Ra7*FVid!{q8QiLJYs4*+ zTMKUa+>{MA+y9JDx)B-!9V*7P}WIT&)V<6zA}or4+&BMt%%4jf1peQ~hoz~^Abfx|(DS(J3Q_3w8zsjPd%QxJgxE6;CaaNDbFKb?09kH#g;b?Z_2!m zdDG;L%bON&+PqG9)8X}-Hwtew-gJ2*-QE|kGv4(0_~uiU&yq4{d>Qej$Co8v`g{ra zvf%re?>^rrd>?Q;<~ZVb#_^QnJ;!a1Wu;_Um*XDCbB=!=?)}GiJe=be#|@6V95*@k zIqq=W=XA^Il+!M!vOMNA;?(1`BMKK$IEunS6c(be5v7AD$$TYBYf(Cj(p;4GqO6H> zS(HstE{JkbluM$l2&*nERahlq$+Be4yRaN#orEaY@8g7gtSO zOX8)9q$yHIq;)9yP-;S{1EoHcT&N7ezJfD>-Vu6Z=F0l&+q*z-4!sC^JLsLE zH-z2;d>{M)L^^~SL>hHVG7J=hLlJArKrwoTa9Ve7$m3EMtw$FLp3 z;Q;q7+)r>{!Ci9r4em#{@8Q0N`x5SFxbNUD+g#zffaemPb9f#gSwXUZWDdy^k{M(c zyi+U(SYBe;!-|IGD^|)_DPYCM^6S@<9}ds49AnwWW(S)dHtX1QuxVf;!-j!P6`KQW zUa;B2)&<)+wo~*%9O&48<3PcIi31A<4)!zbC)j`Cz(zm9b!hnPza-(W7u{D4v(Nmi(6RFS@CPUV;? z9#s^o6sTfRr9~B!Dix|YRL-cEcq{pjc9Fhhm%J5yfMQn-te5_9<>t+^0CC*rM2>*rT{gaf{*^#Z$^uk~$|#DSOfT zMEQZ0H7hGFY`J{m@|??iEmARO8<_Bb6eqdncGut7q}gAyTomm+ZAp{+{ryd|z;U;aEDAF+UZ4Y8>A=PC3r_S>X7{an7%d(>teoPH&u^Iel{a;PfgA zcTsqXLL!P~p}s`vB1$(=x{GpCl-7J%oJ~c2U?GG&$v21Z zGO?EwHxt*6xQ@kjD6TDWU5RTTu3d2r#kDT3J#ih0mo8pq@v4Z|Uc7c9X^X@Y$xEaS zkxKt|4y75CLMTn4G=|a&tSj`J(6^yqg?<_OCFrZrdqZFPy*cy?5P1-_AaWpTz;*}Q z8Ent6jbOWl?Ea>8=NjH`cqdpsXg2&sCZ>Yl3qzn;!)SyiCP!uS7U^n3MX zpXWfgio_ASa@Mp<@#!+CB=y*8cohL@o6%m z$$=&zO=6ljG&#|1M6)r?CNvw8+MxLt&D%8Z&|Id4O-qlA8yP+sXEIVUl7Er>BK=B6 zOomHlMB58(3$p996}8lpwr8@Nw9RPyBD+C5pLQ;JEAp1)spRS8&B$BO;YGegevP6g zMMFBBDU#^)rqhF>0iCWC_2_h=s7_IbqA!YSbh^{2pr}Qsh)yv@BZ|6oap@k?{YhD! z?iZ}vbidR6Kv{<}i87h)9%Tai5#1kjPbh29J*T2c#hZ#36$QPo^ggpB(EVV!!SXlD zU6z|H%iMah>~UwwodtJRtbVa7u{vaR&#Ja%S3C9)(=`125StyFgT%aqpzYbqyI!-M}LKWf_?}65&C2FE%ZYS1i-)1 zKcJtXuc5D?KS5tK#^|T$KhR&JZ=k&?-qjwj31Z^OhM)t>l)S#th-ouux?`g1>1q`!wz5{ zU|(PhVxM4#uw&Q}b~<)j?ACDW*yq?^u}`tju)kxUVE@3r!2X5(6YdudFZkjp5Y*rc zP`7bh;OOFL;JCzbhvOPY2S*#n7LFSnEgVm{UT~}7w#PNW^@yuziE+K-8vTppFVb&K z-0HY};rhZg#ZAIhNacoWh`fuugS?MC!lRAH0*?nCZ#->0w|H()%|?^Hjd>& zFBhwFp_Pk8x%ep;^U{gR;916A86V12DzmW6j+LxevRTPtC5!X8k`I*}RkB~nqM{HS zepji>f9 z&+q-=lRHf%n%rnwqsfaV2~8d}tEH;;lyW1ub^8C} z?VIdxvZrLv$nKCmB6~vin06uU0`g3XRup*@%_*`d5^qC_ekj^eZY+;kp8SjCufpXKcTDaWtX^4bu_m$h z#hPH!h1DCY1#2>E4OZW*^;jFQ)@H5AYRqcF+Jtohz&ooct1q5=Z0_0IvAJP$$)?Zd zflY@^lg$g8Hk&gxS8Pt%6iCzA6h2fmYHZHgsIMX;&IWstOIQ#wK<KI|20IKC4B8mX zF)%UcV-RC7#^8*Bje(276@x7X4zvlhDYP*b7c4a_7iC(<(!^57Qow18)dnjEMgZdo z!-e6)uwfkjMeCZxrsDREn}*v2w;66GZaQuYF8-f^xekw?E}}S=z!l7G>}%gLj#J zmDw){|NLDKFGXoCKdPBr%|_L%U(Gtz?7Nx`Dz#B*My35!OQZ7lm2Xx4cjb>Oe_r{$ z$~P;2Rr#aJ_bY!``Tfc_s?e&AQ56aB%t_jlWRawjC{55U% zn(P(X8rcTzBJ%d+34{ob^`t1HD4^&;mw+z9JPDt4qwG$ZKub#5iL#usGi6uGTq=50 zbm{d)uNJ)oQN+CP;@X{Mjb%~p+T2-lXUm$;TFhF=+MKmDYc6XG)-=`v*3PWmS<_iF zSreaJu{LHcVr|FTi8X_@4Ocr88HNFd-xvzzdl>F8>|!{>@QC3SLj}VIh64%{v2EM7ZQD-AwrxA3{PSgw0(=TQ~NgqhUVvwm)Q=hH>>en0u#K;6pgJof6 zv*BUSV7hW&JlSK~qqiY!5w@{yk!`_i!`8Glg;@3J^yl=~lAaKskYEwLh{f+a_l=K^ z4~+MXk645)LYDn3!^juY41gv;NX-n8y|NYf8)N7EwnaK7+M%7BwA1~ zH+kKp{b9TLc>G-79;MaZmb__$%{JMjQtJ51ks7D;nmXZDo!Dqus>0lyNwsXPX<^#z z{P(Cub0fvC;-mZyG38p-SM}B5h>+%6WFe^-S7Kj8J)A~@arx}mwgd_!DFszgrbuEP zHfH5=Id92RbO-%oNT)lHrWYa?1xBaa1ULRc?j!(+pW@3XY;YXgN$jTBB-i#>$iL`uw4+$w03aY!@F*eBPCP3EQaQqV2ZE>x4fW?yAWO{1M{-#&<)#E*M~ zx3XKYs_Ooae;q9_;2HFYa4xgbt3k7dg8CR<&8UT=rPQMA+H!H>o_5Q3G`D}#w}%); zAEt$XkMN8K(~ZYz=dc6l>L1RAO@WPp4S~&xf;jVG>7A=8NGWs?K9633C?XJ3f+NJz zz=CH)DReg|)@K#x!0ZD3>2-R~LI9AN{$$(4*TR0edVWaanfSCtc^|7es^lNe^6tJw!5bo zbiy4mU8bDYdH+n)RczIM0vW?(g*I-EMa5=oc0s^co;%HtY)@zOQR zImOWhZ0D5E=6~VZKaWmAJqDZUZD(jxZ#c;@g`I}Xlxbp$-oc7EM5{P7P}cv&L^JTG ziI4#W8e5;%08JRRbUKtgdma8S-Uu!L#|jq+ucosm0fi5U6%dUl%_h1-{v^^QhC#AHZV%@XVIxUE2Caimq*%aF#J0dZMH+{- zKt07o5uC?e07-!?A4-m3&P&7c;pcT$;Z(czUtt^5?rb66_UFK_4W_}Y_0 zr^Y#gicpEMIBlw-A3qP+x68iry9%l*PeX1EX3cSZquxb-(trZ6o#pm>ho8gyw!VLq zi%`oO4f_`Gcc7iaH2XJ4o;}~b_L26FseQws(&$_E5z=TNG=+h{kXADjtCjIee``Q8 zx_x&H#0pUhBo;fHtP7-zstdcz&Ry8u#(f*OM&aAng4u!Ef$QBE#rBEc2$Yj3Befy{ z`(KgSkxatr!>z(|!@)Ic!e_!^M4%VQ7N8ZuPC+dYPk)}moMKf(ED3XoSCXnEMAFK~ ze-X*uAc?f?dGy~$7sd{ZO7&YQu|+m;|8BKy-%guphkG}vY;>WHGFYxrxvZ_+E;rR> zb)r_OPW45P{;RJDF?jY%y{%Dq7{QH3 zkM?6&VZab82WfsLKplR>T{nPFI{R-pI7%S8gotE;&ssMaY0zciSjw zlA`33ubKZlm=k}jXT80Sg7G$DH804_7sj{*97{<6IxJ9^ytPfZl=#G5|>5P8IyrSF6YLjYPwZA6vA*HjoBWk@t zW0ry)MjwV3RirmtzEH0)?3w$kuM44xPFvnm&{A$cw3MI3Nx@yTR0 z_R_<3hQx=6uXwlK+v4mA_xbvLqP=6n=7gX^qW5F>14zUZQfPuKxg+JQc{w?qdV)Se zZqX08N1#X8-AM{+!b7NyhS;~vfKci`H`jI(e!hfR?+q0I#pwd638#MIgxdlAh+5kl zkKy*wI0Ro$b-lVCLmKT-9B#r~csnS&xV{mcex3A9*X7i|0yj>x_jWTn(r4*^(t%Zn z8*Om$t>dL9clw6Dp+i`QP@aUyKPbP%*S(Wp#U1!3&WfV>Cr*lj36EYB3gaB#$``-iuD?H?{k{!$s%XInH;l&Dm_&)URUnEaE--`FLr195qSF$ zz@b5Z^$}dW6A+0GY?DD!p=dORoG*=t^@PN228(ydpA`510EIHGJT9kt_~QT0`#vW8 z+T{N@;Qs&`X20p)pAo-b{(X<~fA@Z;H-Ap{exLizX8M(M`@M|%y%7@1e82tU&-9gC zkfVB5n)sHS(u??PwEs?N@+14I{q>P@=nMGFd)=K4)2nzmeo?!7dBppW%;kqYogFwZ z>$zwC_eq7W`#d98@t~CGCpj@IbVts*Q#?^y{6Qn(Te8jW@<0Q>Q+%7n;+dprm-tL> zqQ~8f@~Bq$nVg-cc%YW}Y57L;=vT5{umt=<-`w1*LoX@nemlNazTDrETy~ldG|;|e z+w3+Ur7}B97ky#uzrO(zemh+fo$MChs^eS5Y3w||WPW#5G_t$AwaWUvTqNf>e4MZQDOuV@ z-j_<+S?<~Ke!Yan5zJ@tc`{qsS$@f=>@@9Usd_D%+HHKu*z{JMW^H&V#o1Xtx!kt$ zen0Tffr z)!=B{hs%5W9zSd^`^Wt#0r2_ee5ZV-z5l!V=Lhr-ztmgY*PnhXe?OmIXMG*r$8s)Y zCHXl`v6tNens)Gxr=fSUhqIWyoe=C~?*NB8*#lX?hj(Td`wd|Em))P$=;s8moB6CZ z=;EBuYV>v5XFvV`@chf3$!hd)60@5*s!sS0yok%=SB+^%nuP>tQN6`%6Mo;s0_3FL zEx7onzvL$0ELwaslk!aW$~@jIRQxoj^GsJbzAO-YGw<_KzZSc`n}YIOkIS|{EjIZt z?`9ou%eLP)<34ZY2*syDb=c4cS_|JBt-H~^_#gLxul@H_OZjHr*;Se6rveV7JPWTUexLF1VqM3fNL80(rrc}1I z%7Z$QS6tSKrM0<3*)p=6Rc%W9VZe?*rbmKR_!j)s`}vCdwir@q_P+?BSjh8L(ZGHT zJ0D^l%AI=bM%(ad97)bPHhHOn9WegDas0$ktcx3-{ z{dKjP+A;LT%{paxF4z%q3ze2F-nJgSpm(%9JPY>f**#rxnL@9mg02t@SL^DPCnmUl zXfbw+^R**AnSmbw49s@eyK%Ji>ju&a%Lkc*6_HdS*z*^l8M)#dfnDXMb0oJ`oXC%p zmIwlp=s8zpt(DhpBDH_9=;3*v$jr;wZ<3pVPoRg=V8!eb_cOl)o-R5T=IY;v-ojy` zYU7Wwon#y&&;Yq#b;I31I|;6|Tdw432UY}Lha#i9Q7yVxm%VuH^mQ26hbNOuO^~nj zFu|msUG%yaMrb7T;&y1Zg9rpY;OXE)P129`T>@R=$W^Rq{v#O-ltgs$9s!hR7S{@I zgZ6_}Va~PKyxF3xbK1KAjyc>$xtIB@M>*#mu0%FD$X&OBvO$5ccl=zZWYcsvhE?&BKuh=-7_Qad>0h<8^G#C) z>?2>0ab^=XRfApYyr*nuG;S9M44-ub9YwGEt`Imi{`nEwMponf= zlwu~JClUjnakJly$9HB5O@aQ4QRUNiwd**s|{#+(^Hq zk9+1}_h83-Ei6|J(ZaNS%GC%>_<3%K)wtoQLoc5(cm-;fbV21o4gq~p`jCB3oOQ~H ztRgy#+`U3G-i?A=Mb`%6&KS&&MO8PapEI2Zqb&_28d?~7g!IE_$yh%z{&dja&3}Pd zEc-WX@iPs+MykzXpRHshNsO8n3Qfv6o~Tj&fN7L&2mi$#sBn-FhkGMw87A@A{xw!2 zpRBJPrs98w;{tsStG)FnZmfFYPr+#NAonbauI-$zy$0s?Pih=xnBAHB+q(Bh!fkZ#riT^{#9n|@-^tvc;yt=31! zv|j6P*9W^i?Zd|#y||w+DwI?#{DKy+6VS9!Qv~XAl(YRh0=+-p34WRVaY&o)21N7rUg64f)oB=VhZT`olRda` za3xk7)CzUtp-Jk)6%_To5>GL92y4UHCnz2X99-ZiYT`JrX!JU+AMPZH6aTLHsDdeh zNs&KUINty{1wTSgXJ^VZ?nIMa$GW$nBX3AAH&hH-!2WkFh`9wXV;4VJWvp|EHc#J8 z&z=1)l+o7$qxA?|DhC?s8f8j+byn!K+a%tIJ>Fsdw`tO7srVeyOT~b$Z%uI6%x%UY zhd{VTt1y0#1JEN`v~`{l_5rp8cTU2>R9IJh2iE}^T^awhr!cgIEJZ;pBcEH?Jvaf6 z3;VFLHhEAY8^btEb$RW~a(XzwobNnSI-NSxGh9Eh2=aT>TTXNdqm1bs(|5xVKd2@j z$FSO8PNIqT;)qCZc*@$wE}e^IdQBq43uP1xZfW%sd;z_f@lZ@&QlQ(P?S~tvAa)_j zluX+{`JDnsL8G{pE8s60i5UEGKxIL73d^L1#<`@mcqF*aL zfu1VNVYkN?W(<@gbC(JR-{d13^BF|`Cz3Sy>~v-c=*&@p2fTZ{F|g!%6%Y@VCX4n<*p)PjP!R%GtL zpI~mZT(ZJMEHA?ylrU~%$Uk|)uW;z-knk)sFVXJY2P|lH0a0#&jl_yFWepZ>zxh950eGX?Fb!_XMus+us7$iIEznWnwK6 zm^Ji^I%a0Yb#AL~L79x^eXDH(HG#*&j5+v^&*iRF%~^oqRWss6cnB=|E2W{cc> zhS)Fo1JoE64EhY`p@X4kkeW1GX^FPU3#+7U>p-+bn;I>|Iie6!)Ch-ezWKCn&#^BE zk0R6jJs+Mpyk4omd8CtI4C>@i)CzJQew6DNQGT<(Ka`=sS2)|QmgR>`SY|*9REr@T z9$Xv?&B8*7uwMH51LBaSL=;Ur!5CNhF>r~xbYiI%W|39bGVqD+M^R&UEgPs+>?B#C z*DPf)sn1k;kI=nznJ4-e=t$6_MLVSa*TBfXJ3g5)#l;b_$#Q{i_7budrt4Yslq3}0 z8FMZ7V8VTyIqQ}?MF(WZAXnYT8?#@(b!-(}3`mMj_vuH`{PU`eJqs4Z4GC9fE#sk9|$7O#Nv86B;8Ez~;lJ6>?RHq}# zU-T!#fOo!K>=fY>w$sWs*TWaY2gU?Z%&RSBFQGm=lz}OUJ@^AVau2wfEf8Yh(ihXG zlGhdB4Go2x!O)b!8fKW;5(oWDYHhrhY@ie(^W-JkW}-+L=p3|x`bdJqw?VFHW^DqP z8d^c=Ms+1vyEeiz^d8a)q(J|@j%204Sg@ZiiE2rWc38ezU=S-t3RKMz%oj>_LgUwD zyR~09PVa_}bR!@>;f3K*@VK~l99uJ7bqWyxgN#*Sv#8$k=Gr)}}zq(k;Yd9v_7c z`A`@}jkaQ{vkQltsm*9oJy!6R#f=ec);mpmS8n&}!OvJw2XYgxy4->gvBSH4}4%6smHNR3g85G5Jjp2=V*FL%$|E465&cf3qu0CC~v+pj^2wF{+YtrZ|Hj4U} z+^uPKJ17xG6{PB?D%jeg!NEX#&>0phgcWY|85Zz%b+0}+j6BpunmNl{iOLB9Qii#^ zz1Zm;wsh7VRma71NV}u{tkKiNZEA4}f6bdOa!d4ZMo15a7c~zeA%bcel${g@liIX_ zywoA020rzWwOP!`S^WmCET@I7^IPMrece6luPGj4tFL$b4J0 zh9Xg#PDX%RXg%1G@E80RHk>L0byDWQg#RVd6aogM`q+zuzbnY})YVSCt$|bI7y1lX zwmOFdqeVQE=QfL_>^QI*Bl{jdW5NZIeO_Nuzr24IXa&uF%|m(XKw6v){G4qxL85&e zw262H{`IfGQ|6r^$($TgLSZYcAXt-B_~F^B@#2q~>GMs=(~>@sOA z&Op*oG3EYC$_g=a_c@dl`kKvNqQV)9ByuX8GU5rpLvO!V8Z28{t~JLNySp25;;-Tq z^Yi_ysOIku#Qd&+J)nq%SgX)1@*e#fKapI2xj-RU1-cpIOo!#H?fk$=CWUWQMxlL| zdGsDC3sau_!c6*zX6!u-I8@1HwaOUnQ|EU2EC+^wN5#z9m)jx1EOs*{dc&;O$z-#v z)gu^HSWPD95%c7^D|{kUUB69oTL<95dvjVP9};Z`CBGOB5FSGR5_MAHg-6y~|sM zKwp1hTnci2C4<(A4D36$hYhTwdA{AlFG<*RS_bRegPEChSttWe4sXNEh+u2-T!Z@j z!N4VKW##n-Fr{1UO;+RJALjk@BF&MRM3VgAw$7^&Tz3d=#Gma-9cQU zUl_n_ub@=Bbq#t$AW*A<=WKpyN7F=>#5|cc;0UpCrIz9OcdANG0R(?N_nepdWFYBB_Rq)A2Jzq``7}-;kU_MLAxHtI-NKVKNbJPQWg(1P~s>!gZV(V zGJ+FFBTz0Ad8KR+{T8SfNa?E(m<`Z{6_ZhC)%Ocb3U~#7gj7vkTQ{ur{{)B1$Qze! z2w7##^`5AfP#~^WY7{MEreoFQYO0#wDLKGcng*^^x8yYlZHz~NcxI?3$~#qnl*S(j z;uO(g)Ex;CDP%j5MhFPlXh>!0aHf9-MLhkQn20)OR~CHx0|7Lm34dX`!QcNF%dUD4 z6hX)F=7KKNEMd>RNSqVbSQ*p0r=A{y%6jD+hq8qYf?2!N^Vc(mxkx0lBzElT=y#3; z2F5U6N$<3X(o+<2DKjsW|6C4CpuPi(m#X~>k)dzTtGkwLRp5e}8c@`OMR=lEJc3Zl!b)mEOH3T?u*%r2VfLJu^f*x6C+S!>O1{CTWodK% zY``NVm3qdg?TN!qu}CuJr=(NC*wylv(Ys#UtD$FwN8uZj^T_clHyH3q(BnEF#S{cmi&uB(UA!tEyy*u&0}|kT!zd?=7@|Hufvqyu78^9y0nQNMznN6S%j5Q zy(puQy<{Z%gBYHAi?Xg4)Cp1*o!STsbGK9=Q{Oi%Gjs#}k+TC`o4bvDd|Saw^pjdf z)0vHu*U5M2lXJGFYm#zI$+^RD*T^)H4Rg$_@D3yn-4$KCwcN2-plI~p&wjHmiC=DT zE|FRKy5p=v-q5G%M+j-H*>-}7eT^b9d~_znWNTS{#t6)L2?L{)-3CuP4}`^yr*0puph~DYEGdwyxn`%|8#;)_gkEhopP8SekV*qN z^1qjFi{1WT(LhQez79b9q@m|Ha{Lhj%7b8qBiF%H``*aF*oheZy_YBwL!F$Q5BEw>);UTA*`_?hvAqU7%P!lj!(zep{IQbc)^56Fsz~u@+9>y(W@MtYGVZ6zztE^n z)?(|7jQC3=@xmA;->7g>zW2kBf588lJr{9(Kc$O#KNW3Yv&&8@&=WJO#kTSc1T5n zZOEx>-FJ~YM#xV9V^ZZ19dgIif1K*H)~4O_1tmkMy;KclO$&LEHcQ(=lwJhv)?7R-UiLOBF<@u;e*@#Ep=&EIck-}nw~uPYDMe7cn?@P z+s@!IUOuXXyo#cx}- zw)3;YOt$HzW3txk%f+te3VSUB4NmX*o@QRx;yuM$x8hrpySC|7GDR(O8|v|qvX`J* zE%UTO8q!WT?u}lPP_iwG)`(ssC?%=8ucm_$5VLV>E zDUpeuRP8T!UOA#ifr)IX5iEk*W1M2^bmQ2nADj?D7u_K3Fo()x&BVt-wjk}%y?^5E zgnPhW!47*>QNLfXuL1%gA@J|KC=UyEg$iIpkkL}*u>^>5yVZdF%W^?Rs9_$o#(P_V z`G6@hOfUH^!CSat@JKgGzJgzZRH)qK$#|5H7QO)sXp+p7)dHykGeLRStIZ&80sBEH^{YQjU?xzK;el9S zf_w}?Rsk1*X2I#wH@GEqpsKVs-^951XC_D{v?eACR1>y2)Ld!)rJz?}YM^bvmA@{S z4QvODX9}Sn@;kq8h!+9s9A^G+K{)~bzyvVTBv~1T4t=;jtf+pJ=&8nw{;?L_zP3QB zpo+vKg&(j}FzF@?xcV*qc>e8>POt!iDOhzBbtd(a)e`7bNYzqL?Ya(qnSRawI*1kg zD&{qhI-NSwx>5bOKHY$BkazGSP#epE=X|`vy!eJd$EV1GuHZX(YR>Xv`IP(y{|OXo zXk}G-PC>H95d88Dc^cuzpRBl*#LBJmyuvPE%{a=}@=5ugfttvc=;h<`YWXW+8xWSH z<#hSF!5uKoz5Ng9R~6F*xnUbfmWbtK@^*qg;E#+PCiZycW%7E0yrfkb0@p!KA)(+g zAS}}Ms&hZ{6#_$HW5|umIlauC`yPqz!<$*#xY~$WuIAkRH$hurZCj*3Z9%rE+F;rk zSvKcr1(}0QkuyP9!seXwj|A@F=rA)8%}eL*3OpcYA!~&se^!Gv$;Q{`u0V8gx(l0E z_iOpH2erW2KyPq0k(zVQ(F=QlU!ph3&GGr?g}H+IA^@?KE?hqZ7aO?S$)7nYVKbNla2<3m z-V>gJzk;m@+dqM(OoRgNpex7$&|s!ugkaX6=SZhW9Y_d7Ohk7?X99Lm3W%OQC)jhF zyPAQz@P%leYA0#=dEI8Tt_YvFa2<2K!r!2u=x~w@<%9V!LF8~eSWWs2fr3ARh~b2= zstn>Edk2V$R-xe(u>c0;gLR<7gzrXJvHETPdnlpYSi1Tz`5y3M@K`GP#)Fhak91?n zPn3c4;9{^?J|?u^|IHLdu+dHoGuD>RkLiQ%KMwGvjnju1p!KZ<#mFdZ!o`uokkp6~ zh-S>aa7$67F&U=$2#NXnn-CYVr#2X*^q>6OLGF2`6w?v)cYsDVfYR8<4A8p3O)IUA zRcCKdALIdn!K|LGf9r1o!W7z`tgjJb0+wo{{#J+A?+7yqPx}lEx!(oWz)a#+{ZdEQ zXAND3SbP`pA zlhiQRv<8cE1<7&T$S*2^g7u3*TZB&T z3)wm;eYa2_XjjBFn!0BqrQ>(BC-$}9d&UF4kWgR<@Ek0ASbfC7L5N}0cz7HSdvl>d zP+=H&G8`+r=7aP82cWTD9J#y2eHA~;c(UK@&w$bYGW2Xk4wYT!P$f_^_!*4sbNib9 z^^iuyW6o^1c&h#=kTf=Jo;KyZ{lO#fG-mB6d%8YWRBSfwEPEFsqmgw8-7tHVUC-ci z=o)qhsol3=E%4`P4`W)f5HE!yF33e1^BkS?Bn+MLf%2IwEl~_ z2E2n@VYcxTQ3(_ZZUnIS5BV3v0I4jc&}s1rr!0$G)Wzh**z9`3VpU3*3*^NF#k_x* zAA7?d;Nn1e?&A6O3I>Hk#L)?0csg!wcIN}d!Q-$9q}+eqI1{7F&k`FK-nNIBK{1zo zco!}WY6mBVDMFM`NwP_5C3`31P);l06e)|HhPJZ-9MiK5uAPjD*YKK^y`Uu#Q`+RLSlHP_v#Z52;noM z+-~Xf4F^WQl45A4Ll+u?MKNK>s&g1A3=Dw4veRPJtql&~!)no*`dHIase9`)j_iX= zabe`COV_pa?Sn*7rQWGi8(PGbFsC*Qda7F*S;UrrrLL&s7+6G=AW7lVngqUwH-t4r zH3Z&)nm`?~O>j-9Bp*}O$}=j=E6mGt78MpM3W$omhDHjWqNBs6Fj9jl%a$9*Kq=>z z7nlDk=aEm5S5a7&ZMH^EX7B!_MHA(JOJ4-O8^NCJRh~s%IPj%s9

B#;qdST2o00!nL4)7QLro&jZD>$I+c-2;4-VKT)G5_ zS!grl%9%Q@flVYUx|QCksNaX=@5w$XG=xIE*s5O>)jlt458N@7PHm|iUL$feC zd@YSuZr7(ZF2nQSYOog2hlvyP`Ng@(f>qJlpdF-cXir8@Vo#q3HsHTqYq%u_*r6?I z-CDOT$RBn|^QJKgw&@piO0#ufmP3EidD1!`SNAC57yX6y3I8TO1#T-pLbQ0I12=*t zEn?rVAJUH+gzD<}^7R;vkIk)fA+mN`$J{rA)QRKDww7Z^(LV#%N$v`N5nI1GXbatG z2DiG#tKZglMKDO^`Wp*@@xpMezbak4iz)US4P6Q{SA8xRx(jex_!vsV{7NP>{bfwgNN97Kaaf>-5`ZZUw3 zu*osC;l&Z};5-a;V1UHZb7UTj_0NNe)8Lt2LgAHi+}XGFD>~kj>h@JhYB~43T~8;M%`VU`Ng8Xg5pKXVAx))v_hlLiB{HZR$0^p}K5L8bB03u`|y6!A>b z(C4)!+N%tyfT&^AXtr7IR!03Lt}$)PJg|)Ui(k{ywsCM4{TF8N~;dtIs)s z8cE%#O)z$9+p{(Y`-211@GKD9&NiFfmbgvqtGl*F`_&O01UEig!nPQP&QTqBH}ow` zhu&cyd^f7AthV2KJwcu5S1oPtl0RP$%-W#b*nthLdIvj$pKyr8X2Ngw1A};oR0Q-u zaftoUAORvPPr5taZbj@UF~O#L*Z%xqQcM{nUzj`f-fLtUq^>g${%zH+M|2r%t_jcY zo2}u-h-0i-Rvt56JNKs>o*^f&S!SNvn}#8)r`&FyuB#iI{iA?15Zz<*&Nq(zS_F2?UClQ&dzaDATsw+g)wjAsn+VqkJGkyN2R6aaRc7H9 z2uajO(p|rAeEZ+Qk|=iE(yecMMt*G$e*n+b-IU{=OSirwVbQ1Xi?Do-FYydIMrQ|3 zai=JR9@41NS}%3C3d3ekF41wke2_0Edq&}LG<+uBQ#aWA%t6)xa!`46-nO^x17&iF zVu=B>xDqOfj>!p`$3ewa-7%*D#Rw8~i9(5Nzf3Nl5wbTs1T^wsF11FOQEU66?>##di_SS{qHD-Bo*s)F--vf1KL4|lQ-zzN z((tU@GTx)4QFs>)WZJk@tdvPcR9aOU(_vO#lsgt#22smZhAKanXBJrsEK{klE91)p zNerk!nJII5>Lp)6hwLNMGCs8*ug3i~aPoc(KLe{Y<1PIUrYrskzuchl zNY@C(fVFeA~E8wPQM>I<_t~l~*V=ipj)fYP8a` z5-xcwG8d@EX5w1zl(!cFay22FX)P_5U@BM(R7I)@n%|ai6wd{!;hV1xsetM0@k5Bi z=CSjHRf^x_c9J{MUC#8}!ZROHbw7 zrB9(7P?mb-J|#~vA3U!Zuk^31cb!111z`d|vEN8F>#G}#G7K6_B$_l8mf~EAzDR#M zXkH*Q1m+p#l7$jQDG)8p2Sf{dC>{&u(74!~;Ve}vvKQK>b>N=mmS;8dS7gbvmt5rt zg$P9rkOQfdU@%ZgFsgOQfq}SjUtP@Ql;CIIcMQT8W|;E*wAXBO0W@QT02w5 zBDdMv+_lgn0w9{nE7~LA6awG^qTSLgcJe)P00jR_)OU&B^G%Pk=q-2)NAb{2G|gEM z|EK-HpySbWws0sGm5xHCqXFKD^3Jq$%@_WWio$@TlhI5y_b5IJ2V&r4&D#r(Qd40y zYs{AmRHA@rQd&)jCd0mbIjo_y7jpHT>3#)||0j;nWlMTtH>bVxt&G;7K zjgF>igtq+41XqX+6?69D?L=1}APaQ0NJqMp_tLd#bHP@$ljc%!L#pZbJfGY<#-&vg zqWM3}DDKPErhoHa0`I7ocFys@-CQ*LJh5DuKLR}0i8Jl|eEwi00yh`WseN&g^e8XB z4%deB);weBL1e567s82hS(2D|p6vQ+vg~>oZjP$+1RMTo)f|;o_9B_r^`eE$vA--P zSBUe*T)XHoLQa_T)xxXnF@BDhGu6Ck*`z=H`Z119i!=0T;rwvER9+2}&Zu+y;?bWp z8XZ_?&P5aPG+Z4D=gYa}605Wt0-a6gX|Aagt`aMuRqkyVXWKc}qtVD3xsD3w#S_zo zYOz+B?K5Ym6TrfBX_j28e;DRO$*GjARLzvlRMqmDB~5}A!WK~r@eAP#=?hdP zsFJ@Q#ukN3#RCYadC@%6AM8)&ORNKVHXg9%jAY{Qd25n$<_<*SV9kPVH44k5<#KZ2 zJ-Hq(=AEQxsd%3srm!sf5~mas$bw36r07z4QX57Hq!^{-Qm?WXIVqfKM%posH?mz`>0X|R;VU97iZ`v9514ly;FeA0i zo%)XoM?zRJTeKhAIga-IqpawC==Q$ffdz&pc=~Z|Z~Kaw5^78opxmHoe<57Th#p^^ zzOJgFs*$!n+ltIZ8&4NU1uGL61R?N};A909vV( zRX3`Ft3;}#)yKKEG(74ujaX+bBUD0Ea#W(0VgAzpRZ=~!(pBGXB(De5uNYPjYGyUZ zHxpa=tQfACR+((8R@rE9H@X^J_IC_>#yoPK6Q8@SU|K({VbviwC>R~|jpWAQZo06+ zT5qklHO!kRnUd-&84bSwuL2H807g;iv$)w>ttG5=*DLE(44tL{+0*1%bS+ZWt?Rk< z_zl};+~@rIo2FU@T4po`?_(>u)ufxqn>d?{X^7etP98HRS(8+1Fxs{b!@G{LlV&xP zKu%cKLF8}>pISqA10SZVG5x>xj>Cy)8ff+nZ5qeNsb$X9RBasxy4htaHIo|Jwhq8q z3XOQpx%Q>gxQW?T-zYMwTK-J)^X@JwJ%d=4Zx z!fIn)QXAv0SQM@vqWBkZXd-YqZI9Xw?2GzqhOXjuQnsl(xjGryQ!ltK-nO#q{{m6B z2U9V?)(Kn7i=8$N)8~ol3#*_keB0PIZ2S8Ox*RPRAhXQd{(gimL(9juxxIOBC5iXk z#is7K4zq#Xz;5!A3+Qypb@Uop|6!N4#pmEP?VI3}v5EV{8ry*2^o0M^c_Fv1S4Y@z z-PjAr9|@QWmYLqXwbEC=h1x*6~(2Djg3Umv+l%72=BM#3^EHfHw&pPPJp*JkOR} z_id|3x_MqsSI2G7yS`74W8KN`>+iAe9#`z`dIw*T?*z~9K!hkZ$~qY$w=u{3yDc<*>_90U&D`xdcfd~#MiDIS$~EPJPk z!2RkI&_}P4YbKgI%yWKQHPMJXJHlgiZ{2rKGE0|x?6CuQ%|7<}4{Uk(nu>`qOPc%a z;S2CcJLdZ>txMT8=K18lcUL$NMgE&a_d?XQ7t=`B_!?1nsB7wW;m{-_jqNw9Zb#RH z$2#EXwUu4~aBMUq5ObH_Mxa%ro=Oz2`i<_n(EVbqVP)w)9Cf6y`f(-k0%p; zdAiUz-nvAT1m|+}x?w`ljLjQC0R(et0*GjO1 z{O8=W{Hl7CHOL-k$K3Py(z3f5dd>8&#oOzqd&n*28uFh{58_KMP&f6=`HwLBBs-bI z!d~%U=%9E;qEBKhVm4wN=ttqDaFeacPUV<(y4zhkR6bA!z|}U5Tl87vErOH@`+|S` zd}Z7nO(eAP&3;`69Ea!m_|CkvV|aw*K@q3CcpM$e{81rh4PHV`BrC3o*Cxgm%KUly ztGFn>fiLZUYY>SVMtkI#if9e_FReosVqTFM^!C&-7g2hQ_U5r15$^Xo)Yq=D5|TVr z4~avUgjJCq+PnHOv*UX7*CNUXQG@VIYM35MfM`8=WG>~Ehy$r)2M_|igi;bf86#pr zE$OAO0lkjYKz`U2|1OjZ>p^#z5g#YS_w$t;O@flMz+8wiSP?mrCRv`6x8OxcBG?ga zLZV!!fG6barwj2?sQh1{bC_zXro=gx0(enZKF^gev`pfr$T_frPN7=ZZA?uqER+90 zO&BA}=_UqS!76Bgv;SVcBnDoCr;v3FfIvFC0YQidrYcd@AN7bj)d9zlZsaGSH7Nt` zfu6_)nh6<&SW%B(6LkNP0mYMP3acXTgg&2|M-<3KFInXZDmADGLk!KppN(wenmL!#k3X^aAAz7F;B-%P{vGzK9 zEx>C;b`)FMtqA+H0hwSg%qx{P#QCLL50vRZbIn4FNK;`J{CQ_lW~Av{^H`C_-)npS&9A!aZ@ovX0B*&f8eJJX)uo1LCZ0M`I)2s_4(tUK&{i%2Kg2K>Bj$UD)-dR<5OlgdlW4g8+fK&!hkG(VEy(+<*?3b-ip7>T^7JZ1o0VCByV z5_{3z2z|=HjGt^IV;vX?_Y@pi*scwD zl1!3`Cw4M1JGLga*%RBgZBA_4wrz7_+je$;-#*$Wf7O4|ebAMIRK2~b*Lv>fz7$Y1 zTaPV8j;PznW+jB#DY)2Y6GfJPZqyyC3bX&*0D|mkQ0{R;kWd)-GnZCSB{2901Tvk7 zI>t`)VeSt(VxI64T4E((Ok@O+1=QI;!llQfd1@HELidMx%^024{A1Z&V-ycfc`iRY zJCCP@eE_c-v%kXx6yRa?e?{~v!yoDce+tRKTj(E$>Ph`?pI8+Z;vfS`e-KvH00Vk| z2-d-%IBI?zmde1$&-^k_h3yDhelQmMU<=t0$$uIbB_mN8VFm{<)T_-M}#^M(?zt9l6xV05NAa^(-x62PDYfH7C|Ea9%vvcN=kXvUqzdjmwwad zLYdD^ksWlTD`IBU2>&NKfx?(P&_R2s!dM;AN^+q8C{0b=Zq2%^OR)S5807bJ;Bjizk+Ku+xm# zlgU`!WkD-0<+vDVrJUllYm1l{$*|s~jd1vrakqOO=Ae~9zsrMhRLD_1$cdiZ)bhML zhrXQOqCLop-ki}=x(j;tLuJisXA!EQvd*>3hSFTxqBUSeZY?!?64p)yddQPJ*hzdD z-2%P4iT)JbBDTwi@&sI8-u3?Z6yK6P_(6T?VkbAiiylUdlDKLT%OX67Ix0wt6njcs z8Mc6Y!e5XpP7?bl%!P3xTmTn4CG3uIB3nRlV;U;oA(QJPq7iJe4Eozge= z1#P5{2h(nXsWUSHS@6;?cRqnrLD}GSD0{aNZg~#=Tu3r}Nuj^ozkc)o@m>AK`^^hJ z_zD7N4Cy3Btb?oCqx?kY=CIx=h`E6(cE}jx*x0-GyW^V*0Ttcd4OsbdV}lwSn{VU? z;{AtNvov`C*P26jkki~e6t1nitUcr3>0vgrp5<@s299D2P$Xa_7!RZpvXyG32Z>nB$*|D#G|rEXUykZ%=54;m9Ii!5czA4{O7 zDSIp}QUH)rh()nB-Yp=OY!o)hUEEZ+NZ@1Nvx@MZ{#(FRyb|r7tZsRrnew%mUwJ`) zV|g^wE_~Tn!<+GxEx)X85fV#`2FsiRxmM?MjiRN3F`LybV3eG@5*NDhI26 zxK7rt>nUI1LeBNsq27b3HOj8G`z=E^sl{qpGN2xRw`ZCu!>O=jCv85r?wt=mBv!sG z??G&$sY`k17n0cYP(f#M0|m>_U13TcH(sCD1tvi=STX|}soaV{CbTi}k~(=B!NnkV z)HKosVbi7=o?Mk6cl1@^W7OPCP^0*eFqVv-Yai&y)K4Sm3HO!2Ign0dF8jZ}qR-_m^A3O&`b4j!&eo z->cnompTzXfRD~)!cD1+&(^1-o9t{K8_*uUhfT+a+vCwmwwlf0XLg8<$kWrI&ufYH ztJ+KTsZL|}sZZudGQ!t;SMNJL!q<~Wz{m27kC}V*(ChN;7A_y%L3Kno-B;V|+3W9z zZq?8E_vv>Z^)It`r@QROE9;leFb*2 zd#&!<+&+!@n7wBInSZ+RF?%k43f=&{C0Fc-UB2CQvviW&3VkiTD!kE0UH$mN@;UqL zJjsVYYrc6pZJvA@eY$x1cp8s+M>+|4?0ptj`*b3je-MaIs z?ULGx*pl3W-8#5Bb-7Ew)%vpbneQsyinMusdUSd6xbQf;YWG1K`5^GT^1kwk=|bxM zvo&FJVDqRmw#B|>vZc1QcNKC~e6@Ua^7IzdhjbuzqVb^dp>dJ^Hu)m;Aa)S)QhC$= zGW)voY5MiUTlja|@8I9BTdP|gHofd$!@Kkkgz1F!gzbdogf}{AJ~v;xAB8u2*OhmB zw|n<{uOuIKUtZMNho>4>8uwPum0z9Lm~S4J9w%$ZYuoL&T5r}~>7MLe$=x#DgIkAN z##x{3+*@DX&7T)rpU>XBomcrb<2DgCXEx>C?;l+sYlNT6Z$mFn4^Jmg zdrx;yYfr;Z`(igCuR@4tP>8~oHQTB+{LWL49D!-{C;gVuS$MD zQ}ong8n)`9Yg{Jt)PkxWzut(^IjkN(b^6my2MUZow@Fr8Tsi@|s>aULy|mVo0Ftwk?&NjU_K9+f3b$@_f^I^}H zz24fcbe{Ikvbru~mOoy4@oowC1-!^WebG7+7l|y|VQ-RY)dL=6IKijMzzz9_`eMglKpC2u7&k#ZLWpoYH9fUpiyEq zivd-$T3XlK@L8+}?`^f%4ZHl;M>&@6$-@kvY2=IhO10QQz~aId)nxvQyDQ;+(VKf< z_3-5bM>oOp^4_OAX|>p^JCC;9$-_ivR^hUeH}7I3cW2hnnHi`J_<^=Nt8tl`M0xfs z^(Jrftkr`zewq1WTO9k(n4j`@2`~xh(eI;BrQnMA1?1v@zn*`=|8iYfN}dL=fSEzg zK^5SOd;E>Qa->Q2Cx7 z;CHB7wUMn~*@6Q8f?%*Bl$7!exw=BR;6Yqy87}0&A2~CAf~Cdt4=5y0E%D#+-RY`#BKejNJ@g|IE0PL}nE~TJaIwGL zx4rK}F9EZdJqx`o-VhIkV$!G+)G1C38oI{ozrWSP8UHx^F#(gpn4-jRq)XSM>E8%RnP#DYT$Hfbjx+u2;=&|)*#v; zoRQ9nR+wv!bgQ=tgT21J{dmMahg)HqngDkRfMsckqYd_BMM`Tl?*V9);f7 z9>(6fMWXET<9^^h`zX2K5E)$mym+L#?bItX07uA#Q0 zdei-zzuO>eVszlUikV{OYWX+8T0yLmH{i}Z=4=EzL$7L?hRhHMd4OMFtty#L=XUx& zqO59|UgdfPKSI2tJmWlbJwrVkUDIr*Z)fH){C!Q}uDK?&x_J#!(*9%zl!hHxyKgDd3nTJ_M5d0dpb{`K>NJkaO| z?oa1m=Ykx8w(vXO`=|n?ez5-}AmR~l^)Q;X7gPac1ChmqEb`chuv-nRb49zfIIv zlzWF6wVY}}oq#SxFVt6z`|+7-{w=>QxDUj8lH;eGt&mTwSEXZ{EeNat;(JuAeZ8E% z9)CZC09bf)23y_jz8r)AM0j_G<9=P(0A6@0hJ>wt0wL63R;(qxV_P=c5PYmhT@K%! zpTUgq%M9y13}-%pJ21g=Sm?T>{Uwjc^f#XvOecMmfeKf=&P-|j$5%op<-TX82>JMt z(F|O@$FTX_ktkTW3~YLq{Vh;?P?6~jh`$BtQL*UtI{a^NhH$a2^gO*|h9gl^_H`9~ zC6LLfr5#g%AVIMJBA!lKFa=(hDRA^VIZaB1UR}^AA~|$Q22s*4IzdZ8O94wE&43m} zJIr0M0ijTepTj?=e`yPL_?aOWk)=>GsOXvZHGt1UNw+iL_c(r^hmlTZ;O)PMn&*}# zWMI}+_4|WwOgF)k0?BaJM;rL(dp+L-IfF)zC0srJ#3P8=IR~%Dow#IpYoGlLN1cpd zNY<wv#wn}A3WV<7DHgt|kYh++8M%M%pzJpzwb8OWk%=NkkKM~HzByw_#)A4I{x z1Rm;|^~?ntUGOF}p7${YAHXJA0Lg2l^Z;4PjUUaLre)q0&lpezuTrSuBRmVrt7 zPd12^NIm8tP?iU7r9!vfZxWGBY$ZeYthWha?OT)A|Jn`kYbQ2=U1iPI$u%22kKfiv zENwvdY;1m3u-uT&)aQ;XiF#@QTF}l!=fo=ydhE}k>yx_80UKb>!!eXuP#zGEtSc_M zTY(?2j~Xjix<0-_h=@#hv>XfD3?cpB5QR7*xAMJ10C;tXY8(Z&uHJ!Pu(k<1C4IGE z!_**Y=@j&3!0N4q9_GUfvCZfdgNecA(B5$k*n^0c<2cw>_Kk<7z?Ws^Slrp~DFvfI zlI6<~oG$tM#w<)fn&nhuITya8pD=l#nHTd-plEKcg-%JEkMj6x8vz|hfas0 ziPi$NE$tojlY#&_+kv)W+jag@@X7d^(Y9_qi@p|+RXCdEwoW^%{^dx^->S4)hHNvv zHh0dTtWnnCTmIRe^;`XDMqbwkNt;c+AZgPBM6Q7_0T>tTOY(JumNk&S)(PbTeTmQl zZF|+{_5F#H)J@z_98FwV+)|uJ99*1>aCU)@6hb`s@4#O}Ud+E0zy5WI{fS2PldV&7sAd0wwmdJGU_hZ5Bc8_ zjL?Dpr`nm9P>ZKp2KN{X%xGYXE>W*w_#h7kI_)WtrS=&H2}6sPt@c=tu}2>>!i#pQ zhQlW&5VIM`qknUcjMc4A6;gdP<4k~~#8hCD zZ<4Rd)f8)eAy7+(NZ_Unp%kNxk&jl$%Iy$-@xMhs_>K;fh)3N+-{k8~GrlfpS zqOBmKFrKfc43xfreUTc=a1OD zNPW;D+9YI-5Fc!>K8!Y2(c8EKV+~sDQ;0L}1>LGp!>}p+tafgv zDEFW};y4*?Ik2f#bI=}t95D$OhzNpn+yW1(c1f0| zf!zilVX}ys#9Y)|I9yy@MvkY)9LFukuE)>Ej-Oym?+WXR^2YXp z_9FcF`GNJp`3iThMmX+91}ZYQgg?b{#rlpVjCIerVsPCf3&RcTtbCrbVplWYGqvUS z8VTs6hjhkR`J;E_n~CatxiYEO9IA!eZgj3%t1(;^v4P>td;Yqzq3aT{f$to1Wf8jZ zy`3s}`6+RLAx00ZA0?PN7$=w&J{`*)3kvIz0nebN*EVDarvL73*I*ySy)X1q4p0u6 z`p<&rlZjeHvSC>@YU$N2aj{5la#(R!b^Skd8?Tz`ox~9AT6CaukuY`la?%IR#pxl@S zk(vV(1dWEkgeE`)$8)r0=o5$xz(zde0B-As1t1_cad7Nz2L_z`!XPT*jd3j4mh9E| z_fsRDaX8wo4D4Wpc;FG(x%Tehi@D(?+7|4L3@MKs&@e@FAnfax8WRYlHP(jy~5=yZ0^*yf1CC z*Rs{{8?Zg*A(zN{5*|DCS0L|_ZQ0(!kQrpLO2(4yYENl|5@E4WhO8}D|H-38tXoq5 zA21W9DYOhT4rW``!PJ;~#Hlur;>_0f4-aHGTiG@Z{sS|inySOk=18`y+R+?r4ZDM# z!p~s0z1-#LaXa$5aOdlN0YAb8NuXW*ZvJ;@m~NVAwnTe^y+OedOmx&OCA)cHaD5DT^rwtJ2q$v1{yEL{X#Bw6b;TT|`%-sv>Bi+inZB zKv+I}Q+#iWIwPopZXwun_XhdMeJ#hscC#{Q5IRgiAm*CUK|znl?katq;4^K+p>m_#AAc7+ zJ2RjJCs+Tp5IheiXTqa(ldyXdc0`<|!gJ=@^t+BgljqI#a+`C&A@GPVOUyNE*DdM@ zAq&Zs&ud>;+?8s#Fe3R=%yNyP}ZLVKE5+BN)X|&&5@wZur&IqbqI*MHDuT_WBLz;ispmqRmKnVd18;_2St$D^v zluZX$`faV=_HY;cD~wI64p24u@Egh%O^42n_pnE}1Trc*D#+kQg+s-R#~`y%fuujw*%BJ$Yg@O^VVCcchEef^QtroL6c`vbS z^M(4t|Cy{QYbx0Z4Fb^VmB$oH?^9)k$TB6N5~-ET6iOuuAH|Afk|k$tOuML?lJu#y zB$CAGVk`by#%YqY%GAl(3)^S!vyS4%xsYB-bj7}tioA|2QpM^2)sIu87$h4cDU^}q zA3NZU5=#_U5m%8|6t9e5C2f>34_WxTKve3WxLiOW-uc&^3?QbS)c|frHfK3ER-htY z9>4T!lB`ljonJk@{6cUwvmvm7;zVSQbq+9RHFs9C1#G-?@p5(}ap(mXM zMo#0<FI^ z6$?QzO+J-i!V~oyu{lJQD&@oy^&IoqGA0%DG92Z`67@p!s4|%{=S}9eG6N93iKFBs zyGW*@_8&q{j5W-hvn;WMTuJ6d{GD2ZRiz>xX zvXX4XUOZIRP_U9|1T5A;5R^I>u4bCcm6afB{fGY$(0u>43>$4Wi?+gRm_))`is-~G|@DagtHv;Kw;ome=bGnk&yu-9K z4Rh^MG6fpBO7O<;1;vs=MXBN>iAttM^Mx{{asfcHIzgkSIpo5re7RI5Sfl6yj*^9B zC0V2M!m84lcqLq8Rrk(I*~Ds_0u7NIg&Z-xn6_UBu^ZVf%PssZ&c54z&_2Q_ZfrBD zjmTzN2fz*5{HR1LuSvoxVl^s8y4!aZAM}-oF4_1B@p&&k$6RGLr!UQn%O>d-?h@@1 z=#uD?=@RM^^A`S0c~5zVe8IhK-p?NCj?0$+rSMBBM@d&nKEEe7M?fGRJjS055)9G{ zRv$JAt%4G$1d^l0d&B%`AgLgcPWMZd@}i~jGr2IFEKd_kmGYydGRd95PaR896)Ey$ zzu4KbXGu@tOPO=0BDvsBElcY2r?R-9PuEN071i>rW827`03a*HN`AS}I=zj^>1`oX z-bHi+-D!DYL-9#`13Cy2mKC-fZHdxS{#aq9kfDGf&sKaVr4Ks@4wfCwnuHTPOp zA&fYcIEpxeI6aSAB=d=9tVC|sH;+t&CY%iopNdPVn!l6y0qwMOf%&&Rz+wTeWVujV zxRc-kitt}DnMrX0!Bf-LQsZLRs&J*QS`Z^?t}lq1J3W{5GWm?dl8Rb~$mg~ZY|^DG}8qX<{#PV-$Uobv!muC<%96g*h+$mfpyc~@kgezVu zuIIZ7-el~O4O)b=qY+Z_DSGBUOWs5kiKHc&mdz*^mP*V+$!MjyvmltR=9-DmhZd2f z$(nNIgZk{n(zH!qb5e!tc_t-U;?0WYCvyG-8LOmmvYgG)=Kb?EhD*CJb1wLoXzY?k z#*%DSHM?HW`Vm`uHqTS^a?fk#(v|a)bO@ccWtKJfE&vyVfd~*(hc{)+9ZbMrR-Z7d zEf@^Puu!)I4FXgO4QdMq{V=EiSq%xMsrjHM%;`x8>Y@#JbN15XQ~;9(%{hCSaeTm2 z1J8V!I8Br)TP1Zv+1yxRqFgy0=ms~+v@vHfO%+%D!qll?F-(73ZBta+BC?Te&onRv$?IJnJN`TN#jPb zL0L(!t~5~159LS6rH8VStVWul&KnD)1FRk!IA;!p(`l@%8xqaR=bHr9sI4p-D(9ER zc_z1NUZ^K)FJ_(j*I=xQ8?@$}Mb;3kTpBv(*mA8Txl^5CFUA@iOqUC_gxeV}*c!NJ zFQwaYFD@ITOrHw8Vjp2IR8}n-noV_zyfPmVFK`=d<~H-a(jW0xW6XXReq=m~aiJaO z%m@?)h=wrXmpPWq=E_1RBjR&8o-pL}ryw$O(Vo;43JHcJAR=)|I!??gyo?+*9Rmvu zGNWa<+#M~uO9^4y*A zf-`U(tVde`N6{J6cG?FWlP|t^T2nEczjxjJ{WgD^0O z>1bPPUJ(|S2|uYUTWa?DvfwD_4BNL_uDA95BA_s}=-66UcJ+G(=`cy?5L-ERcKsu8 z=?Gd~_w@S;QIgT0mrI3@|HPdXV4(Af2r06PJ9gR7M?Sl@8$H|h6k`R)t zlC+XEXy0gE{#@2~=(`Qy`W&_KtW+fYF{_y~95gBHmrPD1pb=6%te^${ ztEn?G8Xk*HM5V!0t*R)f;Q5mX1k|V-H%^uHmkpbzFCv!ns=ieWRa^pjYupVgd(>ka zQ7pPo9@PNACHN)FrLhW?KMsH3fDs@Dj!n;Mbk(ns+k(nMZi#Hkp#l>~UsqLARa;eW zU9WAlp|@ewIq075l>HF;KyU`J6jC7vjQNvY$7kR*_!|6xe+IoYU9km}1Nzi_8VVWb z_lX8XvEd@)da(st4p>gC0PAXv_XdViqY|Q^)92m-NQ?T4#)_tjdXxH#rj0`;>C%bP zdD-49=~guBTJ;_J4?%^u>FjK%Y)VbHmgpw4u=2PxzAPs4g+m~=X=8Mb7@=&3YZAXKc>zOXm(d|RrjqSgMuJgj`| zt)5vWvm8ThT(i=?aY!Y(98l%1Y30DWZ9cF_q$Z}BY3nq!h@keQ$!q&Cun4DyT2-Vu zZdW&+F*5{OXM!r0*S^Wid zTFxiN3tE9cW3H-h?b>-wI^(X&{x`a5quK4iYeX?E>xUnNACI4&3Cj(}t>yfB4!?q3 z$EXk{~AY<29w{&3MHy)T|WH+!jj`Fb1YI%9f^{qawUiY+@+EtC!AhZ6nUe~I! zqnZc;*c)38?8c8&lQnp)Wm;Gdmcl>{;TtW9wlqd^`t;LT6WURoTpn~DGLP!#Zs$%b z5qvw>MdyGOjd~ZutAWkbPTXdIwOZ?iefuB?6Na#UYT-S63|wPuPF~-%_n5wbXpULu zb9n2!plQxNmpVUMp|8==?;i7x`ha?qd0ab(J{LPjS|O~>#uqdC8uIS*9utTSK!JvZ zhJt2;HbSJvTi~?ixaK&v|7kz7r+bZ?TP=tuFwq+xzzVH_=!~by*<$zC_AmZjFMb#| zFYuC zM0|b-{|_C!p?EWFf5cBf`Md3kmR3 z)~{{H`|*)tcsg#chx(yoNC^(yly_q%NTS4y2o_xz_7&2__+r2b9$XiWW_`sR2r6A0 zc4o80#0WOLN$yo#4IGaY`tlQoabf@jY9IovrPm;P7%WDJK#Ygr#k$mtANMNUUR=?ptjF0b?aI$hO7E+X`fP5F@~H~){@)lZNun1h8#qev+L^KNoX-@ z7J-}l?#Zx0%sj5#70)E%?SAS&J@~X?7B&yfT}59#&a`G0>&utULMnOr7%AAj4}JdA zqKAUO;GZief*v=0dBZG6R{U5K%#Zs`?=88|ydO+?zGGz$w_Ne%H+rP>_D=im@n^ps zKC=g6HHBJ5?I-#03W<$nq-7?8Q)C#S^}QoF(Huw*g(nhIf>V-GTo}C=1K91%4)wbR z%EDDp%gL7bD++;az+j+Et!3?{zKH&T{?~hDL}l2=0}*S8{`A0QXk|nv>KX<&8aDrwncZ*m>+C4t!v^ zfEE$fOIzUV)OM!^Hp1F5pC~W?tVgsowPdyUwdA&>c1X#5+|k@?OdcsDgLZDb+&oA3 zGzgg8X!mOqhP4U8coc8Sb{7XMLYGmhDK>!}v98QFs=HPL+z}>WE^oS}NH^dejk zS-YJB^byseTdsR$pTh4!-=SgXP=F{LC>^8~;w6$L5-YJa^gH~0u^>DoIM4zn1|Q$ao^ zx&&_ABiTosBk76eToCB5oFtm#vPe6{&81GoPbF}~(0s^H1W&via~Lb68Q^7EQJj@jzx~Sj`@y-h6;65ZV8@}$c30jL3NU?GHwEHB5qPI z&%q_*7zf-&+4h2kk|OzYd2>Z`g>%JBc}%%Xg-rQ%Idw&Kxpjs1Irhc3IlBrsrGd(@ z3BT2N6%s(B!A2`eYDx6M=)BxWd2&jn1ne;sqaghpJozqpK{V8ZV0*C}g-^!^K|pR< ziOK>_S@5dBMLwd!a0%)H)hV7+SXq9R0#b>_!UpaSHTn|7Q-np42L+*pAFKj03JweY zWrB^eD*3DVuQE=8PNGh-P6AFsPI3>zi$$kOG9^XI%;rYsu#MD>IF00ubd6w*Hs(U+ zB<4!yT#X2gB#q3h5ot1$xz5FhiXQTJB|!_H_whp(OQAp>TpYm5ardy^44OFWr zRzXcdYx(#y(WWLW&=1FFf)=ktAIS}>4UtGE-MNkVPS392rW$C~5i7YX163b$Kc#F=yDMie zX9#8p<_KoBy)D0SS?yWDm|p#E^F_UYyP&a(X_DhEz@IJcHu{wbmC2V0mPyZ*-^`!G zT*zFUKmTu@bB1%ab*6Q$_GFze4lFrZY`7Q|H2=0KJ$7l`_MeKd4zo_R4yqDumS`4f z7HSrIint8DOt|!~l64Vsc~Zr2jB%WHlxgGJ@U<3aFZ9S&D=MBV_s)QFa*xUmee61! zJO=#Ef(Y15+Kk-{(-x$6Pe*d6>WtJD=$7sl)G4feS7Tsntjkn`%>i!>uL*_JrQC%k z%9!76Vcw0SCMq{XZ4hObZWm&gd=p+fwW8ah=V|DvXUWur^%f~KM78IC6Cn{5HdN4C zFjz2c*s~uo${vp$&l!)7niIB7V&KjJv3Y|>`bX5y~fk*<&Ey1b?*cWCJbf_h6hdc>DuYp8SK=F|M?uW{GzwlqNXjU#ic!> z#iUiEWv6YXb)lW6-Dn=rSNRmDO{-`lj2R4F3|vfD%vkhaj9v^|Oib)QmD~HPGC*yd zSW6A;oRK<4xJQ1)^77{s%FaJKhI+-=5OkT*x`%f6CCD2-hH($i%Kts9gJlGdo*%9- zY^uw`xQc}zNheBZ;LA9WqASg4j70;FZxB`6v!Z*>XpKb|9D}SkfJJr2bw+-MeTH~O z2ii_%JR`Hnd`NqUe$e?nP(7B|IJ&CmW#DDxuoY|a#kO;GGwXLguRB@4%<%69i^4N5xfz-;kOaH z5w?+-IZS7$qo-q1T}xO4Dz~Z6uF0;~snMxpU$OZ|_%C}U{d^;PwnJ{E_?-EXGXy1s zDFi2k3pz?DL@2rcZ+}96WWRrZT)K!&<37Vyi|nL8$hKMz6HKDvbCZ`yH#Bi zzlyyIsfuse*J6ZqC(X{w-b*iu5q$!uDEQytxq-J{G{bNT>cpVNtbP^aQwsD1>LKKO zpQo;S3Yf8fsy;@_mE7D{|6M$NpJHtp5JwfFJZN#~RM)BY6{you9zRio0hFp>T|yoo zsH^3nC8X&IuR*CmEALqX^;TM)BR^t!_;>a!)v~W}pF=z%zeRrZQ|NgRR!axs8&Is! zXP`ufD-D+JEZE_2$Yfy19_?kF?7`a|a?s%6AB8&fwQd7Bo?=oD{ZMxXY(%2s_jv5I z*T>dR*IBH!ti7yJt(B~4K!7SlGioypd;D5d`Y>Skk)803#`+-1R;m?!UEAhvva_#q zuyfd}$7{lC%xlPN%4<~XsOz9>&->kNpnaToo4`J%1+&FS6H;xka+l3Ey+v!Cz?$$0 z*CmvDD07$2R;`7r%CEh@b6eXkxrO`^d%3rBkIxoj{RewL_b%@>amV-WAe~;qZMo~> zXQ_Aeu4teB?!DjFyq<)=2d81mo*@N-_=!qTSzx+gg1P{p3`lOwF&?VykK#bwKAK#SoDDdG>L5fK8?KXL)_Be61}8& z3i6R;$J37>+yY)=-zBZ%wnnsWpY@@wGYE$nOwgCD z&6}Z`Lc@f8YfcnHmM=hqoF?(8FV_IlPPMhtUsZyZY{CnB&A@ILF~M5|B8?<@_OdP zX|H@!Tf_40$Cu~F$Jx`C&-=r}xQ&4^uF1SMZnAe3+c0P%r$1je8Dw?S4h=B9rw26# zY-&u%cmVvrOd6g1o6M3QSK9)DFZA1+FT7X1%QI)!@Z+6Vqc*i0Ew3gXt!?rh!Wdss ziVx0_A^|89F#5hKz&^Khzisf=^UBWeG#%nq15NCAY$p5O_p-yzV!r=^d^mZk*S1=8 zIcxBG(A}CL#MbOKog~er+)up!r6zX(=5Y(y#bcynJfCiWi0*d1#`Ded!}Z`uy4=rq znO1T!85*`M?TB+yfj?@_yM7AWcX)@(-BP+0))LrM>i=;Ks(9fMU7}3Joqz6Q*Na4I zgtqgq%A|>QWLGp8M`vn0vRAP_TApGY#T5T(B*_Gug;dS*h@3?*&b>!;fi35L$<<}L zF;$kR6_G_yF8hz9)~28LQMSJQ^~haAa3X8DBB(3qTm5O)XxSS9cYR?agO`&LF1Nd+ z=mWz0ucrK#ecA|a!>T%3lQ>ZXXjE3svyAX1SNMiSnUIf(^$+5T@E(W-D24dN>_rM> zqd%&D#Nl1n^%PqFqH);W^^(%$s$g8L`Uvk=@bO7=irGoo%Vc@LHgzV@W}5G zu%Ol&n}+?W`cUdtU3K_J9(s(a!CNgL*su(ziAVNhM<*!X;d1`t+awkTGJ{bdugZ`K zFEatOd|?miV{g#iS58S7Q79~Nm{T}Z^LaB=Q7g#aQ3WfV+f^M)b83t z1INV3Yu52Nv;#8qP9=Zaq%6P1={TGZ=d&!&J;O*8JQ3fRu%v_4af%V;D-kkC)!VbE zx7~i6#Wm%oTgAC2CC^iUFz@^K?AM>DkemhCCkzJLG~9eJcx>UT%|>V*Ty2$WE6=C^ zqCNjzER^5zv);$`Vh^oh>w`)avl>Yn7zI?+8~gEDkZN|AsV_xuJaGP)51ZW|Z-oE% z+F-yd(QFO=?c3J(Z{OJe|E>)d06jxPBg6k*7G&b4)pr@t2A}vum$ZIZ<$7WK#(Y0> z2o2}(Eg``WmI{!>Hu(wpJ`l!5cf?8FddAb=AR*b-(VY?RVQufyYsp=HJrHz~!p!C9|?~fw)NMJpW6w4oCl4d|GAWAKjyom*oxqeMs z0qb|HLPEhWuYT!%|9dSH9E>q*e^G>sa!GrXH?&ff?po=2ofVppm}(;uJFa(JwWWyU@`|yj68FZ|e&3gK9FWd;H`6C9jfQ-DWF{qQ?*8b$ zsTu5NL*hOWs3b+)J-I!lUUvT8CSnG_AnjON*xl>*Adq#%DqN7r3cL8o)tR=d$jGaD z4!#x%ap7fTtvW-NB8#QlMCfNFqn1)8G*gZ>{SwMA6AlrIGDl(EWVt0Zf5lY>xa(Vb z2E(WJIusl~8x|P+Dl8M?;+obSuz*~(1BKmUoDwTo*<%0*m#ZR|MFI>+(+)|;7zX>Bm)jDgQ!yN zJGNaVM&(N0W`0nm3Yo}^hR3N%F5z_xxqxk8lU>>3^aLTP8MK^U-+(EO4(Rty;;-}Y zUxVeNzHa(Uppt(l&;EHKgM0(68){~t%#R?omf z&&24z=QT>H*LsZszVnFYdp71ji5URps;-F3Np3M{xE4Um+@!8?D@a6d9 zHItDc#>dAO=dQugo{f>AV>CSda-ABy@GZvF1$MdNMZg`}>HI=G8Xyk%8Bp z8G$Qk{6H0#$R6-P@^aeIGP3;JQM#jY>@WRZk&(Q}%-Mp%;pszvykvt?QEiSG?{p zpo}$H5O-l{h-zXy_};ab@NNQso5s~|N1?G>m6RHi2|LYCMKDpsv#q;IMfyS3FEdP(&Wb@#oSP-PEPm*Pk}m1Rv{OPwSf>7gnB+UT>LRr62DX zRv#CapH~E*LiO*3o$}$Ck<*tS2LzuVM!f_d7mr>Euh}L%Oz)tC7m1rp(Q9Fj4+)OU z;KyWmZj^W7k=N*xkJ0Db?Dx?dMi#;g@To_qXVicaeK9<720_*K7kX;{l}c zw`eKux&e^VhlE(B=*{zymrCuV@S{MgmvJpp`F(ah50k^vt3=sk-$(YmmvQ*yKd$@h z=PPc46Qu?4ABrrg48Bc9{n&rnOzC``-{g5~?)*G|NWSAf+cuhcmv|v~c zTW;F{;fc4Qd~VxgB(ry5c}Kvb4i(V`(1A?H%|^pmf;l>aNm`bb13U?j3)O|9mqFb=QAGI=`CU@TzMhIKKz6 zyiEyx+PG%qkhq5e!rev ze4kRBCGdor>imSwn$zx|>-;>q!1>;f{Nv&ZlVU&mnCuR0BruWV`-jCOfLd2RZV$4qpN5euQ*tOZKcq?7H4o+fu#(GR{TKP0pfh)XGo@Px z?0=f!kbJn5@f$|Ytu`j4hMb^fKO6!gsp7%H6me&iWw6q@wM$aEyLF1byULZ z4eQGczWD3!^lW%tGENze?uk76;0z?s{62MlAZ;Q|d9IU6woUl>w_f%-HJQn+g2DR; zTwRs1tfrpPG*e9*@hPeH+>oOPX9x^2hH(LtZx?7RFwVHu%>OR^d*Si<0qIw5IU&Ls zf~7g|lV`Xtd)KC96X=x?&D<{Rs`~WIhv5^8X-yClp)zZ}KzFkn#*{4efNcmvtfh3q zj+};n^Mx~5ei$SUVrb;@h32Va(EHk`C+6DA#Z{}Q9%K!qMo2=G_9y_yB5ufA#96#C z!>hTi`F;)G@$ZRdYgE=w1vvt==|&Z4thO{_X+ApsKBEDc3|MR&#v02^*7n41cO8wJ zmEU0rPblG)>nMh|?hx^YS}&a+J()I!ci(Z_2}p+!vg<$z2(!PQIL<1n2&Qv<@lakh z&$Mk)2eHxqH?>*lMu2CpG#S!a;uhU5pcMg!~^@z?qt^5pljz{AM4(n&2cirbF9 zwV}(z6Y|dMvrS#hAYn-@C^?NGj=oW$1M!EIsm!gdel6LuKYKG%^x0`XO@R~NOPz2@ z*x+q2l!@UETFle~**1xt7f>*KeQ%7aTAC>Y1|WnzzG$`?4{v(E&6_E1ar zqk(BElD}1^M-OYUk6Yj=8A?Wr?xpUW4J0&djf80hrcF_;N}rO;t%ar#7#D9dx3NAL z4c`TjawUg>p(THeC+<~h%wlv zjOGd*%+DbO7m$(U0BGlwD113~$x_O4r@HE+wd~ng8as2Ep@%HYUV6AjVh&Sp1p3VZ z>!EW*+DP})U=-b)S$CS%2~M>RqE9@F4e85wT>h4?s#Q3Xiic;U&SrW9#nvh_Js_L>6>mn>x?qZN`yuWPcb(jlq{&6*S;B7q9L55#WuMLI zP%cB5HUq)g?oe593^ooXW_IHd-&mP!{5L`LY+jDI9~!4!#6u08K5#e(b{Xem8OFmJ zsV;<9S+$0wg*^R?6MpKkPot~)tMF+e(#NPW6PkJ*zK%@nMlu1BTIKMN=wQz8fL@Yy zB(@R}Af(h6gGkNHL}phhb{Y}2Wt$1TP{Wtkc;7h`DuYvaCRCXvITHjA7(+DYuro&o4pH{5)>GFd&TQJ8eymc8SZf>r^f%v(X4y(P-4nVot6M!N_C zhO?pizUC-x!DZS`=I0W7c9e1mrP-&MyxDz_JOgv;>6Y=vsf$f zYRjEu1~m~mH{p9H1rJiwC^Z>bfu|p%T!7mvT%f7uOR!ts>Kp+n}P{KiI~%=*#j zhNtlCBasWwV^%$%9if?kBV;qg-o+Lmd&y_!+sG!-OXo)z2^mIreYUdC2c{v?(gJYR zPxFT*V^i^)2c$s+8GucU^;%zm-ylTB zqO&Y7Fj6-11j0cA+rs!cXEtg=m80=!rtmbn9@@-A>YUwS&pbW+m%15^f=iyzLJ%uH zj2<^}%!KH}pNHr`TAN=sg)=n&`$Fj_#k;7#C8X)e{2)6NIEFTWBSEmYe8Rr58ISb& z=QPBj(=RjZ^OzM+vYe_B_)EDss=M!?tb`fOnTu{c`aT8~--VD>CK-c-Rza3Hx> zeE!jm{+D)!e{f^3Q7yctkU|ix*mLHX_dxt!DToQQ6)36*>nHF8ut4Y?D2ZgB37f^3 zt#BEA{ZBfQ#>vgU!@h(FmI0o`16Z!)CgniPZNOkLqXHxw1~6)>iLmkL z{m3`nuf%Vkv>{=se0Pig6y8FUBa*l>&`a4-ePxYs6PgHS;T-%t-JwaoLU1UTT~x6Q zUZ6W6w^CkH%#n|7^z&=o1fIE{v{h+(fLQX>WW>6!gN})nN|%zhjCl{h(4Wty|l+ZKG!W!`#pG3}va7yOQIIk=hPuGnG`2Kt3o!&GaMJxiWvmpZ{+sIVXItR9_bK){C<}&-&8`Aw5Si5$^+B~;Di;9+kDgF=Qoovi7EvJ0 z!Kyl1^GCo&>JG0oE>6vlSsl?*QU3t;m}6c(zyfYUwu=@mG#(HF&Q3jQNb9#4mr#w*O* z*8b|B?<+td;ltoVZ***G+?Ko}tt{pEacXtQiV}X{71fqz@}-f~Lk=GCsfZ&{2BFX+ zp4p}Fj~Z37qpPxP#Xdf~NRB{6G!oQ_eyX6JoqP_7)hf4bNr+PX08Uucbk`XAFN`~~ z;o6`_N*L03aBuu(6c4bJl43*xGQ-T=(z;pcnw{X>fyUNNYiELO%)Y8i@I^5lf+WLlwcISd`<22@up zQDxFQNgiRj|NI;VuBFPY_yKcd z#Tz@MC8Z-zkR1{&;YNf4Pju<;es4n$wXx$e=u3Y)H^)VQ_ASHC&|x8I%8oSGampo` z>mY}U38tn_jgOzeJt8iC8ubmsU}aey>5Tld!+@t~V1oYOR(e*`+rnPyjEN-KW_G3A z3Vf(IAdNgecO&R){{aZV5tI>Qu6biHOxc=HG=sqdX@sJ{WrwaK@I-D5}yX_Vsu|)SO|NI|7;^8A6v)vgxVJZ58JhWQG43r!`NjX6|~xB85QI zT$7?3i@}re;LQ;3j&;Bwfyn?kKkVE`EiymgO}pwU3can(n7kaxHZ4y?e0{C!K4qWBTn-V3^&D(p2)wC=e0L zQ8(9S%5O(uw5=|WGjb1OYLV6P)twv<+vL!)h8jbUvX5AYEr<(;jMPw*Yv8sh%#r1U zrc;Q=YwfM7Y;xq0S6na^f2-))gm0jTg9<`B z;&tU)G*y)dHNOTxhW|-ruF!rm4`y-ioXN`UX34hZ_lShTaf5_sb>|9Zaqdj9KD#9c zN#186l6_-S`uPx&&t$G%b-x|eYYX9qHm%6v1YGes#*T#1Qq21B2SOe&N|c5v_4-UK zKp7#JnAHpo**<&D@fxhY$JR4^6aJ2tH<82ASLU~X)sB&Yi22B_xpx+t&Jl@+$Un_A z?FdeiXTuwAgD7NpIxSh_LSepPH@2;MYeW_h0oY6oRiioUJsJe**wA|J=f!{n1Njlc z4*Q49G^B2gs=}y|%EUIWx7SKBWwmyKz@w5A0-c6~uo73Ko5eTx?Yv$P4tqAPV!Qj* z%N63Kj4|J+_Xch{75d;(+HONoBk~5982Ljhv6pl!v!>nxej3Y?o%4E>FU-a_5|Y2t z_GqsTHs#wF{0@rx5>o|CNqmoAf6TOSb8Bx4H10p${wULzywS%;F#l`jjNF>&tN$TZ zSSuU#&Y#Ij5Gv=KLU0>oE+V453Sjq-C(lfhx%JeJ(bzq^=A>NF?p*+q;IBE6wr)d# zLj+YbvctZ#q5HRphD%}OJDMYms#)B-Y~5~a*j7Y;t|0867KBO?X5Qq2wKPeQRSE;w z_>tJ*k|`J_$5R$V4I_}`4~OoPLyvt+1f3*-f6>GYDGkMA{$waPngcDu!r=ytPV|j; zgF9m6pmM*PLI5sR(r8Qbo&>42*;Z5l_$L#OJLg zJSYaLtK#P^``SaKLC4+FDb(i%4SX&206Z3Z{qY(&W=v$vS^S$AFe{^wKHj;t?0@*9 zQnTiAE_Lcn@Rj_cbkE$m+}RdenTSr&a^A)@P)|xq+0lK;h}bN40p$37kgGt_e2jkR zwwkDgrWacQRf?&fqH8Q>?pxT|tJW7m%rzFPki5pKpQ7E}%PI#(u#9s}eA&UZgoBXR zB+h5;xd7Z>A|r2VeBAwou!ZK9n}nV~yN8a<-<+@eewD|(NtEf@3`_01m<`e|c{?xJKR+%n@#N2ZFY96?qPKC9HY z^V#jogpcoU+T(kJooq2t&`-G#1@7(U-j3i`^my92`eW6%eLt_K5lPW7KV0h6sLt5a zpw587v~c{yh%{5MQJYdcoZbRq`WG&>&UWugu3hqq^aj~yX<6rh0S*$Ygq#A-tod** zaV5690zIHhE;vP1O<~zY%#&QIYo5kUo!vaUpjSYZE;5nE1OXAO$vMdJ=pQ%-KTpQC7)u-52Eq&REOrwK%SYA~J*SOw(Wqx%(h-jdD$?uK_Q6-~-kGDN}**CE2V`@=hsB`iuQTA7_?X&4w4~{BifI zYJ3KBlQeJm)nAa`7-yQ@J7ER2MPvji)=5+ZFh_nh|N1Lczm<_j<j`gRPl_1rSDqbR)xc)oe~BLt?v+x_`y#<7o-{_f}$(D0FTwZKKcSqLdNwn|>)!!=|$xH8Hi+rbKOkobJ+KbArO zgp+v`0(rA1kGT(}G$!mUde>2>7ed4ul)p$WN=qG2H*q-srWlM3jU7~E>pPYLKnEl-M&Mns$<1D=Q(32PwS zyu5OM*@c~@QAIXWrVou8Go}mFg~oT{Fj`u_y6KbUbEQF)I=je|>kSLXg7f37F9p~4 z>Vy2>sYwav9xsKV7|g6C$k?k=yWf3^39-qknwRQrrn+ChR=SL6lY8a9L>n4pFgcfB zRfp7vMZ(LCd{4a+78#e?J=Bw?52p+N|C^(7O zL|cE!H%+(^)|eYreMxz0lCV}{A0<^>YGEdMsG5A*n?eAy7^mU5Em8IpPkM9s{@uQ- ziSOe3;`e$QG{_W^v$;MF@k5dg#TNG9lp9Pv;c807(A20@nUx(;SX~?km~aLX6glVf ztGw0Zdu_`0k0(&2amo3=R1r_e_&D>&qeT&ja`_M|w`1ri`6eL{8;mG)D{M9~Tjj1n zc(B-&p6#y{E7e(5FWbpzd*m9^e~ZQ$+i^tC-X0ir)C#w496OHVh44la63SIPaq3qQ zE0;yYAco2~S_exio09E!(OnWFoXz&P=C**o&j{#C zh6Y_PKPPuL(udb+7gEq;uN#l+rSR=L-6qmL%;`H-duI8gz%{v`AJV1K{`*pA=D_PQ zf5E-y{AOkMtD<}7T*srQ;zs4ftDXPCr^pU|7^%Q4TYnBzS@{^#S0*suhNIKy?S5`*?2H#4cJ)#_` zNa62u{uZQTth~mk3|=+COS~D3p{1y4!dTz16DLRp2N_~^Mqi0<$vFDIhWesh_>}z0 z{&2bsEf8{&@c5s>)|d@lbWL@M_!P#J@)NLN64O!W%yk)iZ~M|i=^+kahM{4a(Yez} zW$82`dxH_JUk4z^sFGNc@RI~AS-UiRn%@`pF!DLPT_A3MC_z)flyRsCR?W$1`_)69 zep|pZhZ17Y;nX?oz5tT}-4MW}RkS72Ds3H}-^$(^c(#gFkx{k3mA4Chq2Y!sem4ea zd~Jqf<6sNnVD3KlV}vlGiKS*MsY&aSH4?DC06V;`WHtG`zwV7j(eiabJR|OrMr{gw ze1AsS6Cg8|q05T$07;T9$;gxq2JjQWQj(qNtoZW72jHN}%h+dwWdyh(jAR#C&fYs{ zVkR64{bm9t-dg+zh+-#={xj%e$Z-y2JXtw>E|B}waVTV$S?=I@4==7F)ND215vUTu zBKRy@{}BWVm?EX@UjmALBWNX9MG4uayyN~Sm|(}Yk<2AdvR zk znio7=jc%`aC~@SN%?Y|dXd%1{nF`M?e?kNKoyj8Ib1(V2CHox}Q83`m&>ooW*R}xQny{Tz^ ztNnSvF{UVW-kHfgMoNdI1MJfM5lS-#_g^A~9L1u7sVeKLffI*X<*b^~srQLr>Fm0J zEu}A8sJiIl@VQ5Ehj~LS12;Z*S^4t7ctMq1JRv{Po8MH~=@zaXg7ifm?dqXm#^Q~AQCV<6Lm|*ulFaS9vhh}TF*A3FkS>SZm4xx zcQyRrFY`$2wJw{-j>v6iC_!vLz&Et-Cv=a$uLy$(oA{%6t^MTDeM!?K*y{PJZ)YK; zkkcBh$9qi>j9?}Z*jTq`0&c%d;HObqSM<8TA0mRqZi+^pBT9AFk zfPXeU)MRw;GHI*6!ua^Gsh4~Zry#gU62Qt8X174~CknvwN}`t$DiQ-=cU8Bg>Qne* zk{hskW!`P~eUcc^cqOs5@B2rllALVjiKC|!R6^FNRTM5m;AwUPPL_I0@uh62punRb4}$Wn4q8BvHEB?lCMzq_G0J)b6t%wX9<$ zs}1z4-DQ!>jE0X%>A;7eWe7vJBt`#MUm+X>3Zlgw2w&A*5M9tA#M;p^bKG* z$W$TIX$}qe1txq_bmRc12Yb*$QK(9Ua6%!eD1e{;Wig7fs;9mgSaIwGcq+*%eZAt4 ze98m{6~}7#ff^sMS^H3>L$@8YPm++RLIX7LiRV(PD0-6h2%m>mGE+$hIs_=fmHt@Z zP$|`=4rN9ur3aHF#ewHR^-z?j3xQzQg{5EpkA(*nWlrU?^lEe+>YkRsdYA=ul}lZ& zP%t)iN*Jre;P-}w zp8B98!77)zbai{z!>?6H^T=wCE-7qIbjOgT>gw2TDL789JNvV>X?betv%mjE=C79MOa?^_(Ks1MCIPE~;L8F3{XKKAx`vxggy< z&Jd~>2R6RB$)Bw*aq4&lw10CmJ39ocue~DPksoT8I=6Kq-x(2EmUy;x0^WbZ$m8DG zO!anS!f>8#+Q{_z`1nCpw6dM;4s~tA3S&pWvcX&5y<^`k-sD{W0C7jGu%&Dr1?FNz zz_8J5JBRLafN_ONQ@_Jc@ggqSICh_WcL^hi(kPO@Mr5$f+r;!12gIUF4YH;0>if?E zq+r>KclCW@p`|L>%6FLjVo9V(*wVN6B4P=_7(>N0>+o4bDaF_Cq|g%=Y^~d6p|wAa zxF=57+;+@C^7Ebp$B;%AY53MGJ*osoTxq9l>brohXG9Exv`*{n-JHN%Qksw|?VUd$ zIAZkOKjF7fG)`=lTkb)(G!r;%Ji9rOp~N)uO?TGUJ>fB(yMMX@eogGW1&I?^^&8+} zaMRc|mE~0K+WL-SS1>eNGFNmL*L#26lbpUswq( zE%zL3>=K6&8%Zo@o9b=U2P|+J9oAf%@U|TNVQ@CqdNrY)OxDn>7ke}zojleg zZ5jvCBU`yHzOLcfIQ6U}IQ_UlSmSJ}-1hW-MY!--%e4M{FWEM8iT)=IP;oBW&W?aV zLXrnaTrCZP$-#Pn3VIQsOjnklPlOL>kQ6`B832^&&k8Gq&xmj?0bX^$-tkZ$**JO6P~`w=TP&LzWC$XK=M7VEX zTOYIt-BI8?zH=S{gzUxDq6N=YvkaOAu|itmwB27P46gpNQfwn1{%&Q_CV9QkwTf-U z3E$|ftbT8{%hmPzrI$1irR^2-#kq5*-Fy4Xr3pMy8wP!v?pse42pA*_o69Uj9cB?` ziMdGUs#7<}<|pfIgSQJUL>va5z8i+%wwIvDJEY&x!PR~1+Y7Mq9!B2fA~}h9`)`BQ z%tbcmuPNr{mB|)Sk8qGQUM4p8!_(E3L(d?3Cb|3HC*$qfph?({xozA`Qg^8<_MSu3 zOec4&CyiY*Z(4&IgpQLZ)9ursO1usLm}rOVE(m7Y&5CX(Eygma8F%6FU!NA)dO?`vF^oY=oQb@n&@wa@ zy1`)_o;-`RYGMrzgP8t+zW$JmQKG*2ka>&^>8_|@yhQ34N3tLTNWVlLj)7L6;=qIS zR#3^Oj6oG&RlKG_-(rX(3M~pPHa_b9k2=xn?^VK9!H48C(tWwOS#l$}3NiLXTfGr# zGN(cfUa1sZzchGuLEDnOuwkqi#y^Kr69{#`_EX~~Wjn-O5^uOhGRZp&-$HH}M|g^5 z^7ut}(9u#9ROEr80g!0?6dFZ8|SZpIOMQ&xUV5mHHm9SCxB5dskv*KuQ ziU}Aiz&(U8EIGs_SIaw&%Un8VE-xQ^U;LbRaQff3$dqJmrr0IR@ZY$13aKgk9EHqi z!GgCMoGC&vbIwANn!IUxu|t-UghlKMdOd=vQ}KGvL(qyInDEw~^N_LvXKGdCk>$vH zPFXKtN;)@P6k8A>hzH^jJZYLMmMxS_M|41(W0xn*n@HzCb|D9ku{ZB24xh%d{;?9; z@NHvmeAw%st1mK>V-)~{*b3*)<-tTYb_cGLjUpVm$viEPtN6+D+-(tS?nbDq^vQa$ zb{-g-273>hyOjUreW$!vd<_M2rU~XEO>}0mc>PEaIGB!Rbol-75Po4Fn5g6*rv(b6 zRG7r&+e8Z)VdF4~8LwsAWDKBSYa6!}TxXD=rC>7I7|Ru2#}53EtYI3S-dkh{;qjoR z%^CJ3!Ak)c+ZGgy%HM~ir!e76l?l{BkDD@u8b9Q?L>zFX(C%$d zxl7*SjY~6i&H{1*BtxO8(d(9`bpM6^pr%$sH(t&$NKFt>Lo}|Kz7ZKsN|09DFpe)! zj0Lm6gzB(oO^GM*%Mt5ZW>5IcLKh^}SdG_n>cvmdo=f(x%7>Mi$}9Jbh9{?9h>Mw? zNuJqn;Pw)StfI7uIwd_pZ}`tdH-meV!<#W)S&|_v#4CGX9|{=qg>JD@cRYK*pGs^| zQAa(?k|P<|0JXwaH$KZEz6xhyRL3>z$hQh<5m~oB9FYXiw2o)`LkL8I2V2)U z1LOxm;Vsx>PVv>h+B;9tOAj*Poq}E0vblQ65!7I-HCukJxUfSn0v;`D9yysjUA~U^ z|Mcm|P~xyssNYa=$(LlU3%B@4!=+R?@{i_nK4W=*6Ey`_x68|SFg&x;EC zncynJG`rv-O*)SK#5A!u255ql1IFHS`k5cYkA}3R$)0?MIBPV9hO;H^h#}i7yn;m& z&{EP1qd712ZxK&(z8G#@qNPMAlfNEs)S}?r;yu|oy-55_cup4 z0ZctXJ(A56PR2)bWjc~A6b{9QbcH{z&KnHDhXaH2C8lSyj8Zbtxg=c=j#UedGUvXy zI3BTQA7*4ga9!rTT(!+G>Z65KQnkao?jOx(DW_`@xsD&#=PU+m!A3i(GOCPL9aJe9 zl=rKpGS9Q=g27aw^-1@*r_iU03+iP~Dg;&Bh91K&!S~+xkf+KEmt{OEUN#iHt^>y`g>GpR)-AmziHt0Tk7?lc_ua7&MwE#&_E$65PigJZ z(7avig{`sJTILBQwsh-elwUZr|Zc^FH8ScjgyTi4btao|> zLIr46G&F3F$M&%k-D%L8@3w4H#HndGHD;RacWZ|82@}84U^D>^YFfmG{WVydQ0)vx z_n8w>EbW_8wnxG#xs@9=mTj2(>{ zIVvlzCDYRUQhJS9wK|Y>@FE6B-SPCybxotztY&q8ARI^9adfS2IlM_#_i;kfVQI@S zGL_NNvDxKNDFTe3Vh4k%7_ZU!Z}ec%9?5o z(YDe7P8Dm*wTZyVtqC8lRFGJgQRReIW;>eOCi5$Jkp`A<03IIJ%54|7D*83UTTLEx zFO-_h>>9f^(p%XtGMZm^F2Y++=E7PjFC3d#_cs2cEZwY8+Fp*elRPG@t^P+|!hR%K zQ@^DfeW!nfS(CQ$nuG+sBHj-NvvH9>kc?#&*hu@w?!|Z*zQXNNyH`H33a}DyqrO=|N!unr!p9lG@eGa1z{5bWz?-A8lp1bd;YNQ}IneWq)Z?~%!n~p1 z`Q7g`&X?ea3j>81f;;z|WIe@SI@p~6rimdTenphRJ!5OS8QzJVC?wA$aX+~NE3$*6 z=`$JKCvMmWjbbN>xiOwJ5`?2CnYoMKIWjdnsGe%}!DejIjuUr_Tk8HrQf;D+_@{;K z)X_%3CZL1eUHx|aaMjxirGpq(4R^)e&1Px0Y7&^-3$ZDWtHlPec0O>sNJR3arfo@e zZ+y-;bW6TO-&}Riyzv;?PPs%;!rJrPck6oeCrT%Z&7~5?iogZ)#^%ACF|b-=d^#l; zSr{h*5f=v+kKNTaZGUNJX?tncxyPo*W~_ShIyM%UR84)^=Um zTZz><@TPWaMoS*6Z8Tl;)^bbv3k)9>sEam+ntsV?&SB4?{?{7fh%7nmpOg5HHdG6_ zokC64UcIjHsN#rv`Zb4Ea5L01K4Rs^-}qnegyfoXDS5UrHN=WBb8>Pg)54;ff4LIw zP%Xq~GW6wQip2`3lX)3nh7bOpiZu`~2kRTfXo^1kUFL-shF1@Z!_=d9r+?5b>u(CO zK_~hpk0OsTi$057OI1L5z&jS5l#vvigh5}ad*AOKtcYPoq$E%lvgA>ns%zBW(4P@< zA}v+l+2`0tBVIwtu58OZ?4s+`M=p9n)11miIh@!RoEH`S2EH=jj3C-U{an4r83V>Q z#k>jLRHL@YVTut(_ejB3pd!hwiP%u~x1e6i+2+s1&B%!{lGo?OCCEvO8IY^WrHC~X z?YG34$w`SX$JwfmD3ia+b%?n9-4~%~Q7Dlc7U_>2k)hBlzRRycHzSVsQ=pM+7TqU| zk5Kqk49G9p)7~lQW9}aZGx-+L8i_4m!I`@;@j_-TA58UX+#%T+*xBg!5Mu;YmNL!G zP>C?ojt7GIwD$SS@dqL)j3yEJ%rOgcYMdtL`ROr^S}VjRoHHGwt(4~-b#62GB5pM2 zyel}zsClz7QUV;3$7T7oQ4_KpKK6(+?Bc=!ie%}n&Vtvt*XGx-0Lq}n_=**lzE*Ko zB5=-0us55b7Hj;o9%HY0+>p;1f1%a_b4*bUvd^3u6`736Aa0MlGe367XN}uXaJ4(8 z?k*OaOx%!lbvic6PZZHk)cWfo@Dgz+K0_Q;otz)H|hN(7Si7Q+iOv<+Vo5(x+qW3e;b7}O$fFbYYhlvX&b~ui>i?XN+>a08>A!@Q_q%2oHAGp+y9--ka%TCAF(H!4VQ3Y@EE!y zuZYQBE{Fva_Sk()ZR#&oFUH>I?aq$+|wbHcoY zlDulU{{E;b^=Ww-QjJvKVjpd=HgYG4r{-G+8Rd)KHR;Y||7PfAXeY`i)rag`>Ql8j z{BoWCZ1gxUO9+j$K4a`SKa2QsnSO1;xD<=q^0%7tAr|V@7<0H9>XC*&s|n_lHKoHe z)U6?B8q3TEtWoPSj^fMd29?9yq^+%I2+N83+R+}04=Br#20ZZ|nh!+m|7wu*z2e^a z5E0nt_H{b5ugX$iH2hxKWPw(FxVe-3>#7;G(vnkg_e!4qOU`?^E>I02t8 z?lbwMi5(gRw#7sFREZ7X{je2V=KYgV1KLE93cO~i{gxQB-;H5w_RRyf2>aN><5B9O zmgLR#`%1CuWR1;h4YsSJ=Y&9Ee(9c$HCo%w(RadVnrPx^B3Z4Rl79%n6u<8Orij+X zki{8OPb;|+1>gR{Af^%3NNAz~bMQL)xWK@;$-i1+ZJ+<`MeNk}DF<8q+9Zx3mip@{ zqAR8=dq^TG5EK0uM>OMRXgHT5vIRhLgE^!}78wmVxKSC>BZ{mCSl)c!vxzqn$k22_ z1U3x@kh`W*$kVmzyC3#fHrvS=c$M5VQ=p+Qwp=Dk7GtUlr>X3$O^0qrdw@or0Iq|> zoYNbkFX?NWNRRJj9huFKwYQ!No0VUWu#I;gPodNZ>>=+UkH|&l2|WVs;cD22q`HrM zuD{tqDnZ(64vmA2h}XX>`8NFDP+=iZ&A_V7xmOMJ?3Dmh#1hJ)_AchE#lQ{t7aU9# zIy#=jd@D&$wQD=oKpTPq2noETd7XpqGML&QV}*2)I;TBaxi9z+)Js-dQy?8gzHfza zX&BbU9yFBJqTL2?i$5!zn&Jtu_-q3Qzh z3IGSO4-QmXbPR&#@fSjt$aKYfl_1qe3RoH(mrnG|Le8-oQkN{fXiAs3fra7egpOa& z+NMIQ)Zfx7s#pg-!*VGQnQ%|oMz-?qn#;D$pPS2e+X6!AX^@(3Yz($e{7Xq+^zI6q zoUX5W^e`YHBi#TFS83g)!Qe2W*=BjA)T18M_{Hi+pi`R@y#`psdDl}IFbUT|lV>2x zD5@?;Ax@sjKs=&PwwhnYr)uy5oy?IeJ>oG*=02V-esHJ{mO z9rh%_(b6PqwAl9VoFwBgTe?Svg6|;9r_51^))SZB$$Z^p5^0*YvYVTMQqD?@HqRQK zCk=`eyM2rBMp|yXC;J1tc-qCueEz`^%@K6QX^a@9^%U^}!sLJ?Jo;2!in|6hJJJJ% zv1Bl4(xBQFjF~jkCDz60w+z)pKBal!w}q>=(gp2M^_hgsq8Gk3E4(7u1n$iJ<%xY0 zNqe$uj&s*eOWbpdkrv(l9Z-N;D94aDmncWJpQ}(KSKU|cNz;-!8gK79vn>AjcU{HR zje^ojeFu!cczl!Te3P5yWm5arztg0W$7}!L zQQJcMR;e>TrZdPx^2>Wd#HZMq8UIeB`4dKUCF^S^R%7R{SJ&CMRELkyrA5ls&9hnU zV2^hGw{iA2!Lw7%HLK_M{|?~1ls7$te<7Z*DfR(A5dE=9F$z9s_2FhoDEJh*cAfKu zUdXRGf}PAHUc?VjvtDM1pMM?#oV?5sKE%%8yxtd{`>Q^lOMN|GcTepKKCL?6sv-!m z9*G!Vs%Sn(P5YcKI~Ghnq{%QpTZP_`%=%~v-d>8fKK*^KJIjQ?X&4Ug?NgiX!zuiU zU?B)x;ZwVR{VdmcYyEt>{P@2Z02kvOD%NmczSLv=zY!4v#{ZFy%&m-QEc888)a7?M zet8}$7X_9OC-)CH(tLZ^|I(Y5f1uWT6`@NR+|^K%kRIi-wArEE=#Fg1_R0&9Ft`5F z@_K5CM-WPu212nRi6IO2Ge-X#OGLO48u=pl_B#7M-Y#Qc%Ai>xXwlaoN2wTW)}Hah zT~X;MUM0nKmwTAO45?XAmAsmH;l!Y#?}#l~dQezccu>k@Cr*gZ9{(SllIx~yPKw!guH-bvwZw~!Qa@5R5Xd2LfuqWr81ocs(_INvAmfQ>nV)K zmjk|=&%0x>de=by@$cm zr|*B(8ZXPW&S&ql&p!9W+__&mjY1#jP;EMc50Yi-c}O4xMI{h$?lxOk2j6A@lMH2f zMHtp=9CUtuxac^J^-<4y{uqgi>t|zE>(4B%@=!^=@j4u$r?611@EYvvj^_;I*GAD1%Qb%C?ioGrMIo^{qm5 zwBVs)>tqqjRwbW-*jq7$Y==8imXO~ij~OzrlLY3+^d$!QMd2EnT5=`dO^T(S1m>DT z5&M!g>#B_V-f-5R=?6?BupT*P8VkhLo_fNcaoS}ejwv$GmsKGcs%$#|yP=~d#c+5! zB-l~C?$=JZ%Ay&++o0@AMEQsbpP<=ARpgO?1BW1j4CFdr;0k`g*j7r*<}$URx1r1q zlnqzP^j~G`oO#bPhJzQD$(En#7r}Wr-W0Epc`-uvK#UsPm>k*>k+!PSApXjUj#KM( zyqCltx({kay)o`in~LZW!ob?wDP6`cCyMHM0a?5Oituq*5sN}y;haw_qwj9U+$P#Z zG#qXpf3-UnuuTWeB-$H=0rJbE#L}mySNv!UzA-<5WTRngk5>tHjC`${+0xEb*M@|a z&lwz6?NN>R;Jj%MMYX`8KM%H7L!~$!nX?*;l_D=6dk!|+C~PRc^M?FA^DSRLOhLhR zyj7;LccsI0RqL<1I88XVl|b+J)KU!5hR5A3RLTf4-bV_#svoDG1_(mr_nfpnCg~DY zA8RRr)}!nr^ChA}?lm`|4=&OOyD%U;_7ga6t&C}}DM8SC6Icj^gAYFyToXCNxKhm5 z5Pt)HF&)vJ-GiM7s41!k&dZ+Xq2Uz@t<89sLG-+iMlaSWi&X~ zZDieHq8jr`bUq=8D#>3-&0aR()ok-BRpyHMGehyG%I{N=MH5P!Sp}p>6+y~M<{>&{ zF9cVyXpPjdZL22fMN=8+_jqyAIl`;Xf(JSzc%1<=VY&7?bntui|TFppB`e-B}L29m?&ZMWx?9)fxP7qt%#@N@+C*c9>Bd zYe7kG`@x9+EQsSqZK0u^qu37_Na05N_nG+R zk11vj6Jl(8Xj z0ZM$r{hWy$W0e0q2eVCFM2R>aEw=Z}EPTFNL+zwa|0Q9wfJxFFjHFjIojL>;^Y8Df z6b3-)vFR}2HZMCWH!gWR$QtC<+r_oMr+%gsLiYUg#b|seBvd@sU7QxWu zBhE%M@pvVIw|&_QWlnE#@J$J^t&oRBYF*``YtKG$*Ck2XU{uL>>>bnzahdh-seYpQ zu&eN*cQ!tfTo5Ov1-Hfkq?wvJfy;`qhF!O$QCn!NAl^@*q7wKKx>B*!PH!L!+NOpa zsXwe&of)uw2iaJTHpngLl`bQ1;7vZ^eX`_ZjJer){u?0+&urJ2c~|}D?jtIR0sVFs zHlejc-i{sR+09|pP%n3%-RLk0hVlA%@3!~ImzM*qS$fl6G{+L|B7|En%FU#2)#mb4 zFOU*tZ_5k#_(_dEjm~5OI&$shn&8E2=Tp!L)|;C@-k=jTP;#)%?@2>IK!JkyEA^F0 zsJ8JCT-W|G&E7s!2Xffnc-2Z!Ab%h?tgr~zbcsihFQY$$sHon6U3hgqZY$EPt zw~#X7OD)3+eQwEGY0SifZgKFWg0QLzBjDXrSaJ(#=AKcf8-qR6WAW9fo`j@@mB9nP z@y|QZ>>VDA-o{h?YgdkGS7-#7I7ZhMt_j(>X(Qqzktkh%DRq zwrFG0KEk@UHR6K1=u3&Nu-sJbbZWK31FED#>SO4B&BR$T%IzIL_Y{||dCmE>4I_+0 zQxjr1o%veXAulKV$I_1ih}tbP;ZItp{iFZ1P|KF;vdCvB56z4_j2t3sR|iA z(WQEC+Exzdv?slO6xftLdgnOkrjYFpG;VRT^7GiiNcJ0GbxwWW**I%z?_gnI4bFlN zzuAdvM$!kK$#o5!ph!#}3l;QaM{Ba3&j!6-^#U%-lU0R0kx9`J}P2ksDSD7kXuPHuWQE@x| zja+XCvyaEHP|lhM*J*mMiV-I$zK5HrQP`~;7GHd?SoYJ$yh`$R+j;}MR{B-_4)o5T1a zg)DBj#eF)2BtQN@wU<`lqCeQh(_%^ru6 z1dylf$aUqg0Tnzm(Qm*y+`^M@F<)4^ZxdSv2-)%$-#MMb&mTe~c|v@rHL%m2frxAr zNcWhJk==QKB&QN;hXiR9%|uHkA_upFG9uPJf|!H1d?xjgVo{gIsA4-(D+<3QOxpFA zx*^9;w+bTx0E74d!0mr|YnP&kfUt}RWVv3T{=w=N=go_vEd95z6pZX_V50j$A*n$l z?2cO0^A&#j1~?q1Plj1YBFiW`N;TQ7D<{RK)h2hI*+&AY6U*~RpWhldyw7Q8`m{?r z??ZNsEK%vmG{UD=f*vF*m-qe#fr z1vr*rPcSe3yZ}6fYyVsVNX*=WsAX;sOiRo=maf=0KLzA!oEXds> z=}I}-76KWu(J5j9_G1Q7#&U)^9jxYi<4AJ4>$yxd2C+jsBIB41bvdEM_dKnqXvR)X z=7%%pSqlq$X$Zw8qvXh|X7HR@FIWx7Uj`{MPYRWIQzVuE4FUZkH>vOXtEu!%% z$|V}@dPP+cz`=?|ywb5O)em)V>Mx6G7Wm$Yh|S9s8-ihq(stoWNgOti#9m%Dx zP&7uCH*F@?S`YTNRl09Bc6TQVE#4+n#b^%SI3b#z6lA)!B|?J2r>E9pBB~m$!!=u` z-J2POQv^cG-X4pcX&KY7rBoRGV$XW*lG2tg+yP80#LK=IiE}>UC)`(}Iw}kIe-igOPU;Pwq`0-sz zZ1gxCe6s2V-2*z>{2Zht$z+BduKj%=nv;_}#U3H&{mnqF1cfscCT8Y^eG8Ji1~y^C z>s^ydCU5vH%-@(z?h}MJlAuKS*Y7emmDCJL#pJzGUMcQ0y=5577NhCU(!x%%h~$|p zL)6_xvjUVx5yh+JgpZ&``SSUKf95#lOQ<2YwggAgmfQ~Bg49Rfs)``^YNzGasv$qN zhWtghoZM-SQS@z0WrT7@?w!O1lVP-b>dP}dx6G4>`LZo%hyFxdlv1!j`rwXK@D~JIu-{U4Uw-}1%JwCiQR zakXGo`7EBBUBc_cX~p$v*6&@)!SGzb?Kjf_jwYs6YK}a0Y~neVlx7}-sU;ivx;FNm z+0?V!oy|NwNZ}^FuXVxrE}|MdCM%*_wTJ_ykAr+V5lO}N;{2tbo@H(AP&kMBvto;; zk5H`<@l91@I%@JA=}nDff$*Cw{VebE@M4pa>=S-c62TgW-FWCqkMP{VuV=b)`ibvh zI-MID)hL`f8pveKs_k~(91$=OppVEWjs8+mI$rL*M09wy9X%R}th&!l()jl^DTFRv zk0|-rs}f|KxNfqOswaX_K>0nbu`vh2)Dt&_KjZ#(8- zVD;lAIorVwbLGgPd~n-AFh{GI{&CNj+{6P-Co*?)J`pUfor$zd9rj2YSC@*z&y7JW?e@S z+Jj91?zAIsNvnR8^lZiv?}=tQcp1k?A8O`@9adbA&fZ=!pou_0>LkM`T6)f&o}a?X0+=*U!0uOs^uSI$VAbtQZ@Dzk5N{}b}p+l&ppCy zzd(iY7;AA(8K@UgM%2ViGdWF`Hy9*A(RG+f9t1s}sDL>#dtF=W#x}!WElG`oDjspC zplC8@D3A+vqVwGNCTX$S!WSNc@;#%8+C7JxJAzfs7BaPFG^XO*$Kx&492Eu`Sc0T| z2n4?D>U$L;rs>=;g1k_bvnNOm5kgPLaG@T~MD?Xi98NJLx1-NclRg=6di!+mjvW5^ zQVO-TXlBExTMcP4QE@bTi9iUtTba(6HQMJ>+h}bURBf9E`ipzqkL{uDS(g=Qv&eTX z{YKKhP_z~+sickSKW$%*KW?8uVtj(pa6m!EFT6!pP@Q29r4tEX z|2*9_bhwYnx-UH*liGOC|GZM<;`6cHrfJw}XzATHn?A6eLbZIWVg|ypY?_Qd&X%#B zAaUzZAS;@f^y}N*C}1pjp6qzH{nOT1Tm{oYH1i_XgQw>Qv(&r6^kQ?okSBsk7m~g3 z_&%Yi!rpLB+sd;~X|Ta2XNW=1rT5`Mf=i?cMLz<^yr2g?ytzho_k{hVy6a|JGc2{FwF)fDwzJ}*-*2yFGBcyP zu0DQo|Wt6&-Q)r&wOQ{wtE%2~; z0+7pa*o~gwx!gLlr=#f$oW#EEoRDzLe;gU5VyM&h~2 z-0Sd=9=7)2sTxeBVc?cb)H=Aj?`y<^@!lilkdC4y^*E zvuyZ^Wj;3di^>hP)^dL4bvZI&taB?vb%Fe(X-AG7h(V&&iETCUlG3`OJVRk1QTx<9 zd-KbiZc=L8m$6MOi#2wEbLpy(gI!_ma3S{j$6{;?DcuL!aq?h_-f5&Sm?Hwnp zN>ee(X5w}j{=g$6f4g^&jShh941>EE{iBSn7$vuMWcX~VQ`$%PnC}$eA)}zzs0xvm z;t2KFl-CMTQ{Rsuah2&BTb-mj0S7Z;-eYK6WL{IuCeBnHEt)Nxr+j*pGHL)7Sn6(6 z-o!?%#X%j@hu!4RaPpSGj-wWASmD~@E{@#wP%{DK-b4km2?@NZF9a>7FJw2l%UQ88 zzl8fF?Sh-u7LPz68HA>TT*YwyV7Kwd_X-zU=-ltQe6KJp06_IGOHh!xA+x!aG0=s{ zn90GuB1T5(Eepz%fxe=_u)*7X^=@mGQfNS$P4Hc9TcgawPzzHKb%4h44*jYh-1K$~ zL1$aZ%cGJE@$k<>&JUmtpgh;lrUJ*N1>%!ir87jelDJC~wQs%mSB1fsLX3@u^}8t( zgM6Z6NL9v##w_+=w}H@R2ra$)L-Y)l;*z)G&&K_-N`rLM}rQ}F@`fpcfF0- zFPy7FAhEQIasgM*^#rkuJYa9fe6W?8F3&Gt-dqKMrSxX0wDT^zP`vU7*i`Z|`Mlfe zre^hkBsZ`7ge{imPV=6hF*l9q`JUherFU=BWZ8b83AdAo<3;=cI>r>6&K$=|_-NRD z)=yxZ_$5=<%|8p)Nys;^wwZ{)i$!@+)4dL$cOy%<@bF%g`pbhrD#}`~O(Y$~B#SdNxU7cOhw*O0b4H z>A0+AIIo|WPo8!^p;#}Mo`F1T2;Wl0SEpQs)W`p^b=Nszdy!p=F`exWW8J)${}-6Q z(gD)*fQNC`&6ZAfaHM8|C|862~K(_1>us^&}MF$M#sM(re{G+JXTYDZdZP->MUr&WA-v zA^SeW2{<|rURqYoN)_=>4$pWf)hrRg7ACWq4(r!7=YMuDTMHlAu8xI{>haVKu_rAoX_tCR!G zRM}&faiiyKHBtcuN+=IHz>3U$OslO-jazaFVlWzHS&Hf-CzAK@#S8S;lnVLq5e7%Sbv)c=2rGLKqCipYb$v>YZLQ-CWIHLP(KTT`3(68|G#i{ z){h_-^n`&X296+y%h>Wo450b4ptSGsij2Tx)U#n>hb@t@>heZGwe`kWPQf8s@A!A+ zcr_F?R*IO4TClGJG{Y&1hvyaXVusL7AFzfP$V)rtyh|hk6FfAiBI#XmcR=DL4$s5l zF!E{*y2s=gicq#f3r0l5BV2g{bz4s8(Zci%BYYn4JaXM*Ri0__9&ipG{w$8UG+Rm2 z#EFL5p=Dg6llf`bnRDS8x!e(0BXZ{pSntP73Jb)hn1*DL4rHjY|27a`hXZ7Q{S|=A zhHt4hTcxvL)F07f@ITB|okk8@!JxJ^28}yaK4QN4(h7|06ZkOW!sF>fiD6U;LdQIk zPl2m_iLU#icV=m{7|KR70%D&a+nd6>e(Deoh~p#BsH14_8D4eKeQ$tinlsl}%E0Lx zuPf5n*Rn}HH9oyU-!wNh!Ebd>-&-z5PK(Dpm|S)>j|XlDq=CuFi>urNa8<{q>cX(t zgx?ULXNTKnp@mXf$t+=9MSwE7!{oiZ8cNTAPW`$+vT`=(jJ`B>ybOJ!Fhp__J3^_y zTp1lFWx|Qk)!PU9!%(PeFaWCUP9_Wmi&8Xrm0MbMPWXOH-f36D;R4mG8{{#?C7-Hy z((kFoi&Q=ssvkWPmO&VCXK70wj-g?|7=uxOp`vSjv94`z>&9 zp>1b-8MBD6vuOB*D<6WN35@KJ$u`P@&}S42c3;!@J6MwFtdyRa>(bObG`AvHZzUT$ zBw0ZvO1*AOk%;f_v6+8S8crNbq}nZJh$2?X=r;FZt2=Onnrp*7dc6MwUt~uDIY>3{ z4hZ3XE~V@2_RJPjroH!w<4fdnnN~;jTF;!8o(-$2EsGB=NM{!Gay3UJMT3j>`GqNo zUwkf94yVo(4)m_Q^S{GrHaQHEBju0}%=OLWgZt_$v+km>&Vo0{gwxG{%`)uvElJ}8a4J$gF^I&zxNIz1)km}a>T*9jsfGaDXYtu^l9K1Z(NT*;L2 zTq=`_!#^PMOs2gL{>@U3U*oV`T~UHJJ^;0Dn#7rht_=O z(qHR{E7p}`Q6Mex1qh=Xk}(Y5u`+xle#`m>XEL`0U6C&#*S#eAj=Uvc2MNNjyu4gP zUy-hStVZy*u!8uf0;zWy^sAELlm8o%p|vF=8`+#YlhDeB;dbi|F!G+ z7T_zNh2r^B3?Q?331s9z-2PfJd@>n-&Hc8I`X}-2W5YHuB$$~HA_VcZWcY|fG(G;r zQwN}(l>z7{L2zI{FJgrxeFVheAA66M?@!S7|JHjA0&?MSkdaUB0RV7)_4+cxSr7jh ze%X7Bra&v8oq@yu^p>tC;KyoTaYA?i;0*hEj=<>uCo4Y*&+3`Q$vsGT*daN1xeLB3 z89wHwzh+`f&IQnBgC))lYm+kIPxTuvyhewe33PF1MeXl6AqE*D8Q@^~sR3av%;#s2#4}61Zom^8`p;VcbToQo^HT%Yg&nWDAp@eL z@gEHQMCS2&XIz(w`(|l1=s#KdUNr8yk?TTU-;Csj{@Td*vR>DT*R`L%5xc^FP5gGF z`8$VxP=dN{igkQ&9KgaxrgMRmG+_%~I z@>KJRd0F@0Z(W$Hzh?g9OzR4JHRi7$j(u}g{l8$po(+6ED!Xp!`mxnFOEhc0YruDh zSXbDe#pUvB=&Ec95U&3Y`_q%6zcw^i@wt9hbcKgZ#{Vz;KTnRX8gymx`k~A>i*_5o zYtYwj_~D4=x`pdo`EM4IH-Bg0?~VNx^0Mmn>?FJ5L9SZ@R$Kpq{JOXPG3eKK*H=Ku gKI9K*Kkl{VrC=fJp3Bt<9pEJz0MN1xS$YHh53W<_%>V!Z diff --git a/.yarn/cache/ignore-npm-5.2.4-fbe6e989e5-3d4c309c60.zip b/.yarn/cache/ignore-npm-5.2.4-fbe6e989e5-3d4c309c60.zip deleted file mode 100644 index 50627d8e1068e5392ea305138d8c765ba6a323fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19603 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 diff --git a/.yarn/cache/import-fresh-npm-3.3.0-3e34265ca9-2cacfad06e.zip b/.yarn/cache/import-fresh-npm-3.3.0-3e34265ca9-2cacfad06e.zip deleted file mode 100644 index 318d7b8460df6d64d175d419ceaf2e4558652e54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3375 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 diff --git a/.yarn/cache/indent-string-npm-4.0.0-7b717435b2-824cfb9929.zip b/.yarn/cache/indent-string-npm-4.0.0-7b717435b2-824cfb9929.zip deleted file mode 100644 index eedfdb0f37a87570be05ac69c1417024d02b7988..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3163 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 A+yDRo diff --git a/.yarn/cache/ip-npm-2.0.0-204facb3cc-cfcfac6b87.zip b/.yarn/cache/ip-npm-2.0.0-204facb3cc-cfcfac6b87.zip deleted file mode 100644 index 0aad8938ba55109ba34b418b332bedc3fbd6e05b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5265 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 diff --git a/.yarn/cache/is-extglob-npm-2.1.1-0870ea68b5-df033653d0.zip b/.yarn/cache/is-extglob-npm-2.1.1-0870ea68b5-df033653d0.zip deleted file mode 100644 index 0acbc56e22552c1b037484da46e94cc55c09121c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3458 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 A@Bjb+ diff --git a/.yarn/cache/is-glob-npm-4.0.3-cb87bf1bdb-d381c1319f.zip b/.yarn/cache/is-glob-npm-4.0.3-cb87bf1bdb-d381c1319f.zip deleted file mode 100644 index 52274ed2541e88a793aa5b42bef2c6ef6c8e1378..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5221 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 diff --git a/.yarn/cache/is-path-inside-npm-3.0.3-2ea0ef44fd-abd50f0618.zip b/.yarn/cache/is-path-inside-npm-3.0.3-2ea0ef44fd-abd50f0618.zip deleted file mode 100644 index 27f29d70bee5cb7305ae7d49f703ac40efc5a11d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3217 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 U!RZ;k#~q?xU~0u%GJk*i51G0@UH||9 diff --git a/.yarn/cache/isexe-npm-2.0.0-b58870bd2e-26bf6c5480.zip b/.yarn/cache/isexe-npm-2.0.0-b58870bd2e-26bf6c5480.zip deleted file mode 100644 index 077597d686e6fe665d9b05ed04f0eccd3c7cf531..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5446 zcmaKw2{@E(^#6yUk$uaq$Wr#nTK0VzOZIid*q1PjeP70&osq4GqU@0^B5Ss2NOnd- zBucV{-+15Gzkh!E-E+-6&vRY(`CRur=iK)>=c}y_#G?kB4B3h?f`4xQ`ys(zUEOSK zEnM7eyzbf}1hoG;mFnzNM})1f?SBTi0D^zmSwld%a2x=D5(ofXIo|*dvv!8r+wwah z+*}jVZo7?w$-6cVxRm=NL%g1sH}Dd$zJ3hSYSFpW>u#3@TOa>E{#gC}#;kkl%!LxX zO!oc3oaNyidi#WH=YVyFfS?nG5;W)2-VnP5ud1rv3%gUd(VYCgZxq06HO z#>D(4&cHcpXx6Nq1|0?%^vI%&DHxd<1c8|uBy8tpTW&jv6R2MRUEb*U^nN*3DczU7 z7-2lHNDkNXpH@ip=5&jb>Bs#(v#d#o=JVah?+SNu zw0Cv$u;q94v$k;a@`QVN3J_YmdE0tm-6}x%Zv>qNMB$^ngnV280D%txFr81-RgzQG zRN{BB$Fi-~vzgG=aSZVTYSpyoC>a2QeXqMh^Wv}CabKgF+Mv1uujxXsutD&2$`%V_ za^K*9pc%-Lkw@||CCWKUCz?Ax0jv%ENk2Y zsI4E&X7)~j-1&Kzo1Kz@3Ca#igCTHQJ@`g0B#9Gey-+M-8Iu@K!)z@m3gj{Nzd%Kc;x< z&E5!eYa-*^V8g;kIEkW2}FV&_=xIH`5MA+t)+M~8qONHwm}oHZ3P zO2N5FQgFc4&+Y=bWOjvmaSW?}Jm2!6A*xv`1Ij|boH)ZK5?Rv9teiA3aJLShdFMH@O=pnZ z{R**6C^GnR0Wl)(C{UfX0?A|^xV5(0LCn?W;)PFqU$@PS?hyZW?Joif<<{UPrlQ`; zswnmSmBI-1H`PARrxz#iq9t~Ed@)17GO=t? zpE{=0#F6MnNK3&heRS1BX1jt5+>>Yp<>BP=kc!1oZD(pxr`$fzcDsGkQW~TnJ)L+* zRj6rpd4m{I1V5J{%0Zk;PtC!xG1VmDvEhgY%Y@t}FpZ;M`Nh+6^z|?B(wqXov&P

d&l(a)}K9S6%QE_g$3h)9vH6xs#ZM))}{My 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 X&EVSV_!mwrh_D};lVXnYaO7 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

|$^+ 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 diff --git a/.yarn/cache/json-schema-traverse-npm-0.4.1-4759091693-7486074d3b.zip b/.yarn/cache/json-schema-traverse-npm-0.4.1-4759091693-7486074d3b.zip deleted file mode 100644 index 54f0a7acb67d4a75d66d4881de1d19d2cb9157af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7476 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 M!9Q(^Ah~__e_^9aK>z>% diff --git a/.yarn/cache/levn-npm-0.4.1-d183b2d7bb-12c5021c85.zip b/.yarn/cache/levn-npm-0.4.1-d183b2d7bb-12c5021c85.zip deleted file mode 100644 index dda4d01a39197c89c5e4cc4b0b9e9c1634440240..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8964 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 XCcUFR3}w diff --git a/.yarn/cache/locate-path-npm-6.0.0-06a1e4c528-72eb661788.zip b/.yarn/cache/locate-path-npm-6.0.0-06a1e4c528-72eb661788.zip deleted file mode 100644 index b67b77440bb28f2066c971a3d4b009a8d4a93eb8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4218 zcmaKv2{e@7|Ho&BBD;_+*^PZqwn4VC)hJ8$WlYu?glt6!B_gD(G4^Fhc45+32AK@9 z7P2ohS+W-T`7ZtYf1OkJIp?|eIp^Nj^E~Ii&*#41Py;e@X24%fqkM?+@4>$}+M^!n z=>)e!cslucz;bGT>+kwhW-$vfhA%R(~nW8059GBH>!*0=5I z>X5s(*@PJnv($Bu<~k%`B}Xn-sj1aLjpvU2;)|WEp~5!_G}iIqJq!d|{~O zB6@*nX{mC1`*>shJH0*>8PZF*tlGfNPhVU~Tk?p?CR^u1c&e)2$G>T6v3tkOujlSd ze;bh296#lzwNL<9<;!gW3oR-zm0wZvJe0(A zWa^SAeCTNcWo!?+@Rv8$rm$A;4yQYCJDA=R8x=}}bNZy`vpjA^PJ5!VS*;l#ZoFq2 zIaMQBN9CpUN|Tgh4HVm6yUuI@+BX*rw9yi|=uu+rMSRHDTbC+qYyZ$+=b>HG2xVk; z2{~Vr)+t-2k*FTuI6!Q0Lu^g(m*1W?1fS9u^nC$><;(HgXajOoN7#7o?N;zs0tL)F$ybldbq|6woPUvU!@As z$|?HX^Jt3d!+2V#OP68~V`;(6`<_RmcK^u!r+()~yBesD^eb}$0O0+TeqE7H@Bm3S zAGAp;a$K4Q(qq?(1*mAu(_fwj|rJ$T<4Gq0f{oitEkSuP`fh>5CGGQ=jhtU{;EK*j`Mx{{YK>f}{Qf z>ePqmVoZtXq9K2tEGlf+TtC#NLc0~K71p2OG2m((!;SU>!ix{=6`5VCC&Lj>D#4pL z7#(;)#ZjpgtA?+Om)UYOeu$T!Y%MF#>w@RRwhPT zOUak{BdwS^@x>cd%xVP&uMEtAR^Z+N34>Un5H?kO-VHCZgYu{xhP&u~CpXE=H8YI$ zwpRD}DOVzs<>5avDwWc zTvPq~0SRkxk|Qp$T1lBD|MW>{dP)0qP_t3#eG{urQ*BzwM~-5}Zo`4aJ0}z@M|H(J z&b7qXnYhBnuei!K?RUdG{5~hrY+DZvyQ_L;F6)vPo!<(GkXg==S9+b3U3(2^Tj2J& zPz{1FU_8}e%K#FH_DwSqish~kW{7#<=|nnEL2Ld0o{c>S2e5Is%*c;XJ>rGEP6IG4uSvO z!jIAJ!o;KP%RD+a`Tn$px8M#=2)HD|sn^uVXIy~+!ijNo_Y-yPI9)hwk_a}sX~{hn z;8@3c;d=O#zP2_<{7gc(>-Wjm2Kq55fvj`EPmJswTF0Y{Z@} zG<@T*9>2%+7|;L3vwfenpVMUd5)EZ=nC~3>_Smb{_x6)7ulDgS(%li3c^6#2lNak; zM%LHNV5j*;J&{(C{Y7hh;bd_HT7w}SQe5hNYiM_B9z7oGxvS!`LWSXO;q94TR1?-JjvZT7LQ658(6 za{=99*C-ba{bjw2MWkmj#l!VO*506n=jm}=+=p#H3 zoFHYl$xuEHe+|IWO_*H5>1h?1De$WzHQN@xUc*?#(U(z-2l}I zl@Jd{u%*AKVY_h<70jYDf(HvXb6%28v(jKyqwV!CTZs_=zM+kT?(!pvV?2b6UZLwk zdv26xx79oZiHV$Vw7DCTu(+12uZk&_XTK6E8n0X~WZLEI0DHosf}F~y4Fx=-V+{n^ zN!bK~30V6JGbVH~ZLCq^fHmK)n=HFrwU9%PGj$ew%k)N9t-WG zk;V{{8hoeadNjWL{+QIJ6=ErBI-qDtSbgTpr&4wMn;KF1qI$6GplVI zE1v7210RdT+&9pT99SD9#QDG#@-jB^Z@P8fe%k z1T-fiIuEMm4;|QS$ntBqc+W)%_AzZgLMIoI zP{?()Exi?}+|UH<{hs`qg6rWU?8iEwe)1C>Y^Yn>X&N%F)6rmA9D1x)n0+hisy*@z z;wJ$B{y)`$FZtx+7_2q~0*foR zCU=AjEyjGYk6$ZNimXG_)Jhy}#NIoZVslK>if>!$*cR0naF60fa3O;0=?Waq5#*N! zl9=vH`cG8FRr`g&h!E3`s>k@9B%0Bl81s@+{+bC_ItNspsf_NlQ%ta;;YSCKH?IF`_fGXj#5Z$4QZ4hhn@euF z#R|8XwiTVsn1?@JU+Kf#UyoM}T~X97znypQYX)?ai<@8!@*Tf$3fPo_|4>F$<%Haf z-ms0FSO&-K@xDU86-x{Kk|r2ztgBKQ4Fu%3d$R+pk%m*!IafQ<3fym+v`D-dXsQ*P zbqrOFDU4~PFiuaP6R--PBVy#9_J<00?NOQ3y4Nz_2y8wXLB7>WUQ@zFefqIl72ONB4kK%!bz^~?cOwI)R#F#JgBl~} z-B-(2K;56d0x+`Y7NU78OxxrQAB1H@VzIi_o*G@%i_#*zhEi5@rgHm**Ddqxs>_GV zE-=kPI`Ob%|4`tX$?Y>-oIR!@R2I&G&va;AZLMW^4{pzU|SMnyj7)w;~YP zxYYu%iWEFoCex01hHj;jB3Tb?tadmln@y=+bn@kBk+=a7I-ne?Xs3Mjbxe)a25*ok z&)yBov+sD~wca#HLB&?f2>5Y5_f?-KQajxv`QvoJv@1(O5b^1o4k%yZ%b^2mo!Of! z9xuw_xfS7N!t87;dOo9$VbOZjHKy|kK2O-g+QIN4nR-?AV{6;_mT2Q`+qmm#lN~^0rU4u z|B9GD8|k9h(eOV@{~I{}!ThxB$0O%YOkSAdpD_Oh(4YVFlXg4+{G#z4S%Kev)Xz9@ z9CzFX{=&H*C5+$V{=X?ajy!Hlejz0({($^HlX9GQymbBISyKOj_p6XW4Ne?YJph2> O=wdpmfyQ)yJ^c?d;!RHg diff --git a/.yarn/cache/lodash.merge-npm-4.6.2-77cb4416bf-ad580b4bdb.zip b/.yarn/cache/lodash.merge-npm-4.6.2-77cb4416bf-ad580b4bdb.zip deleted file mode 100644 index f6bc72b461e7ba3e932fb2845471143d6b7125a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13720 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�o zQ%7L&SiNS#fGN9)vYNZ}-gI>c8PIO>R&et1u&;7h z9d^YdZ9}H1f8Jf4?A z&W)4+?gZImhdX(CerwmjU(tfrf7c!pJ*GoeNj(NW!7ex281HpkThk11Y|K3s#VK)y zOlXj~xi1;_sby=cgJ!cM-kkhK+p)idf)zaw>}M~mn`qRJHOeQ1N51Md_#80J|1+y> z$6wyJ#n%9W&DyNN&(a^w>ONxsdR%y2D_ncSWAzlm((vH(r#N6Aw&qb30cREKyXtCs z+fkTB(Pa22WSPWEre)^SQ$d{)6~d+EpLd$ZO+nt3C3LsF(03tn}KQj^-v z_PS8p*zLgdD^4X@+j>i&Wu}3>YXM^|+BFUdzE0X7V_(AJX60Gl`L%L#w2R2j`czT~ z`tYuxU>Ff@Y+RqdEA7yK>IU6ytziZn_ozU zaLO;pvno14v1~$1vePyQ)3bp_(6`JzXa>5xJDi%JFu@* zxexA9DY39rnHGvmt!2bfgLkSVa~t>@VcE8is?{|$mm>!;pG7~wjfSO%iPeR-amj!1 zzA&J*hDeIFKE}?l8RT0!SUO2RoB@ld&Yo%M#OfbNXI>Tg{bMHc%no?xdW~;FGOOD0 zTv&*?Di2$6%q2rHSaKk9m{u^FgjbY1^cNa7nM$MeDGOfvaL@x+kr`~*lM}0(_LP$@ zJk3lJU3B$C>B(3-9wHLcY+MsEDZQGUKrN8-zB4UaXT2^a=V^{|$4WWCXGtkdBCgIo z{E8r-8^-9$KLh1VpVdFsTz0mo9tl6c!R)fJEtWgbg!W{F1l)}u*+&hJiY~m~b0s3> z=v>g5o1ysfih`?qLDb+)b%~m%YS}0FU^7}{Vu88Jras`_c`WPb?{R%GNkc%W6Yzy& zh;d1n>ANdArT&rf(>^dqnh_(OxxvqSZ6+vyEG(j8N!Yam+%zV?2Y(}%Q!xuyL&jgh z=Gc*Ta%Oof&&_evXPzAe-@+TWfu?{uX?W4-IX@FR*YDrD{?Sm)Zg^ zK0HECMl7qn474y~kVA>fAzIDeir3nIYj_S(?PQ*&z}7Ikhjj~i^oGjvl1f%8QMqmaUJQm$-Jw?DZ{_}U; zL0ehQa)@w+4b1!tvjed_q<;@#NJ`YCB zFhKWYM8MuC;OUm@;mRtl`;u?#>#AYz!yNkW5-tF`8^6QohZo!6bbwP-4#{{>PJH?h zL5GGYa)($qoW&+^f9Mx9%i~b zEn05>cUTOh+;C{Y(-~a-5|3c4Yp*{B|Vp5HqTWLe}#$!NrT$>Pk+A2A5OND#pZW0ChCkOUJesJ^ZkPUr?X zKZ@5Hemdl)TBoi<<%nuk#ABZa!2KxaHEXXY*$fuJcDpejv%EbO8W2&F=0kpjEE|+} z^m%nhe%rNRrmc$FG2B;1)0;P8v5HTKPVpqb5{6DG7>QO@>wQRZSf*n~NuRx%)MS6zbTnY`5Zb6e0CQt&yevJYB<|o`FQgN7 z9|j{UE+Q6`kys6qDu#amjc)XK_X|TAbCW~`!&CY^SDo>Uj(!p>_fE7n%U)-!u;xv+ zOn9kJaNyW^G-64fmAC0LD>sY5dxARWs+Zf&sJ>lzU_=Y1-qCW=hVxpyvdjM)N_Z=pHB#Dkwr<} z!^yx5{bP27$$|D)U0{YfP7TU`%Fi_x7F6wsyNm4AR2G-lM?#XKlRdvBMS6^2@9}DK z4r2`SeyK+CaOKoNVrtncRA2%gH>Ur ze9H-y+ho>~e$8gdWz2Gr&xtm8lVe}S$88Z;d)$4~9gJ1xxLXtvf;#$0a%8dYs;58s zC24lV-UZ>=sqI*5>c)WiySf_}S}VP3o-sy)-2KU2*2=uujE9mgKmf1eZ2fgzlr-sq z!XIiZ&QRW1&JMhKEuCirNavl_x&Ix4Rj(staRL-a60`;f-i<4+}>mAwZ5O~43g{3cQO3p*n z!=GiO@|8og#OBkDPDO&^FT;f)q}biU2bfRnV+DNXva<7h z9?^0EO>mHY@Xqb3@-ZB;R(nx(E4y@9axY+Xs&?lE_wGUIlpOjG5e`6c%pI0jG~&6) zJCp|wya{{h+SyFu!?6SZPiWfau+!tqtKvx@BeDxNh1TeD+~RLHTw5n@vMDkGr{4O4 z;=TUc9vrtm+4a0wlp4h0<6q7JNX3j-c~Y=u8m_QQtV$zu4&Jg)cSUv5FbKDFu-y=Lv}`(0?D(BDJFYJkg0jtJjJen! zOW{kAAk+BCzaM*A;^IwHFnmO`x>Y!JEI)UJ2p3KTqGg!|Z6jk@Zfu4Kg`)1jFt3)4 zkv#v20s|Wf{wXpsMC!u%`#1d`AK zZlsafE4vPeRGW|awBJB7pXY1J+5`adSqJTu^!$-MV%=<%4IzM&d5k-ayF%yJ0)0jc zmHWvO_i7d@ITw#D$M=ee6awVfN#Cuniw8k;XeC*s26*SV4xnPwU2DVjxg_JTkGWLq z5Qi?IFC2>|(F{Yf&8t0y4C9&$q%gW9aVFW_K%RCDhA?GcglsgEYJ#o5*GT6fk zK1}82qPF*F{M0sU&pF`S!sVN%KO3YTx&1B`0|jf6LsxV#T?1=w@*oCpQ`Q?=cGvYc zH)zFju|M0*|9q*>cbwU^F*mVcdvBjOf?Y;S4mey;E~`CuGiN|ES9G*L$U7EMX%%Fw zkmBg=g6(nOB^7QqJvHBWNFaVlhbwy8my@kezhbA-4=(CX9#QVL8BiLdpX%x5|LwlB z@|Y|}|4Xt``T1G@I}$qu8#1bUeB$83A3O!UMoycK$2v^K;3;uAIv1Dn8?H!roHZH| zbte9o*GVupNy&hMNXC-7ryK(e+X`>wnCwnj+w-$1F8Z(w_U_3Jp<4npV;`s}7`+2% z^cx&ES-%izg>9$hYH=jU5U$%_3Y31+vgrB71vnHQ(beyvy zW9}zpcy6K+9>EF-bkZ~K$P~e^(6~e|m{Q0HMLu8ged#Vz*ySjKow<^c^5ft3D>QRF z4=Nn`(zCseVeJHwjrD!|FWCOaqVyx{fV*t!zz7N`%izsvQ7&BaZ(+ytn7yf&)c0*N zUS+Xex|HY&5cm|u#GyPgwIB=TN2Xxn!9?mRD?AnuGD(zS{se{la|s>NcbX^sBPh-H zvSyewxmqk=M%ml3ZY1FFO!ZHmyqV5f*weK~ruq~CDh;V9=uic3r9=n-O>sSjz^yH@ z79SE!?)s)j(py{_Gr?%a$OEE}q0{ftFQ39h9qCo=*|SlLHb)VRJ6RmqS2ej(7IO8( znVhMkle@#@acQ)VL9DJ$U#jP#%lBnZ)v>a*mChX+2{T%-gn0^OLNu{z*>Uq$oXB?5 zCs6yap64&95m*%Y<;ffxbq1wf2r%lict@#lZN>efMM*|}Pe(0$8%6;8k0aM^O#n+n zr8G4wzcz5b%p+B*O>yKW9#C;r!eEdejW|OvzmGl0^SRFb>xp^Ckmzv;`?%$2Vji-c zf^5=Lvtb|BCH%ephJ8%01**n}8!UF_XEV_huK=Qyej*(JWqm!GD{cI@kEZ0A7u|N7 z;L;#Fx;M|LI5UXTE#V#gUH}PL^WF9r$iJ2aOADofazcQB71oEfkt!bCoq%BI67)vZa#n|vy=yuC4ZEzBYz**hw_MQh=xF7K zH$H$x&4M&FQdsT#_9381zO@tZH+nsoTTmjzaG5Hav1@`OS0#)Q%QGe`2)xE09Tz-9Dxx;32o$%zT5eE!<_nqzd5kA zI8zM(%)Du(RBf?V9h7DE)A2uF>9!jsMnNZQc41uc9`Q{pf28av zcSJ@m`Lj91bL8T2AOeZZL_4_7`=TC0t#c1ix0h%o6FF8)1j2I)i!?wm6)=1T18;3w z*F4Iu{g0W6wx~C{&2Elt1lOEfV(MNne(B=#T@=8=6{)o|_##;l@P+1*+9mf%i(Rhb zZ;Z3uYWKk3=wmu$Fj&+}C6e?rfs9u@+rFY5DGC^39m&PXru20tqGOf2fwhxmba0fP z(2=(8E{5`W#+niYb3cz|-wcmOu3>2S)RL(SX*G7~9xayZ+FaXO=nfjgozH^?|qBWfdpZVw;i$%9(RnHg+kJoZIBXU1I=Ov>$RsU+I3P1t9mbg=) zZ@Mld3aS_OcdrVHEetrw`h9zxB+?;Hs2_hs1}#9>^+3-(<21TWOI(0 V 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 SD1T+3{2Fb)1lGylH~v5VCkr(I diff --git a/.yarn/cache/minimatch-npm-3.1.2-9405269906-c154e56640.zip b/.yarn/cache/minimatch-npm-3.1.2-9405269906-c154e56640.zip deleted file mode 100644 index ba0c510402f0236067da11d1d6016aede6318ae9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12857 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 diff --git a/.yarn/cache/minipass-collect-npm-1.0.2-3b4676eab5-14df761028.zip b/.yarn/cache/minipass-collect-npm-1.0.2-3b4676eab5-14df761028.zip deleted file mode 100644 index 582f61ca2a8af14d7a470360a8d38a93edd42e52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2858 zcmai02{@E%8y;o`!ypB9ow3YFOr4xCCN#1f%917fk|iTt z!XQ&5N6A)%u|yIj6vom~Cx3sgzu)s+*Z02Pbv@7he&6-n-~HSu6Cel%_!>H8eO%u* z-*3E|t1rRD)xn4065#FXuZa3(s`&O)A5ULTqNBgRf-}L}+tvBP_gZ!U*SBM09Sv<> zvH<|=>;S;w9cxXE^pWP4$lv3Jd{Ysy)(`72L;8T^4ecwy0d=5-@1IQoAp=?QVIv32Q1R%;YhR zR53UvXwA9*q*(}aUf36M^eNl4^xmNrzPq&B38Fln}hERCPr09jebAuI1i zccDi4z!Rlxa-d8TOHa*XuOIpVZ;2He(Diu2waKoswbXXTQ_d)_cx) z=`3-zLg>YyvD@E#KpnYr&rC50GrpAw&u2Qs+PzSG9^|ItxtNmIR0_g40C8 zJ+yXP8hLo$kGG4?v+g!M(62iOOgP+bP*qggB{M@TPR#<`x!)Fj=U#ubzvBV7)1Omn zN{@d4$W~v;_ghZ%E&BB39rG{dzqHz-#-S9>QRpTuS~vj!sU4}|>FeTp@hIMZ*2*ll z2LYuo*(6(H&;gnUbGack2PHZ1vx)C%p!_^VoYQ$1v@OfO-AimT;ywraw zFvHouv?Odv?^+RU4<4~R#1p0|>V92FI9Au8u0<90@hzenGbz78u)l_X6K)x-r$>Pf z5~^-I78{}K_x3BijfEbFhd)bKi+k4wVJT*FHnAWb+y;+%o9$cKePzZ!bwH9UIF`X# zhOEy98k97C`=P`T>O1p79Hbtn94UUDl#E&`7M-r;=)3$#ACuU1CS5^*0K=*vKCqJH zu`3x04HHuYr-Y!iPW6Tl&#juJ4hfxY@`~iB$FTpA)9OH2&`HG42R^>!r4!Y2A~i9+OQ-wMv^f>DKDqlb&Qdx}F=&1JsB$O2pwpiRCZs z13M3z4q%=eg9=86S{0SFRXWd@UJfyjD8_0Z9Cb1Biwc#nPm(qkQ4kbaGNIOogloxN z%?pJ_RAyh_GnO_kCTGJz?K@6R0q2Qb&*0BRN4TD-GlZuCRTAZ8AE=S6m?4fWX29C@ zz>}-{A8(w1&ypD3BFoIarv5{84GDB{0dB4ax2w$$cGP`gjV8E(m$fQzwsc6&o00yR zPi@6Rnx{6U#&MHVay#;g=;-X_=He=?0m3$1uHJ`R~a*EnC!e8F86CYFyisq)ln~G5P~ES z&+W(<+Q&8QJR2viG}cdx*)SdX<;I_@PAWwbw4{S*uNaUlQTN3_^Tqm@{o}(e@_4!I ziDSI&o-tQYMJV4fsWJWR_j-OFA4N-vmm|b|u3F>wO}5)*xED;=T|z^lU!JcU%P^P^T|uc0j=oIZG7 z@$so5cH|0OSN*5V2+vh z7TjO>61P~1Y)(smP&f3s*F@sZ9TpsfjNr24sF7TLb_jwkF{jhykPT_-T%QEx#V1Fy zVeQv0RNE@m_1;qOFa8L&qz7>`K?vt~fa{yjkEUrk8EY5lFs7_KQTzSilvlm)B^y4s zCa1Pj>T06pQEy+$R8@fVpK|B#FMJzaw+w`K-xfW4W8&a_NrP$+Wp`QEHoHQnAe}mn z?q*r>SEdTKjcrS$sZ}NPhYowgd7ksk!kYIBoF1eRNtshRW_@{hCz0!>P91&sP8bEl_v=e# zK|;v|&_kFK)rc2aR+wer=Tt<+Y`>K@tL{#5!ujMcwbTk~_fwc5hU4RzlU>$}m~ z`m!y^?IZaIBzf~^{{OGHHK4a+ZkOdBm|dWqF#lVmx8rV?m>;V0k=k{=l}o! diff --git a/.yarn/cache/minipass-flush-npm-1.0.5-efe79d9826-56269a0b22.zip b/.yarn/cache/minipass-flush-npm-1.0.5-efe79d9826-56269a0b22.zip deleted file mode 100644 index 913b687a4d7d0004777ec6fc909f26a6de3dc2f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2768 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 MbE3i1G(W%o1xU4-y8r+H diff --git a/.yarn/cache/minipass-sized-npm-1.0.3-306d86f432-79076749fc.zip b/.yarn/cache/minipass-sized-npm-1.0.3-306d86f432-79076749fc.zip deleted file mode 100644 index b6f4644f6238986ef77b5dbbaefefbd502c24325..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31525 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%0A~W_q9Vg!WZRs*SH{)RVgE^ zzF*;iHr(zAm3#FY|ATeTW})cR@*O^}D_lvPxI9_cyuul-BExAfIG_c7sG1qI$Ptb7 z4-)g@{u`@43?I}YT}w;IrC_?-txeseYGL>hMT3ni<%dB!&bQ0WQQ!9uK+ik)zoMd! z!}x}>KFE>+kYHd`|2I_Be^8>V6+beaj4170dNrf4pROzy;Bw%;p=f(-&Evt437E#y z%36)JnWw3~UX}JYxWGWYQ4`0LVfNG}(-$c+3ShidzVuBjn_-^LE&x zPo*jY-XfHia6A%tijA#?mINSHJK&0qpu#rgvoNxiNBb|13W>enuRfnQCQqX9Ju)@h zTi@7?9DP*J6nrt|O-B%F>DAr{9#euA+01JJ0g{Zz9Qk$j-OhvKpxd=AI zWER8UH2^uMy*kv5+rs2>O6n;Nv_d++&kLP|BCX=n;#jw0HMfDT5l1w)QFg1FYhzh+ zjyFB&U+{V?&zvzSMpF1eBfg@x<`&V)F1ByiywiC27s92rJBz=00QM)U6^BUPq}H7` z59tAM{7pZ=^*rN1d@Gdm#BmNoh>j7>)X|w{* zX2RF2oczl1Bm0NZ=#~%lFVO!QWJ^RlOwdP=wLXGO{=WoSQB+7oR+Qe_SSL=%c0~{+ z=;DP&Y)4<7pg9jMtkEU`k_&@GB{J8o$H+6Z6u@qMJhPj@vFXV|T0A13 z*U@!#i^o!sSdIH_YdNRVUwUGT)%`XbG20OUzHe7chcTQ@oX0C365LaNhefcYZ7oN8 zQJ}`{!`5sxUMLkQcG;}EK`zDT@yq)Z=bMM<44;1mvs>#HZ?yD*34dBjVWuKq+dL(t z3c_ll%I=vzvv~;XR*^m)g{5DGjM$O}Y1Jx$7G)iWVvCPz$kXcdhPs>#^e5&Bs8(#R ziZZG4Ptf1IkGy2n#x596_ZRo}-wfi{$Tt;ZW#^nOR5(uLoK9oNX}h^`%lUJpw6_b!p6Yl}ux3i%s>t z82G|7y0wepWfA+0SCMa0l-j0fvP8A=iPxOrVKv#Qg7wl`Qbu_tozG|}IdOjgKIf&c z?ea@cs`f8x@WaMB-w|4@W!XcbUkla-A$z<2WK4Xblj5iAD!=e0Lv5!Pay-JT37QMW z#ec|-kLgs*x&vo>ahHqH;NmsHi2`)E)DbtVb|7ek*>U&p7;TSvXwzrV3YIxJS}?*6 zQ}0az-iZ{diKKd1%+%_go856V;vdKi)Qg7kokSf@FXW}cAp{`*XVmYfY!eh^Zon&FLHn3 zTK{V0U)}yY_VS;y{U0FAf7i;tAeetw{5x{+pNgrl|6cLG0SNyt{r6AQKcxp8|4-8Y q@xl7L>fhgq|5Pn?{`ac?{|zZG4fS!gz`)=>Hj0mM9J~JG?Ee8mA4xa> diff --git a/.yarn/cache/minizlib-npm-2.1.2-ea89cd0cfb-f1fdeac0b0.zip b/.yarn/cache/minizlib-npm-2.1.2-ea89cd0cfb-f1fdeac0b0.zip deleted file mode 100644 index efb1b7f6b696a5c51349ca65d03ee278bcb0d875..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7136 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 diff --git a/.yarn/cache/ms-npm-2.1.2-ec0c1512ff-673cdb2c31.zip b/.yarn/cache/ms-npm-2.1.2-ec0c1512ff-673cdb2c31.zip deleted file mode 100644 index 725e9b8c176a5f862271765789c23926d856763a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3647 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 diff --git a/.yarn/cache/ms-npm-2.1.3-81ff3cfac1-aa92de6080.zip b/.yarn/cache/ms-npm-2.1.3-81ff3cfac1-aa92de6080.zip deleted file mode 100644 index 2b635f28eba557cc6c9dd1331c56413581df078c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3593 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 ByNv(< diff --git a/.yarn/cache/negotiator-npm-0.6.3-9d50e36171-b8ffeb1e26.zip b/.yarn/cache/negotiator-npm-0.6.3-9d50e36171-b8ffeb1e26.zip deleted file mode 100644 index e8c5cf4899619c53c8d2bdd5b7ca8b0584d043c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10848 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 E04ktXIRF3v diff --git a/.yarn/cache/npmlog-npm-6.0.2-e0e69455c7-ae238cd264.zip b/.yarn/cache/npmlog-npm-6.0.2-e0e69455c7-ae238cd264.zip deleted file mode 100644 index a7bb4a7dfcfe08aeba2db508c0150ab466949d6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7031 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 QrepuQeltk+4}W|5Kb@86^Z)<= diff --git a/.yarn/cache/once-npm-1.4.0-ccf03ef07a-cd0a885013.zip b/.yarn/cache/once-npm-1.4.0-ccf03ef07a-cd0a885013.zip deleted file mode 100644 index 1b943eec95adb9e35d2494a12daecc5b5fa683cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2595 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 VH3^A+b`YOmc<1x+CDqTT{{Y_J|KtDw diff --git a/.yarn/cache/p-map-npm-4.0.0-4677ae07c7-cb0ab21ec0.zip b/.yarn/cache/p-map-npm-4.0.0-4677ae07c7-cb0ab21ec0.zip deleted file mode 100644 index 092fe42ff791cd4361782dc1682d3d32319174b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4836 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 c^&8SZhQV06=2~0OWTM z4Dp5rdi%oE0>Ti%@Dnxm9qI!4nbmhS!(*?4J7ZYSflYXh!%QVzS3w%qZ)qqKGI@*e zEI8wDR1;=#l-g7miM(btZ1NtQK?u0I+UU}ZkbDr@4H)JCrFZwMJT;)TsjKQ?B+s<% zb7z_@txQtl(?CgE=8Ls~#SkAhS0|)+^EKO*sOEHzCpsdx%g07;Kuj?1iVN{gN8RMc zK1tUuyOgHv^DFbS2O4H4k&aW0>GN7wrmn0al9KG0 zK9Jmtvu`xfZh0n8z5&F~rXi<>- zQ>;cPZT~_{&sWsl&8wX}7H{d-XFKg>;1f*o-_Iw0|F!J?u7LxlkvWU{YuMUZrGtst z+(Kww`t+>c1)a5hGIu#2vPm4wvaDS}iAO(L|HS{D$89>qZR}r*Gw8rE=#bf+4*y^u z7@9!_)=?kAprT;X3+Xu*ZVeh#z~fb{RFc}bW(Mh$xJ5j;bW2>{-i?F*N&jce*b^&` zhixk=?tK_b9%?O-N5+_)$*Y+2bk_%mU^gkkrlMQW5_}1#We-e=`^O;s`H~b_+N|P> z>83&E{P8M$VziFd5mB!_Qz9b|(f6Z+P&8dmWH}+ndO&emMb6GFvO4IVGf}+@-VhS0 z&ax!oL{JCDNvo?UKIO#`s(dH&OOq{4F(nVC`V7GvAWgIZNO9t?=Y`CT8qSJtl3j(I z1@p`6G1jm)*9dW1GrS?wTraQ=sUcMMh#-UUAMiYItWPcQl>^NvYnpnrb6Tiq1iyLj zYQM|P+3}FNkI@_MRP&zMs&SmT8r4bJkm=X#&Y2fuF^tT*umS+myJt7Z9|{W&gL$5? zO&eAhX!)RQaRYTbX{?+~w(dTsBbyE-hH77tsxrZ!yW_Wo_2qd9QwIzNO0xMiwe!j7tx4O zz@VwGMHo7+zx49iVOBzk#w$W^c=WMc)>syU=C)3}1pkPXpZ?GUtC*Oe+4Uk*kwwA; z*)d(ht#_>HQNY8vL7n~=JjU$*=ns#f(OmhsC~Rwvk!8l<8;Q37ZOoyzfy5p=re0$a zxTy%In$8A2BXJFhc(&RDp3wk73NtO)Z)xG`0vFOZ?dl_P`KTW~nJYnWIt1^|mWfW< z(;f@!#_D1r90wvSs}Ifn!&l>>&>NDb@cxW`Sm}_!l^?WiZ_*T39rKaisf#Eqzftz$gcEmX@+S$F48a zw;scf&{$6a%8YLv5vH|HJ7gl3bQm!ylOraG1;B!C9?%RkNB5TDxwu1Gi77#L_91!ZUTp(wu`* z=3w+};=q~YY)WiIuJ6I?wuHZiG-q^`w6ms<2koN`B~q8rF4D>Pz{rRuoix=c=qKAO z1@78(VnW7gxi=@sm+t60eqhZJ)Y(&;0cv-;fp)YIXjcBjn^2qxIUK9(j0oH;0!^w| zR^$;5WeeA}{#v>*aUCI4M(Nh?0RUuoFWpd>w+|eq2KUKwb`O53F7PiOq$YuTi20nx zMns;VUCIHbJZW&oVVNX9e~<>rD(lu;5#yKw61cjrWJT7~=6$*9mrohiJv}||dZGc8 zyQLfVHC;;tNY6;Vsm`JvQ4_#OeI;u3XnYu=)1(op1ch?HyVawj2km;aY>+slntV!2 zIoz$lxjm}BZ!6ObpWlvId1Wh$Yhle?Yh~fm6NDbJOI)V1TqsR7Ww)*_iUVC%4?JeY zZ&5BJ7;1bq%ioRU;Wi^B}H^52Jf?io@D%l6m(^e@t~SIC37(%NA0V zFKnYhl;y}c!+(eR4dYNbQ7TIv1HLjKm9ZeYDK?l zARgJS8_;z5jH>mxkZ4$=UuR#Wpg1D%A~s5*C64;VqTfS_r-OPMd9zZo!$Uin1ZHu! znJY9OKfRH{?&IPum+*K&fem-T?(xt^@*_^!9`~}8sn^{FwGHB*SxHYuJ;4Ev-n9`V zIr-71L1Hnn+2Oq0wG>;gGUH1_@#!Ox*eVL?BIXU-W9n0pY+k{^jEh$}F zq*RDvpyXWo(8v6MJh=nrN2+Ez@0Vq^&Wsvc7F`Q@XA7B`LWSb{T1Q`@;gysP#r1*( ztSHX_m2J2y3hA_Hf(k{XZ?#x7b=6L!joREPc^sZ=*H{DlJMqC*vpvM|cF zIG^2t{$Dz6A8Z?R=g9vF`hg(?cKNz(0k9Kr=al;i=*Y4w;E$QN6K`kh`H9EFwkzKM X8j*wT9)>3Xz{a?`8HeKL{QC4CCcubK diff --git a/.yarn/cache/path-exists-npm-4.0.0-e9e4f63eb0-505807199d.zip b/.yarn/cache/path-exists-npm-4.0.0-e9e4f63eb0-505807199d.zip deleted file mode 100644 index b5048416993ac078b1f2188c547b3f487276e0c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3043 zcmai$2UJr@8-{}f0jVOZDBTbUL_(2(OOJqL>Ai^55a|R6NCZ*oNHj>08bL#mqBIdi zg@puU0a<#JCK}LCG$4w)w2kia`^!19bI-Xm_ni5jd%yS2%=cOtvjPPHUz={lFvqvS zzc(IcABgcpy9Qu9!~D@$1&g0fJ-l;jkb9`NJR0YN4c!jg1K{}fh6-He9eEZ2z;zD* z0NyPu$Q|Y9?uCZ=VljbeqLz7!B7ef08GDDr>Xrj`>AFY>DF>mf&IH~2i^iz2(bOLK zD`lJE7tU#yDbKD?VHr`7Vom7P5;D%s0CWMKXjkyZD`~o6P)Rv?Fh}9@(d2y=>XValcbA=Tb2Z7fdVGMkp<7sFNM(&UdivSf z-()i>+lDz6q>hl za`u5Nd)wj~@nHnfVM06SWK+$mrM^Xf{piOoQf|0NxpZ9L6Mpx;;D|AkByzlhY)%>R zRWNm#`!$DpCCke18CIJ7ZRuw&k8slBfa~jDVo7<2@K)R{%>*8i#!A$6Y8Sp(OCUmG z-GPTJ*Z<+&YpWZgYYb_93(WcK11$W zNJg3axRkG?zVbVpx+Rl~sw|8bnvs6tNcseoYe43GcO}KeZQW2Nn?(5X=cfC)_nkHq zAsQR+%FHgZ{-{;t^5d!!rbbRott9_jD_?980kMy&$Zs$*Cwn$Cbbt%V)-%l_)yl~; zDBW$+YZVbrvcliiuy5(Qw6)cjz25ypQ4*>z5}+Kc22~YIrRseBln#>clhJw1nf_Z7r&eEV-H+Ev~v4eFuPd zl|9*^a@nE{ol9{H7R@ql%uyX0&$EA&)1*$St=h1CbSc8+`XxEnAJd#S$d8I-Za-Tf z03fkjn*Kg0bRZV(Y-OA>rpW*M3iQ;?b45v0cgxCt>+*n0rJ^!IRIW%?oV@B$?7bD` z#XXLON|MhyUd4CTEh#2UTmozYHxaNkqNCu5o1fp#M!&;xV>0Al$N=h z%;4h*xn`b@eYJ@pZ1+Z6%q=}Rmt50l!gz{+)ukbnYMEq}7iaTv(cr0Hz!&E{K!P!4 z0!d4}V4SI&Fl+#x;V&CPUgf+OC&z(}zs)TtosN9?Ynnv>+ICoE?s%NMel@Y3s@7n^ z<@r=>$^O`Fmm19!8-M&fdN4C%$R#waoRJkdd#ZdG=vSi^D!m?a2jyH5mDt#9HiPw_WEKl8-r zCzvb5Ky5I7n`AKUnBlz~f_Ubknx-EYuIOT%<^*%$rm+D4M|WGeA!v8c05mMXGu_4= zGoZ-7p}Cc;XW$De@8B0W8OuX?z-NFW)k$jGc!v@FXx+8=p1@Lmounp;0&VdI+(eI~ z)F|!QWF%uMcObUt!=L<3a_@mO8Cp1E?np)BhiGlSBaF;Y2f?Y1^nCZCkcG2svep_> z3pu(5#oEO~i>7mhr8x!hQYo-C*Cdl9)Cr%e$E_NnuQPK*YG@zGdB8vfy2wR)p zP6dMVqumnVFj2dH6i;XKqjIHN2NWISmyTY_7N1efp|wN`uON* z0Js*04$Cx%5lGLb;6|vtL3b`3=xn%;Kl%LEWpIjp{$(3Y4P2fbSx$!EQw4;-KqG5%Tb#NaAWi%s`kIq$huCpM+ySCAb}`<)<9^wXx+y!r9h+wMx< zogGrP%wWG3@>GC^v_}YsHjQJ6UM`N-(8_ycy^6`YS^xOff^^}a`l`E-{Z4-gY^YaQ zaksv-(Ekh7$!%SX9Bk|PwSjLYtzXon>o?U0y>t=MRJUoJi|@^M)t(?5Z!cnoO0|?L!<1VR_&zp2!80$Nb(gh-gQi`E#-CZPGs2)W zdGR^u2g>0*2@_bZGlV))gjV+<$OJ1r&r!+ow(~l)l88GmxWPd`xG3&mIrGar?m?Uo zwVu{d)j!`yTYbo|Io9sRA>&mL>Y*-<&!C&wdMAl%Uk#jo!zbh_BUNu^p-}-tcy_fi z?HJ1*9oCsF7{e#)|8aut+Hl{GzV>itI zJH73swvjvS%Xefyvq=B+%f6eLoxq(n{yT7!d9wTm&=@$Ngl12;-Dp|4+ zM2jgQyFm%PN;%QOOYhX1)5+&_+|TFp-1i^X^?jcE^Skc*`oXQ)*hK)}hGFd>_xHt* zmjG+V6TGo#9Ko9uge9uOe;X>jH8dC#=BMgURK<7_2|=VV?2lX!fcyJrs1X;BnE?TS z2@n9FvTbfK#w!rxi&YCC67V>CJ-ZGKp@}tUHNU8(LJ2>=rA#VP%tILrQYIzOmU~&~ z|4~x8I=OV@3T|YPdHW>f-N%Enas`<}6X(hwx$l&}KXN{)Qp(iXeIiy7mdA5J!DhE= z9-GyL%mo#~-h`Qivvrf)i|I0YB%GR>8FqOQoEbppRrKSPN28f;J;qq>f(D&<9ul6C zq#Dq=5nWRqPHiZ>^=V`#5u17*+sj$0Zk$`Bjr*(F2bNa$#-FYyPo>pK--GuC4j86a zY~ZtW$JZYBD@aw;=m}S{g&xBtDam<(uOq$Ty zNK9IGT;kdFg)@>S=0v|iV4mi3cOgT};z{A`9NS@3Q=&J88a*3-MBewJmT5bqBuWa~VdARFxK_+y09YYGQ7p?Y$du&ma*VG_Fh0 zRlDSM?XL3p@`3$jPSW4TQIBxiC6#WhYBv+X z7?gq0>s6n6_-c_98<`IwRyN=L#i0dnzxMcK&R4gqA|Tw`;1F4@$vD2=(ROL{w60@R zqYdbfcGvexq8q9L0?3RufU8^Kq!E@mRhDF>p%K7`L_yzIUY;LeX|Se0a~3E81jXi-;nn>h?Zmh$9(mx<(8O?R z{Eg5#wZ(SBm;G5FlivMT+4^$t-aou(8m%+Zn%w<_s!8eExg3&|!=G_Et1vZ1{Y;F< z&1BhFlZo`99VEmKtF}JlmtJO+12+cI`Z^($g03QqqdE+jw6o^^jV4kFKm7`M=nL4T zDr!sIhCtptZZ#L-Ax~qQ4-I zn-xN6_Nf0<{j1RjVcA51u>xkLgG^L>J$2u4371ZD5g$r*4%<>JFe9*V&h-9g!RLW} zTot3zjbs!US*0tSeD5`+Xg{B*J9sbMZ7=qUxR@`(`d$^9HG%@96wnPOl zEv@pNAHQ%|1!HX3*|%>WdS~OrWf=uEjoG zyQSA;zK?r;t>)!R`d6!2R}h6&%}U!=b0`+$jl-(pyh{=7w&NN?x7VO$M@wx41KDod zt8#0Z#l~9NL(QDLXiP@+E}a!EKC(k}F?z5wpL)rr%BjUPdG7Y%54s0|1AU^1l8ReO z2u)j~RW&_A{biFEC4uv9NG<372B9a9NPInM;F}_6Bk`i*ZZL&-xyyr(`%gnjs2&w7 z+mZRUFu5+ZuMG@5x`7oT&c(aF_C14}pD zSBQ}-c)js1jjSAex`T+Ii`L7;Ak)*a50P2eH+u7}pmF#1u%n?h;ml|9dY_VK98S%i zN8(-cxVoS2_TW6e?$=uxd>|v&6e2DR!h>t<)!Y4=O(%3|L%XI;MampJF~_=vJi|dx zGy}N8L-s9NxrdghA)gxQ9A7)eW8TNC zc0AiaHGOV761liCV$*}XCemzt@rg>0jV(bO$$Z7bDJ-(ui!6!G(?3Hj=tNTjGGBs- z$Qy&t=ItLcL+#!qV3I~h?sU4puD$NO}Y_duyzT2|?+m~!^Z;np0iU;u!V^^CE0 J=l9)4{tez_H%9;f diff --git a/.yarn/cache/path-key-npm-3.1.1-0e66ea8321-55cd7a9dd4.zip b/.yarn/cache/path-key-npm-3.1.1-0e66ea8321-55cd7a9dd4.zip deleted file mode 100644 index dd7212e2cd4204850730ebd67e61adb912b558ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3358 zcmZ`+2{=^i8@G&oi|jPWGL{(J8JfmkawFLqEs9|bgJEPHYuRPJmYFGAhAbgVNKu%i zNTCKXY7nwSjgq9|KXq^aZl3Es&pF?Bp67di&-vc>_kQp1*jljzL|ML@N$m*tkI6p| z0p{q3b4R=Q;@pF==s>XTj!VV2FZFi~!f5)S!~XGMW8wY*zi3_(6~V^Bf&j3v?Ag%= z>xDx51)|T|TV>L;ceQ`eI9w1?mQ1g%syg!64XTudA_hP%D%6^#xm94cqCEM>(HaWm zuqd#nqUg*`ojCo*Q;S--Qo~@@qCC&a<-rV2Z~c&*B%Be^$kF(ir|%c@>HdkSg>xp? z=f-Mur^mu^FIh$odL9nM$5AVjkTgI>sm^4^U{JWhWk4*u;T=kM8c^tk0tP-h1(22& zJ(N#ADETg9s>&`4czTfD_Q3mo+z6C9#&62?3QnWr@w|mGVNo5Ij4iT9=7CErkO(=- zaALnT>!7Km??Fi(E$FwQ?8Hy!a06@oCUZKTvz{yY4lmn+O%#8zASk6<5{-r z%JW^K^$XXerjPYJl+cgWkFwzw54Nb2TYM$ha7J~|KU4L+Gdy&237~l3*z|>56?&7P zVrp84_3p}pZ!DgFdTTi%t=~kH{an|0`CgXMEn}7N+fjfxKGlyZF~G_9D^;Je-a)*L zFGV1GQdbta;EGSbToA(Pd`Xp2oY>Nn=;?TEOVVgYWye*LvuCS&@SK5;C_@`0XsGpt zdZ$1yZ*x)rN6l!Ljh#CW!-X&tEKmk$xE4TZ0Hr`CJWB8}%5*X1=mj@L(by`HWQL$J z-Wn;RMTHWvY60Xmo|<@d?!bg%esvYXpDnN)TVFI{M0Vkic+Eo%***94@7VIWcLNzG z_7yuf8e|^FrY@p~NW@|16jF0+@MTZge5;H{qq=kY>JY-~qgaui(Zst9JYsK3nonqO z8#GgM2DNTQQ02RkMNG&(sWNY0b-n^__W^K86v}ZUTltw1^I=u>eR3B5Dn({jK4}@=1==0@`1HrS5A$YNZ4{g? zynZ&FY=k8CIp(Xt@4M8-$Q@bhgRR!7JCf7-YU4g|gY+Ur=sG$G9Fyu7Ej$go`yS7! zKO5$~IqdY2|H|mNa7@Snmd3yfNXDOo)rJ*7_zZMQrI*tQ8q`#<&i8xp3 zV83f8jdc+~SB9Jqr3&k07WpF!L2Esn>?+bzT%PEpI)u~`-SDWn>p;hN^t5Gwu2qhZ z5S0*$aUb|1yLUWsN@nTcyM+A}#HP5EB>7nE0{snn-PSG=$-xJbsmSR=MOvXVD z78bc36B2-Sb@xSU`MMY8QvAlh(|OpzzqcM@f_mAgWS+$8)L<3UJgT7TeagcPdUNKY zeQf(TRpn!;u5hdbtR&iA&RiEYkHC1qBV#_ceXPLHq}#c~_8L0tDXc&2({cl zTBCQArU;ujlpPmn`eiwImN5L}hJ)y!%~tPu_4~Z-$P0t=HShf1cC@#aY6^OIhS#J& z5`K0}}uLfS;^Rxzs7~Ma?b52GDkX7P6E}`mB@Se9y zvh&nB#s94dk`03iINnyX-wQmZH5A83-7xbzx7(~IRzB-K=jvLis~9s#q&g>mApz%XTNkB* zRWmE5k0(rIiW6Ke4&1V95C}X;!g2RKS9dxw{m1M^6}`uFD86>j6+N3SlA+XG%&h~( ziX6|sHEaMZVqe8?(%3*IyhU#|PIQ`XUCE7umkJgZ`sAkchImu}o5v)hRIIF_`A_0c z4tWSwL7m!Uz502+VU)GR#lRAL9O)0A1Oyd<9Z)`cRcYsttr4~wqdsJ_E4jlG&5AP zjK#ZKPo|J&T`>BU$w|#ov#Q*TngDyF>yZW7@ID!AMC`GZp4&i8*=sOfAyPxwEh=FT zE}PYmLe{~)%!`tCj81hv6_@);qvX3gZoB2LegVAg}P9hvr;bM>-`XWcJGmP|xk zl|(W6-4etJCJc)>zv!}{izhn$8fy+c^-nFvr}q2DO1^zlhmR*=l?WD236uBm*9d$R z;ru6J}Oy&{!sz8}hs4a&hU3tq2oNtJf*1vh(V#B_dPb0)$K#3%0%7QG01 z44DH6H)SzmMLyP+!DF~CJ+(RAt&T)V5*>@)(LsxP|o)8Y-ouGWSPk!mB5Mpy*=rg2Rn3B}7eMlhankRLk z+wpK{{BZwSq4K{nrX=_*#qm>t8>Ib)4N*BrKi2>w+L%mX5ox@ z5yc0uTeJn^AF!*hB_ihG1 zA1OYZIqQ0^MRgK>Gu&pNjHs1i&TyEb9PDceY8sUfT_@_T8bk`=YoTFcAnQchWU#PL zc_N}vL?_FAi?7<2Md&Gw0!|@%sdVLx48wLG{)+o5XKTgEX3V~`5N49+hb^0aAGXQj zon5~R#HaO3Wf&skM^Z@3F`kI{&j)>yxZBEni<&Io4VSVIWsE$*H^LreAU6p z%*NH!jNaz2ULZhF|MvszfORQL5Fj7|Fd!hpzv(3_B_bxTBBrOLW533P=J!;`wO5f+ zc%td~9S0tvx=YnR?V+FF3mfvNb#E;Squ#?-#?O}3=hW}G2K zL{mKSh8)&UdZaR6htg;)YzEi;ns^)n6RfG>A8@C9o=?d4N3P<9({K!}oMq38<4X^2 zc(H^mCvqVITOb_1Hf~;nRVVvdt~(E0;$Xp@-WWpnMzmEv_u!smr!RB|dnGVI(f*dQX#I-kZO{Q@N%h5$?P` zRK_O~t~rJjQ8*ipMc<4ph2vwM`u2x&rvF;(9D3@T!aUe!vKW%Ss4(rvEidsn1gA9= z!mY-{{@Jk>kpr@k(5wuJM4P_|>~~!`2KA;Tv&2S3c5SQYq;A?@)xCk=>YF_O$nWHjHB8ykY=QL?` zBtM(~sp0}Y z#jUPuf)2^Rkb?hKLLH&|NM@(lF>+(Cu|6t+sI15*g6jyp>hxyVQ(cYhprO{3VMPVZ zU@05%=$JeW!l0J`&hnuvk-e+$_%u5Pum!(l79CN}Hy_#ElyUUJmcs}&Ry7Br3)`2G{ zA8_PucD){4&uq>XEvU_3*0^7Q~@^Ysy4twEXd!?cKJ-SuCK087Tyj zFshL1?C}0)#e;Fae=sz-D<)rU64< zfw?EIuD-4Like&@MIw^WR3M4cPIu{-M5>6^e_S^~nnJgFE`PqeJeX1R&&E$jEttC@ zLKp=Y0%E3f7>|aR!W}i}Cj!!9*&w>ppzbhRNvxJ=O${_9JPW38*V`mLu7f@4qt=Bp7@HN z3N+TKw=evKT6KblF*4ztZP*&6p;Q@6hCIu6oNH_d&vcw5qIlbCUkzJTbckcKAWcrn zIcSL2wJIVmVnv^)uHn5=Na^~+R;Fh?HN7V(R4Aj(F}O@TZVLEE3kTcP8j=YayKn}U zEisi=Ciz(7Ypif799{}8S_#pYJ)NFSnld^yK1&ZUf-H7EEnSJ!A~Oo$>s6eZ-!HOF z=tMWX%dz}7(2d=0VMibbnatTN>}`7+R`azaQz5R|E~vFur|NvLYU^N;X{~ZyemkgS zz0TQj5p4o0GO2_sLD5_3R`QqP!xZ4N$tBHSWidpKEhs@d%mpm^j_LN+f_x-~RvhHT ztoZ6vPCMO-L$iq1>CtQhshaS<_)h9!+XQt((A!9>21S(qBy7e+2hZ{(?a?TC1ACEo zn}@{F2#N`Rn0$dEY%VKC9|k4-K|!l&hwCQG#wQU0S0+1E!_}7ATqVhBgipB{Ql)*n zcv}OS_BeT3pyO5x32A@xG`2hGE8qs?d=-yB2$;DinwI7EAry>F%X5V$9Fm?%Qw>7@ z9fjc~s^YdsWVu39P!ldz9K+MyTEmmlL`F-n(vJs^N~^kfY<^fpMX=&vAUj-m;T@bp zaQOqc9z7a!{0DfyhLxmazTy#o9!!Cj=qB?9J4oPdacKZe8gHQ;uPtgY3GZABJgEr9 zn9stYsj#U3nQqoN(Oqh`Y{a1nqaH=@4;?2KVn3CWlpi870UaqlkMk!pG;a(rb}ou3 zQXw`<<3@FOT4=Hq5|$$gnD5h(0b}uJ+0S6$ByA#Btu2U{DxS0ADz*oi?i zt2?v`#pxb{UNwB+VlDBY(S-U$YC7)fciIhBn0+w`kpc7pS;Wjl4VeI5Tm%$T5~5qX zpFV|(2Y1<70Yi*Iqs0)Bq3bQ&8?}e>nf0xOSz&cG`jozPFR8o~^pZB5+-8(S4S|~- zc)U?IZcdkQGJ4y-6Z~#@9&R>Lv4@E(C{nJRQ`8WVX1Vu`6k|Qr?=oj!)cJ|Lrqhq< zC^*-`N(Dty?b>OMJ)u}&buCx;+_;}3o(Wc584`ue(_VL5{7JXTSco||B~l=RNUA$?Cs2Cv}-qtM=)5GffIjnpA(EaKl>qq=o1;mhfp{~$xG_xe8K)P@cC%huw z#H@n*P#(WgnkKn2MjOcr`6P{JNaYx9tOHh)qvke?#5{OcXZNM-`0;p8Y<@Eq`ASESAps(#;5CIB3q4@tYHu;Ts@a0Bc03 z;WR``%Z;4-t9#aOzdNz0Mlv1woXzHwVEROy#JiGR2d=x1p4T=hISfqmT08f%CSNwe z8I~>vfW`C7?&7dXHZ|(ZC8QO09i&yOcJ00vvm$I38U=3o4?ZlLujU3~pS5MdMCb#^2TqI6q!V`LwH(xPMdn zU`xr=X6TAPC%ODkKc!>Xc%T&ZOB@n20&42eqmwnC&k$mR$#xsz`kw8PQNv*w$hvJ- zHHBlp=kl>ivQ`yS=NQ!kO_W^M81&n}VVHk=m-fXR`h86O4xYur(in>i0%xB$cw=LY z9E2_q(dRq=bLssY5vvdUZ`9tHV)A8Kh80;l6xAVv9sk^#fIXj_l|7Y#oW6~9(cCfH z-jM-&R#bnZLcb>KR}Pq%}Q5Hsrd*D_=G4=UZ}YW z_KvcO$B+}p?|rB`jl$36{I(@Ro|xT`V%mH%nW7|KaZPM6Vd|5^-@usquz#E5j9}WR z>VrQeV(h&%jROO5#MOo6a(*R(s__98qNq>?t09Q{3cQpB3mJ;oDhz>LBj8FLrQY+B zKQEW$!Q&;uW()*s5@)qty>qCMQ`D_L>S^b|9GC)C=e-n4nAS~M&KezbFYW8%Y?(n0 zbBHv{RZ+-i7B$!JN4T(hZ&uGF3@(i4cq-u>V(lNSb?fHt#9lH(*b@xFrK}fUmX*3) zyXv4s1wg|>=8p|#eKT4t!C}VOOUs5v-nlO!67iGgokGZ^Q znz%>aj1}K02(9aJ*|c>-VmJ(8C)PWhVYb-R!P=i~|w6k{(`| zm-vF?WVoCkElxvaOC^&r3%Uqr%<{SEavl<>Q>&|=w>y9-BEuTL(TDMs#(?!)!W`oR zw?ZrNh_N*ODj`mEQ~=)`bujG=aQ4nCqV)E>D^S@n&ln zdh*dH`Lr00NC-g8Yoy!yr5LBSPt;U=K*|J%r=n@FzO|AXu!$wuOZ6RwzIywRyPPC4vbhaSzzLH%9`~Y-IR*r1Eiwue0MKYH~v}D~C$u5Ox`6_gP}n zE(H1p!>n{7V*WDE>oU(%lhNsW{slHNO{+qUo?^}Gph-PEZKiFIJ*OeqK&TCAb{Vh%knXDGy3l; zydX!u;02sDss+*nuC;^SNlU)f4dwR89S9-FwJz-QC0YEw(LBp|npoFXG(!fZkA=d- zwj&69^C7vZajYqtfMPeKVdEn&}fISv$GHa*dJLQCw7r#e@@}|I|HT3|mH%Iea z2j$mg6)5aODK}{eu%^1ZUM^7ShPUo75#`{y381detv37`6|%Vz#o%WWNU{~mL~wj! zG7rp7?BFs4{o3%>QyCU|nA{God!Bbh?z@r zmZ?jbXx~O9)!;zrXk38c>m+G0Sq?`#Sb5muH4}PK!f6%q_4l&nU5KR|cM+kdjkc~>kN6eLtxng6KU72t!(QxwnWYS`Ek7r{H~J z(I%tg`9c%KzdusAFij%Z*hP_LHE_BjkizFK= z#hSH7tSEnaMXjD5N{O3HTsuNkvPGCnZHFebc6w8Fhec$rnP)+X7xY?sL3Kxz)E;Lh zD365|m%ZlOAVo2(ieHN=7qWUY>T>T2^y@@5F+K*xT!dL~WGx2GfQq!*ta5{>Pl1X3 zMRZ!e!n9XQoe4>gWP(0jMbeU_j8aN7Dt(K3Ej>_V_*gSQucP&gDd~u;p)NDV{di>M zW2kDneUf8ZvMMq_Ud0T3i!uNbLzB6t&o0KT#Hbfi>dwp~QIXShX6^M+0 zWI@^dXbof_snoYEb%OO(pciWj-J*Q8K4VEYGOQj?ZLXI}ZpX5#CK!g@Q{{Eii5(}H zN}E;8Pop*%hvNiNLtTX$ce@Fuy^`bdEo6fH!M1l4w9|?+nWK^}_AJd0AFV&-mqoK{ z34y##bhiq|Xv(j5`PqCDs^cu~H$la=Yq6Q0!%-i~Ci3hL8K#2o2n3G3$LDm}dCo=R zXGLp>R9&6vboxg>Lymz$F$o=2*Sh>Ch?&uQ-U=-q=tL(yDLW%4w~=?X{fy#c)nx3~nc#ZgG#tLDb7iG* z@c$&LJ9nh2M+bGo3lnlpRt+HS@@sZmer&rUHRHZC(Q|T;JlhvRskpjM=*9X5szeW?dY5aP;$rh);ho_*rrqU0i4!N=+G`dSm_?OKGB?(}y zIi<)>JkO|5B^9lhtuycYW~c9_V9(BFJRGuHtx6ptzM*9ZDEL8^9RnuP!dTvgGh

D?#SLr?I&@;fkHTH9{u2MB5~UqbpOo49dmC1*5flkh8H#c!!gh7l(fIV~;__JichvrAHFRSs*N4J~oMqb-S z_NM72a-!TX03iDGX#OZ{Z;KMj*%y}R_(DaA8$jd~p(D811@jAkM{eWoBjNWrkg*Oy zG{Mzzm!*yKcRhVo_%B)^^3Y~dcx53SL?(*KNLW{*X!vZ7bHVW#l>8p!7UhAvTzgE|R-fD$p9Yy{y^v0vo*r%p>AbCqY$M zS)8=GCOq7A+d&!fVYM6&sJB{-PWv2FD=7`x@$NVAF$5_FnNYbt?Zp$baw)esUa#YI{P?)UzXRq+nSF9 z0|+QKWu&u&10)Nc1mWMXlN>kCiB}iM4L12nO*JWP4oOG&jQsyd*kQd4o5VjoJrM4H zd%A+L)u*TTsLR+FeSzye*6=7PC!s04FhiWRi}$W*rnR-F(v};Wl@$RRP(*Hdxw7^S zlR%NqTZctl-(UXf?c)X^Xhs8DaEOAT)2@VgtDsu0`#tn&lQ)kq0)#+Rd3-*!Wn+&O zvy#fb$spPrvvK&B?PC@c16d`&`yQ91ortqzYfna$7L$X-op^$yBcd6$LAsevm+GLW z__r>awq;7mkaXI>kY*TdL=_uJSa7D2%Oe*s(J}xKnu(UIRyav59d-xg>8Ku1RGP0` zPZKujd%P_!6mNn2T`w4nV&%BU2VRSr7HTc+gUS1mOj%1H&B3+99o@d zU~^AMpfEQ(JF?RI5rBvQjpsJjy#Qy})LdxS4j-}ve&s?)w9{4vD_||xms39*egvk^ zT!_-9;@uZYZ^hkV8tC=_+j{Bd(zK;PQrgo{8WW8JyFY_N5w`(W#N=$snOcAVMtrD0 ztm$5DWVz_hkpFDbE5E(GdGGj0O+(FXB0dE`$yI7BTDMF1riELvd7{X&Jeziyq+9y# zJ7z6g-@)DoxUkRLb@!g^n|RPoF45f+CQ=o?YPld2xdJhI^xiY3+v!v~(NSyCm;A-t zbTzXPBDy}|j|V1#{(b8wdG=S~)@qc~ah@3%g5&rL(Z{S^TgX;>ah|e9Er$0GxA5%C z&d0Yd0;kT&xhs3WDePXk_YZ;yyxh@VJ*ZQ{(K34sk@xS8M|XabtGjXcS>VXjZkf*) zw_^#4neXPl2a-0HFFkrm4<#~rc^g+4c^HhC7+NU|I?07}i;d>7{#vDiL!yov1o|kC zmtlksfhmBfX`FUhVoYO^ganY}!nE*Il7bxUR6UD^QfM=HuxfrXJ-l(rS7ms%2fMimP&%wgIg*LJimq1^bh*wR}ofP>^gQb3uEHEV!VOOmu& zckmbMM!CcbKWAm5L#~hfG(`O17d=Ze%IhxGVX$TzQ~tox>+rI9I<3cWA9}dS55t2Z zww7WMa`4V^v6AZ9v-sjW@y-QhfVJgyIy@JiuJ9Jt9bb(4$wXyigq4Ho(P`xvCg@bZ&vA!U`ex9Y$T3qI1vD(!zMUn2VgOX z{RSMjMf3OPBp(9Rjm?hIGoFv&?sCm#4xVUKosV)F%U+lX_z?!{8Yk?Wx3ueTcXpNy zaN7A(HUd35F-2s(nf$Um-Asrg*#jPR?uB>)dct!S@EQpsFseuVJlPc{$fb|LLm-J3 ze!M-oAG$+x*}Wq-$ikgINf4Y+VjIUJoSL!UPN6^Iv34nedi%LWfGzJr)08QVU^q=L zl&`s6y6r&oG+bW!EPf&swQeG5vh+9ncs7SrHc=o9zF4@uuI1oz`I-qX$Uo-gd+0W#<@Pkss&7`@AQ;m7l8&p)->9vV6OF!zStKM+>!8>x_ zg+kaQp!uz8i`IA<%wnS#jk_iU8JC8i`wN;cITkf01|{o5SE_&jpKu07Z2WR}cYt0M z&fI;<#Zw?`f~s7Pyr|mg@t7qATIK54AjuW1y-41dxBKSc=FTc07jj9b0#|_g2qfti zE#c4WN?R?_>jcwHGTwMVY1bbIjG%aaiJ+g3gZZiV_`3r}2O|?}qpxP4j$?1MTG!5SRa4bA4s(KD16Z)o)zn3@W|+3&Qfc*dVg<-g+(ahisxc|`8tN)fAQjmQ z2PrY*wexCX&MXy2@EX1-#OVtH8CuP>usqFT;I94!bNJFXlI_4kfb=@_%8TMwI_g@X z8j&kP=%7I|4Vpud)jl5+csj^fS7ZvMW=M65Y<4^yrOZ|l#C(Lk>-3$< zsRJHDXaj9~5vhPEY2lM=|D~zTbU&A~Kd^Mq{Oh(p=afdpgmltFGv#TDLMm*E3iGm%FtN1+mliKA`Jjpe{-v0YkNi%I;y^e0 zyAjQVVwa?E-`kQ&xy-!MrE{HR7N5GVe}K%5ye@<#V*|k01kdxkOm?O3@{kn#?`(kP8ANW2VI;kM3a#-OT9|-IvvIhvR*1-G)~s)r#^HhDS&1 z_`1~YsYg#xuQ5pYm;CxC%` z?kEXYfR47WcN=cpw>`|cA?=`>a63jnGHdhV^2mx7;Z=!`imxa{5?ykee#8Z5`D=V6G9S}RN1&Z50!rIEZND7jtoE1J|YQ! zCO3)Ogz{X9E`ZhB$2LlUJp^m|KG)ZxRq6HWbCSvNBTSDPBUXM@bWj}n=6>pd(gRRu z3)Y};twgr-FI!7@hEJ6rV3#`!|@w_6W#fk1%8-2dH-Z1~Tl>1VF1MH;qb1aZ6h;ea-rEzJX+f7`urr;pReZY& zrAujfs#qqpy5II3$3hf*x)iK-5!A7IzquFUBblvE@3R z|9$%h6;GO+jZUcD`L{@~FF*Iq0)*!Ey^f_kgxlO+9TfFfxx(OXsfE@+Sq6bd$MOq9 zw}Q^m-Mx@#8O9Xey7U;s&3llqQ$jc*N)X}kvmh-|GK0DBhh7I^FbmT-i1>UTC1HZ& zLI}yTBbd%6q4yIo1eH_*k$#sXZjI#}*zmWb+5m6p1qi+I3v)0w>eDU#ZY`7IygQj!u zyh#`Ca(p_XRnN|m?k6W@Vq{0&j2IAi@}5*dsH-Sr)$5hoO(n=A`xS%D1b`KaDI_(Q zUw8!DA||a=d#uc&ssTI|vPonGl90uM=tNs_kQn15^~@%gb?r{(cZPx!F|j^Wl;^Yg6 zrzH{);U;Tt0l;zzhsjFtsa!sTo|%_85!*M{mVm`2k?#~H!)Jc>TxR48vmAq z>4&(luz!TKn`&MjJj1mc+4n?%<9mNJ-2HO5jan??ymcDLfL}U@P!sI13|p{>VB{hv z%hx)3H9#gQbqy&W1mlR|ZOjL0qgKM3Q@Lr(MY1JoBEO>YQHD? zx3)WqAMr-|>?JWq51MTCDK<2W9o;$^W$z%ytU<~oS^l`pSgVz&vZ}eGAodAHm^ zru9R=1)=smn3g)Hm_JfX_*!C|pDfGio7RY_zZaHiZ;79?4kN1^cr+FCwZTpd6hHPR z8GET&;@)75G+(0j-{P@9CZN(3{jejQ!%~6d=_)b1%l~NewJCQx2U|@Y-P8lFp0|0x zW;uzpeutLv&1wR!Vx<@G3tv#!>P33RIrA@Z-03E@|#@uYW{!rA7$~t+sG4SghH;;Bq zdg_!XFK0N;e)QXrNLj`c!7q<=J)j?bT>A5)T?r7{tsN!Kq{)|s6a}}Hq%jyHnC)km zcPMEa*43Dp6AYeg4Kdg3+vs9dKE--@PqkuLJ?<1(~?|H99hsAIs&eI1MAT*^= z4sxmB$bAxFj)jnC)6p_evUzzfq=|DLm}e7sn;os35m*yeQsZ|NmKIY zOh}8eHZmS~D!KGsd^ewBB4y2K+rSGMUpB@p_{_E;=2 zt*@)yB@T?QSp-I!`vogLA%lsUgNaIPo>Y{DgAmq3z5Z5!FkziINCCbXS+G1#vtQ(A zBNY~i6KwHqniWC}5(I~Xb17cBDl>3N6}D;8B{G)CC68?E%d-Bp4T9|vZTn6AR~viA zvR#{2Nm6OUvlhwnG#f_?uv4gTJLEtha1KX0hD;mM_Ul8$CcB4 zq*PJr`JP+Z!(OkTO*~imjaW1m+*yGR4Q|3e-9Ps(3{yg&8Pe^H79jsAx6FSYdF z&E_96*1y_?5aee?>Awx>pQ6_P9M+$**1t%_fkOX-^e>U?UqkzAo_`7t{|&tUlq3G# z(EgGk{z?2(+467V?x)`6?}-1>x%>(Iv&Q~!U^(XB1OHiZ|C9G;CGX$7B;3E}{j;w3 zC-2Xi#J_o1pUV2boA5s?6o2ymOx6C)Q~E4<{5RhJo4EZ+{4;LF&}YrKKAjT4{+v5Ri}ohYkTpKoA(Ek?!s^Xe6Y+ z@tou5E7x^+-!<2swg1@9Z?C-k-6d)Q0mC6#*#g&SNiYalWfE)zH64{{lWL0R_n4mYgFqkX1GiR^UW-Fs zP+`}s(>(RN-)#BplOP-9#t+BN3STAj{Zw?tfqbhc7TG2>36umUWCky;b0-dWK3!vK za~%|7HWImstrJ~XAEZ154LaDQXVm5@HCTZvZk96_o%s4bq5AtJ{CXC*@QEr%GynjO z2>>wtmuGSCw6k~d^02Z=l+tSk0b37)@OcC{3B<+4+Zn_ivYRhBI-Eu0w&I4gpC&K! z|A1&6Bxdb;``GnqQ!7aj^%1*P??aC=m~d$5E=ZS(u0aZub@=5a64$7|K3dsMJu$t% ziykzqE5fl$WH7?{SvjN`S}#R68mCK#*v~O>9}zOM1wOX3iQ9WS{7BYJG~fVNt81!a zHC0zm3D?7xoG}i`_2hhZ<9_P)B7CniDVQ||M0r-(`ab!v=~^*YmJYwBk6`<7<>Xgw zinSB{3dQ+nia78)XBtfmoy%2VPK@w;{zC%UwuCNAjkqu0tf@0~2^+&0wC*$Gl{+k? zg(!?QvDBy6|1jxiD~LBWo)uqz>s*18J~0o-4oNtTGoxh;SV#2ng|v#MwCZi~kG>l2 zrgo2+3x!P@4>NvpYU%1TsDxIoaGTt76CzBr=%yklnMw$$k6WP3y47DO;QR>L=hRZU zwFG?kzH6H2xVozOZ~^DfWWBNcJmrKA05G7Eb^GdMsjJ8-XzD4L>Zm!&GBAmG-F`& zn{YNEe8V3vsE$bu5!k2K>9uXR`l2{21&hJC#McZrlYKhxSo3R%QjXCiBfNWE_3b!1 z(#G53-*WpecD;}%rx+O5pk3$JWL~uT!EE#?#EI!`KYkWpt^TpIH!BAnhF*4ds8iB( z8!3!Tco{v!AL}E$zi2`3wutOj?V{_Gc#jv1lx=zePq+Av3I3d`p%Zs5)=?XaB^Cg{ zc=cShcd@qd;c@Ux)^GGcO;+Ry=K*;mkok~b^0;5FosKny4)1}bm_c?7?mpA0f7SDN z3d@30o`%h(jj3t^%P*vU8X9>D2qRcs%D9In?6)3mK(IiD917Us;FXjeAm;3h8O=`^c`;U>4h;{V0 zNjR%FpRrkdxp@S%DM_#{>d8pA^`ynUwX@xAKGe_}0$q~?hxuq*^rx_u#Q9~I7{fKh zA1rCo-S!+97N1vQbPt172;iNwgdrWwKmu$+%r2rNt9h%(VtyJ#1+2N$J?%rEGw-O( z*?2m4M~l30RWe$mrgEOx-FB05TIL4P&-PWBYJGHTy;msg>${gQEb`a~@8-8+{E`N) zVC9OHTH9^>52Ik?AXTZ+4F2u74}BVAG(g6a5`_z!J_<({zaT@xI{$70S64T8rZX>m zm(J?f7m*e0v+dcG#r>^Yx9|QjVQ_OJnWbv}`^t$vt zMig!L6Jh`W6Epw->;Dk_6M>p;8wOLlQy`MSL-6`bn7tdBPw4LGx%7oJV$6U+?W?M0 zC+O6l+3cEl6tp9r9GGsAYOt0wGO;vLc51?CCnv#w4*gt8jdpHoX+2Mgd$F7W+U{aq zKpwCPhj%>JZxcLMlzXPp3_AT_wM&NOm}VDTQ(yQHhM>xcd&;|RvcDHXQzjM8l#;NZ zDhmo`C0?IzyPeBH#V4#e7o%XuvU$Alk3Ob=_fv!O=L`5{Ly6=E(P^vfv;0PxsQ$L%8i)V z>3>0gQ1*Vw*2ZwX_FcV$_+U?(ib^TGQ9h5dDAqf(nz97)`5aQ@*rVYfLz>E$%1!u5 z!k7UjYdnNsr)7ndn9z!idWC*8xKz0JWxWg27Odit;C73@(!!2e($@R=GUT9M*Z|9x z@Z|Jk1ZgO8|vt)Vmel z#JP5)>p_cn7}J@as%g5hvipkgP8(tVoN~#^sxUzSwTq*sa3($YCA~Yp6WQ)2-(36n z$v2wgiM5jLX?Bz9C!=#4$+o_xRcNPP!mrGP)!XS=9TkZ4g6>RuhDSL&vd743R{(FR zUQfyCA9>}s={DAX66}hYS+;XT^2|ISN_yD?9^FwaM>J%gy;0#>$nAM)_j>{vE>lbBj-n_cAn^k4x z2vUG2ooxW^pk;y%RJ}>P;kBBoF6R*0hF>cCD52-AZw#f~ds65cKd(M-KYAz>Eb(fd zWA%woy$;$|Y5_w6wIRE{3NtQrHU|wEC6g3xMD@UO6n{ir9t(~yVQuzK!Ps3biYy#c zq>?9TBpnPK^y&!<8*U6x_&VQ&nQ18B z4`Ss@WpspB(K$&`fk}R&QrXSFLydCX*2V_^VCuVs=&Q(u0?`1D26_w4+!l zvAaiFvOoM8;Mpi5!o4NC$TEYz# z!~N*f!$2nH3Dv<$PHZkMa^J%l2!#GwFP6Pt^gSyLZkU1L!bSq3hxp~(MSvWR1?2QNXD~ct1TB1DCTeUUSc8rQmVq78ZEe;nR1I zt-vLoF-NBWw=_hZcXQ0MZDXyjlUMf#$l~74+PLtBbC|MdG#IAr4~u$6(u%LOla)ob zOY}M1-Q76Ezby;y4 zgXy7aCOH!!4tnoYz|0@P)6zV|@$>6j3=#dhKpgy^I=osnH~^Nbw8}{}3OqjN>O;3|C2(~jW|I_DWF(6^&kOxv{qa4~K4aI?0wT4i4_I<^+)uC!@3e>{bs^O>6zhdoS-YwNq;sDRufy&tz`cq4Xb zH+heGV;5gao2{u@^3#yjuhfQ#oKs3a7JqHZ^jXh9nyx6K+G&`NL`&>Chd@hL)@QgX zoFmbV0<5_#bD_f{179NlDow*gaErL6IH#%2b5r?tQ1M`4xesJ!w(`dUfSAC^UYlB!4t((k?nExf4sD9qOYD)=jvBb*7uA>scJpSK9PYg8 zGfDvGa1H_;?0iywIZj9F!fkD}f?RQ-K4d7#~p0T(M|+@X;pD>mPqi@Rtrrr#G> zK9=P(!`8SfaWOw0Jk=qR!EN$we9sfJz!ODErUM(9sj2;eYWDSL7{XA>yp z1$caq2l@WPb>QGySbNc0El>+bb$U{^#Vm{?t;U=CtoY(ndSJz;aj8G|&bD;{m7jYi zH|k)yT4VBfd00HM_vG<)cIr~;R^!!B*Q(O})TN~Y?c-Pt8N6?Tk6(+g8iB2<9g%R2 z3Z;b6(4{c`-N8cL?60;V^Rv6;XZ?HVPe~Q@850O&Y*0PD~SKtBbRxXi`L(~C{!7H z1@Bi0`wRFp@Uk7r@Qa4(H)P)7TnYTA%=t4dmkXU=z}(=y|AF>T+4F0Nzp`>!>-~l* z5?ndN|5SdLp_iq`Zzv5)d|dG&|6h1qCSG2EzljFdt|b1)a@1DC!u}aYfciP2q-_H# H5&-x=_E4o; diff --git a/.yarn/cache/punycode-npm-2.3.0-df4bdce06b-39f760e09a.zip b/.yarn/cache/punycode-npm-2.3.0-df4bdce06b-39f760e09a.zip deleted file mode 100644 index 0ad5b4fed7b11d7274645182e68967f9ec703afe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12703 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�-;F5 zTttymgB4+7FDsGwP~%hA%si%XMyHGQ5|PS`*&XYV!x+=cwQnP%L!dYZUu|MD){v9|2^b!ZtED@P?OkI>X3?!P#y#zm5&AYT z1BoMthL)q1fTYf!NP%z`F!Ip%UZ~0Ia6ZNve`N)-~h0LVWn8WVMxuM zk>wuuF*Pm@{V>fZ#I7`MpE~}W{{w&PZ36n(*7O^u(mHsrQVvy*+f=j{d6w6R$?V@H zDt(ElYh?e1)87PfD2x$Jah1Rbe6W*J){N`4G`*Jv>R5^MEIqRt=QD#LMY+nS zeWHQA#ouyD-v?b&8h1up{AI3+A?>T1>sLk5UrNIU#)}g<9}fN@O}aNpECJ6=5=2EgPB0~ b3(S95rlW~_wE+MC|LWqqGIL1D|9JZ!t3fS^ diff --git a/.yarn/cache/resolve-from-npm-4.0.0-f758ec21bf-f4ba0b8494.zip b/.yarn/cache/resolve-from-npm-4.0.0-f758ec21bf-f4ba0b8494.zip deleted file mode 100644 index 86f591e3e89398145264dec76f05279a328126ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2901 zcmaKu2UL^E7RLjGUJWQp6h(@mNDo59e3<92 z&fhOVR*S>CVVtpew;*3kpbGMbLnZbO4ZsBAeF>P;?g4o0-+t@>p1-EJm3yjRi46eI zW(NS|_Vx2~MffhGDnh9GZ{H@dp?RC@9L zG9wkTPb-D(5Jh}v&TXu(JG+fHWOc3z1rx$X)jzbTD|22cdNee+HFS*;>4lQ3uwGk9 z2DR$xa%pIS)je%-m(3o>Y<6~7+TT7bRK}lhtlgI@q)!xYV>1{mtn@LuVfy!wPtxIz zjGag4PhDTqFgpsiOs92P7YbX>(Q=R<2sxT#}d3|#eja3^+I+X-q}a z7L18rdm@^-F)U}O^=cGkEEAw^qj5b}BXbpEBR=!&Jy9LoFyANfr1qF&da6~$^thUJ zn7bAg36n9@v>)Q7-_(eCf2jr9UoIdDrxMD1Td7K&Ub^g3m}3taC)avlH&W$RtE~i> z{k3ZeaGhEgJw0p&6MkIM$GodcYiVoP64fqU=t5`gWV0pV{G=U53J->vPf+-ux%$k! z^$pXWPxzWW+tTTDO%3N`b;&8zaX7b!qYCS!X8U)d7tQX5USn-4 zdsd>Q_D!^}7aD^L#5kQpB#)_zJXuvV&mk1XPCO_nv3l_fR3-(T7NB`Us@yo?mtxPI zP!ECE7)7c4;7}D0X|dTFH8PBTaZwq6Pd|t)H_PKbvoDFu8%9Wt!5gF*IKa<(U^mTX zdfrSe_#2kZjh3poYoxH95?y4BZ~2L~r=xd)Ipm=hS3v^HMFi3p7Y{A7;uoo2sBp zp{6w__A=S|cCkkbv?DWTyPt}~B4DAmJcoiT9v)wu7OJ=m>GMm5tX$E(`fUj)t#fuJ z{FdBAm5_9NLbHwNeUtYVuQooM8J2)mr5*k9ke=C=Vo(d03#khQlKCNPawN&gmF1F+ zl#iO;@QiCN-SNwd+`7^)H^YVTYMb$3={GxC;@!>fkm-umXbSm$KIQF$ZX#Ep16tqK z<V_XAz7l03s`von&vAXkiX7b8mYh&7?mfWAV;-)teuL)V(f>HE@(uaHm#s^x4{~b z{BE6+pDrlnU7_nGpZASl#0;jV4PA*#uZ{@H^f;Q0NP0e^J_l3Kq`tHE1$B=^H+>@7 zpNvcJxf;{}O+Gz~{*0hP_$yP=q9{Mh&7UjztymYe3d|6La#m7g+w5|PD07iU#m|CK zccX1pA{5W#eZJ+(&L~-wW+fd@7pFJ>yK+BdoddVBDp#2s0Fd6dasx1~Zdi;m){T1J z5%*eEWNS{o#*b~(P-(l^GR{Dx#gI=dIPbXm0Tk%8T9GAH7~GQ>l9*eHI1@M9fn%r` zF`h2H5YlG*BLM`~a`v)sUm0Ja&)f}nM3ia3i>cL#+P0tv3(?uZJ?O&UJNzzw)^XBK zO#pYe+l9T*qy`6}?9iFH+gFp1NTvG?NQRdk)*N)mb1=+zh!Pb5I&1t~l(ijjnO>`y z+tbg6D2dR|0+@nxZy96GXVg|!XZ#8mcG@<%04Kk=$fJ&ge2IP*Zq1Wv?IM*}Xe>f0 zk`ETHq>&z5Tw{;+gVe&R+@!W&-n{IJyF+|?KsnFkj`_@2&vnvG8B#->7Z+nvMlmUY z7NvRC;f(B&q2+rUn00(4=5K@4F1yGRC8f*?ezkcdywkgQ}VG;uumN;4)nkJ_%* z|7j707?tOCeEX^GC-No*Z8h!CuR9^KVy5BkpEwV}Y9Gw_P+WZTi<;|OH(VX1?_jgp9t48zjiBwyF5)7tr|SxcF)E&4~CPy_Tm zv^P`p^D5S#`?s+66|L|Vtl^Qa!{|*{_gNMcv9ZHBeoS7hZSa>djlMT~IPAx+-$`uO zm_~}M?!R33aM^!#c1d9`neFNnkkI?;{6DAdE^AkFFMa%@Ily9)AOG7fi|p0gd&&Ky s*T}J--rrZ=Ub(#|&p&bmuKncxcMc&DoUDNW02k|d%32YT_xsm>0D5!6fB*mh diff --git a/.yarn/cache/retry-npm-0.12.0-72ac7fb4cc-623bd7d2e5.zip b/.yarn/cache/retry-npm-0.12.0-72ac7fb4cc-623bd7d2e5.zip deleted file mode 100644 index 12e25fcd41cf3e6dc8027fed65fc32adb8ab016e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14371 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 ZAySZmdUmG(0PN?VmoNap71NJz{{u47sFeT! diff --git a/.yarn/cache/reusify-npm-1.0.4-95ac4aec11-c3076ebcc2.zip b/.yarn/cache/reusify-npm-1.0.4-95ac4aec11-c3076ebcc2.zip deleted file mode 100644 index 595aa09ad18ef64e096a9610d2d1f0772d940592..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6227 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 diff --git a/.yarn/cache/safe-buffer-npm-5.2.1-3481c8aa9b-b99c4b41fd.zip b/.yarn/cache/safe-buffer-npm-5.2.1-3481c8aa9b-b99c4b41fd.zip deleted file mode 100644 index c80798aecd8cbe0a5e11fbac7e4bdfee2d232583..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11229 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 diff --git a/.yarn/cache/safer-buffer-npm-2.1.2-8d5c0b705e-cab8f25ae6.zip b/.yarn/cache/safer-buffer-npm-2.1.2-8d5c0b705e-cab8f25ae6.zip deleted file mode 100644 index 1a93be6423525f46f5e6bad755e4f8d158da88d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14275 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 UIuJKK06>JhSaDwpM*98jztE^h2mk;8 diff --git a/.yarn/cache/shebang-command-npm-2.0.0-eb2b01921d-6b52fe8727.zip b/.yarn/cache/shebang-command-npm-2.0.0-eb2b01921d-6b52fe8727.zip deleted file mode 100644 index 727c5471e2c498e6355e8cdfa7de90cc5be36107..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2298 zcmWIWW@Zs#00D<}*EqloD8UP)^YT+t<8$*ezu|aq9ZW)N|d#>5HBWr2LJ^#xl z&ORGw*;_8_IXyw*k#1+;8t}tv8vXe9%Jn|mSLFWZedl*<`{l+i_L%CG@6tCr z_3te__h4n=g;#;{aSu(xny>q^91qOi;J)H^md#6!J*`<4t()aKPs`P$vKh}=&?HrQ zaaq3Lv73wchb%t!luc_&;B2ms3pRee^7>%-ydQnbF7v&sS)CYnPw(0H#w8a+*bKo)Wo3MJ!g9B@R}~FLIOnzN~Lv`?=&r zPquOfkE6U=zpwk*2~{q3a&I{N%4HQLuE_4$x0>7fNYOHfzq*SKRA=V?zsc!VGUphh zX6cSh9XBzF`d7Dt+pqO+d;O+$&DF9D9?PQmG~?FAuM*-*J{0{GV|yL=DwN6gz|X&- z`O4SBR{UL%->9g6EV_1svC!VnKR&Q+w!dxo;ctF%;~#0h)O}&rYL*>BTr=&vXB;<3 zSH1R`qs%Gy(^{rG6Lf;BPh3B+$=0S*r?26^hKj!T3Du4*9xTV_od`Q=CU#R<=cC@~ zkImvM12|R{DIAiX@<6q5Y0Nsah)qj9T5h>-5YtjVW7=e-F(V{ttM81KB<=1!Pdwz6 zbJR9%brGBQ$wzmBX!U{l8ykuaPf`iksJm*q<9#jtZ$UPBA~~N_p52Hk3OP27bAQmn zm7#}Rq#Vx#eLHbDv`@om&D|?+&1|+z=zo~M)Mehp-q3lPovAH)OMjK`5?1YR@C*!6 z$eyWebF@>ulHuU)p7=nGtRG*Lb~t_A_T+t3(mA0cS}%V*{*?4h9Fh%SX*p5j>bhsZ zG~CR{z@SPfEobJXq*mx<7033U%{pu#&~pA-a88DU(UP+BqIvfeuM2cM%FAukS^bMs z^Vs{iliR#*&o;6CeO8B;?_i~Nw7+Gh`&*kGa`{f>>Tf^bPtC2GZS|65=@@6}JK`zH&npCEsr?DQI+)vd1b zYuIF`JX$itbJ^V94}Te3-X3bW6|Yor(`tW=R<~QHSmfU=&B?VMzFO&1zVtX{?N!VR z;{GivF03W}>V@gzMElfDt2@OP?z?QiwdhaS+xcAXJKil9H8@;%>Q_zcb=|p>XHL#X z4Jg)PpD#MVK+*$dd`&_DRgjpRotT~q466LR+`zqlz`&X}dHDvL60N)`MhYqd%tB5p zq@|fo_O3s9@kU>c`jS<@ENnRS+ur`!;%xr<_wM)Sj+-p(@?P-0kY1h>cV9VW!9}sT zX6+5{7QX)RDvJ5uE-&fzmdj4=d@WtF;>5G}*Dd68YA2>Ha4cGL+$Lm_|C?Y*j%UT} zvDu4OxrA@M&9FX+ahBS01L2TPt~WLz-4 zrE$-zFJI>j$U1j2bZci^nU|&a;%T`HC!Y&@HTU?$ zE2rk1h`9S?nor0<-JYrwp~#}48F0OkUsfB*mh diff --git a/.yarn/cache/shebang-regex-npm-3.0.0-899a0cd65e-1a2bcae50d.zip b/.yarn/cache/shebang-regex-npm-3.0.0-899a0cd65e-1a2bcae50d.zip deleted file mode 100644 index 3e891cda95211ff5d5d3d02cb3a8f30305689904..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2557 zcma)72UL?;8VwMNblA{@1tElzU=W32hag1|q&Gn+N+1cL1Of>q3K^wK89Je;ND+Yu zQXNs6G(lw%mokCTgkEJ}WGM>b29agq969^`^U8nD`|f+^zVEx&+Kded0_-%sM?+lS z7T*Ux=In<@V_bdl=pY=1sA~Pgt&)eg5Fk z(bgWChySIS>WxuJ6kEMwr}8$3>RUc~yo=4bF8fW!vW-#Z-~+Qhfkbkug=NPn-stt8qa{SY zq z+LVfCs}sh+$>U`#Q%6;5*(_mir_x@QuF5v$)U{J zum=JFaz`J9^Fm?#h?pz3X2~O`1e;f2Mt6dXZ_yu8sU|({8uF`UVC)(lRM#p_UX9CR(QzMJPK zdKqJL0eTfP!{w(ZhOgt_1BMK+MnqC%e`zdo1ejE$Hk#BIcwIXO7{PY7v9&W%THu|m zCxSKxJboNxc)P$rd?{&+YLhDM)JJc4;oT8Aq|rajtIs)(7@?C$+;_vTkz2BLjnjr^ zr9S}FLuFbAV|p!E`t-$p4aASZHNFg_#jFS5->miO&8R`F^3#nu@1F^;^;t~awx|or z;cr^K!dd~DZ3k7&l}Sukc6W(sMre|)xI}}DD`n=#`Kw)&`uvlXK3+wHY<~cPwJaxY zW+>3>_`wN@Ef#+(HCQnIef>|@wK;96I`z5=*PoJskvvMP3gObDAOE7R zr!J{`>t=@{yA%GJ=R|?Uy#9Z+Yj zkctD(-a()9z2trzOJFajwOiSsk1e}qP6qK61FOpjt<{S0>I{!UQaFSz0{Lam9Sn+~ z3g24hhmb6glJI^F3Qn0&uy(9G3d%){&gX?HWL|jkbGo%J#(qd@?o8B4!|Jr|HqAzB z9(1Sl@+Fo0tF_w67jX&mn1L+H;MMr7#}Pp}SgG4)Nv~+9XEdSenbYPt;ci+?(=y3k zEv-jI(^d`PhMv#DDDb`rXDB)omYrNUHC8>VEU*-;~x@UpOc~T6zLmFO>eaYN}p%; z5zsd7JaZ?S@E3Co#-n^Zg+RT7fv=y|x>tB+lyzTzX)^atPQqEeVpZyWWH!`_Vu9>2&2K|*c=2wTD>fD$y+7hp2kzDL# zM1>=^_nI~fR&wjSTf%UjX{8uq*|zR$*2n4m#(ad!j6SBc%y}%}Gmzn$qCoCS`8Px+ zRI5VgmAOcbjI|jHt1jD*ot*g^-`b-7&U8S&jtbpz_Pw^K4`VJ5gdSABJ)k|$IqdX% zK=;GZM+5z@?;i#|Y-IbOBh1V@;&%JCwhQ@Vao>lOVEaEHy@`kKcv!;s0i%uv{4VH+ j@ebG3KAtYekr(`Lm06pyGj{?2oXk&#S)JXSJAeNHsx0x5 diff --git a/.yarn/cache/signal-exit-npm-3.0.7-bd270458a3-a2f098f247.zip b/.yarn/cache/signal-exit-npm-3.0.7-bd270458a3-a2f098f247.zip deleted file mode 100644 index 98720bd8c76e5c23a2b3ebd1d5a561c3255048e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4883 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ɢ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�iLVi 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 diff --git a/.yarn/cache/socks-proxy-agent-npm-7.0.0-7aacf32ea0-7205543701.zip b/.yarn/cache/socks-proxy-agent-npm-7.0.0-7aacf32ea0-7205543701.zip deleted file mode 100644 index 4be1d89cd9223d312cf6eef2339238d683511f0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8631 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�DDeRRcM7m7u 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

%dctjx>eA!hP7E$5kKP!#1Ih9p$w#Q4tk8JiWI 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

nbe%+K z&IP`@k;jNQxH?WWF8);Dr(3o+vJJK$$GuC(<|S)jlRtTMuIQ3uZy1vp?=;vCxQ9gC zq=kcS$%U4E(ZW4GGHa(TWG*9NakmMVUgiNvJk4CF?Tr{eO7>gChGxvKvNb=|PWVRW zk?*-{DSWDYPFLDYQ3ejtCt=z1^qk)!kI?Z=*tg7qI;>Z6xko)G`exsVRYwc~{FWh~ zTl1p51bVaLC2BFgd5vph;hmG+xxHJwzfK1t&X;O$S}`MKj`x=~>Y#g^qgWt^Z-tB< zUz^*t=xyFc=Pwm5t}3n_^g!r`V?*v!`6+MnN9Um(x1i?V&JXufjM*af=5a5kzQJ46 z+ohgv^rdLz0&N(X(_t(9j`AAwg9Ym7gX^n2|2s&!@2c}thwry{Pj9h*vJW5~;FvNv zMxfD}{CgvXI{uaP`9$QO&Lhq1E_YbS<}w$Lv%|}~VzvZ#Sl)~gVVq0Lw*dSQ<8be6 zZ2kr5$qme{pt`P%JEZ6mXppcdPq2<|EnqBuc?P9lit>(_R=vEegT9X;;nHMuEdau0 zrv7S=Qg2ik%_hIK@y;pl+oZwz<6-B*sv}>zzXqPtNblb_(hmXY{^fmL`z5n~S9r|T z&TFS9m-X7Xdetd+uMTUqf>XpN3 z0r*+->T(CM3_n$}w_ZG$Cvx2Ee7%L88^}254z{Z9hjQ=D_9o8a3EIGGgwzmlg-%}EnZG`|zT>pN9dSPo+rze#<99I9=UL*K+wfAdvB|QiNmFEJHSWp2VMkSG^U0Xs zOs9rAj!`?qkY^cVPk-aiTQf1X{!uKgdhz}_MmfT3^xa_8!Fg0ZA&yCsc$*W`R|Gt4 z=H68zR^qNxF9vok4JE69?ot{!M-6AuwK`w=k8FZGrwoc4)A-{oG0CP zkA{x)*i!kijg-KQlGqZHcA9D*?#kLG*Xd#)Yai&Ec*0Z%%m-UBT&Lgei9k$dl8@Yj~Q{$;;dPdOag&7jZrXtxVcUz4wYomjlZ#^Jyuu3-q4H$Jg2KUg+A>8b8*sArXyZ z-KOOsIu83D6Z0WXzzs@<2q!-Q`hHPJ8-8_u&1EZ!D&19#p=hwf>X3uwPeOBXrP z=R?*yRC2LZ7mLpc$d5~}OfO>yBjb0@ka+QH;vDyY|#qHpjR6gqU?kUyiJIk$;J4ZYrLv_tkYvtPAew9r( zhjQt|qyu-E89QY7J0(Uh`L+r3rEJB%l~rwqO!9$pSFyf>#_k3E(Wqa1_x$)C*|w}} zNg1@Q^){ylfwqs;%$RJMA7<4j_T@}s4M}g^YRU7f(b#LlCg<%l^t~UE|I9HN{G>3% zc+0+LUU%NQxi0O)-#OkSyFWZzXB?zAr25@D;hV^H6Y|L$Q$`VX547(I-lFo#b*;%8 zw3B4*x_%<(=u!CCFt2@taw63d#9Dr^=hBvq7@t7LGwQOQ)#Mm-eBercuH!UU^Wq_{eX3$%T&!|@sBo}i3d zzH@71*!pkXl66+fYPJp1;(aDAq9ePJ-afl_@_`~Ug3%xQaSUv;daMj%<7JsSTeYYy z>5Rt_JMQPkvaJy(XpLRyL^`JpXsR$|pQ>jr?31w9@L95!{C>QwyK+5PCb#ew`j2t? z;S>2$k^RS78?pFiBIYv^=bQx@FO9f{Mh*$$LBf5~txNqKcvGFQ>v4`_%rT{$oFT=` zV;gNpQ}afhrexGv7JeA^^{UzoY@c`+t*J^mA>!N`xQA`hV=z7q`1X+N1`}SXsq=ek zHqiJn?_)PFF>eRg0yBwYYWir;3|a$>Lx;bUJfJaE+q;NQSu^KDb8fPKb94=Bl`pfd z*Kl+_(D5EFD%rWqr(!Tkd~|F27%h6TYBQL9gRW}FhS(S-bWY-NQLI{gcAwtdNzM0G z;G!@-xLN~>lQioec`t--!v9GGQyiP{*J|i(# z?!2rRcCFXznks#JJgWWO>V7@(qj_hHk@$Tp#xJs7(YV9G%07)c2zH#5Z@oy?aO7zJ zyhIMAjOVa)8*iUZJao#5l@#;zVgn%_DdthyV~EraHu_t|FF@Xc`=K{>&OuE6GGoD3 zF-95gwpBa3*xZ6rz7Bz2cD(7(T>^b>JnS+t;U*k!k&+lSz zXxZad){^tY9*DXj{x)Vj^SNzvQ+8^ZBX8MOeY{NJzUgoIait zxsi|f6b@UF@dIV;jFZ)PW7iHo;h9+%YkgbiZ-ePXvGP8dfU%AYnFYp*zHT^ANnebw zL9V6B)NM{cDW!DP>$?MJazR>`Vyd-haY#d|_JZv*7xVvLlJ zyobIh#zC^~H9T_<0onvbo*mX%iq`GZc~yRVIFWO6`WTL)a$JP=re}{cN6sO;b>w$r zUr+op=)uC2#msncp>t6zg4l1^yWH~f>T;|w@I-u6A=93?IVRpQi8|6eFQ=BJC$3%9 z3zzqT6TcpV(V@;y6kphzzmjR7zmaM*3A`Oga4axf-8B>72NAkH5@TBA-m9@X`4r^SHR8Ba!ae}H{r&{+62h}U ze9Mf&-o`itl+WOMMa)r4DlCkXBH9Zg>!r`$VZV{i!M$h8^}-GxpzRgw1k>3&3hA6W z`X#oRo-KXyzGZ(W+Ad#d{Remy#oL4Iwbb_n#$w(@Xx)p0l=0BKbH>m%C2I6?z2s4m z>R3p=P{`2uCuUBvu!9ASbV}O)ZV`h8=)R)pD>Xw~N5|2#L|lQ*wopF4Vta%f{}Vbo z@wXEP1Dr9J0{=bbwcC)rLf;D|pKg)~^;yYb{Qh(A?kC0&$<=hvzdGB!PlJO8-##KQ zuEgTO`11@+yf9-9%C~#A)OSn$G3VhA9+{Q-k=Vmh>%5lqjF`$;o5;Zu_)1$Z*<(##(KBKyENrM{zh9BqK4v{ouGK?#0H5vW z;_MhQPF2=wCc7f`dn97pNlzh+ThQ;USWLpkD&5;y{AT|0n^jnZp-~eE1Z-#%oh}fkTdgAiIo(8KC*9 z%v0w2+Zr1%kaakL7K#8q!!6{ky-FMQ2=AC@)YypW!>XrY#Th7l{OI62 zZClou!cWH>94Pz?=lt0iY8KwKU!I7=%pzIc#B0JBm*IZW%t5~{3p-oJ#I5E1a%*PM zzJsof_2djXM;^c^-%r@A_c>Oj9~VFJG!_@k3;9PW#ve+UyIS7y`%N=KSG090K?8fL zwsIVfjI+-IyEfNwXV(?PTgCW;MeE%ykjd_1<>}22lz7m63)xXkt|2JQQ zD{NvjOS?$U(hXP1??xU1;`>DEm$vf*!;X?$41Dvn@q@q47HEyx!N<6+!rGyIC({|A zj)yoMU%{W$I$JT5woLoVV?X$2`U~s!ewon1gq8akjeqvb&}OZg2;CYnHwsUsIx2`7 zOKz-(@I%V}`k#EclWxtJvOkv@>zzdLxn1lk6NlcPzwE2=Q!sg;`)xO;ImVVRc!G=_ zT#YG7HbongC8Be%Phs_%>F-IsNya_*JDEP$gjpf?n|Uy?`w?5i2frW3-z++DeGr;n zB6d~d4qLm=C?02YoTC0S=epSIQSrq(S-9=qH8QaA`R+D(r>rML`)171s4o$Hrp5?! zc(AbTSL!~Z)~v1tFLQRR80=e_OD1(VjF;{j7!XYt|3k>8Ey58x9A0zm$UVu{qt2wA z{#u(aG55#UMy^~txj(#w{m?Pe@wIk6xp{Gz{ycw= zjn$3Q_Vj7QU%c`1Hdwp27{l#g`t}`OWnfb65q5@~<93Zcgr$jna^6$?<0urEB2U(K zij`G0Cgi2Wr@U_=o($TXcBOuxaP#1ug~|s|b%f&ZBg=2hF>u|hV_D9Mg`TX20 zN5P&P+3V-)H=oJw+dN;`9R@f*=)=IDgKvhSjT~^jbukL#C8v>{KE!yU5wbN6wAEa!Xy%+=8shWg4fx7=btluTk1oE0L+CIpK zcnbV+kLwN-rd$#EPQI2aU80S;J;EBrZwNoknTvt3DR9M(ANqx1>K?I!TE|(8Wf>KA zi{sXA=LRu_K;9fREBlkiQS!~jQ8jf@Y0o1$j<^T4+Ok>A4caN-RmX%|;-RZO#K{h? zF|IVT-{rlVw68Mz@ZY<8!cPr!t!YE|K%NWd0b@%kwq>96Ec)(Z;M$)F<0^^=0_%G| z_KbBBtsmmliXTOD*Xz5{`_9N;B)dxO>U4rwTvfy#$pjrcj>PpD^nf?wx!5Cm&7VBH zqq8ReE#_RnTHG}^{^xq=yMLRMt>O(1-WoKa8>R;I7y?vfg+a zIwy>qZQe`x?-a+5p9a^vloyu<8rx$mkd*2FXP!?nm|uN2VlBqGsvk|bE$Fki;tcLU zjzbI=Reu@Vw}<q^@=_l@9=KIlF9%|luL1%fWeCt=4{3wR@&^Lw8 zMSV2FQsg&k4IVlqDXoBK%^53VnAo z+lvGAE0Qj)@>jhwr)6)IbuavN9CInRmb z@!QW=`Z`wHgtae2`N)?hR*->*C;bN)pQpwr;(Sh`I+bHTUR86^iH8<+#`Zv`cJ~S! z9NF%$-jCBJ=dY_B#l(8Dj;3`-3Yu~4qtEsieSIBGe+^AHC)nCIBe&C-gRG$$TCtLA z)|#~IKl*(|(K+tfZN94Z<0_vT-EnBEj>~gDsovENYuQ?*mfJtCq&m53u%D@@~hIE{pV%`?;qKVXr zQRi}NWSt$~%~5{GT7`s5PqCa?eD9IuI@D_@*P$^1*%E86_S>SS4}5pgxw^FQHf4SK z_6YSFvtA9?8v6QLVR^&_$Nc8Iu8@1tf>5st|R8ihag`gp4;^Z z>!JB#aTJcwTdWPv*eFk73mwQYiaM>Trjw}?TJoQ;h5G7kS+QyCmyp={_BTl@}i3uhfb6%z8$-YhDAcNrd)Tp?|hQcJmJ0EGWhG&U%l6HQmYePrtU}2oLrJv(IaqTgi&sghS zpf!l@@3pWgqu&q4j{2A43vPWar04u`=^k{u`RVSZqJMtR+Rsz7W`^2F#AeTFo`E^? zoeafshghEn^KgKl5k?~JkLaJ)2z>&2?@O|d6z|t4khX8CBPVrY#F#`M@wHpOim`%a z?FQ0^G2WGIh(nC+eb^K8NZGYgtU2b<_D=6H21dVibr`8PfOP_{>odgDu<8v(YXcTr z=Q%N^ob*W})&{N>*CuGCQ(V7M(cv3iKk}-ma^8SP106hI?GlS#BrTb>*W&B0nKjpd z_jzirsk1#g2R=6Y&Z1S=_XeC>tiRVyvn+L9Il%Q$u@C2!!+o2^1TC|y_>+l~pleT! zd*{ms_qiUc;uUX1U6x4OpHctqK;i-8eDPb$YgO|N?@iSQ*+|6S(Pr)M%d8y;G=5pl z9bT3na>Sd~?ocP_sss%;Y z>L)R%cdxmwC1KyQtpNBA<5wFtd%T-v>{8YAom;gY5u4PmJBoM&aQB{+k|3wNEi9=H z+#|@+_pNj%ArJ!{ZLMwhOh^p zN~1||ew?3OJ)VxP9~;BVYHv|a-7T8Seb6C-WIo*wuInY_GyBcVo7DMZEoeU$-%y>` z-IBr#Gvhg)k{_Rgb8XotWL-D=eGAiH=1AKZ&H~G6SMImvkAJlAyJc+Gh;hwK8MDmt zor58G++`q;pK2vKc;}=HRS{FN5Xx+;A_O8A5#@arKKh1WnbMogq zenpjggU_Tqfc}owG1h^_yh_TidF)&rQVnOJ7s1@H4m#{h8nGO)UfP}$2SD|g48Jz{ zP*T?e<_mDA{{P#%lD5Q>ZTo}npa7*Z8N7j_AgEY$hh`>_3CKan1V#AuFLo0VJDLNS zRk!Z_-m5`=nW=D^=ytdETE7E7|Ddhspu0soT_Aqt@&4;aBhBa&wQHc`Jr`ntj9&`9 z!*-l>Eemy2F$WL6)!gGemH9R8r^ePg#_()g%kmn;K}Yj$dB%cV0AE|?*fOpm`CR;b z1%IXqIS_5nUn3Y{?|F6{-|OcuQf~b2&4!-`w^w80|8|uqj{E_FD)}b<|8N2KP`uQ)7zuP}$l< z|6A)Q_Bxf@w-a1}znfOZCK{IU)dVHb*@!W?91SDeE=iuXL_Yee;u?&|pgX!w0fGYR9DlX~aO zsX@A`oPV;K0Q&maCuw}APrk$7%!N$(Y~ZpxV@{+FEB0Qn_U|k1S;uBhBU&ax148oD zp{+sfL1pI`#F5Fo^%mbG?DH`$d*@m!eXSqyYay5Y+d!_}n2u0&72z`!ngB~cw7-1J z@AIka=eIxl4sV@{5ehiGb!>N>C)(b^^ZIjlqGp4b zj>!^w$4+36WnRc0=;apL|jx?U#g)NVgv+3hFP@hswYB<=?DWJ1e}br~sN zID8izqYiiUlZ;a-H>cN<9@`_h@OZ8L&*5+WGgyLO>HjuIevv&EDeU~S$U6=Ju58I$?vQlpk{c&A$c49ftH+tkXa-_~nJxNY4QZ>fSxH{HL zXnp-e*5ry316h6697@O&$9B%}jSx;bg2|JdO3EjlpeFH{bGxj~vvakDztX;y>&%?oVWC$j+`~oIz68=u^wA*PG_H9m&n`FUU+et84KPwaXq337vH}6%sM)+N7(I^ ztlfP5rL~Ih=wb08ujZb)j49PPr6v5o;cBYIxwzU!%MEn{4R^W2)2@Arf$5=Rj;=oB zRu>{yZ?M(cXJ%X^e&tRq#=iYR<3q8ukWvZN{!}!`bhriBl+*>Bl*AGYf!7m=dkgk zGgkB196Ng`%F85k1DV&0wLb~9dAi!&g z7~b^osPh}}s*RkBZ%q&4tld0gy{xqK>b?TsVQL4`j`{d*5o?G!WR7d?f6|;!S4VOe zhR5f=y{6=-;g{*oj1`J8nj?H$JMa^Kqg(`5#yQJrdvfd-H{ zd*jbA=Q?aT!vFu5#CielJL@@&4ZV-(?c9qv*NO2=O*o>32lJdUS5!kzVw~r{)joAE zoBMF;koM2-&;#M=6lL{UtG(4c*%KYjO=R{1`FV$Pcz6DPYd?Or7Ri`%N8jKVY{#$Z zK=K)%#jO_T3YyPn>TgTE?oeC%W;1<;KD7u&NbM=oZo|)Pe#Us=?D^<$pqXp*3aO(h z;^l8$4T+50SJqg_>#|lGKGXAD^LVd-pV^#w8Cu~#0^1wvHBSF%$F8I7ZyIU@h5d&a z@8xmD3BF-%-+Z36vpM5V#Fc-7LoUK|*J~|ey^!Z{C782^FY2=yc(U#v0ljFm&p zjvUp5fUi5MhuO%f^EK!BoiA`kjBL$5`+bPFC$`RJL*(p`XU*8F*PYWN8}g!dG{@dC zZuWn(-$&?Q?;p9(U+cd?&q1v3($i6M$Hdp`4mcn~ZpW8ZhNhK% zzK`hH@Wkg_=wEs^=7gW1@j2>j{xQMWPH^T%IZshH1#-->^&iu)Lrq?tPpHSVPfz%4 zpLs@~`#1l0Zz1OX1d{#WPs>u?#j?_6NYL@Z)#r3gvx(@%sI!bBtHT@&T z-)!Q>NMG#99#+yKIQki~twpX`e0`7of!IOC_Wf43-fVUo54GFjADw)w(xvZAALb<$ zW7ghHPOS%Zro8ksen9^yX%d$f6VPF;rVDt!M)32-YSJtIME~#RYW`5Jskr58dq2-j zJL)rVUOvA*Dqn7Wc<76~v7;-I;jt9KPIQB0#^PvtMYQJ;&`%lHJj>t@=xg;sC3ds1@d4|{7l&AasxPa6{qx!k4L<01#_RnL$2Owm2-!OZexRbQ;Dh7 zIqTsFKZ?w{Fz=a}joy5EAF#}yR#$2>D zZ_L!`6K-;EFzAv2?jF`A=ngCYVTD|GtjRjMm_UAWq5KFn7EP{=Rcszt*LuV2*3`MY zqF5{ie-e26_FCsc?a5d8KlC{Qu6x3BJm{IcmZ_6--u?>Cf`RfqjGj}Q^W>IuXFlu^ z9+tUsQr6muTw|tUUgf8#bAo-fH)X@N!(M(jp*+7jw->+R?v@~bp-qZujxsQi3_U=Kh@*^^)s3RqLk_Jn4o~gLL%g^_) zn6%Ye>b8L2DEIM4l9T*K>bg#!+a%Dp>f9#Rux69wy6JHG%&$9uF(#gU(&wRPKp)f8 znI-|=?BgBwjl)A^`s5$gxaL7i+|&D-5H8#DCDB?dKo0}tH@8 zXY3Q!e2!`kE(eG|)N_G6b8l3`sw4IgG>SzXUSiMopl<~IQ^2XFaZH2m$NL1ezh>%O zn?fEz>VwscZlR+O*0tJT#)qZY0meqwV1XwJaNMYkwr9Re;)>$hv)>z!ytz<^{9Rwy zTwjgZWBYQN5GK-S+d*&bz~!(q`i$zj@6QD@zHiZM&iR^PPiRjs1x794qtaT>mYc!V zC)E6~D)vBs18kG!g6Wcu5!g29rR+QN8GpY0r=M@8xdUMgsLuH{xUaki*Hk43n9<09 zJn3$4VWaJUW^YOFv%9P71kzO&!L zHE!xV1T8%BuiCC|WxHA_LcBOAY)5L%E&9N}h*+3~?0ux`K;GBook46Oaf|V~I(t3I zI=FgQ&LeQmn79w+z2~kT0%=tzLQ4btU;~~tdG_~IOg^mSd<{o4p78#)n@fn-93R^D z|JXC+S>{mhlHC~Xn>xR$gSS{sek|;G*XRnu9RG=PB+4gc`vCPGH{4R<`6q?SLGKHm zzqQ8lz65yAn#-5n8w1KTcrDme4baUN3}*V-+5D8yLM3LpjA8o z^>X0%U|mG5w<&5?taW+?eQW7A>J>d?@%v?ABY3PKA1T)UM)0hEHJ^EcJt@W*#t-mY zQ4EtfvL9IUtyVTeStFEn zlOy&I_6us?M$eOt)T>Q}R_&K8K3dz$gnl8fIql~*W-#{mH;-%d8_LuDJ^PoQrYyv@ zP~YD_W4{-!Y26cL@w;8b3?j$72|i*9QZw}FfKec zPLCL#IgCSjR=%sYU3$M^Z#w&k#^zXFfs1G4#jkAC-Y)_N0bmzNo0sRC{YBc7%rz$S zdZFz#ewMVE`rJ|X%^8jq{8LZWnE+e`78hxBC*c_;>CnTTQ(sSr4|)LIBH&@@rNG_9 zy3*>I3+kLRdchwOE0W`wWX-%WYv2}9aS-r-sC7P}GYjUckfbA{Rmkt(%aP5l-om;+ zsB8S7-qpPNTv2NX5D(~G`aU5}PvmqVpAPH<<3&Y&cF;EW&WhQzO$cnzw_YjFdYzk5 zq4d-0EHXyumU$}L&c5X9P`|tM&p#XgG}}&}hT*ROZWf~jVQi1V>j;k0G{UdS&vhbR zQn6$@hBKRdD!zY$bL_>Gv@Wa3VVsw71fH`SsW;5MEg4*`X51t3MmXMd)?HUL*A{RB zdVLW`H~`162PDTzB=-A<*Y;dq+t0<#wq7mlg3haeFD=*n!P-RIry^}P+CAfY!|%}U z7#~{upw`zjy`K?(+xjueenh!JjLt?oZo7e}q87j35&!cO8un3}fBp4)S^8|*M zm+#Wk8kaFs$HomdrnXu}%$cLsbSlq=So~)+?2p8nwD!p_1^+6{RkR~(e12Vn+!|ow zAFLhPQqBo_yGwiWQz|;nKTMSEG4CT{U5E!kyJCES*T6kCx|<-T!}EgDUL1*foHOYMam%*#@3woO` z0q(h++wyw$*SgsU_V>loUztQ)GKE|r_ezuuhaC7^ zfD=&h&bzWrzp1r(Kj;r<-9lsk+`rDDhB)|rkV8{@2mCE{KNZj9SIVB{c)q7i%JBx8 z6zV*hS|1hmR)U;_Bfx1He^vQ9`^`_yr8BCgKT#6{v^RQ{HLo}5?>R_Y*iI>T3OtP? z%73V5P~)4wPGH`l?*#QVuwMx9QpH#AtYEF1yQK3FLUB19aEps0XS&Y`iA%b^8@7T)FC!m zs_!2dm&K#fKYHi$i_j!y(xK;o$PHWOrzVse? zE9$vgc{W$;4RU=OvNLLZ@cgKK|F6eGclTJ$A1D^NL{3xXyKg7JH43=|d`9K>6!`Du zEH~GSG2`8A%IAxUL9PUrQ2XwHGfbxrUf=r0UuZ9; zz_qsjmbiSFT%RGFV(3?Y>2RIZu6IFY?rXEu5nL4%rCiS z2Xk9|8NvCZY*W^JiaCKAVss33u4%yjn2m|)-bd%93i-HM^t!+qcE)vsx(lNGI?e7?x3$0pDSFW z?tX`S9NucY!F zXb$q=6Es)o`;}drqy7*1hrLt3y9MsgQeN#TT|b}ee7c|0#WUa33hGpM#5&2<3Th7U zZfY)!O(P!(;|x8QYqehAd7O7DzQX;8>aCL^yAZDffF4(~V@|EizKF!0R zH84pFi{c|?k8EZcQvm*MDNxW@8;z8P2En^Szvv> zwy1xB@bE9s)e_d0!A6g(X#w#GHdm*9cE$dU+S^>qQ~r2?#^+-r?_u&Aci4Xj+^bxt zN)D8_(zR)u8{%=h@}{ z&@+VT^*S0{)C~ux zURRWJRdZ0@#W66$;dm(f!T-c*~@*98j&0II3 z$1&7~fjmz8>Zit{$vy_TUY_C4d~v!@>S8h*muG4WAXmE}j>)om=8ng?hx)tpdw*SF zEx4jJCcEgjsd0mSr)=fNl4BDZtMhI12ji{3eDb>=z%l&T7JCG8O|N;MQ-b_6=B2}Y z^<3EId0wBP6i>RJ%Z}B5B~H49b!}=m?{xNt^_p)5d!O%K4DI`14xSD0{eA3J)12aH zBMH}*LhNx6zO~KmzDhhU%)i5B%xgwpuaX;GSbyQXxxyL{T*ubz&7A+WIlys0Sq}=E zEuQzs@_)%c`M*Dv|9eH7Cj0k{mJ)Kpac}f9tgj82^T>7a=dYIA@+-!CfGtH%{|fXTwB9EdkK6G@s|fk?LFHqt;*arYd4)W< z%)x-X+R9Fh)%#6Rua&ssa8IdunWIk){t$5iaefN>CTEA8+^VuU~Bb z)js0@cz~A5C&V~Kb_q?7FjsFY% zuB=C5{qefj@y`#zE#c{I0pEP%eNafbpH1?BM!A%L2RkeGG^0Ks&M^txh{uHz$1%|J z1>X(1Ov3uUK4Xq>kU}3I@<34!WCSBnm?_)1J=AVXJBoEH8|A~w+zreTa7q(KM)!Sl zoza;~KL_GsX70PJ>qX~HZEDWQrJ7sl4GMAh*q@pB^HK#K-C~Zg;d)$4>imo8hvIq% zyqM5I?u&t-;6M5rk7XnxkNBhSSQKoJ-chH)OR;S!pC_1 z!4})%&PfsHq^s--*op*t;3}@hO}0ib+U4)q=bSKqMIO1aBrlj+Q*LkQkT510yzjfn z_({xw>A7}oF5>AYGs07 z+$QGHlERQU%yi!s=cLnvz`N~r-+=ZZhcTWh^2atVZkDhd1H6}d4yiRk*VVWd@=pot zr*o(3Z{YlG{ZKvyVqEAm4JU^S*h=&TD)mY$mkjzjeTraK@s0 zSAU0R!nmV4RQqJIrL&r1OLhMj$d{WsV*&6h=wm29Zl-*~mWoeiIXt_2S6)7iYw@uD za>zl0937E$r}jATC^c8zMRM0lX5ZC2^gFldQ>*Rg$HHsceBIT~=gn2~xt!cWENr!6 zM2%q;Us#+WP{$VIbzjcb5?1#@zZ1@< z4y{kkIsG*@Plhu^+0?L?9nQr(^Jdd~kMrB`XF1jv-)|?-uMYJZ(tk`AasA$ax4W-# zsFb6@JSp+MaSl@ObHjcg*IvVS>6h!SmJ#aRM0lCnn1{o4(TZ{DBG1g$&6)e!rR^XN zxiIfQ_z1ACkgI+b>j--dMti{c>DVOAAx;I}=T&R^fR0vEYMB`Ax(6qZPk8bP;@n#A z_;1o3@xEV-jEln+fxe48lO4So>02zJRyMPJ?{418a1eNV82u&xzBS~>LO*UD)e?ep zwAWf#TnqRh$;%M?B#iUY?-fIM9x%ryt=h<)a-f{!P{EfL`#pxTT&_e(F_lc6ygtW`xZVC>xkzB4s$_V?&# zU_RoWG};?COQbdP|%=Ono!h({=VdYac~u5xZ;BV#M^^#LgAqg@yecySDn?aZZyI*7y1I z&pw!AVd8;G_p1w;vCE)-Dm7&%fFsKANw8slWmV8yi7-J*NJie@+Zy;T<_uY z;JNyw?AjJ<{E>b9z&Unxo%}F~o-O7+&O01}ch|m-$J-^wU;f+R+#w#%j1$0T!Cd!5 zYQ@{WEBAV~HtNS!=6q87yeQ9quiua~$Jr;PUbWT&{dw&FPq>bQc75;SKqMwTekP*^ z;StWFkarYgHO-5*dhQK9zt-bOJIfZ>ny734qjn+FR+>HFKeO@2_1Ob?tWWOsyN|E6 z^7z%O^}gYHWnQ#jJlod(9{KFqn{}?9y07;xf6+PN%%y94Ab)7*&h{p>HHYxR>E{KX zjWL7p&&{dn*k+cg2V(UC0fUBTudf}< z_o_l(AeMiy`WL?TwWGrr*Fi8^)5zg>OalR8BF;?*F+Sy-gM6Qpd(PziYoX4Y)xqYu zm~{$FbiR^$7Tk%x@gErQ};U^ZmWeoE=dPZKv+hHaY18^4~Mx=lbo8 zxs1F+>R;z~X?w>`EhWn)`uW`1C%6ZX|M?sT;qgDFrd|0=oWcI;=e`s0uEx)0qtzSm zmo*{Jfq5gS7i}<4>G-L)>yGw2i6ct$-qU)^=!vI#;r{wsaAuo&C~>0s^-trk&j7DU zd}Qex^u&+we#EKoVA7qnK=o7P=3wkA^majRig9beCuTGhuqTvzP@u0`bDE5^YcNvl z7WbK#KX#udDS`bnwK}t3$*;KP{+acd`vmUIm@Q;KG1u`nZ-DP;;d{86O+0U&CIZ)F z=`5i83!W5>E5Gk#a{B1{;mF5L^eNYj{dt(v=J#X0@^S4|*O_a`r zGq2w7=U<8AgugT1Urt+vQV#NgfLYYzqwnvHx#Zbdk0IuK{d0R%`G#}kt5}l1$bA~9 zX<@XgX+1~#R?K|f-kNt(d-&}c`*@o1dsj`p@J-_v)c2s*7;93@87BK*oH2}y^9AQc znd2j$TD=*r!O?pmh8*6{`tFEXbFc66)~kJ-02c1l{xzQq*Dcv_-LtCp2=8aTZ#HYW z_8lxS*;u}w>FwV>c938GUs?<0p`DBF=`r+ZR$hvJM}ymW zm|x#P-vQ)F@An4xqwl}Ay4sh4t{(P`h1zy~6<7Y$_%Diq02@Q=7J7BZ1$Fk{U8m6F z!hL?Qw%-KKVhz6&xSBVqRWvD7Hkz|d^v%IFu&)@#iF-~+3z2M~YlCs`R&+1aZon}y z;vHB|!aS$o-{Tsx#8i2hu|WU(-D0*r)W0joaMiQcQsXaL`vLWLz&*r!o@b+RjP@SJ z*~3N9XJ&9uv)?$+jC+9RKGcJNTnykGEl0iF2SOiy0X+li|CjJ@S1Z11_E~t1bh{RM z6s&2RwSPUn2KE``yZPsXIU6E9476{F3!=Uc^Av;b@J;&_YVUn9^W9l_c(0J>-OoKU zhq%Olo%)W|burj8T3e@lXTyi4HKH%dW7m_{hbJRSkPi;+y@rc|bi05*EwJT=zaL>BxzFa##3@w)5;sH|! z0~mS!OP@=}U2_He4CqRxD?=?)uf!?0+)xt1RFb}Y-^&{xLQY=>urcU zKI%T(QIEMDpkJlm*a5yt*V(xz6KoT5?Tc%_vCU5>)yJ&(6Y>y%xqjn4urvQ>oX5EO zF@rvc7%q^0$NgmVedZ|C{L0rGeAYYv+L(JiZ;!p2`?P5ckJ~9T2MP6;+>3XFn7ONe zPdr4PEyKFW4X&B8)t3?H$mqx(oIbR#KKc&tlek`G>*42Vl0zw*xLtIM$~nz=tU{>~nZ#Hk);n$MZ3dgk-*@hh=p zSL??Iym*|S1p{I|p)`9PEVaK@UrfEY5E@4Lqp`rpU$ z3pZD4kA9?5YfhduQcqR;Ls4y2K5JvXPo!5N)P{@tGR5QXm6^YGv4pm^1|00A`7?4a z6n_r;>ES+eA3R!LKcYeVKyeysp6N5n)%F9tfcpPSROb)YjMic$yuLbXHD=$`;`*pX zyMFL{PQ=>iUC7VoCoYe8d>?i_Zb6PqphgXOtb@-(9M1_}(tf@G9<5=j`4-i+Qhk=v zUQ^GyY(T89H4rS12Kf2QR6W0&<4}IjtK>N)PDbNzp0}5(B^_@ak4@BhY{uP-O~5yx z-oHBa_}LyMT$f&b_9e(y!!ysJSO1!R$2g(y+DEtkHsB^i&+`#|bz36=+YfxJunuMd zcTBwqo(~K>L~0ygbACV&I>R#>ao-lDH^c{yiAYQ+*vai=;&>QWDXS);lW2)_56OS-r4wnPS zUv>iDT4+?sS}J0U<#Q3XBGd?Tv>Kz=l~~r(*L{jrk>U=Z!EZ;T|xx zZF>!K2G`2BrVq}|?+li*e^K`UT8y?^d#%q0@)=F;M_xayx6l0XF};0sA8~(u9(!0p zz@$>F;n$fdPbQxUdpOSce$#z+kx$i{(5{vp;>Ln?LH#C_G?{SxWt(0M-jj>Hom$=M0b?9*cc^~~UT#QAcwieR#@sIN!8pR8qN z=O3k(v^={$^GrA&zlU?=>WO}DFOK8iB5T-NJKCmyIr3e5?)dB0$!Q%sgXDW?EyrWu zHGQ%2S>J3Atc#s6__G}F96*00`m&&*B(Q!?PT(NoPsBttnX}wG55P9OIoRX<%)`>0 zSU*N{+*u3p^<1?&m+o5A_F}#cuJp8HU46%77>0{!#3_8VO zj?2Z#3aqHjm33qsM)uh9?QaM--3iZN!mX&ae?vON99wIiD$ASY=JH`LIx*+JM=zG@ z2G7U~1-R<``|vJ7Jt~ZwZfQdJocDt&JwIq*C!9G zX>)Whb8mHWV`VLEVQ?;LbM3wDdK)*AF#0>WijH=kkc=o&vXjh2isF@R+0m>mc_cZR zS;u3w$d=SL$>y+|mNkja^Ipg~H}_u2sV@KpG@7KHWancu=e!$>4HSSvp-`yL_QiZM zsPbZxTxaLgbnxc+B!8RD%5?O!7|uu8!|WoT zBMfmO0>aFhhTspqbUZ|m{8#(MOE=Rxtk`U^v;6*Itt{rVLH0DAuDy)R3R)sA7Bsu< zw5zMUggMAe+la4OR?TOVr2iTHub;H-S4Kn$jgo%f?8JQ-qpW7>^kduOBlvoHl^J{v z(!o`xzP?RoNj@p7bTrC_ynl$*A8&U)uEUsRf1BsC%uZ3Yur%@NmCWUpw0`wU=6W#1 z6{$W5_Q6#)cmsGg^UF(^PHmP*HsLH^7^p8hy5&cLvgYQ7cy?-YnPq8}C22CruFZVf z>13Ep=T(x!|39gUq`DF$dZQv54aF`P8ZqllR;IEI2=96y^5J%3y7^y5MLNvj>qUxm zrM}$O7PS8^8_Z!vmD~Tw*2$UD7#hIz+x}7O3Iy|C_j_c=JGH4i8l{(d9%-5ILh2Lg z@dvtwg00$BB3L(3G)A{)*AH15T)zzz4OCV1H^4eMm>j`W{l1-}Fjommn z4}w;~r|KaeVmx58qws!f5%=@|*LPssFW}$FW+K1U*=09bNVUkGKI(t=@khyL$%A5g zGs`cps^re*=2shcHn+Btr^Vm%(I`zG74yk3C3c7C7!-h@{Cp0qyrjNQ@Xc%cVe!V$Jr#Cr7#=V(%4pPbs}wdB7hzglX5=Jn&AAtQ*T-W zb654()G}X<7n=iDBT^d38lYUKFEIaSh!G z&~yg)pH+EQ(x%XFNwSe#gg5x%7XJ^9 z(tCv~fDcFyz00hEb_}Zvf-!t*b(6__H0tcQ9&RNK{ak}s?>G7MyL6Pxp=p5NHEMNP zqNz^;mxL0Tp~JRrg8QUQxf9kOX8Tpw*EB%#y^3X3#^`P^#p$I>UM)-G#^hQEg#Sa z*Ywu>6XksQCo%!kQCP_*Ot~FB8#i~;YB%w_?YPDWQ|)UEUK}Ewal_^mh;F@gXGgCq zI?)2|;e3*gd~An!HLaGS)ikVOb?0M$>81lQ{H2ShRt}l?=T2

>!r-d+Bg!XwLyO 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 vnqyZ2^?(1)zB(r-IlX9`^m*F5CQVyK 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 diff --git a/.yarn/cache/string-width-npm-4.2.3-2c27177bae-e52c10dc3f.zip b/.yarn/cache/string-width-npm-4.2.3-2c27177bae-e52c10dc3f.zip deleted file mode 100644 index 9b4c088118fb56564e5f68986823ac6cdde5fa30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3604 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 diff --git a/.yarn/cache/string_decoder-npm-1.3.0-2422117fd0-8417646695.zip b/.yarn/cache/string_decoder-npm-1.3.0-2422117fd0-8417646695.zip deleted file mode 100644 index e12cf7591052fc8df998d2dbb6f8b58f1666c659..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6078 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 diff --git a/.yarn/cache/strip-json-comments-npm-3.1.1-dcb2324823-492f73e272.zip b/.yarn/cache/strip-json-comments-npm-3.1.1-dcb2324823-492f73e272.zip deleted file mode 100644 index e74ed10a6fade4cff83a0599004bf42e99292d38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4107 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 aKb3E0NP7B>008;vqkU>#YX0#0fPVp8!vVkm diff --git a/.yarn/cache/supports-color-npm-7.2.0-606bfcf7da-3dda818de0.zip b/.yarn/cache/supports-color-npm-7.2.0-606bfcf7da-3dda818de0.zip deleted file mode 100644 index 1fd9e12d4ecce5f0964f4fef99451c271efeabc8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4192 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 O0QP4A`^5GmIs69~x~Gi* diff --git a/.yarn/cache/type-check-npm-0.4.0-60565800ce-ec688ebfc9.zip b/.yarn/cache/type-check-npm-0.4.0-60565800ce-ec688ebfc9.zip deleted file mode 100644 index 85a029590ea5088983440276283ad14a719e7591..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8389 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 b;{PKEl;ogc{&0c+b=Cd)kKl>ukEj0wqjMJH diff --git a/.yarn/cache/type-fest-npm-0.20.2-b36432617f-4fb3272df2.zip b/.yarn/cache/type-fest-npm-0.20.2-b36432617f-4fb3272df2.zip deleted file mode 100644 index 8222fdcc36f5b96878246fc90b7337264b23c955..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51675 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 VG$4K7%?G(b*r$Oy48Q<^{s;U_p-KP% diff --git a/.yarn/cache/util-deprecate-npm-1.0.2-e3fe1a219c-474acf1146.zip b/.yarn/cache/util-deprecate-npm-1.0.2-e3fe1a219c-474acf1146.zip deleted file mode 100644 index c2309cfe4d1f4afb0e3261d70654e42dc411d6b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3982 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 x61B23{yj)Hr%ZBzLvqW1{{>~;w+R3M diff --git a/.yarn/cache/yallist-npm-4.0.0-b493d9e907-343617202a.zip b/.yarn/cache/yallist-npm-4.0.0-b493d9e907-343617202a.zip deleted file mode 100644 index f2d3306fed7ef0b8ce6f069aa55acaba982b9e5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5369 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�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

>oOIQ_kOkB> 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�@cqY+ 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 F1_1EmZ0Z02 diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index c60f3e78..00000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,713 +0,0 @@ -# Changelog - -All notable changes to this project will be documented in this file. This CHANGELOG roughly follows the guidelines from [keepachangelog.com](https://keepachangelog.com/en/1.0.0/). - -## [0.10.24] = 2024-03-25 - -### Fixed - -- Prevent Firefox from omitting the dot on i or j -- Prevent infinite loop in an `\edef` macro -- Convert protocol in a URL to lower case, to enable a URL whitelist - -### Added - -- Support 60 binary operators from the `stix` package - -## [0.10.23] = 2024-03-11 - -### Fixed - -- Do not consolidate `` at a comma with a subsequent space - -### Added - -- Consolidate `\mathrm{…}` into a single `` element -- Optional CSS file for Fira Math font -- Support \dotminus -- Support \Earth - -## [0.10.22] = 2024-01-25 - -### Fixed - -- Parse `\middle` to end one group and start another group -- `\Set`, when containing an `\over` -- Render `\nabla` as a `` element -- Do not insert soft line break at `\int` or `\nabla` -- Edit home page for HTML validation -- Remove redundant CSS rule for `` font family -- Remove extraneous pair of braces from TypeScript `d.ts` file - -### Added - -- `\sslash` -- `\reflectbox` -- `\leftmodels` - -## [0.10.21] = 2024-1-4 - -### Fixed - -- `\color{…}` inside an environment array - -## [0.10.20] = 2023-12-31 - -### Fixed - -- Client-side rendering of `\cancel`, `\bcancel`, & `\xcancel` -- Write parens around `\tag` inside array environments -- Spacing of operators at ends of braced group -- `\mathop{…}` spacing -- `\boldsymbol` -- Spacing for unary operators - -## [0.10.19] = 2023-12-22 - -### Fixed - -- Render math mode \AA as italic -- Improve consolidation of elements in the base of of a - -## Added - -- \Angstrom - -## [0.10.18] = 2023-12-12 - -### Fixed - -- Fix: Suppress operator spacing at ends of mrow -- Fix: \hbox sets its contents to \textstyle -- Fix fix \bigm | - -## Added - -- \lAngle \rAngle, ⟪⟫ -- \llangle\rrangle, ⦉⦊ -- \llparenthesis \rrparenthesis, ⦇⦈ - -## [0.10.17] = 2023-10-25 - -### Fixed - -- Mitigate WebKit accent alignment -- Fix \sout in WebKit -- Fix visibility of AMS automatic equation numbers in WebKit -- Improve rendering option defaults - -## [0.10.16] = 2023-10-13 - -### Fixed - -- Prevent f′ from overlapping in Chromium -- Stretch \widetilde & \widehat in Chromium -- Prevent Firefox from substituting an emoji for \oplus -- Prevent Firefox from substituting a dotless i in \widetilde{U_i} -- Fix tag alignment in {align} environment - -## Added - -- \dprime \trprime \qprime \backprime \backdprime \backtrprime - -## [0.10.15] = 2023-10-4 - -### Changed - -- Move environment CSS from external file to inline - -### Added - -- Support TypeScript modules -- Support stix astronomy symbols - -## [0.10.14] = 2023-07-28 - -### Fixed - -- Center display math in Firefox & WebKit. -- Spurious line-breaking on delimiters. -- `\bigg(\Bigg(` sizes in Chromium. -- \boxed & \colorbox in WebKit -- \lower in WebKit -- \raise, \raisebox, & \lower all adjust height & depth in Chromium. (Alas, not in Firefox). - -### Changed - -- Use instead of (to comply with MathML-Core). - -### Added - -- Support \VDash - - -## [0.10.13] = 2023-06-08 - -### Changed - -- Simplify code for extensible arrows - -### Added - -- \QED - -## [0.10.12] = 2023-05-21 - -### Fixed - -- Display \nabla as upright, not italic - -## [0.10.11] = 2023-04-22 - -### Fixed - -- Center display mode math -- \bin{symbols} - -### Added - -- Support `throwOnError` rendering option -- Support `\eqeq` and `\eqeqeq` - -## [0.10.10] = 2023-02-14 - -### Fixed - -- Enable arbitrary Unicode characters inside strict-mode `\text{…}` - -## [0.10.9] = 2023-02-03 - -### Fixed - -- Unicode ℓ - -## [0.10.8] = 2023-01-31 - -### Fixed - -- Left-justify after a newline - -## [0.10.7] = 2023-01-30 - -### Fixed - -- `` containing a single `DocumentFragment`. Resolves issue #18. - -## [0.10.6] = 2023-01-29 - -### Fixed - -- Remove `mathcolor` property. Resolves issue #17. -- `` containing a document fragment -- `\definecolor` with lower case rgb - -## [0.10.5] = 2023-01-28 - -### Fixed - -- color/spacing/linebreaking interaction - -## [0.10.4] = 2023-01-25 - -### Fixed - -- Number parsing. Resolves issue #13. - -## [0.10.3] = 2023-01-17 - -### Fixed - -- Soft lines breaks via CSS flex-wrap - -## [0.10.2] = 2023-01-09 - -### Fixed - -- consumeSpaces() to consume non-breaking space - -### Added - -- Support \leftouterjoin, \rightouterjoin, \fullouterjoin - -## [0.10.1] = 2022-12-29 - -### Fixed - -- Consolidate contents of \operatorname when possible -- Insert space after a subsup whose base is an op -- Spelling errors - -## [0.10.0] = 2022-12-14 - -### Fixed - -- A space prevents an optional argument to \\ - -### Added - -- \cent -- Unicode input for chancery and roundhand (script) letters. - -### Removed - -- Support for \oldstylenums - -## [0.9.2] = 2022-12-06 - -### Fixed - -- \underline inside \text{} -- Align-left in {cases} in Firefox -- Hard line breaks -- Wrap \vdots in ``, not `` -- Use CSS style='font-weight:bold;' for \pmb - -## [0.9.1] = 2022-11-27 - -### Added - -- \underline inside \text{} -- Align-left in {cases} in Firefox -- Hard line breaks -- Wrap \vdots in , not -- \pmb via CSS font-weight: bold -- \texttt{} - -### Removed - -- CSS file for XTIS font - -## [0.9.0] = 2022-10-28 - -### Changed - -- Remove support for \arraystretch -- Control soft line breaks with a rendering option -- Array spacing via CSS, not attributes - -### Added - -- Support \gdef and \global\let -- Support array double borders called by double \hline and {array}{c||c} -- Support \mapsfrom - -### Fixed - -- Avoid unwanted stretch of harpoons -- \hline after \cr -- \prime vertical alignment in STIX TWO and Asana -- Ignore emoji suppression character ︎ - -### Securtity - -- Avoid recursive call to parser which evaded limit on \def - -## [0.8.0] = 2022-09-05 - -### Breaking Change - -- Soft line breaks are now controlled by the `wrap` rendering option. - Temml does this by creating a series of `` elements. - -## [0.7.3] = 2022-08-29 - -### Fixed - -- Get (lowered) prime from Temml.woff2 font -- Add a prime character to Temml.woff2 - -## [0.7.2] = 2022-08-08 - -### Fixed - -- Consolidation of text into a element - -## [0.7.1] = 2022-08-07 - -### Fixed - -- Vertical arrow heights in Chromium -- mclass, e.g. \mathrel, in Chromium - -## [0.7.0] = 2022-08-03 - -### Release Notes - -This release is all about Chromium. Ignalia has announced an [intent to ship](https://www.igalia.com/2022/06/22/Intent-to-Ship-MathML.html) MathML in Chromium. In anticipation of that event, this version of Temml is written to support both Firefox and Chromium. - -Those two implementations are not written to the same specification. So Temml’s MathML must conform simultaneously to both [MathML 3]( https://www.w3.org/TR/MathML3/) (Firefox) and [MathML Core](https://w3c.github.io/mathml-core/) (Chromium). Given that challenge, I’m pretty happy with how well it has turned out. Temml emulates several hundred LaTeX functions and nearly all of them work very well. - -It’s not all perfect. In this version, Temml drops support for `\cancelto`, `\toggle`, `\texttip`, `\phase`, and `\longdiv`. I think that `\toggle` and `\texttip` are probably gone forever. The others I hope to restore someday after Chromium fully supports the `menclose` element. - -Also, Chromium’s implementation of MathML is new and not yet mature. It fails with some stretchy accents and extensible arrows. Chromium cannot yet print a page that contains MathML. I’m testing this in Chrome Canary and those issues may be worked out before MathML is shipped. - -### Added - -- Support for [MathML Core](https://w3c.github.io/mathml-core/) for rendering in Chromium - -### Removed - -- Support for `\cancelto`, `\toggle`, `\texttip`, `\phase`, and `\longdiv` - -## [0.6.9] = 2022-06-11 - -### Fixed - -- Colors of lower-case color names -- `\surd` vertical alignment when rendered in Latin Modern - -## [0.6.8] = 2022-05-20 - -### Fixed - -- Avoid crash when mhchem \ce{} is empty -- Numerals in text mode - -### Added - -- Support Unicode (sub|superscript) characters - -## [0.6.7] = 2022-03-27 - -### Fixed - -- Added operator spacing to Unicode characters ∖∘∙ -- Avoid error when a spacing function is the base of a subscript. -- Fix nested font size changes -- Replace string.substr() with string.slice() -- Use Unicode U+203E, Overline, for \bar{} - -### Added - -- Support \strictif and \strictfi - -### Docs - -- Explain how to work around a Cambria Math radical size problem -- Edit README for brevity - -## [0.6.6] = 2022-01-28 - -### Fixed - -- Workaround a Firefox bug. Prevent space around a \mathrm{} function with a one-character argument. - -## [0.6.5] = 2022-01-20 - -### Added - -- 15 functions from the `cmll` package - -### Fixed - -- Omit color attribute and wrapper from \rule when unecessary - -## [0.6.4] = 2022-01-15 - -### Fixed - -- More improvement of recognition of delimiters after functions like \sin - -## [0.6.3] = 2022-01-14 - -### Fixed - -- Improve recognition of delimiters after functions like \sin - -## [0.6.2] = 2022-01-13 - -### Fixed - -- \bm{\sin} -- Remove spurious space between \sin (x) - -## [0.6.1] = 2022-01-12 - -### Fixed - -- \mathinner when part of a denominator - -## [0.6.0] = 2022-01-11 - -### Changed - -- In default Temml, Numbers are now consolidated into one element if they begin and end with a number and contain numerals, commas, or dots -- Some error messages are revised - -### Added - -- Documentation section regarding numbers - -## [0.5.3] = 2022-01-08 - -### Fixed - -- Suppress operator spacing between adjacent relations - -## [0.5.2] = 2022-01-07 - -### Fixed - -- \tag now stays in display mode - -### Changed - -- Parse error message now is displayed on screen, not in a hover hint. -- Added locations to some error messages. - -## [0.5.1] = 2022-01-05 - -### Fixed - -- \vcentcolon, \ratio - -## [0.5.0] = 2022-01-04 - -### Changed - -- Rendering option `maxSize` now takes an array of two numbers. - -### Added - -- \centerdot - -### Fixed - -- text-mode colon -- All unit tests now pass. -- All SVG images have been removed from Temml - -## [0.4.2] = 2021-12-24 - -### Fixed - -- \mathcal{ego} -- \not\operatorname -- \big\backslash and \right\backslash -- displaystyle \sideset -- := -- {cases} environment row spacing -- \varnothing -- math-mode \O and \o -- Greek edge cases of bold, italic, and sans-serif -- \shortmid, \nshortmid, \shortparallel, \nshortparallel, \smallsetminus -- non-stretchy accents (so they do not stretch) -- Make best effort to support Greek sans-serif - -### Added - -- \sgn - -## [0.4.1] = 2021-12-20 - -### Fixed - -- \bmod -- \colon spacing -- \right . -- \includegraphics -- \angle padding -- \subarray row spacing -- "/" spacing -- width of stacked harpoons -- operator spacing when adjacent to \color -- Improve laps -- Use character U+2044 for inline fractions -- Work around Firefox bug affecting \mathrlap -- \boldsymbol when it wraps an operator -- array environment enclosing lines -- \mathbf{\Omega} -- \mathop - -### Added - -- Copy button to home page. -- Images from LaTeX in KaTeX screenshotter tests -- Mozilla test suite -- mhchem test suite - -## [0.4.0] = 2021-12-06 - -### Changed - -- Remove \centerdot -- Remove \vcenter -- Remove \newextarrow -- Edit mhchem to sync w/extensible arrow fix. - -### Fixed - -- Prevent arrowhead distortion on extensible arrows -- Fix scriptstyle errors. -- Adjust RGB values of base colors. - -## [0.3.3] - 2021-11-24 - -### Added - -- Support \odv and \pdv from derivative package -- Rendering option `elementIsMath` - -### Changed - -- Make color names case-sensitive -- Use Unicode character U+212B for \AA - -### Fixed - -- Explicitly set stretchy="true" on delimiters to evade a Firefox bug -- Soft line breaks inside \color -- \mathbin that contains a - -## [0.3.2] - 2021-11-21 - -### Added - -- \definecolor -- Optional argument that sets the color model in color functions -- Predefined colors per Tables 4.1 and 4.2 in xcolor package -- \nsubset and \nsupset - -### Changed - -- Use character U+005F for \overline and \underline. Regain stretchiness. - -### Fixed - -- Spacing for \mid -- Workaround a Fireox bug for spacing of - -## [0.3.1] - 2021-11-15 - -### Added - -- Rendering option preventTagLap - -## [0.3.0] - 2021-11-12 - -### Removed - -- Support for \global, \gdef, and \xdef - -### Added - -- Preamble definition -- Support \nonumber -- STIX2 is now available on the home page - -### Fixed - -- Text mode accents in strict mode get only a console message, not an error. - -### Changed - -- Revert to macron character for \bar -- Change a font name from Temml-Script.woff2 to Temml.woff2. -- Change a folder name from /temml/ to /assets/. -- Documentation clarifies the current chancery/roundhand situation. - -## [0.2.3] - 2021-11-06 - -### Added - -- Support \ballotx -- Support \permil - -## [0.2.2] - 2021-11-04 - -### Added - -- Support \c -- Support \female and \male -- Support \relax -- Soft line breaks in Firefox, if no - -### Changed - -- element namespace is now optional -- elemennt w/TeX string is now optional -- Removed "temml" class from element -- Reduced number of visible DOM elements -- Support AMS environment w/one empty row -- \bar{} accent now uses character U+2015, horizontal bar - -### Fixed - -- Spaces inside \text{} -- \char now supports >16-bit Unicode characters -- \mathbb operating on numbers -- Circular dependency -- Stretchy arrow bug -- Validation errors in \mathop, \mathrel, and \operatorname - -## [0.2.1] - 2021-08-10 - -### Changed - -- Change CSS files. Each CSS file now is synchronized with a single math font. - -### Added - -- Support Asana and XITS fonts. -- Support \Braket, \Set, and \set. - -## [0.2.0] - 2021-08-02 - -### Removed - -- Soft line breaks, since they will not work in Chromium. - -### Fixed - -- Improve handling of \limits -- Improve handling of newline. -- Respect catcode in macro expansion and set ~ correctly. -- Improve \operatorname*. -- Fix non-stretchy accents in Firefox. -- Use correct Unicode for uppercase Greek. - -### Changed - -- Support font functions via substitution of Unicode characters instead of `mathvariant`. Font functions will now work in Chromium. -- Change \pmb to use CSS text-shadow instead of `mathvariant = bold`. - -### Added - -- Support \backcong. - -## [0.1.3] - 2021-05-21 - -### Fixed - -- Treat `\` followed by whitespace including up to one newline as equivalent to `\ `. -- Isolate `border-color` from page CSS. - -### Added - -- `\P` and `\S` in math mode. - -## [0.1.2] - 2021-02-18 - -### Fixed - -- Workaround for Firefox arrow minlength bug. - -### Removed - -- \overlinesegment & \underlinesegment - -## [0.1.1] - 2021-02-17 - -### Fixed - -- \overlinesegment & \underlinesegment SVGs - -### Changed - -- Removed Firefox browser sniff from CSS - -## [0.1.0] - 2021-02-01 - -### Added - -- Initial Release diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 676c8a47..00000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2020 Ron Kok - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/README.md b/README.md deleted file mode 100644 index 99bd5680..00000000 --- a/README.md +++ /dev/null @@ -1,43 +0,0 @@ -*Temml* is a LaTeX-to-MathML JavaScript conversion utility. It is built to be lightweight. - -| Library | Minified JavaScript + CSS | -|:--------------|:-------------------------:| -| Temml | 153 KB | -| MathJax 2.7.5 | 338 KB | -| KaTeX | 280 KB | -| TeXZilla | 168 KB | - -As a futher advantage, Temml can use local system fonts. The minimum Temml installation serves a font file that is only 10kb. Sadly, Chromium has some rendering bugs when using system fonts. It -work better with the Latin Modern font, a 380 KB file. - -Temml’s coverage of LaTeX functions is as good as MathJax, slightly better than KaTeX 0.16.0 and substantially better than TeXZilla. See a [detailed coverage comparison](https://temml.org/docs/en/comparison.html). - -Temml's test suite includes many rendered examples, including the Temml [supported functions page](https://temml.org/docs/en/supported.html) and tests from [Mozilla](https://temml.org/tests/mozilla-tests.html), [Wikipedia](https://temml.org/tests/wiki-tests.html), [mhchem](https://temml.org/tests/mhchem-tests.html), and [LaTeXML](https://temml.org/tests/LaTeXML-tests.html). - -Temml's demonstration page is at https://temml.org/ - -Documentation can be found at: - -* [Installation](https://temml.org/docs/en/administration.html) - -* LaTeX function support, [sorted into logical groups](https://temml.org/docs/en/supported.html). - -* LaTeX function support, [sorted alphabetically](https://temml.org/docs/en/support_table.html). - -### Acknowledgements - -I built Temml by: - -1. Forking [KaTeX](https://katex.org/). - -2. Deleting half the code, removing the HTML parts and keeping the parser, the macro expander, and the MathML parts. - -3. Doing some code refactoring and many MathML bug fixes. - -4. Adding new functionality: upright lower-case Greek letters, `\euro`, `\label{…}`, `\ref{…}`, `\prescript`, `\definecolor`, `xcolor` color names, etc. - -I wish to thank Khan Academy and the many volunteer KaTeX contributors. This library would not exist if KaTeX had not existed first. - ---- - -Temml is released under terms of the [MIT license](https://mit-license.org/) diff --git a/docs/administration.md b/docs/administration.md deleted file mode 100644 index 0249ff13..00000000 --- a/docs/administration.md +++ /dev/null @@ -1,490 +0,0 @@ - - - - - - Temml Administration - - - - - -
- -# Temml Administration - -# Browser Support - -Temml works in browsers that support MathML. This includes Chrome, Edge, Firefox, and Safari. -Temml will never work in Internet Explorer. - -# Installation - -For use in the browser, you can download a zip file of Temml from the -[releases page][] of the Temml repository. For server-side use, you can obtain -Temml via CLI commands `npm install temml` or `yarn add temml`. - -The minimum browser installation needs the following files. The `css` file and -font file must be in the same folder. - -* temml.min.js -* Temml-Local.css -* Temml.woff2 - -A server-side installation should use `temml.cjs` or `temml.mjs` instead -of `temml.min.js`. - -[releases page]: https://github.com/ronkok/Temml/releases - -#### Starter template - -```html - - - - - ... - - - - ... - -``` - -# API - -### Overview - -Say that you have an HTMLCollection of elements whose contents should be -converted from TeX strings to math. The code for such a conversion -might look like this: - -Option 1: Macros do not persist between calls to Temml: - -``` -// Render all the math. -for (let aSpan of [...mathSpans]) { - const tex = aSpan.textContent; - const displayMode = aSpan.classList.contains("display"); - temml.render(tex, aSpan, { displayMode }); -} -// Optional postProcess to render \ref{} -temml.postProcess(document.body); -``` - -
Option 2: Macros defined with \gdef do persist: - -``` -// Optional macros object to hold macros that persist between calls to Temml. -const macros = {} -// Render all the math. -for (let aSpan of [...mathSpans]) { - const tex = aSpan.textContent; - const displayMode = aSpan.classList.contains("display"); - // Notice the macros argument below. - // It carries macros that were defined with \gdef or \global\let - temml.render(tex, aSpan, { macros, displayMode }); -} -// Optional postProcess to render \ref{} -temml.postProcess(document.body); -``` - -::: indented -Notice that you can choose when to stop macro persistence by redefining `macros`. -::: - -
- -
- -
Option 3: Macros persist and there are some predefined macros: - -Now say that you wish to pre-define two macros and a color with document-wide scope. - -``` -// Optional preamble to pre-define macros. -const macros = temml.definePreamble( - `\\newcommand\\d[0]{\\operatorname{d}\\!} - \\def\\foo{x^2} - \\definecolor{sortaGreen}{RGB}{128,128,0}` -); -// Render all the math. -for (let aSpan of [...mathSpans]) { - const tex = aSpan.textContent; - const displayMode = aSpan.classList.contains("display"); - temml.render(tex, aSpan, { macros, displayMode }); -} -// Optional postProcess to render \ref{} -temml.postProcess(document.body); -``` - -
- -Below, we examine the parts of that code. - -### In-Browser - -To render math in one DOM element, call `temml.render` with a TeX expression -and a DOM element to render into: - -```js -temml.render("c = \\pm\\sqrt{a^2 + b^2}", element); -``` - -If the element you provide is a `` element, Temml will populate it. -Otherwise, it will create a new `` element and make it a child -of the element you provide. - -### Server-Side - -To generate MathML on the server or to generate an MathML string of the -rendered math, you can use `temml.renderToString`: - -```js -const temml = require('./temml.cjs'); // if in Node.js -const mathML = temml.renderToString("c = \\pm\\sqrt{a^2 + b^2}"); -``` - -### Preamble - -To give document-wide scope to a set of macros or colors, define them in a preamble. - -```js -const macros = temml.definePreamble( - `\\newcommand\\d[0]{\\operatorname{d}\\!} - \\def\\foo{x^2} - \\definecolor{sortaGreen}{RGB}{128,128,0}` -); -``` - -Any valid [Temml macro](supported.html#macros) or [\definecolor](supported.html#style-color-size-and-font) -may be written into a preamble. Then include the resulting macros in the Temml options. - -### Options - -You can provide an object of options as the last argument to `temml.render` and `temml.renderToString`. For example: - -```js -temml.render( - "c = \\pm\\sqrt{a^2 + b^2}", - element, - { displayMode: true, macros } -); -``` - -Available options are: - -- `displayMode`: `boolean`. If `true` the math will be rendered in display mode, which will put the math in display style (so `\int` and `\sum` are large, for example), and will center the math on the page on its own line. If `false` the math will be rendered in inline mode. (default: `false`) - -- `macros`: `object`. A collection of custom macros. The easy way to create them is via a preamble, noted just above. Alternatively, you can provide a set of key-value pairs in which each key is a new Temml function name and each value is the expansion of the macro. Example: `macros: {"\\R": "\\mathbb{R}"}`. - -- `annotate`: `boolean`. If `true`, Temml will include an `` element that contains the input TeX string. (default: `false`) - -- `wrap`: (`"tex"` | `"="` | `"none"`). A mode for soft line breaks in non-display - mode math. The `tex` option sets a soft line break after every top-level relation and - binary operator, per _The TeXbook_, page 173. The `=` option sets a soft line - break before the second and subsequent top-level `=` signs. `tex` is the default. - - Caveats: Soft line breaks work in Chromium and Firefox, but do not work in WebKit or Safari. - Display mode math gets no soft line breaks. Annotated math gets no soft line - breaks. If a writer sets a hard line break via `\\` or `\cr`, then Temml will - not set any soft line breaks in that expression. - -- `leqno`: `boolean`. If `true`, display math has `\tag`s rendered on the left instead of the right, like `\usepackage[leqno]{amsmath}` in LaTeX. (default: `false`) - -- `colorIsTextColor`: `boolean`. In LaTeX, `\color` is a switch, but in early versions of MathJax and KaTeX, `\color` applied its color to a second argument, the way that LaTeX `\textcolor` works. Set option `colorIsTextColor` to `true` if you want `\color` to work like early MathJax or KaTeX. (default: `false`) - -- 'throwOnError': `boolean`. If true, Temml will throw parse errors to the console. If false, Temml will write the parse error to the output of the `render()` function. (default: false) - -- `errorColor`: `string`. A color string given in the format `"#XXX"` or `"#XXXXXX"`. This option determines the color that unsupported commands and invalid LaTeX are rendered in. (default: `#b22222`) - -- `maxSize`: `[number, number]`. This provides a way to cap all user-specified sizes, e.g. in `\rule{500em}{500em}`. The first number is the cap in `em` units, which will be applied to user-specified relative units. The second number is the cap in CSS `pt` units, which will be applied to user-specified absolute units. The default is `[Infinity, Infinity]`, which allows users to make elements and spaces arbitrarily large. - -- `maxExpand`: `number`. Limit the number of macro expansions to the specified number, to prevent e.g. infinite macro loops. (`\edef` expansion counts all expanded tokens.) If set to `Infinity`, the macro expander will try to fully expand as in LaTeX. (default: 1000) - -- `strict`: `boolean`. If `false` (similar to MathJax), allow features that make writing LaTeX convenient but are not actually supported by LaTeX. If `true` (LaTeX faithfulness mode), throw an error for any such transgressions. (default: `false`) - -- `xml`: `boolean`. If `true`, Temml will write a namespace into the `` element. That namespace is `xmlns="http://www.w3.org/1998/Math/MathML"`. Such a namespace is unnecessary for modern browsers but can be helpful for other user agents, such as Microsoft Word. (default: `false`) - -- `trust`: `boolean` or `function` (default: `false`). If `false` (do not trust input), prevent any commands like `\includegraphics` that could enable adverse behavior, rendering them instead in `errorColor`. If `true` (trust input), allow all such commands. Provide a custom function `handler(context)` to customize behavior depending on the context (command, arguments e.g. a URL, etc.). A list of possible contexts: - - - `{command: "\\url", url, protocol}`\ - where `protocol` is a lowercased string like `"http"` or `"https"` - that appears before a colon, or `"_relative"` for relative URLs. - - `{command: "\\href", url, protocol}` - - `{command: "\\includegraphics", url, protocol}` - - `{command: "\\class", class}` - - `{command: "\\id", id}` - - `{command: "\\style", style}` - - `{command: "\\data", attributes}` - - Here are some sample trust settings: - - - Forbid specific command: `trust: (context) => context.command !== '\\includegraphics'` - - Allow specific command: `trust: (context) => context.command === '\\url'` - - Allow multiple specific commands: `trust: (context) => ['\\url', '\\href'].includes(context.command)` - - Allow all commands with a specific protocol: `trust: (context) => context.protocol === 'http'` - - Allow all commands with specific protocols: `trust: (context) => ['http', 'https', '_relative'].includes(context.protocol)` - - Allow all commands but forbid specific protocol: `trust: (context) => context.protocol !== 'file'` - - Allow certain commands with specific protocols: `trust: (context) => ['\\url', '\\href'].includes(context.command) && ['http', 'https', '_relative'].includes(context.protocol)` - -## Post Process - -The `postProcess` function implements the AMS functions `\ref` and `\label`. -It should be called outside of any loop. - -The main Temml functions, `temml.render` and `temml.renderToString`, each -operate on only one element at a time. In contrast, the `postProcess` function -makes two passes through the entire document. If you choose not to support -`\ref`, `postProcess` can be omitted. - -If Temml is used server-side, `\ref` and `\label` are still implemented at -runtime with client-side JavaScript. A small file, `temmlPostProcess.js`, is -provided to be installed in place of `temml.min.js`. It exposes one function: - -``` -temml.postProcess(document.body) -``` - -If you do not provide a runtime `postProcess`, everything in Temml will work except `\ref`. - -If you use the [auto-render extension][], it includes the post-processor nuances. - -[auto-render extension]: https://github.com/ronkok/Temml/tree/main/contrib/auto-render - -# Fonts - -Temml has several different pre-written CSS files. You should use only one and -by that choice, you also choose a math font. There are several math fonts -available and each has different advantages. - -**Latin Modern** will provide the best quality rendering. It is a clone of -Computer Modern and so is very home-like for readers accustomed to LaTeX -documents. For best results, you must also serve a small -(10kb) `Temml.woff2` file. Then you’ll get support for `\mathscr{…}` and you’ll -get primes at the correct vertical alignment in Chrome and Edge. - -**Temml-Local.css** is the light-weight option. It calls two fonts: _Cambria -Math_, which comes pre-installed in Windows, or _STIX TWO_, which comes -pre-installed in iOS and MacOS (as of Safari 16). It also needs to be augmented -with `Temml.woff2`. - -Sadly, this option has rendering issues. Chrome botches extensible arrows and it -will fail to stretch the `∫` symbol on Windows. Android does not currently -provide a font with a MATH table, so it has many problems. - -**Asana** and **Libertinus** have some of the same rendering problems as Cambria Math, -although Asana does contain its own roundhand glyphs. - -**Fira Math** is a sans-serif math font. - -Several other math fonts exist and you can try them out at Frédéric Wang’s -[Mathematical OpenType Fonts][]. - -Where to find font files: - -- Temml.woff2 can be downloaded with the latest Temml [release][]. -- STIXTwoMath-Regular.woff2 is located at the STIX [repository][STIX]. -- LibertinusMath-Regular.woff2 is located at the Libertinus [repository][Libertinus]. -- The other fonts can be downloaded at [Mathematical OpenType Fonts][]. - -[release]: https://github.com/ronkok/Temml/releases -[STIX]: https://github.com/stipub/stixfonts/blob/master/fonts/static_otf_woff2/STIXTwoMath-Regular.woff2 -[Libertinus]: https://github.com/alerque/libertinus -[Mathematical OpenType Fonts]: https://fred-wang.github.io/MathFonts/ - -If you want a different math font size, you can add a rule to your own page's -CSS, like this example: - -```css -math { font-size: 125%; } -``` - -# Equation numbering - -In order to place automatic equation numbering in certain AMS environments, -Temml contains these CSS rules: - -``` -.tml-eqn::before { - counter-increment: tmlEqnNo; - content: "(" counter(tmlEqnNo) ")"; -} -body { counter-reset: tmlEqnNo; } -``` - -You can overwrite the `content` rule to produce customized equation numbers. -For instance, if chapter three of your book is in its own html file, that file’s -`` could contain: - -``` - -``` - -Then the automatic equation numbering in that chapter would look like: (3.1) - -If your site does not render automatic numbering properly, check if your other -CSS has overwritten the Temml counter-reset. - -# Extensions - -More Temml functionality can be added via the following extensions: - -* [auto-render][]: Find and render all math in a running HTML page. -* [copy-tex][]: When users select and copy elements, copies their LaTeX source to the clipboard -* [mhchem][]: Write beautiful chemical equations easily. -* [physics][]: Implement much of the LaTeX `physics` package. -* [texvc][]: Support functions used in wikimedia. - -[auto-render]: https://github.com/ronkok/Temml/tree/main/contrib/auto-render -[copy-tex]: https://github.com/ronkok/Temml/tree/main/contrib/copy-tex -[mhchem]: https://github.com/ronkok/Temml/tree/main/contrib/mhchem -[physics]: https://github.com/ronkok/Temml/tree/main/contrib/texvc -[texvc]: https://github.com/ronkok/Temml/tree/main/contrib/texvc - -To install extensions for browser use, include the appropriate file from the -`contrib` folder of the Temml repository. Then reference the file in the -`` of the HTML page. As in this `mhchem` example: - -```html - - ... - - - - -``` - -The extension reference must come after the reference to `temml.min.js`. - -For server-side use, just use `temml.cjs` or `temml.mjs` instead of `temml.min.js`. -`temml.cjs` and `temml.mjs` both include `mhchem`, `physics`, and `texvc`. - -# Security - -Any HTML generated by Temml should be safe from ` - - - - - -
- -

Foreword

- -

This page compares the MathML output from four TeX-to-MathML conversion libraries. You should use Firefox or Safari to view this page because they can render the MathML today. MathML will be viewable in Chrome and Edge soon.

- -

MathJax and KaTeX of course also render math in other formats. This comparison is limited to MathML.

- -

Versions used are: Temml 0.10.24, MathJax 2.7.5, KaTeX 0.13.9, and TeXZilla 1.0.2.0

- -

Symbols

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Symbol/FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
+₮a+b₮\(a+b\)₭a+b₭₸a+b₸a+b
-₮a-b₮\(a-b\)₭a-b₭₸a-b₸a-b
!₮n!₮\(n!\)₭n!₭₸n!₸n!
\!₮a\!b₮\(a\!b\)₭a\!b₭₸a\!b₸a\!b
#₮\def\bar#1{#1^2} \bar{y}₮\(\def\bar#1{#1^2} \bar{y}\)₭\def\bar#1{#1^2} \bar{y}₭Not supported\def\bar#1{#1^2} \bar{y}
\#₮\#₮\(\#\)₭\#₭₸\#₸
%₮%a comment₮\(%a comment\)₭%a comment₭Not supported%a comment
\%₮\%₮\(\%\)₭\%₭₸\%₸
&₮\begin{matrix} a & b\cr c & d \end{matrix}₮\(\begin{matrix} a & b\\ c & d \end{matrix}\)₭\begin{matrix} a & b\\ c & d \end{matrix}₭₸\begin{matrix} a & b\\ c & d \end{matrix}₸\begin{matrix}
   a & b \\
   c & d
\end{matrix}
\&₮\&₮\(\&\)₭\&₭₸\&₸
'₮'₮\('\)₭'₭₸'₸
\'₮\text{\'{a}}₮Not supported₭\text{\'{a}}₭₸\text{\'{a}}₸\text{\'{a}}
(₮(₮\((\)₭(₭₸(₸
)₮)₮\()\)₭)₭₸)₸
\₮a\ b₮\(a\ b\)₭a\ b₭Not supporteda\ b
\"₮\text{\"{a}}₮Not supported₭\text{\"{a}}₭₸\text{\"{a}}₸\text{\"{a}}
\$₮\text{\textdollar}₮Not supported₭\text{\textdollar}₭₸\text{\textdollar}₸
\,₮a\,\,{b}₮\(a\,\,{b}\)₭a\,\,{b}₭₸a\,\,{b}₸a\,\,{b}
\.₮\text{\.{a}}₮Not supported₭\text{\.{a}}₭₸\text{\.{a}}₸\text{\.{a}}
\:₮a\:\:{b}₮\(a\:\:{b}\)₭a\:\:{b}₭₸a\:\:{b}₸a\:\:{b}
\;₮a\;\;{b}₮\(a\;\;{b}\)₭a\;\;{b}₭₸a\;\;{b}₸aa\;\;{b}
_₮x_i₮\(x_i\)₭x_i₭₸x_i₸x_i
\_₮\_₮\(\_\)₭\_₭₸\_₸
\`₮\text{\'{a}}₮Not supported₭\text{\'{a}}₭₸\text{\'{a}}₸\text{\'{a}}
<₮<₮\(<\)₭<₭₸<₸
\=₮\text{\={a}}₮Not supported₭\text{\={a}}₭₸\text{\={a}}₸\text{\={a}}
>₮>₮\( > \)₭>₭₸>₸
\>₮a\>\>{b}₮\(a\>\>{b}\)₭a\>\>{b}₭Not supporteda\>\>{b}
[₮[₮\([\)₭[₭₸[₸
]₮]₮\(]\)₭]₭₸]₸
{₮{a}₮\({a}\)₭{a}₭₸{a}₸{a}
}₮{a}₮\({a}\)₭{a}₭₸{a}₸{a}
\{₮\{₮\(\{\)₭\{₭₸\{₸
\}₮\}₮\(\}\)₭\}₭₸\}₸
|₮|₮\(|\)₭|₭₸|₸
\|₮\|₮\(\|\)₭\|₭₸\|₸
~₮\text{no~break}₮\(\text{no~break}\)₭\text{no~break}₭Not supported\text{no~break}
\~₮\text{\~{a}}₮Not supported₭\text{\~{a}}₭₸\text{\~{a}}₸\text{\~{a}}
\\₮\begin{matrix} a & b\\ c & d\end{matrix}₮\(\begin{matrix} a & b\\ c & d\end{matrix}\)₭\begin{matrix} a & b\\ c & d\end{matrix}₭₸\begin{matrix} a & b\\ c & d\end{matrix}₸\begin{matrix}
   a & b \\
   c & d
\end{matrix}
\\₮x \\ y₮\(x \\ y\)₭x \\ y₭₸x \\ y₸x \\ y
^₮x^i₮\(x^i\)₭x^i₭₸x^i₸x^i
\^₮\text{\^{a}}₮Not supported₭\text{\^{a}}₭₸\text{\^{a}}₸\text{\^{a}}
special fraction₮1\kern2mu \text{³⁄₄}₮\(1\kern2mu \text{³⁄₄}\)₭1\kern2mu \text{³⁄₄}₭Not supported1\kern2mu \text{³⁄₄}
- -

A

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
\AA₮\text{\AA}₮Not supported₭\text{\AA}₭₸\text{\AA}₸\text{\AA}
\aa₮\text{\aa}₮Not supported₭\text{\aa}₭₸\text{\aa}₸\text{\aa}
\above₮{a \above{2pt} b+1}₮\({a \above{2pt} b+1}\)₭{a \above{2pt} b+1}₭Not supported{a \above{2pt} b+1}
\abovewithdelimsNot supported\(a+1 \abovewithdelims [ ] 1pt b\)Not supportedNot supporteda+1 \abovewithdelims [ ] 1pt b
\acute₮\acute e₮\(\acute e\)₭\acute e₭Not supported\acute e
\AE₮\text{\AE}₮Not supported₭\text{\AE}₭₸\text{\AE}₸\text{\AE}
\ae₮\text{\ae}₮Not supported₭\text{\ae}₭₸\text{\ae}₸\text{\ae}
\alef₮\alef₮\(\alef\)₭\alef₭Not supported
\alefsym₮\alefsym₮\(\alefsym\)₭\alefsym₭Not supported
\aleph₮\aleph₮\(\aleph\)₭\aleph₭₸\aleph₸
{align}₮₮\begin{align}a&=b+c\\d+e&=f\end{align}₮₮\[\begin{align}a &=b+c\\d+e&=f\end{align}\]₭₭\begin{align}a &=b+c\\d+e&=f\end{align}₭₭₸\begin{align}a&=b+c\\d+e&=f\end{align}₸\begin{align}
   a&=b+c \\
   d+e&=f
\end{align}
{align*}₮₮\begin{align*}a&=b+c\\d+e&=f\end{align*}₮₮\[\begin{align*}a &=b+c\\d+e&=f\end{align*}\]₭₭\begin{align*}a &=b+c\\d+e&=f\end{align*}₭₭₸\begin{align}a&=b+c\\d+e&=f\end{align}₸\begin{align*}
   a&=b+c \\
   d+e&=f
\end{align*}
{aligned}₮\begin{aligned}x&=y & a&=b+c\\x'&=y' & a'&=b'\end{aligned}₮\(\begin{aligned}x&=y & a&=b+c\\x'&=y' & a'&=b'\end{aligned}\)₭\begin{aligned}x&=y & a&=b+c\\x'&=y' & a'&=b'\end{aligned}₭₸\begin{aligned}x&=y & a&=b+c\\x'&=y' & a'&=b'\end{aligned}₸\begin{aligned}
x&=y & a&=b+c\\
x'&=y' & a'&=b'
\end{aligned}
{alignat}₮₮\begin{alignat}{2}10&x+&3&y=2\\3&x+&13&y=4\end{alignat}₮₮\[\begin{alignat}{2}10&x+&3&y=2\\3&x+&13&y=4\end{alignat}\]₭₭\begin{alignat}{2}10&x+&3&y=2\\3&x+&13&y=4\end{alignat}₭₭₸\begin{alignat}{2}10&x+&3&y=2\\3&x+&13&y=4\end{alignat}₸
{alignat*}₮₮\begin{alignat*}{2}10&x+&3&y=2\\3&x+&13&y=4\end{alignat*}₮₮\[\begin{alignat*}{2}10&x+&3&y=2\\3&x+&13&y=4\end{alignat*}\]₭₭\begin{alignat*}{2}10&x+&3&y=2\\3&x+&13&y=4\end{alignat*}₭₭₸\begin{alignat*}{2}10&x+&3&y=2\\3&x+&13&y=4\end{alignat*}₸
{alignedat}₮\begin{alignedat}{2}10&x+&3&y=2\\3&x+&13&y=4\end{alignedat}₮\(\begin{alignedat}{2}10&x+&3&y=2\\3&x+&13&y=4\end{alignedat}\)₭\begin{alignedat}{2}10&x+&3&y=2\\3&x+&13&y=4\end{alignedat}₭₸\begin{alignedat}{2}10&x+&3&y=2\\3&x+&13&y=4\end{alignedat}₸\begin{alignedat}{2}
   10&x+ &3&y = 2 \\
   3&x+&13&y = 4
\end{alignedat}
\allowbreakSupportedNot supportedNot supportedNot supported
\Alpha₮\Alpha₮\(\Alpha\)₭\Alpha₭₸\Alpha₸
\alpha₮\alpha₮\(\alpha\)₭\alpha₭₸\alpha₸
\amalg₮\amalg₮\(\amalg\)₭\amalg₭₸\amalg₸
\And₮\And₮\(\And\)₭\And₭Not supported
\andNot supported\(\and\)Not supportedNot supportedDeprecated
\angNot supported\(\ang\)Not supportedNot supportedDeprecated
\angl₮a_{\angl n}₮Not supported
See \enclose
₭a_{\angl n}₭Not supporteda_{\angl n}
\angle₮\angle₮\(\angle\)₭\angle₭₸\angle₸
\angln₮a_\angln₮Not supported
See \enclose
₭a_\angln₭Not supporteda_\angln
\Angstrom₮\Angstrom₮Not supportedNot supportedNot supported\Angstrom
\approx₮\approx₮\(\approx\)₭\approx₭₸\approx₸
\approxeq₮\approxeq₮\(\approxeq\)₭\approxeq₭₸\approxeq₸
\arccos₮\arccos x₮\(\arccos x\)₭\arccos x₭₸\arccos x₸
\arcctg₮\arcctg x₮Not supported₭\arcctg x₭Not supported
\arcsin₮\arcsin x₮\(\arcsin x\)₭\arcsin x₭₸\arcsin x₸
\arctan₮\arctan x₮\(\arctan x\)₭\arctan x₭₸\arctan x₸
\arctg₮\arctg x₮Not supported₭\arctg x₭Not supported
\arg₮\arg₮\(\arg\)₭\arg₭₸\arg₸
\argmax₮\begin{matrix}\argmax x \\ \argmax_y x \\\argmax\limits_y x\end{matrix}₮Not supported₭\begin{matrix}\argmax x \\ \argmax_y x \\\argmax\limits_y x\end{matrix}₭Not supported
\argmin₮\argmin₮Not supported₭\argmin₭Not supported
{array}₮\begin{array}{cc}a&b\\c&d\end{array}₮\(\begin{array}{cc}a&b\\c&d\end{array}\)₭\begin{array}{cc}a&b\\c&d\end{array}₭₸\begin{array}{cc}a&b\\c&d\end{array}₸\begin{array}{cc}
   a & b \\
   c & d
\end{array}
{array}
with lines
₮\begin{array}{c|c:c}a & b & c \\ \hline d & e & f \\ \hdashline g & h & i\end{array}₮\(\begin{array}{c|c:c}a & b & c \\ \hline d & e & f \\ \hdashline g & h & i\end{array}\)₭\begin{array}{c|c:c}a & b & c \\ \hline d & e & f \\ \hdashline g & h & i\end{array}₭Not supported\begin{array}{c|c:c}
a & b & c \\ \hline
d & e & f\\
\hdashline g & h & i
\end{array}
\arrayNot supported\(\array{ a & b+1 \\ c+1 & d }\)Not supported₸\array{ a & b+1 \\ c+1 & d }₸\array{ a & b+1 \\ c+1 & d }
\arraystretchNot supported\(\def\arraystretch{1.5}\begin{array}{cc}a&b\\c&d\end{array}\)₭\def\arraystretch{1.5}\begin{array}{cc}a&b\\c&d\end{array}₭₸\def\arraystretch{1.5}\begin{array}{cc}a&b\\c&d\end{array}₸\def\arraystretch{1.5}
\begin{array}{cc}
   a & b \\
   c & d
\end{array}
\ArrowvertNot supported\(\Arrowvert\)Not supportedNot supported
\arrowvertNot supported\(\arrowvert\)Not supportedNot supported
\ast₮\ast₮\(\ast\)₭\ast₭₸\ast₸
\astrosun₮\astrosun₮Not supportedNot supportedNot supported
\asymp₮\asymp₮\(\asymp\)₭\asymp₭₸\asymp₸
\atop₮{a \atop b}₮\({a \atop b}\)₭{a \atop b}₭₸{a \atop b}₸{a \atop b}
\atopwithdelimsNot supported\(a \atopwithdelims [ ] b\)Not supportedNot supporteda \atopwithdelims [ ] b
- -

B

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
\backepsilon₮\backepsilon₮\(\backepsilon\)₭\backepsilon₭₸\backepsilon₸
\backprime₮\backprime₮\(\backprime\)₭\backprime₭Not supported
\backdprime₮\backdprime₮Not supportedNot supportedNot supported
\backtrprime₮\backtrprime₮Not supportedNot supportedNot supported
\backsim₮\backsim₮\(\backsim\)₭\backsim₭₸\backsim₸
\backsimeq₮\backsimeq₮\(\backsimeq\)₭\backsimeq₭₸\backsimeq₸
\backslash₮\backslash₮\(\backslash\)₭\backslash₭₸\backslash₸
\ballotx₮\ballotx₮Not supportedNot supportedNot supported
\bar₮\bar{y}₮\(\bar{y}\)₭\bar{y}₭₸\bar{y}₸\bar{y}
\barcap₮\barcap₮Not supportedNot supportedNot supported
\barcup₮\barcup₮Not supportedNot supportedNot supported
\barvee₮\barvee₮Not supportedNot supportedNot supported
\barwedge₮\barwedge₮\(\barwedge\)₭\barwedge₭₸\barwedge₸
\Bbb₮\Bbb{ABC}₮\(\Bbb{ABC}\)₭\Bbb{ABC}₭Not supported\Bbb{ABC}
\Bbbk₮\Bbbk₮\(\Bbbk\)₭\Bbbk₭Not supported
\bboxNot supportedRequires extensionNot supportedNot supported
\bcancel₮\bcancel{5}₮\(\bcancel{5}\)₭\bcancel{5}₭Not supported\bcancel{5}
\because₮\because₮\(\because\)₭\because₭₸\because₸
\begin₮\begin{matrix} a & b\\ c & d\end{matrix}₮\(\begin{matrix} a & b\\ c & d\end{matrix}\)₭\begin{matrix} a & b\\ c & d\end{matrix}₭₸\begin{matrix} a & b\\ c & d\end{matrix}₸\begin{matrix}
   a & b \\
   c & d
\end{matrix}
\begingroup₮\begingroup a \endgroup₮\(\begingroup a \endgroup\)₭\begingroup a \endgroup₭Not supported\begingroup a\endgroup
\Beta₮\Beta₮\(\Beta\)₭\Beta₭₸\Beta₸
\beta₮\beta₮\(\beta\)₭\beta₭₸\beta₸
\beth₮\beth₮\(\beth\)₭\beth₭₸\beth₸
\between₮\between₮\(\between\)₭\between₭₸\between₸
\bf₮\bf AaBb12₮\(\bf AaBb12\)₭\bf AaBb12₭Not supported\bf AaBb12
\big₮\big(\big)₮\(\big(\big)\)₭\big(\big)₭₸\big(\big)₸\big(\big)
\Big₮\Big(\Big)₮\(\Big(\Big)\)₭\Big(\Big)₭₸\Big(\Big)₸\Big(\Big)
\bigcap₮\bigcap_0^n x \; \displaystyle \bigcap_0^n x₮\(\bigcap_0^n x \; \displaystyle \bigcap_0^n x\)₭\bigcap_0^n x \; \displaystyle \bigcap_0^n x₭₸\bigcap₸
\bigcirc₮\bigcirc₮\(\bigcirc\)₭\bigcirc₭₸\bigcirc₸
\bigcup₮\bigcup_0^n x \; \displaystyle \bigcup_0^n x₮\(\bigcup_0^n x \; \displaystyle \bigcup_0^n x\)₭\bigcup_0^n x \; \displaystyle \bigcup_0^n x₭₸\bigcup₸
\bigg₮\bigg(\bigg)₮\(\bigg(\bigg)\)₭\bigg(\bigg)₭₸\bigg(\bigg)₸\bigg(\bigg)
\Bigg₮\Bigg(\Bigg)₮\(\Bigg(\Bigg)\)₭\Bigg(\Bigg)₭₸\Bigg(\Bigg)₸\Bigg(\Bigg)
\biggl₮\biggl(₮\(\biggl(\)₭\biggl(₭₸\biggl(₸\biggl(
\Biggl₮\Biggl(₮\(\Biggl(\)₭\Biggl(₭₸\Biggl(₸\Biggl(
\biggm₮\biggm\vert₮\(\biggm\vert\)₭\biggm\vert₭₸\biggm\vert₸\biggm\vert
\Biggm₮\Biggm\vert₮\(\Biggm\vert\)₭\Biggm\vert₭₸\Biggm\vert₸\Biggm\vert
\biggr₮\biggr)₮\(\biggr)\)₭\biggr)₭₸\biggr)₸\biggr)
\Biggr₮\Biggr)₮\(\Biggr)\)₭\Biggr)₭₸\Biggr)₸\Biggr)
\bigl₮\bigl(₮\(\bigl(\)₭\bigl(₭₸\bigl(₸\bigl(
\Bigl₮\Bigl(₮\(\Bigl(\)₭\Bigl(₭₸\Bigl(₸\Bigl(
\bigm₮\bigm\vert₮\(\bigm\vert\)₭\bigm\vert₭₸\bigm\vert₸\bigm\vert
\Bigm₮\Bigm\vert₮\(\Bigm\vert\)₭\Bigm\vert₭₸\Bigm\vert₸\Bigm\vert
\bigodot₮\bigodot_0^n x \; \displaystyle \bigodot_0^n x₮\(\bigodot_0^n x \; \displaystyle \bigodot_0^n x\)₭\bigodot_0^n x \; \displaystyle \bigodot_0^n x₭₸\bigodot₸
\bigominusNot supportedNot supportedNot supported₸\bigominus₸
\bigoplus₮\bigoplus_0^n x \; \displaystyle \bigoplus_0^n x₮\(\bigoplus_0^n x \; \displaystyle \bigoplus_0^n x\)₭\bigoplus_0^n x \; \displaystyle \bigoplus_0^n x₭₸\bigoplus₸
\bigoslashNot supportedNot supportedNot supported₸\bigoslash₸
\bigotimes₮\bigotimes_0^n x \; \displaystyle \bigotimes_0^n x₮\(\bigotimes_0^n x \; \displaystyle \bigotimes_0^n x\)₭\bigotimes_0^n x \; \displaystyle \bigotimes_0^n x₭₸\bigotimes₸
\bigr₮\bigr)₮\(\bigr)\)₭\bigr)₭₸\bigr)₸\bigr)
\Bigr₮\Bigr)₮\(\Bigr)\)₭\Bigr)₭₸\Bigr)₸\Bigr)
\bigtimes₮\bigtimes₮Not supportedNot supported₸\bigtimes₸
\bigsqcapNot supportedNot supportedNot supported₸\bigsqcap₸
\bigsqcup₮\bigsqcup_0^n x \; \displaystyle \bigsqcup_0^n x₮\(\bigsqcup_0^n x \; \displaystyle \bigsqcup_0^n x\)₭\bigsqcup_0^n x \; \displaystyle \bigsqcup_0^n x₭₸\bigsqcup₸
\bigstar₮\bigstar₮\(\bigstar\)₭\bigstar₭₸\bigstar₸
\bigtriangledown₮\bigtriangledown₮\(\bigtriangledown\)₭\bigtriangledown₭₸\bigtriangledown₸
\bigtriangleup₮\bigtriangleup₮\(\bigtriangleup\)₭\bigtriangleup₭₸\bigtriangleup₸
\biguplus₮\biguplus_0^n x \; \displaystyle \biguplus_0^n x₮\(\biguplus_0^n x \; \displaystyle \biguplus_0^n x\)₭\biguplus_0^n x \; \displaystyle \biguplus_0^n x₭₸\biguplus₸
\bigvee₮\bigvee_0^n x \; \displaystyle \bigvee_0^n x₮\(\bigvee_0^n x \; \displaystyle \bigvee_0^n x\)₭\bigvee_0^n x \; \displaystyle \bigvee_0^n x₭₸\bigvee₸
\bigwedge₮\bigwedge_0^n x \; \displaystyle \bigwedge_0^n x₮\(\bigwedge_0^n x \; \displaystyle \bigwedge_0^n x\)₭\bigwedge_0^n x \; \displaystyle \bigwedge_0^n x₭₸\bigwedge₸
\binom₮\binom n k₮\(\binom n k\)₭\binom n k₭₸\binom n k₸\binom n k
\blackhourglass₮\blackhourglass₮Not supportedNot supportedNot supported
\blacklozenge₮\blacklozenge₮\(\blacklozenge\)₭\blacklozenge₭₸\blacklozenge₸
\blacksquare₮\blacksquare₮\(\blacksquare\)₭\blacksquare₭₸\blacksquare₸
\blacktriangle₮\blacktriangle₮\(\blacktriangle\)₭\blacktriangle₭₸\blacktriangle₸
\blacktriangledown₮\blacktriangledown₮\(\blacktriangledown\)₭\blacktriangledown₭₸\blacktriangledown₸
\blacktriangleleft₮\blacktriangleleft₮\(\blacktriangleleft\)₭\blacktriangleleft₭₸\blacktriangleleft₸
\blacktriangleright₮\blacktriangleright₮\(\blacktriangleright\)₭\blacktriangleright₭₸\blacktriangleright₸
\bm₮\bm{AaBb}₮Not supported₭\bm{AaBb}₭Not supported\bm{AaBb}
{Bmatrix}₮\begin{Bmatrix}a&b\\c&d\end{Bmatrix}₮\(\begin{Bmatrix}a&b\\c&d\end{Bmatrix}\)₭\begin{Bmatrix}a&b\\c&d\end{Bmatrix}₭₸\begin{Bmatrix}a&b\\c&d\end{Bmatrix}₸\begin{Bmatrix}
   a & b \\
   c & d
\end{Bmatrix}
{bmatrix}₮\begin{bmatrix}a&b\\c&d\end{bmatrix}₮\(\begin{bmatrix}a&b\\c&d\end{bmatrix}\)₭\begin{bmatrix}a&b\\c&d\end{bmatrix}₭₸\begin{bmatrix}a&b\\c&d\end{bmatrix}₸\begin{bmatrix}
   a & b \\
   c & d
\end{bmatrix}
\bmod₮a \bmod b₮\(a \bmod b\)₭a \bmod b₭Not supporteda \bmod b
\bold₮\bold{AaBb123}₮\(\bold{AaBb123}\)₭\bold{AaBb123}₭Not supported\bold{AaBb123}
\boldsymbol₮\boldsymbol{AaBb0}₮\(\boldsymbol{AaBb0}\)₭\boldsymbol{AaBb0}₭₸\boldsymbol{AaBb0}₸\boldsymbol{AaBb0}
\bot₮\bot₮\(\bot\)₭\bot₭₸\bot₸
\Bot₮\Bot₮Not supportedNot supportedNot supported
\bowtie₮\bowtie₮\(\bowtie\)₭\bowtie₭₸\bowtie₸
\Box₮\Box₮\(\Box\)₭\Box₭₸\Box₸
\boxast₮\boxast₮Not supportedNot supportedNot supported
\boxbox₮\boxbox₮Not supportedNot supportedNot supported
\boxcircle₮\boxcircle₮Not supportedNot supportedNot supported
\boxdot₮\boxdot₮\(\boxdot\)₭\boxdot₭₸\boxdot₸
\boxed₮\boxed{ab}₮\(\boxed{ab}\)₭\boxed{ab}₭₸\boxed{ab}₸\boxed{ab}
\boxminus₮\boxminus₮\(\boxminus\)₭\boxminus₭₸\boxminus₸
\boxplus₮\boxplus₮\(\boxplus\)₭\boxplus₭₸\boxplus₸
\boxtimes₮\boxtimes₮\(\boxtimes\)₭\boxtimes₭₸\boxtimes₸
\Bra₮\Bra{\psi}₮Requires extension₭\Bra{\psi}₭Not supported\Bra{\psi}
\bra₮\bra{\psi}₮Requires extension₭\bra{\psi}₭Not supported\bra{\psi}
\brace₮{n\brace k}₮\({n\brace k}\)₭{n\brace k}₭Not supported{n\brace k}
\brack₮{n\brack k}₮\({n\brack k}\)₭{n\brack k}₭Not supported{n\brack k}
\braket₮\braket{\phi|\psi}₮Not supported₭\braket{\phi|\psi}₭Not supported\braket{\phi|\psi}
\Braket₮\Braket{ϕ|\frac{∂^2}{∂ t^2}|ψ}₮Requires extenstionNot supportedNot supported\Braket{ϕ|\frac{∂^2}{∂ t^2}|ψ}
\breve₮\breve{eu}₮\(\breve{eu}\)₭\breve{eu}₭Not supported\breve{eu}
\buildrelNot supported\(\buildrel \rm def \over {:=}\)Not supported₸\buildrel \rm def \over {:=}₸\buildrel \rm def \over {:=}
\bull₮\bull₮\(\bull\)₭\bull₭Not supported
\bullet₮\bullet₮\(\bullet\)₭\bullet₭₸\bullet₸
\Bumpeq₮\Bumpeq₮\(\Bumpeq\)₭\Bumpeq₭₸\Bumpeq₸
\bumpeq₮\bumpeq₮\(\bumpeq\)₭\bumpeq₭₸\bumpeq₸
- -

C

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
\CNot supported\(\C\)Not supportedNot supportedDeprecated
\c₮\text{\c{c}}₮Not supported₭\text{\c{c}}₭Not supported\text{\c{c}}
\cal₮\cal ABC₮Not supported₭\cal ABC₭Not supported\cal ABC
\cancel₮\cancel{5}₮\(\cancel{5}\)₭\cancel{5}₭Not supported\cancel{5}
\cancelto₮\cancelto{0}{x}₮Not supportedNot supportedNot supported
\Cap₮\Cap₮\(\Cap\)₭\Cap₭₸\Cap₸
\cap₮\cap₮\(\cap\)₭\cap₭₸\cap₸
\capbarcup₮\capbarcup₮Not supportedNot supportedNot supported
\capdot₮\capdot₮Not supportedNot supportedNot supported
\capovercup₮\capovercup₮Not supportedNot supportedNot supported
{cases}₮\begin{cases}a&\text{if }b\\c&\text{if }d\end{cases}₮\(\begin{cases}a&\text{if }b\\c&\text{if }d\end{cases}\)₭\begin{cases}a&\text{if }b\\c&\text{if }d\end{cases}₭₸\begin{cases}a&\text{if }b\\c&\text{if }d\end{cases}₸\begin{cases}
   a &\text{if } b \\
   c &\text{if } d
\end{cases}
\casesNot supported\(\cases{ x & \text{if } x\ge 0\\ -x & \text{if } x\lt 0}\)Not supported₸\cases{ x & \text{if } x\ge 0\\ -x & \text{if } x\lt 0}₸\cases{x & \text{if } x\ge 0\\
- -x & \text{if } x\lt 0} -
{CD}₮₮\begin{CD} A @>a>> B\\@VbVV @AAcA \\ C @= D\end{CD}₮₮\(\begin{CD} A @>a>> B\\@VbVV @AAcA \\ C @= D\end{CD}\)₭₭\begin{CD} A @>a>> B\\@VbVV @AAcA \\ C @= D\end{CD}₭₭Not supported
\cdot₮\cdot₮\(\cdot\)₭\cdot₭₸\cdot₸
\cdotp₮\cdotp₮\(\cdotp\)₭\cdotp₭₸\cdotp₸
\cdots₮\cdots₮\(\cdots\)₭\cdots₭₸\cdots₸
\ce₮\ce{A\bond{~}B\bond{~-}C}₮\(\ce{A\bond{~}B\bond{~-}C}\)₭\ce{A\bond{~}B\bond{~-}C}₭Not supported\ce{A\bond{~}B\bond{~-}C}
Requires `mhchem` extension
\ceeNot supported\(\cee{C6H5-CHO}\)Not supportedNot supportedDeprecated by mhchem
\cent₮\cent₮Not supportedNot supportedNot supported
\centerdot₮a\centerdot b₮\(a\centerdot b\)₭a\centerdot b₭Not supportedIn LaTeX, \centerdot is a small
square on the baseline, not
a centered dot.
\cfNot supported\(\cf{C6H5-CHO}\)Not supportedNot supportedDeprecated by mhchem
\cfrac₮\cfrac{2}{1+\cfrac{2}{1+\cfrac{2}{1}}}₮\(\cfrac{2}{1+\cfrac{2}{1+\cfrac{2}{1}}}\)₭\cfrac{2}{1+\cfrac{2}{1+\cfrac{2}{1}}}₭Not supported\cfrac{2}{1+\cfrac{2}{1+\cfrac{2}{1}}}
\char₮\char"263a₮Not supported
See \unicode
₭\char"263a₭Not supported\char"263a
\check₮\check{oe}₮\(\check{oe}\)₭\check{oe}₭₸\check{oe}₸\check{oe}
\ch₮\ch₮Not supported₭\ch₭Not supported
\checkmark₮\checkmark₮\(\checkmark\)₭\checkmark₭Not supported
\Chi₮\Chi₮\(\Chi\)₭\Chi₭Not supported
\chi₮\chi₮\(\chi\)₭\chi₭₸\chi₸
\choose₮{n+1 \choose k+2}₮\({n+1 \choose k+2}\)₭{n+1 \choose k+2}₭₸{n+1 \choose k+2}₸{n+1 \choose k+2}
\circ₮\circ₮\(\circ\)₭\circ₭₸\circ₸
\circeq₮\circeq₮\(\circeq\)₭\circeq₭₸\circeq₸
\circlearrowleft₮\circlearrowleft₮\(\circlearrowleft\)₭\circlearrowleft₭₸\circlearrowleft₸
\circlearrowright₮\circlearrowright₮\(\circlearrowright\)₭\circlearrowright₭₸\circlearrowright₸
\circledast₮\circledast₮\(\circledast\)₭\circledast₭₸\circledast₸
\circledcirc₮\circledcirc₮\(\circledcirc\)₭\circledcirc₭₸\circledcirc₸
\circleddash₮\circleddash₮\(\circleddash\)₭\circleddash₭₸\circleddash₸
\circledequal₮\circledequal₮Not supportedNot supportedNot supported
\circledparallel₮\circledparallel₮Not supportedNot supportedNot supported
\circledR₮\circledR₮\(\circledR\)₭\circledR₭Not supported
\circledS₮\circledS₮\(\circledS\)₭\circledS₭Not supported
\circledvert₮\circledvert₮Not supportedNot supportedNot supported
\circlehbar₮\circlehbar₮Not supportedNot supportedNot supported
\class₮ab\class{mathHighlight}{cdef}gh₮Not supportedNot supportedNot supportedab\class{mathHighlight}{cdef}gh
\clineNot supportedNot supportedNot supportedNot supported
\closedvarcap₮\closedvarcap₮Not supportedNot supportedNot supported
\closedvarcup₮\closedvarcup₮Not supportedNot supportedNot supported
\clubs₮\clubs₮\(\clubs\)₭\clubs₭Not supported
\clubsuit₮\clubsuit₮\(\clubsuit\)₭\clubsuit₭₸\clubsuit₸
\cnums₮\cnums₮\(\cnums\)₭\cnums₭Not supported
\coh₮\coh₮Not supportedNot supportedNot supported
\colon₮\colon₮\(\colon\)₭\colon₭₸\colon₸
\Colonapprox₮\Colonapprox₮Not supported₭\Colonapprox₭₸\Colonapprox₸
\colonapprox₮\colonapprox₮Not supported₭\colonapprox₭₸\colonapprox₸
\Coloneq₮\Coloneq₮Not supported₭\Coloneq₭₸\Coloneq₸
\coloneq₮\coloneq₮Not supported₭\coloneq₭₸\coloneq₸
\Coloneqq₮\Coloneqq₮Not supported₭\Coloneqq₭₸\Coloneqq₸
\coloneqq₮a \coloneqq b₮Not supported₭a \coloneqq b₭₸a \coloneqq b₸
\Colonsim₮\Colonsim₮Not supported₭\Colonsim₭₸\Colonsim₸
\colonsim₮\colonsim₮Not supported₭\colonsim₭₸\colonsim₸
\color₮\color{#0000FF} AaBb123₮\(\color{#0000FF} AaBb123\)₭\color{#0000FF} AaBb123₭₸\color{#0000FF} AaBb123₸\color{#0000FF} AaBb123
\colorbox₮\colorbox{red}{Black on red}₮\(\colorbox{red}{Black on red}\)₭\colorbox{red}{Black on red}₭₸\colorbox{red}{Black on red}₸\colorbox{red}{Black on red}
\complement₮\complement₮\(\complement\)₭\complement₭₸\complement₸
\Complex₮\Complex₮\(\Complex\)₭\Complex₭Not supported
\concavediamond₮\concavediamond₮Not supportedNot supportedNot supported
\concavediamondtickleft₮\concavediamondtickleft₮Not supportedNot supportedNot supported
\concavediamondtickright₮\concavediamondtickright₮Not supportedNot supportedNot supported
\cong₮\cong₮\(\cong\)₭\cong₭₸\cong₸
\Coppa₮\Coppa₮Not supportedNot supportedNot supported
\coppa₮\coppa₮Not supportedNot supportedNot supported
\coprod₮\coprod_0^n x \; \displaystyle \coprod_0^n x₮\(\coprod_0^n x \; \displaystyle \coprod_0^n x\)₭\coprod_0^n x \; \displaystyle \coprod_0^n x₭₸\coprod₸
\copyright₮\copyright₮Not supported₭\copyright₭Not supported
\cos₮\cos x₮\(\cos x\)₭\cos x₭₸\cos x₸
\cosec₮\cosec x₮Not supported₭\cosec x₭Not supported
\cosh₮\cosh x₮\(\cosh x\)₭\cosh x₭₸\cosh x₸
\cot₮\cot x₮\(\cot x\)₭\cot x₭₸\cot x₸
\cotg₮\cotg x₮Not supported₭\cotg x₭Not supported
\coth₮\coth x₮\(\coth x\)₭\coth x₭₸\coth x₸
\cr₮\begin{matrix} a & b\cr c & d \end{matrix}₮\(\begin{matrix} a & b\\ c & d \end{matrix}\)₭\begin{matrix} a & b\\ c & d \end{matrix}₭₸\begin{matrix} a & b\\ c & d \end{matrix}₸\begin{matrix}
   a & b \cr
   c & d
\end{matrix}
\csc₮\csc x₮\(\csc x\)₭\csc x₭₸\csc x₸
\cssIdNot supportedNot supportedNot supported
\ctg₮\ctg x₮Not supported₭\ctg x₭Not supported
\cth₮\cth x₮Not supported₭\cth x₭Not supported
\Cup₮\Cup₮\(\Cup\)₭\Cup₭₸\Cup₸
\cup₮\cup₮\(\cup\)₭\cup₭₸\cup₸
\cupovercap₮\cupovercap₮Not supportedNot supportedNot supported
\curlyeqprec₮\curlyeqprec₮\(\curlyeqprec\)₭\curlyeqprec₭₸\curlyeqprec₸
\curlyeqsucc₮\curlyeqsucc₮\(\curlyeqsucc\)₭\curlyeqsucc₭₸\curlyeqsucc₸
\curlyvee₮\curlyvee₮\(\curlyvee\)₭\curlyvee₭₸\curlyvee₸
\curlywedge₮\curlywedge₮\(\curlywedge\)₭\curlywedge₭₸\curlywedge₸
\curvearrowleft₮\curvearrowleft₮\(\curvearrowleft\)₭\curvearrowleft₭₸\curvearrowleft₸
\curvearrowright₮\curvearrowright₮\(\curvearrowright\)₭\curvearrowright₭₸\curvearrowright₸
- -

D

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
\dag₮\dag₮Not supported₭\dag₭Not supported
\Dagger₮\Dagger₮\(\Dagger\)₭\Dagger₭Not supported
\dagger₮\dagger₮\(\dagger\)₭\dagger₭₸\dagger₸
\daleth₮\daleth₮\(\daleth\)₭\daleth₭₸\daleth₸
\Darr₮\Darr₮\(\Darr\)₭\Darr₭Not supported
\dArr₮\dArr₮\(\dArr\)₭\dArr₭Not supported
\darr₮\darr₮\(\darr\)₭\darr₭₸\darr₸
{darray}₮\begin{array}{cc}a & b\\c & d\end{array}₮\(\begin{array}{cc}a & b\\c & d\end{array}\)₭\begin{array}{cc}a & b\\c & d\end{array}₭₸\begin{array}{cc}a & b\\c & d\end{array}₸\begin{darray}{cc}
   a & b \\
   c & d
\end{darray}
\dashleftarrow₮\dashleftarrow₮\(\dashleftarrow\)₭\dashleftarrow₭₸\dashleftarrow₸
\dashrightarrow₮\dashrightarrow₮\(\dashrightarrow\)₭\dashrightarrow₭₸\dashrightarrow₸
\dashv₮\dashv₮\(\dashv\)₭\dashv₭₸\dashv₸
\dbinom₮\dbinom n k₮\(\dbinom n k\)₭\dbinom n k₭Not supported\dbinom n k
\dblcolon₮\dblcolon₮Not supported₭\dblcolon₭₸\dblcolon₸
{dcases}₮\begin{dcases}a&\text{if }b\\c&\text{if }d\end{dcases}₮Not supported₭\begin{dcases}a&\text{if }b\\c&\text{if }d\end{dcases}₭₸\begin{dcases}a&\text{if }b\\c&\text{if }d\end{dcases}₸\begin{dcases}
   a &\text{if } b \\
   c &\text{if } d
\end{dcases}
\ddag₮\ddag₮Not supported₭\ddag₭Not supported
\ddagger₮\ddagger₮\(\ddagger\)₭\ddagger₭₸\ddagger₸
\ddddot₮\ddddot x₮Not supportedNot supported₸\ddddot x₸
\dddot₮\dddot x₮Not supportedNot supported₸\dddot x₸
\ddot₮\ddot x₮\(\ddot x\)₭\ddot x₭₸\ddot x₸\ddot x
\ddots₮\ddots₮\(\ddots\)₭\ddots₭₸\ddots₸
\DeclareMathOperatorNot supported\(\DeclareMathOperator - {\myOp}{myOp} - \myOp(x)\) - Not supportedNot supported
\def₮\def\foo{x^2} \foo + \foo₮\(\def\foo{x^2} \foo + \foo\)₭\def\foo{x^2} \foo + \foo₭Not supported\def\foo{x^2} \foo + \foo
\definecolor₮\definecolor{sortaGreen}{RGB}{128,128,0} \color{sortaGreen} F=ma₮Not supportedNot supportedNot supported
\deg₮\deg x₮\(\deg x\)₭\deg x₭₸\deg x₸
\degree₮\degree₮Not supported₭\degree₭₸\degree₸
\delta₮\delta₮\(\delta\)₭\delta₭₸\delta₸
\Delta₮\Delta₮\(\Delta\)₭\Delta₭₸\Delta₸
\det₮\begin{matrix}\det x \\ \det_y x \\\det\limits_y x\end{matrix}₮\(\begin{matrix}\det x \\ \det_y x \\\det\limits_y x\end{matrix}\)₭\begin{matrix}\det x \\ \det_y x \\\det\limits_y x\end{matrix}₭₸\det₸
\DigammaNot supported\(\Digamma\)Not supportedNot supported
\digamma₮\digamma₮\(\digamma\)₭\digamma₭₸\digamma₸
\dfrac₮\dfrac{a-1}{b-1}₮\(\dfrac{a-1}{b-1}\)₭\dfrac{a-1}{b-1}₭Not supported\dfrac{a-1}{b-1}
\diagdown₮\diagdown₮\(\diagdown\)₭\diagdown₭Not supported
\diagup₮\diagup₮\(\diagup\)₭\diagup₭Not supported
\diameter₮\diameter₮Not supportedNot supportedNot supported
\Diamond₮\Diamond₮\(\Diamond\)₭\Diamond₭₸\Diamond₸
\diamond₮\diamond₮\(\diamond\)₭\diamond₭₸\diamond₸
\diamonds₮\diamonds₮\(\diamonds\)₭\diamonds₭Not supported
\diamondsuit₮\diamondsuit₮\(\diamondsuit\)₭\diamondsuit₭₸\diamondsuit₸
\dim₮\dim x₮\(\dim x\)₭\dim x₭₸\dim x₸
\displaylinesNot supported\(\displaylines{a\\ a+b=c+d}\)Not supported₸\displaylines{a\\ a+b=c+d}₸\displaylines{a\\ a+b=c+d}
\displaystyle₮\displaystyle\sum_0^n₮\(\displaystyle\sum_0^n\)₭\displaystyle\sum_0^n₭₸\displaystyle\sum_0^n₸\displaystyle\sum_0^n
\div₮\div₮\(\div\)₭\div₭₸\div₸
\divideontimes₮\divideontimes₮\(\divideontimes\)₭\divideontimes₭₸\divideontimes₸
\doublebarvee₮\doublebarvee₮Not supportedNot supportedNot supported
\dot₮\dot x₮\(\dot x\)₭\dot x₭₸\dot x₸\dot x
\Doteq₮\Doteq₮\(\Doteq\)₭\Doteq₭₸\Doteq₸
\doteq₮\doteq₮\(\doteq\)₭\doteq₭₸\doteq₸
\doteqdot₮\doteqdot₮\(\doteqdot\)₭\doteqdot₭₸\doteqdot₸
\dotminus₮\dotminus₮Not supportedNot supported₸\dotminus₸
\dotplus₮\dotplus₮\(\dotplus\)₭\dotplus₭₸\dotplus₸
\dots₮x_1 + \dots + x_n₮\(x_1 + \dots + x_n\)₭x_1 + \dots + x_n₭₸x_1 + \dots + x_n₸x_1 + \dots + x_n
\dotsb₮x_1 +\dotsb + x_n₮\(x_1 +\dotsb + x_n\)₭x_1 +\dotsb + x_n₭Not supportedx_1 +\dotsb + x_n
\dotsc₮x,\dotsc,y₮\(x,\dotsc,y\)₭x,\dotsc,y₭Not supportedx,\dotsc,y
\dotsi₮\int_{A_1}\int_{A_2}\dotsi₮\(\int_{A_1}\int_{A_2}\dotsi\)₭\int_{A_1}\int_{A_2}\dotsi₭Not supported\int_{A_1}\int_{A_2}\dotsi
\dotsm₮x_1 x_2 \dotsm x_n₮\(x_1 x_2 \dotsm x_n\)₭x_1 x_2 \dotsm x_n₭Not supportedx_1 x_2 \dotsm x_n
\dotso₮\dotso₮\(\dotso\)₭\dotso₭Not supported
\doublebarwedge₮\doublebarwedge₮\(\doublebarwedge\)₭\doublebarwedge₭₸\doublebarwedge₸
\doublecap₮\doublecap₮\(\doublecap\)₭\doublecap₭Not supported
\doublecup₮\doublecup₮\(\doublecup\)₭\doublecup₭Not supported
\Downarrow₮\Downarrow₮\(\Downarrow\)₭\Downarrow₭₸\Downarrow₸
\downarrow₮\downarrow₮\(\downarrow\)₭\downarrow₭₸\downarrow₸
\downdownarrows₮\downdownarrows₮\(\downdownarrows\)₭\downdownarrows₭₸\downdownarrows₸
\downharpoonleft₮\downharpoonleft₮\(\downharpoonleft\)₭\downharpoonleft₭₸\downharpoonleft₸
\downharpoonright₮\downharpoonright₮\(\downharpoonright\)₭\downharpoonright₭₸\downharpoonright₸
\dprime₮\dprime₮Not supportedNot supportedNot supported
{drcases}₮\begin{drcases}a&\text{if }b\\c&\text{if }d\end{drcases}₮Not supported₭\begin{drcases}a&\text{if }b\\c&\text{if }d\end{drcases}₭₸\begin{drcases}a&\text{if }b\\c&\text{if }d\end{drcases}₸\begin{drcases}
   a&\text{if }b\\
   c&\text{if }d
\end{drcases}
- -

E

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
\Earth₮\Earth₮Not supportedNot supportedNot supported
\ell₮\ell₮\(\ell\)₭\ell₭₸\ell₸
\elseNot supportedNot supportedNot supportedNot supported
\empty₮\empty₮\(\empty\)₭\empty₭₸\empty₸
\emptyset₮\emptyset₮\(\emptyset\)₭\emptyset₭₸\emptyset₸
\encloseNot supported
See \angl
\(\enclose{longdiv}{500}\)
\(\enclose{actuarial}{500}\)
\(\enclose{phasorangle}{500}\)
Not supportedNot supported\enclose{longdiv}{500}
\enclose{actuarial}{500}
\enclose{phasorangle}{500}
Non-standard
\end₮\begin{matrix} a & b\\ c & d\end{matrix}₮\(\begin{matrix} a & b\\ c & d\end{matrix}\)₭\begin{matrix} a & b\\ c & d\end{matrix}₭₸\begin{matrix} a & b\\ c & d\end{matrix}₸\begin{matrix}
   a & b \\
   c & d
\end{matrix}
\endgroup₮\begingroup a \endgroup₮\(\begingroup a \endgroup\)₭\begingroup a \endgroup₭Not supported\begingroup a\endgroup
\enspace₮a\enspace b₮\(a\enspace b\)₭a\enspace b₭Not supporteda\enspace b
\Epsilon₮\Epsilon₮\(\Epsilon\)₭\Epsilon₭Not supported
\epsilon₮\epsilon₮\(\epsilon\)₭\epsilon₭₸\epsilon₸
\eqalignNot supported\(\eqalign{3x - 4y &= 5\\x + 7 &= -2y}\)Not supported₸\eqalign{3x - 4y &= 5\\x + 7 &= -2y}₸
\eqalignnoNot supported\(\eqalignno{3x - 4y &= 5 &(\dagger) \\ x + 7 &= -2y &(\ddagger)\\ z &= 2}\)Not supportedNot supported
\eqcirc₮\eqcirc₮\(\eqcirc\)₭\eqcirc₭₸\eqcirc₸
\Eqcolon₮\Eqcolon₮Not supported₭\Eqcolon₭₸\Eqcolon₸
\eqcolon₮\eqcolon₮Not supported₭\eqcolon₭₸\eqcolon₸
{equation}₮₮\begin{equation}\label{maxwell}\begin{split}∇·𝐃&=ρ_v \\ ∇·𝐁&=0 \end{split}\end{equation}₮₮\[\begin{equation}\begin{split}∇·𝐃&=ρ_v \\∇·𝐁&=0\end{split}\end{equation}\]₭₭\begin{equation}\begin{split}∇·𝐃&=ρ_v \\∇·𝐁&=0\end{split}\end{equation}₭₭Not supported\begin{equation}
\begin{split}
   ∇·𝐃&=ρ_v \\
   ∇·𝐁&=0
\end{split}
\end{equation}
{equation*}₮₮\begin{equation*}\begin{split}∇·𝐃&=ρ_v \\ ∇·𝐁&=0 \end{split}\end{equation*}₮₮\[\begin{equation*}\begin{split}∇·𝐃&=ρ_v \\∇·𝐁&=0\end{split}\end{equation*}\]₭₭\begin{equation*}\begin{split}∇·𝐃&=ρ_v \\∇·𝐁&=0\end{split}\end{equation*}₭₭Not supported
{eqnarray}Not supported\(\begin{eqnarray} -y &=& (x-1)^2 \\ - &=& (x-1)(x-1) \\ - &=& x^2 - 2x + 1 -\end{eqnarray}\)Not supportedNot supported
{eqnarray*}Not supported\(\begin{eqnarray*} -y &=& (x-1)^2 \\ - &=& (x-1)(x-1) \\ - &=& x^2 - 2x + 1 -\end{eqnarray*}\)Not supportedNot supported
\Eqqcolon₮\Eqqcolon₮Not supported₭\Eqqcolon₭₸\Eqqcolon₸
\eqqcolon₮\eqqcolon₮Not supported₭\eqqcolon₭₸\eqqcolon₸
\eqref₮\eqref{maxwell}₮Not supportedNot supportedNot supported
\eqsim₮\eqsim₮\(\eqsim\)₭\eqsim₭₸\eqsim₸
\eqslantgtr₮\eqslantgtr₮\(\eqslantgtr\)₭\eqslantgtr₭₸\eqslantgtr₸
\eqslantless₮\eqslantless₮\(\eqslantless\)₭\eqslantless₭₸\eqslantless₸
\equiv₮\equiv₮\(\equiv\)₭\equiv₭₸\equiv₸
\Eta₮\Eta₮\(\Eta\)₭\Eta₭₸\Eta₸
\eta₮\eta₮\(\eta\)₭\eta₭₸\eta₸
\eth₮\eth₮\(\eth\)₭\eth₭₸\eth₸
\euro₮\euro₮\(\euro\)Not supportedNot supported
\exist₮\exist₮\(\exist\)₭\exist₭Not supported
\exists₮\exists₮\(\exists\)₭\exists₭₸\exists₸
\exp₮\exp x₮\(\exp x\)₭\exp x₭₸\exp x₸
- -

F

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
\fallingdotseq₮\fallingdotseq₮\(\fallingdotseq\)₭\fallingdotseq₭₸\fallingdotseq₸
\fbox₮\fbox{Hi there!}₮\(\fbox{Hi there!}\)₭\fbox{Hi there!}₭Not supported\fbox{Hi there!}
\fcolorbox₮\fcolorbox{red}{aqua}{A}₮\(\fcolorbox{red}{aqua}{A}\)₭\fcolorbox{red}{aqua}{A}₭Not supported\fcolorbox{red}{aqua}{A}
\female₮\female₮Not supportedNot supportedNot supported\female
\fiNot supportedNot supportedNot supportedNot supported
\Finv₮\Finv₮\(\Finv\)₭\Finv₭Not supported
\flat₮\flat₮\(\flat\)₭\flat₭₸\flat₸
\footnotesize₮\footnotesize footnotesize₮Not supported₭\footnotesize footnotesize₭Not supported\footnotesize footnotesize
\forall₮\forall₮\(\forall\)₭\forall₭₸\forall₸
\fullouterjoin₮\fullouterjoin₮Not supportedNot supportedNot supported
\frac₮\frac{a+b}{c+d}₮\(\frac{a+b}{c+d}\)₭\frac{a+b}{c+d}₭₸\frac{a+b}{c+d}₸\frac{a+b}{c+d}
\frak₮\frak{AaBb}₮\(\frak{AaBb}\)₭\frak{AaBb}₭Not supported\frak{AaBb}
\frown₮\frown₮\(\frown\)₭\frown₭₸\frown₸
- -

G

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
\Game₮\Game₮\(\Game\)₭\Game₭Not supported
\Gamma₮\Gamma₮\(\Gamma\)₭\Gamma₭₸\Gamma₸
\gamma₮\gamma₮\(\gamma\)₭\gamma₭₸\gamma₸
{gather}₮₮\begin{gather}a=b\\e=b+c\end{gather}₮₮\(\begin{gather}a=b\\e=b+c\end{gather}\)₭₭\begin{gather}a=b\\e=b+c\end{gather}₭₭₸\begin{gather}a=b\\e=b+c\end{gather}₸\begin{gather}
   a=b \\
   e=b+c
\end{gather}
{gather*}₮₮\begin{gather*}a=b\\e=b+c\end{gather*}₮₮\(\begin{gather*}a=b\\e=b+c\end{gather*}\)₭₭\begin{gather*}a=b\\e=b+c\end{gather*}₭₭₸\begin{gather*}a=b\\e=b+c\end{gather*}₸\begin{gather*}
   a=b \\
   e=b+c
\end{gather*}
{gathered}₮\begin{gathered}a=b\\e=b+c\end{gathered}₮\(\begin{gathered}a=b\\e=b+c\end{gathered}\)₭\begin{gathered}a=b\\e=b+c\end{gathered}₭₸\begin{gathered}a=b\\e=b+c\end{gathered}₸\begin{gathered}
   a=b \\
   e=b+c
\end{gathered}
\gcd₮\begin{matrix}\gcd x \\ \gcd_y x \\\gcd\limits_y x\end{matrix}₮\(\begin{matrix}\gcd x \\ \gcd_y x \\\gcd\limits_y x\end{matrix}\)₭\begin{matrix}\gcd x \\ \gcd_y x \\\gcd\limits_y x\end{matrix}₭₸\begin{matrix}\gcd x \\ \gcd_y x \\\gcd\limits_y x\end{matrix}₸
\gdefNot supportedNot supported₭\gdef\bar#1{#1^2} \bar{y} + \bar{y}₭Not supported\gdef\bar#1{#1^2} \bar{y} + \bar{y}
\ge₮\ge₮\(\ge\)₭\ge₭₸\ge₸
\geneuroNot supported\(\geneuro\)Not supportedNot supported
\geneuronarrowNot supported\(\geneuronarrow\)Not supportedNot supported
\geneurowideNot supported\(\geneurowide\)Not supportedNot supported
\genfrac₮\genfrac ( ] {2pt}{0}a{a+1}₮\(\genfrac ( ] {2pt}{0}a{a+1}\)₭\genfrac ( ] {2pt}{0}a{a+1}₭Not supported\genfrac ( ] {2pt}{0}a{a+1}
\geq₮\geq₮\(\geq\)₭\geq₭₸\geq₸
\geqq₮\geqq₮\(\geqq\)₭\geqq₭₸\geqq₸
\geqslant₮\geqslant₮\(\geqslant\)₭\geqslant₭₸\geqslant₸
\gets₮\gets₮\(\gets\)₭\gets₭Not supported
\gg₮\gg₮\(\gg\)₭\gg₭₸\gg₸
\ggg₮\ggg₮\(\ggg\)₭\ggg₭₸\ggg₸
\gggtr₮\gggtr₮\(\gggtr\)₭\gggtr₭Not supported
\gimel₮\gimel₮\(\gimel\)₭\gimel₭₸\gimel₸
\globalNot supported\(\global\def\add#1#2{#1+#2} \add 2 3\)₭\global\def\add#1#2{#1+#2} \add 2 3₭Not supported\global\def\add#1#2{#1+#2} \add 2 3
\gnapprox₮\gnapprox₮\(\gnapprox\)₭\gnapprox₭₸\gnapprox₸
\gneq₮\gneq₮\(\gneq\)₭\gneq₭₸\gneq₸
\gneqq₮\gneqq₮\(\gneqq\)₭\gneqq₭₸\gneqq₸
\gnsim₮\gnsim₮\(\gnsim\)₭\gnsim₭₸\gnsim₸
\grave₮\grave{eu}₮\(\grave{eu}\)₭\grave{eu}₭Not supported\grave{eu}
\gt₮a \gt b₮\(a \gt b\)₭a \gt b₭₸a \gt b₸a \gt b
\gtrdot₮\gtrdot₮\(\gtrdot\)₭\gtrdot₭₸\gtrdot₸
\gtrapprox₮\gtrapprox₮\(\gtrapprox\)₭\gtrapprox₭₸\gtrapprox₸
\gtreqless₮\gtreqless₮\(\gtreqless\)₭\gtreqless₭₸\gtreqless₸
\gtreqqless₮\gtreqqless₮\(\gtreqqless\)₭\gtreqqless₭₸\gtreqqless₸
\gtrless₮\gtrless₮\(\gtrless\)₭\gtrless₭₸\gtrless₸
\gtrsim₮\gtrsim₮\(\gtrsim\)₭\gtrsim₭₸\gtrsim₸
\gvertneqq₮\gvertneqq₮\(\gvertneqq\)₭\gvertneqq₭₸\gvertneqq₸
- -

H

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
\H₮\text{\H{a}}₮Not supported₭\text{\H{a}}₭₸\text{\H{a}}₸\text{\H{a}}
\Harr₮\Harr₮\(\Harr\)₭\Harr₭Not supported
\hArr₮\hArr₮Not supported₭\hArr₭Not supported
\harr₮\harr₮\(\harr\)₭\harr₭Not supported
\hat₮\hat{\theta}₮\(\hat{\theta}\)₭\hat{\theta}₭₸\hat{\theta}₸\hat{\theta}
\hbar₮\hbar₮\(\hbar\)₭\hbar₭₸\hbar₸
\hbox₮\hbox{in a box}₮\(\hbox{in a box}\)₭\hbox{in a box}₭Not supported\hbox{in a box}
\hdashline₮\begin{matrix}a&b\\ \hdashline c &d\end{matrix}₮\(\begin{matrix}a&b\\ \hdashline c &d\end{matrix}\)₭\begin{matrix}a&b\\ \hdashline c &d\end{matrix}₭Not supported\begin{matrix}
   a & b \\
   \hdashline
   c & d
\end{matrix}
\hearts₮\hearts₮\(\hearts\)₭\hearts₭Not supported
\heartsuit₮\heartsuit₮\(\heartsuit\)₭\heartsuit₭₸\heartsuit₸
\hfilNot supportedSee \hfillNot supportedNot supported
\hfillNot supported\(\begin{matrix}xxxxxx & xxxxxx & xxxxxx \\ ab & \hfil ab & ab\hfil\\ \end{matrix}\)Not supportedNot supported
\hline₮\begin{matrix}a&b\\ \hline c &d\end{matrix}₮\(\begin{matrix}a&b\\ \hline c &d\end{matrix}\)₭\begin{matrix}a&b\\ \hline c &d\end{matrix}₭Not supported\begin{matrix}
   a & b \\ \hline
   c & d
\end{matrix}
\hourglass₮\hourglass₮Not supportedNot supportedNot supported
\hom₮\hom x₮\(\hom x\)₭\hom x₭₸\hom x₸
\hookleftarrow₮\hookleftarrow₮\(\hookleftarrow\)₭\hookleftarrow₭₸\hookleftarrow₸
\hookrightarrow₮\hookrightarrow₮\(\hookrightarrow\)₭\hookrightarrow₭₸\hookrightarrow₸
\hphantom₮a\hphantom{bc}d₮\(a\hphantom{bc}d\)₭a\hphantom{bc}d₭Not supporteda\hphantom{bc}d
\href₮\href{https://www.mathjax.org/}{\text{MathJax}}₮\(\href{https://MathJax.org/}{\text{MathJax}}\)₭\href{https://MathJax.org/}{\text{MathJax}}₭Not supported\href{https://www.mathjax.org/}{\text{MathJax}}
\hskip₮w\hskip1em i\hskip2em d₮\(w\hskip1em i\hskip2em d\)₭w\hskip1em i\hskip2em d₭Not supportedw\hskip1em i\hskip2em d
\hslash₮\hslash₮\(\hslash\)₭\hslash₭₸\hslash₸
\hspace₮s\hspace7ex k₮\(s\hspace7ex k\)₭s\hspace7ex k₭Not supporteds\hspace7ex k
\htmlClass₮\htmlClass{foo}{x}₮Not supportedNot supportedNot supported\htmlClass{foo}{x}
\htmlData₮\htmlData{foo=a, bar=b}{x}₮Not supportedNot supportedNot supported\htmlData{foo=a, bar=b}{x}
\htmlId₮\htmlId{bar}{x}₮Not supportedNot supportedNot supported\htmlId{bar}{x}
\htmlStyle₮\htmlStyle{color: red;}{x}₮Not supportedNot supportedNot supported\htmlStyle{color: red;}{x}}
\huge₮\huge huge₮\(\huge huge\)₭\huge huge₭Not supported\huge huge
\Huge₮\Huge Huge₮\(\Huge Huge\)₭\Huge Huge₭Not supported\Huge Huge
- -

I

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
\i₮\text{\i}₮Not supported₭\text{\i}₭₸\text{\i}₸\text{\i}
\idotsint₮\idotsint₮Not supportedNot supportedNot supported
\iddotsNot supportedNot supportedNot supportedNot supported
\ifNot supportedNot supportedNot supportedNot supported
\iff₮A\iff B₮\(A\iff B\)₭A\iff B₭₸A\iff B₸A\iff B
\ifmodeNot supportedNot supportedNot supportedNot supported
\ifxNot supportedNot supportedNot supportedNot supported
\iiiintNot supportedNot supportedNot supportedNot supported
\iiint₮\iiint_0^n x \; \displaystyle \iiint_0^n x₮\(\iiint_0^n x \; \displaystyle \iiint_0^n x\)₭\iiint_0^n x \; \displaystyle \iiint_0^n x₭₸\iiint₸
\iint₮\iint_0^n x \; \displaystyle \iint_0^n x₮\(\iint_0^n x \; \displaystyle \iint_0^n x\)₭\iint_0^n x \; \displaystyle \iint_0^n x₭₸\iint₸
\Im₮\Im₮\(\Im\)₭\Im₭₸\Im₸
\image₮\image₮\(\image\)₭\image₭Not supported
\imageof₮\imageof₮Not supported₭\imageof₭Not supported
\imath₮\imath₮\(\imath\)₭\imath₭₸\imath₸
\impliedby₮P\impliedby Q₮\(P\impliedby Q\)₭P\impliedby Q₭₸P\impliedby Q₸P\impliedby Q
\implies₮P\implies Q₮\(P\implies Q\)₭P\implies Q₭₸P\implies Q₸P\implies Q
\in₮\in₮\(\in\)₭\in₭₸\in₸
\includegraphics₮\includegraphics[height=0.8em, totalheight=0.9em, width=0.9em, alt=KA logo]{https://cdn.kastatic.org/images/apple-touch-icon-57x57-precomposed.new.png}₮Not supported₭\includegraphics[height=0.8em, totalheight=0.9em, width=0.9em, alt=KA logo]{https://cdn.kastatic.org/images/apple-touch-icon-57x57-precomposed.new.png}₭Not supported
\incoh₮\incoh₮Not supportedNot supportedNot supported
\inf₮\begin{matrix}\inf x \\ \inf_y x \\\inf\limits_y x\end{matrix}₮\(\begin{matrix}\inf x \\ \inf_y x \\\inf\limits_y x\end{matrix}\)₭\begin{matrix}\inf x \\ \inf_y x \\\inf\limits_y x\end{matrix}₭₸\inf₸
\infin₮\infin₮\(\infin\)₭\infin₭Not supported
\infty₮\infty₮\(\infty\)₭\infty₭₸\infty₸
\injlim₮\begin{matrix}\injlim x \\ \injlim_y x \\\injlim\limits_y x\end{matrix}₮\(\begin{matrix}\injlim x \\ \injlim_y x \\\injlim\limits_y x\end{matrix}\)₭\begin{matrix}\injlim x \\ \injlim_y x \\\injlim\limits_y x\end{matrix}₭Not supported\injlim x
\injlim_y x
\injlim\limits_y x
\int₮\int_0^n x \; \displaystyle \int_0^n x₮\(\int_0^n x \; \displaystyle \int_0^n x\)₭\int_0^n x \; \displaystyle \int_0^n x₭₸\int₸
\intercal₮\intercal₮\(\intercal\)₭\intercal₭₸\intercal₸
\interleave₮\interleave₮Not supportedNot supportedNot supported
\intop₮\intop_0^n x \; \displaystyle \intop_0^n x₮\(\intop_0^n x \; \displaystyle \intop_0^n x\)₭\intop_0^n x \; \displaystyle \intop_0^n x₭Not supported
\invamp₮\invamp₮Not supportedNot supportedNot supported
\invlazys₮\invlazys₮Not supportedNot supportedNot supported
\Iota₮\Iota₮\(\Iota\)₭\Iota₭₸\Iota₸
\iota₮\iota₮\(\iota\)₭\iota₭₸\iota₸
\isin₮\isin₮\(\isin\)₭\isin₭Not supported
\it₮{\it AaBb}₮\({\it AaBb}\)₭{\it AaBb}₭Not supported{\it AaBb}
- -

JK

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
\j₮\text{\j}₮Not supported₭\text{\j}₭₸\text{\j}₸\text{\j}
\jmath₮\jmath₮\(\jmath\)₭\jmath₭₸\jmath₸
\Join₮\Join₮\(\Join\)₭\Join₭Not supported
\Kappa₮\Kappa₮\(\Kappa\)₭\Kappa₭₸\Kappa₸
\kappa₮\kappa₮\(\kappa\)₭\kappa₭₸\kappa₸
\ker₮\ker x₮\(\ker x\)₭\ker x₭₸\ker x₸
\kern₮I\kern-2.5pt R₮\(I\kern-2.5pt R\)₭I\kern-2.5pt R₭Not supportedI\kern-2.5pt R
\Ket₮\Ket{\psi}₮Requires extension₭\Ket{\psi}₭Not supported\Ket{\psi}
\ket₮\ket{\psi}₮Requires extension₭\ket{\psi}₭Not supported\ket{\psi}
\Koppa₮\Koppa₮Not supportedNot supportedNot supported
\koppa₮\koppa₮Not supportedNot supportedNot supported
- -

L

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
\LNot supportedNot supportedNot supportedNot supported
\lNot supportedNot supportedNot supportedNot supported
\Lambda₮\Lambda₮\(\Lambda\)₭\Lambda₭₸\Lambda₸
\lambda₮\lambda₮\(\lambda\)₭\lambda₭₸\lambda₸
\labelSee {equation}SupportedNot supported
\land₮\land₮\(\land\)₭\land₭Not supported
\lang₮\lang A\rangle₮\(\lang A\rangle\)₭\lang A\rangle₭₸\lang A\rangle₸\lang A\rangle
\lAngle₮\lAngle A\rangle₮Not supportedNot supportedNot supported\lAngle A\rAngle
\langle₮\langle A\rangle₮\(\langle A\rangle\)₭\langle A\rangle₭₸\langle A\rangle₸\langle A\rangle
\Larr₮\Larr₮\(\Larr\)₭\Larr₭Not supported
\lArr₮\lArr₮\(\lArr\)₭\lArr₭Not supported
\larr₮\larr₮\(\larr\)₭\larr₭Not supported
\large₮\large large₮\(\large large\)₭\large large₭Not supported\large large
\Large₮\Large Large₮\(\Large Large\)₭\Large Large₭Not supported\Large Large
\LARGE₮\LARGE LARGE₮\(\LARGE LARGE\)₭\LARGE LARGE₭Not supported\LARGE LARGE
\LaTeX₮\LaTeX₮\(\LaTeX\)₭\LaTeX₭Not supported
\lBrace₮\lBrace₮Not supported₭\lBrace₭Not supported
\lbrace₮\lbrace₮\(\lbrace\)₭\lbrace₭₸\lbrace₸
\lbrack₮\lbrack₮\(\lbrack\)₭\lbrack₭₸\lbrack₸
\lceil₮\lceil₮\(\lceil\)₭\lceil₭₸\lceil₸
\lcroofNot supportedNot supportedNot supportedNot supportedSee \enclose
\ldotp₮\ldotp₮\(\ldotp\)₭\ldotp₭Not supported
\ldots₮\ldots₮\(\ldots\)₭\ldots₭₸\ldots₸
\le₮\le₮\(\le\)₭\le₭₸\le₸
\leadsto₮\leadsto₮\(\leadsto\)₭\leadsto₭Not supported
\left₮\left\lbrace \frac ab \right.₮\(\left\lbrace \frac ab \right.\)₭\left\lbrace \frac ab \right.₭₸\left\lbrace \frac ab \right.₸\left\lbrace \frac ab \right.
\leftarrow₮\leftarrow₮\(\leftarrow\)₭\leftarrow₭₸\leftarrow₸
\Leftarrow₮\Leftarrow₮\(\Leftarrow\)₭\Leftarrow₭₸\Leftarrow₸
\leftarrowtail₮\leftarrowtail₮\(\leftarrowtail\)₭\leftarrowtail₭₸\leftarrowtail₸
\leftharpoondown₮\leftharpoondown₮\(\leftharpoondown\)₭\leftharpoondown₭₸\leftharpoondown₸
\leftharpoonup₮\leftharpoonup₮\(\leftharpoonup\)₭\leftharpoonup₭₸\leftharpoonup₸
\leftleftarrows₮\leftleftarrows₮\(\leftleftarrows\)₭\leftleftarrows₭₸\leftleftarrows₸
\leftmodels₮\leftmodels₮Not supportedNot supportedNot supported
\leftmoon₮\leftmoon₮Not supportedNot supportedNot supported
\leftouterjoin₮\leftouterjoin₮Not supportedNot supportedNot supported
\Leftrightarrow₮\Leftrightarrow₮\(\Leftrightarrow\)₭\Leftrightarrow₭₸\Leftrightarrow₸
\leftrightarrow₮\leftrightarrow₮\(\leftrightarrow\)₭\leftrightarrow₭₸\leftrightarrow₸
\leftrightarrows₮\leftrightarrows₮\(\leftrightarrows\)₭\leftrightarrows₭₸\leftrightarrows₸
\leftrightharpoons₮\leftrightharpoons₮\(\leftrightharpoons\)₭\leftrightharpoons₭₸\leftrightharpoons₸
\leftrightsquigarrow₮\leftrightsquigarrow₮\(\leftrightsquigarrow\)₭\leftrightsquigarrow₭₸\leftrightsquigarrow₸
\leftrootNot supported\(\sqrt[3\leftroot1]{x}\)Not supportedNot supported
\leftthreetimes₮\leftthreetimes₮\(\leftthreetimes\)₭\leftthreetimes₭₸\leftthreetimes₸
\leq₮\leq₮\(\leq\)₭\leq₭₸\leq₸
\leqalignnoNot supportedNot supportedNot supported
\leqq₮\leqq₮\(\leqq\)₭\leqq₭₸\leqq₸
\leqslant₮\leqslant₮\(\leqslant\)₭\leqslant₭₸\leqslant₸
\lessapprox₮\lessapprox₮\(\lessapprox\)₭\lessapprox₭₸\lessapprox₸
\lessdot₮\lessdot₮\(\lessdot\)₭\lessdot₭₸\lessdot₸
\lesseqgtr₮\lesseqgtr₮\(\lesseqgtr\)₭\lesseqgtr₭₸\lesseqgtr₸
\lesseqqgtr₮\lesseqqgtr₮\(\lesseqqgtr\)₭\lesseqqgtr₭₸\lesseqqgtr₸
\lessgtr₮\lessgtr₮\(\lessgtr\)₭\lessgtr₭₸\lessgtr₸
\lesssim₮\lesssim₮\(\lesssim\)₭\lesssim₭₸\lesssim₸
\letNot supportedNot supportedNot supported
\lfloor₮\lfloor₮\(\lfloor\)₭\lfloor₭₸\lfloor₸
\lg₮\lg₮\(\lg\)₭\lg₭₸\lg₸
\lgroup₮\lgroup₮\(\lgroup\)₭\lgroup₭Not supported
\lhd₮\lhd₮\(\lhd\)₭\lhd₭₸\lhd₸
\lim₮\begin{matrix}\lim x \\ \lim_y x \\\lim\limits_y x\end{matrix}₮\(\begin{matrix}\lim x \\ \lim_y x \\\lim\limits_y x\end{matrix}\)₭\begin{matrix}\lim x \\ \lim_y x \\\lim\limits_y x\end{matrix}₭₸\lim_y x₸\lim x
\lim_y x
\lim\limits_y x
\liminf₮\begin{matrix}\liminf x \\ \liminf_y x \\\liminf\limits_y x\end{matrix}₮\(\begin{matrix}\liminf x \\ \liminf_y x \\\liminf\limits_y x\end{matrix}\)₭\begin{matrix}\liminf x \\ \liminf_y x \\\liminf\limits_y x\end{matrix}₭₸\liminf₸
\limits₮\lim\limits_x₮\(\lim\limits_x\)₭\lim\limits_x₭Not supported\lim\limits_x
\limsup₮\begin{matrix}\limsup x \\ \limsup_y x \\\limsup\limits_y x\end{matrix}₮\(\begin{matrix}\limsup x \\ \limsup_y x \\\limsup\limits_y x\end{matrix}\)₭\begin{matrix}\limsup x \\ \limsup_y x \\\limsup\limits_y x\end{matrix}₭₸\limsup₸
\ll₮\ll₮\(\ll\)₭\ll₭₸\ll₸
\llangle₮\llangle A\rrangle₮Not supportedNot supported₸\llangle A\rrangle₸\llangle A\rrangle
\llap₮{=}\llap{/\,}₮\({=}\llap{/\,}\)₭{=}\llap{/\,}₭Not supported{=}\llap{/\,}
\llbracket₮\llbracket₮Not supported₭\llbracket₭Not supported
\llcorner₮\llcorner a \lrcorner₮\(\llcorner a \lrcorner\)₭\llcorner a \lrcorner₭Not supported
\Lleftarrow₮\Lleftarrow₮\(\Lleftarrow\)₭\Lleftarrow₭₸\Lleftarrow₸
\lll₮\lll₮\(\lll\)₭\lll₭₸\lll₸
\llless₮\llless₮\(\llless\)₭\llless₭Not supported
\llparenthesis₮\llparenthesis₮Not supportedNot supportedNot supported
\lmoustache₮\lmoustache₮\(\lmoustache\)₭\lmoustache₭₸\lmoustache₸
\ln₮\ln x₮\(\ln x\)₭\ln x₭₸\ln x₸
\lnapprox₮\lnapprox₮\(\lnapprox\)₭\lnapprox₭₸\lnapprox₸
\lneq₮\lneq₮\(\lneq\)₭\lneq₭₸\lneq₸
\lneqq₮\lneqq₮\(\lneqq\)₭\lneqq₭₸\lneqq₸
\lnot₮\lnot₮\(\lnot\)₭\lnot₭Not supported
\lnsim₮\lnsim₮\(\lnsim\)₭\lnsim₭₸\lnsim₸
\log₮\begin{matrix}\log x \\ \log_y x \\ \log\limits_y x\end{matrix}₮\(\begin{matrix}\log x \\ \log_y x \\ \log\limits_y x\end{matrix}\)₭\begin{matrix}\log x \\ \log_y x \\ \log\limits_y x\end{matrix}₭₸\begin{matrix}\log x \\ \log_y x \\ \log\limits_y x\end{matrix}₸\log x
\log_y x
\log\limits_y x
\Longleftarrow₮\Longleftarrow₮\(\Longleftarrow\)₭\Longleftarrow₭₸\Longleftarrow₸
\longleftarrow₮\longleftarrow₮\(\longleftarrow\)₭\longleftarrow₭₸\longleftarrow₸
\Longleftrightarrow₮\Longleftrightarrow₮\(\Longleftrightarrow\)₭\Longleftrightarrow₭₸\Longleftrightarrow₸
\longleftrightarrow₮\longleftrightarrow₮\(\longleftrightarrow\)₭\longleftrightarrow₭₸\longleftrightarrow₸
\longmapsto₮\longmapsto₮\(\longmapsto\)₭\longmapsto₭₸\longmapsto₸
\Longrightarrow₮\Longrightarrow₮\(\Longrightarrow\)₭\Longrightarrow₭₸\Longrightarrow₸
\longrightarrow₮\longrightarrow₮\(\longrightarrow\)₭\longrightarrow₭₸\longrightarrow₸
\looparrowleft₮\looparrowleft₮\(\looparrowleft\)₭\looparrowleft₭₸\looparrowleft₸
\looparrowright₮\looparrowright₮\(\looparrowright\)₭\looparrowright₭₸\looparrowright₸
\lor₮\lor₮\(\lor\)₭\lor₭Not supported
\lower₮l\lower 2pt{owe}r₮\(l\lower 2pt{owe}r\)₭l\lower 2pt{owe}r₭Not supportedl\lower 2pt{owe}r
\lozenge₮\lozenge₮\(\lozenge\)₭\lozenge₭₸\lozenge₸
\lozengeminus₮\lozengeminus₮Not supportedNot supportedNot supported
\lparen₮\lparen₮Not supported₭\lparen₭Not supported
\Lrarr₮\Lrarr₮\(\Lrarr\)₭\Lrarr₭Not supported
\lrArr₮\lrArr₮\(\lrArr\)₭\lrArr₭Not supported
\lrarr₮\lrarr₮\(\lrarr\)₭\lrarr₭Not supported
\lrcorner₮\lrcorner₮\(\lrcorner\)₭\lrcorner₭Not supported
\lq₮\lq₮Not supported₭\lq₭₸\lq₸
\Lsh₮\Lsh₮\(\Lsh\)₭\Lsh₭₸\Lsh₸
\lt₮\lt₮\(\lt\)₭\lt₭₸\lt₸
\ltimes₮\ltimes₮\(\ltimes\)₭\ltimes₭₸\ltimes₸
\lVert₮\lVert₮\(\lVert\)₭\lVert₭Not supported
\lvert₮\lvert₮\(\lvert\)₭\lvert₭Not supported
\lvertneqq₮\lvertneqq₮\(\lvertneqq\)₭\lvertneqq₭₸\lvertneqq₸
- -

M

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
\male₮\male₮Not supportedNot supportedNot supported\male
\maltese₮\maltese₮\(\maltese\)₭\maltese₭Not supported
\mapsfrom₮\mapsfrom₮Not supportedNot supportedNot supported
\mapsto₮\mapsto₮\(\mapsto\)₭\mapsto₭₸\mapsto₸
\mathbb₮\mathbb{AB}₮\(\mathbb{AB}\)₭\mathbb{AB}₭₸\mathbb{AB}₸\mathbb{AB}
\mathbf₮\mathbf{AaBb123}₮\(\mathbf{AaBb123}\)₭\mathbf{AaBb123}₭₸\mathbf{AaBb123}₸\mathbf{AaBb123}
\mathbin₮a\mathbin{!}b₮\(a\mathbin{!}b\)₭a\mathbin{!}b₭₸a\mathbin{!}b₸a\mathbin{!}b
\mathcal₮\mathcal{AaBb123}₮\(\mathcal{AaBb123}\)₭\mathcal{AaBb123}₭₸\mathcal{AaBb123}₸\mathcal{AaBb123}
\mathchoice₮a\mathchoice{\,}{\,\,}{\,\,\,}{\,\,\,\,}b₮\(a\mathchoice{\,}{\,\,}{\,\,\,}{\,\,\,\,}b\)₭a\mathchoice{\,}{\,\,}{\,\,\,}{\,\,\,\,}b₭Not supporteda\mathchoice{\,}{\,\,}{\,\,\,}{\,\,\,\,}b
\mathclap₮\displaystyle\sum_{\mathclap{1\le i\le n}} x_{i}₮Not supported₭\displaystyle\sum_{\mathclap{1\le i\le n}} x_{i}₭₸\displaystyle\sum_{\mathclap{1\le i\le n}} x_{i}₸\sum_{\mathclap{1\le i\le n}} x_{i}
\mathclose₮a + (b\mathclose\gt + c₮\(a + (b\mathclose\gt + c\)₭a + (b\mathclose\gt + c₭Not supporteda + (b\mathclose\gt + c
\mathellipsis₮\mathellipsis₮Not supported₭\mathellipsis₭Not supported
\mathfrak₮\mathfrak{AaBb}₮\(\mathfrak{AaBb}\)₭\mathfrak{AaBb}₭₸\mathfrak{AaBb}₸\mathfrak{AaBb}
\mathinner₮ab\mathinner{\text{inside}}cd₮\(ab\mathinner{\text{inside}}cd\)₭ab\mathinner{\text{inside}}cd₭Not supportedab\mathinner{\text{inside}}cd
\mathit₮\mathit{AaBb}₮\(\mathit{AaBb}\)₭\mathit{AaBb}₭₸\mathit{AaBb}₸\mathit{AaBb}
\mathllap₮{\mathrlap{\,/}{=}}₮Not supported₭{\mathrlap{\,/}{=}}₭₸{\mathrlap{\,/}{=}}₸\mathrlap{\,/}{=}
\mathnormal₮\mathnormal{AaBb\theta}₮Not supported₭\mathnormal{AaBb\theta}₭Not supported\mathnormal{AaBb\theta}
\mathop₮a \mathop{x} b₮\(a \mathop{x} b\)₭a \mathop{x} b₭₸a \mathop{x} b₸a \mathop{x} b
\mathopen₮a + \mathopen\lt b) + c₮\(a + \mathopen\lt b) + c\)₭a + \mathopen\lt b) + c₭₸a + \mathopen\lt b) + c₸a + \mathopen\lt b) + c
\mathord₮1\mathord{,}234{,}567₮\(1\mathord{,}234{,}567\)₭1\mathord{,}234{,}567₭Not supported1\mathord{,}234{,}567
\mathpunct₮A\mathpunct{-}B₮\(A\mathpunct{-}B\)₭A\mathpunct{-}B₭Not supportedA\mathpunct{-}B
\mathraiseboxNot supportedNot supportedNot supported₸h\mathraisebox{2pt}{ighe}r₸
\mathrel₮a \mathrel{\#} b₮\(a \mathrel{\#} b\)₭a \mathrel{\#} b₭₸a \mathrel{#} b₸a \mathrel{\#} b
\mathrlap₮{\displaystyle \int_0^{\mathrlap{2\pi}} x \,\mathrm{d} x}₮Not supported₭{\displaystyle \int_0^{\mathrlap{2\pi}} x \,\mathrm{d} x}₭₸{\displaystyle \int_0^{\mathrlap{2\pi}} x \,\mathrm{d} x}₸\int_0^{\mathrlap{2\pi}} x\,\mathrm{d} x
\mathring₮\mathring{a}₮\(\mathring{a}\)₭\mathring{a}₭Not supported\mathring{a}
\mathrm₮\mathrm{AaBb12\theta}₮\(\mathrm{AaBb12\theta}\)₭\mathrm{AaBb12\theta}₭₸\mathrm{AaBb12\theta}₸\mathrm{AaBb12\theta}
\mathscr₮\mathscr{AB}₮\(\mathscr{AB}\)₭\mathscr{AB}₭₸\mathscr{AB}₸\mathscr{AaBb123}
\mathsf₮\mathsf{AaBb123}₮\(\mathsf{AaBb123}\)₭\mathsf{AaBb123}₭₸\mathsf{AaBb123}₸\mathsf{AaBb123}
\mathsterling₮\mathsterling₮Not supported₭\mathsterling₭Not supported
\mathstrut₮\sqrt{\mathstrut\alpha}₮\(\sqrt{\mathstrut\alpha}\)₭\sqrt{\mathstrut\alpha}₭Not supported\sqrt{\mathstrut\alpha}
\mathtip₮\mathtip{a=b}{tip}₮Not supportedNot supportedNot supported\mathtip{a=b}{tip}s
\mathtt₮\mathtt{AaBb123}₮\(\mathtt{AaBb123}\)₭\mathtt{AaBb123}₭₸\mathtt{AaBb123}₸\mathtt{AaBb123}
\matrixNot supported\(\matrix{a & b \\ c & d}\)Not supported₸\matrix{a & b \\ c & d}₸\matrix{a & b \\ c & d}
{matrix}₮\begin{matrix}\frac A B&b\\\frac A B&d\end{matrix}₮\(\begin{matrix}\frac A B&b\\\frac A B&d\end{matrix}\)₭\begin{matrix}\frac A B&b\\\frac A B&d\end{matrix}₭₸\begin{matrix}\frac A B&b\\\frac A B&d\end{matrix}₸\begin{matrix}
   \frac A B & b \\
   \frac A B & d
\end{matrix}
\max₮\begin{matrix}\max x \\ \max_y x \\\max\limits_y x\end{matrix}₮\(\begin{matrix}\max x \\ \max_y x \\\max\limits_y x\end{matrix}\)₭\begin{matrix}\max x \\ \max_y x \\\max\limits_y x\end{matrix}₭₸\max₸
\mboxNot supported\(\mbox{in a box}\)Not supportedNot supported\mbox{in a box}
\measuredangle₮\measuredangle₮\(\measuredangle\)₭\measuredangle₭₸\measuredangle₸
\medspace₮a\medspace b₮Not supported₭a\medspace b₭₸a\medspace b₸a\medspace b
\mho₮\mho₮\(\mho\)₭\mho₭₸\mho₸
\mid₮\{x∈ℝ\mid x > 0\}₮\(\{x∈ℝ\mid x>0\}\)₭\{x∈ℝ\mid x > 0\}₭₸\{x∈ℝ\mid x>0\}₸\{x∈ℝ\mid x>0\}
\middle₮P\left(A\middle\vert B\right)₮\(P\left(A\middle\vert B\right)\)₭P\left(A\middle\vert B\right)₭Not supportedP\left(A\middle\vert B\right)
\min₮\begin{matrix}\min x \\ \min_y x \\\min\limits_y x\end{matrix}₮\(\begin{matrix}\min x \\ \min_y x \\\min\limits_y x\end{matrix}\)₭\begin{matrix}\min x \\ \min_y x \\\min\limits_y x\end{matrix}₭₸\min₸
\minusdot₮\minusdot₮Not supportedNot supportedNot supported
\minusoNot supported
See \standardstate
Not supported₭\minuso₭Not supported
\minusfdots₮\minusfdots₮Not supportedNot supportedNot supported
\minusrdots₮\minusrdots₮Not supportedNot supportedNot supported
\mitNot supported\(\mit{\Gamma\Theta}\)Not supportedNot supported\mit{\Gamma\Theta}
\mkern₮a\mkern18mu b₮\(a\mkern18mu b\)₭a\mkern18mu b₭Not supporteda\mkern18mu b
\mmlToken?Not supportedNot supportedNot supported
\mod₮3\equiv 5 \mod 2₮\(3\equiv 5 \mod 2\)₭3\equiv 5 \mod 2₭₸3\equiv 5 \mod 2₸3\equiv 5 \mod 2
\models₮\models₮\(\models\)₭\models₭₸\models₸
\moveleftNot supported\(O\moveleft3pt O\)Not supportedNot supportedO\moveleft3pt O
\moverightNot supported\(O\moveright3pt O\)Not supportedNot supportedO\moveright3pt O
\mp₮\mp₮\(\mp\)₭\mp₭₸\mp₸
\mskip₮a\mskip{10mu}b₮\(a\mskip{10mu}b\)₭a\mskip{10mu}b₭₸a\mskip{10mu}b₸a\mskip{10mu}b
\mspaceNot supported\(a\mspace18mu b\)Not supportedNot supporteda\mspace18mu b
\Mu₮\Mu₮\(\Mu\)₭\Mu₭₸\Mu₸
\mu₮\mu₮\(\mu\)₭\mu₭₸\mu₸
\multicolumnNot supportedNot supportedNot supportedNot supported
{multline}₮₮\begin{multline} -\rm first\ line \\ -\rm second\ line \\ -\rm third\ line -\end{multline}₮₮\[\begin{multline} - \rm first\ line \\ - \rm second\ line \\ - \rm third\ line - \end{multline}\]Not supportedNot supported
{multline*}₮₮\begin{multline*} -\rm first\ line \\ -\rm second\ line \\ -\rm third\ line -\end{multline*}₮₮\[\begin{multline*} - \rm first\ line \\ - \rm second\ line \\ - \rm third\ line - \end{multline*}\]Not supportedNot supported
\multimap₮\multimap₮\(\multimap\)₭\multimap₭₸\multimap₸
\multimapboth₮\multimapboth₮Not supportedNot supportedNot supported
\multimapinv₮\multimapinv₮Not supportedNot supportedNot supported
- -

N

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
\N₮\N₮\(\N\)₭\N₭Not supported
\nabla₮\nabla₮\(\nabla\)₭\nabla₭₸\nabla₸
\Nand₮\Nand₮Not supportedNot supportedNot supported
\natnums₮\natnums₮\(\natnums\)₭\natnums₭Not supported
\natural₮\natural₮\(\natural\)₭\natural₭₸\natural₸
\negmedspace₮a\negmedspace b₮\(a\negmedspace b\)₭a\negmedspace b₭₸a\negmedspace b₸a\negmedspace b
\ncong₮\ncong₮\(\ncong\)₭\ncong₭₸\ncong₸
\ne₮\ne₮\(\ne\)₭\ne₭₸\ne₸
\nearrow₮\nearrow₮\(\nearrow\)₭\nearrow₭₸\nearrow₸
\neg₮\neg₮\(\neg\)₭\neg₭₸\neg₸
\negthickspace₮a\negthickspace b₮\(a\negthickspace b\)₭a\negthickspace b₭Not supporteda\negthickspace b
\negthinspace₮a\negthinspace b₮\(a\negthinspace b\)₭a\negthinspace b₭Not supporteda\negthinspace b
\neq₮\neq₮\(\neq\)₭\neq₭₸\neq₸
\newcommand₮\newcommand\chk{\checkmark} \chk₮\(\newcommand\chk{\checkmark} \chk\)₭\newcommand\chk{\checkmark} \chk₭Not supported\newcommand\chk{\checkmark} \chk
\newenvironmentNot supported\(\newenvironment{tinyit}{\tiny\it}{\normalsize\rm}\begin{tinyit}Really small.\end{tinyit}\)Not supportedNot supported\newenvironment{tinyit}{\tiny\it}{\normalsize\rm}
\begin{tinyit}Really small.\end{tinyit}
\NewextarrowNot supported\(\Newextarrow{\xrightharpoonup}{5,10}{0x21C0} A \xrightharpoonup{\text{note}} B\)Not supportedNot supported\Newextarrow{\xrightharpoonup}{5,10}{0x21C0}
A \xrightharpoonup{\text{note}} B
\newextarrowNot supported<Not supportedNot supportedNot supportedSpelling per LaTeX.
\newline₮a\newline b₮Not supported₭a\newline b₭Not supporteda\newline b
\nexists₮\nexists₮\(\nexists\)₭\nexists₭₸\nexists₸
\ngeq₮\ngeq₮\(\ngeq\)₭\ngeq₭₸\ngeq₸
\ngeqq₮\ngeqq₮\(\ngeqq\)₭\ngeqq₭₸\ngeqq₸
\ngeqslant₮\ngeqslant₮\(\ngeqslant\)₭\ngeqslant₭₸\ngeqslant₸
\ngtr₮\ngtr₮\(\ngtr\)₭\ngtr₭₸\ngtr₸
\ni₮\ni₮\(\ni\)₭\ni₭₸\ni₸
\nleftarrow₮\nleftarrow₮\(\nleftarrow\)₭\nleftarrow₭₸\nleftarrow₸
\nLeftarrow₮\nLeftarrow₮\(\nLeftarrow\)₭\nLeftarrow₭₸\nLeftarrow₸
\nLeftrightarrow₮\nLeftrightarrow₮\(\nLeftrightarrow\)₭\nLeftrightarrow₭₸\nLeftrightarrow₸
\nleftrightarrow₮\nleftrightarrow₮\(\nleftrightarrow\)₭\nleftrightarrow₭₸\nleftrightarrow₸
\nleq₮\nleq₮\(\nleq\)₭\nleq₭₸\nleq₸
\nleqq₮\nleqq₮\(\nleqq\)₭\nleqq₭₸\nleqq₸
\nleqslant₮\nleqslant₮\(\nleqslant\)₭\nleqslant₭₸\nleqslant₸
\nless₮\nless₮\(\nless\)₭\nless₭₸\nless₸
\nmid₮\nmid₮\(\nmid\)₭\nmid₭₸\nmid₸
\nobreakNot supportedNot supportedNot supportedNot supported
\nobreakspace₮a\nobreakspace b₮\(a\nobreakspace b\)₭a\nobreakspace b₭Not supporteda\nobreakspace b
\nolimits₮\lim\nolimits_x₮\(\lim\nolimits_x\)₭\lim\nolimits_x₭Not supported\lim\nolimits_x
\Nor₮\Nor₮Not supportedNot supportedNot supported
\normalsize₮\normalsize normalsize₮\(\normalsize normalsize\)₭\normalsize normalsize₭Not supported\normalsize normalsize
\not₮\not =₮\(\not =\)₭\not =₭₸\not =₸\not =
\notagNot supportedNot supportedNot supported
\notin₮\notin₮\(\notin\)₭\notin₭₸\notin₸
\notni₮\notni₮Not supported₭\notni₭₸\notni₸
\nparallel₮\nparallel₮\(\nparallel\)₭\nparallel₭₸\nparallel₸
\nprec₮\nprec₮\(\nprec\)₭\nprec₭₸\nprec₸
\npreceq₮\npreceq₮\(\npreceq\)₭\npreceq₭₸\npreceq₸
\nRightarrow₮\nRightarrow₮\(\nRightarrow\)₭\nRightarrow₭₸\nRightarrow₸
\nrightarrow₮\nrightarrow₮\(\nrightarrow\)₭\nrightarrow₭₸\nrightarrow₸
\nshortmid₮\nshortmid₮\(\nshortmid\)₭\nshortmid₭₸\nshortmid₸
\nshortparallel₮\nshortparallel₮\(\nshortparallel\)₭\nshortparallel₭₸\nshortparallel₸
\nsim₮\nsim₮\(\nsim\)₭\nsim₭₸\nsim₸
\nsubset₮\nsubset₮Not supportedNot supported₸\nsubset₸
\nsubseteq₮\nsubseteq₮\(\nsubseteq\)₭\nsubseteq₭₸\nsubseteq₸
\nsubseteqq₮\nsubseteqq₮\(\nsubseteqq\)₭\nsubseteqq₭₸\nsubseteqq₸
\nsucc₮\nsucc₮\(\nsucc\)₭\nsucc₭₸\nsucc₸
\nsucceq₮\nsucceq₮\(\nsucceq\)₭\nsucceq₭₸\nsucceq₸
\nsupset₮\nsupset₮Not supportedNot supported₸\nsupset₸
\nsupseteq₮\nsupseteq₮\(\nsupseteq\)₭\nsupseteq₭₸\nsupseteq₸
\nsupseteqq₮\nsupseteqq₮\(\nsupseteqq\)₭\nsupseteqq₭Not supported
\ntriangleleft₮\ntriangleleft₮\(\ntriangleleft\)₭\ntriangleleft₭₸\ntriangleleft₸
\ntrianglelefteq₮\ntrianglelefteq₮\(\ntrianglelefteq\)₭\ntrianglelefteq₭₸\ntrianglelefteq₸
\ntriangleright₮\ntriangleright₮\(\ntriangleright\)₭\ntriangleright₭₸\ntriangleright₸
\ntrianglerighteq₮\ntrianglerighteq₮\(\ntrianglerighteq\)₭\ntrianglerighteq₭₸\ntrianglerighteq₸
\Nu₮\Nu₮\(\Nu\)₭\Nu₭₸\Nu₸
\nu₮\nu₮\(\nu\)₭\nu₭₸\nu₸
\nVDash₮\nVDash₮\(\nVDash\)₭\nVDash₭₸\nVDash₸
\nVdash₮\nVdash₮\(\nVdash\)₭\nVdash₭₸\nVdash₸
\nvDash₮\nvDash₮\(\nvDash\)₭\nvDash₭₸\nvDash₸
\nvdash₮\nvdash₮\(\nvdash\)₭\nvdash₭₸\nvdash₸
\nwarrow₮\nwarrow₮\(\nwarrow\)₭\nwarrow₭₸\nwarrow₸
- -

O

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
\O₮\text{\O}₮Not supported₭\text{\O}₭₸\text{\O}₸\text{\O}
\o₮\text{\o}₮Not supported₭\text{\o}₭₸\text{\o}₸\text{\o}
\obar₮\obar₮Not supportedNot supportedNot supported
\obslash₮\obslash₮Not supportedNot supportedNot supported
\oc₮\oc₮Not supportedNot supportedNot supported
\odiv₮\odiv₮Not supportedNot supportedNot supported
\odv₮\odv{f}{x}₮Not supportedNot supportedNot supported\odv{f}{x}
\odv*`₮\odv*{f}{x}₮Not supportedNot supportedNot supported\odv*{f}{x}
\odot₮\odot₮\(\odot\)₭\odot₭₸\odot₸
\OE₮\text{\OE}₮Not supported₭\text{\OE}₭₸\text{\OE}₸\text{\OE}
\oe₮\text{\oe}₮Not supported₭\text{\oe}₭₸\text{\oe}₸\text{\oe}
\officialeuroNot supported
See \euro
\(\officialeuro\)Not supportedNot supported
\ogreaterthan₮\ogreaterthan₮Not supportedNot supportedNot supported
\oiiint₮\oiiint_0^n x \; \displaystyle \oiiint_0^n x₮\(\oiiint_0^n x \; \displaystyle \oiiint_0^n x\)₭\oiiint_0^n x \; \displaystyle \oiiint_0^n x₭₸\oiiint₸
\oiint₮\oiint_0^n x \; \displaystyle \oiint_0^n x₮\(\oiint_0^n x \; \displaystyle \oiint_0^n x\)₭\oiint_0^n x \; \displaystyle \oiint_0^n x₭₸\oiint₸
\oint₮\oint_0^n x \; \displaystyle \oint_0^n x₮\(\oint_0^n x \; \displaystyle \oint_0^n x\)₭\oint_0^n x \; \displaystyle \oint_0^n x₭₸\oint₸
\oldstyleNot supported\(\oldstyle 0123456\)Not supportedNot supported\oldstyle 0123456
\oldstylenumsNot supportedNot supportedNot supportedNot supported
\olessthan₮\olessthan₮Not supportedNot supportedNot supported
\omega₮\omega₮\(\omega\)₭\omega₭₸\omega₸
\Omega₮\Omega₮\(\Omega\)₭\Omega₭₸\Omega₸
\Omicron₮\Omicron₮\(\Omicron\)₭\Omicron₭Not supported
\omicron₮\omicron₮\(\omicron\)₭\omicron₭₸\omicron₸
\ominus₮\ominus₮\(\ominus\)₭\ominus₭₸\ominus₸
\operatorname₮\operatorname{asin} x₮\(\operatorname{asin} x\)₭\operatorname{asin} x₭₸\operatorname{asin} x₸\operatorname{asin} x
\operatorname*₮\begin{matrix}\operatorname*{asin} x \\ \operatorname*{asin}_y x \\ \operatorname*{asin}\limits_y x\end{matrix}₮\(\begin{matrix}\operatorname*{asin} x \\ \operatorname*{asin}_y x \\ \operatorname*{asin}\limits_y x\end{matrix}\)₭\begin{matrix}\operatorname*{asin} x \\ \operatorname*{asin}_y x \\ \operatorname*{asin}\limits_y x\end{matrix}₭₸\operatorname*{func}\limits_a^b(x)₸\operatorname*{asin} x
\operatorname*{asin}_y x
\operatorname*{asin}\limits_y x\end
\operp₮\operp₮Not supportedNot supportedNot supported
\oplus₮\oplus₮\(\oplus\)₭\oplus₭₸\oplus₸
\orNot supportedNot supportedNot supportedNot supported
\origof₮\origof₮Not supported₭\origof₭Not supported
\oslash₮\oslash₮\(\oslash\)₭\oslash₭₸\oslash₸
\otimes₮\otimes₮\(\otimes\)₭\otimes₭₸\otimes₸
\Otimes₮\Otimes₮Not supportedNot supportedNot supported
\otimeshat₮\otimeshat₮Not supportedNot supportedNot supported
\over₮{a+1 \over b+2}+c₮\({a+1 \over b+2}+c\)₭{a+1 \over b+2}+c₭₸{a+1 \over b+2}+c₸{a+1 \over b+2}+c
\overbrace₮\overbrace{x+⋯+x}^{n\text{ times}}₮\(\overbrace{x+⋯+x}^{n\text{ times}}\)₭\overbrace{x+⋯+x}^{n\text{ times}}₭₸\overbrace{x+⋯+x}^{n\text{ times}}₸\overbrace{x+⋯+x}^{n\text{ times}}
\overbracketNot supportedNot supportedNot supportedNot supported
\overgroup₮\overgroup{AB}₮Not supported₭\overgroup{AB}₭₸\overgroup{AB}₸\overgroup{AB}
\overleftarrow₮\overleftarrow{AB}₮\(\overleftarrow{AB}\)₭\overleftarrow{AB}₭₸\overleftarrow{AB}₸\overleftarrow{AB}
\overleftharpoon₮\overleftharpoon{AB}₮Not supported₭\overleftharpoon{AB}₭₸\overleftharpoon{AB}₸\overleftharpoon{AB}
\overleftrightarrow₮\overleftrightarrow{AB}₮\(\overleftrightarrow{AB}\)₭\overleftrightarrow{AB}₭₸\overleftrightarrow{AB}₸\overleftrightarrow{AB}
\overline₮\overline{\text{a long argument}}₮\(\overline{\text{a long argument}}\)₭\overline{\text{a long argument}}₭₸\overline{\text{a long argument}}₸\overline{\text{a long argument}}
\overlinesegmentNot supportedNot supportedNot supportedNot supported
\overparen₮\overparen{AB}₮\(\overparen{AB}\)Not supported₸\overparen{AB}₸See \overgroup
\Overrightarrow₮\Overrightarrow{AB}₮Not supported₭\Overrightarrow{AB}₭Not supported\Overrightarrow{AB}
\overrightarrow₮\overrightarrow{AB}₮\(\overrightarrow{AB}\)₭\overrightarrow{AB}₭₸\overrightarrow{AB}₸\overrightarrow{AB}
\overrightharpoon₮\overrightharpoon{ac}₮Not supported₭\overrightharpoon{ac}₭₸\overrightharpoon{ac}₸\overrightharpoon{ac}
\overset₮\overset{!}{=}₮\(\overset{!}{=}\)₭\overset{!}{=}₭₸\overset{!}{=}₸\overset{!}{=}
\overwithdelimsNot supported\(a \overwithdelims [ ] b\)Not supportedNot supported
\owns₮\owns₮\(\owns\)₭\owns₭Not supported
- -

P

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
\P₮\text{\P}₮Not supported₭\text{\P}₭₸\text{\P}₸\text{\P}
\pagecolor?Not supportedNot supportedNot supportedDeprecated
\parallel₮\parallel₮\(\parallel\)₭\parallel₭₸\parallel₸
\parr₮\parr₮Not supportedNot supportedNot supported
\part??Not supportedNot supportedNot supportedDeprecated
\partial₮\partial₮\(\partial\)₭\partial₭₸\partial₸
\permil₮\permil₮Not supportedNot supportedNot supported
\pdv₮\pdv{f}{x,y}₮Not supportedNot supportedNot supported\pdv{f}{x,y}
\pdv*₮\pdv*{f}{x,y}₮Not supportedNot supportedNot supported\pdv*{f}{x,y}
\perp₮\perp₮\(\perp\)₭\perp₭₸\perp₸
\phantom₮\Gamma^{\phantom{i}j}_{i\phantom{j}k}₮\(\Gamma^{\phantom{i}j}_{i\phantom{j}k}\)₭\Gamma^{\phantom{i}j}_{i\phantom{j}k}₭₸\Gamma^{\phantom{i}j}_{i\phantom{j}k}₸\Gamma^{\phantom{i}j}_{i\phantom{j}k}
\phaseNot supportedNot supported
See \enclose
₭120\text{V}\phase{78.2\degree}₭Not supported120\text{V}\phase{78.2\degree}
\Phi₮\Phi₮\(\Phi\)₭\Phi₭₸\Phi₸
\phi₮\phi₮\(\phi\)₭\phi₭₸\phi₸
\Pi₮\Pi₮\(\Pi\)₭\Pi₭₸\Pi₸
\pi₮\pi₮\(\pi\)₭\pi₭₸\pi₸
{picture}Not supportedNot supportedNot supportedNot supported
\pitchfork₮\pitchfork₮\(\pitchfork\)₭\pitchfork₭₸\pitchfork₸
\plim₮\plim₮Not supported₭\plim₭Not supported
\plusmn₮\plusmn₮\(\plusmn\)₭\plusmn₭Not supported
\pm₮\pm₮\(\pm\)₭\pm₭₸\pm₸
\pmatrixNot supported\(\pmatrix{a&b\\c&d}\)Not supported₸\pmatrix{a&b\\c&d}₸See {pmatrix}
{pmatrix}₮\begin{pmatrix}a&b\\c&d\end{pmatrix}₮\(\begin{pmatrix}a&b\\c&d\end{pmatrix}\)₭\begin{pmatrix}a&b\\c&d\end{pmatrix}₭₸\begin{pmatrix}a&b\\c&d\end{pmatrix}₸\begin{pmatrix}
   a & b \\
   c & d
\end{pmatrix}
\pmb₮\pmb{\mu}₮\(\pmb{\mu}\)₭\pmb{\mu}₭Not supported\pmb{\mu}
\pmod₮x\pmod a₮\(x\pmod a\)₭x\pmod a₭Not supportedx\pmod a
\pod₮x \pod a₮\(x \pod a\)₭x \pod a₭Not supportedx \pod a
\pounds₮\pounds₮Not supported₭\pounds₭Not supported
\Pr₮\begin{matrix}\Pr x \\ \Pr_y x \\\Pr\limits_y x\end{matrix}₮\(\begin{matrix}\Pr x \\ \Pr_y x \\\Pr\limits_y x\end{matrix}\)₭\begin{matrix}\Pr x \\ \Pr_y x \\\Pr\limits_y x\end{matrix}₭₸\Pr₸
\prec₮\prec₮\(\prec\)₭\prec₭₸\prec₸
\precapprox₮\precapprox₮\(\precapprox\)₭\precapprox₭₸\precapprox₸
\preccurlyeq₮\preccurlyeq₮\(\preccurlyeq\)₭\preccurlyeq₭₸\preccurlyeq₸
\preceq₮\preceq₮\(\preceq\)₭\preceq₭₸\preceq₸
\precnapprox₮\precnapprox₮\(\precnapprox\)₭\precnapprox₭₸\precnapprox₸
\precneqq₮\precneqq₮\(\precneqq\)₭\precneqq₭₸\precneqq₸
\precnsim₮\precnsim₮\(\precnsim\)₭\precnsim₭₸\precnsim₸
\precsim₮\precsim₮\(\precsim\)₭\precsim₭₸\precsim₸
\prescript₮\prescript{a}{2}{\mathbf{C}}^{5+}_{2}₮Not supported₭\prescript{a}{2}{\mathbf{C}}^{5+}_{2}₭Not supported\prescript{a}{2}{\mathbf{C}}^{5+}_{2}
\prime₮\prime₮\(\prime\)₭\prime₭₸\prime₸
\prod₮\prod_0^n x \; \displaystyle \prod_0^n x₮\(\prod_0^n x \; \displaystyle \prod_0^n x\)₭\prod_0^n x \; \displaystyle \prod_0^n x₭₸\prod₸
\projlim₮\projlim_n x₮\(\projlim_n x\)₭\projlim_n x₭Not supported\projlim_n x
\propto₮\propto₮\(\propto\)₭\propto₭₸\propto₸
\providecommand₮\providecommand\greet{\text{Hello}} \greet₮Not supported₭\providecommand\greet{\text{Hello}} \greet₭Not supported\providecommand\greet{\text{Hello}} \greet
\psi₮\psi₮\(\psi\)₭\psi₭₸\psi₸
\Psi₮\Psi₮\(\Psi\)₭\Psi₭₸\Psi₸
\pu₮{123~\mathchoice{\textstyle\frac{\mathrm{kJ}}{\mathrm{mol}}}{\frac{\mathrm{kJ}}{\mathrm{mol}}}{\frac{\mathrm{kJ}}{\mathrm{mol}}}{\frac{\mathrm{kJ}}{\mathrm{mol}}}}₮\({123~\mathchoice{\textstyle\frac{\mathrm{kJ}}{\mathrm{mol}}}{\frac{\mathrm{kJ}}{\mathrm{mol}}}{\frac{\mathrm{kJ}}{\mathrm{mol}}}{\frac{\mathrm{kJ}}{\mathrm{mol}}}}\)₭{123~\mathchoice{\textstyle\frac{\mathrm{kJ}}{\mathrm{mol}}}{\frac{\mathrm{kJ}}{\mathrm{mol}}}{\frac{\mathrm{kJ}}{\mathrm{mol}}}{\frac{\mathrm{kJ}}{\mathrm{mol}}}}₭Not supported\pu{123 kJ//mol}
- -

QR

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
\QNot supported\(\Q\)Not supportedNot supportedSee \Bbb{Q}
\QED₮\QED₮Not supportedNot supportedNot supported
\qprime₮\qprime₮Not supportedNot supportedNot supported
\qquad₮a\qquad\qquad{b}₮\(a\qquad\qquad{b}\)₭a\qquad\qquad{b}₭₸a\qquad\qquad{b}₸a\qquad\qquad{b}
\quad₮a\quad\quad{b}₮\(a\quad\quad{b}\)₭a\quad\quad{b}₭₸a\quad\quad{b}₸a\quad\quad{b}
\R₮\R₮\(\R\)₭\R₭Not supported
\r₮\text{\r{a}}₮\(\text{\r{a}}\)₭\text{\r{a}}₭₸\text{\r{a}}₸\text{\r{a}}
\raise₮h\raise{2pt}{ighe}r₮\(h\raise{2pt}{ighe}r\)₭h\raise{2pt}{ighe}r₭Not supportedh\raise{2pt}{ighe}r
\raisebox₮h\raisebox{2pt}{ighe}r₮Not supported₭h\raisebox{2pt}{ighe}r₭Not supportedh\raisebox{2pt}{ighe}r
\rang₮\langle A\rang₮\(\langle A\rang\)₭\langle A\rang₭₸\langle A\rang₸\langle A\rang
\rAngle₮\lAngle A\rAngle₮Not supportedNot supportedNot supported\lAngle A\rAngle
\rangle₮\langle A\rangle₮\(\langle A\rangle\)₭\langle A\rangle₭₸\langle A\rangle₸\langle A\rangle
\Rarr₮\Rarr₮\(\Rarr\)₭\Rarr₭Not supported
\rArr₮\rArr₮\(\rArr\)₭\rArr₭Not supported
\rarr₮\rarr₮\(\rarr\)₭\rarr₭Not supported
\rBrace₮\rBrace₮Not supported₭\rBrace₭Not supported
\rbrace₮\rbrace₮\(\rbrace\)₭\rbrace₭₸\rbrace₸
\rbrack₮\rbrack₮\(\rbrack\)₭\rbrack₭₸\rbrack₸
{rcases}₮\begin{rcases}a&\text{if }b\\c&\text{if }d\end{rcases}₮Not supported₭\begin{rcases}a&\text{if }b\\c&\text{if }d\end{rcases}₭₸\begin{rcases}a&\text{if }b\\c&\text{if }d\end{rcases}₸\begin{rcases}
   a&\text{if }b\\
   c&\text{if }d
\end{rcases}
\rceil₮\rceil₮\(\rceil\)₭\rceil₭₸\rceil₸
\Re₮\Re₮\(\Re\)₭\Re₭₸\Re₸
\real₮\real₮\(\real\)₭\real₭Not supported
\Reals₮\Reals₮\(\Reals\)₭\Reals₭Not supported
\reals₮\reals₮\(\reals\)₭\reals₭Not supported
\ref₮\ref{maxwell}₮SupportedNot supportedNot supported\ref{maxwell}
\reflectbox₮\reflectbox{S}₮Not supportedNot supportedNot supported\reflectbox{S}
\relaxNot supportedNot supported
\renewcommand₮\def\hail{Hi!}\renewcommand\hail{\text{Ahoy!}} \hail₮\(\def\hail{Hi!}\renewcommand\hail{\text{Ahoy!}} \hail\)₭\def\hail{Hi!}\renewcommand\hail{\text{Ahoy!}} \hail₭Not supported\def\hail{Hi!}
\renewcommand\hail{\text{Ahoy!}}
\hail
\renewenvironmentNot supportedNot supportedNot supported
\requireNot supportedNot supportedNot supported
\restriction₮\restriction₮\(\restriction\)₭\restriction₭Not supported
\rfloor₮\rfloor₮\(\rfloor\)₭\rfloor₭₸\rfloor₸
\rgroup₮\rgroup₮\(\rgroup\)₭\rgroup₭Not supported
\rhd₮\rhd₮\(\rhd\)₭\rhd₭₸\rhd₸
\Rho₮\Rho₮\(\Rho\)₭\Rho₭₸\Rho₸
\rho₮\rho₮\(\rho\)₭\rho₭₸\rho₸
\right₮\left.\frac a b\right)₮\(\left.\frac a b\right)\)₭\left.\frac a b\right)₭₸\left.\frac a b\right)₸\left.\frac a b\right)
\Rightarrow₮\Rightarrow₮\(\Rightarrow\)₭\Rightarrow₭₸\Rightarrow₸
\rightarrow₮\rightarrow₮\(\rightarrow\)₭\rightarrow₭₸\rightarrow₸
\rightarrowtail₮\rightarrowtail₮\(\rightarrowtail\)₭\rightarrowtail₭₸\rightarrowtail₸
\rightharpoondown₮\rightharpoondown₮\(\rightharpoondown\)₭\rightharpoondown₭₸\rightharpoondown₸
\rightharpoonup₮\rightharpoonup₮\(\rightharpoonup\)₭\rightharpoonup₭₸\rightharpoonup₸
\rightleftarrows₮\rightleftarrows₮\(\rightleftarrows\)₭\rightleftarrows₭₸\rightleftarrows₸
\rightleftharpoons₮\rightleftharpoons₮\(\rightleftharpoons\)₭\rightleftharpoons₭₸\rightleftharpoons₸
\rightmoon₮\rightmoon₮Not supportedNot supportedNot supported
\rightouterjoin₮\rightouterjoin₮Not supportedNot supportedNot supported
\rightrightarrows₮\rightrightarrows₮\(\rightrightarrows\)₭\rightrightarrows₭₸\rightrightarrows₸
\rightsquigarrow₮\rightsquigarrow₮\(\rightsquigarrow\)₭\rightsquigarrow₭₸\rightsquigarrow₸
\rightthreetimes₮\rightthreetimes₮\(\rightthreetimes\)₭\rightthreetimes₭₸\rightthreetimes₸
\risingdotseq₮\risingdotseq₮\(\risingdotseq\)₭\risingdotseq₭₸\risingdotseq₸
\rlap₮\rlap{\,/}{=}₮\(\rlap{\,/}{=}\)₭\rlap{\,/}{=}₭Not supported\rlap{\,/}{=}
\rm₮\rm AaBb12\theta₮\(\rm AaBb12\theta\)₭\rm AaBb12\theta₭Not supported\rm AaBb12\theta
\rmoustache₮\rmoustache₮\(\rmoustache\)₭\rmoustache₭₸\rmoustache₸
\rootNot supported\(\root 3 \of x\)Not supported₸\root{3}{x}₸MathJax and TeXZilla differ in syntax:
\root 3 \of x vs. \root{3}{x}
\rotateboxNot supportedNot supportedNot supportedNot supported
\rparen₮\rparen₮Not supported₭\rparen₭Not supported
\rq₮\rq₮Not supported₭\rq₭₸\rq₸
\Rrightarrow₮\Rrightarrow₮\(\Rrightarrow\)₭\Rrightarrow₭₸\Rrightarrow₸
\rrangle₮\llangle A\rrangle₮Not supportedNot supported₸\llangle A\rrangle₸\llangle A\rrangle
\rrbracket₮\rrbracket₮Not supported₭\rrbracket₭Not supported
\rrparenthesis₮\rrparenthesis₮Not supportedNot supportedNot supported
\Rsh₮\Rsh₮\(\Rsh\)₭\Rsh₭₸\Rsh₸
\rtimes₮\rtimes₮\(\rtimes\)₭\rtimes₭₸\rtimes₸
\RuleNot supported\(x\Rule{3px}{0.5ex}{2ex}x\)Not supportedNot supportedNon-standard
\rule₮x\color{blue}\rule[6pt]{2ex}{1ex}x₮\(x\color{blue}\rule[6pt]{2ex}{1ex}x\)₭x\color{blue}\rule[6pt]{2ex}{1ex}x₭Not supportedx\color{blue}\rule[6pt]{2ex}{1ex}x
\rVert₮\rVert₮\(\rVert\)₭\rVert₭Not supported
\rvert₮\rvert₮\(\rvert\)₭\rvert₭Not supported
- -

S

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
\S₮\text{\S}₮Not supported₭\text{\S}₭₸\text{\S}₸\text{\S}
\Sampi₮\Sampi₮Not supportedNot supportedNot supported
\sampi₮\sampi₮Not supportedNot supportedNot supported
\scaleboxNot supportedNot supportedNot supportedNot supported
\scoh₮\scoh₮Not supportedNot supportedNot supported
\scrNot supported\(\scr M\)Not supportedNot supported\scr M
\scriptscriptstyle₮\scriptscriptstyle \frac cd₮\(\scriptscriptstyle \frac cd\)₭\scriptscriptstyle \frac cd₭Not supported\scriptscriptstyle \frac cd
\scriptsize₮\scriptsize scriptsize₮\(\scriptsize scriptsize\)₭\scriptsize scriptsize₭₸\scriptsize scriptsize₸\scriptsize scriptsize
\scriptstyle₮\frac ab + {\scriptstyle \frac cd}₮\(\frac ab + {\scriptstyle \frac cd}\)₭\frac ab + {\scriptstyle \frac cd}₭Not supported\frac ab + {\scriptstyle \frac cd}
\sdot₮\sdot₮\(\sdot\)₭\sdot₭Not supported
\searrow₮\searrow₮\(\searrow\)₭\searrow₭₸\searrow₸
\sec₮\sec₮\(\sec\)₭\sec₭₸\sec₸
\sect₮\text{\sect}₮Not supported₭\text{\sect}₭Not supported\text{\sect}
\set₮\set{ x | x<5 }₮Requires extensionNot supportedNot supported\Set{x|x<5}
\Set₮\Set{ x | x<\frac 1 2 }₮Requires extensionNot supportedNot supported\Set{ x | x<\frac 1 2 }
\setlengthNot supportedNot supportedNot supportedNot supported
\setminus₮\setminus₮\(\setminus\)₭\setminus₭₸\setminus₸
\sf₮\sf AaBb123₮\(\sf AaBb123\)₭\sf AaBb123₭Not supported\sf AaBb123
\sgn₮\sgn₮Not supportedNot supportedNot supported
\sharp₮\sharp₮\(\sharp\)₭\sharp₭₸\sharp₸
\shift₮\shift₮Not supportedNot supportedNot supported
\shneg₮\shneg₮Not supportedNot supportedNot supported
\shortmid₮\shortmid₮\(\shortmid\)₭\shortmid₭₸\shortmid₸
\shortparallel₮\shortparallel₮\(\shortparallel\)₭\shortparallel₭₸\shortparallel₸
\shoveleftNot supported\(\begin{multline*} -\rm first\ line \\ -\shoveleft{\rm 2nd} \\ -\rm third\ line -\end{multline*}\)Not supportedNot supported
\shoverightNot supported\(\begin{multline*} -\rm first\ line \\ -\shoveright{\rm 2nd} \\ -\rm third\ line -\end{multline*}\)Not supportedNot supported
\shpos₮\shpos₮Not supportedNot supportedNot supported
\shuffle₮\shuffle₮Not supportedNot supportedNot supported
\sideset₮\sideset{_1^2}{_3^4}\sum₮Not supportedNot supported₸\sideset{_1^2}{_3^4}\sum₸
\Sigma₮\Sigma₮\(\Sigma\)₭\Sigma₭₸\Sigma₸
\sigma₮\sigma₮\(\sigma\)₭\sigma₭₸\sigma₸
\sim₮\sim₮\(\sim\)₭\sim₭₸\sim₸
\simeq₮\simeq₮\(\simeq\)₭\simeq₭₸\simeq₸
\sin₮\sin x₮\(\sin x\)₭\sin x₭₸\sin x₸
\sincoh₮\sincoh₮Not supportedNot supportedNot supported
\sinh₮\sinh x₮\(\sinh x\)₭\sinh x₭₸\sinh x₸
\sixptsize₮\sixptsize sixptsize₮Not supported₭\sixptsize sixptsize₭Not supported\sixptsize sixptsize
\sh₮\sh₮Not supported₭\sh₭Not supported
\skewNot supported\(\hat A\skew9\hat A\)Not supportedNot supported\hat A\skew9\hat A
\skipNot supportedNot supportedNot supportedNot supported
\small₮\small small₮\(\small small\)₭\small small₭Not supported\small small
\smallfrown₮\smallfrown₮\(\smallfrown\)₭\smallfrown₭₸\smallfrown₸
\smallint₮\smallint_0^n x \; \smallint\limits_0^n x \; \displaystyle \smallint_0^n x₮\(\smallint_0^n x \; \smallint\limits_0^n x \; \displaystyle \smallint_0^n x\)₭\smallint_0^n x \; \smallint\limits_0^n x \; \displaystyle \smallint_0^n x₭Not supported - \smallint_0^n x
\smallint\limits_0^n x
\displaystyle \smallint_0^n x -
{smallmatrix}₮\begin{smallmatrix}a & b\\c & d\end{smallmatrix}₮\(\begin{smallmatrix}a & b\\c & d\end{smallmatrix}\)₭\begin{smallmatrix}a & b\\c & d\end{smallmatrix}₭₸\begin{smallmatrix}a & b\\c & d\end{smallmatrix}₸\begin{smallmatrix}a & b\\
c & d\end{smallmatrix}
\smallsetminus₮\smallsetminus₮\(\smallsetminus\)₭\smallsetminus₭₸\smallsetminus₸
\smallsmile₮\smallsmile₮\(\smallsmile\)₭\smallsmile₭₸\smallsmile₸
\smash₮\left(x^{\smash{2}}\right)₮\(\left(x^{\smash{2}}\right)\)₭\left(x^{\smash{2}}\right)₭Not supported\left(x^{\smash{2}}\right)
\smashtimes₮\smashtimes₮Not supportedNot supportedNot supported
\smile₮\smile₮\(\smile\)₭\smile₭₸\smile₸
\smiley₮\smiley₮Not supportedNot supportedNot supportedwasysym
\sout₮\sout{abc}₮Not supported₭\sout{abc}₭Not supported\sout{abc}
\SpaceNot supported\(a\Space{5px}{4ex}{2ex}^b_c d\)Not supportedNot supporteda\Space{5px}{4ex}{2ex}^b_c d
\space₮a\space{b}₮\(a\space{b}\)₭a\space{b}₭₸a\space{b}₸a\space{b}
\spades₮\spades₮\(\spades\)₭\spades₭Not supported
\spadesuit₮\spadesuit₮\(\spadesuit\)₭\spadesuit₭₸\spadesuit₸
\sphericalangle₮\sphericalangle₮\(\sphericalangle\)₭\sphericalangle₭₸\sphericalangle₸
{split}₮₮\begin{equation}\begin{split}∇·𝐃&=ρ_v \\ ∇·𝐁&=0 \end{split}\end{equation}₮₮\[\begin{equation}\begin{split}∇·𝐃&=ρ_v \\∇·𝐁&=0\end{split}\end{equation}\]₭₭\begin{equation}\begin{split}∇·𝐃&=ρ_v \\∇·𝐁&=0\end{split}\end{equation}₭₭Not supported\begin{equation}
\begin{split}
   ∇·𝐃&=ρ_v \\
   ∇·𝐁&=0
\end{split}
\end{equation}
\sqcap₮\sqcap₮\(\sqcap\)₭\sqcap₭₸\sqcap₸
\Sqcap₮\Sqcap₮Not supportedNot supportedNot supported
\sqcup₮\sqcup₮\(\sqcup\)₭\sqcup₭₸\sqcup₸
\Sqcup₮\Sqcup₮Not supportedNot supportedNot supported
\square₮\square₮\(\square\)₭\square₭₸\square₸
\sqrt₮\sqrt[3]{x}₮\(\sqrt[3]{x}\)₭\sqrt[3]{x}₭₸\sqrt[3]{x}₸\sqrt[3]{x}
\sqsubset₮\sqsubset₮\(\sqsubset\)₭\sqsubset₭₸\sqsubset₸
\sqsubseteq₮\sqsubseteq₮\(\sqsubseteq\)₭\sqsubseteq₭₸\sqsubseteq₸
\sqsupset₮\sqsupset₮\(\sqsupset\)₭\sqsupset₭₸\sqsupset₸
\sqsupseteq₮\sqsupseteq₮\(\sqsupseteq\)₭\sqsupseteq₭₸\sqsupseteq₸
\ss₮\text{\ss}₮Not supported₭\text{\ss}₭₸\text{\ss}₸\text{\ss}
\sslash₮\sslash₮Not supportedNot supported₸\sslash₸
\stackrel₮\stackrel{!}{=}₮\(\stackrel{!}{=}\)₭\stackrel{!}{=}₭₸\stackrel{!}{=}₸\stackrel{!}{=}
\star₮\star₮\(\star\)₭\star₭₸\star₸
\Stigma₮\Stigma₮Not supportedNot supportedNot supported
\stigma₮\stigma₮Not supportedNot supportedNot supported
\strictif₮\strictif₮Not supportedNot supportedNot supported
\strictfi₮\strictfi₮Not supportedNot supportedNot supported
\strutNot supported\(\boxed{ab\strut}\)Not supportedNot supported\boxed{ab\strut}
\styleNot supported\(\frac{\style{color:red}{x+1}}{y+2}\)Not supportedNot supported\frac{\style{color:red}{x+1}}{y+2}
Non standard
\sub₮\sub₮\(\sub\)₭\sub₭Not supported
{subarray}₮\begin{subarray}{c} a \\ c \end{subarray}₮\(\begin{subarray}{c} a \\ c \end{subarray}\)₭\begin{subarray}{c} a \\ c \end{subarray}₭Not supported\sum_{\begin{subarray}
   {c} a \\
   c
\end{subarray}}
\sube₮\sube₮\(\sube\)₭\sube₭Not supported
\Subset₮\Subset₮\(\Subset\)₭\Subset₭₸\Subset₸
\subset₮\subset₮\(\subset\)₭\subset₭₸\subset₸
\subseteq₮\subseteq₮\(\subseteq\)₭\subseteq₭₸\subseteq₸
\subseteqq₮\subseteqq₮\(\subseteqq\)₭\subseteqq₭₸\subseteqq₸
\subsetneq₮\subsetneq₮\(\subsetneq\)₭\subsetneq₭₸\subsetneq₸
\subsetneqq₮\subsetneqq₮\(\subsetneqq\)₭\subsetneqq₭₸\subsetneqq₸
\substack₮\displaystyle\sum_{\substack{1\lt i\lt 3 \\ 1\le j\lt 5}}a_{ij}₮\(\displaystyle\sum_{\substack{1\lt i\lt 3 \\ 1\le j\lt 5}}a_{ij}\)₭\displaystyle\sum_{\substack{1\lt i\lt 3 \\ 1\le j\lt 5}}a_{ij}₭₸\displaystyle\sum_{\substack{1\lt i\lt 3 \\ 1\le j\lt 5}}a_{ij}₸\sum_{\substack{1\lt i\lt 3 \\
1\le j\lt 5}}a_{ij}
\succ₮\succ₮\(\succ\)₭\succ₭₸\succ₸
\succapprox₮\succapprox₮\(\succapprox\)₭\succapprox₭₸\succapprox₸
\succcurlyeq₮\succcurlyeq₮\(\succcurlyeq\)₭\succcurlyeq₭₸\succcurlyeq₸
\succeq₮\succeq₮\(\succeq\)₭\succeq₭₸\succeq₸
\succnapprox₮\succnapprox₮\(\succnapprox\)₭\succnapprox₭₸\succnapprox₸
\succneqq₮\succneqq₮\(\succneqq\)₭\succneqq₭₸\succneqq₸
\succnsim₮\succnsim₮\(\succnsim\)₭\succnsim₭₸\succnsim₸
\succsim₮\succsim₮\(\succsim\)₭\succsim₭₸\succsim₸
\sum₮\sum_0^n x \; \displaystyle \sum_0^n x₮\(\sum_0^n x \; \displaystyle \sum_0^n x\)₭\sum_0^n x \; \displaystyle \sum_0^n x₭₸\sum_0^n x₸
\sun₮\sun₮Not supportedNot supportedNot supported
\sup₮\begin{matrix}\sup x \\ \sup_y x \\\sup\limits_y x\end{matrix}₮\(\begin{matrix}\sup x \\ \sup_y x \\\sup\limits_y x\end{matrix}\)₭\begin{matrix}\sup x \\ \sup_y x \\\sup\limits_y x\end{matrix}₭₸\begin{matrix}\sup x \\ \sup_y x \\\sup\limits_y x\end{matrix}₸
\supe₮\supe₮\(\supe\)₭\supe₭₸\supe₸
\Supset₮\Supset₮\(\Supset\)₭\Supset₭₸\Supset₸
\supset₮\supset₮\(\supset\)₭\supset₭₸\supset₸
\supseteq₮\supseteq₮\(\supseteq\)₭\supseteq₭₸\supseteq₸
\supseteqq₮\supseteqq₮\(\supseteqq\)₭\supseteqq₭₸\supseteqq₸
\supsetneq₮\supsetneq₮\(\supsetneq\)₭\supsetneq₭₸\supsetneq₸
\supsetneqq₮\supsetneqq₮\(\supsetneqq\)₭\supsetneqq₭₸\supsetneqq₸
\surd₮\surd₮\(\surd\)₭\surd₭₸\surd₸
\swarrow₮\swarrow₮\(\swarrow\)₭\swarrow₭₸\swarrow₸
- -

T

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
\tag₮₮\tag{3.1c} a^2+b^2=c^2₮₮\(\tag{3.1c} a^2+b^2=c^2\)₭₭\tag{3.1c} a^2+b^2=c^2₭₭Not supported\tag{3.1c} a^2+b^2=c^2
\tag*₮₮\tag*{3.1c} a^2+b^2=c^2₮₮\(\tag*{3.1c} a^2+b^2=c^2\)₭₭\tag*{3.1c} a^2+b^2=c^2₭₭Not supported\tag*{3.1c} a^2+b^2=c^2
\tan₮\tan x₮\(\tan x\)₭\tan x₭₸\tan x₸
\tanh₮\tanh x₮\(\tanh x\)₭\tanh x₭₸\tanh x₸
\Tau₮\Tau₮\(\Tau\)₭\Tau₭₸\Tau₸
\tau₮\tau₮\(\tau\)₭\tau₭₸\tau₸
\tbinom₮\tbinom n k₮\(\tbinom n k\)₭\tbinom n k₭₸\tbinom n k₸\tbinom n k
\TeX₮\TeX₮\(\TeX\)₭\TeX₭Not supported
\text₮\text{ yes }\&\text{ no }₮\(\text{ yes }\&\text{ no }\)₭\text{ yes }\&\text{ no }₭₸\text{ yes }\&\text{ no }₸\text{ yes }\&\text{ no }
\text₮\text{MMM$M\mkern2mu M$M}₮\(\text{MMM$M\mkern2mu M$M}\)₭\text{MMM$M\mkern2mu M$M}₭₸\text{MMM$M\mkern2mu M$M}₸\text{MMM$M\mkern2mu M$M}
\textasciitilde₮\text{\textasciitilde}₮Not supported₭\text{\textasciitilde}₭₸\text{\textasciitilde}₸\text{\textasciitilde}
\textasciicircum₮\text{\textasciicircum}₮Not supported₭\text{\textasciicircum}₭₸\text{\textasciicircum}₸\text{\textasciicircum}
\textbackslash₮\text{\textbackslash}₮Not supported₭\text{\textbackslash}₭₸\text{\textbackslash}₸\text{\textbackslash}
\textbar₮\text{\textbar}₮Not supported₭\text{\textbar}₭₸\text{\textbar}₸\text{\textbar}
\textbardbl₮\text{\textbardbl}₮Not supported₭\text{\textbardbl}₭₸\text{\textbardbl}₸\text{\textbardbl}
\textbf₮\textbf{AaBb123}₮\(\textbf{AaBb123}\)₭\textbf{AaBb123}₭₸\textbf{AaBb123}₸\textbf{AaBb123}
\textbraceleft₮\text{\textbraceleft}₮Not supported₭\text{\textbraceleft}₭₸\text{\textbraceleft}₸\text{\textbraceleft}
\textbraceright₮\text{\textbraceright}₮Not supported₭\text{\textbraceright}₭₸\text{\textbraceright}₸\text{\textbraceright}
\textcircledNot supportedNot supportedNot supported₸\text{\textcircled a}₸\text{\textcircled a}
\textcolor₮\textcolor{blue}{F=ma}₮\(\textcolor{blue}{F=ma}\)₭\textcolor{blue}{F=ma}₭₸\textcolor{blue}{F=ma}₸\textcolor{blue}{F=ma}
\textdagger₮\text{\textdagger}₮Not supported₭\text{\textdagger}₭₸\text{\textdagger}₸\text{\textdagger}
\textdaggerdbl₮\text{\textdaggerdbl}₮Not supported₭\text{\textdaggerdbl}₭₸\text{\textdaggerdbl}₸\text{\textdaggerdbl}
\textdegree₮\text{\textdegree}₮Not supported₭\text{\textdegree}₭₸\text{\textdegree}₸\text{\textdegree}
\textdollar₮\text{\textdollar}₮Not supported₭\text{\textdollar}₭₸\text{\textdollar}₸\text{\textdollar}
\textellipsis₮\text{\textellipsis}₮Not supported₭\text{\textellipsis}₭₸\text{\textellipsis}₸\text{\textellipsis}
\textemdash₮\text{\textemdash}₮Not supported₭\text{\textemdash}₭₸\text{\textemdash}₸\text{\textemdash}
\textendash₮\text{\textendash}₮Not supported₭\text{\textendash}₭₸\text{\textendash}₸\text{\textendash}
\textgreater₮\text{\textgreater}₮Not supported₭\text{\textgreater}₭₸\text{\textgreater}₸\text{\textgreater}
\textit₮\textit{AaBb}₮\(\textit{AaBb}\)₭\textit{AaBb}₭₸\textit{AaBb}₸\textit{AaBb}
\textless₮\text{\textless}₮Not supported₭\text{\textless}₭₸\text{\textless}₸\text{\textless}
\textnormal₮\textnormal{AB}₮Not supported₭\textnormal{AB}₭₸\textnormal{AB}₸\textnormal{AB}
\textquotedblleft₮\text{\textquotedblleft}₮Not supported₭\text{\textquotedblleft}₭₸\text{\textquotedblleft}₸\text{\textquotedblleft}
\textquotedblright₮\text{\textquotedblright}₮Not supported₭\text{\textquotedblright}₭₸\text{\textquotedblright}₸\text{\textquotedblright}
\textquoteleft₮\text{\textquoteleft}₮Not supported₭\text{\textquoteleft}₭₸\text{\textquoteleft}₸\text{\textquoteleft}
\textquoteright₮\text{\textquoteright}₮Not supported₭\text{\textquoteright}₭₸\text{\textquoteright}₸\text{\textquoteright}
\textregistered₮\text{\textregistered}₮Not supported₭\text{\textregistered}₭₸\text{\textregistered}₸\text{\textregistered}
\textrm₮\textrm{AaBb123}₮\(\textrm{AaBb123}\)₭\textrm{AaBb123}₭₸\textrm{AaBb123}₸\textrm{AaBb123}
\textscNot supportedNot supportedNot supportedNot supported
\textsf₮\textsf{AaBb123}₮\(\textsf{AaBb123}\)₭\textsf{AaBb123}₭₸\textsf{AaBb123}₸\textsf{AaBb123}
\textsterling₮\text{\textsterling}₮Not supported₭\text{\textsterling}₭₸\text{\textsterling}₸\text{\textsterling}
\textstyle₮\textstyle\sum_0^n₮\(\textstyle\sum_0^n\)₭\textstyle\sum_0^n₭₸\textstyle\sum_0^n₸\textstyle\sum_0^n
\texttip₮\texttip{\text{hover here}}{tip}₮Not supportedNot supportedNot supported\texttip{\text{hover here}}{tip}
\texttt₮\texttt{AaBb123}₮\(\texttt{AaBb123}\)₭\texttt{AaBb123}₭₸\texttt{AaBb123}₸\texttt{AaBb123}
\textunderscore₮\text{\textunderscore}₮Not supported₭\text{\textunderscore}₭Not supported\text{\textunderscore}
\textvisiblespaceNot supported\(a\textvisiblespace b\)Not supportedNot supported
\tfrac₮\displaystyle \tfrac a b₮\(\displaystyle \tfrac a b\)₭\displaystyle \tfrac a b₭₸\displaystyle \tfrac a b₸\displaystyle \tfrac a b
\tg₮\tg₮Not supported₭\tg₭Not supported
\th₮\th₮Not supported₭\th₭Not supported
\therefore₮\therefore₮\(\therefore\)₭\therefore₭₸\therefore₸
\Theta₮\Theta₮\(\Theta\)₭\Theta₭₸\Theta₸
\theta₮\theta₮\(\theta\)₭\theta₭₸\theta₸
\thetasym₮\thetasym₮\(\thetasym\)₭\thetasym₭₸\thetasym₸
\thickapprox₮\thickapprox₮\(\thickapprox\)₭\thickapprox₭₸\thickapprox₸
\thicksim₮\thicksim₮\(\thicksim\)₭\thicksim₭₸\thicksim₸
\thickspace₮a\thickspace b₮Not supported₭a\thickspace b₭₸a\thickspace b₸a\thickspace b
\thinspace₮a\thinspace b₮\(a\thinspace b\)₭a\thinspace b₭₸a\thinspace b₸a\thinspace b
\threedotcolon₮\threedotcolon₮Not supportedNot supportedNot supported
\tilde₮\tilde M₮\(\tilde M\)₭\tilde M₭₸\tilde M₸\tilde M
\times₮\times₮\(\times\)₭\times₭₸\times₸
\Tiny₮{\Tiny A B}₮Not supportedNot supportedNot supportedNon standard
\tiny₮\tiny tiny₮\(\tiny tiny\)₭\tiny tiny₭Not supported\tiny tiny
\to₮\to₮\(\to\)₭\to₭₸\to₸
\toggle₮\toggle{\text{Click Here}}{Ouch}\endtoggle₮Not supportedNot supported₸\toggle{\text{Hey!}}{\text{Click Here}}₸
\top₮\top₮\(\top\)₭\top₭₸\top₸
\triangle₮\triangle₮\(\triangle\)₭\triangle₭₸\triangle₸
\triangledown₮\triangledown₮\(\triangledown\)₭\triangledown₭₸\triangledown₸
\triangleleft₮\triangleleft₮\(\triangleleft\)₭\triangleleft₭₸\triangleleft₸
\trianglelefteq₮\trianglelefteq₮\(\trianglelefteq\)₭\trianglelefteq₭₸\trianglelefteq₸
\triangleq₮\triangleq₮\(\triangleq\)₭\triangleq₭₸\triangleq₸
\triangleminus₮\triangleminus₮Not supportedNot supportedNot supported
\triangleplus₮\triangleplus₮Not supportedNot supportedNot supported
\triangleright₮\triangleright₮\(\triangleright\)₭\triangleright₭₸\triangleright₸
\trianglerighteq₮\trianglerighteq₮\(\trianglerighteq\)₭\trianglerighteq₭₸\trianglerighteq₸
\triangletimes₮\triangletimes₮Not supportedNot supportedNot supported
\trprime₮\trprime₮Not supportedNot supportedNot supported
\tt₮{\tt AaBb123}₮\({\tt AaBb123}\)₭{\tt AaBb123}₭Not supported{\tt AaBb123}
\twocaps₮\twocaps₮Not supportedNot supportedNot supported
\twocups₮\twocups₮Not supportedNot supportedNot supported
\twoheadleftarrow₮\twoheadleftarrow₮\(\twoheadleftarrow\)₭\twoheadleftarrow₭₸\twoheadleftarrow₸
\twoheadrightarrow₮\twoheadrightarrow₮\(\twoheadrightarrow\)₭\twoheadrightarrow₭₸\twoheadrightarrow₸
\typecolon₮\typecolon₮Not supportedNot supportedNot supported
- -

U

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
\u₮\text{\u{a}}₮Not supported₭\text{\u{a}}₭₸\text{\u{a}}₸\text{\u{a}}
\Uarr₮\Uarr₮\(\Uarr\)₭\Uarr₭Not supported
\uArr₮\uArr₮\(\uArr\)₭\uArr₭Not supported
\uarr₮\uarr₮\(\uarr\)₭\uarr₭Not supported
\ulcorner₮\ulcorner₮\(\ulcorner\)₭\ulcorner₭Not supported
\underbrace₮\underbrace{x+⋯+x}_{n\text{ times}}₮\(\underbrace{x+⋯+x}_{n\text{ times}}\)₭\underbrace{x+⋯+x}_{n\text{ times}}₭₸\underbrace{x+⋯+x}_{n\text{ times}}₸\underbrace{x+⋯+x}_{n\text{ times}}
\underbracketNot supportedNot supportedNot supportedNot supported
\undergroup₮\undergroup{AB}₮Not supported₭\undergroup{AB}₭Not supported\undergroup{AB}
\underleftarrow₮\underleftarrow{AB}₮\(\underleftarrow{AB}\)₭\underleftarrow{AB}₭Not supported\underleftarrow{AB}
\underleftrightarrow₮\underleftrightarrow{AB}₮\(\underleftrightarrow{AB}\)₭\underleftrightarrow{AB}₭Not supported\underleftrightarrow{AB}
\underrightarrow₮\underrightarrow{AB}₮\(\underrightarrow{AB}\)₭\underrightarrow{AB}₭Not supported\underrightarrow{AB}
\underline₮\underline{\text{a long argument}}₮\(\underline{\text{a long argument}}\)₭\underline{\text{a long argument}}₭₸\underline{\text{a long argument}}₸\underline{\text{a long argument}}
\underlinesegmentNot supportedNot supportedNot supportedNot supported
\underparen₮\underparen{abc}₮Not supportedNot supportedNot supported\underparen{abc}
\underrightarrow₮\underrightarrow{AB}₮\(\underrightarrow{AB}\)₭\underrightarrow{AB}₭Not supported\underrightarrow{AB}
\underset₮\underset{!}{=}₮\(\underset{!}{=}\)₭\underset{!}{=}₭₸\underset{!}{=}₸\underset{!}{=}
\unicodeNot supported
See \char
\(\unicode{x263a}\)Not supportedNot supported\unicode{x263a}
See \char for alternate.
\unlhd₮\unlhd₮\(\unlhd\)₭\unlhd₭₸\unlhd₸
\unrhd₮\unrhd₮\(\unrhd\)₭\unrhd₭₸\unrhd₸
\upalpha₮\upalpha₮Not supported₭\upalpha₭Not supported
\Uparrow₮\Uparrow₮\(\Uparrow\)₭\Uparrow₭₸\Uparrow₸
\uparrow₮\uparrow₮\(\uparrow\)₭\uparrow₭₸\uparrow₸
\upbeta₮\upbeta₮Not supported₭\upbeta₭Not supported
\upchi₮\upchi₮Not supported₭\upchi₭Not supported
\updelta₮\updelta₮Not supported₭\updelta₭Not supported
\Updownarrow₮\Updownarrow₮\(\Updownarrow\)₭\Updownarrow₭₸\Updownarrow₸
\updownarrow₮\updownarrow₮\(\updownarrow\)₭\updownarrow₭₸\updownarrow₸
\upeta₮\upeta₮Not supported₭\upeta₭Not supported
\upepsilon₮\upepsilon₮Not supported₭\upepsilon₭Not supported
\upgamma₮\upgamma₮Not supported₭\upgamma₭Not supported
\upharpoonleft₮\upharpoonleft₮\(\upharpoonleft\)₭\upharpoonleft₭₸\upharpoonleft₸
\upharpoonright₮\upharpoonright₮\(\upharpoonright\)₭\upharpoonright₭₸\upharpoonright₸
\upiota₮\upiota₮Not supported₭\upiota₭Not supported
\upkappa₮\upkappa₮Not supported₭\upkappa₭Not supported
\uplambda₮\uplambda₮Not supported₭\uplambda₭Not supported
\uplus₮\uplus₮\(\uplus\)₭\uplus₭₸\uplus₸
\upmu₮\upmu₮Not supported₭\upmu₭Not supported
\upnu₮\upnu₮Not supported₭\upnu₭Not supported
\upomega₮\upomega₮Not supported₭\upomega₭Not supported
\upomicron₮\upomicron₮Not supported₭\upomicron₭Not supported
\upphi₮\upphi₮Not supported₭\upphi₭Not supported
\uppi₮\uppi₮Not supported₭\uppi₭Not supported
\uppsi₮\uppsi₮Not supported₭\uppsi₭Not supported
\uprho₮\uprho₮Not supported₭\uprho₭Not supported
\uprootNot supported\(\sqrt[3\uproot2]{x}\)Not supportedNot supported\sqrt[3\uproot2]{x}
\upsigma₮\upsigma₮Not supported₭\upsigma₭Not supported
\Upsilon₮\Upsilon₮\(\Upsilon\)₭\Upsilon₭₸\Upsilon₸
\upsilon₮\upsilon₮\(\upsilon\)₭\upsilon₭₸\upsilon₸
\uptau₮\uptau₮Not supported₭\uptau₭Not supported
\uptheta₮\uptheta₮Not supported₭\uptheta₭Not supported
\upuparrows₮\upuparrows₮\(\upuparrows\)₭\upuparrows₭₸\upuparrows₸
\upupsilon₮\upupsilon₮Not supported₭\upupsilon₭Not supported
\upxi₮\upxi₮Not supported₭\upxi₭Not supported
\upzeta₮\upzeta₮Not supported₭\upzeta₭Not supported
\urcorner₮\urcorner₮\(\urcorner\)₭\urcorner₭Not supported
\url₮\url{https://temml.org/}₮Not supported₭\url{https://temml.org/}₭Not supported\url{https://temml.org/}
\utilde₮\utilde{AB}₮Not supported₭\utilde{AB}₭Not supported\utilde{AB}
- -

V

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
\v₮\text{\v{a}}₮Not supported₭\text{\v{a}}₭₸\text{\v{a}}₸\text{\v{a}}
\varcoppa₮\varcoppa₮Not supportedNot supportedNot supported
\varDelta₮\varDelta₮\(\varDelta\)₭\varDelta₭Not supported
\varepsilon₮\varepsilon₮\(\varepsilon\)₭\varepsilon₭₸\varepsilon₸
\varGamma₮\varGamma₮\(\varGamma\)₭\varGamma₭Not supported
\varinjlim₮\varinjlim\limits_n x₮\(\varinjlim\limits_n x\)₭\varinjlim\limits_n x₭Not supported\varinjlim\limits_n x
\varkappa₮\varkappa₮\(\varkappa\)₭\varkappa₭₸\varkappa₸
\varLambda₮\varLambda₮\(\varLambda\)₭\varLambda₭Not supported
\varliminf₮\varliminf\limits_n x₮\(\varliminf\limits_n x\)₭\varliminf\limits_n x₭Not supported\varliminf\limits_n x
\varlimsup₮\varlimsup\limits_n x₮\(\varlimsup\limits_n x\)₭\varlimsup\limits_n x₭Not supported\varlimsup\limits_n x
\varnothing₮\varnothing₮\(\varnothing\)₭\varnothing₭₸\varnothing₸
\varOmega₮\varOmega₮\(\varOmega\)₭\varOmega₭Not supported
\varPhi₮\varPhi₮\(\varPhi\)₭\varPhi₭Not supported
\varphi₮\varphi₮\(\varphi\)₭\varphi₭₸\varphi₸
\varPi₮\varPi₮\(\varPi\)₭\varPi₭Not supported
\varpi₮\varpi₮\(\varpi\)₭\varpi₭₸\varpi₸
\varprojlim₮\varprojlim\limits_n x₮\(\varprojlim\limits_n x\)₭\varprojlim\limits_n x₭Not supported\varprojlim\limits_n x
\varpropto₮\varpropto₮\(\varpropto\)₭\varpropto₭₸\varpropto₸
\varPsi₮\varPsi₮\(\varPsi\)₭\varPsi₭Not supported
\varrho₮\varrho₮\(\varrho\)₭\varrho₭₸\varrho₸
\varSigma₮\varSigma₮\(\varSigma\)₭\varSigma₭Not supported
\varsigma₮\varsigma₮\(\varsigma\)₭\varsigma₭₸\varsigma₸
\varstigmaNot supported\(\varstigma\)Not supportedNot supported
\varsubsetneq₮\varsubsetneq₮\(\varsubsetneq\)₭\varsubsetneq₭₸\varsubsetneq₸
\varsubsetneqq₮\varsubsetneqq₮\(\varsubsetneqq\)₭\varsubsetneqq₭₸\varsubsetneqq₸
\varsupsetneq₮\varsupsetneq₮\(\varsupsetneq\)₭\varsupsetneq₭₸\varsupsetneq₸
\varsupsetneqq₮\varsupsetneqq₮\(\varsupsetneqq\)₭\varsupsetneqq₭₸\varsupsetneqq₸
\varTheta₮\varTheta₮\(\varTheta\)₭\varTheta₭Not supported
\vartheta₮\vartheta₮\(\vartheta\)₭\vartheta₭₸\vartheta₸
\vartriangle₮\vartriangle₮\(\vartriangle\)₭\vartriangle₭₸\vartriangle₸
\vartriangleleft₮\vartriangleleft₮\(\vartriangleleft\)₭\vartriangleleft₭₸\vartriangleleft₸
\vartriangleright₮\vartriangleright₮\(\vartriangleright\)₭\vartriangleright₭₸\vartriangleright₸
\varUpsilon₮\varUpsilon₮\(\varUpsilon\)₭\varUpsilon₭Not supported
\varXi₮\varXi₮\(\varXi\)₭\varXi₭Not supported
\vcentcolon₮\mathrel{\vcentcolon =}₮Not supported₭\mathrel{\vcentcolon =}₭Not supported\mathrel{\vcentcolon =}
\vcenterNot supportedNot supportedNot supportedNot supported
\Vdash₮\Vdash₮\(\Vdash\)₭\Vdash₭₸\Vdash₸
\VDash₮\VDash₮Not supportedNot supported₸\VDash₸
\vDash₮\vDash₮\(\vDash\)₭\vDash₭₸\vDash₸
\vdash₮\vdash₮\(\vdash\)₭\vdash₭₸\vdash₸
\vdots₮\vdots₮\(\vdots\)₭\vdots₭₸\vdots₸
\vec₮\vec{F}₮\(\vec{F}\)₭\vec{F}₭₸\vec{F}₸\vec{F}
\vee₮\vee₮\(\vee\)₭\vee₭₸\vee₸
\Vee ₮\Vee₮Not supportedNot supported₸\Vee₸
\veebar₮\veebar₮\(\veebar\)₭\veebar₭₸\veebar₸
\veedot₮\veedot₮Not supportedNot supportedNot supported
\veedoublebar₮\veedoublebar₮Not supportedNot supportedNot supported
\veeeq₮\veeeq₮Not supportedNot supportedNot supported
\veeonvee₮\veeonvee₮Not supportedNot supportedNot supported
\verb₮\verb!\frac a b!₮\(\verb!\frac a b!\)₭\verb!\frac a b!₭Not supported\verb!\frac a b!
\Vert₮\Vert₮\(\Vert\)₭\Vert₭₸\Vert₸
\vert₮\vert₮\(\vert\)₭\vert₭₸\vert₸
\vfilNot supportedNot supportedNot supportedNot supported
\vfillNot supportedNot supportedNot supportedNot supported
\vlineNot supportedNot supportedNot supportedNot supported
{Vmatrix}₮\begin{Vmatrix}a&b\\c&d\end{Vmatrix}₮\(\begin{Vmatrix}a&b\\c&d\end{Vmatrix}\)₭\begin{Vmatrix}a&b\\c&d\end{Vmatrix}₭₸\begin{Vmatrix}a&b\\c&d\end{Vmatrix}₸\begin{Vmatrix}
   a & b \\
   c & d
\end{Vmatrix}
{vmatrix}₮\begin{vmatrix}a&b\\c&d\end{vmatrix}₮\(\begin{vmatrix}a&b\\c&d\end{vmatrix}\)₭\begin{vmatrix}a&b\\c&d\end{vmatrix}₭₸\begin{vmatrix}a&b\\c&d\end{vmatrix}₸\begin{vmatrix}
   a & b \\
   c & d
\end{vmatrix}
\vphantom₮\overline{\vphantom{M}a}₮\(\overline{\vphantom{M}a}\)₭\overline{\vphantom{M}a}₭Not supported\overline{\vphantom{M}a}
\Vvdash₮\Vvdash₮\(\Vvdash\)₭\Vvdash₭₸\Vvdash₸
- -

W

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
\wedge₮\wedge₮\(\wedge\)₭\wedge₭₸\wedge₸
\Wedge₮\Wedge₮Not supportedNot supported₸\wedge₸
\wedgebar₮\wedgebar₮Not supportedNot supportedNot supported
\wedgedot₮\wedgedot₮Not supportedNot supportedNot supported
\wedgedoublebar₮\wedgedoublebar₮Not supportedNot supportedNot supported
\wedgeq₮\wedgeq₮Not supportedNot supportedNot supported
\wedgeonwedge₮\wedgeonwedge₮Not supportedNot supportedNot supported
\weierp₮\weierp₮\(\weierp\)₭\weierp₭Not supported
\whitesquaretickleft₮\whitesquaretickleft₮Not supportedNot supportedNot supported
\whitesquaretickright₮\whitesquaretickright₮Not supportedNot supportedNot supported
\widecheck₮\widecheck{AB}₮Not supported₭\widecheck{AB}₭₸\widecheck{AB}₸\widecheck{AB}
\widehat₮\widehat{AB}₮\(\widehat{AB}\)₭\widehat{AB}₭₸\widehat{AB}₸\widehat{AB}
\wideparen₮\wideparen{AB}₮Not supportedNot supportedNot supported -
\widetilde₮\widetilde{AB}₮\(\widetilde{AB}\)₭\widetilde{AB}₭₸\widetilde{AB}₸\widetilde{AB}
\with₮\with₮Not supportedNot supportedNot supported -
\wn₮\wn₮Not supportedNot supportedNot supported
\wp₮\wp₮\(\wp\)₭\wp₭₸\wp₸
\wr₮\wr₮\(\wr\)₭\wr₭₸\wr₸
- -

X

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
\xcancel₮\xcancel{ABC}₮\(\xcancel{ABC}\)₭\xcancel{ABC}₭Not supported\xcancel{ABC}
\Xi₮\Xi₮\(\Xi\)₭\Xi₭₸\Xi₸
\xi₮\xi₮\(\xi\)₭\xi₭₸\xi₸
\xhookleftarrow₮\xhookleftarrow{abc}₮Not supported₭\xhookleftarrow{abc}₭₸\xhookleftarrow{abc}₸\xhookleftarrow{abc}
\xhookrightarrow₮\xhookrightarrow{abc}₮Not supported₭\xhookrightarrow{abc}₭₸\xhookrightarrow{abc}₸\xhookrightarrow{abc}
\xLeftarrow₮\xLeftarrow{abc}₮Not supported₭\xLeftarrow{abc}₭₸\xLeftarrow{abc}₸\xLeftarrow{abc}
\xleftarrow₮\xleftarrow{abc}₮\(\xleftarrow{abc}\)₭\xleftarrow{abc}₭₸\xleftarrow{abc}₸\xleftarrow{abc}
\xleftharpoondown₮\xleftharpoondown{abc}₮Not supported₭\xleftharpoondown{abc}₭Not supported\xleftharpoondown{abc}
\xleftharpoonup₮\xleftharpoonup{abc}₮Not supported₭\xleftharpoonup{abc}₭Not supported\xleftharpoonup{abc}
\xLeftrightarrow₮\xLeftrightarrow{abc}₮Not supported₭\xLeftrightarrow{abc}₭₸\xLeftrightarrow{abc}₸\xLeftrightarrow{abc}
\xleftrightarrow₮\xleftrightarrow{abc}₮\(\xleftrightarrow{abc}\)₭\xleftrightarrow{abc}₭₸\xleftrightarrow{abc}₸\xleftrightarrow{abc}
\xleftrightharpoons₮\xleftrightharpoons{abc}₮Not supported₭\xleftrightharpoons{abc}₭₸\xleftrightharpoons{abc}₸\xleftrightharpoons{abc}
\xlongequal₮\xlongequal{abc}₮\(\xlongequal{abc}\)₭\xlongequal{abc}₭Not supported\xlongequal{abc}
\xmapsto₮\xmapsto{abc}₮\(\xmapsto{abc}\)₭\xmapsto{abc}₭₸\xmapsto{abc}₸\xmapsto{abc}
\Xor₮\Xor₮Not supportedNot supportedNot supported
\xRightarrow₮\xRightarrow{abc}₮Not supported₭\xRightarrow{abc}₭₸\xRightarrow{abc}₸\xRightarrow{abc}
\xrightarrow₮\begin{matrix}A \xrightarrow{abc} B\\ A \xrightarrow[ghi]{abcdef} B \end{matrix}₮\(\begin{matrix}A \xrightarrow{abc} B\\ A \xrightarrow[ghi]{abcdef} B \end{matrix}\)₭\begin{matrix}A \xrightarrow{abc} B\\ A \xrightarrow[ghi]{abcdef} B \end{matrix}₭₸\begin{matrix}A \xrightarrow{abc} B\\ A \xrightarrow[ghi]{abcdef} B \end{matrix}₸A \xrightarrow{abc} B
A \xrightarrow[ghi]{abcdef} B
\xrightharpoondown₮\xrightharpoondown{abc}₮Not supported₭\xrightharpoondown{abc}₭Not supported\xrightharpoondown{abc}
\xrightharpoonup₮\xrightharpoonup{abc}₮Not supported₭\xrightharpoonup{abc}₭Not supported\xrightharpoonup{abc}
\xrightleftharpoons₮\xrightleftharpoons{abc}₮\(\xrightleftharpoons{abc}\)₭\xrightleftharpoons{abc}₭₸\xrightleftharpoons{abc}₸\xrightleftharpoons{abc}
\xtofrom₮\xtofrom{abc}₮\(\xtofrom{abc}\)₭\xtofrom{abc}₭Not supported\xtofrom{abc}
\xtwoheadleftarrow₮\xtwoheadleftarrow{abc}₮\(\xtwoheadleftarrow{abc}\)₭\xtwoheadleftarrow{abc}₭Not supported\xtwoheadleftarrow{abc}
\xtwoheadrightarrow₮\xtwoheadrightarrow{abc}₮\(\xtwoheadrightarrow{abc}\)₭\xtwoheadrightarrow{abc}₭Not supported\xtwoheadrightarrow{abc}
- -

YZ

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
\yen₮\yen₮\(\yen\)₭\yen₭Not supported
\Z₮\Z₮\(\Z\)₭\Z₭Not supported
\Zeta₮\Zeta₮\(\Zeta\)₭\Zeta₭₸\Zeta₸
\zeta₮\zeta₮\(\zeta\)₭\zeta₭₸\zeta₸
- -
- -

Copyright © 2021-2024 Ron Kok. Released under the MIT License

- -
- -
- - - - - - - - - \ No newline at end of file diff --git a/docs/support_table.md b/docs/support_table.md deleted file mode 100644 index 175ff724..00000000 --- a/docs/support_table.md +++ /dev/null @@ -1,1882 +0,0 @@ - - - - - - Temml Support Table - - - - - - - -
- -# Support Table - -**Temml** is a JavaScript library that converts TeX math-mode functions to MathML. -This page provides an alphabetically sorted list of TeX functions that Temml -supports and some functions that it does not support. There is a similar page, -with functions [sorted by type](supported.html). - -Some functions are provided by an extension and are listed as such. They will -be available only in pages that include the extension. - -If you know the shape of a character, but not its name, -[Detexify](http://detexify.kirelabs.org/classify.html) can help. - - -## Symbols - -| Function | Rendered | Source or Comment | Package | -|----------------|-------------|-------------------|-----------| -|\!|$n!$|`n!`|| -|\\\!|$a\!b$|`a\!b`|| -|#|$\def\bar#1{#1^2} \bar{y}$|`\def\bar#1{#1^2} \bar{y}`|| -|\\#|$\#$||| -|%||`%this is a comment`|| -|\\%|$\%$||| -|&|$\begin{matrix} a & b\\ c & d \end{matrix}$|`\begin{matrix}`
   `a & b \\`
   `c & d`
`\end{matrix}`|| -|\\&|$\&$||| -|'|$'$||| -|\\\'|$\text{\'{a}}$|`\text{\'{a}}`|| -|\(| $($ ||| -|\)| $)$ ||| -|\\ |$a\ b$|`a\ b`|| -|\\"|$\text{\"{a}}$|`\text{\"{a}}`|| -|\\\$ | $\text{\textdollar}$||| -|\\,|$a\,\,{b}$|`a\,\,{b}`|| -|\\.|$\text{\.{a}}$|`\text{\.{a}}`|| -|\\:|$a\:\:{b}$|`a\:\:{b}`|| -|\\;|$a\;\;{b}$|a`\;\;{b}`|| -| \_ | $x_i$ | `x_i` || -|\\_|$\_$||| -|\\`` ` ``| $\text{\`{a}}$ | ``\text{\'{a}}`` || -|\<|$<$||| -|\\=|$\text{\={a}}$|`\text{\={a}}`|| -| >|$>$||| -|\\\>|$a\>\>{b}$|`a\>\>{b}`|| -|\[|$[$||| -|\]|$]$||| -|{|${a}$|`{a}`|| -|}|${a}$|`{a}`|| -|\\{|$\{$||| -|\\}|$\}$||| -| \| |$\vert$||| -| \\\| |$\Vert$||| -|\~|$\text{no~no~no~breaks}$|`\text{no~no~no~breaks}`|| -|\\~|$\text{\~{a}}$|`\text{\~{a}}`|| -| \\\\ |$\begin{matrix} a & b\\ c & d\end{matrix}$|`\begin{matrix}`
   `a & b \\`
   `c & d`
`\end{matrix}`|| -|^|$x^i$|`x^i`|| -|\\^|$\text{\^{a}}$|`\text{\^{a}}`|| - -## A - -
- -| Function | Rendered | Source or Comment| Package -|----------------|-------------|------------------|-----------| -|\AA|$\text{\AA}$|`\text{\AA}`||| -|\aa|$\text{\aa}$|`\text{\aa}`||| -|\above|${a \above{2pt} b+1}$|`{a \above{2pt} b+1}`|| -|\abovewithdelims|(Not supported)||| -|\abs|$\abs{x}$|`\abs{x}`| physics extension | -|\absolutevalue|$\absolutevalue{x}$|`\absolutevalue{x}`| physics extension | -|\acomm|$\acomm{A}{B}$|`\acomm{A}{B}`| physics extension | -|\acute|$\acute e$|`\acute e`|| -|\AE|$\text{\AE}$|`\text{\AE}`|| -|\ae|$\text{\ae}$|`\text{\ae}`|| -|\alef|$\alef$|| texvc extension | -|\alefsym|$\alefsym$|| texvc extension | -|\aleph|$\aleph$||| -|{align}| $$\begin{align}a&=b+c\\d+e&=f\end{align}$$ |`\begin{align}`
   `a&=b+c \\`
   `d+e&=f`
`\end{align}` | ams | -|{align\*}| $$\begin{align*}a&=b+c\\d+e&=f\end{align*}$$ |`\begin{align*}`
   `a&=b+c \\`
   `d+e&=f`
`\end{align*}` | ams | -|{aligned}| $$\begin{aligned}a&=b+c\\d+e&=f\end{aligned}$$ |`\begin{aligned}`
   `a&=b+c \\`
   `d+e&=f`
`\end{aligned}`| ams | -|{alignat}| $$\begin{alignat}{2}10&x+&3&y=2\\3&x+&13&y=4\end{alignat}$$ |`\begin{alignat}{2}`
   `10&x+ &3&y = 2 \\`
   ` 3&x+&13&y = 4`
`\end{alignat}` | ams | -|{alignat\*}| $$\begin{alignat*}{2}10&x+&3&y=2\\3&x+&13&y=4\end{alignat*}$$ |`\begin{alignat*}{2}`
   `10&x+ &3&y = 2 \\`
   ` 3&x+&13&y = 4`
`\end{alignat*}` | ams | -|{alignedat}| $$\begin{alignedat}{2}10&x+&3&y=2\\3&x+&13&y=4\end{alignedat}$$ |`\begin{alignedat}{2}`
   `10&x+ &3&y = 2 \\`
   ` 3&x+&13&y = 4`
`\end{alignedat}` | ams | -|\allowbreak|||| -|\Alpha|$\Alpha$||| -|\alpha|$\alpha$||| -|\amalg|$\amalg$||| -|\And|$\And$||| -|\and|(Not supported)|[Deprecated](https://en.wikipedia.org/wiki/Help:Displaying_a_formula#Deprecated_syntax)| texvc | -|\ang|(Not supported)|[Deprecated](https://en.wikipedia.org/wiki/Help:Displaying_a_formula#Deprecated_syntax)| texvc | -|\angl|$a_{\angl n}$|`a_{\angl n}` | actuarialangle | -|\angln|$a_\angln$|`a_\angln` | actuarialangle | -|\angle|$\angle$||| -|\Angstrom|$\Angstrom$|| stix | -|\anticommutator|$\anticommutator{A}{B}$|`\anticommutator{A}{B}`| physics extension | -|\approx|$\approx$||| -|\approxeq|$\approxeq$||| -|\arccos|$\arccos$||| -|\arcctg|$\arcctg$||| -|\arceq|$\arceq$|| stix | -|\arcsin|$\arcsin$||| -|\arctan|$\arctan$||| -|\arctg|$\arctg$||| -|\arg|$\arg$||| -|\argmax|$\argmax$|| statmath | -|\argmin|$\argmin$|| statmath | -|{array}|$\begin{array}{cc}a&b\\c&d\end{array}$ | `\begin{array}{cc}`
   `a & b \\`
   `c & d`
`\end{array}`| LaTeX2ε | -|\array|(Not supported)|See `{array}`|| -|\arraystretch|(Not supported)||| -|\Arrowvert|(Not supported)|see `\Vert`|| -|\arrowvert|(Not supported)|see `\vert`|| -|\ast|$\ast$||| -|\astrosun|$\astrosun$|| stix | -|\asymp|$\asymp$||| -|\atop|${a \atop b}$|`{a \atop b}`|| -|\atopwithdelims|(Not supported)||| - -## B - -+---------------------+--------------------------+--------------------------+-------------------+ -| Function | Rendered | Source or Comment | Package | -+=====================+==========================+==========================+===================+ -| \backcong | $\backcong$ | | MnSymbol | -+---------------------+--------------------------+--------------------------+-------------------+ -| \backepsilon | $\backepsilon$ | | ams | -+---------------------+--------------------------+--------------------------+-------------------+ -| \backprime | $\sigma^\backprime$ | `\sigma^\backprime` | ams | -+---------------------+--------------------------+--------------------------+-------------------+ -| \backdprime | $\sigma^\backdprime$ | `\sigma^\backdprime` | stix | -+---------------------+--------------------------+--------------------------+-------------------+ -| \backsim | $\backsim$ | | ams | -+---------------------+--------------------------+--------------------------+-------------------+ -| \backsimeq | $\backsimeq$ | | ams | -+---------------------+--------------------------+--------------------------+-------------------+ -| \backslash | $\backslash$ | | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \backtrprime | $\sigma^\backtrprime$ | `\sigma^\backtrprime` | stix | -+---------------------+--------------------------+--------------------------+-------------------+ -| \bar | $\bar{y}$ | `\bar{y}` | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \barcap | $\barcap$ | | stix | -+---------------------+--------------------------+--------------------------+-------------------+ -| \barcup | $\barcup$ | | stix | -+---------------------+--------------------------+--------------------------+-------------------+ -| \barvee | $\barvee$ | | stix | -+---------------------+--------------------------+--------------------------+-------------------+ -| \barwedge | $\barwedge$ | | ams | -+---------------------+--------------------------+--------------------------+-------------------+ -| \ballotx | $\ballotx$ | | arev | -+---------------------+--------------------------+--------------------------+-------------------+ -| \Bbb | $\Bbb{ABC}$ | `\Bbb{ABC}` | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \Bbbk | $\Bbbk$ | | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \bbox | Not supported | | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \bcancel | $\bcancel{5}$ | `\bcancel{5}` | cancel | -+---------------------+--------------------------+--------------------------+-------------------+ -| \because | $\because$ | | ams | -+---------------------+--------------------------+--------------------------+-------------------+ -| \begin | $\begin{matrix} | `\begin{matrix}`\ | ams | -| | a & b \\ | `a & b \\`\ | | -| | c & d | `c & d`\ | | -| | \end{matrix}$ | `\end{matrix}` | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \begingroup | $\begingroup a\endgroup$ | `\begingroup a\endgroup` | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \Beta | $\Beta$ | | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \beta | $\beta$ | | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \beth | $\beth$ | | ams | -+---------------------+--------------------------+--------------------------+-------------------+ -| \between | $\between$ | | ams | -+---------------------+--------------------------+--------------------------+-------------------+ -| \bf | ${\bf AaBb12}$ | `{\bf AaBb12}` | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \bfseries | Not supported | | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \big | $\big(\big)$ | `\big(\big)` | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \Big | $\Big(\Big)$ | `\Big(\Big)` | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \bigcap | $\bigcap$ | | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \bigcirc | $\bigcirc$ | | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \bigcup | $\bigcup$ | | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \bigg | $\bigg(\bigg)$ | `\bigg(\bigg)` | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \Bigg | $\Bigg(\Bigg)$ | `\Bigg(\Bigg)` | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \biggl | $\biggl($ | `\biggl(` | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \Biggl | $\Biggl($ | `\Biggl(` | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \biggm | $\biggm\vert$ | `\biggm\vert` | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \Biggm | $\Biggm\vert$ | `\Biggm\vert` | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \biggr | $\biggr)$ | `\biggr)` | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \Biggr | $\Biggr)$ | `\Biggr)` | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \bigl | $\bigl($ | `\bigl(` | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \Bigl | $\Bigl($ | `\Bigl(` | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \bigm | $\bigm\vert$ | `\bigm\vert` | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \Bigm | $\Bigm\vert$ | `\Bigm\vert` | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \bigodot | $\bigodot$ | | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \bigominus | Not supported | | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \bigoplus | $\bigoplus$ | | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \bigoslash | Not supported | | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \bigotimes | $\bigotimes$ | | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \bigr | $\bigr)$ | `\bigr)` | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \Bigr | $\Bigr)$ | `\Bigr)` | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \bigtimes | $\bigtimes$ | | stix | -+---------------------+--------------------------+--------------------------+-------------------+ -| \bigsqcap | $\bigsqcap$ | | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \bigsqcup | $\bigsqcup$ | | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \bigstar | $\bigstar$ | | ams | -+---------------------+--------------------------+--------------------------+-------------------+ -| \bigtriangledown | $\bigtriangledown$ | | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \bigtriangleup | $\bigtriangleup$ | | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \biguplus | $\biguplus$ | | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \bigvee | $\bigvee$ | | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \bigwedge | $\bigwedge$ | | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \binom | $\binom n k$ | `\binom n k` | ams | -+---------------------+--------------------------+--------------------------+-------------------+ -| \blackhourglass | $\blackhourglass$ | | stix | -+---------------------+--------------------------+--------------------------+-------------------+ -| \blacklozenge | $\blacklozenge$ | | ams | -+---------------------+--------------------------+--------------------------+-------------------+ -| \blacksquare | $\blacksquare$ | | ams | -+---------------------+--------------------------+--------------------------+-------------------+ -| \blacktriangle | $\blacktriangle$ | | ams | -+---------------------+--------------------------+--------------------------+-------------------+ -| \blacktriangledown | $\blacktriangledown$ | | ams | -+---------------------+--------------------------+--------------------------+-------------------+ -| \blacktriangleleft | $\blacktriangleleft$ | | ams | -+---------------------+--------------------------+--------------------------+-------------------+ -| \blacktriangleright | $\blacktriangleright$ | | ams | -+---------------------+--------------------------+--------------------------+-------------------+ -| \bm | $\bm{AaBb}$ | `\bm{AaBb}` | bm | -+---------------------+--------------------------+--------------------------+-------------------+ -| {Bmatrix} | $\begin{Bmatrix} | `\begin{Bmatrix}`\ | ams | -| | a & b \\ | `a & b \\`\ | | -| | c & d | `c & d`\ | | -| | \end{Bmatrix}$ | `\end{Bmatrix}` | | -+---------------------+--------------------------+--------------------------+-------------------+ -| {Bmatrix\*} | $\begin{Bmatrix*}[r] | `\begin{Bmatrix*}[r]`\ | mathtools | -| | -1 & 3 \\ | `-1 & 3 \\`\ | | -| | 2 & -4 | `2 & -4`\ | | -| | \end{Bmatrix*}$ | `\end{Bmatrix*}` | | -+---------------------+--------------------------+--------------------------+-------------------+ -| {bmatrix} | $\begin{bmatrix} | `\begin{bmatrix}`\ | ams | -| | a & b \\ | `a & b \\`\ | | -| | c & d | `c & d`\ | | -| | \end{bmatrix}$ | `\end{bmatrix}` | | -+---------------------+--------------------------+--------------------------+-------------------+ -| {bmatrix\*} | $\begin{bmatrix*}[r] | `\begin{bmatrix*}[r]`\ | mathtools | -| | -1 & 3 \\ | `-1 & 3 \\`\ | | -| | 2 & -4 | `2 & -4`\ | | -| | \end{bmatrix*}$ | `\end{bmatrix*}` | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \bmod | $a \bmod b$ | `a \bmod b` | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \bold | $\bold{AaBb123}$ | `\bold{AaBb123}` | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \boldsymbol | $\boldsymbol{AaBb}$ | `\boldsymbol{AaBb}` | ams | -+---------------------+--------------------------+--------------------------+-------------------+ -| \bot | $\bot$ | | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \Bot | $\Bot$ | | cmll | -+---------------------+--------------------------+--------------------------+-------------------+ -| \bowtie | $\bowtie$ | | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \Box | $\Box$ | | ams | -+---------------------+--------------------------+--------------------------+-------------------+ -| \boxast | $\boxast$ | | stix | -+---------------------+--------------------------+--------------------------+-------------------+ -| \boxbox | $\boxbox$ | | stix | -+---------------------+--------------------------+--------------------------+-------------------+ -| \boxcircle | $\boxcircle$ | | stix | -+---------------------+--------------------------+--------------------------+-------------------+ -| \boxdot | $\boxdot$ | | ams | -+---------------------+--------------------------+--------------------------+-------------------+ -| \boxed | $\boxed{ab}$ | `\boxed{ab}` | ams | -+---------------------+--------------------------+--------------------------+-------------------+ -| \boxminus | $\boxminus$ | | ams | -+---------------------+--------------------------+--------------------------+-------------------+ -| \boxplus | $\boxplus$ | | ams | -+---------------------+--------------------------+--------------------------+-------------------+ -| \boxtimes | $\boxtimes$ | | ams | -+---------------------+--------------------------+--------------------------+-------------------+ -| \Bqty | $\Bqty{5 \text{mm}}$ | `\Bqty{5 \text{mm}}` | physics extension | -+---------------------+--------------------------+--------------------------+-------------------+ -| \bqty | $\bqty{5 \text{mm}}$ | `\bqty{5 \text{mm}}` | physics extension | -+---------------------+--------------------------+--------------------------+-------------------+ -| \Bra | $\Bra{\psi}$ | `\Bra{\psi}` | braket | -+---------------------+--------------------------+--------------------------+-------------------+ -| \bra | $\bra{\psi}$ | `\bra{\psi}` | braket | -+---------------------+--------------------------+--------------------------+-------------------+ -| \braket | $\braket{\phi|\psi}$ | `\braket{\phi|\psi}` | braket | -+---------------------+--------------------------+--------------------------+-------------------+ -| \Braket | $\Braket{ϕ|\frac{∂^2}{∂ | `\Braket{ϕ|\frac{∂^2}{∂ | braket | -| | t^2}|ψ}$ | t^2}|ψ}` | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \brace | ${n\brace k}$ | `{n\brace k}` | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \bracevert | Not supported | | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \brack | ${n\brack k}$ | `{n\brack k}` | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \breve | $\breve{eu}$ | `\breve{eu}` | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \buildrel | Not supported | | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \bull | $\bull$ | | texvc extension | -+---------------------+--------------------------+--------------------------+-------------------+ -| \bullet | $\bullet$ | | | -+---------------------+--------------------------+--------------------------+-------------------+ -| \Bumpeq | $\Bumpeq$ | | ams | -+---------------------+--------------------------+--------------------------+-------------------+ -| \bumpeq | $\bumpeq$ | | ams | -+---------------------+--------------------------+--------------------------+-------------------+ - -## C - -| Function | Rendered | Source or Comment| Package -|----------------|-------------|------------------|-----------| -|\C|(Not supported)|[Deprecated](https://en.wikipedia.org/wiki/Help:Displaying_a_formula#Deprecated_syntax)| texvc | -|\c|$\text{\c{c}}$|`\text{\c{c}}`|| -|\cal|${\cal AaBb}$|`{\cal AaBb}`|| -|\cancel|$\cancel{5}$|`\cancel{5}`| cancel | -|\Cap|$\Cap$|| ams | -|\cap|$\cap$||| -|\capbarcup|$\capbarcup$|| stix | -|\capdot|$\capdot$|| stix | -|\capovercup|$\capovercup$|| stix | -|{cases}|$$\begin{cases}a&\text{if }b\\c&\text{if }d\end{cases}$$|`\begin{cases}`
   `a &\text{if } b \\`
   `c &\text{if } d`
`\end{cases}`| ams | -|\cases|(Not supported)|see `{cases}`|| -|{CD}|$$\begin{CD}A @>a>> B \\@VbVV @AAcA\\C @= D\end{CD}$$|`\begin{CD}`
   `A @>a>> B \\`
`@VbVV @AAcA \\`
   `C @= D`
`\end{CD}`| ams | -|\cdot|$\cdot$||| -|\cdotp|$\cdotp$||| -|\cdots|$\cdots$||| -|\ce |${\mathrm{C}{\vphantom{X}}_{\smash[t]{6}}\mathrm{H}{\vphantom{X}}_{\smash[t]{5}}{-}\mathrm{CHO}}$|`\ce{C6H5-CHO}` | mhchem extension | -|\cee|(Not supported)|Deprecated
Use `\ce` instead. | mhchem | -|\cent|$\cent$|| wasysym | -|\centerdot|$\centerdot$|| ams | -|\cf|(Not supported)|Deprecated
Use `\ce` instead.| mhchem | -|\cfrac|$\cfrac{2}{1+\cfrac{2}{1}}$|`\cfrac{2}{1+\cfrac{2}{1}}`| ams | -|\check|$\check{oe}$|`\check{oe}`|| -|\ch|$\ch$||| -|\checkmark|$\checkmark$|| ams | -|\Chi|$\Chi$||| -|\chi|$\chi$||| -|\choose|${n+1 \choose k+2}$|`{n+1 \choose k+2}`|| -|\circ|$\circ$||| -|\circeq|$\circeq$|| ams | -|\circlearrowleft|$\circlearrowleft$|| ams | -|\circlearrowright|$\circlearrowright$|| ams | -|\circledast|$\circledast$|| ams | -|\circledcirc|$\circledcirc$|| ams | -|\circledequal|$\circledequal$|| stix | -|\circleddash|$\circleddash$|| ams | -|\circledparallel|$\circledparallel$|| stix | -|\circledR|$\circledR$|| ams | -|\circledS|$\circledS$|| ams | -|\circledvert|$\circledvert$|| stix | -|\circlehbar|$\circlehbar$|| stix | -|\class|(Not supported)||| -|\cline|(Not supported)||| -|\closedvarcap|$\closedvarcap$|| stix | -|\closedvarcup|$\closedvarcup$|| stix | -|\clubs|$\clubs$|| texvc extension | -|\clubsuit|$\clubsuit$||| -|\cnums|$\cnums$|| texvc extension | -|\coh|$\coh$|| cmll | -|\colon|$\colon$||| -|\Colonapprox|$\Colonapprox$|| mathtools | -|\colonapprox|$\colonapprox$|| mathtools | -|\coloncolon|$\coloncolon$|| colonequals | -|\coloncolonapprox|$\coloncolonapprox$|| colonequals | -|\coloncolonequals|$\coloncolonequals$|| colonequals | -|\coloncolonminus|$\coloncolonminus$|| colonequals | -|\coloncolonsim|$\coloncolonsim$|| colonequals | -|\colonminus|$\colonminus$|| colonequals | -|\Coloneq|$\Coloneq$|| mathtools | -|\coloneq|$\coloneq$|| mathtools | -|\Coloneqq|$\Coloneqq$|| mathtools | -|\coloneqq|$\coloneqq$|| mathtools | -|\Colonsim|$\Colonsim$|| mathtools | -|\colonsim|$\colonsim$|| mathtools | -|\color|$\color{#0000FF} AaBb123$|`\color{#0000FF} AaBb123`| color | -|\colorbox|$\colorbox{red}{Black on red}$|`\colorbox{red}{Black on red}`| color | -|\comm|$\comm{A}{B}$|`\comm{A}{B}`| physics extension | -|\commutator|$\commutator{A}{B}$|`\commutator{A}{B}`| physics extension | -|\complement|$\complement$|| ams | -|\Complex|$\Complex$|| texvc extension | -|\concavediamond|$\concavediamond$|| stix | -|\concavediamondtickleft|$\concavediamondtickleft$|| stix | -|\concavediamondtickright|$\concavediamondtickright$|| stix | -|\cong|$\cong$||| -|\Coppa|$\Coppa$||| -|\coppa|$\coppa$||| -|\coprod|$\coprod$||| -|\copyright|$\copyright$||| -|\cos|$\cos$||| -|\cosec|$\cosec$||| -|\cosh|$\cosh$||| -|\cot|$\cot$||| -|\cotg|$\cotg$||| -|\coth|$\coth$||| -|\cp|$\cp$|| physics extension | -|\cr|$\begin{matrix} a & b\cr c & d \end{matrix}$|`\begin{matrix}`
   `a & b \cr`
   `c & d`
`\end{matrix}`|| -|\cross|$\cross$|| physics extension | -|\crossproduct|$\crossproduct$|| physics extension | -|\csc|$\csc$||| -|\cssId|(Not supported)|See `\id`.| -|\ctg|$\ctg$||| -|\cth|$\cth$||| -|\Cup|$\Cup$|| ams | -|\cup|$\cup$||| -|\cupovercap|$\cupovercap$|| stix | -|\curl|$\curl$|| physics extension | -|\curlyeqprec|$\curlyeqprec$|| ams | -|\curlyeqsucc|$\curlyeqsucc$|| ams | -|\curlyvee|$\curlyvee$|| ams | -|\curlywedge|$\curlywedge$|| ams | -|\curvearrowleft|$\curvearrowleft$|| ams | -|\curvearrowright|$\curvearrowright$|| ams | - -## D - -| Function | Rendered | Source or Comment | Package | -|----------------|-------------|-------------------|-----------| -|\dag|$\dag$||| -|\Dagger|$\Dagger$|| texvc extension | -|\dagger|$\dagger$||| -|\daleth|$\daleth$|| ams | -|\Darr|$\Darr$|| texvc extension | -|\dArr|$\dArr$|| texvc extension | -|\darr|$\darr$|| texvc extension | -|{darray}|$$\begin{darray}{cc}a&b\\c&d\end{darray}$$ | `\begin{darray}{cc}`
   `a & b \\`
   `c & d`
`\end{darray}`|| -|\dashleftarrow|$\dashleftarrow$|| ams | -|\dashrightarrow|$\dashrightarrow$|| ams | -|\dashv|$\dashv$||| -|\dbinom|$\dbinom n k$|`\dbinom n k`| ams | -|\dblcolon|$\dblcolon$|| mathtools | -|{dcases}|$$\begin{dcases}a&\text{if }b\\c&\text{if }d\end{dcases}$$ | `\begin{dcases}`
   `a &\text{if } b \\`
   `c &\text{if } d`
`\end{dcases}`| mathtools | -|\dd|$\dd$|`\dd`| physics extension | -|\ddag|$\ddag$||| -|\ddagger|$\ddagger$||| -|\ddddot|$\ddddot x$|`\ddddot x`| ams | -|\dddot|$\dddot x$|`\dddot x`| ams | -|\ddot|$\ddot x$|`\ddot x`|| -|\ddots|$\ddots$||| -|\DeclareMathOperator|(Not supported)||| -|\def|$\def\foo{x^2} \foo + \foo$|`\def\foo{x^2} \foo + \foo`|| -|\definecolor|$\definecolor{sortaGreen}{RGB}{128,128,0} \color{sortaGreen} F=ma$| `\definecolor{sortaGreen}{RGB}{128,128,0}`
`\color{sortaGreen} F=ma` | xcolor | -|\deg|$\deg$||| -|\degree|$\degree$||| -|\delta|$\delta$||| -|\Delta|$\Delta$||| -|\derivative|$\derivative{x}{y}$|`\derivative{x}{y}`| physics extension | -|\det|$\det$||| -|\dfrac|$\dfrac{a-1}{b-1}$|`\dfrac{a-1}{b-1}`| ams | -|\diameter|$\diameter$|| stix | -|\differential|$\differential$|`\differential`| physics extension | -|\diagdown|$\diagdown$|| ams | -|\diagonalmatrix|(Not supported)|| physics | -|\diagup|$\diagup$|| ams | -|\Diamond|$\Diamond$||| -|\diamond|$\diamond$||| -|\diamonds|$\diamonds$|| texvc extension | -|\diamondsuit|$\diamondsuit$||| -|\Digamma|(Not supported)||| -|\digamma|$\digamma$|| ams | -|\dim|$\dim$||| -|\displaylines|(Not supported)||| -|\displaystyle|$\displaystyle\sum_0^n$|`\displaystyle\sum_0^n`|| -|\div|$\div$||| -|\divergence|$\divergence$|`\divergence`| physics extension | -|\divideontimes|$\divideontimes$|| ams | -|\dot|$\dot x$|`\dot x`|| -|\Doteq|$\Doteq$|| ams | -|\doteq|$\doteq$||| -|\doteqdot|$\doteqdot$|| ams | -|\dotminus|$\dotminus$|| stix | -|\dotplus|$\dotplus$|| ams | -|\dotproduct|$\dotproduct$|`\dotproduct`| physics extension | -|\dots|$x_1 + \dots + x_n$ | `x_1 + \dots + x_n` || -|\dotsb|$x_1 +\dotsb + x_n$ | `x_1 +\dotsb + x_n` | ams | -|\dotsc|$x,\dotsc,y$|`x,\dotsc,y`| ams | -|\dotsi|$$\int_{A_1}\int_{A_2}\dotsi$$|`\int_{A_1}\int_{A_2}\dotsi`| ams | -|\dotsm|$x_1 x_2 \dotsm x_n$|`$x_1 x_2 \dotsm x_n`| ams | -|\dotso|$\dotso$|| ams | -|\doublebarvee|$\doublebarvee$|| stix | -|\doublebarwedge|$\doublebarwedge$|| stix | -|\doublecap|$\doublecap$|| ams | -|\doublecup|$\doublecup$|| ams | -|\Downarrow|$\Downarrow$||| -|\downarrow|$\downarrow$||| -|\downdownarrows|$\downdownarrows$|| ams | -|\downharpoonleft|$\downharpoonleft$|| ams | -|\downharpoonright|$\downharpoonright$|| ams | -|\dprime|$f^\dprime$|`f^\dprime`| stix | -|{drcases}|$\begin{drcases}a&\text{if }b\\c&\text{if }d\end{drcases}$|`\begin{drcases}`
   `a &\text{if } b \\`
   `c &\text{if } d`
`\end{drcases}`| mathtools | -|\dv|$\dv{x}{y}$|`\dv{x}{y}`| physics extension | -|\dyad|$\dyad{a}{b}$|`\dyad{a}{b}`| physics extension | - - -## E - -
- -| Function | Rendered | Source or Comment | Package | -|----------------|-------------|-------------------|-----------| -|\Earth|$\Earth$|| stix | -|\edef|$\def\foo{a}\edef\bar{\foo}\def\foo{}\bar$|`\def\foo{a}\edef\bar{\foo}\def\foo{}\bar`|| -|\ell|$\ell$||| -|\else|(Not supported)||| -|\em|(Not supported)||| -|\emph|(Not supported)||| -|\empty|$\empty$|| texvc extension | -|\emptyset|$\emptyset$||| -|\enclose|(Not supported)|Non standard.
See `\boxed`, `\cancel`, `\bcancel`,
`\xcancel`, `\sout`, `\angl`|| -|\end|$\begin{matrix} a & b\\ c & d\end{matrix}$|`\begin{matrix}`
   `a & b \\`
   `c & d`
`\end{matrix}`|| -|\endgroup|$\begingroup a\endgroup$|`\begingroup a\endgroup`|| -|\enspace|$a\enspace b$|`a\enspace b`|| -|\Epsilon|$\Epsilon$||| -|\epsilon|$\epsilon$||| -|\eqalign|(Not supported)|See {align*}|| -|\eqalignno|(Not supported)|See {align}|| -|\eqcirc|$\eqcirc$|| ams | -|\Eqcolon|$\Eqcolon$|| mathtools | -|\eqcolon|$\eqcolon$|| mathtools | -|\eqeq|$\eqeq$|| unicodemath | -|\eqeqeq|$\eqeqeq$|| unicodemath | -|\equalscolon|$\equalscolon$|| colonequals | -|\equalscoloncolon|$\equalscoloncolon$|| colonequals | -|{equation}|$$\begin{equation}a = b + c\end{equation}$$|`\begin{equation}`
   `a = b + c`
`\end{equation}`| ams | -|{equation*}|$$\begin{equation*}a = b + c\end{equation*}$$|`\begin{equation*}`
   `a = b + c`
`\end{equation*}`| ams | -|{eqnarray}|(Not supported)||| -|\Eqqcolon|$\Eqqcolon$|| mathtools | -|\eqqcolon|$\eqqcolon$|| mathtools | -|\eqdef|$\eqdef$|| stix | -|\eqref|$\eqref{tag1}$|`\eqref{tag1}`
Some sites do not support `\eqref`.| ams | -|\eqsim|$\eqsim$|| ams | -|\eqslantgtr|$\eqslantgtr$|| ams | -|\eqslantless|$\eqslantless$|| ams | -|\equiv|$\equiv$||| -|\erf|$\erf(x)$|`\erf(x)`| physics extension | -|\Eta|$\Eta$||| -|\eta|$\eta$||| -|\eth|$\eth$|| ams | -|\euro|$\euro$||| -|\ev|$\ev{x}$|`\ev{x}`| physics extension | -|\eval|$\eval{\tfrac 1 2 x}_0^n$|`\eval{\tfrac 1 2 x}_0^n`| physics extension | -|\evaluated|$\evaluated{\tfrac 1 2 x}_0^n$|`\evaluated{\tfrac 1 2 x}_0^n`| physics extension | -|\exist|$\exist$|| texvc extension | -|\exists|$\exists$||| -|\exp|$\exp$||| -|\expandafter|||| -|\expectationvalue|$\expectationvalue{x}$|`\expectationvalue{x}`| physics extension | -|\expval|$\expval{x}$|`\expval{x}`| physics extension | - -## F - -| Function | Rendered | Source or Comment | Package | -|-----------------------|--------------------------------|------------------------------|-------------------| -| \fallingdotseq | $\fallingdotseq$ | | ams | -| \fbox | $\fbox{Hi there!}$ | `\fbox{Hi there!}` | | -| \fcolorbox | $\fcolorbox{red}{aqua}{A}$ | `\fcolorbox{red}{aqua}{A}` | xcolor | -| \fdv | $\fdv{x}{y}$ | `\fdv{x}{y}` | physics extension | -| \female | $\female$ | | stix | -| \fi | (Not supported) | | | -| \Finv | $\Finv$ | | ams | -| \flat | $\flat$ | | | -| \footnotesize | $\footnotesize footnotesize$ | `\footnotesize footnotesize` | | -| \forall | $\forall$ | | | -| \frac | $\frac a b$ | `\frac a b` | ams | -| \frak | $\frak{AaBb}$ | `\frak{AaBb}` | | -| \frown | $\frown$ | | | -| \fullouterjoin | $\fullouterjoin$ | | stix | -| \functionalderivative | $\functionalderivative{x}{y}$ | `\functionalderivative{x}{y}`| physics extension | -| \futurelet | | | | - -## G - -
- -| Function | Rendered | Source or Comment | Package | -|----------------|-------------|-------------------|-----------| -| \Game | $\Game$| | ams | -| \Gamma | $\Gamma$| | | -| \gamma | $\gamma$| | | -| {gather} | $$\begin{gather}a=b\\e=b+c\end{gather}$$| `\begin{gather}`
   `a=b \\ `
   `e=b+c`
`\end{gather}`| ams | -| {gather*} | $$\begin{gather*}a=b\\e=b+c\end{gather*}$$| `\begin{gather*}`
   `a=b \\ `
   `e=b+c`
`\end{gather*}`| ams | -| {gathered} | $\begin{gathered}a=b\\e=b+c\end{gathered}$| `\begin{gathered}`
   `a=b \\ `
   `e=b+c`
`\end{gathered}`| ams | -| \gcd | $\gcd$| | | -| \gdef | (Not supported)| | | -| \ge | $\ge$| | | -| \geneuro | (Not supported) | See `\euro`| | -| \geneuronarrow | (Not supported) | See `\euro`| | -| \geneurowide | (Not supported) | See `\euro`| | -| \genfrac | $\genfrac ( ] {2pt}{0}a{a+1}$ | `\genfrac ( ] {2pt}{0}a{a+1}`| ams | -| \geq | $\geq$| | | -| \geqq | $\geqq$| | ams | -| \geqslant | $\geqslant$| | ams | -| \gets | $\gets$| | | -| \gg | $\gg$| | | -| \ggg | $\ggg$| | ams | -| \gggtr | $\gggtr$| | ams | -| \gimel | $\gimel$| | ams | -| \global | (Not supported)| | | -| \gnapprox | $\gnapprox$| | ams | -| \gneq | $\gneq$| | ams | -| \gneqq | $\gneqq$| | ams | -| \gnsim | $\gnsim$| | ams | -| \grad | $\grad$| | physics extension | -| \gradient | $\gradient$| | physics extension | -| \grave | $\grave{eu}$| `\grave{eu}`| | -| \gt | $a \gt b$| `a \gt b`| MathJax | -| \gtrapprox | $\gtrapprox$| | ams | -| \gtrdot | $\gtrdot$| | ams | -| \gtreqless | $\gtreqless$| | ams | -| \gtreqqless | $\gtreqqless$| | ams | -| \gtrless | $\gtrless$| | ams | -| \gtrsim | $\gtrsim$| | ams | -| \gvertneqq | $\gvertneqq$| | ams | - -## H - -| Function | Rendered | Source or Comment | Package | -|-----------------|---------------------------|-------------------|-----------| -| \H | $\text{\H{a}}$ | `\text{\H{a}}`| | -| \Harr | $\Harr$ | | texvc extension | -| \hArr | $\hArr$ | | texvc extension | -| \harr | $\harr$ | | texvc extension | -| \hat | $\hat{\theta}$ | `\hat{\theta}`| | -| \hbar | $\hbar$ | | | -| \hbox | $\hbox{ $x^2 $}$ | `\hbox{$x^2$}`| | -| \hbox to | (Not supported) | | | -| \hdashline | $\begin{matrix}a&b\\ \hdashline c &d\end{matrix}$| `\begin{matrix}`
   `a & b \\`
   `\hdashline`
   `c & d`
`\end{matrix}`| arydshln | -| \hearts | $\hearts$ | | texvc extension | -| \heartsuit | $\heartsuit$ | | | -| \hfil | (Not supported) | | | -| \hfill | (Not supported) | | | -| \hline | $\begin{matrix}a&b\\ \hline c &d\end{matrix}$| `\begin{matrix}`
   `a & b \\ \hline`
   `c & d`
`\end{matrix}`| | -| \hom | $\hom$ | | | -| \hookleftarrow | $\hookleftarrow$ | | | -| \hookrightarrow | $\hookrightarrow$ | | | -| \hourglass | $\hourglass$ | | stix | -| \hphantom | $a\hphantom{bc}d$ | `a\hphantom{bc}d`| | -| \href | $\href{https://temml.org/}{\Temml}$| `\href{https://temml.org/}{\Temml}`
Requires `trust` [option](options.md)| href | -| \hskip | $w\hskip1em i\hskip2em d$ | `w\hskip1em i\hskip2em d`| | -| \hslash | $\hslash$ | | ams | -| \hspace | $s\hspace{7ex} k$ | `s\hspace{7ex} k`| | -| \class | $\class{foo}{x}$ | `\class{foo}{x}`
Must enable `trust` and disable `strict` [option](options.md)| | -| \data | $\data{foo=a, bar=b}{x}$ | `\data{foo=a, bar=b}{x}`
Must enable `trust` and disable `strict` [option](options.md)| | -| \id | $\id{bar}{x}$| `\id{bar}{x}`
Must enable `trust` and disable `strict` [option](options.md)| | -| \style | $\style{color: red;}{x}$| `\style{color: red;}{x}`
Must enable `trust` and disable `strict` [option](options.md)| | -| \huge | $\huge huge$ | `\huge huge`| | -| \Huge | $\Huge Huge$ | `\Huge Huge`| | - -## I - -| Function | Rendered | Source or Comment | Package | -|------------------|-----------------------|-----------------------|-------------------| -| \i | $\text{\i}$ | `\text{\i}` | | -| \idotsint | $\int\idotsint\int$ | `\int\idotsint\int` | ams | -| \iddots | $\iddots$ | | | -| \if | (Not supported) | | | -| \iff | $A\iff B$ | `A\iff B` | | -| \ifmode | (Not supported) | | | -| \ifx | (Not supported) | | | -| \iiiint | $\iiiint$ | | ams | -| \iiint | $\iiint$ | | ams | -| \iint | $\iint$ | | ams | -| \Im | $\Im$ | | | -| \image | $\image$ | | texvc extension | -| \imageof | $\imageof$ | | stix | -| \imath | $\imath$ | | | -| \impliedby | $P\impliedby Q$ | `P\impliedby Q` | ams | -| \implies | $P\implies Q$ | `P\implies Q` | ams | -| \in | $\in$ | | | -| \includegraphics | $\includegraphics[height=1em, totalheight=1.2em, width=1.2em, alt=sphere]{../sphere.jpg}$ | `\includegraphics[height=1em,`
`totalheight=1.2em, width=1.2em,`
`alt=sphere]{../sphere.jpg}` | graphicx | -| \incoh | $\incoh$ | | cmll | -| \inf | $\inf$ | | | -| \infin | $\infin$ | | texvc extension | -| \infty | $\infty$ | | | -| \injlim | $\injlim$ | `\injlim` | ams | -| \innerproduct | $\innerproduct{a}{b}$ | `\innerproduct{a}{b}` | physics extension | -| \int | $\int$ | | | -| \intbar | $\intbar$ | | | -| \intBar | $\intBar$ | | | -| \intcap | $\intcap$ | | | -| \intclockwise | $\intclockwise$ | | | -| \intcup | $\intcup$ | | | -| \intercal | $\intercal$ | | ams | -| \interleave | $\interleave$ | | stix | -| \intlarhk | $\intlarhk$ | | | -| \intop | $\intop$ | | | -| \intx | $\intx$ | | | -| \invamp | $\invamp$ | | cmll | -| \invlazys | $\invlazys$ | | stix | -| \Iota | $\Iota$ | | | -| \iota | $\iota$ | | | -| \isin | $\isin$ | | texvc extension | -| \it | ${\it AaBb}$ | `{\it AaBb}` | | -| \itshape | (Not supported) | | | - -## JK - -| Function | Rendered | Source or Comment | Package | -|----------|------------------|-------------------|-------------------| -| \j | $\text{\j}$ | `\text{\j}` | | -| \jmath | $\jmath$ | | | -| \Join | $\Join$ | | ams | -| \Kappa | $\Kappa$ | | | -| \kappa | $\kappa$ | | | -| \ker | $\ker$ | | | -| \kern | $I\kern-2.5pt R$ | `I\kern-2.5pt R` | | -| \Ket | $\Ket{\psi}$ | `\Ket{\psi}` | braket | -| \ket | $\ket{\psi}$ | `\ket{\psi}` | braket | -| \ketbra | $\ketbra{a}{b}$ | `\ketbra{a}{b}` | physics extension | -| \Koppa | $\Koppa$ | | | -| \koppa | $\koppa$ | | | - -## L - -| Function | Rendered | Source or Comment | Package | -|----------------------|----------------------------|-------------------|-----------| -| \L | (Not supported) | | | -| \l | (Not supported) | | | -| \Lambda | $\Lambda$ | | | -| \lambda | $\lambda$ | | | -| \label | | `\label{idName}`
Creates an HTML id.
Characters limited to: `A-Za-z0-9_-`| | -| \land | $\land$ | | | -| \lang | $\lang A\rangle$ | `\lang A\rangle` | texvc extension | -| \lAngle | $\lAngle A\rAngle$ | `\lAngle A\rAngle` | unicode-math | -| \langle | $\langle A\rangle$ | `\langle A\rangle` | | -| \laplacian | $\laplacian$ | | physics extension | -| \Larr | $\Larr$ | | texvc extension | -| \lArr | $\lArr$ | | texvc extension | -| \larr | $\larr$ | | texvc extension | -| \large | $\large large$ | `\large large`| | -| \Large | $\Large Large$ | `\Large Large`| | -| \LARGE | $\LARGE LARGE$ | `\LARGE LARGE`| | -| \LaTeX | $\LaTeX$ | | | -| \lBrace | $\lBrace$ | | stix | -| \lbrace | $\lbrace$ | | | -| \lbrack | $\lbrack$ | | | -| \lceil | $\lceil$ | | | -| \ldotp | $\ldotp$ | | | -| \ldots | $\ldots$ | | | -| \le | $\le$ | | | -| \leadsto | $\leadsto$ | | ams | -| \left | $\left\lbrace \dfrac ab \right.$ | `\left\lbrace \dfrac ab \right.`| | -| \leftarrow | $\leftarrow$ | | | -| \Leftarrow | $\Leftarrow$ | | | -| \LeftArrow | (Not supported) | Non standard | | -| \leftarrowtail | $\leftarrowtail$ | | ams | -| \leftharpoondown | $\leftharpoondown$ | | | -| \leftharpoonup | $\leftharpoonup$ | | | -| \leftleftarrows | $\leftleftarrows$ | | ams | -| \leftmodels | $\leftmodels$ | | MnSymbol | -| \leftmoon | $\leftmoon$ | | stix | -| \leftouterjoin | $\leftouterjoin$ | | stix | -| \Leftrightarrow | $\Leftrightarrow$ | | | -| \leftrightarrow | $\leftrightarrow$ | | | -| \leftrightarrows | $\leftrightarrows$ | | ams | -| \leftrightharpoons | $\leftrightharpoons$ | | ams | -| \leftrightsquigarrow | $\leftrightsquigarrow$ | | ams | -| \leftroot | (Not supported) | | | -| \leftthreetimes | $\leftthreetimes$ | | ams | -| \leq | $\leq$ | | | -| \leqalignno | (Not supported) | | | -| \leqq | $\leqq$ | | ams | -| \leqslant | $\leqslant$ | | ams | -| \lessapprox | $\lessapprox$ | | ams | -| \lessdot | $\lessdot$ | | ams | -| \lesseqgtr | $\lesseqgtr$ | | ams | -| \lesseqqgtr | $\lesseqqgtr$ | | ams | -| \lessgtr | $\lessgtr$ | | ams | -| \lesssim | $\lesssim$ | | ams | -| \let | | | | -| \lfloor | $\lfloor$ | | | -| \lg | $\lg$ | | | -| \lgroup | $\lgroup$ | | | -| \lhd | $\lhd$ | | ams | -| \lightning | $\lightning$ | | | -| \lim | $\lim$ | | | -| \liminf | $\liminf$ | | | -| \limits | $\lim\limits_x$ | `\lim\limits_x`| | -| \limsup | $\limsup$ | | | -| \ll | $\ll$ | | | -| \llangle | $\llangle A\rrangle$ | `\llangle A\rrangle` | unicode-math | -| \llap | ${=}\llap{/\,}$ | `{=}\llap{/\,}`| | -| \llbracket | $\llbracket$ | | stmaryrd | -| \llcorner | $\llcorner$ | | ams | -| \Lleftarrow | $\Lleftarrow$ | | ams | -| \lll | $\lll$ | | ams | -| \llless | $\llless$ | | ams | -| \lmoustache | $\lmoustache$ | | | -| \ln | $\ln$ | | | -| \lnapprox | $\lnapprox$ | | ams | -| \lneq | $\lneq$ | | ams | -| \lneqq | $\lneqq$ | | ams | -| \lnot | $\lnot$ | | | -| \lnsim | $\lnsim$ | | ams | -| \log | $\log$ | | | -| \long | | | | -| \Longleftarrow | $\Longleftarrow$ | | | -| \longleftarrow | $\longleftarrow$ | | | -| \Longleftrightarrow | $\Longleftrightarrow$ | | | -| \longleftrightarrow | $\longleftrightarrow$ | | | -| \longmapsto | $\longmapsto$ | | | -| \Longrightarrow | $\Longrightarrow$ | | | -| \longrightarrow | $\longrightarrow$ | | | -| \looparrowleft | $\looparrowleft$ | | ams | -| \looparrowright | $\looparrowright$ | | ams | -| \lor | $\lor$ | | | -| \lower | $M\lower5pt{M^2}M$ | `M\lower5pt{M^2}M`  or
`M\lower5pt\hbox{$M^2$}M`| | -| \lozenge | $\lozenge$ | | ams | -| \lozengeminus | $\lozengeminus$ | | stix | -| \lparen | $\lparen$ | | mathtools | -| \Lrarr | $\Lrarr$ | | texvc extension | -| \lrArr | $\lrArr$ | | texvc extension | -| \lrarr | $\lrarr$ | | texvc extension | -| \lrcorner | $\lrcorner$ | | ams | -| \lq | $\lq$ | | | -| \Lsh | $\Lsh$ | | ams | -| \lt | $\lt$ | | MathJax | -| \ltimes | $\ltimes$ | | ams | -| \lVert | $\lVert$ | | ams | -| \lvert | $\lvert$ | | ams | -| \lvertneqq | $\lvertneqq$ | | ams | - -## M - -| Function | Rendered | Source or Comment | Package | -|----------------|-------------|-------------------|-----------| -|\male|$\male$ || stix | -|\maltese|$\maltese$ || ams | -|\mapsfrom|$\mapsfrom$ || stmaryrd | -|\mapsto|$\mapsto$ ||| -|\mathbb|$\mathbb{AB}$ |`\mathbb{AB}`| ams | -|\mathbf|$\mathbf{AaBb123}$ |`\mathbf{AaBb123}`|| -|\mathbin|$a\mathbin{!}b$ |`a\mathbin{!}b`|| -|\mathcal|$\mathcal{AaBb}$ |`\mathcal{AaBb}`|| -|\mathchoice|$a\mathchoice{\,}{\,\,}{\,\,\,}{\,\,\,\,}b$ |`a\mathchoice{\,}{\,\,}{\,\,\,}{\,\,\,\,}b`|| -|\mathclap|$\displaystyle\sum_{\mathclap{1\le i\le n}} x_{i}$ |`\sum_{\mathclap{1\le i\le n}} x_{i}`| mathtools | -|\mathclose|$a + (b\mathclose\gt + c$ |`a + (b\mathclose\gt + c`|| -|\mathellipsis|$\mathellipsis$ ||| -|\mathfrak|$\mathfrak{AaBb}$ |`\mathfrak{AaBb}`| ams | -|\mathinner|$ab\mathinner{\text{inside}}cd$ |`ab\mathinner{\text{inside}}cd`|| -|\mathit|$\mathit{AaBb}$ |`\mathit{AaBb}`|| -|\mathllap|${=}\mathllap{/\,}$ |`{=}\mathllap{/\,}`| mathtools | -|\mathnormal|$\mathnormal{AaBb}$ |`\mathnormal{AaBb}`|| -|\mathop|$\mathop{\star}_a^b$ |`\mathop{\star}_a^b`|| -|\mathopen|$a + \mathopen\lt b) + c$ |`a + \mathopen\lt b) + c`|| -|\mathord|$1\mathord{,}234{,}567$ |`1\mathord{,}234{,}567`|| -|\mathpunct|$A\mathpunct{-}B$ |`A\mathpunct{-}B`|| -|\mathrel|$a \mathrel{\#} b$ |`a \mathrel{\#} b`|| -|\mathrlap|$\mathrlap{\,/}{=}$ |`\mathrlap{\,/}{=}`| mathtools | -|\mathring|$\mathring{a}$ |`\mathring{a}`| ams | -|\mathrm|$\mathrm{AaBb12}$ |`\mathrm{AaBb12}`|| -|\mathscr|$\mathscr{AB}$ |`\mathscr{AB}`|| -|\mathsf|$\mathsf{AaBb123}$ |`\mathsf{AaBb123}`|| -|\mathsterling|$\mathsterling$ ||| -|\mathstrut|$\sqrt{\mathstrut a}$ |`\sqrt{\mathstrut a}`|| -|\mathtip|(Not supported)|See `\texttip`|| -|\mathtt|$\mathtt{AaBb123}$ |`\mathtt{AaBb123}`|| -|\matrix|(Not supported)|See `{matrix}`|| -|{matrix}|$\begin{matrix}a&b\\c&d\end{matrix}$ |`\begin{matrix}`
   `a & b \\`
   `c & d`
`\end{matrix}`| ams | -|{matrix*}|$\begin{matrix*}[r] -1 & 3\\ 2 & -4 \end{matrix*}$ |`\begin{matrix*}[r]`
   `-1 & 3 \\`
   `2 & -4`
`\end{matrix*}`| mathtools | -|\matrixel|$\matrixel{n}{A}{m}$ |`\matrixel{n}{A}{m}`| physics extension | -|\matrixelement|$\matrixelement{n}{A}{m}$ |`\matrixelement{n}{A}{m}`| physics extension | -|\mel|$\mel{n}{A}{m}$ |`\mel{n}{A}{m}`| physics extension | -|\max|$\max$ ||| -|\mbox|(Not supported)||| -|\md|(Not supported)||| -|\mdseries|(Not supported)||| -|\measeq|$\measeq$ || stix | -|\measuredangle|$\measuredangle$ || ams | -|\medspace|$a\medspace b$ |`a\medspace b`| ams | -|\mho|$\mho$ ||| -|\mid|$\{x∈ℝ\mid x>0\}$ |`\{x∈ℝ\mid x>0\}`|| -|\middle|$P\left(A\middle\vert B\right)$ |`P\left(A\middle\vert B\right)`| ε-TeX | -|\min|$\min$ ||| -|\minuscolon|$\minuscolon$ || colonequals | -|\minuscoloncolon|$\minuscoloncolon$ || colonequals | -|\minusdot|$\minusdot$|| stix | -|\minusfdots|$\minusfdots$|| stix | -|\minusrdots|$\minusrdots$|| stix | -|\minuso|(Not supported)| See `\standardstate`|| -|\mit|(Not supported)|See `\mathit`|| -|\mkern|$a\mkern18mu b$ |`a\mkern18mu b`|| -|\mmlToken|(Not supported)||| -|\mod|$3\equiv 5 \mod 2$ |`3\equiv 5 \mod 2`| ams | -|\models|$\models$ ||| -|\moveleft|(Not supported)||| -|\moveright|(Not supported)||| -|\mp|$\mp$ ||| -|\mskip|$a\mskip{10mu}b$ |`a\mskip{10mu}b`|| -|\mspace|(Not supported)||| -|\Mu|$\Mu$ ||| -|\mu|$\mu$ ||| -|\multicolumn|(Not supported)||| -|\multimap|$\multimap$ || ams | -|\multimapboth|$\multimapboth$ || cmll | -|\multimapinv|$\multimapinv$ || cmll | -|{multline}|$$\begin{multline}\rm uno \\ \rm dos \\ \rm tres\end{multline}$$|`\begin{multline}`
  `\rm uno \\`
  `\rm dos \\`
  `\rm tres`
`\end{multline}`| ams | -|{multline*}|$$\begin{multline*}\rm uno \\ \rm dos \\ \rm tres\end{multline*}$$|`\begin{multline*}`
  `\rm uno \\`
  `\rm dos \\`
  `\rm tres`
`\end{multline*}`| ams | - -## N - -
- -| Function | Rendered | Source or Comment | Package | -|----------------|-------------|-------------------|-----------| -|\N|$\N$ || texvc extension | -|\nabla|$\nabla$ ||| -|\Nand|$\Nand$|| stix | -|\natnums|$\natnums$ || texvc extension | -|\natural|$\natural$ ||| -|\negmedspace|$a\negmedspace b$ |`a\negmedspace b`| ams | -|\ncong|$\ncong$ || ams | -|\ne|$\ne$ ||| -|\nearrow|$\nearrow$ ||| -|\neg|$\neg$ ||| -|\negthickspace|$a\negthickspace b$ |`a\negthickspace b`| ams | -|\negthinspace|$a\negthinspace b$ |`a\negthinspace b`| ams | -|\neq|$\neq$ ||| -|\newcommand|$\newcommand\chk{\checkmark} \chk$ |`\newcommand\chk{\checkmark} \chk`| newcommand | -|\newenvironment|(Not supported)||| -|\newextarrow|(Not supported)|| extpfeil | -|\newline|$a\newline b$ |`a\newline b`|| -|\nexists|$\nexists$ || ams | -|\ngeq|$\ngeq$ || ams | -|\ngeqq|$\ngeqq$ || ams | -|\ngeqslant|$\ngeqslant$ || ams | -|\ngtr|$\ngtr$ || ams | -|\ni|$\ni$ ||| -|\nleftarrow|$\nleftarrow$ || ams | -|\nLeftarrow|$\nLeftarrow$ || ams | -|\nLeftrightarrow|$\nLeftrightarrow$ || ams | -|\nleftrightarrow|$\nleftrightarrow$ || ams | -|\nleq|$\nleq$ || ams | -|\nleqq|$\nleqq$ || ams | -|\nleqslant|$\nleqslant$ || ams | -|\nless|$\nless$ || ams | -|\nmid|$\nmid$ || ams | -|\nobreak|||| -|\nobreakspace|$a\nobreakspace b$ |`a\nobreakspace b`| ams | -|\noexpand|||| -|\nolimits|$\lim\nolimits_x$ |`\lim\nolimits_x`|| -|\Nor|$\Nor$|| stix | -|\norm|$\norm{x}$ |\norm{x}| physics extension | -|\normalfont|(Not supported)||| -|\normalsize|$\normalsize normalsize$ |`\normalsize normalsize`|| -|\not|$\not =$ |`\not =`|| -|\notag|$$\begin{align} a&=b \\ \notag d+e&=f \end{align}$$|`\begin{align}`
  `a&=b \\`
  `\notag d+e&=f`
`\end{align}`| ams | -|\notin|$\notin$ ||| -|\notni|$\notni$ || txfonts/pxfonts | -|\nparallel|$\nparallel$ || ams | -|\nprec|$\nprec$ || ams | -|\npreceq|$\npreceq$ || ams | -|\nRightarrow|$\nRightarrow$ || ams | -|\nrightarrow|$\nrightarrow$ || ams | -|\nshortmid|$\nshortmid$ || ams | -|\nshortparallel|$\nshortparallel$ || ams | -|\nsim|$\nsim$ || ams | -|\nsubset|$\nsubset$ || mathabx | -|\nsubseteq|$\nsubseteq$ || ams | -|\nsubseteqq|$\nsubseteqq$ || ams | -|\nsucc|$\nsucc$ || ams | -|\nsucceq|$\nsucceq$ || ams | -|\nsupset|$\nsupset$ || mathabx | -|\nsupseteq|$\nsupseteq$ || ams | -|\nsupseteqq|$\nsupseteqq$ || ams | -|\ntriangleleft|$\ntriangleleft$ || ams | -|\ntrianglelefteq|$\ntrianglelefteq$ || ams | -|\ntriangleright|$\ntriangleright$ || ams | -|\ntrianglerighteq|$\ntrianglerighteq$ || ams | -|\Nu|$\Nu$ ||| -|\nu|$\nu$ ||| -|\nVDash|$\nVDash$ || ams | -|\nVdash|$\nVdash$ || ams | -|\nvDash|$\nvDash$ || ams | -|\nvdash|$\nvdash$ || ams | -|\nwarrow|$\nwarrow$ ||| - -## O - -| Function | Rendered | Source or Comment | Package | -|----------------|-------------|-------------------|-----------| -|\O|$\text{\O}$ |`\text{\O}`|| -|\o|$\text{\o}$ |`\text{\o}`|| -|\obar|$\obar$ || stix | -|\obslash|$\obslash$ || stix | -|\oc|$\oc$ || cmll | -|\odiv|$\odiv$ || stix | -|\odot|$\odot$ ||| -|\odv|$\odv{f}{x}$ |`\odv{f}{x}`| derivative | -|\odv*|$\odv*{f}{x}$ |`\odv*{f}{x}`| derivative | -|\OE|$\text{\OE}$ |`\text{\OE}`|| -|\oe|$\text{\oe}$ |`\text{\oe}`|| -|\officialeuro|(Not supported)|See `\euro`|| -|\ogreaterthan|$\ogreaterthan$ || stix | -|\oiiint|$\oiiint$ ||| -|\oiint|$\oiint$ ||| -|\oint|$\oint$ ||| -|\oldstyle|(Not supported)||| -|\oldstylenums|(Not supported)||| -|\olessthan|$\olessthan$ || stix | -|\omega|$\omega$ ||| -|\Omega|$\Omega$ ||| -|\Omicron|$\Omicron$ ||| -|\omicron|$\omicron$ ||| -|\ominus|$\ominus$ ||| -|\op|$\op{a}{b}$ |`\op{a}{b}`| physics extension | -|\operatorname|$\operatorname{asin} x$ |\operatorname{asin} x| ams | -|\operatorname\*|$\operatorname*{asin}\limits_y x$ |`\operatorname*{asin}\limits_y x`| ams | -|\operatornamewithlimits|$\operatornamewithlimits{asin}\limits_y x$ |`\operatornamewithlimits{asin}\limits_y x`| | -|\operp|$\operp$ || stix | -|\oplus|$\oplus$ ||| -|\or|(Not supported)||| -|\order|$\order{x^2}$ |`\order{x^2}`| physics extension | -|\origof|$\origof$ || stix | -|\oslash|$\oslash$ ||| -|\otimes|$\otimes$ ||| -|\Otimes|$\Otimes$ || stix | -|\otimeshat|$\otimeshat$ || stix | -|\outerproduct|$\outerproduct{a}{b}$ |`\outerproduct{a}{b}`| physics extension | -|\over|${a+1 \over b+2}+c$ |`{a+1 \over b+2}+c`|| -|\overbrace|$\overbrace{x+⋯+x}^{n\text{ times}}$ |`\overbrace{x+⋯+x}^{n\text{ times}}`|| -|\overbracket|(Not supported)||| -|\overgroup|$\overgroup{AB}$ |`\overgroup{AB}`| MnSymbol | -|\overleftarrow|$\overleftarrow{AB}$ |`\overleftarrow{AB}`| ams | -|\overleftharpoon|$\overleftharpoon{AB}$ |`\overleftharpoon{AB}`| MnSymbol | -|\overleftrightarrow|$\overleftrightarrow{AB}$ |`\overleftrightarrow{AB}`| ams | -|\overline|$\overline{\text{a long argument}}$ |`\overline{\text{a long argument}}`|| -|\overlinesegment|(Not supported)||| -|\overparen|$\overparen{abc}$ |`\overparen{abc}`|| -|\Overrightarrow|$\Overrightarrow{AB}$ |`\Overrightarrow{AB}`| overrightarrow | -|\overrightarrow|$\overrightarrow{AB}$ |`\overrightarrow{AB}`| ams | -|\overrightharpoon|$\overrightharpoon{ac}$ |`\overrightharpoon{ac}`|| -|\overset|$\overset{!}{=}$ |`\overset{!}{=}`| ams | -|\overwithdelims|(Not supported)||| -|\owns|$\owns$ ||| - -## P - -| Function | Rendered | Source or Comment | Package | -|----------------|-------------|-------------------|-----------| -|\P|$\text{\P}$ |`\text{\P}` or `\P`|| -|\pagecolor|(Not supported)|[Deprecated](https://en.wikipedia.org/wiki/Help:Displaying_a_formula#Deprecated_syntax)| texvc | -|\parallel|$\parallel$ ||| -|\parr|$\parr$ || cmll | -|\part|(Not supported)|[Deprecated](https://en.wikipedia.org/wiki/Help:Displaying_a_formula#Deprecated_syntax)| texvc | -|\partial|$\partial$ ||| -|\partialderivative|$\partialderivative{x}{y}$ |`\partialderivative{x}{y}`| physics extension | -|\pb|$\pb{x}{y}$ |`\pb{x}{y}`| physics extension | -|\pdv|$\pdv{f}{x,y}$ |`\pdv{f}{x,y}`| derivative | -|\pdv*|$\pdv*{f}{x,y}$ |`\pdv*{f}{x,y}`| derivative | -|\permil|$\permil$ || wasysym | -|\perp|$\perp$ ||| -|\Perp|$\Perp$ || cmll | -|\phantom|$\Gamma^{\phantom{i}j}_{i\phantom{j}k}$ |`\Gamma^{\phantom{i}j}_{i\phantom{j}k}`|| -|\phase|(Not supported)||| -|\Phi|$\Phi$ ||| -|\phi|$\phi$ ||| -|\Pi|$\Pi$ ||| -|\pi|$\pi$ ||| -|{picture}|(Not supported)||| -|\pitchfork|$\pitchfork$ || ams | -|\plim|$\plim$ || statmath | -|\plusmn|$\plusmn$ || texvc extension | -|\pm|$\pm$ ||| -|\pmatrix|(Not supported)| See `{pmatrix}` || -|{pmatrix}|$\begin{pmatrix}a&b\\c&d\end{pmatrix}$ |`\begin{pmatrix}`
   `a & b \\`
   `c & d`
`\end{pmatrix}`| ams | -|{pmatrix*}|$\begin{pmatrix*}[r] -1 & 3\\ 2 & -4 \end{pmatrix*}$ |`\begin{pmatrix*}[r]`
   `-1 & 3 \\`
   `2 & -4`
`\end{pmatrix*}`| mathtools | -|\pmb|$\pmb{\mu}$ |`\pmb{\mu}`| ams | -|\pmod|$x\pmod a$ |`x\pmod a`|| -|\pod|$x \pod a$ |`x \pod a`| ams | -|\pointint|$\pointint$ ||| -|\poissonbracket|$\poissonbracket{A}{B}$ |`\poissonbracket{A}{B}`| physics extension | -|\pounds|$\pounds$ ||| -|\pqty|$\pqty{5}$ |`\pqty{5}`| physics extension | -|\Pr|$\Pr$ ||| -|\prec|$\prec$ ||| -|\precapprox|$\precapprox$ || ams | -|\preccurlyeq|$\preccurlyeq$ || ams | -|\preceq|$\preceq$ || ams | -|\precnapprox|$\precnapprox$ || ams | -|\precneqq|$\precneqq$ || ams | -|\precnsim|$\precnsim$ || ams | -|\precsim|$\precsim$ || ams | -|\prescript|$\prescript{a}{2}{\mathbf{C}}^{5+}_{2}$ |`\prescript{a}{2}{\mathbf{C}}^{5+}_{2}`| mathtools | -|\prime|$\prime$ ||| -|\principalvalue|$\principalvalue$ || physics extension | -|\pv|$\pv$ || physics extension | -|\PV|$\PV(x)$ |`\PV(x)`| physics extension | -|\prod|$\prod$ ||| -|\projlim|$\projlim$ |`\projlim`| ams | -|\propto|$\propto$ ||| -|\providecommand|$\providecommand\greet{\text{Hello}} \greet$ |`\providecommand\greet{\text{Hello}}`
`\greet`|| -|\psi|$\psi$ ||| -|\Psi|$\Psi$ ||| -|\pu |${123~\mathchoice{\textstyle\frac{\mathrm{kJ}}{\mathrm{mol}}}{\frac{\mathrm{kJ}}{\mathrm{mol}}}{\frac{\mathrm{kJ}}{\mathrm{mol}}}{\frac{\mathrm{kJ}}{\mathrm{mol}}}}$ |`\pu{123 kJ//mol}`| mhchem extension | - -## Q - -| Function | Rendered | Source or Comment | Package | -|-------------|--------------------------|-------------------------|-------------------| -| \Q | (Not supported) | See `\Bbb{Q}` | | -| \qall | $\qall$ | | physics extension | -| \qand | $\qand$ | | physics extension | -| \qas | $\qas$ | | physics extension | -| \qassume | $\qassume$ | | physics extension | -| \qc | $\qc$ | | physics extension | -| \qcc | $\qcc$ | | physics extension | -| \qcomma | $\qcomma$ | | physics extension | -| \QED | $\QED$ | | stix | -| \qelse | $\qelse$ | | physics extension | -| \qeven | $\qeven$ | | physics extension | -| \qfor | $\qfor$ | | physics extension | -| \qgiven | $\qgiven$ | | physics extension | -| \qif | $\qif$ | | physics extension | -| \qin | $\qin$ | | physics extension | -| \qinteger | $\qinteger$ | | physics extension | -| \qlet | $\qlet$ | | physics extension | -| \qodd | $\qodd$ | | physics extension | -| \qor | $\qor$ | | physics extension | -| \qotherwise | $\qotherwise$ | | physics extension | -| \qprime | $f^\qprime$ | `f^\qprime` | stix | -| \qq | $\qq{text}$ | `\qq{text}` | physics extension | -| \qqtext | $\qqtext{text}$ | `\qqtext{text}` | physics extension | -| \qquad | $a\qquad\qquad{b}$ | `a\qquad\qquad{b}` | | -| \qsince | $\qsince$ | | physics extension | -| \qthen | $\qthen$ | | physics extension | -| \qty | $\qty{5 \text{m}}$ | `\qty{5 \text{m}}` | physics extension | -| \quad | $a\quad\quad{b}$ | `a\quad\quad{b}` | | -| \quantity | $\quantity{5 \text{m}}$ | `\quantity{5 \text{m}}` | physics extension | -| \qunless | $\qunless$ | | physics extension | -| \qusing | $\qusing$ | | physics extension | -| \questeq | $\questeq$ | | stix | - -## R - -| Function | Rendered | Source or Comment | Package | -|--------------------|-------------|-------------------|-----------| -| \R | $\R$| | texvc extension | -| \r | $\text{\r{a}}$| `\text{\r{a}}`| | -| \raise | $M\raise3pt{M^2}M$| `M\raise3pt{M^2}M`  or
`M\raise3pt\hbox{$M^2$}M`| | -| \raisebox | $h\raisebox{2pt}{ighe}r$| `h\raisebox{2pt}{ighe}r`| | -| \rang | $\langle A\rang$| `\langle A\rang` | texvc extension | -| \rAngle | $\lAngle A\rAngle$| `\lAngle A\rAngle`| unicode-math | -| \rangle | $\langle A\rangle$| `\langle A\rangle`| | -| \rank | $\rank M$| `\rank M`| physics extension | -| \Rarr | $\Rarr$| | texvc extension | -| \rArr | $\rArr$| | texvc extension | -| \rarr | $\rarr$| | texvc extension | -| \ratio | $\ratio$| | colonequals | -| \rBrace | $\rBrace$| | stix | -| \rbrace | $\rbrace$| | | -| \rbrack | $\rbrack$| | | -| {rcases} | $\begin{rcases}a&\text{if }b\\c&\text{if }d\end{rcases}$| `\begin{rcases}`
   `a &\text{if } b \\`
   `c &\text{if } d`
`\end{rcases}`| mathtools | -| \rceil | $\rceil$| | | -| \Re | $\Re$| | | -| \real | $\real$| | texvc extension | -| \Reals | $\Reals$| | texvc extension | -| \reals | $\reals$| | texvc extension | -| \ref | $\ref{tag1}$| `\ref{tag1}`
Some sites do not support `\ref`.| | -| \reflectbox | $\reflectbox{S}$ | `\reflectbox{S}` | graphicx | -| \relax | | | | -| \renewcommand | $\def\hail{Hi!}\renewcommand\hail{\text{Ahoy!}} \hail$| `\def\hail{Hi!}`
`\renewcommand\hail{\text{Ahoy!}}`
`\hail`| newcommand | -| \renewenvironment | (Not supported)| | newcommand | -| \require | (Not supported)| | | -| \Res | $\Res[f(z)]$| `\Res[f(z)]`| physics extension | -| \restriction | $\restriction$| | ams | -| \rfloor | $\rfloor$| | | -| \rgroup | $\rgroup$| | | -| \rhd | $\rhd$| | ams | -| \Rho | $\Rho$| | | -| \rho | $\rho$| | | -| \right | $\left.\dfrac a b\right)$| `\left.\dfrac a b\right)`| | -| \Rightarrow | $\Rightarrow$| | | -| \rightarrow | $\rightarrow$| | | -| \rightarrowtail | $\rightarrowtail$| | ams | -| \rightharpoondown | $\rightharpoondown$| | | -| \rightharpoonup | $\rightharpoonup$| | | -| \rightleftarrows | $\rightleftarrows$| | ams | -| \rightleftharpoons | $\rightleftharpoons$| | ams | -| \rightmoon | $\rightmoon$ | | stix | -| \rightouterjoin | $\rightouterjoin$ | | stix | -| \rightrightarrows | $\rightrightarrows$| | ams | -| \rightsquigarrow | $\rightsquigarrow$| | ams | -| \rightthreetimes | $\rightthreetimes$| | ams | -| \risingdotseq | $\risingdotseq$| | ams | -| \rlap | $\rlap{\,/}{=}$| `\rlap{\,/}{=}`| | -| \rm | ${\rm AaBb12}$| `{\rm AaBb12}`| | -| \rmoustache | $\rmoustache$| | | -| \root | (Not supported)| | | -| \rotatebox | (Not supported)| | | -| \rparen | $\rparen$| | mathtools | -| \rppolint | $\rppolint$| | | -| \rq | $\rq$| | | -| \rrangle | $\llangle A\rrangle$ | `\llangle A\rrangle` | unicode-math | -| \rrbracket | $\rrbracket$| | stmaryrd | -| \Rrightarrow | $\Rrightarrow$| | ams | -| \Rsh | $\Rsh$| | ams | -| \rtimes | $\rtimes$| | ams | -| \Rule | (Not supported)| see `\rule`| | -| \rule | $x\rule[6pt]{2ex}{1ex}x$| `x\rule[6pt]{2ex}{1ex}x`| | -| \rVert | $\rVert$| | ams | -| \rvert | $\rvert$| | ams | - -## S - -
- -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| Function | Rendered | Source or Comment | Package | -+=====================+======================================+==================================+====================+ -| \\S | $\text{\S}$ | `\text{\S}` or`\S` | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\Sampi | $\Sampi$ | | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\sampi | $\sampi$ | | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\sc | (Not supported) | See`\textsc` | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\scoh | $\scoh$ | | cmll | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\scalebox | (Not supported) | | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\scpolint | $\scpolint$ | | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\scr | (Not supported) | See`\mathscr` | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\scriptscriptstyle | $\scriptscriptstyle \frac | `\scriptscriptstyle \frac | | -| | cd$ | cd` | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\scriptsize | $\scriptsize scriptsize$ | `\scriptsize scriptsize` | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\scriptstyle | $A{\scriptstyle B}$ | `A{\scriptstyle B}` | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\sdot | $\sdot$ | | texvc extension | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\searrow | $\searrow$ | | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\sec | $\sec$ | | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\sect | $\text{\sect}$ | `\text{\sect}` | texvc extension | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\set | $\Set{ x | x<5 }$ | `\set{x | x<5}` | braket | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\Set | $\Set{ x | x<\tfrac 1 2 }$ | `\Set{ x | x < \tfrac 1 2 }` | braket | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\setlength | (Not supported) | | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\setminus | $\setminus$ | | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\sf | ${\sf AaBb123}$ | `{\sf AaBb123}` | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\sgn | $\sgn$ | | mismath | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\sharp | $\sharp$ | | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\shift | $\shift$ | | cmll | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\shneg | $\shneg$ | | cmll | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\shortmid | $\shortmid$ | | ams | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\shortparallel | $\shortparallel$ | | ams | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\shoveleft | (Not supported) | | ams | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\shoveright | (Not supported) | | ams | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\shpos | $\shpos$ | | cmll | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\shuffle | $\shuffle$ | | stix | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\sideset | $\sideset{_a^b}{_c^d}\sum$ | `\sideset{_a^b}{_c^d}\sum` | ams | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\Sigma | $\Sigma$ | | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\sigma | $\sigma$ | | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\sim | $\sim$ | | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\simeq | $\simeq$ | | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\sin | $\sin$ | | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\sincoh | $\sincoh$ | | cmll | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\sinh | $\sinh$ | | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\sixptsize | $\sixptsize sixptsize$ | `\sixptsize sixptsize` | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\sh | $\sh$ | | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\skew | (Not supported) | | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\skip | (Not supported) | | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\sl | (Not supported) | | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\small | $\small small$ | `\small small` | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\smallfrown | $\smallfrown$ | | ams | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\smallint | $\smallint$ | | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| {smallmatrix} | $\begin{smallmatrix} a & | `\begin{smallmatrix}`\ | | -| | b \\ c & d |    `a & b \\`\ | | -| | \end{smallmatrix}$ |    `c & d`\ | | -| | | `\end{smallmatrix}` | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\smallsetminus | $\smallsetminus$ | | ams | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\smallsmile | $\smallsmile$ | | ams | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\smash | $\left(x^{\smash{2}}\right)$ | `\left(x^{\smash{2}}\right)` | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\smashtimes | $\smashtimes$ | | stix | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\smile | $\smile$ | | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\smiley | $\smiley$ | | wasysym | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\sout | $\sout{abc}$ | `\sout{abc}` | ulem | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\Space | (Not supported) | see`\space` | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\space | $a\space b$ | `a\space b` | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\spades | $\spades$ | | texvc extension | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\spadesuit | $\spadesuit$ | | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\sphericalangle | $\sphericalangle$ | | ams | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| {split} | $$ \begin{equation} | `\begin{equation}`\ | ams | -| | \begin{split} | `\begin{split}`\ | | -| | a &=b+c\\ |    `a &=b+c\\`\ | | -| | &=e+f |       `&=e+f`\ | | -| | \end{split} | `\end{split}`\ | | -| | \end{equation} $$ | `\end{equation}` | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\sqcap | $\sqcap$ | | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\Sqcap | $\Sqcap$ | | stix | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\sqcup | $\sqcup$ | | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\Sqcup | $\Sqcup$ | | stix | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\sqint | $\sqint$ | | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\square | $\square$ | | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\sqrt | $\sqrt[3]{x}$ | `\sqrt[3]{x}` | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\sqsubset | $\sqsubset$ | | ams | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\sqsubseteq | $\sqsubseteq$ | | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\sqsupset | $\sqsupset$ | | ams | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\sqsupseteq | $\sqsupseteq$ | | ams | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\ss | $\text{\ss}$ | `\text{\ss}` | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\sslash | $\sslash$ | | stmaryrd | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\stackrel | $\stackrel{!}{=}$ | `\stackrel{!}{=}` | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\standardstate | $\standardstate$ | | chemstyle | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\star | $\star$ | | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\stareq | $\stareq$ | | stix | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\Stigma | $\Stigma$ | | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\stigma | $\stigma$ | | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\strictif | $\strictif$ | | txfonts/pxfonts | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\strictfi | $\strictfi$ | | txfonts/pxfonts | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\strut | (Not supported) | | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\style | (Not supported) | Non standard | | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| \\sub | $\sub$ | | texvc extension | -+---------------------+--------------------------------------+----------------------------------+--------------------+ -| {subarray} | $$ \sum_{\begin{subarray}{l} | `\sum_{\begin{subarray}{l}`\ | ams | -| | i\in\Lambda\\ |  `i\in\Lambda\\`\ | | -| | 0 - -| Function | Rendered | Source or Comment | Package | -|----------------|-------------|-------------------|-----------| -|\tag|$$\tag{hi} e=mc^2 \label{tag1}$$|`\tag{hi} e=mc^2 \label{tag1}`| ams | -|\tag*|$$\tag*{hey} e=mc^2$$|`\tag*{hey} e=mc^2`| ams | -|\tan|$\tan$||| -|\tanh|$\tanh$||| -|\Tau|$\Tau$||| -|\tau|$\tau$||| -|\tbinom|$\tbinom n k$|`\tbinom n k`| ams | -|\TeX|$\TeX$||| -|\text|$\text{ yes }\&\text{ no }$|`\text{ yes }\&\text{ no }`|| -|\textasciitilde|$\text{\textasciitilde}$|`\text{\textasciitilde}`|| -|\textasciicircum|$\text{\textasciicircum}$|`\text{\textasciicircum}`|| -|\textbackslash|$\text{\textbackslash}$|`\text{\textbackslash}`|| -|\textbar|$\text{\textbar}$|`\text{\textbar}`|| -|\textbardbl|$\text{\textbardbl}$|`\text{\textbardbl}`|| -|\textbf|$\textbf{AaBb123}$|`\textbf{AaBb123}`|| -|\textbraceleft|$\text{\textbraceleft}$|`\text{\textbraceleft}`|| -|\textbraceright|$\text{\textbraceright}$|`\text{\textbraceright}`|| -|\textbullet|$\text{\textbullet}$|`\text{\textbullet}`|| -|\textcircled|(Not supported)||| -|\textcolor|$\textcolor{blue}{F=ma}$|`\textcolor{blue}{F=ma}`| color | -|\textdagger|$\text{\textdagger}$|`\text{\textdagger}`|| -|\textdaggerdbl|$\text{\textdaggerdbl}$|`\text{\textdaggerdbl}`|| -|\textdegree|$\text{\textdegree}$|`\text{\textdegree}`|| -|\textdollar|$\text{\textdollar}$|`\text{\textdollar}`|| -|\textellipsis|$\text{\textellipsis}$|`\text{\textellipsis}`|| -|\textemdash|$\text{\textemdash}$|`\text{\textemdash}`|| -|\textendash|$\text{\textendash}$|`\text{\textendash}`|| -|\\texteuro|$\text{\texteuro}$|`\text{\texteuro}`|| -|\textgreater|$\text{\textgreater}$|`\text{\textgreater}`|| -|\textit|$\textit{AaBb}$|`\textit{AaBb}`|| -|\textless|$\text{\textless}$|`\text{\textless}`|| -|\textmd|$\textmd{AaBb123}$|`\textmd{AaBb123}`|| -|\textnormal|$\textnormal{AB}$|`\textnormal{AB}`|| -|\textquotedblleft|$\text{\textquotedblleft}$|`\text{\textquotedblleft}`|| -|\textquotedblright|$\text{\textquotedblright}$|`\text{\textquotedblright}`|| -|\textquoteleft|$\text{\textquoteleft}$|`\text{\textquoteleft}`|| -|\textquoteright|$\text{\textquoteright}$|`\text{\textquoteright}`|| -|\textregistered|$\text{\textregistered}$|`\text{\textregistered}`|| -|\textrm|$\textrm{AaBb123}$|`\textrm{AaBb123}`|| -|\textsc|$\textsc{hey}$|`\textsc{hey}`|| -|\textsf|$\textsf{AaBb123}$|`\textsf{AaBb123}`|| -|\textsl|(Not supported)||| -|\textsterling|$\text{\textsterling}$|`\text{\textsterling}`|| -|\textstyle|$\textstyle\sum_0^n$|`\textstyle\sum_0^n`|| -|\texttt|$\texttt{AaBb123}$|`\texttt{AaBb123}`|| -|\textunderscore|$\text{\textunderscore}$|`\text{\textunderscore}`|| -|\textup|$\textup{AaBb123}$|`\textup{AaBb123}`|| -|\textvisiblespace|$\text{\textvisiblespace}$|`\text{\textvisiblespace}`|| -|\tfrac|$\tfrac ab$|`\tfrac ab`| ams | -|\tg|$\tg$||| -|\th|$\th$||| -|\therefore|$\therefore$|| ams | -|\Theta|$\Theta$||| -|\theta|$\theta$||| -|\thetasym|$\thetasym$|| texvc extension | -|\thickapprox|$\thickapprox$|| ams | -|\thicksim|$\thicksim$|| ams | -|\thickspace|$a\thickspace b$|`a\thickspace b`| ams | -|\thinspace|$a\thinspace b$|`a\thinspace b`| ams | -|\threedotcolon|$\threedotcolon$|| stix | -|\tilde|$\tilde M$|`\tilde M`|| -|\times|$\times$||| -|\Tiny|$\Tiny Tiny$|`\Tiny Tiny`|| -|\tiny|$\tiny tiny$|`\tiny tiny`|| -|\to|$\to$||| -|\top|$\top$||| -|\Tr|$\Tr\rho$|`\Tr\rho`| physics extension | -|\tr|$\tr\rho$|`\tr\rho`| physics extension | -|\triangle|$\triangle$||| -|\triangledown|$\triangledown$|| ams | -|\triangleleft|$\triangleleft$||| -|\trianglelefteq|$\trianglelefteq$|| ams | -|\triangleq|$\triangleq$|| ams | -|\triangleminus|$\triangleminus$|| stix | -|\triangleplus|$\triangleplus$|| stix | -|\triangleright|$\triangleright$||| -|\trianglerighteq|$\trianglerighteq$|| ams | -|\triangletimes|$\triangletimes$|| stix | -|\trprime|$f^\trprime$|`f^\trprime`| stix | -|\tt|${\tt AaBb123}$|`{\tt AaBb123}`|| -|\twocaps|$\twocaps$|| stix | -|\twocups|$\twocups$|| stix | -|\twoheadleftarrow|$\twoheadleftarrow$|| ams | -|\twoheadrightarrow|$\twoheadrightarrow$|| ams | -|\typecolon|$\typecolon$|| stix | - -## U - -| Function | Rendered | Source or Comment | Package | -|----------------------|-----------------------------|----------------------------|-----------------| -| \u | $\text{\u{a}}$ | `\text{\u{a}}` | | -| \Uarr | $\Uarr$ | | texvc extension | -| \uArr | $\uArr$ | | texvc extension | -| \uarr | $\uarr$ | | texvc extension | -| \ulcorner | $\ulcorner$ | | ams | -| \underbar | $\underbar{X}$ | `\underbar{X}` | | -| \underbrace | $\underbrace{x+⋯+x}_{n\text{ times}}$ | `\underbrace{x+⋯+x}_{n\text{ times}}`| | -| \underbracket | (Not supported) | | | -| \undergroup | $\undergroup{AB}$ | `\undergroup{AB}` | MnSymbol | -| \underleftarrow | $\underleftarrow{AB}$ | `\underleftarrow{AB}` | ams | -| \underleftrightarrow | $\underleftrightarrow{AB}$ | `\underleftrightarrow{AB}` | ams | -| \underrightarrow | $\underrightarrow{AB}$ | `\underrightarrow{AB}` | ams | -| \underline | $\underline{\text{a long argument}}$ | `\underline{\text{a long argument}}`| | -| \underlinesegment | (Not supported) | | | -| \underparen | $\underparen{abc}$ | `\underparen{abc}` | | -| \underrightarrow | $\underrightarrow{AB}$ | `\underrightarrow{AB}` | | -| \underset | $\underset{!}{=}$ | `\underset{!}{=}` | AMS | -| \unicode | (Not supported) | See `\char` | | -| \unlhd | $\unlhd$ | | ams | -| \unrhd | $\unrhd$ | | ams | -| \up | (Not supported) | | | -| \upalpha | $\upalpha$ | | upgreek | -| \Uparrow | $\Uparrow$ | | | -| \uparrow | $\uparrow$ | | | -| \upbeta | $\upbeta$ | | upgreek | -| \updelta | $\updelta$ | | upgreek | -| \upchi | $\upchi$ | | upgreek | -| \Updownarrow | $\Updownarrow$ | | | -| \updownarrow | $\updownarrow$ | | | -| \upeta | $\upeta$ | | upgreek | -| \upepsilon | $\upepsilon$ | | upgreek | -| \upgamma | $\upgamma$ | | upgreek | -| \upharpoonleft | $\upharpoonleft$ | | ams | -| \upharpoonright | $\upharpoonright$ | | ams | -| \upiota | $\upiota$ | | upgreek | -| \upkappa | $\upkappa$ | | upgreek | -| \uplambda | $\uplambda$ | | upgreek | -| \upmu | $\upmu$ | | upgreek | -| \upnu | $\upnu$ | | upgreek | -| \upomega | $\upomega$ | | upgreek | -| \upomicron | $\upomicron$ | | upgreek | -| \uplus | $\uplus$ | | upgreek | -| \upphi | $\upphi$ | | upgreek | -| \uppi | $\uppi$ | | upgreek | -| \uppsi | $\uppsi$ | | upgreek | -| \uprho | $\uprho$ | | upgreek | -| \uproot | (Not supported) | | | -| \upshape | (Not supported) | | | -| \upsigma | $\upsigma$ | | upgreek | -| \Upsilon | $\Upsilon$ | | | -| \upsilon | $\upsilon$ | | | -| \uptau | $\uptau$ | | upgreek | -| \uptheta | $\uptheta$ | | upgreek | -| \upuparrows | $\upuparrows$ | | ams | -| \upupsilon | $\upupsilon$ | | upgreek | -| \upxi | $\upxi$ | | upgreek | -| \upzeta | $\upzeta$ | | upgreek | -| \urcorner | $\urcorner$ | | ams | -| \url | $\footnotesize\url{https://temml.org/}$ | `\url{https://temml.org/}`
Requires `trust` [option](options.md)| | -| \utilde | $\utilde{AB}$ | `\utilde{AB}` | undertilde | - -## V - -| Function | Rendered | Source or Comment | Package | -|----------------|-------------|-------------------|-----------| -|\v|$\text{\v{a}}$ |`\text{\v{a}}`|| -|\va|$\va{a}$ |`\va{a}`| physics extension | -|\var|$\var$ || physics extension | -|\varcoppa|$\varcoppa$ ||| -|\varclubsuit|$\varclubsuit$ || txfonts | -|\varDelta|$\varDelta$ || ams | -|\vardiamondsuit|$\vardiamondsuit$ || txfonts | -|\varepsilon|$\varepsilon$ ||| -|\varGamma|$\varGamma$ || ams | -|\varheartsuit|$\varheartsuit$ || txfonts | -|\variation|$\variation$ || physics extension | -|\varinjlim|$\varinjlim$ |`\varinjlim`| ams | -|\varkappa|$\varkappa$ || ams | -|\varLambda|$\varLambda$ || ams | -|\varliminf|$\varliminf$ |`\varliminf`| ams | -|\varlimsup|$\varlimsup$ |`\varlimsup`| ams | -|\varnothing|$\varnothing$ || ams | -|\varointclockwise|$\varointclockwise$ ||| -|\varOmega|$\varOmega$ || ams | -|\varPhi|$\varPhi$ || ams | -|\varphi|$\varphi$ ||| -|\varPi|$\varPi$ || ams | -|\varpi|$\varpi$ ||| -|\varprojlim|$\varprojlim$ |`\varprojlim`| ams | -|\varpropto|$\varpropto$ || ams | -|\varPsi|$\varPsi$ || ams | -|\varrho|$\varrho$ ||| -|\varSigma|$\varSigma$ || ams | -|\varsigma|$\varsigma$ ||| -|\varspadesuit|$\varspadesuit$ || txfonts | -|\varstigma|(Not supported)||| -|\varsubsetneq|$\varsubsetneq$ || ams | -|\varsubsetneqq|$\varsubsetneqq$ || ams | -|\varsupsetneq|$\varsupsetneq$ || ams | -|\varsupsetneqq|$\varsupsetneqq$ || ams | -|\varTheta|$\varTheta$ || ams | -|\vartheta|$\vartheta$ ||| -|\vartriangle|$\vartriangle$ || ams | -|\vartriangleleft|$\vartriangleleft$ || ams | -|\vartriangleright|$\vartriangleright$ || ams | -|\varUpsilon|$\varUpsilon$ || ams | -|\varXi|$\varXi$ || ams | -|\vb|$\vb{a}$ |`\vb{a}`| physics extension | -|\vcentcolon|$\vcentcolon$ ||| -|\vcenter|(Not supported)||| -|\Vdash|$\Vdash$ || ams | -|\VDash|$\VDash$ || MnSymbol | -|\vDash|$\vDash$ || ams | -|\vdash|$\vdash$ ||| -|\vdot|$\vdot$ || physics extension | -|\vdots|$\vdots$ ||| -|\vec|$\vec{F}$ |`\vec{F}`|| -|\vectorarrow|$\vectorarrow{a}$ |`\vectorarrow{a}`| physics extension | -|\vectorbold|$\vectorbold{a}$ |`\vectorbold{a}`| physics extension | -|\vectorunit|$\vectorunit{a}$ |`\vectorunit{a}`| physics extension | -|\vee|$\vee$ ||| -|\Vee|$\Vee$ || stix | -|\veebar|$\veebar$ || ams | -|\veedot|$\veedot$ || stix | -|\veedoublebar|$\veedoublebar$ || stix | -|\veeeq|$\veeeq$ || stix | -|\veeonvee|$\veeonvee$|| stix | -|\verb|$\verb!\frac a b!$ |`\verb!\frac a b!`|| -|\Vert|$\Vert$ ||| -|\vert|$\vert$ ||| -|\vfil|(Not supported)||| -|\vfill|(Not supported)||| -|\vline|(Not supported)||| -|{Vmatrix}|$\begin{Vmatrix}a&b\\c&d\end{Vmatrix}$ |`\begin{Vmatrix}`
   `a & b \\`
   `c & d`
`\end{Vmatrix}`| ams | -|{Vmatrix*}|$\begin{Vmatrix*}[r] -1 & 3\\ 2 & -4 \end{Vmatrix*}$ |`\begin{Vmatrix*}[r]`
   `-1 & 3 \\`
   `2 & -4`
`\end{Vmatrix*}`| mathtools | -|{vmatrix}|$\begin{vmatrix}a&b\\c&d\end{vmatrix}$ |`\begin{vmatrix}`
   `a & b \\`
   `c & d`
`\end{vmatrix}`| ams | -|{vmatrix*}|$\begin{vmatrix*}[r] -1 & 3\\ 2 & -4 \end{vmatrix*}$ |`\begin{vmatrix*}[r]`
   `-1 & 3 \\`
   `2 & -4`
`\end{vmatrix*}`| mathtools | -|\vphantom|$\overline{\vphantom{M}a}$ |`\overline{\vphantom{M}a}`|| -|\vqty|$\vqty{x}$ |`\vqty{x}`| physics extension | -|\vu|$\vu{a}$ |`\vu{a}`| physics extension | -|\Vvdash|$\Vvdash$ || ams | - -## W - -| Function | Rendered | Source or Comment | Package | -|------------|--------------------|-------------------|-----------------| -| \wedge | $\wedge$ | | | -| \Wedge | $\Wedge$ | | stix | -| \wedgebar | $\wedgebar$ | | stix | -| \wedgedot | $\wedgedot$ | | stix | -| \wedgedoublebar | $\wedgedoublebar$ | | stix | -| \wedgeq | $\wedgeq$ | | stix | -| \wedgeonwedge | $\wedgeonwedge$ | | stix | -| \weierp | $\weierp$ | | texvc extension | -| \whitesquaretickleft | $\whitesquaretickleft$ | | stix | -| \whitesquaretickright | $\whitesquaretickright$ | | stix | -| \widecheck | $\widecheck{AB}$ |`\widecheck{AB}` | mathabx | -| \widehat | $\widehat{AB}$ |`\widehat{AB}` | | -| \wideparen | $\wideparen{abc}$ |`\wideparen{abc}` | MnSymbol | -| \widetilde | $\widetilde{AB}$ |`\widetilde{AB}` | | -| \with | $\with$ | | cmll | -| \wn | $\wn$ | | cmll | -| \wp | $\wp$ | | | -| \wr | $\wr$ | | | - -## X - -| Function | Rendered | Source or Comment | Package | -|---------------------|-----------------------------|----------------------------|-----------| -| \xcancel | $\xcancel{ABC}$ | `\xcancel{ABC}` | cancel | -| \xdef | (Not supported) | | | -| \Xi | $\Xi$ | | | -| \xi | $\xi$ | | | -| \xhookleftarrow | $\xhookleftarrow{abc}$ | `\xhookleftarrow{abc}` | mathtools | -| \xhookrightarrow | $\xhookrightarrow{abc}$ | `\xhookrightarrow{abc}` | mathtools | -| \xLeftarrow | $\xLeftarrow{abc}$ | `\xLeftarrow{abc}` | mathtools | -| \xleftarrow | $\xleftarrow{abc}$ | `\xleftarrow{abc}` | ams | -| \xleftharpoondown | $\xleftharpoondown{abc}$ | `\xleftharpoondown{abc}` | mathtools | -| \xleftharpoonup | $\xleftharpoonup{abc}$ | `\xleftharpoonup{abc}` | mathtools | -| \xLeftrightarrow | $\xLeftrightarrow{abc}$ | `\xLeftrightarrow{abc}` | mathtools | -| \xleftrightarrow | $\xleftrightarrow{abc}$ | `\xleftrightarrow{abc}` | mathtools | -| \xleftrightharpoons | $\xleftrightharpoons{abc}$ | `\xleftrightharpoons{abc}` | mathtools | -| \xlongequal | $\xlongequal{abc}$ | `\xlongequal{abc}` | extpfeil | -| \xmapsto | $\xmapsto{abc}$ | `\xmapsto{abc}` | mathtools | -| \Xor | $\Xor$ | | stix | -| \xRightarrow | $\xRightarrow{abc}$ | `\xRightarrow{abc}` | mathtools | -| \xrightarrow | $\xrightarrow{abc}$ | `\xrightarrow{abc}` | ams | -| \xrightharpoondown | $\xrightharpoondown{abc}$ | `\xrightharpoondown{abc}` | mathtools | -| \xrightharpoonup | $\xrightharpoonup{abc}$ | `\xrightharpoonup{abc}` | mathtools | -| \xrightleftharpoons | $\xrightleftharpoons{abc}$ | `\xrightleftharpoons{abc}` | mathtools | -| \xtofrom | $\xtofrom{abc}$ | `\xtofrom{abc}` | extpfeil | -| \xtwoheadleftarrow | $\xtwoheadleftarrow{abc}$ | `\xtwoheadleftarrow{abc}` | extpfeil | -| \xtwoheadrightarrow | $\xtwoheadrightarrow{abc}$ | `\xtwoheadrightarrow{abc}` | extpfeil | - -## YZ - -| Function | Rendered | Source or Comment | Package | -|----------------|-------------|-------------------|-----------------| -| \yen | $\yen$ | | ams | -| \Z | $\Z$ | | texvc extension | -| \Zeta | $\Zeta$ | | | -| \zeta |$\zeta$ | | | - - -
- -

Copyright © 2021-2024 Ron Kok. Released under the MIT License

- -
- -
- - - -
- - - - -
- - - - - \ No newline at end of file diff --git a/docs/supported.md b/docs/supported.md deleted file mode 100644 index e359f750..00000000 --- a/docs/supported.md +++ /dev/null @@ -1,1663 +0,0 @@ - - - - - - Temml Functions - - - - - - - -
- -# Supported Functions - -**Temml** is a JavaScript library that converts TeX math-mode functions to MathML. -This page lists the TeX functions it supports, sorted into logical groups. - -There is a similar [Support Table](./support_table.html), sorted alphabetically, -that lists both supported and some un-supported functions. - -## Accents - -+:=========================+:=========================+:===================================+ -| $f'$ `f'` | $\tilde{a}$ `\tilde{a}` | $\widetilde{ac}$ `\widetilde{ac}` | -+--------------------------+--------------------------+------------------------------------+ -| $f''$ `f''` | $\vec{F}$ `\vec{F}` | $\utilde{AB}$ `\utilde{AB}` | -+--------------------------+--------------------------+------------------------------------+ -| $f^{\prime}$ | $\overleftarrow{AB}$ | $\overrightarrow{ABC}$ | -| `f^{\prime}` | `\overleftarrow{AB}` | `\overrightarrow{ABC}` | -+--------------------------+--------------------------+------------------------------------+ -| $\acute{a}$ `\acute{a}` | $\underleftarrow{AB}$ | $\underrightarrow{AB}$ | -| | `\underleftarrow{AB}` | `\underrightarrow{AB}` | -+--------------------------+--------------------------+------------------------------------+ -| $\bar{y}$ `\bar{y}` | $\overline{AB}$ | $\Overrightarrow{AB}$ | -| | `\overline{AB}` | `\Overrightarrow{AB}` | -+--------------------------+--------------------------+------------------------------------+ -| $\breve{a}$ `\breve{a}` | $\underline{AB}$ | $\overleftrightarrow{AB}$ | -| | `\underline{AB}` | `\overleftrightarrow{AB}` | -+--------------------------+--------------------------+------------------------------------+ -| $\check{a}$ `\check{a}` | $\widecheck{ac}$ | $\underleftrightarrow{AB}$ | -| | `\widecheck{ac}` | `\underleftrightarrow{AB}` | -+--------------------------+--------------------------+------------------------------------+ -| $\dot{a}$ `\dot{a}` | $\overleftharpoon{ac}$ | $\overrightharpoon{ac}$ | -| | `\overleftharpoon{ac}` | `\overrightharpoon{ac}` | -+--------------------------+--------------------------+------------------------------------+ -| $\ddot{a}$ `\ddot{a}` | $\overgroup{AB}$ | $\wideparen{AB}$ | -| | `\overgroup{AB}` | `\wideparen{AB}` | -+--------------------------+--------------------------+------------------------------------+ -| $\dddot{a}$ `\dddot{a}` | $\undergroup{AB}$ | $\overparen{AB}$ | -| | `\undergroup{AB}` | `\overparen{AB}` | -+--------------------------+--------------------------+------------------------------------+ -| $\ddddot{a}$ | $\underbar{X}$ | $\underparen{AB}$ | -| `\ddddot{a}` | `\underbar{X}` | `\underparen{AB}` | -+--------------------------+--------------------------+------------------------------------+ -| $\grave{a}$ `\grave{a}` | $\mathring{g}$ | $\overbrace{AB}$ | -| | `\mathring{g}` | `\overbrace{AB}` | -+--------------------------+--------------------------+------------------------------------+ -| $\hat{\theta}$ | $\widehat{ac}$ | $\underbrace{AB}$ | -| `\hat{\theta}` | `\widehat{ac}` | `\underbrace{AB}` | -+--------------------------+--------------------------+------------------------------------+ -| $f^{\dprime}$ | $f^{\trprime}$ | $f^{\qprime}$ | -| `f^{\dprime}` | `f^{\trprime}` | `f^{\qprime}` | -+--------------------------+--------------------------+------------------------------------+ -| $\sigma^{\backprime}$ | $\sigma^{\backdprime}$ | $\sigma^{\backtrprime}$ | -| `\sigma^{\backprime}` | `\sigma^{\backdprime}` | `\sigma^{\backtrprime}` | -+--------------------------+--------------------------+------------------------------------+ - -**Accent functions inside \\text{…}** - -+:==================+:==================+:=================+:================+ -| $\text{\'{a}}$ | $\text{\~{a}}$ | $\text{\.{a}}$ | $\text{\H{a}}$ | -| `\'{a}` | `\~{a}` | `\.{a}` | `\H{a}` | -+-------------------+-------------------+------------------+-----------------+ -| $\text{\`{a}}$ | $\text{\={a}}$ | $\text{\"{a}}$ | $\text{\v{a}}$ | -| ``\`{a}`` | `\={a}` | `\"{a}` | `\v{a}` | -+-------------------+-------------------+------------------+-----------------+ -| $\text{\^{a}}$ | $\text{\u{a}}$ | $\text{\r{a}}$ | $\text{\c{c}}$ | -| `\^{a}` | `\u{a}` | `\r{a}` | `\c{c}` | -+-------------------+-------------------+------------------+-----------------+ - -See also [letters](#letters) - -## Annotation - -+:=================================+:===================================================+ -| $\cancel{5}$ `\cancel{5}` | $\overbrace{a+b+c}^{\text{note}}$ | -| | `\overbrace{a+b+c}^{\text{note}}` | -+----------------------------------+----------------------------------------------------+ -| $\bcancel{5}$ `\bcancel{5}` | $\underbrace{a+b+c}_{\text{note}}$ | -| | `\underbrace{a+b+c}_{\text{note}}` | -+----------------------------------+----------------------------------------------------+ -| $\xcancel{ABC}$ `\xcancel{ABC}` | $\boxed{\pi=\frac c d}$ | -| | `\boxed{\pi=\frac c d}` | -+----------------------------------+----------------------------------------------------+ -| $\sout{abc}$ `\sout{abc}` | | -| | | -+----------------------------------+----------------------------------------------------+ -| $\ref{tag1}$ `\ref{tag1}` | | -| | | -+----------------------------------+----------------------------------------------------+ -| $$ | `\tag{hi} x+y^{2x} \label{tag1}` | -| \tag{hi} x+y^{2x} \label{tag1} | | -| $$ | | -+----------------------------------+----------------------------------------------------+ -| $$\tag*{bye} x+y^{2x}$$ | `\tag*{bye} x+y^{2x}` | -+----------------------------------+----------------------------------------------------+ - -Also some [environments](#environments) have automatic equation numbering. - -A `\label{…}` may be placed anywhere and will create an HTML id matching the -`\label{…}` argument. That argument may contain only the characters `A-Za-z0-9_-`. - -On sites where Temml fields are updated dynamically, `\ref{…}` may not be -supported. Other Temml functions update only the local field. `\ref{…}` must -make two passes through the entire document. Some sites may choose not to do this. - -## Color - -+==============================+=============================================+ -| $\color{blue} F=ma$ | $\color[RGB]{255,0,255} F=ma$ | -| `{\color{blue} F=ma}` | `{\color[RGB]{255,0,255} F=ma}` | -+------------------------------+---------------------------------------------+ -| $\textcolor{blue}{F=ma}$ | $\color[rgb]{1,0,1} F=ma$ | -| `\textcolor{blue}{F=ma}` | `{\color[rgb]{1,0,1} F=ma}` | -+------------------------------+---------------------------------------------+ -| $\textcolor{#228B22}{F=ma}$ | $\color[HTML]{ff00ff} F=ma$ | -| `\textcolor{#228B22}{F=ma}` | `{\color[HTML]{ff00ff} F=ma}` | -+------------------------------+---------------------------------------------+ -| $\colorbox{aqua}{A}$ | `\definecolor{sortaGreen}{RGB}{128,128,0}`\ | -| `\colorbox{aqua}{A}` | $\definecolor{sortaGreen}{RGB}{128,128,0} | -+------------------------------+ \color{sortaGreen} F=ma$ + -| $\fcolorbox{red}{aqua}{A}$ | `{\color{sortaGreen} F=ma}` | -| `\fcolorbox{red}{aqua}{A}` | | -+------------------------------+---------------------------------------------+ -{colWidths="300 370"} - -`\definecolor` functions can be included in a [preamble](administration.html#preamble). -If so, their color definitions will have document-wide scope. - -Color functions can all take an optional argument to set the color model, as -in the `xcolor` package. (Exception: `\definecolor`’s model argument is -required.) Temml supports color models `HTML`, `RGB`, and `rgb`. - -If the color model is omitted, Temml color functions will accept: - -- `#rrggbb`, `#rgb`, or `rrggbb`. -- A color name previously created by `\definecolor`. -- Any of the standard HTML [predefined color names](https://www.w3schools.com/colors/colors_names.asp). -- Any color from the following `xcolor` table. - -
- -+==============================================================+==========================================================+========================================================+==============================================================+ -| ${\color{Apricot}\rule{1em}{0.8em}}$   Apricot | ${\color{ForestGreen}\rule{1em}{0.8em}}$   ForestGreen | ${\color{olive}\rule{1em}{0.8em}}$   olive | ${\color{RoyalPurple}\rule{1em}{0.8em}}$   RoyalPurple | -+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------+--------------------------------------------------------------+ -| ${\color{Aquamarine}\rule{1em}{0.8em}}$   Aquamarine | ${\color{Fuchsia}\rule{1em}{0.8em}}$   Fuchsia | ${\color{OliveGreen}\rule{1em}{0.8em}}$   OliveGreen | ${\color{RubineRed}\rule{1em}{0.8em}}$   RubineRed | -+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------+--------------------------------------------------------------+ -| ${\color{Bittersweet}\rule{1em}{0.8em}}$   Bittersweet | ${\color{Goldenrod}\rule{1em}{0.8em}}$   Goldenrod | ${\color{orange}\rule{1em}{0.8em}}$   orange | ${\color{Salmon}\rule{1em}{0.8em}}$   Salmon | -+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------+--------------------------------------------------------------+ -| ${\color{blue}\rule{1em}{0.8em}}$   blue | ${\color{gray}\rule{1em}{0.8em}}$   gray | ${\color{Orange}\rule{1em}{0.8em}}$   Orange | ${\color{SeaGreen}\rule{1em}{0.8em}}$   SeaGreen | -+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------+--------------------------------------------------------------+ -| ${\color{Blue}\rule{1em}{0.8em}}$   Blue | ${\color{Gray}\rule{1em}{0.8em}}$   Gray | ${\color{OrangeRed}\rule{1em}{0.8em}}$   OrangeRed | ${\color{Sepia}\rule{1em}{0.8em}}$   Sepia | -+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------+--------------------------------------------------------------+ -| ${\color{BlueGreen}\rule{1em}{0.8em}}$   BlueGreen | ${\color{green}\rule{1em}{0.8em}}$   green | ${\color{Orchid}\rule{1em}{0.8em}}$   Orchid | ${\color{SkyBlue}\rule{1em}{0.8em}}$   SkyBlue | -+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------+--------------------------------------------------------------+ -| ${\color{BlueViolet}\rule{1em}{0.8em}}$   BlueViolet | ${\color{Green}\rule{1em}{0.8em}}$   Green | ${\color{Peach}\rule{1em}{0.8em}}$   Peach | ${\color{SpringGreen}\rule{1em}{0.8em}}$   SpringGreen | -+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------+--------------------------------------------------------------+ -| ${\color{BrickRed}\rule{1em}{0.8em}}$   BrickRed | ${\color{GreenYellow}\rule{1em}{0.8em}}$   GreenYellow | ${\color{Periwinkle}\rule{1em}{0.8em}}$   Periwinkle | ${\color{Tan}\rule{1em}{0.8em}}$   Tan | -+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------+--------------------------------------------------------------+ -| ${\color{brown}\rule{1em}{0.8em}}$   brown | ${\color{JungleGreen}\rule{1em}{0.8em}}$   JungleGreen | ${\color{PineGreen}\rule{1em}{0.8em}}$   PineGreen | ${\color{teal}\rule{1em}{0.8em}}$   teal | -+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------+--------------------------------------------------------------+ -| ${\color{Brown}\rule{1em}{0.8em}}$   Brown | ${\color{Lavender}\rule{1em}{0.8em}}$   Lavender | ${\color{pink}\rule{1em}{0.8em}}$   pink | ${\color{TealBlue}\rule{1em}{0.8em}}$   TealBlue | -+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------+--------------------------------------------------------------+ -| ${\color{BurntOrange}\rule{1em}{0.8em}}$   BurntOrange | ${\color{lightgray}\rule{1em}{0.8em}}$   lightgray | ${\color{Plum}\rule{1em}{0.8em}}$   Plum | ${\color{Thistle}\rule{1em}{0.8em}}$   Thistle | -+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------+--------------------------------------------------------------+ -| ${\color{CadetBlue}\rule{1em}{0.8em}}$   CadetBlue | ${\color{lime}\rule{1em}{0.8em}}$   lime | ${\color{ProcessBlue}\rule{1em}{0.8em}}$   ProcessBlue | ${\color{Turquoise}\rule{1em}{0.8em}}$   Turquoise | -+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------+--------------------------------------------------------------+ -| ${\color{CarnationPink}\rule{1em}{0.8em}}$   CarnationPink | ${\color{LimeGreen}\rule{1em}{0.8em}}$   LimeGreen | ${\color{purple}\rule{1em}{0.8em}}$   purple | ${\color{violet}\rule{1em}{0.8em}}$   violet | -+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------+--------------------------------------------------------------+ -| ${\color{Cerulean}\rule{1em}{0.8em}}$   Cerulean | ${\color{magenta}\rule{1em}{0.8em}}$   magenta | ${\color{Purple}\rule{1em}{0.8em}}$   Purple | ${\color{Violet}\rule{1em}{0.8em}}$   Violet | -+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------+--------------------------------------------------------------+ -| ${\color{CornflowerBlue}\rule{1em}{0.8em}}$   CornflowerBlue | ${\color{Magenta}\rule{1em}{0.8em}}$   Magenta | ${\color{RawSienna}\rule{1em}{0.8em}}$   RawSienna | ${\color{VioletRed}\rule{1em}{0.8em}}$   VioletRed | -+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------+--------------------------------------------------------------+ -| ${\color{cyan}\rule{1em}{0.8em}}$   cyan | ${\color{Mahogany}\rule{1em}{0.8em}}$   Mahogany | ${\color{red}\rule{1em}{0.8em}}$   red | ${\color{WildStrawberry}\rule{1em}{0.8em}}$   WildStrawberry | -+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------+--------------------------------------------------------------+ -| ${\color{Cyan}\rule{1em}{0.8em}}$   Cyan | ${\color{Maroon}\rule{1em}{0.8em}}$   Maroon | ${\color{Red}\rule{1em}{0.8em}}$   Red | ${\color{yellow}\rule{1em}{0.8em}}$   yellow | -+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------+--------------------------------------------------------------+ -| ${\color{Dandelion}\rule{1em}{0.8em}}$   Dandelion | ${\color{Melon}\rule{1em}{0.8em}}$   Melon | ${\color{RedOrange}\rule{1em}{0.8em}}$   RedOrange | ${\color{Yellow}\rule{1em}{0.8em}}$   Yellow | -+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------+--------------------------------------------------------------+ -| ${\color{darkgray}\rule{1em}{0.8em}}$   darkgray | ${\color{MidnightBlue}\rule{1em}{0.8em}}$   MidnightBlue | ${\color{RedViolet}\rule{1em}{0.8em}}$   RedViolet | ${\color{YellowGreen}\rule{1em}{0.8em}}$   YellowGreen | -+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------+--------------------------------------------------------------+ -| ${\color{DarkOrchid}\rule{1em}{0.8em}}$   DarkOrchid | ${\color{Mulberry}\rule{1em}{0.8em}}$   Mulberry | ${\color{Rhodamine}\rule{1em}{0.8em}}$   Rhodamine | ${\color{YellowOrange}\rule{1em}{0.8em}}$   YellowOrange | -+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------+--------------------------------------------------------------+ -| ${\color{Emerald}\rule{1em}{0.8em}}$   Emerald | ${\color{NavyBlue}\rule{1em}{0.8em}}$   NavyBlue | ${\color{RoyalBlue}\rule{1em}{0.8em}}$   RoyalBlue | | -+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------+--------------------------------------------------------------+ - - -## Delimiters - -+:=================+:===================+:=============+:================================+:====================+ -| $(~)$ `( )` | $\lparen~\rparen$ | $⌈~⌉$ `⌈ ⌉` | $\lceil~\rceil$ | $\uparrow$ | -| | `\lparen`\ | | `\lceil`\ | `\uparrow` | -| | $~~~~$ `\rparen` | | $~~~~~$ `\rceil` | | -+------------------+--------------------+--------------+---------------------------------+---------------------+ -| $[~]$ `[ ]` | $\lbrack~\rbrack$ | $⌊~⌋$ `⌊ ⌋` | $\lfloor~\rfloor$ | $\downarrow$ | -| | `\lbrack`\ | | `\lfloor`\ | `\downarrow` | -| | $~~~~$ `\rbrack` | | $~~~~~$ `\rfloor` | | -+------------------+--------------------+--------------+---------------------------------+---------------------+ -| $\{ \}$ | $\lbrace \rbrace$ | $⎰⎱$ `⎰⎱` | $\lmoustache \rmoustache$ | $\updownarrow$ | -| `\{ \}` | `\lbrace`\ | | `\lmoustache`\ | `\updownarrow` | -| | $~~~~$ `\rbrace` | | $~~~~$ `\rmoustache` | | -+------------------+--------------------+--------------+---------------------------------+---------------------+ -| $⟨~⟩$ `⟨ ⟩` | $\langle~\rangle$ | $⟮~⟯$ `⟮ ⟯` | $\lgroup~\rgroup$ | $\Uparrow$ | -| | `\langle` \ | | `\lgroup`\ | `\Uparrow` | -| | $~~~~$ `\rangle` | | $~~~~~$ `\rgroup` | | -+------------------+--------------------+--------------+---------------------------------+---------------------+ -| $\lt\gt$ `\lt`\ | $\lAngle~\rAngle$ | $┌ ┐$ `┌ ┐` | $\ulcorner \urcorner$ | $\Downarrow$ | -|         `\gt` | `\lAngle` \ | | `\ulcorner`\ | `\Downarrow` | -| | $~~~~$ `\rAngle` | | $~~~~$ `\urcorner` | | -+------------------+--------------------+--------------+---------------------------------+---------------------+ -| $\vert$ `|` | $\vert$ `\vert` | $└ ┘$ `└ ┘` | $\llcorner \lrcorner$ | $\Updownarrow$ | -| | | | `\llcorner`\ | `\Updownarrow` | -| | | | $~~~~$ `\lrcorner` | | -+------------------+--------------------+--------------+---------------------------------+---------------------+ -| $\Vert$ `\|` | $\Vert$ `\Vert` | `\left.` | `\right.` | $\backslash$ | -| | | | | `\backslash` | -| | | | | | -+------------------+--------------------+--------------+---------------------------------+---------------------+ -| $\lvert~\rvert$ | $\lVert~\rVert$ | $⟦~⟧$ `⟦ ⟧` | $\llbracket~\rrbracket$ | $\lBrace~\rBrace$ | -| `\lvert`\ | `\lVert`\ | | `\llbracket`\ | `\lBrace \rBrace` | -| $~~~~$ `\rvert` | $~~~~$ `\rVert` | | $~~~~$ `\rrbracket` | | -+------------------+--------------------+--------------+---------------------------------+---------------------+ -| | | | $\llparenthesis~\rrparenthesis$ | $\llangle~\rrangle$ | -| |       | | `\llparenthesis`\ | `\llangle \rrangle` | -| | | |        `\rrparenthesis` | | -+------------------+--------------------+--------------+---------------------------------+---------------------+ - - -The _texvc_ extension includes $\lang$ `\lang` and $\rang$ `\rang`. - -#### Delimiter Sizing - -$\left(\LARGE{AB}\right)$ `\left(\LARGE{AB}\right)` - -$( \big( \Big( \bigg( \Bigg($ `( \big( \Big( \bigg( \Bigg(` - -+:==========+:========+:=========+:=========+:=========+ -| `\left` | `\big` | `\bigl` | `\bigm` | `\bigr` | -+-----------+---------+----------+----------+----------+ -| `\middle` | `\Big` | `\Bigl` | `\Bigm` | `\Bigr` | -+-----------+---------+----------+----------+----------+ -| `\right` | `\bigg` | `\biggl` | `\biggm` | `\biggr` | -+-----------+---------+----------+----------+----------+ -| | `\Bigg` | `\Biggl` | `\Biggm` | `\Biggr` | -+-----------+---------+----------+----------+----------+ - -## Environments - -+:=====================:+:===========================+:==========================:+:=============================+ -| $\begin{matrix} | `\begin{matrix}`\ | $\begin{array}{cc} | `\begin{array}{cc}`\ | -| a & b \\ |    `a & b \\`\ | a & b \\ |    `a & b \\`\ | -| c & d |    `c & d`\ | c & d |    `c & d`\ | -| \end{matrix}$ | `\end{matrix}` | \end{array}$ | `\end{array}` | -+-----------------------+---------------------------+----------------------------+------------------------------+ -| $\begin{pmatrix} | `\begin{pmatrix}`\ | $\begin{bmatrix} | `\begin{bmatrix}`\ | -| a & b \\ |    `a & b \\`\ | a & b \\ |    `a & b \\`\ | -| c & d |    `c & d`\ | c & d |    `c & d`\ | -| \end{pmatrix}$ | `\end{pmatrix}` | \end{bmatrix}$ | `\end{bmatrix}` | -+-----------------------+----------------------------+----------------------------+------------------------------+ -| $\begin{vmatrix} | `\begin{vmatrix}`\ | $\begin{Vmatrix} | `\begin{Vmatrix}`\ | -| a & b \\ |    `a & b \\`\ | a & b \\ |    `a & b \\`\ | -| c & d |    `c & d`\ | c & d |    `c & d`\ | -| \end{vmatrix}$ | `\end{vmatrix}` | \end{Vmatrix}$ | `\end{Vmatrix}` | -+-----------------------+----------------------------+----------------------------+------------------------------+ -| $\begin{Bmatrix} | `\begin{Bmatrix}`\ | $\begin{array}{c|c:c} | `\begin{array}{c|c:c}`\ | -| a & b \\ |    `a & b \\`\ | a & b & c \\ \hline |   `a & b & c \\ \hline`\ | -| c & d |    `c & d`\ | d & e & f \\ \hdashline |    `d & e & f \\`\ | -| \end{Bmatrix}$ | `\end{Bmatrix}` | g & h & i |    `\hdashline`\ | -| | | \end{array}$ |    `g & h & i`\ | -| | | | `\end{array}`  | -+-----------------------+----------------------------+----------------------------+------------------------------+ -| $x = \begin{cases} | `x = \begin{cases}`\ | $\begin{rcases} | `\begin{rcases}`\ | -| a &\text{if } b \\ |    `a &\text{if } b \\`\ | a &\text{if } b \\ |    `a &\text{if } b \\`\ | -| c &\text{if } d |    `c &\text{if } d`\ | c &\text{if } d |   `c &\text{if } d`\ | -| \end{cases}$ | `\end{cases}` | \end{rcases}⇒$ | `\end{rcases}⇒` | -+-----------------------+----------------------------+----------------------------+------------------------------+ -| $\begin{smallmatrix} | `\begin{smallmatrix}`\ | $$ | `\sum_{\begin{subarray}{l}`\ | -| a & b \\ |    `a & b \\`\ | \sum_{\begin{subarray}{l} |    `i\in\Lambda\\`\ | -| c & d |    `c & d`\ | i\in\Lambda\\ |    `0 - -+:=================+:=======================+:===================+:==========================+ -| $$ | `\begin{equation}`\ | $$ | `\begin{align}`\ | -| \begin{equation} | `\begin{split}`\ | \begin{align} |    `a&=b+c \\`\ | -| \begin{split} |    `a &=b+c\\`\ | a&=b+c \\ |    `d+e&=f`\ | -| a &=b+c\\ |    `&=e+f`\ | d+e&=f | `\end{align}` | -| &=e+f | `\end{split}`\ | \end{align} | | -| \end{split} | `\end{equation}` | $$ | | -| \end{equation} | | | | -| $$ | | | | -+------------------+------------------------+--------------------+---------------------------+ -| $$ | `\begin{gather}`\ | $$ | `\begin{alignat}{2}`\ | -| \begin{gather} |    `a=b \\`\ | \begin{alignat}{2} |    `10&x+ &3&y = 2 \\`\ | -| a=b \\ |    `e=b+c`\ | 10&x+ &3&y = 2 \\ |    `3&x+&13&y = 4`\ | -| e=b+c | `\end{gather}` | 3&x+&13&y = 4 | `\end{alignat}` | -| \end{gather} | | \end{alignat} | | -| $$ | | $$ | | -+------------------+------------------------+--------------------+---------------------------+ -| $$ | `\begin{CD}`\ | $$ | `\begin{multline}`\ | -| \begin{CD} | `A @>a>> B \\`\ | \begin{multline} |    `\rm uno \\`\ | -| A @>a>> B \\ | `@VbVV @AAcA \\`\ | \rm uno \\ \    `\rm dos \\`\ | -| @VbVV @AAcA\\ | `C @= D`\ | \rm dos \\ |    `\rm tres`\ | -| C @= D | `\end{CD}` | \rm tres | `\end{multline}` | -| \end{CD} | | \end{multline} | | -| $$ | | $$ | | -+------------------+------------------------+--------------------+---------------------------+ - -#### Other Temml Environments - -+:------------------------------------+:----------------------------------------------+ -| Environments | How they differ from those shown above | -+=====================================+===============================================+ -| `darray`, `dcases`, `drcases` | … apply `displaystyle` | -+-------------------------------------+-----------------------------------------------+ -| `matrix*`, `pmatrix*`, `bmatrix*`\ | … take an optional argument that sets column\ | -| `Bmatrix*`, `vmatrix*`, `Vmatrix*` | alignment, as in `\begin{matrix*}[r]` | -+-------------------------------------+-----------------------------------------------+ -| `equation*`, `gather*`\ | … have no automatic numbering. | -| `align*`, `alignat*` | | -+-------------------------------------+-----------------------------------------------+ -| `gathered`, `aligned`, `alignedat` | … do not need to be in display mode.\ | -| | … have no automatic numbering.\ | -| | … must be inside math delimiters in\ | -| | order to be rendered by the auto-render\ | -| | extension. | -+-------------------------------------+-----------------------------------------------+ - -Acceptable horizontal line separators are: `\\` and `\cr`. - -Temml supports `\tag{…}`, `\notag`, and `\nonumber` to modify equation numbering. - -The `{array}` environment does not yet support `\cline` or `\multicolumn`. - -## HTML - -The following "raw HTML" features are potentially dangerous for untrusted -inputs, so they are disabled by default, and attempting to use them produces -the command names in red (which you can configure via the `errorColor` -[option](administration.html#options)). To fully trust your LaTeX input, you need to pass -an option of `trust: true`; you can also enable just some of the commands -or for just some URLs via the `trust` [option](administration.html#options). - -+:=====================================+:===============================================+ -| $\href{https://temml.org/}{\Temml}$ | `\href{https://temml.org/}{\Temml}` | -+--------------------------------------+------------------------------------------------+ -| $\url{https://temml.org/}$ | `\url{https://temml.org/}` | -+--------------------------------------+------------------------------------------------+ -| $\includegraphics[height=1em, | `\includegraphics[height=1em,`\ | -| totalheight=1.2em, width=1.2em, | `totalheight=1.2em,width=1.2em, alt=sphere]`\ | -| alt=sphere]{../sphere.jpg}$ | `{../sphere.jpg}` | -+--------------------------------------+------------------------------------------------+ -| $\id{idName}{x}$ | `\id{idName}{x}` | -+--------------------------------------+------------------------------------------------+ -| $\class{class-name}{x}$ | `\class{class-name}{x}` | -+--------------------------------------+------------------------------------------------+ -| $\style{color: red;}{x}$ | `\style{color: red;}{x}` | -+--------------------------------------+------------------------------------------------+ -| $\data{datum1=a, datum2=b}{x}$ | `\data{datum1=a, datum2=b}{x}` | -+--------------------------------------+------------------------------------------------+ - -## Letters - -**Greek Letters** - -+====================+==================+====================+====================+==========================+ -| $\Alpha$ `\Alpha` | $\Beta$ `\Beta` | $\Gamma$ `\Gamma` | $\Delta$ `\Delta` | $\Epsilon$ `\Epsilon` | -+--------------------+------------------+--------------------+--------------------+--------------------------+ -| $\Zeta$ `\Zeta` | $\Eta$ `\Eta` | $\Theta$ `\Theta` | $\Iota$ `\Iota` | $\Kappa$ `\Kappa` | -+--------------------+------------------+--------------------+--------------------+--------------------------+ -| $\Lambda$ | $\Mu$ `\Mu` | $\Nu$ `\Nu` | $\Xi$ `\Xi` | $\Omicron$ `\Omicron` | -| `\Lambda` | | | | | -+--------------------+------------------+--------------------+--------------------+--------------------------+ -| $\Pi$ `\Pi` | $\Rho$ `\Rho` | $\Sigma$ `\Sigma` | $\Tau$ `\Tau` | $\Upsilon$ `\Upsilon` | -+--------------------+------------------+--------------------+--------------------+--------------------------+ -| $\Phi$ `\Phi` | $\Chi$ `\Chi` | $\Psi$ `\Psi` | $\Omega$ `\Omega` | $\varGamma$ `\varGamma` | -+--------------------+------------------+--------------------+--------------------+--------------------------+ -| $\varDelta$ | $\varTheta$ | $\varLambda$ | $\varXi$ `\varXi` | $\varPi$ `\varPi` | -| `\varDelta` | `\varTheta` | `\varLambda` | | | -+--------------------+------------------+--------------------+--------------------+--------------------------+ -| $\varSigma$ | $\varUpsilon$ | $\varPhi$ | $\varPsi$ | $\varOmega$ `\varOmega` | -| `\varSigma` | `\varUpsilon` | `\varPhi` | `\varPsi` | | -+--------------------+------------------+--------------------+--------------------+--------------------------+ -| $\alpha$ `\alpha` | $\beta$ `\beta` | $\gamma$ `\gamma` | $\delta$ `\delta` | $\epsilon$ `\epsilon` | -+--------------------+------------------+--------------------+--------------------+--------------------------+ -| $\zeta$ `\zeta` | $\eta$ `\eta` | $\theta$ `\theta` | $\iota$ `\iota` | $\kappa$ `\kappa` | -+--------------------+------------------+--------------------+--------------------+--------------------------+ -| $\lambda$ | $\mu$ `\mu` | $\nu$ `\nu` | $\xi$ `\xi` | $\omicron$ `\omicron` | -| `\lambda` | | | | | -+--------------------+------------------+--------------------+--------------------+--------------------------+ -| $\pi$ `\pi` | $\rho$ `\rho` | $\sigma$ `\sigma` | $\tau$ `\tau` | $\upsilon$ `\upsilon` | -+--------------------+------------------+--------------------+--------------------+--------------------------+ -| $\phi$ `\phi` | $\chi$ `\chi` | $\psi$ `\psi` | $\omega$ `\omega` | | -+--------------------+------------------+--------------------+--------------------+--------------------------+ -| $\upalpha$ | $\upbeta$ | $\upgamma$ | $\updelta$ | $\upepsilon$ | -| `\upalpha` | `\upbeta` | `\upgamma` | `\updelta` | `\upepsilon` | -+--------------------+------------------+--------------------+--------------------+--------------------------+ -| $\upzeta$ | $\upeta$ | $\uptheta$ | $\upiota$ | $\upkappa$ `\upkappa` | -| `\upzeta` | `\upeta` | `\uptheta` | `\upiota` | | -+--------------------+------------------+--------------------+--------------------+--------------------------+ -| $\uplambda$ | $\upmu$ `\upmu` | $\upnu$ `\upnu` | $\upxi$ `\upxi` | $\upomicron$ | -| `\uplambda` | | | | `\upomicron` | -+--------------------+------------------+--------------------+--------------------+--------------------------+ -| $\uppi$ `\uppi` | $\uprho$ | $\upsigma$ | $\uptau$ `\uptau` | $\upupsilon$ | -| | `\uprho` | `\upsigma` | | `\upupsilon` | -+--------------------+------------------+--------------------+--------------------+--------------------------+ -| $\upphi$ `\upphi` | $\upchi$ | $\uppsi$ `\uppsi` | $\upomega$ | | -| | `\upchi` | | `\upomega` | | -+--------------------+------------------+--------------------+--------------------+--------------------------+ -| $\varepsilon$ | $\varkappa$ | $\vartheta$ | $\varpi$ `\varpi` | $\varrho$ `\varrho` | -| `\varepsilon` | `\varkappa` | `\vartheta` | | | -+--------------------+------------------+--------------------+--------------------+--------------------------+ -| $\varsigma$ | $\varphi$ | $\Coppa$ `\Coppa` | $\coppa$ `\coppa` | $\Koppa$ `\Koppa` | -| `\varsigma` | `\varphi` | | | | -+--------------------+------------------+--------------------+--------------------+--------------------------+ -| $\koppa$ `\koppa` | $\Sampi$ | $\sampi$ `\sampi` | $\Stigma$ | $\stigma$ `\stigma` | -| | `\Sampi` | | `\Stigma` | | -+--------------------+------------------+--------------------+--------------------+--------------------------+ -| $\digamma$ | $\varcoppa$ | | | | -| `\digamma` | `\varcoppa` | | | | -+--------------------+------------------+--------------------+--------------------+--------------------------+ - -Direct Input: Α Β Γ Δ Ε Ζ Η Θ Ι Κ Λ Μ Ν Ξ Ο Π Ρ Σ Τ Υ Φ Χ Ψ Ω - α β γ δ ϵ ζ η θ ι κ λ μ ν ξ o π ρ σ τ υ ϕ χ ψ ω ε ϑ ϖ ϱ ς φ ϝ - -#### Other Letters - -+:=====================+:===================+:===================+:===========================+:===========================+ -| $\aleph$ `\aleph` | $\nabla$ `\nabla` | $\imath$ `\imath` | $\text{\aa}$ `\text{\aa}` | $\text{\OE}$ `\text{\OE}` | -+----------------------+--------------------+--------------------+----------------------------+----------------------------+ -| $\beth$ `\beth` | $\partial$ | $\jmath$ `\jmath` | $\text{\AA}$ `\text{\AA}` | $\text{\o}$ `\text{\o}` | -| | `\partial` | | | | -+----------------------+--------------------+--------------------+----------------------------+----------------------------+ -| $\gimel$ `\gimel` | $\Game$ `\Game` | $\Im$ `\Im` | $\Angstrom$ `\Angstrom` | $\text{\O}$ `\text{\O}` | -+----------------------+--------------------+--------------------+----------------------------+----------------------------+ -| $\daleth$ `\daleth` | $\Finv$ `\Finv` | $\Bbbk$ `\Bbbk` | $\text{\ae}$ `\text{\ae}` | $\text{\ss}$ `\text{\ss}` | -+----------------------+--------------------+--------------------+----------------------------+----------------------------+ -| $\eth$ `\eth` | $\hbar$ `\hbar` | $\Re$ `\Re` | $\text{\AE}$ `\text{\AE}` | $\text{\i}$ `\text{\i}` | -+----------------------+--------------------+--------------------+----------------------------+----------------------------+ -| $\ell$ `\ell` | $\hslash$ | $\wp$ `\wp` | $\text{\oe}$ `\text{\oe}` | $\text{\j}$ `\text{\j}` | -| | `\hslash` | | | | -+----------------------+--------------------+--------------------+----------------------------+----------------------------+ - -Letters in the _texvc_ extension - -+:=======================+:=======================+:=======================+:===================+:=========================+ -| $\alef$ `\alef` | $\Complex$ `\Complex` | $\natnums$ `\natnums` | $\real$ `\real` | $\weierp$ `\weierp` | -+------------------------+------------------------+------------------------+--------------------+--------------------------+ -| $\alefsym$ `\alefsym` | $\image$ `\image` | $\R$ `\R` | $\reals$ `\reals` | $\thetasym$ `\thetasym` | -+------------------------+------------------------+------------------------+--------------------+--------------------------+ -| $\cnums$ `\cnums` | $\N$ `\N` | $\Reals$ `\Reals` | | $\Z$ `\Z` | -+------------------------+------------------------+------------------------+--------------------+--------------------------+ - -Direct Input: ∂ ∇ ℑ Ⅎ ℵ ℶ ℷ ℸ ⅁ ℏ ð À Á Â Ã Ä Å Æ Ç È É Ê Ë -Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö Ù Ú Û Ü Ý Þ ß à á â ã ä å ç è é ê ë ì í î ï ð ñ ò ó ô ö ù ú û ü ý þ ÿ - ₊ ₋ ₌ ₍ ₎ ₀ ₁ ₂ ₃ ₄ ₅ ₆ ₇ ₈ ₉ ₐ ₑ ₕ ᵢ ⱼ ₖ ₗ ₘ ₙ ₒ ₚ ᵣ ₛ ₜ ᵤ ᵥ ₓ ᵦ ᵧ ᵨ ᵩ ᵪ ⁺ ⁻ ⁼ ⁽ ⁾ ⁰ ¹ ² ³ ⁴ ⁵ ⁶ ⁷ ⁸ ⁹ ᵃ ᵇ ᶜ ᵈ ᵉ ᵍ ʰ ⁱ ʲ ᵏ ˡ ᵐ ⁿ ᵒ ᵖ ʳ ˢ ᵗ ᵘ ʷ ˣ ʸ ᶻ ᵛ ᵝ ᵞ ᵟ ᵠ ᵡ - -Math-mode Unicode (sub|super)script characters will render as if you had written regular -characters in a subscript or superscript. For instance, `A²⁺³` will render the same -as `A^{2+3}`. - -#### Unicode Mathematical Alphanumeric Symbols - -| Item | Range | Item | Range | -|--------------|-----------------------|-------------------|-------------------------| -| Bold | $\text{𝐀-𝐙 𝐚-𝐳 𝟎-𝟗}$ | Double-struck | $\text{𝔸-ℤ 𝕒-𝕫 𝟘-𝟡}$ | -| Italic | $\text{𝐴-𝑍 𝑎-𝑧}$ | Sans serif | $\text{𝖠-𝖹 𝖺-𝗓 𝟢-𝟫}$ | -| Bold Italic | $\text{𝑨-𝒁 𝒂-𝒛}$ | Sans serif bold | $\text{𝗔-𝗭 𝗮-𝘇 𝟬-𝟵}$ | -| Monospace | $\text{𝙰-𝚉 𝚊-𝚣 𝟶-𝟿}$ | Sans serif italic | $\text{𝘈-𝘡 𝘢-𝘻}$ | -| Script | $\text{𝒜-𝒵 𝒶-𝓏}$ | Sans serif bold italic | $\text{𝘼-𝙕 𝙖-𝙯}$ | -| Fraktur | $\text{𝔄-ℨ}\text{𝔞-𝔷}$ | Bold Fraktur | $\text{𝕬-𝖅}\text{𝖆-𝖟}$ | - -There are two methods that will render any Unicode charater: - -1. Use the `\char` function and the Unicode code in hex. For example `\char"263a` will render as $\char"263a$ . -2. Write the character inside `\text{…}`. For example, `\text{☺}` will render as $\text{☺}$. - -
- -
More about Unicode script… - -The Unicode range U+1D49C - U+1D4B5, Mathematical Script, has been ambiguous. -Some fonts put chancery glyphs ($\mathcal{ABC}$) at those code points and some -fonts use roundhand glyphs ($\mathscr{ABC}$). Temml’s default for code points -in this range is chancery, which matches the fonts Cambria Math and STIX TWO. -It also matches the TeX function `\mathcal{…}`. - -Per Unicode 14+, Temml will return a roundhand glyph if you append a `\ufe01` -to a character in the range $\text{𝒜-𝒵}$. - -
-
- -## Layout - -### Line Breaks - -Hard line breaks are `\\` and `\newline`. - -Temml inserts soft line breaks per TeXbook p. 173 if not in display mode and -no hard line breaks are employed. They work in Chromium and Firefox, but not -in Safari. - -### Reflect - -+:==============================+:===========================+ -| $\reflectbox{ $ \frac a b $}$ | `\reflectbox{$\frac a b$}` | -+-------------------------------+----------------------------+ - -### Vertical Layout - -+:===============+:=====================================+:===================================================+ -| $x_n$ `x_n` | $\stackrel{!}{=}$ `\stackrel{!}{=}` | $a\raisebox{0.25em}{b}c$ `a\raisebox{0.25em}{b}c` | -+----------------+--------------------------------------+----------------------------------------------------+ -| $e^x$ `e^x` | $\overset{!}{=}$ `\overset{!}{=}` | $M\raise3pt{M^2}M$ `M\raise3pt{M^2}M` | -+----------------+--------------------------------------+----------------------------------------------------+ -| $_u^o$ `_u^o` | $\underset{!}{=}$ `\underset{!}{=}` | $M\lower3pt{M^2}M$ `M\lower3pt{M^2}M` | -+----------------+--------------------------------------+----------------------------------------------------+ -| | $a \atop b$ `a \atop b` | | -+----------------+--------------------------------------+----------------------------------------------------+ - -+:===============================+:=================================+ -| $$ | `\sum_{\substack{0` | ⁴∕₁₈ em space | `\mskip{distance}` | space, width = _distance_ | -| `\:` | ⁴∕₁₈ em space | `\hskip{distance}` | space, width = _distance_ | -| `\medspace` | ⁴∕₁₈ em space | `\hspace{distance}` | space, width = _distance_ | -| `\;` | ⁵∕₁₈ em space | `\hspace*{distance}` | space, width = _distance_ | -| `\thickspace` | ⁵∕₁₈ em space | `\phantom{content}` | space the width and height of content | -| `\enspace` | ½ em space | `\hphantom{content}` | space the width of content | -| `\quad` | 1 em space | `\vphantom{content}` | a strut the height of content | -| `\qquad` | 2 em space | `\!` | – ³∕₁₈ em space | -| `~` | non-breaking space | `\negthinspace` | – ³∕₁₈ em space | -| `\` | space | `\negmedspace` | – ⁴∕₁₈ em space | -| `\nobreakspace` | non-breaking space | `\negthickspace` | – ⁵∕₁₈ em space | -| `\space` | space | | | - -**Notes:** - -`distance` will accept any of the [Temml units](#units). - -`\kern`, `\mkern`, `\mskip`, and `\hskip` accept unbraced distances, as in: `\kern1em`. - -`\mkern` and `\mskip` will not work in text mode and both will write a console warning for any unit except `mu`. - -`\rule{}{distance}` is valuable as a vertical strut. - -## Logic and Set Theory - -+:=======================+:=====================+:============================+:=============================+ -| $\forall$ `\forall` | $\complement$ | $\therefore$ | $\emptyset$ `\emptyset` | -| | `\complement` | `\therefore` | | -+------------------------+----------------------+-----------------------------+------------------------------+ -| $\exists$ `\exists` | $\subset$ `\subset` | $\because$ `\because` | $\varnothing$ `\varnothing` | -+------------------------+----------------------+-----------------------------+------------------------------+ -| $\nexists$ `\nexists` | $\supset$ `\supset` | $\mapsto$ `\mapsto` | $\implies$ `\implies` | -+------------------------+----------------------+-----------------------------+------------------------------+ -| $\in$ `\in` | $\mid$ `\mid` | $\to$ `\to` | $\impliedby$ `\impliedby` | -+------------------------+----------------------+-----------------------------+------------------------------+ -| $\ni$ `\ni` | $\land$ `\land` | $\gets$ `\gets` | $\iff$ `\iff` | -+------------------------+----------------------+-----------------------------+------------------------------+ -| $\notin$ `\notin` | $\lor$ `\lor` | $\QED$ `\QED` | $\lightning$ `\lightning` | -+------------------------+----------------------+-----------------------------+------------------------------+ -| $\notni$ `\notni` | $\neg$ `\neg` | $\Set{ x | x<\frac 1 2 }$ \ | $\set{x|x<5 }$ \ | -| | or `\lnot` | `\Set{ x | x<\frac 1 2 }` | `\set{x|x<5}` | -+------------------------+----------------------+ | | -| $\strictif$ | $\strictfi$ | | | -| `\strictif` | `\strictfi` | | | -+------------------------+----------------------+-----------------------------+------------------------------+ - -Linear Logic (from the `cmll` package): - -+===========+====================+======================+====================+======================+ -| Operators | $\oc$ `\oc` | $\wn$ `\wn` | $\with$ `\with` | $\parr$ `\parr` | -| +--------------------+----------------------+--------------------+----------------------+ -| | $\shpos$ `\shpos` | $\shneg$ `\shneg` | $\shift$ `\shift` | $\invamp$ `\invamp` | -+-----------+--------------------+----------------------+--------------------+----------------------+ -| Relations | $\coh$ `\coh` | $\scoh$ `\scoh` | $\Perp$ `\Perp` | $\multimapboth$ | -| | | | | `\multimapboth` | -| +--------------------+----------------------+--------------------+----------------------+ -| | $\incoh$ `\incoh` | $\sincoh$ `\sincoh` | | $\multimapinv$ | -| | | | | `\multimapinv` | -+-----------+--------------------+----------------------+--------------------+----------------------+ - -Equivalents in the _texvc_ extension - -+:===================+:=================+:===================+:===============+ -| $\exist$ `\exist` | $\isin$ `\isin` | $\empty$ `\empty` | $\sub$ `\sub` | -+--------------------+------------------+--------------------+----------------+ - -Direct Input: ∀ ∴ ∁ ∵ ∃ ∣ ∈ ∉ ∋ ⊂ ⊃ ∧ ∨ ↦ → ← ↔ ∅ ⟹ ⟺ ¬ ↯ ⥼ ⥽\ -ℂ ℍ ℕ ℙ ℚ ℝ - -## Macros - -+===================+==================================================================+ -| \\def | `\def\macroname{definition to be expanded}` | -| +---------------------------------+--------------------------------+ -| | $\def\foo#1#2{#1^2 #2^3} | `\def\foo#1#2{#1^2 #2^3} | -| | \foo a b + \foo c d$ | \foo a b + \foo c d` | -+-------------------+---------------------------------+--------------------------------+ -| \\xdef | `\xdef\macroname#1#2…{definition to be expanded}` | -+-------------------+------------------------------------------------------------------+ -| \\edef | `\edef\macroname#1#2…{definition}` | -+-------------------+------------------------------------------------------------------+ -| \\let | `\let\foo=\bar` | -+-------------------+------------------------------------------------------------------+ -| \\futurelet | `\futurelet\foo\bar x` | -+-------------------+------------------------------------------------------------------+ -| \\global\\def | `\global\def\macroname#1#2…{definition}` | -+-------------------+------------------------------------------------------------------+ -| `\newcommand` | `\newcommand\macroname[numargs]{definition}` | -| +---------------------------------+--------------------------------+ -| | $\newcommand\foo[2]{#1^2 #2^3} | `\newcommand\foo[2]{#1^2 #2^3} | -| | \foo a b + \foo c d$ | \foo a b + \foo c d ` | -+-------------------+---------------------------------+--------------------------------+ -| `\renewcommand` | `\renewcommand\macroname[numargs]{definition}` | -+-------------------+------------------------------------------------------------------+ -| `\providecommand` | `\providecommand\macroname[numargs]{definition}` | -+-------------------+---------------------------------+--------------------------------+ -{.grid colWidths="136 71 86"} - -To create macros with document-wide scope, use `\gdef`, `\global\let`, or define a -[preamble](./administration.html#preamble) in one of the Temml -[rendering options](./administration.html#options). (Global macros may be disabled for security reasons.) - -Macros accept up to nine arguments: #1, #2, etc. - -Available functions include:\ -`\char` `\mathchoice` `\TextOrMath` `\@ifstar` `\@ifnextchar` `\@firstoftwo` `\@secondoftwo` `\relax` `\expandafter` `\noexpand` - -@ is a valid character for commands, as if `\makeatletter` were in effect. - -Temml has no `\par`, so `\long` is ignored. - -## Operators - -### Big Operators - -+======================+==========================+============================+===============================+ -| $\sum$ `\sum` | $\prod$ `\prod` | $\bigotimes$ `\bigotimes` | $\bigvee$ `\bigvee` | -+----------------------+--------------------------+----------------------------+-------------------------------+ -| $\int$ `\int` | $\coprod$ `\coprod` | $\bigoplus$ `\bigoplus` | $\bigwedge$ `\bigwedge` | -+----------------------+--------------------------+----------------------------+-------------------------------+ -| $\iint$ `\iint` | $\intop$ `\intop` | $\bigodot$ `\bigodot` | $\bigcap$ `\bigcap` | -+----------------------+--------------------------+----------------------------+-------------------------------+ -| $\iiint$ `\iiint` | $\smallint$ `\smallint` | $\biguplus$ `\biguplus` | $\bigcup$ `\bigcup` | -+----------------------+--------------------------+----------------------------+-------------------------------+ -| $\iiiint$ `\iiiint` | $\intcap$ `\intcap` | $\intcup$ `\intcup` | $\bigsqcup$ `\bigsqcup` | -+----------------------+--------------------------+----------------------------+-------------------------------+ -| $\oint$ `\oint` | $\varointclockwise$ | $\intclockwise$ | $\bigsqcap$ | -| | `\varointclockwise` | `\intclockwise` | `\bigsqcap` | -+----------------------+--------------------------+----------------------------+-------------------------------+ -| $\oiint$ `\oiint` | $\pointint$ `\pointint` | $\rppolint$ `\rppolint` | $\scpolint$ `\scpolint` | -+----------------------+--------------------------+----------------------------+-------------------------------+ -| $\oiiint$ `\oiiint` | $\intlarhk$ `\intlarhk` | $\sqint$ `\sqint` | $\intx$ `\intx` | -+----------------------+--------------------------+----------------------------+-------------------------------+ -| $\intbar$ `\intbar` | $\intBar$ `\intBar` | $\fint$ `\fint` | $\bigtimes$ `\bigtimes` | -+----------------------+--------------------------+----------------------------+-------------------------------+ - -$\sideset{_a^b}{_c^d}\sum$ `\sideset{_a^b}{_c^d}\sum` - -Direct Input: ∫ ∬ ∭ ⨌ ∮ ∯ ∰ ⨖ ∲ ∏ ∐ ∑ ⋀ ⋁ ⋂ ⋃ ⨀ ⨁ ⨂ ⨄ ⨆ ⨅ - -### Binary Operators - -+===========================+===========================+=============================+===========================+ -| $+$ `+` | $\closedvarcap$ | $\lhd$ `\lhd` | $\sslash$ `\sslash` | -| | `\closedvarcap` | | | -+---------------------------+---------------------------+-----------------------------+---------------------------+ -| $-$ `-` | $\closedvarcup$ | $\ltimes$ `\ltimes` | $\threedotcolon$ | -| | `\closedvarcup` | | `\threedotcolon` | -+---------------------------+---------------------------+-----------------------------+---------------------------+ -| $/$ `/` | $\Cup$ `\Cup` | $\minusdot$ `\minusdot` | $\times$ `\times` | -| | or `\doublecup` | | | -+---------------------------+---------------------------+-----------------------------+---------------------------+ -| $*$ `*` | $\cup$ `\cup` | $\minusfdots$ | $\twocaps$ `\twocaps` | -| | | `\minusfdots` | | -+---------------------------+---------------------------+-----------------------------+---------------------------+ -| $\amalg$ `\amalg` | $\cupovercap$ | $\minusrdots$ | $\twocups$ `\twocups` | -| | `\cupovercap` | `\minusrdots` | | -+---------------------------+---------------------------+-----------------------------+---------------------------+ -| $\And$ `\And` or `\with` | $\curlyvee$ `\curlyvee` | $x \mod a$ `x\mod a` | $\typecolon$ `\typecolon` | -+---------------------------+---------------------------+-----------------------------+---------------------------+ -| $\ast$ `\ast` | $\curlywedge$ | $\mp$ `\mp` | $\unlhd$ `\unlhd` | -| | `\curlywedge` | | | -+---------------------------+---------------------------+-----------------------------+---------------------------+ -| $\barcap$ `\barcap` | $\div$ `\div` | $\parr$ `\parr` | $\unrhd$ `\unrhd` | -| | | or `\upand` | | -+---------------------------+---------------------------+-----------------------------+---------------------------+ -| $\barcup$ `\barcup` | $\divideontimes$ | $\pm$ `\pm` | $\uplus$ `\uplus` | -| | `\divideontimes` | | | -+---------------------------+---------------------------+-----------------------------+---------------------------+ -| $\Nor$ `\barvee` or | $\dotminus$  `\dotminus`  | $x \pmod a$ `x \pmod a` | $\Vee$ `\Vee` | -| `\Nor` | | | | -+---------------------------+---------------------------+-----------------------------+---------------------------+ -| $\barwedge$ `\barwedge` | $\dotplus$ `\dotplus` | $x \pod a$ `x \pod a` | $\vee$ `\vee` or `\lor` | -| or `\Nand` | | | | -+---------------------------+---------------------------+-----------------------------+---------------------------+ -| $\bmod$ `\bmod` | $\doublebarvee$ | $\rhd$ `\rhd` | $\veebar$ `\veebar` or | -| | `\doublebarvee` | | `\Xor` | -+---------------------------+---------------------------+-----------------------------+---------------------------+ -| $\bowtie$ `\bowtie` or\ | $\doublebarwedge$ | $\rightouterjoin$ | $\veedot$ `\veedot` | -| `\Join` | `\doublebarwedge` | `\rightouterjoin` | | -+---------------------------+---------------------------+-----------------------------+---------------------------+ -| $\bullet$ `\bullet` | $\fullouterjoin$ | $\rightthreetimes$ | $\veedoublebar$ | -| | `\fullouterjoin` | `\rightthreetimes` | `\veedoublebar` | -+---------------------------+---------------------------+-----------------------------+---------------------------+ -| $\Cap$ `\Cap` | $\gtrdot$ `\gtrdot` | $\rtimes$ `\rtimes` | $\veeonvee$ `\veeonvee` | -| or `\doublecap` | | | | -+---------------------------+---------------------------+-----------------------------+---------------------------+ -| $\cap$ `\cap` | $\intercal$ `\intercal` | $\setminus$ `\setminus` | $\Wedge$ `\Wedge` | -+---------------------------+---------------------------+-----------------------------+---------------------------+ -| $\capbarcup$ `\capbarcup` | $\interleave$ | $\shuffle$ `\shuffle` | $\wedge$ `\wedge` or | -| | `\interleave` | | `\land` | -+---------------------------+---------------------------+-----------------------------+---------------------------+ -| $\capdot$ `\capdot` | $\invlazys$ `\invlazys` | $\smallsetminus$ | $\wedgebar$ `\wedgebar` | -| | | `\smallsetminus` | | -+---------------------------+---------------------------+-----------------------------+---------------------------+ -| $\capovercup$ | $\leftthreetimes$ | $\smashtimes$ `\smashtimes` | $\wedgedot$ `\wedgedot` | -| `\capovercup` | `\leftthreetimes` | | | -+---------------------------+---------------------------+-----------------------------+---------------------------+ -| $\cdot$ `\cdot` | $\leftouterjoin$ | $\sqcap$ `\sqcap` | $\wedgedoublebar$ | -| | `\leftouterjoin` | | `\wedgedoublebar` | -+---------------------------+---------------------------+-----------------------------+---------------------------+ -| $\cdotp$ `\cdotp` | $\leftmodels$ | $\Sqcap$ `\Sqcap` | $\wedgeonwedge$ | -| | `\leftmodels` | | `\wedgeonwedge` | -+---------------------------+---------------------------+-----------------------------+---------------------------+ -| $\centerdot$ `\centerdot` | $\ldotp$ `\ldotp` | $\sqcup$ `\sqcup` | $\wr$ `\wr` | -+---------------------------+---------------------------+-----------------------------+---------------------------+ -| $\circ$ `\circ` | $\lessdot$ `\lessdot` | $\Sqcup$ `\Sqcup` | ¶ | -+---------------------------+---------------------------+-----------------------------+---------------------------+ - -The _texvc_ extension provides $\plusmn$ `\plusmn`. - -Direct Input: + - / ∖ * ⋅ ∘ ± × ÷ ∓ ∔ ∧ ∨ ∩ ∪ ≀ ⊎ ⊓ ⊔ ⋈ ⟕ ⟖ ⟗ - -### Geometric Binary Operators - -+=====================================+=====================================+===================================+ -| $\bigcirc$ `\bigcirc` | $\circledvert$ `\circledvert` | $\ominus$ `\ominus` | -+-------------------------------------+-------------------------------------+-----------------------------------+ -| $\blackhourglass$ `\blackhourglass` | $\circlehbar$ `\circlehbar` | $\operp$ `\operp` | -+-------------------------------------+-------------------------------------+-----------------------------------+ -| $\boxast$ `\boxast` | $\concavediamond$ `\concavediamond` | $\oplus$ `\oplus` | -+-------------------------------------+-------------------------------------+-----------------------------------+ -| $\boxbox$ `\boxbox` | $\concavediamondtickleft$ | $\oslash$ `\oslash` | -| | `\concavediamondtickleft` | | -+-------------------------------------+-------------------------------------+-----------------------------------+ -| $\boxcircle$ `\boxcircle` | $\concavediamondtickright$ | $\otimes$ `\otimes` | -| | `\concavediamondtickright` | | -+-------------------------------------+-------------------------------------+-----------------------------------+ -| $\boxdot$ `\boxdot` | $\diamond$ `\diamond` | $\Otimes$ `\Otimes` | -+-------------------------------------+-------------------------------------+-----------------------------------+ -| $\boxminus$ `\boxminus` | $\hourglass$ `\hourglass` | $\otimeshat$ `\otimeshat` | -+-------------------------------------+-------------------------------------+-----------------------------------+ -| $\boxplus$ `\boxplus` | $\lozengeminus$ `\lozengeminus` | $\star$ `\star` | -+-------------------------------------+-------------------------------------+-----------------------------------+ -| $\boxtimes$ `\boxtimes` | $\obar$ `\obar` | $\triangle$ `\triangle` | -+-------------------------------------+-------------------------------------+-----------------------------------+ -| $\circledast$ `\circledast` | $\obslash$ `\obslash` | $\triangleminus$ `\triangleminus` | -+-------------------------------------+-------------------------------------+-----------------------------------+ -| $\circledcirc$ `\circledcirc` | $\odiv$ `\odiv` | $\triangleplus$ `\triangleplus` | -+-------------------------------------+-------------------------------------+-----------------------------------+ -| $\circleddash$ `\circleddash` | $\odot$ `\odot` | $\triangletimes$ `\triangletimes` | -+-------------------------------------+-------------------------------------+-----------------------------------+ -| $\circledequal$ `\circledequal` | $\ogreaterthan$ `\ogreaterthan` | $\whitesquaretickleft$ | -| | | `\whitesquaretickleft` | -+-------------------------------------+-------------------------------------+-----------------------------------+ -| $\circledparallel$ | $\olessthan$ `\olessthan` | $\whitesquaretickright$ | -| `\circledparallel` | | `\whitesquaretickright` | -+-------------------------------------+-------------------------------------+-----------------------------------+ - -Direct Input: ◯ ⧗ ⧆ ⧈ ⧇ ⊡ ⊟ ⊞ ⊠ ⊛ ⊚ ⊖ ⊜ ⦷ ⦶ ⦵ ⟡ ⟢ ⟣ ⋄ ⧖ ⟠ ⌽ ⦸ ⨸ ⊙ ⧁ ⧀ ⊝ ⦹ ⊕ ⊘ ⊗ ⨷ ⨶ ⋆ △ ⨺ ⨻ ⟤ ⟥ - -### Fractions and Binomials - -+:================+:=================+:===============================+ -| $\frac{a}{b}$ | $\tfrac{a}{b}$ | $\genfrac ( ] {2pt}{1}a{a+1}$ | -| `\frac{a}{b}` | `\tfrac{a}{b}` | `\genfrac ( ] {2pt}{1}a{a+1}` | -+-----------------+------------------+--------------------------------+ -| ${a \over b}$ | $\dfrac{a}{b}$ | ${a \above{2pt} b+1}$ | -| `{a \over b}` | `\dfrac{a}{b}` | `{a \above{2pt} b+1}` | -+-----------------+------------------+--------------------------------+ -| $a/b$   `a/b` | | $\cfrac{a}{1 + \cfrac{1}{b}}$ | -| | | `\cfrac{a}{1 + \cfrac{1}{b}}` | -+-----------------+------------------+--------------------------------+ - -+:=================================+:=================================+:=============================+ -| $\binom{n}{k}$ `\binom{n}{k}` | $\dbinom{n}{k}$ `\dbinom{n}{k}` | ${n\brace k}$ `{n\brace k}` | -+----------------------------------+----------------------------------+------------------------------+ -| ${n \choose k}$ `{n \choose k}` | $\tbinom{n}{k}$ `\tbinom{n}{k}` | ${n\brack k}$ `{n\brack k}` | -+----------------------------------+----------------------------------+------------------------------+ - -### Math Operators - -+=========================+======================+==============================+==================+ -| $\operatorname{f}$ | $\cosec$ `\cosec` | $\dim$ `\dim` | $\pdv*{f}{x,y}$ | -| `\operatorname{f}` | | | `\pdv*{f}{x,y}` | -+-------------------------+----------------------+------------------------------+------------------+ -| $\arcsin$ `\arcsin` | $\cosh$ `\cosh` | $\exp$ `\exp` | $\sec$ `\sec` | -+-------------------------+----------------------+------------------------------+------------------+ -| $\arccos$ `\arccos` | $\cot$ `\cot` | $\hom$ `\hom` | $\sgn$ `\sgn` | -+-------------------------+----------------------+------------------------------+------------------+ -| $\arctan$ `\arctan` | $\cotg$ `\cotg` | $\ker$ `\ker` | $\sin$ `\sin` | -+-------------------------+----------------------+------------------------------+------------------+ -| $\arctg$ `\arctg` | $\coth$ `\coth` | $\lg$ `\lg` | $\sinh$ `\sinh` | -+-------------------------+----------------------+------------------------------+------------------+ -| $\arcctg$ `\arcctg` | $\csc$ `\csc` | $\ln$ `\ln` | $\sh$ `\sh` | -+-------------------------+----------------------+------------------------------+------------------+ -| $\arg$ `\arg` | $\ctg$ `\ctg` | $\log$ `\log` | $\tan$ `\tan` | -+-------------------------+----------------------+------------------------------+------------------+ -| $\ch$ `\ch` | $\cth$ `\cth` | $\odv{f}{x}$ `\odv{f}{x}` | $\tanh$ `\tanh` | -+-------------------------+----------------------+------------------------------+------------------+ -| $\cos$ `\cos` | $\nabla$ `\nabla` | $\odv*{f}{x}$ `\odv*{f}{x}` | $\tg$ `\tg` | -+-------------------------+----------------------+------------------------------+------------------+ -| $\partial$ `\partial` | $\deg$ `\deg` | $\pdv{f}{x,y}$ `\pdv{f}{x,y}`| $\th$ `\th` | -+-------------------------+----------------------+------------------------------+------------------+ -| $\operatorname*{f}$ | $\inf$ `\inf` | $\max$ `\max` | $\sup$ `\sup` | -| `\operatorname*{f}` or\ | | | | -|`\operatornamewithlimits`| | | | -+-------------------------+----------------------+------------------------------+------------------+ -| $\argmax$ `\argmax` | $\injlim$ `\injlim` | $\min$ `\min` | $\varinjlim$ | -| | | | `\varinjlim` | -+-------------------------+----------------------+------------------------------+------------------+ -| $\argmin$ `\argmin` | $\lim$ `\lim` | $\plim$ `\plim` | $\varliminf$ | -| | | | `\varliminf` | -+-------------------------+----------------------+------------------------------+------------------+ -| $\det$ `\det` | $\liminf$ `\liminf` | $\Pr$ `\Pr` | $\varlimsup$ | -| | | | `\varlimsup` | -+-------------------------+----------------------+------------------------------+------------------+ -| $\gcd$ `\gcd` | $\limsup$ `\limsup` | $\projlim$ `\projlim` | $\varprojlim$ | -| | | | `\varprojlim` | -+-------------------------+----------------------+------------------------------+------------------+ - -Functions in the bottom five rows of this table can take `\limits`. - -### Enclosing Operators - -+:===============================+:===============================+ -| $\sqrt{x}$ `\sqrt{x}` | $a_{\angl n}$   `a_{\angl n}` | -+--------------------------------+--------------------------------+ -| $\sqrt[3]{x}$ `\sqrt[3]{x}` | $a_\angln$   `a_\angln` | -+--------------------------------+--------------------------------+ - -## Physics and Chemistry - -+:===========================+:=============================================================+ -| $\bra{\phi}$ `\bra{\phi}` | $\prescript{a}{2}{\mathbf{C}}^{5+}_{2}$ | -| | `\prescript{a}{2}{\mathbf{C}}^{5+}_{2}` | -+----------------------------+--------------------------------------------------------------+ -| $\ket{\psi}$ `\ket{\psi}` | $\braket{\phi\vert\psi}$ | -| | `\braket{\phi\vert\psi}` | -+----------------------------+--------------------------------------------------------------+ -| $\Bra{\phi}$ `\Bra{\phi}` | $\Braket{ \phi | \frac{\partial^2}{\partial t^2} | \psi }$ \ | -| | `\Braket{ \phi | \frac{\partial^2}{\partial t^2} | \psi }` | -+----------------------------+ + -| $\Ket{\psi}$ `\Ket{\psi}` | | -+----------------------------+--------------------------------------------------------------+ - -From the _mhchem_ extension: - -+:==================================+:=================================+ -| $\ce{SO4^2- + Ba^2+ -> BaSO4 v}$ | `\ce{SO4^2- + Ba^2+ -> BaSO4 v}` | -+-----------------------------------+----------------------------------+ -| $\pu{75.3 J // mol K}$ | `\pu{75.3 J // mol K}` | -+-----------------------------------+----------------------------------+ - -

There is much more mhchem information in the -mhchem docs.

- -
- -
Click to see the physics extension. - -+:================================+:============================+:=========================+ -| $\abs{x}$ `\abs{x}` | $\innerproduct{a}{b}$ | $\qif$ `\qif` | -| | `\innerproduct{a}{b}` | | -+---------------------------------+-----------------------------+--------------------------+ -| $\absolutevalue{x}$ | $\ketbra{a}{b}$ | $\qin$ `\qin` | -| `\absolutevalue{x}` | `\ketbra{a}{b}` | | -+---------------------------------+-----------------------------+--------------------------+ -| $\acomm{A}{B}$ `\acomm{A}{B}` | $\laplacian$ | $\qinteger$ `\qinteger` | -| | `\laplacian` | | -+---------------------------------+-----------------------------+--------------------------+ -| $\anticommutator{A}{B}$ | $\matrixel{n}{A}{m}$ | $\qlet$ `\qlet` | -| `\anticommutator{A}{B}` | `\matrixel{n}{A}{m}` | | -+---------------------------------+-----------------------------+--------------------------+ -| $\Bqty{5 \text{mm}}$ | $\matrixelement{n}{A}{m}$ | $\qodd$ `\qodd` | -| `\Bqty{5 \text{mm}}` | `\matrixelement{n}{A}{m}` | | -+---------------------------------+-----------------------------+--------------------------+ -| $\bqty{5 \text{mm}}$ | $\mel{n}{A}{m}$ | $\qor$ `\qor` | -| `\bqty{5 \text{mm}}` | `\mel{n}{A}{m}` | | -+---------------------------------+-----------------------------+--------------------------+ -| $\comm{A}{B}$ `\comm{A}{B}` | $\norm{x}$ `\norm{x}` | $\qotherwise$ | -| | | `\qotherwise` | -+---------------------------------+-----------------------------+--------------------------+ -| $\commutator{A}{B}$ | $\op{a}{b}$ `\op{a}{b}` | $\qq{text}$ `\qq{text}` | -| `\commutator{A}{B}` | | | -+---------------------------------+-----------------------------+--------------------------+ -| $\cp$ `\cp` | $\order{x^2}$ | $\qqtext{text}$ | -| | `\order{x^2}` | `\qqtext{text}` | -+---------------------------------+-----------------------------+--------------------------+ -| $\cross$ `\cross` | $\outerproduct{a}{b}$ | $\qsince$ `\qsince` | -| | `\outerproduct{a}{b}` | | -+---------------------------------+-----------------------------+--------------------------+ -| $\crossproduct$ | $\partialderivative{x}{y}$ | $\qthen$ `\qthen` | -| `\crossproduct` | `\partialderivative{x}{y}` | | -+---------------------------------+-----------------------------+--------------------------+ -| $\curl$ `\curl` | $\pb{x}{y}$ `\pb{x}{y}` | $\qty{5 \text{m}}$ | -| | | `\qty{5 \text{m}}` | -+---------------------------------+-----------------------------+--------------------------+ -| $\dd$ `\dd` | | $\quantity{5 \text{m}}$ | -| | | `\quantity{5 \text{m}}` | -+---------------------------------+-----------------------------+--------------------------+ -| $\derivative{x}{y}$ | $\poissonbracket{A}{B}$ | $\qunless$ `\qunless` | -| `\derivative{x}{y}` | `\poissonbracket{A}{B}` | | -+---------------------------------+-----------------------------+--------------------------+ -| $\differential$ | $\pqty{5}$ `\pqty{5}` | $\qusing$ `\qusing` | -| `\differential` | | | -+---------------------------------+-----------------------------+--------------------------+ -| $\divergence$ `\divergence` | $\principalvalue$ | $\rank M$ `\rank M` | -| | `\principalvalue` | | -+---------------------------------+-----------------------------+--------------------------+ -| $\dotproduct$ `\dotproduct` | $\pv$ `\pv` | $\Res[f(z)]$ | -| | | `\Res\[f(z)\]` | -+---------------------------------+-----------------------------+--------------------------+ -| $\dv{x}{y}$ `\dv{x}{y}` | $\PV(x)$ `\PV(x)` | $\Tr\rho$ `\Tr\rho` | -+---------------------------------+-----------------------------+--------------------------+ -| $\dyad{a}{b}$ `\dyad{a}{b}` | $\qall$ `\qall` | $\tr\rho$ `\tr\rho` | -+---------------------------------+-----------------------------+--------------------------+ -| $\erf(x)$ `\erf(x)` | $\qand$ `\qand` | $\va{a}$ `\va{a}` | -+---------------------------------+-----------------------------+--------------------------+ -| $\ev{x}$ `\ev{x}` | $\qas$ `\qas` | $\var$ `\var` | -+---------------------------------+-----------------------------+--------------------------+ -| $\eval{\tfrac 1 2 x}_0^n$ | $\qassume$ `\qassume` | $\variation$ | -| `\eval{\tfrac 1 2 x}_0^n` | | `\variation` | -+---------------------------------+-----------------------------+--------------------------+ -| $\evaluated{\tfrac 1 2 x}_0^n$ | $\qc$ `\qc` | $\vb{a}$ `\vb{a}` | -| `\evaluated{\tfrac 1 2 x}_0^n` | | | -+---------------------------------+-----------------------------+--------------------------+ -| $\expectationvalue{x}$ | $\qcc$ `\qcc` | $\vdot$ `\vdot` | -| `\expectationvalue{x}` | | | -+---------------------------------+-----------------------------+--------------------------+ -| $\expval{x}$ `\expval{x}` | $\qcomma$ `\qcomma` | $\vectorarrow{a}$ | -| | | `\vectorarrow{a}` | -+---------------------------------+-----------------------------+--------------------------+ -| $\fdv{x}{y}$ `\fdv{x}{y}` | $\qelse$ `\qelse` | $\vectorbold{a}$ | -| | | `\vectorbold{a}` | -+---------------------------------+-----------------------------+--------------------------+ -| $\functionalderivative{x}{y}$ | $\qeven$ `\qeven` | $\vectorunit{a}$ | -| `\functionalderivative{x}{y}` | | `\vectorunit{a}` | -+---------------------------------+-----------------------------+--------------------------+ -| $\grad$ `\grad` | $\qfor$ `\qfor` | $\vqty{x}$ `\vqty{x}` | -+---------------------------------+-----------------------------+--------------------------+ -| $\gradient$ `\gradient` | $\qgiven$ `\qgiven` | $\vu{a}$ `\vu{a}` | -+---------------------------------+-----------------------------+--------------------------+ - -
- -## Relations - -$\stackrel{!}{=}\vphantom{\frac a b}$ `\stackrel{!}{=}` - -+======================+======================+======================+======================+ -| $=$ `=` | $\eqcirc$ `\eqcirc` | $\lessgtr$ | $\smile$ `\smile` | -| | | `\lessgtr` | | -+----------------------+----------------------+----------------------+----------------------+ -| $<$ `<` | $\eqcolon$ | $\lesssim$ | $\sqsubset$ | -| | `\eqcolon` or\ | `\lesssim` | `\sqsubset` | -| |   `\minuscolon` | | | -+----------------------+----------------------+----------------------+----------------------+ -| $>$ `>` | $\Eqcolon$ | $\ll$ `\ll` | $\sqsubseteq$ | -| | `\Eqcolon` or\ | | `\sqsubseteq` | -| | `\minuscoloncolon` | | | -+----------------------+----------------------+----------------------+----------------------+ -| $:$ `:` | $\eqqcolon$ | $\lll$ `\lll` | $\sqsupset$ | -| | `\eqqcolon` | | `\sqsupset` | -+----------------------+----------------------+----------------------+----------------------+ -| $:=$ `:=` | $\Eqqcolon$ | $\llless$ `\llless` | $\sqsupseteq$ | -| | `\Eqqcolon` | | `\sqsupseteq` | -+----------------------+----------------------+----------------------+----------------------+ -| $\approx$ `\approx` | $\eqdef$ `\eqdef` | $\lt$ `\lt` | $\stareq$ `\stareq` | -+----------------------+----------------------+----------------------+----------------------+ -| $\approxeq$ | $\eqsim$ `\eqsim` | $\measeq$ `\measeq` | $\Subset$ `\Subset` | -| `\approxeq` | | | | -+----------------------+----------------------+----------------------+----------------------+ -| $\arceq$ `\arceq` | $\eqslantgtr$ | $\mid$ `\mid` | $\subset$ `\subset` | -| | `\eqslantgtr` | | | -+----------------------+----------------------+----------------------+----------------------+ -| $\asymp$ `\asymp` | $\eqslantless$ | $\models$ `\models` | $\subseteq$ | -| | `\eqslantless` | | `\subseteq` | -+----------------------+----------------------+----------------------+----------------------+ -| $\backcong$ | $\equiv$ `\equiv` | $\multimap$ | $\subseteqq$ | -| `\backcong` | | `\multimap` | `\subseteqq` | -+----------------------+----------------------+----------------------+----------------------+ -| $\backepsilon$ | $\fallingdotseq$ | $\multimapboth$ | $\succ$ `\succ` | -| `\backepsilon` | `\fallingdotseq` | `\multimapboth` | | -+----------------------+----------------------+----------------------+----------------------+ -| $\backsim$ | $\frown$ `\frown` | $\multimapinv$ | $\succapprox$ | -| `\backsim` | | `\multimapinv` | `\succapprox` | -+----------------------+----------------------+----------------------+----------------------+ -| $\backsimeq$ | $\ge$ `\ge` | $\origof$ `\origof` | $\succcurlyeq$ | -| `\backsimeq` | | | `\succcurlyeq` | -+----------------------+----------------------+----------------------+----------------------+ -| $\between$ | $\geq$ `\geq` | $\owns$ `\owns` | $\succeq$ `\succeq` | -| `\between` | | | | -+----------------------+----------------------+----------------------+----------------------+ -| $\bumpeq$ `\bumpeq` | $\geqq$ `\geqq` | $\parallel$ | $\succsim$ | -| | | `\parallel` | `\succsim` | -+----------------------+----------------------+----------------------+----------------------+ -| $\Bumpeq$ `\Bumpeq` | $\geqslant$ | $\perp$ `\perp` | $\Supset$ `\Supset` | -| | `\geqslant` | | | -+----------------------+----------------------+----------------------+----------------------+ -| $\circeq$ `\circeq` | $\gg$ `\gg` | $\Perp$ `\Perp` | $\supset$ `\supset` | -+----------------------+----------------------+----------------------+----------------------+ -| $\coh$ `\coh` | $\ggg$ `\ggg` | $\pitchfork$ | $\supseteq$ | -| | | `\pitchfork` | `\supseteq` | -+----------------------+----------------------+----------------------+----------------------+ -| $\colonapprox$ | $\gggtr$ `\gggtr` | $\prec$ `\prec` | $\supseteqq$ | -| `\colonapprox` | | | `\supseteqq` | -+----------------------+----------------------+----------------------+----------------------+ -| $\Colonapprox$ | $\gt$ `\gt` | $\precapprox$ | $\thickapprox$ | -| `\Colonapprox` or\ | | `\precapprox` | `\thickapprox` | -| `\coloncolonapprox` | | | | -+----------------------+----------------------+----------------------+----------------------+ -| $\coloneq$ | $\gtrapprox$ | $\preccurlyeq$ | $\thicksim$ | -| `\coloneq` or\ | `\gtrapprox` | `\preccurlyeq` | `\thicksim` | -|  `\colonminus` | | | | -+----------------------+----------------------+----------------------+----------------------+ -| $\Coloneq$ | $\gtreqless$ | $\preceq$ `\preceq` | $\trianglelefteq$ | -| `\Coloneq` or\ | `\gtreqless` | | `\trianglelefteq` | -|  `\coloncolonminus` | | | | -+----------------------+----------------------+----------------------+----------------------+ -| $\coloneqq$ | $\gtreqqless$ | $\precsim$ | $\triangleq$ | -| `\coloneqq` or\ | `\gtreqqless` | `\precsim` | `\triangleq` | -|  `\colonequals` | | | | -+----------------------+----------------------+----------------------+----------------------+ -| $\Coloneqq$ | $\gtrless$ | $\propto$ `\propto` | $\trianglerighteq$ | -| `\Coloneqq` or \ | `\gtrless` | | `\trianglerighteq` | -|  `\coloncolonequals` | | | | -+----------------------+----------------------+----------------------+----------------------+ -| $\colonsim$ | $\gtrsim$ `\gtrsim` | $\questeq$ | $\varpropto$ | -| `\colonsim` | | `\questeq` | `\varpropto` | -+----------------------+----------------------+----------------------+----------------------+ -| $\Colonsim$ | $\imageof$ | \:`\ratio` or\ | $\vartriangle$ | -| `\Colonsim` or\ | `\imageof` |   `\vcentcolon` | `\vartriangle` | -|  `\coloncolonsim` | | | | -+----------------------+----------------------+----------------------+----------------------+ -| $\cong$ `\cong` | $\in$ `\in` or | $\risingdotseq$ | $\vartriangleleft$ | -| | `\isin` | `\risingdotseq` | `\vartriangleleft` | -+----------------------+----------------------+----------------------+----------------------+ -| $\curlyeqprec$ | $\incoh$ `\incoh` | $\scoh$ `\scoh` | $\vartriangleright$ | -| `\curlyeqprec` | | | `\vartriangleright` | -+----------------------+----------------------+----------------------+----------------------+ -| $\curlyeqsucc$ | $\le$ `\le` | $\shortmid$ | $\vdash$ `\vdash` | -| `\curlyeqsucc` | | `\shortmid` | | -+----------------------+----------------------+----------------------+----------------------+ -| $\dashv$ `\dashv` | $\leq$ `\leq` | $\shortparallel$ | $\vDash$ `\vDash` | -| | | `\shortparallel` | | -+----------------------+----------------------+----------------------+----------------------+ -| $\dblcolon$ | $\leqq$ `\leqq` | $\sim$ `\sim` | $\Vdash$ `\Vdash` | -| `\dblcolon` or\ | | | | -|    `\coloncolon` | | | | -+----------------------+----------------------+----------------------+----------------------+ -| $\doteq$ `\doteq` | $\leqslant$ | $\simeq$ `\simeq` | $\VDash$ `VDash` | -| | `\leqslant` | | | -+----------------------+----------------------+----------------------+----------------------+ -| $\Doteq$ `\Doteq` | $\lessapprox$ | $\sincoh$ `\sincoh` | $\Vvdash$ `\Vvdash` | -| | `\lessapprox` | | | -+----------------------+----------------------+----------------------+----------------------+ -| $\doteqdot$ | $\lesseqgtr$ | $\smallfrown$ | $\veeeq$ `\veeeq` | -| `\doteqdot` | `\lesseqgtr` | `\smallfrown` | | -+----------------------+----------------------+----------------------+----------------------+ -| $\eqeq$ `\eqeq` | $\lesseqqgtr$ | $\smallsmile$ | $\wedgeq$ `\wedgeq` | -| | `\lesseqqgtr` | `\smallsmile` | | -+----------------------+----------------------+----------------------+----------------------+ - -The _texvc_ extension provides $\sub$ `\sub`, $\sube$ `\sube`, and $\supe$ `\supe`. - -Direct Input: = < > : ∈ ∋ ∝ ∼ ∽ ≂ ≃ ≅ ≈ ≊ ≍ ≎ ≏ ≐ ≑ ≒ ≓ ⩵ ≖ -≗ ≜ ≡ ≤ ≥ ≦ ≧ ≫ ≬ ≳ ≷ ≺ ≻ ≼ ≽ ≾ ≿ ⊂ ⊃ ⊆ ⊇ ⊏ ⊐ ⊑ ⊒ ⊢ ⊣ ⊩ ⊪ ⊸ ⋍ ⋐ ⋑ ⋔ ⋙ -⋛ ⋞ ⋟ ⌢ ⌣ ⩾ ⪆ ⪌ ⪕ ⪖ ⪯ ⪰ ⪷ ⪸ ⫅ ⫆ ≲ ⩽ ⪅ ≶ ⋚ ⪋ ⟂ ⊨ ≔ ≕ ⩴ ⊷ ⊶ - -### Negated Relations - -$\not =$ `\not =` - -+====================+=========================+========================+======================+ -| $\gnapprox$ | $\ngeqslant$ | $\nsubset$ | $\nVdash$ `\nVdash` | -| `\gnapprox` | `\ngeqslant` | ` \nsubset ` | | -+--------------------+-------------------------+------------------------+----------------------+ -| $\gneq$ `\gneq` | $\ngtr$ `\ngtr` | $\nsubseteq$ | $\precnapprox$ | -| | | `\nsubseteq` | `\precnapprox` | -+--------------------+-------------------------+------------------------+----------------------+ -| $\gneqq$ `\gneqq` | $\nleq$ `\nleq` | $\nsubseteqq$ | $\precneqq$ | -| | | `\nsubseteqq` | `\precneqq` | -+--------------------+-------------------------+------------------------+----------------------+ -| $\gnsim$ `\gnsim` | $\nleqq$ `\nleqq` | $\nsucc$ `\nsucc` | $\precnsim$ | -| | | | `\precnsim` | -+--------------------+-------------------------+------------------------+----------------------+ -| $\gvertneqq$ | $\nleqslant$ | $\nsucceq$ `\nsucceq` | $\subsetneq$ | -| `\gvertneqq` | `\nleqslant` | | `\subsetneq` | -+--------------------+-------------------------+------------------------+----------------------+ -| $\lnapprox$ | $\nless$ `\nless` | $\nsupset$ | $\subsetneqq$ | -| `\lnapprox` | | ` \nsupset ` | `\subsetneqq` | -+--------------------+-------------------------+------------------------+----------------------+ -| $\lneq$ `\lneq` | $\nmid$ `\nmid` | $\nsupseteq$ | $\succnapprox$ | -| | | `\nsupseteq` | `\succnapprox` | -+--------------------+-------------------------+------------------------+----------------------+ -| $\lneqq$ `\lneqq` | $\notin$ `\notin` | $\nsupseteqq$ | $\succneqq$ | -| | | `\nsupseteqq` | `\succneqq` | -+--------------------+-------------------------+------------------------+----------------------+ -| $\lnsim$ `\lnsim` | $\notni$ `\notni` | $\ntriangleleft$ | $\succnsim$ | -| | | `\ntriangleleft` | `\succnsim` | -+--------------------+-------------------------+------------------------+----------------------+ -| $\lvertneqq$ | $\nparallel$ | $\ntrianglelefteq$ | $\supsetneq$ | -| `\lvertneqq` | `\nparallel` | `\ntrianglelefteq` | `\supsetneq` | -+--------------------+-------------------------+------------------------+----------------------+ -| $\ncong$ `\ncong` | $\nprec$ `\nprec` | $\ntriangleright$ | $\supsetneqq$ | -| | | `\ntriangleright` | `\supsetneqq` | -+--------------------+-------------------------+------------------------+----------------------+ -| $\ne$ `\ne` | $\npreceq$ `\npreceq` | $\ntrianglerighteq$ | $\varsubsetneq$ | -| | | `\ntrianglerighteq` | `\varsubsetneq` | -+--------------------+-------------------------+------------------------+----------------------+ -| $\neq$ `\neq` | $\nshortmid$ | $\nvdash$ `\nvdash` | $\varsubsetneqq$ | -| | `\nshortmid` | | `\varsubsetneqq` | -+--------------------+-------------------------+------------------------+----------------------+ -| $\ngeq$ `\ngeq` | $\nshortparallel$ | $\nvDash$ `\nvDash` | $\varsupsetneq$ | -| | `\nshortparallel` | | `\varsupsetneq` | -+--------------------+-------------------------+------------------------+----------------------+ -| $\ngeqq$ `\ngeqq` | $\nsim$ `\nsim` | $\nVDash$ `\nVDash` | $\varsupsetneqq$ | -| | | | `\varsupsetneqq` | -+--------------------+-------------------------+------------------------+----------------------+ - -Direct Input: ∉ ∌ ∤ ∦ ≁ ≆ ≠ ≨ ≩ ≮ ≯ ≰ ≱ ⊀ ⊁ ⊄ ⊅ ⊈ ⊉ ⊊ ⊋ ⊬ ⊭ -⊮ ⊯ ⋠ ⋡ ⋦ ⋧ ⋨ ⋩ ⋬ ⋭ ⪇ ⪈ ⪉ ⪊ ⪵ ⪶ ⪹ ⪺ ⫋ ⫌ - -### Arrows - -+=========================+===========================+=========================+ -| $\circlearrowleft$ | $\Leftrightarrow$ | $\restriction$ | -| `\circlearrowleft` | `\Leftrightarrow` | `\restriction` | -+-------------------------+---------------------------+-------------------------+ -| $\circlearrowright$ | $\leftrightarrows$ | $\rightarrow$ | -| `\circlearrowright` | `\leftrightarrows` | `\rightarrow` | -+-------------------------+---------------------------+-------------------------+ -| $\curvearrowleft$ | $\leftrightharpoons$ | $\Rightarrow$ | -| `\curvearrowleft` | `\leftrightharpoons` | `\Rightarrow` | -+-------------------------+---------------------------+-------------------------+ -| $\curvearrowright$ | $\leftrightsquigarrow$ | $\rightarrowtail$ | -| `\curvearrowright` | `\leftrightsquigarrow` | `\rightarrowtail` | -+-------------------------+---------------------------+-------------------------+ -| $\dashleftarrow$ | $\Lleftarrow$ | $\rightharpoondown$ | -| `\dashleftarrow` | `\Lleftarrow` | `\rightharpoondown` | -+-------------------------+---------------------------+-------------------------+ -| $\dashrightarrow$ | $\longleftarrow$ | $\rightharpoonup$ | -| `\dashrightarrow` | `\longleftarrow` | `\rightharpoonup` | -+-------------------------+---------------------------+-------------------------+ -| $\downarrow$ | $\Longleftarrow$ | $\rightleftarrows$ | -| `\downarrow` | `\Longleftarrow` | `\rightleftarrows` | -+-------------------------+---------------------------+-------------------------+ -| $\Downarrow$ | $\longleftrightarrow$ | $\rightleftharpoons$ | -| `\Downarrow` | `\longleftrightarrow` | `\rightleftharpoons` | -+-------------------------+---------------------------+-------------------------+ -| $\downdownarrows$ | $\Longleftrightarrow$ | $\rightrightarrows$ | -| `\downdownarrows` | `\Longleftrightarrow` | `\rightrightarrows` | -+-------------------------+---------------------------+-------------------------+ -| $\downharpoonleft$ | $\longmapsto$ | $\rightsquigarrow$ | -| `\downharpoonleft` | `\longmapsto` | `\rightsquigarrow` | -+-------------------------+---------------------------+-------------------------+ -| $\downharpoonright$ | $\longrightarrow$ | $\Rrightarrow$ | -| `\downharpoonright` | `\longrightarrow` | `\Rrightarrow` | -+-------------------------+---------------------------+-------------------------+ -| $\gets$ `\gets` | $\Longrightarrow$ | $\Rsh$ `\Rsh` | -| | `\Longrightarrow` | | -+-------------------------+---------------------------+-------------------------+ -| $\hookleftarrow$ | $\looparrowleft$ | $\searrow$ `\searrow` | -| `\hookleftarrow` | `\looparrowleft` | | -+-------------------------+---------------------------+-------------------------+ -| $\hookrightarrow$ | $\looparrowright$ | $\swarrow$ `\swarrow` | -| `\hookrightarrow` | `\looparrowright` | | -+-------------------------+---------------------------+-------------------------+ -| $\iff$ `\iff` | $\Lsh$ `\Lsh` | $\to$ `\to` | -+-------------------------+---------------------------+-------------------------+ -| $\impliedby$ | $\mapsfrom$ `\mapsfrom` | $\twoheadleftarrow$ | -| `\impliedby` | | `\twoheadleftarrow` | -+-------------------------+---------------------------+-------------------------+ -| $\implies$ `\implies` | $\mapsto$ `\mapsto` | $\twoheadrightarrow$ | -| | | `\twoheadrightarrow` | -+-------------------------+---------------------------+-------------------------+ -| $\leadsto$ `\leadsto` | $\nearrow$ `\nearrow` | $\uparrow$ `\uparrow` | -+-------------------------+---------------------------+-------------------------+ -| $\leftarrow$ | $\nleftarrow$ | $\Uparrow$ `\Uparrow` | -| `\leftarrow` | `\nleftarrow` | | -+-------------------------+---------------------------+-------------------------+ -| $\Leftarrow$ | $\nLeftarrow$ | $\updownarrow$ | -| `\Leftarrow` | `\nLeftarrow` | `\updownarrow` | -+-------------------------+---------------------------+-------------------------+ -| $\leftarrowtail$ | $\nleftrightarrow$ | $\Updownarrow$ | -| `\leftarrowtail` | `\nleftrightarrow` | `\Updownarrow` | -+-------------------------+---------------------------+-------------------------+ -| $\leftharpoondown$ | $\nLeftrightarrow$ | $\upharpoonleft$ | -| `\leftharpoondown` | `\nLeftrightarrow` | `\upharpoonleft` | -+-------------------------+---------------------------+-------------------------+ -| $\leftharpoonup$ | $\nrightarrow$ | $\upharpoonright$ | -| `\leftharpoonup` | `\nrightarrow` | `\upharpoonright` | -+-------------------------+---------------------------+-------------------------+ -| $\leftleftarrows$ | $\nRightarrow$ | $\upuparrows$ | -| `\leftleftarrows` | `\nRightarrow` | `\upuparrows` | -+-------------------------+---------------------------+-------------------------+ -| $\leftrightarrow$ | $\nwarrow$ `\nwarrow` | | -| `\leftrightarrow` | | | -+-------------------------+---------------------------+-------------------------+ - -Arrows in the _texvc_ extension - -+:=================+:=================+:=================+:===================+:=================+:=================+ -| $\Darr$ `\Darr` | $\Harr$ `\Harr` | $\Larr$ `\Larr` | $\Lrarr$ `\Lrarr` | $\Rarr$ `\Rarr` | $\Uarr$ `\Uarr` | -+------------------+------------------+------------------+--------------------+------------------+------------------+ -| $\dArr$ `\dArr` | $\hArr$ `\hArr` | $\lArr$ `\lArr` | $\lrArr$ `\lrArr` | $\rArr$ `\rArr` | $\uArr$ `\uArr` | -+------------------+------------------+------------------+--------------------+------------------+------------------+ -| $\darr$ `\darr` | $\harr$ `\harr` | $\larr$ `\larr` | $\lrarr$ `\lrarr` | $\rarr$ `\rarr` | $\uarr$ `\uarr` | -+------------------+------------------+------------------+--------------------+------------------+------------------+ - -Direct Input: ← ↑ → ↓ ↔ ↕ ↖︎ ↗︎ ↘︎ ↙︎ ↚ ↛ ↞ ↠ ↢ ↣ ↦ ↩︎ ↪︎ ↫ ↬ ↭ ↮ ↰ ↱↶ ↷ ↺ ↻ ↼ ↽ ↾ ↾ ↿ ⇀ ⇁ ⇂ ⇃ ⇄ ⇆ ⇇ ⇈ ⇉ ⇊ ⇋ ⇌⇍ ⇎ ⇏ ⇐ ⇑ ⇒ ⇓ ⇔ ⇕ ⇚ ⇛ ⇝ ⇠ ⇢ ⟵ ⟶ ⟷ ⟸ ⟹ ⟺ ⟼ ↽ - -### Extensible Arrows - -+:=======================================================+:=========================================================+ -| $\xleftarrow{abc}$ `\xleftarrow{abc}` | $\xrightarrow[under]{over}$ `\xrightarrow[under]{over}` | -+--------------------------------------------------------+----------------------------------------------------------+ -| $\xLeftarrow{abc}$ `\xLeftarrow{abc}` | $\xRightarrow{abc}$ `\xRightarrow{abc}` | -+--------------------------------------------------------+----------------------------------------------------------+ -| $\xleftrightarrow{abc}$ `\xleftrightarrow{abc}` | $\xLeftrightarrow{abc}$ `\xLeftrightarrow{abc}` | -+--------------------------------------------------------+----------------------------------------------------------+ -| $\xhookleftarrow{abc}$ `\xhookleftarrow{abc}` | $\xhookrightarrow{abc}$ `\xhookrightarrow{abc}` | -+--------------------------------------------------------+----------------------------------------------------------+ -| $\xtwoheadleftarrow{abc}$ `\xtwoheadleftarrow{abc}` | $\xtwoheadrightarrow{abc}$ `\xtwoheadrightarrow{abc}` | -+--------------------------------------------------------+----------------------------------------------------------+ -| $\xleftharpoonup{abc}$ `\xleftharpoonup{abc}` | $\xrightharpoonup{abc}$ `\xrightharpoonup{abc}` | -+--------------------------------------------------------+----------------------------------------------------------+ -| $\xleftharpoondown{abc}$ `\xleftharpoondown{abc}` | $\xrightharpoondown{abc}$ `\xrightharpoondown{abc}` | -+--------------------------------------------------------+----------------------------------------------------------+ -| $\xleftrightharpoons{abc}$ `\xleftrightharpoons{abc}` | $\xrightleftharpoons{abc}$ `\xrightleftharpoons{abc}` | -+--------------------------------------------------------+----------------------------------------------------------+ -| $\xtofrom{abc}$ `\xtofrom{abc}` | $\xmapsto{abc}$ `\xmapsto{abc}` | -+--------------------------------------------------------+----------------------------------------------------------+ -| $\xlongequal{abc}$ `\xlongequal{abc}` | | -+--------------------------------------------------------+----------------------------------------------------------+ - -All extensible arrows can take an optional argument in the same manner as `\xrightarrow[under]{over}`. - -## Style, Size, and Font - -#### Class Assignment - -Override the usual spacing and semantic meaning of a character or fragment. - -+===============================================+===============================================+ -| $a = b$   `a = b` \ | $a | b\;\,$   `a | b` \ | -| $a \mathord = b\;\,$   `a \mathord{=} b` \ | $a \mathpunct | b\;$   `a \mathpunct{|} b` \ | -| $a \mathopen = b\;\,$   `a \mathopen{=} b` \ | $a \mathop | b\;$   `a \mathop{|} b` \ | -| $a \mathclose = b\;\,$   `a \mathclose{=} b` | $a \mathbin | b\,$   `a \mathbin{|} b` \ | -| | $a \mathrel | b$   `a \mathrel{|} b` | -+-----------------------------------------------+-----------------------------------------------+ - -See also [\operatorname](#math-operators). - -#### Font - -+:===============================+:=================================+:=================================+ -| $\mathrm{Ab0}$ `\mathrm{Ab0}` | $\mathbf{Ab0θ}$ `\mathbf{Ab0θ}` | $\mathit{Ab0θ}$ `\mathit{Ab0θ}` | -+--------------------------------+----------------------------------+----------------------------------+ -| $\mathnormal{Ab0}$ | $\textbf{Ab0θ}$ `\textbf{Ab0θ}` | $\textit{Ab0θ}$ `\textit{Ab0θ}` | -| `\mathnormal{Ab0}` | | | -+--------------------------------+----------------------------------+----------------------------------+ -| $\textrm{Ab0θ}$ | ${\bf Ab0θ}$ `{\bf Ab0θ}` | ${\it Ab0θ}$ `{\it Ab0θ}` | -| `\textrm{Ab0θ}` | | | -+--------------------------------+----------------------------------+----------------------------------+ -| ${\rm Ab0}$ `{\rm Ab0}` | $\bold{Ab0θ}$ `\bold{Ab0θ}` | $\textup{Ab0θ}$ `\textup{Ab0θ}` | -+--------------------------------+----------------------------------+----------------------------------+ -| $\textnormal{Ab0θ}$ | $\boldsymbol{Ab0θ}$ | $\Bbb{Ab0}$ `\Bbb{Ab0}` | -| `\textnormal{Ab0θ}` | `\boldsymbol{Ab0θ}` | | -+--------------------------------+----------------------------------+----------------------------------+ -| $\text{Ab0θ}$ `\text{Ab0θ}` | $\bm{Ab0θ}$ `\bm{Ab0θ}` | $\mathbb{Ab0}$ `\mathbb{Ab0}` | -+--------------------------------+----------------------------------+----------------------------------+ -| $\mathsf{Ab0}$ `\mathsf{Ab0}` | $\textmd{Ab0θ}$ `\textmd{Ab0θ}` | $\frak{Ab}$ `\frak{Ab}` | -+--------------------------------+----------------------------------+----------------------------------+ -| $\textsf{Ab0}$ `\textsf{Ab0}` | $\mathtt{Ab0}$ `\mathtt{Ab0}` | $\mathfrak{Ab}$ `\mathfrak{Ab}` | -+--------------------------------+----------------------------------+----------------------------------+ -| ${\sf Ab0}$ `{\sf Ab0}` | $\texttt{Ab0}$ `\texttt{Ab0}` | $\mathcal{AB}$ `\mathcal{AB}` | -+--------------------------------+----------------------------------+----------------------------------+ -| $\textsc{hey}$ `\textsc{hey}` | ${\tt Ab0}$ `{\tt Ab0 }` | ${\cal AB}$ `{\cal AB}` | -+--------------------------------+----------------------------------+----------------------------------+ -| | | $\mathscr{AB}$ `\mathscr{AB}` | -| | | | -+--------------------------------+----------------------------------+----------------------------------+ - -The `\textXX` versions can stack font family, font weight, and font shape. So `\textsf{\textbf{H}}` will produce $\textsf{\textbf{H}}$. The other versions do not stack, e.g., `\mathsf{\mathbf{H}}` will produce $\mathsf{\mathbf{H}}$. - -In cases where math fonts do not have a bold glyph, `\pmb` can simulate one. For example, `\pmb{\vartheta}` renders as : $\pmb{\vartheta}$ - -#### Font Size - -+:=========================+:=======================================+ -| $\Huge AB$ `\Huge AB` | $\normalsize AB$ `\normalsize AB` | -+--------------------------+----------------------------------------+ -| $\huge AB$ `\huge AB` | $\small AB$ `\small AB` | -+--------------------------+----------------------------------------+ -| $\LARGE AB$ `\LARGE AB` | $\footnotesize AB$ `\footnotesize AB` | -+--------------------------+----------------------------------------+ -| $\Large AB$ `\Large AB` | $\scriptsize AB$ `\scriptsize AB` | -+--------------------------+----------------------------------------+ -| $\large AB$ `\large AB` | $\Tiny AB$ `\Tiny AB` | -+--------------------------+----------------------------------------+ -| | $\tiny AB$ `\tiny AB` | -+--------------------------+----------------------------------------+ - -#### Style - -+:=============================+:=================================================================+ -| $\displaystyle\sum_{i=1}^n$ | `\displaystyle\sum_{i=1}^n` | -+------------------------------+------------------------------------------------------------------+ -| $\textstyle\sum_{i=1}^n$ | `\textstyle\sum_{i=1}^n` | -+------------------------------+------------------------------------------------------------------+ -| $\scriptstyle x$ | `\scriptstyle x`     (The size of a first sub/superscript) | -+------------------------------+------------------------------------------------------------------+ -| $\scriptscriptstyle x$ | `\scriptscriptstyle x` (The size of subsequent sub/superscripts) | -+------------------------------+------------------------------------------------------------------+ -| $\lim\limits_y x$ | `\lim\limits_y x` | -+------------------------------+------------------------------------------------------------------+ -| $\lim\nolimits_y x$ | `\lim\nolimits_y x` | -+------------------------------+------------------------------------------------------------------+ -| $\verb!x^2!$ | `\verb!x^2!` | -+------------------------------+------------------------------------------------------------------+ -| $\text{ABcd }ABcd$ | `\text{ABcd $ABcd$}` | -+------------------------------+------------------------------------------------------------------+ - -`\text{…}` shifts its contents into text mode, but you can shift back into math mode by nesting `$…$`. - -## Symbols and Punctuation - -+====================================+====================================+====================================+ -| `% comment` | $\dots$ `\dots` | $\TeX$ `\TeX` | -+------------------------------------+------------------------------------+------------------------------------+ -| $\%$ `\%` | $\cdots$ `\cdots` | $\LaTeX$ `\LaTeX` | -+------------------------------------+------------------------------------+------------------------------------+ -| $\#$ `\#` | $\ddots$ `\ddots` | $\Temml$ `\Temml` | -+------------------------------------+------------------------------------+------------------------------------+ -| $\&$ `\&` | $\ldots$ `\ldots` | $\rule[6pt]{2ex}{1ex}$ | -| | | `\rule[6pt]{2ex}{1ex}` | -+------------------------------------+------------------------------------+------------------------------------+ -| $\_$ `\_` | $\vdots$ `\vdots` | $\surd$ `\surd` | -+------------------------------------+------------------------------------+------------------------------------+ -| $\text{\textunderscore}$ | $\iddots$ `\iddots` | $\infty$ `\infty` | -| `\text{\textunderscore}` | | | -+------------------------------------+------------------------------------+------------------------------------+ -| $\text{--}$ `\text{--}` | $\dotsb$ `\dotsb` | $\checkmark$ `\checkmark` | -+------------------------------------+------------------------------------+------------------------------------+ -| $\text{\textendash}$ | $\dotsc$ `\dotsc` | $\ballotx$ `\ballotx` | -| `\text{\textendash}` | | | -+------------------------------------+------------------------------------+------------------------------------+ -| $\text{---}$ `\text{---}` | $\dotsi$ `\dotsi` | $\dag$ `\dagger` or `\dag` | -+------------------------------------+------------------------------------+------------------------------------+ -| $\text{\textemdash}$ | $\dotsm$ `\dotsm` | $\text{\textdagger}$ | -| `\text{\textemdash}` | | `\text{\textdagger}` | -+------------------------------------+------------------------------------+------------------------------------+ -| $\text{\textasciitilde}$ | $\dotso$ `\dotso` | $\ddagger$ `\ddagger` or `\ddag` | -| `\text{\textasciitilde}` | | | -+------------------------------------+------------------------------------+------------------------------------+ -| $\text{\textasciicircum}$ | $\dotsi$ `\idotsin` | $\text{\textdaggerdbl}$ | -| `\text{\textasciicircum}` | | `\text{\textdaggerdbl}` | -+------------------------------------+------------------------------------+------------------------------------+ -| \$ ``` $ `` ``` \`\` | $\mathellipsis$ `\mathellipsis` | $\angle$ `\angle` | -+------------------------------------+------------------------------------+------------------------------------+ -| $\text{\textquoteleft}$ | $\text{\textellipsis}$ | $\measuredangle$ `\measuredangle` | -| `text{\textquoteleft}` | `\text{\textellipsis}` | | -+------------------------------------+------------------------------------+------------------------------------+ -| $\lq$ `\lq` | $\Box$ `\Box` | $\sphericalangle$ | -| | | `\sphericalangle` | -+------------------------------------+------------------------------------+------------------------------------+ -| $\text{\textquoteright}$ | $\square$ `\square` | $\top$ `\top` | -| `\text{\textquoteright}` | | | -+------------------------------------+------------------------------------+------------------------------------+ -| $\rq$ `\rq` | $\blacksquare$ `\blacksquare` | $\bot$ `\bot` | -+------------------------------------+------------------------------------+------------------------------------+ -| $\text{\textquotedblleft}$ | $\triangledown$ `\triangledown` | $\Bot$ `\Bot` | -| `\text{\textquotedblleft}` | | | -+------------------------------------+------------------------------------+------------------------------------+ -| $"$ `"` | $\triangleleft$ `\triangleleft` | $\text{\textdollar}$ `\$` or | -| | | `\text{\textdollar}` | -+------------------------------------+------------------------------------+------------------------------------+ -| $\text{\textquotedblright}$ | $\triangleright$ `\triangleright` | $\cent$ `\cent` | -| `\text{\textquotedblright}` | | | -+------------------------------------+------------------------------------+------------------------------------+ -| $\colon$ `\colon` | $\bigtriangledown$ | $\pounds$ `\pounds` | -| | `\bigtriangledown` | | -+------------------------------------+------------------------------------+------------------------------------+ -| $\backprime$ `\backprime` | $\bigtriangleup$ `\bigtriangleup` | $\mathsterling$ `\mathsterling` | -+------------------------------------+------------------------------------+------------------------------------+ -| $\prime$ `\prime` | $\blacktriangle$ `\blacktriangle` | $\text{\textsterling}$ | -| | | `\text{\textsterling}` | -+------------------------------------+------------------------------------+------------------------------------+ -| $\text{\textless}$ | $\blacktriangledown$ | $\yen$ `\yen` | -| `\text{\textless}` | `\blacktriangledown` | | -+------------------------------------+------------------------------------+------------------------------------+ -| $\text{\textgreater}$ | $\blacktriangleleft$ | $\euro$ `\euro` | -| `\text{\textgreater}` | `\blacktriangleleft` | | -+------------------------------------+------------------------------------+------------------------------------+ -| $\text{\textbar}$ | $\blacktriangleright$ | $\text{\texteuro}$ | -| `\text{\textbar}` | `\blacktriangleright` | `\text{\texteuro}` | -+------------------------------------+------------------------------------+------------------------------------+ -| $\text{\textbardbl}$ | $\Diamond$ `\Diamond` | $\degree$ `\degree` | -| `\text{\textbardbl}` | | | -+------------------------------------+------------------------------------+------------------------------------+ -| $\text{\textbraceleft}$ | $\lozenge$ `\lozenge` | $\text{\textdegree}$ | -| `\text{\textbraceleft}` | | `\text{\textdegree}` | -+------------------------------------+------------------------------------+------------------------------------+ -| $\text{\textbraceright}$ | $\blacklozenge$ `\blacklozenge` | $\mho$ `\mho` | -| `\text{\textbraceright}` | | | -+------------------------------------+------------------------------------+------------------------------------+ -| $\text{\textbackslash}$ | $\bigstar$ `\bigstar` | $\diagdown$ `\diagdown` | -| `\text{\textbackslash}` | | | -+------------------------------------+------------------------------------+------------------------------------+ -| $\text{\textvisiblespace}$ | $\maltese$ `\maltese` | $\diagup$ `\diagup` | -| `\text{\textvisiblespace}` | | | -+------------------------------------+------------------------------------+------------------------------------+ -| $\text{\P}$ `\text{\P}` or `\P` | $\clubsuit$ `\clubsuit` | $\varclubsuit$ `\varclubsuit` | -+------------------------------------+------------------------------------+------------------------------------+ -| $\text{\S}$ `\text{\S}` or `\S` | $\diamondsuit$ `\diamondsuit` | $\vardiamondsuit$ | -| | | `\vardiamondsuit` | -+------------------------------------+------------------------------------+------------------------------------+ -| $\copyright$ `\copyright` | $\heartsuit$ `\heartsuit` | $\varheartsuit$ `\varheartsuit` | -+------------------------------------+------------------------------------+------------------------------------+ -| $\circledR$ `\circledR` | $\spadesuit$ `\spadesuit` | $\varspadesuit$ `\varspadesuit` | -+------------------------------------+------------------------------------+------------------------------------+ -| $\circledS$ `\circledS` | $\female$ `\female` | $\male$ `\male` | -+------------------------------------+------------------------------------+------------------------------------+ -| $\text{\textregistered}$ | $\astrosun$ `\astrosun` | $\sun$ `\sun` | -| `\text{\textregistered}` | | | -+------------------------------------+------------------------------------+------------------------------------+ -| $\text{\textbullet}$ | $\leftmoon$ `\leftmoon` | $\rightmoon$ `\rightmoon` | -| `\text{\textbullet}` | | | -+------------------------------------+------------------------------------+------------------------------------+ -| $\smiley$ `\smiley` | $\Earth$ `\Earth` | $\flat$ `\flat` | -+------------------------------------+------------------------------------+------------------------------------+ -| $\standardstate$ `\standardstate` | $\natural$ `\natural` | $\sharp$ `\sharp` | -+------------------------------------+------------------------------------+------------------------------------+ -| $\permil$ `\permil` | $\QED$ `\QED` | $\lightning$ `\lightning` | -+------------------------------------+------------------------------------+------------------------------------+ -| $\diameter$ `\diameter` | | | -+------------------------------------+------------------------------------+------------------------------------+ - -Symbols in the _texvc_ extension - -+:=========================+:===============================+:=====================+ -| $\clubs$ `\clubs` | $\hearts$ `\hearts` | $\sdot$ `\sdot` | -+--------------------------+--------------------------------+----------------------+ -| $\diamonds$ `\diamonds` | $\spades$ `\spades` | $\infin$ `\infin` | -+--------------------------+--------------------------------+----------------------+ -| $\bull$ `\bull` | $\text{\sect}$ `\text{\sect}` | $\Dagger$ `\Dagger` | -+--------------------------+--------------------------------+----------------------+ - -Direct Input: § ¶ £ ¥ € ∇ ∞ · ∠ ∡ ∢ ⌀ ♠ ♡ ♢ ♣ ♭ ♮ ♯ © ® ☺ ✓ ↯ ∎ … ⋮ ⋯ ⋱ ! ‼ ☉ - -## Units - -| Unit | Value | Unit | Value | -|:-----|:-------------|:-----|:--------------| -| em | CSS em | bp | 1/72​ inch | -| ex | CSS ex | pc | 12 pt | -| mu | 1/18 em | dd | 1238/1157​ pt | -| pt | 1/72.27 inch | cc | 14856/1157 pt | -| mm | 1 mm | nd | 685/642 pt | -| cm | 1 cm | nc | 1370/107​ pt | -| in | 1 inch | sp | 1/65536 pt | - -The effect of script level and font size: - -| Unit | textstyle
normal size | scriptscript | huge | -|:------:|:-----------------:|:-----------------------------------:|:--------------------------:| -|em or ex|$\rule{1em}{1em}$ |$\scriptscriptstyle\rule{1em}{1em}$ |$\huge\rule{1em}{1em}$ | -| mu |$\rule{18mu}{18mu}$ |$\scriptscriptstyle\rule{18mu}{18mu}$ |$\huge\rule{18mu}{18mu}$ | -| others |$\rule{16pt}{16pt}$ |$\scriptscriptstyle\rule{16pt}{16pt}$ |$\huge\rule{16pt}{16pt}$ | - -`em` and `ex` are affected by font size changes such as `\Large`, but they are not affected -by script level, so they will not change size in a fraction numerator or an -exponent. - -`mu` is affected by both script level and font size. - -The other units are absolute and are not affected by either script level or font size. - -
- -

Copyright © 2021-2024 Ron Kok. -Released under the MIT License

- -
- -
- - - -
- - - - -- [Accents](#accents) -- [Delimiters](#delimiters) -- [Environments](#environments) -- [Letters](#letters) -- [Layout](#layout) -- [Operators](#operators) -- [Relations](#relations) -- [Style](#style-size-and-font) -- [Symbols](#symbols) - -
- - - \ No newline at end of file diff --git a/package.json b/package.json deleted file mode 100644 index d3b704ab..00000000 --- a/package.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "name": "temml", - "version": "0.10.24", - "description": "TeX to MathML conversion in JavaScript.", - "main": "dist/temml.js", - "engines": { - "node": ">=18.13.0" - }, - "exports": { - ".": { - "require": "./dist/temml.cjs", - "import": "./dist/temml.mjs", - "types": "./dist/temml.d.ts" - }, - "./*": "./*" - }, - "homepage": "https://temml.org", - "repository": { - "type": "git", - "url": "git://github.com/ronkok/Temml" - }, - "packageManager": "yarn@3.3.1", - "files": [ - "temml.js", - "src/", - "contrib/", - "dist/" - ], - "license": "MIT", - "devDependencies": { - "eslint": "^8.39.0", - "esm": "^3.2.25", - "rollup": "^2.66.1", - "terser": "^5.14.2" - }, - "scripts": { - "lint": "eslint temml.js src", - "unit-test": "node ./test/unit-test.cjs", - "visual-test": "node utils/buildTests.js", - "test": "yarn lint && node utils/buildTests.js && yarn unit-test", - "minify": "terser test/temml.js -o site/assets/temml.min.js -c -m && terser contrib/mhchem/mhchem.js -o site/assets/mhchem.min.js -c -m", - "build": "rollup --config ./utils/rollupConfig.js && yarn minify && node utils/insertPlugins.js", - "docs": "node utils/buildDocs.js", - "dist": "yarn build && node ./utils/copyfiles.js && terser contrib/auto-render/test/auto-render.js -o contrib/auto-render/dist/auto-render.min.js -c -m" - } -} diff --git a/site/assets/Asana-Math.woff2 b/site/assets/Asana-Math.woff2 deleted file mode 100644 index 9ca8cda86a6f8e28e433cdfb7a604d19765fc265..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 247716 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 F000V$6HEXA diff --git a/site/assets/FiraMath-Regular.woff2 b/site/assets/FiraMath-Regular.woff2 deleted file mode 100644 index c13030cdaf7287397b9bebbc1edfab4f4f9ff418..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 97164 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�iobQb1FP{i#km}lOw(Y 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 G0000dG7*jd diff --git a/site/assets/GUST-FONT-LICENSE.txt b/site/assets/GUST-FONT-LICENSE.txt deleted file mode 100644 index 60b55002..00000000 --- a/site/assets/GUST-FONT-LICENSE.txt +++ /dev/null @@ -1,30 +0,0 @@ -% This is a preliminary version (2006-09-30), barring acceptance from -% the LaTeX Project Team and other feedback, of the GUST Font License. -% (GUST is the Polish TeX Users Group, http://www.gust.org.pl) -% -% For the most recent version of this license see -% http://www.gust.org.pl/fonts/licenses/GUST-FONT-LICENSE.txt -% or -% http://tug.org/fonts/licenses/GUST-FONT-LICENSE.txt -% -% This work may be distributed and/or modified under the conditions -% of the LaTeX Project Public License, either version 1.3c of this -% license or (at your option) any later version. -% -% Please also observe the following clause: -% 1) it is requested, but not legally required, that derived works be -% distributed only after changing the names of the fonts comprising this -% work and given in an accompanying "manifest", and that the -% files comprising the Work, as listed in the manifest, also be given -% new names. Any exceptions to this request are also given in the -% manifest. -% -% We recommend the manifest be given in a separate file named -% MANIFEST-.txt, where is some unique identification -% of the font family. If a separate "readme" file accompanies the Work, -% we recommend a name of the form README-.txt. -% -% The latest version of the LaTeX Project Public License is in -% http://www.latex-project.org/lppl.txt and version 1.3c or later -% is part of all distributions of LaTeX version 2006/05/20 or later. - diff --git a/site/assets/LibertinusMath-Regular.woff2 b/site/assets/LibertinusMath-Regular.woff2 deleted file mode 100644 index 823b891b09d2a9f21ca06bc4465a71a1f850ea5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 329152 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%0Af;qF@V$-U#Kq@Y+K}z>a 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 b9ZSYH|gJxt;P?V zWHF@845xEwc+vDQUH3oWsQ1;@i^3kvIk|aRnR#i0HjODL$S5x6VebwuNLVuvH7`ok z(V~5co$>UJbg_|j$-3o4c*C(5>)()osKE2qP1RIi(_l^ZJi)|n5!$=kg?Mly@#)a< z&u+L_Fyw&87j&*S1-irTwJXBdwr#Vst)qaT&n@pQ^33t_HKGfj>FDN9r|H|qW7n_=fdi9O!buZ?V zscDY1HG{I|96lysYX922^Z5~A0T~3;F#rIh+>ZKy?;>?X|G35|s)%2|vI?wzY|^$@ zb_^OT#a^_CSQMvZ)?P-Zs}ioGn(0#|+3Xm)Hs2 zFH{)F$=qCD?D#Tfbm|V|b`=+=iYNas(5A*ZY#*ik^Ue#E2Bl7It{`@!J-Mw&TK;fl zqu^?XEw2h4eryU_-s+kY#gAM_XX9DXeAWZAVDAQ|Kms;rt}K4$Q-H&c9p%jj9Ia<; z168(c-u#tBLCRpP5~GTfJ6Ch02yB5SM;3(iIu%+Ecc>b_nnF#<3ycOLE+f1^gLqEH z!UI>CX*wNsfCj|K?*DCM5{sMMpa9C& zJRCcCg|g9nY^y6|xrk*!L1umyj|>@w;{quvhof=&xjO&5BEIL2Xi3Nqy;l?5WrUOw z*s5$dTeLMrm*gSe-Zm0w=hmD*5bDQK?l(47HS3A&4u;IKlt2^z{^+XFK;F_I-7h-R zu=SSh*Yw#||MkqZhb?FLNdoZuP1tnt)heh!^!H+Y{va5mRoovc3yUr`WM1r>ays;! zO7$7hR6EVd#W>pXP4S>!0D))gIul=)@9bk+8l>W)sfKKPn%D_?rXrEAlXGI#0mL># z?~&RIw{{YB2c26OIz?2pLZ0yhu8xm^k) zMPz_+C$L1Tx@bq-o6Le4n4)rqss&Utpw}WB!BFDQxSIDu!B%@MVgE|{ftq!TpleVkYGQqa8&>jk51L44{P5 z!Ec>KSd;7W>GI_V*TxU3K&+`cs+Z*!6;vHnPxXfCGLFqrBJU}wxM-}aSGpUZUBzoF zfaLE4ToYHGTyGyus-TMnhP~J;Fa~c%a*IyYe@^_**F9lokPOI_5r5o*h&r!Z?p}yM zBum&Zl3z4gpGUTadlF5lr?xc5OPe300O1^W#OR88V4P1_%0{*7BoIf6 z0R;9Jyx@JNn}p>alMrE1GG2+;nrFbPQ*?fVH&AhSg**|t{9f*iWMCFTo!i^pfU(pB z%(UDTEy|7>hKpplB!Vqj>PU;2ncd7x%}NQ|K0jUq@H&FHPwLt6kIhWaT0 zH}fDJlRn7_S1mzBS6vi6m;SeFDTXwR9DOk2b;02jULFf6W%;JhE6os777yu0@Js1jDnIGtpx#)FeV9_mCHf;0W@X#y9G1)Yn zZ*d^Nr=!RfnE<2iyZp+pi8$>D&wndR1N0RjQw(2mpkNuzLz!|U)?2th*w^hP2VGGK zP_A9Yy7O}*nC^Ah6axv~2owJl%=W{+$d4Am^D=kS=Ka4JTuqP?Z#v-Btq22&w;%AD zy`>)#Z%yD;JIsfPw=B?bY4Gi=)d$Lu8TdCZ%-ad7*1^zi2(SGbI4`^s#o2z-1dzCu zDCYL=oP9(UO4EP2Ev7);S|r5SD$#CEl<^O6%VbXYP)YQ0WOnJHmbt%vRs^JlccN*$h{o1va zpiTx&0+AzsUib`d6mdO@l6{IQ42lJ3uI#?+7{ToX(KYcj%(r;#48EDeJATThca|IjM`Ecl@??kaLlYRxJ6!!ajfGo^v{h@{DW}BA=W|vT#hOE>6rsE;Y30m z$mAT5sM4#MMl${!C$+qr_U4^msYWqH(t3KdXkVTL2A4*wLr_ud4;35K6j4!x)_;yq z&qQrqzRtA!kz(ZNX+5nxTJGMBSf5n&ByV7r^%*0rD>gT1OHcHa97nA4v%KWK{e$az zYOW2-g$^|uBY^S>qARGbggy68iS=$ke_Fh1{+8$KDw4?rvx;db`EdEbhxc~l#)rCB za+SNDqF}vQ@t-)1g33eF;qW8N=6U~t6RG&Fns}_LR9h`CW)RmPJ95}C1l)(Hv|U+H^efc z*dIL;bWXZfB`}u>yrfv<0L)J)>srz-DpM)|Q)I7Xw-j9hU^%lK%C7Y)c}oPm5~jZ) z&=YlO>sa$fsD`CpKSY>EslSBk0zi4A%oG-9r#<7LzTT5P<1OG}8O+DnkFYIoJmD-D zHDc-~xkmWpLk2I5!)nogBU%=#T|Hli;W9G6mSs~fkfFxw>xlBucnbmBNEdM`Ykk=f z8m}8cAOf&na~Rg*GrwiOaTk`MuB?AYOc}beWr2QDVvgacD??v~e$tArQ2_n4I>B|K zR~rkI>}R(bM_A0xDK|yG(`P%-yVeC#n$@!R5(&aEyu>pe;$Hn0;wuP*_J9BGb{Q9^ zjGvn!j?r(NUh!M$?w0L;fQ>Ymsl<#MW-51+%2CA`7Qd73V)w5#31N2Z9;;u|9gDHO zI^jc=TD<#z_3PTC&Yf7KT_<|AjQsoAN{{@f_-|zS%7$T78f^swgQyQU(tHqe5E&5j zvB&)O{vhV?n8%4bLUI&l8o=r!p)RE$6C1LCy&{6901k4Tf>-=B@GK=7@T`t(e5r4Q z9=&Cg7q>F0mrO+?v{#L8-MFnh+mB>%1h0CK(M1Od-#;y9vPp@PQ)8|M0@mIwcpmT=}7S^sL&S1PuK3DJxky!L!hzhZTpKlQj@ZAscN zI9HU&3IOMq;Xj#MB7J-{=#N^JnSadsv>+|9&)zk-HN3QQv% zBU&juqY=~vV|rc2k%30g7;eYC;nt$RQpSer$;MDoL46Qz!w#Lj9F+TUfpnV_@j)WJ z3^WRp7@T_)8e!w6;2{w`rP%tBU|$If4Mzj58AW7PNJwTBBUpkZoM1eve7P!vffUP< zur9V=OE6y>b$SJYIsx)WifCdgYJ1fLxE1gQz?8nN?x`RO^`Tx)EKk~<$b}hO0vvX zG2vELMKoiLvTlWUZIjzaoTgV;kk~o4ymqV+$cdE|`w={6tF~dW&svS4TQk(~EFDWx zph24unmdwia*`&2VzKD)#a~x3|5u$arQKyv3A8sKFTBzR;Mo#`T2n;gMDDn7l5)Zd z8^E?qV{~2xKFy?%Wm^5GTee}fB;`2|XH?{6ENQq=Ss*Tk-1nzp_#_I&NqSwdVYfD(Y%~u%Ezj4_i{LOlRZj|&;J`*%bScGs@ z45_FR*>K&Us`iSn;|Ap*cizC^9WO+Hk3k+d)M~=Db&^B*Gf?PKON&B4*{E}!SNK4S z-9JLIum`VqfK#`!UC2J63rB4S^ze}$i1pDF!52>ueLsYucVy+h*BY4+ySti7RR4!w zF>qYv5f#x!Zi>JX?@gU4V_c^5<-K;vgrEh+<`8kMG+VC8W|!)`*AJND=}U-%NFMJ2 zA8=$+(XPpQl!9E$f$SFU$Vp0}E!N)5_wEaa3TPq{Ada#`20ff z^YaOWiLZ%QpIZp9(Y23I6j{{f+O8_;w24zz>5%7=4zQ`Nv;h1E>AIre=rTnJ4X22n z^$te#DzhFo)b<40+~1TKV4bi=<_I_Geu;FHA|9cH-kp-!%sbE0EZ?jT+;(5@On=2m ze1@0h3C*C{`WgAh!|Wzj57_l_EHV!Yr~*6nZR#)*+O)Gbx#26X~Z z#sPl8$1k^}G@AiM>D_7ckE1Xb_hk_L3KOKikLUteeWXoXvv43sW*Tu2)bi>K>AZ~NtXhE5hp9mMhU=EkpZ@vXfYQ$*lD!q6++|;pzF*RXC zX7D_a`Eyj*_uOt*(0C9m$CPKkkFs#G4G*I<~md{1SZ=xJcL#;Wr3Uu!4$F-#ML z&IWaP7bl3sr-usaM?40n^78R!B)?F=3YaNf!-z4SiIDkQexi6RUzm)-2;#18;7>Sf zINk}ZRI%d8-)uyKq2MiuB?On2ec+dGC;4C1N{dL}r6Y=C$QaY2nEchMZ6|wsb4}n6 z5DQ7F;Ms|AL#BK*3~4N;Y4em3$6B)_(h)QfcO(d*$^ z?Y^A?yU?2_W2G4gDp%3@3WpF8ynyYWkUD0KW9s4dUdY5bjoJj=I~7IdBn93+KD>ORUcC;9F79CeB+ zU0QkWEOipTe~uI1Ki21J{4USF2jw2`WkcqyumMW zmZgc{ftiTbh0AJDB9gwD9U z`Cc!83O{?ikG%xuUHUM)UD+r=()|&a@=fC|eTnQR6PgqS%!??JY}#RS<}u&){Awd< zC;V+AcMsl22XoyAQq}GFl`sp2W;IwqFxOm)S_Km}*vcn^K;EBB8;!6TX|`%1I2x;T zy9%hbzN+1p^qvAa5y}^a&V(RHBK2uN!{DdFoKlAPO9P}C!F}UEjv!*r3RVICGLAFW zX7X>Sd^Ww@^KEdT+;GZP4C+d|=)zY|OK)r!m!7a5GqRdBvmfjYR_a%MEi0@lu`4J4 z`2G^%g;Y8d_p5wx7+UAKU*#|o=W;U`x(buZ9}AAljE5&ss6Q#*=0Y&sJC!yqy*3Yg zJOr#;fUea%xW1%6d%mr2=N5Z9<_o};NqL7K*xut*Ded$51uv?RU(3seaww}h8O_8< zUH29D?7(4{EB04ld|j(^SgxQ?e(gYt2R9BO<`nPoPHRuC&4q?^?LWZXw;#SpIFySW z`LAu4As`CC+He?rFnV_Zc^kv0aho|?3Zv-o@-bE5FfE;SS3J?4!^^Z{m*_*6m1Q0+ z*Jvm|H&rso($>~LT-<|?|Jw#H`J`dlwFdezIkbg+qvH+QsWDVaMuQ_D=;~&*ay1VW zQ*>e^NM&WqE?snDiiiG;;QbSUigiaV)jl>w9>%nu=a!!Zo3vk!p2~k-c%Cb*2Xlz3 zVXGX(6Jo>f&iiNc2k^yGQxy>bzx9{pWu zdbdYsD+F+`Af}Rlv+=YD?K>dyHdb|#aUX`KNE?ZZ9)^o;$B?@nN0RH{8LxvEh5Ren zzI@njX=hdq38>CO5}F|0IP|#DW~lF}glJ`}T#gcbK!j%UKeRo%QU8eMGic;qCs)BV`Xs-0k-%V0S6!L4^YzVu zUsD-F_rMv-=)G~Q9^S>~YTg=puq-PIJb(J@OAKov^W;SGe%H6Ydijm^2zAyu-N5(E zxTwvYH2(G<>wi3X_{5=zZUY3=YPZVuu~N-eyrYV zfV_{<4J++lqJ7B-h#!hhp2t`R-`tLxt{J7hJrb{s(}1?uy0Y@w<2pLEabYS~52{ud zH?iH5>2`rywW)>3KSi9-9=$mGAD`_wciz2hFVfiLSr?|T`)GT+ht0C&2ryk8mHqe- zGi7iNdFOTEU>Ml{7XvNc{vRy|{!$Ez#g+Dt{*4fUZ@)$Q?f#K$wqPm<|2hR<-% zjkYK>V4J*)+d=|VV{nk>!_BD6oEn2XsN~j7>PEMl8LdacN2i6gB+Wa3YF+CHNTRfT za_c*7Q6{e}D2#EPN9aYa@imIrbFdFMQm2LTKNuLbukyIoZ~SfPAxFyCc294wjOKnF z63u74{zi{07CQvOYd83!G*lX6C`f)Ba}zIe#N30!@rhY;^%nqq(5&MXDjLd=|4Q%Y z7rXk~aY_gOY?$`vEu?jgN50iq?UAyL^4ce*8gymb_4aB!a4a-J@yHF(hAV!ZlMBTB zoH->Mvgs$S0~a)PI=AAd4|`U80b`b1-0S`jb}^K#2kIByy<7jWs~Rq#wH&V4dOU$n>ey4S@q2RB6wA#U?x;8IpMY^2}0D! zWw^raF1T%U3QgB-`dU+sU+3VA2EE};HlGvXRIEr_xm~s{r~E8Ni{ZiFZJctGoAVE< z9;hM`S)~E2`j4D#_DBB^6|0ji6(y0Kq0LQ9ZXjlIVi6_lMx0H?Dzqn1?@cvX$mR!c$7AilXv~;Uu2~wmvmH*NOU}pKbTMMZ+$H zE>OO-(FUhFOn2*8WOC8X`eG1NwTt8H7-pBfJiKuph`=vD^+5+;NUx|P)hnrYO(%=k zX{onre)tf)d*d=61pgDa2Lat>R1tRp>h0ns?Ck9{_kb})KsAvHaqE!HX@1V>cYn6E z2+;+VsRo3!J;6!kk={;AK(0gLtB6ZYq0)tqk9R~Ac!ch@KlFu{w?}bzh*)LfA0*U{ zZ`cqo*NN(CLwCwx#S`2m*-)LrpYy~UPZa3B~c-#W4bK3G!k$Wp|-=UrC>Ppj`2q? z^Cz>9D}8F0e*Q#70V5?-RR?MNs0$ta%Ci`j$U}`9uD;lCGB|$q5QA^Jt@wn_IMZ9g z1of}4T*-0yXacv?{!9UyC850e&V5k#54W8>2WhwXJv)(mZyty=LuJ^u?eV#02v}C1 zUc>OdJw8vW={E9doQg1D`|!~G81lxulxR8tHK_qPmEUsO?H_rYxzIx&Z+KREj*U$vW*7l1Jb4y<=TM5=SJ z=e}^`AbuPop^gJV0Uv^p{N>(*TO$>m7BCJ-ljq(z&bv*4*#uOm6X_vb1H)F=5t$v> z_w0qgV$p8DK0p1CQQ|mnFx|qhO*i}NV-@IbAqT&z|FafOZrwY5Qgc1K?gb;1)|$tk z|7%FhFT-tSfkH5ZG7zZ(l~5$f@aT$P$>YkoAN&oeMYmd7%n`O92ygm#D|U%jIr7_9 zZsN1YEgx`AP52q-u^5uuOX#X_FLtA}t$zQ(7 ztLtA_uLt0b|FhLQ#Ci;^BAFf?6Z0qaFXp0U{3Z?Nm6byK0r+`1_#V6cE&j=LdaTvG z%xP{pV;$X%2cKj6r1yO(Fhkp55=Ge@!c{|S{?vnDe1A5eqT?!RJN2JYm;@9w@Pb4E zP?IQeGH!^_HQsKGJ4(E?S>d6BR*b&qrZMt*_Ost@9Uuz&mgN~F&y#RGbN~Lx)Swi_ zZ%4(lAQjUn|3crW8o}@Wmlb+xgoy)z4_ZOv1r@G!9_>)O6om( z=hdIqNpR=rcX$Md2dg7R&dgA6Xz_&u z>1jntqONt{{=1)p^3!%-Bt<|gkt($q^#%10Bvqu6s1UBf+I#V(C}Ma7(UH%fVyhgt zz%HUK(li08%O-j38XMnPh#uUZSN129!rqz9Z*C**q8vt@UDNJmhjE=@rnfxV?8A9l zm1xKkC{im#Kzu)S?DzPQ#r(!U+YKSp91mOGPk!mWo$@{bQ5!1>5^#Vl$V%Ktz|uA?UhQ z&T@Rb5_*DNLwbBC$?RpSG}5h)GGxXwcKyfSO#=B6*bDa103&<}J6iOKWF@gMkMOx+ z^&cwqM=Z<@p%<%oB1ToM;C+6OC?WVXZW69Ny6%tKt0QhbHds%YD;yo>#j&z4Tbo#Z z>wC-ABe-?>_)Uo)^cR?qk+QlM96?0j@fozukflphnF8rtlD2Y%0 zB6IG=_X-rm(w8gvSfMU%+#GETqFMhb5u_>HSqBq>Qc?M@j-4E_!~Clc z_s)r-1%Bg14n-xrwZ;N?xrie8R_#>v+8&v=LS+lXY}+&33RvC16sTKOLhNVRF7Nkl zy}mkk=fq3<(>Z1NScpGel0^h|$3HWO?&&!meS9@(u01I7iW57e!+!^K!>Gln*{ zT7%UZ#x>#uh5h!8WHYunha|cI4?`8U(uqVRxv+q!S9i9RwUrYmfe^&~P-kQ+UdaWW z9Oh{4<`48Kei3)rd~t=3i4jb(gF=Db0gxTx$smTF1v;{);UhILiK=LiegkOW5`VDE z(=LAtyJ0!Z{kom%v5~qmx~5!^3qp;yS4Z}PUS9h(P4q$K*Dm<5_w@&PdZ}N{M!On~ zcHq`EnNjr9*7Rkyyj&@({&1+NW&ax8egXcdB=<9)Bq|Xhnk41xMg}#CcDg;YYBbb_$f>34xqfECU9HfVY9*t9LqeX3a zy`EUIN4C#I*@ICr8@#bAS5|W{?#^I!)+^Zi^;U*WW||CT!W0d)qP4jJ3`KWhUXibh z;GD=)p{GA-dRlF>U)SO6F0ft@3>)!y>EqpV9=15ONibCx*ZDu=mt1q`s<-qn1uX}!+&^NLzuK_`R;x%h&7%u z2Hm>v;v|^fLM>BgF@i4vX-`Y0l+~JODyFMJa_HR-w_U9G^Ag)1V0}KYlqEu{A)f%9 zcmA^O2rAdc*jrq~3l!vc8n5+$v`BhxQ1k-u?^ygI8kM#zD(HND=RgtUckb5NjhG-q zon3Xsxwhor-dcDENYkA=2hC?-L{l|)5493)sGm3RKEVX_p$rIy$EeKwEooy|n?yw7 zmGF&;bGo&wsI9k}O`?e9q^$whOClp)oZAO>lsgJ?D5%&-pTL`AA6tO{iD8@@vDsjv z?FvLe!&Gj0pa)h@slri?hU?oT78a4;4|j!7Pjy<6i8f5y7TZOFht}F3jxt?VIn3iyx75t(e3{DVWRYywUU!(Xs!w*?x4ex#eVC zuER;T2Y&qVO?)6QgiFRdY{Ks6z-!)^8DuHr&id!QW=~1X$?Lb1j&@LfX42 zDKEhukrC9Rt%?uLv-{d1(=WL20#72@r$+X}aDyV?LLytKNQ=lL_OciTj=OpL1{_Y3 zpkaN$t7o@QtG}!w@0MTZ&d#KS(%xU$-~0QInuS^1AF|Kc7J8c_Hp8tG_0-;UZ`7t@ z`1SZH_l=N+@PAt2!}#&m=@DC(qR%LU@G{_A(Oe@;iYv++5MSuG^ns8I`47D5GL47v z&@5heO`s6PVr1U;p5o_0WhsBk&S)ReP@{QWnnI2mPIRm!k!$s0r4L+g4;#S@^qyIw zYXKd4bz$MxM{fSf+hy2amBHGRCjnx=Z}H%sXzFR~o5lG3+!ueIEJXo-wi1asC;Z4U zKm_H=t6Z3v>^Q@M-?t3EX#Za(t%A^x^7qzf(TK+U&*q1%7ahzuV^=-l@5`og(9n0R za~tpWWgjP`h$e-gSWQ@i6=oOQyp8d0%TAa58hs_>xqBl1*mCCGkGq;p9ijLfNHnl< z%Q4{xgo!ChWf$*X{OPA_t{b(Qml$r0)99m@)lgGOKBzZG*>#I5mbB(d+LXx@pFURz zpQIh1=R>p*vTzPs;M)YEdmfID;h&M2HJ`)BDpTwCs^C^mJW4z@JuC9nM%OTg7(;H$ z@I<^f;Q#TLL{>le`}$Q`JN#4?%ah0PchUEGNg32e$ZaQLP~F-dS*rTGi&t&VWGRbT zbEqGa3hk2?h~}|ZKN*;w`7=-EecRhrzHd*0nIR`0FN==vZ^>cF)TA8Bvj|K45L_?C zTGxygeL#jzb5XUlB8DlV6@O}7OjPEqCojp28%lROJL~pbZ@KPZ)99wMNc-CBn9O{B z4{@f(*E5cq>sB5*-sab$BsB0r3Obn()=bo$JPt?s&yEVOB?Sr>EVQ)K>9q;uESA;h&Y~i@@wH<2|X+x!#eJ(8#xZlLw@@qxB z&LlQe6=#z#4L)y~EA2h`89#?%hzN9>t8Na8f@C+1AleWXnasX`GYVzyZ~_Yx9q74l zRxWLaWu0>YWp_=O{LncN%vX;^n!jc#(KIq%aEUfoPq%q~dk6uZ(~Z8!a3wc7+O$p@ zMu3^E8$F_%#~}y*O@&OXlzbrva+=MPCTP@Un8-tI;U~=wRU>=8#^G?N9K%j-=ui56 zZm$*d+IB7#YVn-o=^Aphx{ib+;7LnC|4jA`(SUgn>W?tueN@eNN)p%PmrJHR&b`4T z?Fkm)pLt_<3pILsN5@eyN>_1Ena*0YLb3i@hQ)5Xc|iw_T8Yh`HH|uOu_t%tqBs#J ztJd+sBIorHbk)KC{rT|Mp8~0VnH9*Yaxt+KMNmW8u%FHz1FMQP&s2=n=5?#b^ayDC zOA4zdunbPhV+IM{x(}s6V1h(T_yX~r!Ub8v+(kS2xz|qs(qu2Gs~gl4%V!taXQBh| z!1TlH66Rw+Pt{bk&f#|VFM~g-huj)^b0kluBqO&s6QQ5(&zqe}6rgPqq;p?vx_1xl z7U{K_r|B2eH88&)vwHaHOY$;C2)rFi*HtWRbgt2wzY3$X>?+Tx+mm;~3+ktTWP^_ujttlJCA-PY4+kG)LxS8GR}(3$ z`QrBu9uLEA4UmDf3$JgOhW;gNkYA%S3HKjJd>;`pweZm%NMVN%BX+(xwfFn--y#z< zU^+$_(YX(qN=4RXB+!3@_$-OlWOgPcmiGS2?j9e4v>WX}_ipOM0YqQS(7k->h?PA(OHCKo z0nIR<%TayxYlbZHjWsf5U?)#?OolZ}QuvIYz~Spc>1Tk(xT9g091_OqKl%omt-MlMW$NSTkLvj~VR8D0VBb=skK9>Oyuhw}>0>n!KaU+F zx2y^An2976GBh28(eZ6k9yJ@yYsMp8>9^p@e=kfli^yvtU-|HF%=@kM287TQJIR+X$u z5iP%d7&*!p$8}$`psiaD!{X~8UGpK0vU&E2XjQW`{r>{z!GM0?4-s||9~at%XMxC* z3_{4MKl%8&f{FbCO{lf9`Xo3(sBJJ}F3Xq_M)-u23RmGXHv%uG-jlV&5%&8Q+Tu@w z`QF~}TJzMQCD_tA4`kusqI?3MU(QRKsc1J)9Ds)Yr+=f>&e`Jwi(nWZ-zJp%2Ub6T z3VGdif?B^m$kTtVCCbEy@gn?Tu=e>I3I z#@Yul7YLqEkwVsJCE_uP$L;tR4vE|?Y1e7OyMV2$d5kOFY&>-ZSuY{w*obB6e3{?g zcmu*G%BilQ0GLRQOvVG6RNq!;cY%+ZD ze(>qRnH+riXTs`;IGH_zy}@=Z9XTGNQpcU|QB-*oBJ@x+Ns;g>M=mkRgfrG#0-4w=D7qPBWB+k zRY*d@cLo>OpkM1iM6Z-P&V5Jlj%F};ThVw-LZ<8+p2gpQ_LLc71vV_o0ycY5$PN87 zIAMrF73t?8R*}q8Dh-VQ9=!h4#BT!G(B{mdlsL18S09)(_Fvj4QQT9D#%i>NT=I>X z(mu@_A6~|U3CQQb|7|#b8G@hqKo#z=1{&3dS0*IsG4xmt2>RBj6@>mQNd5R9-SaOT zK;FNA6xqjip%ssk{j9@v1Yz-SMCYlqjh{30&q>MMKKIV9R#P>oAP05l(3e>Gr@L5GH(Fu`KQPIzT= z>1;KY28czLJX0T#j`44#7z61VnoKfWkD*@4-kJ`irXc^OtD!fOLX!vV{1kEzWJ84@ zxg3K+TzSjt3Kj~!xxq8dI$@=8u-}CT?j75o3KNij^Z45tr5KPQ&xJ}wPSAD96z zGZ=6B7->Tzs_af>3n(raHK(C(&ilJ7iTnYOBIC1WSR%a;KZPUX-;FuI!2M~Di+{?9 z#BwZ?KjSl?G6ldreOtzz0Jhn*q!zCvITZ(jpTqv6Y(g=DJun9sk(~sPXv};Rk@%AX zqPj{$U;)MSfbEs$ix^}&n zEUYdmRbcBh@Ba6{?}7v&;ng)3AEm0q_ydMSEG6;M#}03 z%RLX1zI=vnw*#28>5ywKVbCrd&6CZxLc|v*o!sb)~@L_9v3VqwS|L9=n#FWqDR6sc1H__qL*5Ug!jZyRHmNNv5dvrRT2feGlWd zYqH$45^gCqWDy>_!rniX#iL|4#{02u+y?olhed&ai9rNS<+06>>Gwzuhryj=t0$R; z{^?7$T+;@2!tlVR+~7~6(}vt{R55O=%lg0L4hzfdYj)~-VxlA3M(~^;M;E;5mt4A+ za$z+oZjaDD@H?}4jPs$6!+xza!MM+UxhD$?)D0MQKpMPm<5L`2D(*Kjz(|ch;K;k! zfJ{|1C46br=_@u8l%0{y=CDLCFxM{X5qV?3>=^9yk~9f`U=a944-StFzvI>dg2efo zwWSs$5hNT&u;#Ok!$50lK=YK9*$gguP%||~dMuqw7 z1#u69J8V8B6|M?CjGB-aK&a3G6Dr27Qfd?JaRUbln1R1)RRYs4W+!#yR^7rBgEa)~ z(Ag@9mB8mrr}Mh7QW1~)5x7HJ^wJGNzJLRpkSKiyxc~cSm3&t77| zTZcL`CdaQyK66fjze^$;)_e_kXC$A|U`vRG>L!J$OhGMoPPKKdH@rMdXF0(~5vf)m zZqzM@E&_*z7=Q~228(`7^@mHMq@tEh;Ue6xB>UEan7}r5x}t}A`TY1SK5|uAYE%9E z<;Ir~T)cY=3%=fVz!x^&C^%@&78sY~XXkE?rNcwvTXYl&OG==D|N1_p%kc~bn9dBKLb2GzI&o9>?D|1`Vy5x-92z~ES@oLGHVVPcyfJ$` zz(ped5PN=d^y^g1&z0kI_};j`JW+bl2(`Cr`r|li;==Z<*mkRNB8t-wb>rZ@t&8XC zUVU^$%kk-&HCEM1=EWh@$o%xhXB<0XS=~3luleI*TvRM|M@MmP=}vGIw=dS-o-C(Yi+Hlh>M>&CLFhVYH)j7$2NtIM~C59PT< za|XM+A~!_ho_F7n<_vxK!e=2q0b)?}Xhn0?*>hF&)?jB*w?QooBuf&h(_q81ua`H3 z)gG0;b@4g+=M4F{C7;^ML+TZWgM_?pvlfYc6ie^5hwix_Q^CUI9+Iqw-y0*B6^C56 za%LjC`f*Mh><4$!j0mdNJg|`@5o-O2`R?;qWOcZbVre0XVfa`WtbgK#ZuU^fB*R%Y zZzN~akKI{8mXI@6vN@dUNZMmE0 z+y3ItO^U;=o1v&=_-na0_1Z%c!{;LkicrL{iGR<9|L54=6OT3(2_eN3Dz}A4cxEtL z-rK`DzWHz`#rVxg-3X>J5_u;4zq#QP0-5*;|L{%=I{Zh0=wPZCA^QBmgfYAng4i9( z7=9(!fP?@&K*GNy9n)xIzFpXV=b+G^&z z1R~nbk)@`<50{C&{$nDHIJ9vpuH_+{XubPog%DGGfNgP0Qq}*)h!a^C>3;*h-;_cR zTJaI#5_xfzGGBU~Xmg+)Ot~|QB2C`6O)+ov?iBq2fi-BcUo0l7gA#D3pro)e zg}|bV`(|p6A+EK%?+NTfF4^Ni1lx!$V#5BZmPqXKA*cYmY#lHpc(*BDQ;2=F9YGpX zBVxrNIA_7qFBzke^?ugnl|>5P2*N$ez)>W}qq`mQ#$#kpTGV-p0?ZcFdmOM}qC(WF zG%<4BkdR>8&ST?IgIc9!68|C5Q+vUA6inqcg~MEFDXeuy;c_3e+lgUys@mDE^ChVA z;9?GF!7=#HpJbAu)XqvG%&lun#FYE&u->)p#1~asgJW@(w+1 zql|gb2tmGYR$U6uOIl~luren_P8A^mtn)!eFnkVsF*tK1X{SgiJY7{KB_`%F^;=jN za*YOXy63*`WP%M|i-IPB&{0vsIEFo=9Lk@{Ly*+|d*(Yl#d&T1Sm0&*bM`(YBD; z!wsxPZxmnQ%$;DpzKlqDQ9KjB3LQReKNRRHC+G>RwO1 zJMnSx=Ls4`ym8^=G+Ot5p5K>w+T0)RNI1BpJ~T+Eq)8x@@5HIXxA$3^Xf4={Nqgfk z;!{f1Zo9Dj+9n)>O}ntFE6C9nxKMLfboeS|;nJjK;sZa8PZv-H;C;b{V_}Ix*J~9v zv|ZR(vj7|XN9^t`vWF8d!{N|Ej7_Pn&hCmmmUZwovZc*=!2N%^QoYI#{q+m49dcT{ zB)U)$;v-}QI-QsC>@E5%;n>kH>Hcluxm}F&=&>JV%d5xu<`T1?-_e$+A+qvbhFaw7 zxAvP5n;S93`$B)h6>CB(QiwPToSaLyN*cbH7M5N~@bU$6@g>wqQ9|Q#xoRkd#FFgT z3Kz8oFR(Siy~^xOX<8|wn-{L*nm#e9Tb@mNTlD!1R6;eDTqv7!3B%E7T1zCjnru_{ z3ZOB$9TFyzdK(4tuvBFjpY5mPlp(dlUs{e;*1&S1_~X|=Ar&0NN-E5$6!o`5pgya}u|>Dq-aIssBJ{-}?%YKu zJtNlpR7 z<_;0@-pW|-GxH32hR~2!h&GP>wB>f7C?k*?jcmi_&_dSgH-;8I=4V4~`vW5OlN1my zlYOXGSDcHMGJOn;r6t^qKo$Kp#SPAaD9_fODJ{ot@O!DB;DSdEW(8oH4T|<}VIeA9 zBCIL4)Y+ZhQ-A!^UtjKYSI4iF&R%t@S=vzd-$NUU{f&O{Fo*h-#31k=IC#Ytfmsv3#sV~#Cgq$~k4QO4d}v=qKJILh$v`Gv zSTdpVotf0*kQ&Mpk5%SQkwl(6WxG8t&AhKDYV9Z@ydDURsySw$?_o9JXW!eFbKs*D zrO?;Cv0^}ea%Q~NUOeaSRr%Q9bX?+t-gO#IpYOIClAjJOFo@^{V)e=yvfI*}Jm zASpX7PM$%lPV%WIF@Lcm$28_oc1vC~p?2VO^8HV(X`*t5!7?+60 z78ittxKn9Mq4use&XXrNTYaY|X#;whvlbO^5c#evTqvJXFut-D^*04lPh^jms>pw- zDcb4w9@!_ZH+>U`4!5S1nn-fH5XCW=c>GFNpn4@Sg@d(XMz}LMhPEJ3M8y1}VK1${ zw3A4v2Zf%;Z-$-n+xrEc@^an`n@QX64>-p&M#c#=H&2thb{KT?Qic+bd zxVFoM($pGJ%A(c;kIOZ)j~AXQ(iIsm)hqtYkqjmVw-Zw;_YB{G@0|I+ut|g<-71|D ze&m7%>O`Kdm$sx&SIiF{PQ@YjLz3jp_hzoy*QQlGt2b*(fAz?CF5##|<~g(@gDfym zo+GI#$P6E3YK|VfOd>D(Ug?koixcB8h~gTgycK%9CEs6{KS@Dit+?EnqKYLgj3JHK zU-*6qP#aQnIyyICscBl41+0Oos}Wb#nlcKJjmn6egvvi0)(YyKMEjjd>9@-+vOY9R zJ`SP_%)tZ}4ugGI&`o3J1?4tM)DQ2== zf-~#ptY+(YwXC^W*7-gt z4Jvy2GcTm*;fRpsAJLQle0k-ok_v@+e?avyd zx&t8SAUipzz-wcgoxE1|XOp2MkL%6S@(t>w@DwKq8XJE&Gk5RlDO{#=xoKDCC25@A zfO_+A#@vye?7^Dh^8)w+G&B!szWxV%jGC32uyPu5Uk z0a-tFl@#Xh8*d-?7TqzK30xU_xZ|!GS^?@5?pR1BX<&9p7Rx_dE#hqphq{4z{<|LhszlA zwQnVEJ}87TTHpGG0?vG9VOe`TfiljWFLA;MF2PN6WL%(AdNb6^gdHz^!H%WecuzKX z6qR+X4MSo+^X)Nrj0~nj2j?B-Kd1y|U1i%`0%hEjJ=$rNQJg->0cXjHr7?{;q(6Q{ zegDAVZG8KLIP=b5<~~gh%3+@)J%7*!j0YFWYUy5fq^}c%KpdG#oQRXX7jj<#KFD4| z$Y9q64i4vjk-oIj?m*$XX42XvxW=8D!S#9FR(1{RMCwlPB*(=>MoPnq^6g?S;zVisTrXB~@VtSJm5&L1QtQU@mM zBCeyp=s|(1r3aaF1_`j-paALLA!CS(>b?|-BiL*XamE`8fj_?c7O{2J#s|q|=%J2n z-7LnJd;trb@83{q`qZl>y8*bALx_jGjV8_Tr8?uFP=1H&x9}_4^j{CY{!;6waf6sEDSbT3mj`^)#vQ;J0#5&j`|W%e82|B!EJ4M2*Y~eV51s zhozo9`<&|wLA53x_e>c#d1h$2$?16WW>3}TPxOmPR4(VQso#DTIsJ|Az}Om3YP)%P zwXv|s(V*U7=Y%Z`nV0UV#jKn@{NLng!r|yVV}n2^&TEh#ifBCRMQ;uWcr%bSN7u$Q7xb*>O+yn|oQq*G+W86&oEmGd zN`suHn5qot*eJqs0PmBmw@%3CDFoo!iii9mx$?5barq~&B`!-B#l-szqU%R>4WCX` zn+>miFA2C!R;Alh-G32zc#vT0Xs;2)I7J*|$8R)WlqI_*r#eFKNdeu1cd24LV-@FB zTn>{6<4dUHUzi=-_3Cv9qA%j zI3*ts&-k?OTHj+L!x*aE8wG_^)kU0ka5Pe#uNV(~N;jBIvO!tuDGMRr((n3%nyrv& z$V{wFMFjTX`g`;iHg=YU zV=5D3C$k7ucJUbd0yzo5!u%AFb)Rrl^WWb;SxyQAR4}ps{tn~MBPBYObhuFYIVt6tC;-@~6Oa9N+|w;arc13HPa(3lSC+9{rNL1CM;#sHZw~Y7Y9Znd3&=bsiutvY5i7#z4I8Wc6 zK4&n57xpd)V^0iIVfHRUaiUzl6>fKK+;${jUmKe^*&Gvtwm(mW6E1F46kQhL5(h2x zLi(V=Jerli%{P4_+Z-BVEr4iKqvLAttQR8-hgO zWYTWDTEGS4-z(+D+sOYa$Fk8W&F7=5BWj~a0)tr9+Y7T}o5ZHiKqC2V*>3SdV*V{4 z5^S+dpZ_Qol5M&{gac+*-xpc1$P`-lqIB&vv@|lCor(4&G<2cuUA~039{iU!#R7i| zCRmdCi#bJY%PO^4<$FG(mL?b6!X-G^g9&X(E#loK${$^K&>oKe)1Is}h%)pf6b;=V zYW6>=D;h&pm&_VKmLejF5#bA8t4f!u&)|f^<-=Mcs-w&AfUgdn(Y&B2NTGl)9NLO0q+{O|U5(1PGGa6I0@8R~uhx33U+GF8is1-^D40^0x#G&e9NEkK9wy2M>UH6L zbT{`Nez<6S%_8~I&ly|T!tWtmk_=lY3uy&DIG;Q~J3;kG1VFU z^tfM(637SWxf|Y1`iculL9J4!`2chKp1+Uo{+8t9#p7${$%bb)KfJ(P0j5*Y;{H-m z@A1+0={zzyqxAN{hv%k^o|=H?iSBAxN1TX4drLM)5Q~Cwz031lWta)LEb5Ti)yGF~ zxN~vO*x)stAIz6{;{Dr%hhExIX%rKs5+c>)1r9xJ#ziOB9I7Bq$psEeVz*Zusi_R3 zX=(CsC$+k|(i)3M0C1kn>W1*9M4hT4fz*?nY1+(5IFeX#h_ob4FH>R{FHTNWhtae& zNgazcsSLhayb-4h#fa)l$q2|In+E?rSbsaC^^fz2`s&;%U zj$Jj9?XKpgr06kybdPbj%({VTjc!Zfu-aY0Izp}uY?zOP-C-KRTD$BH4qag;i5}S9 zdDRGA$=yqJ0bh~sj+u&Xr_&mF?ELzKG(qNrgtWm50t{_(I@`_ij?_L_bF2C-f@J(w z-}!nWIp*ShR}C=t;WXy1l#fq8x;WO`O$NFrMbSjU@0^kpO`#Iziutu2P+~!BbAE3M|y8 z^LIM%3snQ?>-u7V2m{1b%7HEdcD9M?8^gLj%}he(*^%vp5F=@z=k0kL+E_|eQUW9LKTxA0tH63rkO;WFeU$TaV%=-4RD%5pv;YyKP) z{v}==*3P<-3_4G~OsTnTgVb(*NF;6(%;O`3M~scg-v*3wT?+=dU1Q8(G#Z~sBtDZH z+IOyh#m zjBO*8W^R%;$)aq`aijE;gW&77 zLt4pWz1!8hQ!(x4xW_n*77X|CVChB7v5W1<)zwA@KpxhZ<~UYDLh<^>u+k}3_)H-I zde@N}-zIBJM9=+SFfQA+pEb@I=lbioM#u_ZT}KGo8_yl2Yl*(Y>SIPoly0=}r}zji z>@C=|h1A#h0^XC!^N6NQ@z|E?uzX@mM;O2ApX{-nHErqKez$xZTI~iduDUz%3I7S% z*;-Gz;SQV%lL#jfDHTqE{N^P{KfXSAN2$*#kTf1n-n1;F(g=53{x|kn4<9#Z=T6=4k68?T%uvsb!!eB>= zMZCXe1{kBMFl?}6pxALfg#YcXWRBfpTVtm|q!k4Gj!AXhSmqTR)un7n&c&Bo5&^Pd zi(@=p6`ke-2qN%{0r6q(lf64Cgd1FG^@vL!*Bkh+Nob)iI-9#!5WS8cg^P_)R7)q# zLdU^11xy+C$alOqEVy#Ng6v-rfAQ;o+dL9vh2gvgC<41GrzN{i0CwEqh1K-}-QzT2 z!YqyQV4TCE@|2pEsxEyCA6431-K~)7T-_J#wh6x{7R2O5lG4@pC`;TJS}W|9iI;zU zm2hh=zE7>{;RRLY(=ciWr0f`uqdmBS`)ka*x5Gkp)!y5oSF?24?eN&T+PG1NC7y#S zm!Bs4Mz(J{s66Ti8_REp1UrPThSb~tK;FnK6a00ZY|a{e>Z(E+3ToR$~Xpq=q#(T+-~QZ{ibAJRp8?^`{OhpaTmW*nhqGq0@wreEC52 z{w>7beO?uN6m(Fwven`Ib5n}e3$XHioZ2s{x&_V&easgb-m?$2-~kQ{xbarHhB3!` znB395>%Ol`t^x$geEh=C#hhlAh`*rXOAC<*0@d68&3K)zy= z5UuRB3Zc{lGG>~C5Tuq>9=r^j;{4nH4*9Gg95k!a_Q5gr$L|#HKU;n>VosON2hr?) zA^g69WLS8xe6eCuW&(uLG%cgmy_Uy>=s+MElM!^lKWaf0f?u;EE{~MmWm(_{jk32Q zkQ+#a7j7=ocBht+6x+66-}~B;z~o>paniosI`iPW24ZW~5(SnLMJZ0jY667fAx#9$ zi1-KD16PP;Ep3_Ytw+FRJI-5BSgH~(BGrHkWJTL+C^Wg&T}?3dOxRF4mBs zWJez&$DJC~2&m(htg&=fAJvW{%P~uMDO|ma0xna-8ckwLeN@Fv9_ts zeF(mV3=r@zfmo5iscC}z9A6-|6*sSMxlQ2h+?#~kw#m`&dbO)ZF>eroLrNxCL?%ki z%YpeIyJvz(Wpoce-}u1kxDfv&wJgY$o3n}75*1Mtu7JJA`}A4qwZdTJZpgLzH-NTZ zGRS;~Pt16-Y+>Nbax|Pew#JtQom=E?oQSVdbR#ef+rje?oSg|vB_R3HVTnsRU;iqJ{7?S{*4Ncc5nvzWsO+Iz z!0iL-SMY~LZj+B8&m(&kc-Bw(?iHUW$z-$ikQ&+Xf|d>pABZ(IHJ zj_!0^19`?QmOZU*W0E-lF|B=Da_T0&H!p7Nt-nOK0Nr99Ug-KHqfD*ZuLRfO|U zmuv~G1M7$gW5BDJgbJ|$r`-ypL z+g`o7IyXP)naj^s@P|+fMZ>-2{hLocM06lD)srEwk@(V89w2nbi(GdjTlSg3iH{^cN0nvhBG zk7>8?J5qiZ##ooIceP2|#&^D@#&h#e=4dFc_k56ao?>OW zvz8rFmYkMEcVRKbAfcc|#BrZ3nT zvUpEzplb>@x$9e-dYZ11$>Cn}f5c5y-e*fsr52#O{?FW75;i;L@cj3UG7alooG|MU1$xbN)kw4btN(Jlq^m8urd<3D!3&x}V_ z{F5s^TJJRs)r%Fs**Jt4)$=vhuG?yklKZin+`2Xk`}q3a>>u1$fvYrovmVVSH@|(9 z2x+E9Lo)|&Rt_lO`-$A;)wX`wyeR+4`hTpTNkQ$ij>);Iaf;db+CqedUSJ7`?T0J*?9d8I)B^A9h(R=**Gr!MY6Sl)eGYBVV- z$@x31$1<(t$?l=iF~nkkHGf=-rqbZc(L^}X6vw@-R-`=a6geA5o;)kKPpQd&Ht0TuahQ#n`b@2hnx!Q!|F%cdUJnBQ4GqQa(~oSb z{t?T1_w5iu42V`r>{ga; zCoMl1NVNF-Xa1UFR?wgQ zFEXq7lW#L0A-k1qK0SJ{tUNBSDbYifi6jG-*ED+nQq~x>+a5t?x1wR7mq@Z+5cj%R z+ZRGo{c5F9N}j$!zeHBAen&M;1X7F=m{Ilkhik4rdg0*Q_~?(9d8p0ZU^eFd%#`g6 zf(UVIo?XkcG3oq|PGITD16?xo1b~LA7e$xvEyw?%?5}C`ZV?q12Li1bf6Gv(IdGj5 z|0JMd?V5yhmr;T_V;&e0jQ?Z$1FpeH3>8h_9g=G8KjRFQ{eJWv|970_24I5zMmu++Y&BQ>4Z*-cn~xCQmMidq zQKAk(g6o9PC#Bm4$rAhUFZ>G1L*itv)V1JW?=XI91(d0th~|SWZlx{>TM_zLoh=V~ zzgGX!nEV`{hv)sd;{5v39d$&_id2cI{KL48k(Wr&g`yV6i?VsR3N8H;chZlhxgllq z!u9W;mLBv}P2D_l?{Gu5R4?NiHG#J5+_Xirt9nxip~#PUF4wuD|+Xd)dR{gRQCt&7BO|H#xQ~xq*b*iyNRC z4)LJN-tmDH<_W-kb@SfC+mqR3JQAbE@B~OY&00tm%N_m}2wFM@au+#G0ZRIR^hmQN zR1~)8jp57#kU*fo4(zD?j`F3Ut}Z`{SCw#c^)A#57$t2}I0NnEX|LrePN2He=5u_* zt?HMLzVV~!j`u8YTHmTo<=QXoF1=;Bi@mH(ZZB>1G)m`A<32LLx))&}t0ZN&osr%j za1A;-(_Wk7!Wf=Wa(!(Km$l4#25jWc;KsLqBKAy#V@(W^ZzG>PN9|u3;$6iiTh!0{ z$qs4zFK2{hRV#9!9iu{bzYL*NI&~44pP|82ELP?D7eoM=0U>FuA&4Bjy z?2~Ix_}<^#2M1rmajtmIIh;HRlKrQ(3#fe>!$Ba9&J*dCxq~B=xLk2Es;3n7_y;(l zgIY__)6A0aSSH5!+i|($1^aI%xBveav7T}9*e->#gOzu;IP_>wi$BWv$(=#fT7epQ zph&GEJiBKMSJ$XtR=fEjRARHup7xNP(j|T~NK?gmCnS$+Ye10e-BtxUuY$6~w+}Q> zzD@z>WiZ2hXtS-H2p-zC3!EM(8*z;`Z$=V04{aQ!XdUYG15ti9wQz=_OI|ZkX{(Zu z>Rn+#ow8o@U2u>*kb=cD3cM=NE^iOG3-7}aLp8|8Q3_pRL#!1?VqcY z#|pQwG79F1SAz&mkans4p3)B$!-r68G9bJZO0Ytob`|cHQ{?Tl#WTVqQ2zPWhm55P zqeul_j=_#nxN8EhgbH>wHqvuQIMDW->Iio~wdd#+kh6t+V>FpxR4Py=a^QlfuPHiZ z>qfR%krx-{PJ}q)uAOz@^%D+;S!;l|IIn+i&kHKpMPAusPQ=;qg^Z9h?Anhgb0n`p zgfTo2;cPxL?g+Z(1^Vq>M0pdAF)-7&m$tb)zy|M@)5$asXUDA|&8#84rpi6)riAj? za{E0gB)>lK4*9`DBu9RxQ!Q}6um_`{@}ssw7sv^BNgYHfXmAHak>nq&BFl|GkUR9mf_rVt0kx(Go0%AMKetFFyy5OMTE7aUPFFYWgdXeRfa|)JcN2(t9eZwwuF8;BYu#7x;V}1&Jt3CM+?DFgyGzr9xxi$f~ zjN*x7d=fi{e>-BAq?Wge2aa&?nvv)d=J^_+XORjo)L`7QGlb7-J!;#ApG_yeIidB8$=rv?(AUlYeI!GRdT3BS;M2_A(Rxyt4d*2 zb)hyb8wm-^+(r-?6>N`A1N9sXL%#tYaWi*}tzQ@(?#JwNde<(e(*TK*r%PXfd=OVI zY08zWWn~x$qY$D|Z5gI-KH*@f^shcPs+;JgH-}%rav7LhFtz0B zqfR~}5~0g*&0SC^bHVg5tHlM^r*f0>#Ue~1LR?6*t^C59FhS0o4J58mO&TcrK?%O4_Kpi@<9gQ_~fpE}B(vI$c~0{)z)%r+vc&v*rU3`}b&)&Z2|hDd54 z1ydD8<#R5PEtZ!ui>1iHoT;l9unOWYzm%<3R-7x4)#9>wcY7rZiz=sM<`hj#NvA0U>T> z0RC&^7DUdj3M*=nficVx_^mk>I@x=6KaG<~*ar6%f>KxpwL|dnbe?LM45v_M9d*5V z?}NFTD0GyP1mn~}G+1%GeX*|SU_DW>3LxJ}k01kxBUQsuNK|5?I`G;!`^xUq>2Cf;LHW3tR=nDT*i7{;)W`ml=(-C&-1gpk8pnsxykun7j7bo9ktqWp5YVOW7( z7CC#{e33AMF?KO0WDQ)FivAerLK!ZNT(ZGT;9^g=kcX%jUM{&KG|3ZD10`f@ zm#A1cmdIaXASY3QX}ps$LS`Ava)sd-F}$x6@^qVrGgMrWqh0U_rK2`u(fdT~ht!#7 z+R+@mva{`(>z{hvQN%7_hSNR%c-*`)E)}#ZMp)pj#%6#C@;b3>8};^*TB`5*NV7sG zcKCXBnvK9xUApcJTQ>5@98;|lWy@v#AhbO@st620AAt?vS*|JU$O>s%^~12>7iZPH zhDxz7avYL{jnJm+P5pj6yo>?Uz(+N|kH))NltY17rfNq2dN!_=!SPdm9s4cI8Wy12mgZ zm|&obk}bb%{M-7P3$iY17?ie$Mf7NUYQ+>HYw>F4ixGG;xeGxpT?(mM3l7 zNl6F4-(_@Hos;N;_R_podk#(|XczT#I{p{wXpJGkPU_y*aqK>UJr_8*(xxvhsElhk zUvcKbDK_pIRv&eau`O)W`{k@EDFW5GgwknS88JkrPd*u#OW8eGX$o{ z4RMKT%;hb0w>6(rSgvvZF{MvfCXlXE!TAS%hXXo;d&0}}N=gcJ>S}*Oz!Z7zc^trj ziIwMocsQi-2?^O8>y$bTmMA{>OlPEsB8@EAnGomsPks&DzuxA0z4d>cmV7eNa|793 zHO=g)SlW&oNq4e^D8w0czrk@AL;%qVuYp~wwD{Ksg-$i2qIiqP65Iw`6)_UlI%;=Vuy<8mNyiagAOuAA=-VV zqv42KkRaOHk+C66eL^ry&akGeF~ebGY=dA6SMj-$Td%*tQZI0@wGc%(4Aao0=?+1K z{l-?L=vsYU`VD2j_-!DHWDgJD69;B1i@Rin9fwo&}+>sF+K0e)C25rZua4r z@`$2)kQ2oUg<@yR?r#h~Lp!)#dY-1^W*~Gc*PZ?$S~b=KQFmo0M*eJ-?~k#+*n3Y( zOz+W_V3LP_*^W>ZpMBFRFpV(bHcI7v0)X{je@x$S zj*f4lh5?ZObq`0ZP^}&)e|E;OLjP*VniDB0+OQ~Xk@XXzbZq#fC?4$P5FZ4Xld{Eg z<`dO_g$~15j5D4labDr##s;aJrnkMm>p-W z-~O=}Md)mo(Dqp84r;Zl4JEkqjKJVyQ~KR7(Ey(&6t;A(>XI&ae^Y+ZSQp^xg(5Gt z0d&O=@w?rIxYvypkQB`|)^y`5Lu*m16m;H2f8k5Uw=EjH)XhNoMhqI)mQ-j>Koq-w3N1Q!bR*l!Uzudsr5U6F~njZ8(@ zK-~rZ>1;Jl67_(*37l(qInY}1K=sE2=*``bItLLcgHaOA;bq^r5I zE4@cS#8JPYeSyoIy>%He8qThUo{zz-~?)N?HrHE=}a<7=s!TN?= zu-3rslxaY|-s3xS_Hc6|pk>!j@{bkqr%o6rN(|OGLYAEq_=DrX1c6$sGuM^FmPOlV<6EunUr41_wyvhBt@YvuEwT=X-8jj#7 zzw0sMp5xKGcf;j5(0rGT{^}ydP*I_nRx4}0t72DG&8@pYC%sz;fk6NpiLe z^kz^?Udm@8>QS;>{ULS7tvMLr>NyP$G^MT!`=mu4R+hdg22A&oUW2g_mZxiA z%&)Nmu=kZP)`F=cYw!cGl+_v?TO&OkfyTnfhC5r8(nf@4j_{_GRU5Io#q#uFSRL{v zclbmYfD5b=;rJq5%vOw!usm4219E4n2EbAlX=rUhttY;6*C@Ho3BcC$2)#&5 zR~T7)m+K@A^%l@QtK7>`^tdba;XgndP%$GH+j4n_-3VbxwTFQxm3j48J|r5l&T*~v5R}&v0#wc8{!QrBq^7wtA~?p{N}ik&(QYIXqiY{YC%Ws z)=piAaywXA^jwV+wjgf=f4 z=OePAS^sFFae{VFFhiw2>}K{`Ic2I&PUwp^!L)q$;NZuC%QBK*2-mCzFfFk=dZQ<= zij!%c^YKqywN*6fQ4mb^oq3^5DdXcbdnuYvWlQDsxE2zOMj-ETNE#}5ZqH*YVJ&7d zg&v_|M&`^e9LaQC>HgeaQ&qndr5stz$J1$4-L8U(MfTC*&$yRLl*YwyH7@?lir&Cr zs!+`6R1BYtMY$`H>X5f-Q}HbBA3|N#Q_R~LB^4|41_KkRP;klMc8_P!?*%DWV^8%I zt0rExc$LA49%GP!b;cb79_2xGxC*SrqJo*7$|}Yx=Er#)0#wHW9aK|+p84?xI;JZ) zG7iUx&?+bupd#2m@^Fk0>mLirf5A+ZU?BKgJOohV2B7i9Rr5ZaepeEyIjNL07?Jlp z4Q^CqFj{Zkvapgk>rIyIgvWMcQ0m#a%D#|Y8K>-S6MHy;Ty7>&OV0QFkVNP*Y zzP%_}bHiQPpg{D&g&8Z^P3o4k$}*@zRTNcPH7B*Dw6xM*HMu~0RH-@@$&b=e+!xH& z9+oZ?p%F$A9hPVWBLWdd6P>uXTX~&=2^*9=@O%6*IO9WB+!wdSml~sxO5&KL1TtQ8h0K-b#l^`w&1A;v3E{Kd zN(`m#xXSQ)-Who~F@qoa<405{S1o*H3H3b}$e%YxrKlYWmHCAjG5EyDqSevO!#gvNbDyk390>cLS*a`JOt`zDL=&_1hikdj? zQ+Hf*&rhvH-15+?CnA}#l3mz~NDchf@_7mP=sGw$wL>L=@Al2j%1rAQ`XL=LIN+P` zgYZP+y3TF(-rw}}1>c8A-`qZJN2hr1J>x54tM{&A7lk#UsZiRPx^U{RneXrG0XxzU z?G=({iKv0m!U;vI`acEc7akCR#N1msLfWn6nXN$l$0K`ht|Z?%3j|TE{$KnbF@Kxz z{fwO?t9RpY)7Y85b;wTak5L+pHeM=!dWO-(nv5j|xEi9p&J^J@i>8DtU<&r-(aeSV z;GAQ0s5AH>iSz!=-`>H39wx$9bL9Yh5dY>rV=tyHuCxBQ;Cbd>$OUEzzaZfVMcbu~ zPUyk#nOq^edD|=zf4vM{IiHu=kPw2XrH1LC3lq4+95h_K$-^Ahgo=2k3C zWfs=Ik$^ogiAb8=L8x)i*n(7DuR9?$nsu=Ye@@`<961OH4548nm5RB+G2NWOSf=!= zn4``=w_zM(4CWtD#+b-{u{ z>jz=L%sTYup5@zTKRpW`s{9P2z;LT&ttYauHb|>Vz?hh%8mk}G*42>+Na5&OZEwOy zRKm*~>b*|#ZLnu~k{v2`JyvI<0Lz3fXJ-+B$7-LamCxVkjX+MbaPs5jx>0 zsTGRqys8coMpa*&VEDDQ`z7MsFT%E^04YG$zw}9j40bkIA~fKjtz|#^>Tt}=L-lOe zpn60B%D4Z?ueuLS`X3XnG#_l-@*mrwK<_FK1<4mTC+UvEI|ls(Xz-mI`wl5P1h(sL zGbJ&8bljoz>Cw;nVf@ILjol_Lq|RrrL$fX&nuG)$u8ZIWE|zyoCP`>XV))Jn@=G&DS+Qi}v62b{3 z>M!aF7p!Fx&qnc=B@&ui2A#qg>6H()+P6II#p-aKPN|V_0?+24^Z!G)Vk7*j@@dVMMY_rf24~Gf)!ajPiOQ8~Mz$G^)@lkiK*a{AY0$Sk0yVY{U+uLAvUnUC z#VEwH+IM`%d7PS$z$jRBs23^C<478w%iKdO59-4E_{HY0`^_~}fH)2ed8;x~<>2cy zO=DQGCBelonrZ?mh1EjV>RyV6hdo76hYaCDa&siZOT(ovbr`vSs_gS?hDMR{naAJV zRt((Z9W4A0g})(M^^N*XfzQu0{LAh-S2sDTh_fnQnivWsjPSt z14{Ed`m4Vp=*zp|Ut3;&vecEqO=0nsCbdvMX?0eb?Fau>StvEoV6FOde@N~K=#g)b zP)O+N#=?M=`5pb!UlG&731M0;SiH9sbFMJxbKlQ#fXfCCa+3YhxY>=jzx7o|y{FX$ zPqM(A<3{^vgyM{x6Y$h<%;t z+#7QWJq-#CHuz^~N7W8CLnGpKj|UxcM(C9fuQ)?Fw0evi|E!75*Hp2Z=v5+;J`x^S z$|E_@!DJx1n3+!5fq(Lqlq#o0Bh@5qOjsNP8C_p1za0LwxZFuk*SW*M)kmYwgk=KA zpKv&J`IALE`6&7AeJ`KmQcRsvB&Twm{a6gb#pw*Rk1Vd!jfhkcB=J;vSHk~NiAk85 zutBtPn%#wfR18}+fRkv{NSK(O@nCr&v{z_5T9}EwKLFc`RchgX`k1)K4#4b$sZuCB z<#_6ws9sNgg}hJfd!2YHrcVILnmBaUH^W=V?4ecum0kUVakV-B!2|P}dPn3^E?_#oNfPomKC81)&BI9P3qe z93{72qSv)crz)8+^WYH4pnO+_YVP!C3{nuzs4RJ?z;pX#XBrZ`FI@GrxSTD-RW04M z3W|fKyDYRJCcs^vva&c)n~^cpWYBCBHTu`IFY2*cr(dIh_x}1Y`y0B*vDhdKwAGWB zv2%yu*92TS$qE0}n7G2lZ)-hLU6g9D;V>g$!{j>f6@cuzb*)&~KpWP4mn%Lau9{3M ztFJQw8BE4Z4Dv@lduN0#>%CqsKmyc2^mAV+z9M=wK@ANemwFuvO~xf%9R_kiT;+m4 zC%wlcpR?N8FDx4!gCZ>?L3@r49eq`C73k*x+QTsI}7%nG^psi z@$3mk`}xER2|jO|+06x;uk`GE{nT$ACWYK{4nahn(r?>9N=Gd&a!7|b*slXru z>9t#nn%#H+Qn01_EG0$Z4t@#F8->d2+ z%s|Z<3?UvWT151`=98F>CIb2>;M41b>u9mKNj-9P?q2U4C!o(6{kuxcUstsP`mNbN zQZSeY4DTN}&CWBJhkpMqf=PYO-;-gIlYYh?W&8ZvXH*3i^ND!`Jk(oI>oyFm_+m)9 zmhWrfyTSw&<%A%=h&Rw&muc2(sT@3}K5Kfc%TAVv+uSvvUpzP+ewC9*6sF?}vLwpE z$8V@8GV=Lh)32iOsh%y7C0{2?nG$YbfRXn#wJ~({P_vKCM--Ej)(%v>ppn&jui#P) zGq#B?Ys2=jbKgMHbp1dINsDnWtlIS;SP%Y-lWGMHvExO1@0^w}B1dNEXSJ6mJy^sB zL2m}g?mg}Myf$k=a;KAItPPNk!${X0h;0{u=>OA75;@`K1?@`RcgJcR-K;B%hC=43*_9R=jt5N*gTVK+APGj@l|i+3USMW1&Y$hGVy zRCeSx_%`R9n&4YcFJNL?(}LA2UbyS=nxw&euD*5w0dc?69k7MAqpc|3D{>Gf#+^}e zk`YU3&4tH6{HphQt2yp9ecz+`N`6v< zOY}dD>hI7^_IIyz!No{$$8lk3O{VehT-C#^^Z6+7Hw-XyS(vRiX8{PqdE^}*SZz;? z95A7(z{o`p#9cgxjNkiDH$2$jSrofaQzG+uN0mJ63dCFfg;{U2*}RCOqe?0y)??^2 z>>7uMn3F^eb&fsg$GFpMh0uGN15{!_PZF^d-n04@fDZN4wO;290F3)TpN-JNzqh`! z5~QI?^v;Oy6q$BOU#u;!lw%2h(tcAA(x9msPjx!L*z``&TQGOi~Lo z#kZ3+&lr7(=Igrsd=8K_e+C;Ndh4zwjx>w%z9gLIwa#fwa(B<`6B zdT`Ue>#!0D?<~39%iJ_sW7Km$boO_JGr=L1kYx0VhdxvCbj~yo_3j-T{`0b@46lTC zaF|~2R$P&8^<6Ai>w)|xWEh5awLf~1n?!N$rdFcTM0!K$GZ`4U5L;V>*9p4ca{_Ql z7Q3J>+2Y-Vq+83gG}%}tpjed{=v$e$maO+fW_>R*A=R9dlw=Deo0RmbegCw$9#pfZ z*<~H@cH@=rJQs}5aWSQS*JYPi&_kMahBU?W%^i&x2w;2pU*di|^FmB7{qN%6m6|(< z!q~qoJ--=l?l8KNcD>0uF25P|{uH;%E0(r>e`%yBI?{mMRMb{RTqMy>S< z8Kmg=<;}S-wDH{dyXs##5J_6fms!}7b2b<*)2{T^67@=J=~4dO<#FFsP0ftVYUH8- zH6IEp0PVE=NqFb|k7=N0<+js@ht$Yqu>GzycIuu3Xjgi;@d~u9L|APSq4A1SA5*zZ zMc=sqo7Qs6N2r%>B9f;dO%So$joZDM1*;E%KAyrZjPgkCY-ng8Q+C~8@S`UKN-{=R zU3mS>PyyXw%>~5qQ&))Hn7sX<+q3z3kgJEd5N3lhyn{8k7bcRKM+)`dL+q6_S_$Z} zbOCy;2LW~HP(MWeeRsD<>Im$@G7mxA=HqwEZ5QCx8u0%JZDtgvc}gO@T$liEuVxk| zdk6CkM|)Oc|~f^&5=nBXl9|yhYG{- zJfv}JO)g`1uLG8HJj&|}YWxely}sjmb-&%}ho&d3N#}UL^8MI8c1?%(;Q!rl_1Z~=3&3XqTqKJEmb?xfzHmas~<$MH< zu4h$wI)5F+v6S`61!hv(nb?yMS4Qf!W)}K<$e+S^aI1*|UAYb`*D~uX$oYyfA7O>~ zNpm6rvg8x|7s^J!+67quijq5E5iJ>s*^M+B_izfFOCM*y|);c!`me_&`uIg!Q+QjB1XrF-If7FZ>mZ zoX99_R@UI}W(2<&HB_|;`~ll9E)jXnC$P*$pe(!w2d*to3N28)?pCHundIUq1LpHEYhr6#mM7aJ%{ff*rs zMB~l7)R>HVyt3a*N>U*?91(vF4?7Fo#7c%`pkUFAA!;r9ge;vJej2USM*vHsAn5DR47?HWreEn)T|rbGnPQWC}RyN zkGE1MSCqUw>2@c4IM{C&{$19|r)EaAmZv+qix74(&iKR^7nfXAVC#?3U*l2ZbQ94wwky0D3?EK?$mq`+{E7e;K>ecEV;71(BoEo3M@9=iPbzI9Qk+|& zHZ!SHE=%HVtw1j!x>AmNn@6>F=N`P02u+m|(=Vw@q7vlux^u{QSz{(fPfANC9MxQh zt6BGnM2&)kHq=bz-_C(s>ybe)0z`Rh=@#fC;hJHTu6@uf?uu`_+@O)PJmlb~$6s zA!H%7M$$H5?k>tM(Z4Po=i2!?K5|e$gz!$B9cz9$aIjGqLg$5+P4;#s;AY=)86DrL zh8cQ-tcC7dGxlX;Y5w-9V}J+1Y^mb8ulCp&f>CROJtZenbN zY4?zt={0dF=Th}e;mZeD-h|=-QGvgz;eiAAQ|hm$NM4Fn1-FwXb$&KKIxoGmi-{rn zlF46FOQ(!@aKJ~iz_4v3o;2-#Vi}ppGd!DLKwIJt8mwD83$wodhG0e%8rp7LH2Qe{ zqPOASr5nbNsVfI}!*$PX^p=kaj%9Vjjc^Cta$uJ{1I!6aXEqytY<6i~nR%^UyZ!K}xa{v!&(O8uPC?Q_+&C zpz~`ZtgjcBg1*FXA5(mtOebEod|`$ua;8G0?flO9NZ|1D_+7q~k_qh(#$@#Iq->^! z^%gotfgH4Vll2h~NG>*Mw`eT|?~_|KBd1boY&7cv|}P+xM?BnukoDA78Q735fi`zd3bS z*AYS{z}vFEt5$UnOAO7k0ofV;%P{(DJWY>DO}E^Ui<@GL|HCp`#od>MWYP6t<;!Y#W3UjH_#SCoVT+)?jDsv&5_nI&Tx#Vcn<>;a3;ly zCN=Seud0d40KYNz{y+dHrpT{LemR3Mw1g=lCfj#pr`;#Lk0&KcPnvI|Q^Vpc4;H*Zpc0VbYhGkST}Ogf2&~7{?UL zPB1mPKw#6cr}uPmE6geA;)0hkpg5=@KSQ>luZR$7O!kBy9l z#uoVy#9!RHk=bsl|Xz^HOmu*oyWA9sN&aOMbJb*JVZrpdy>v zIYaFdL2))>3dEkT$JsJXnrql7>>VMV^?;&B4X0VU1y$E*o9E~m{|v}WrVKfsMJq5?djMYpYpTa| znxs1W%XzO09EPqC2)cPktY1bnT<4l#W`b;hm3h@Vc*`0(00$?jisXAAEP0S<_(8?JvFl^M(G)JIhr5*vo5dZT=kPsBluxw={AtSpul>?FM34wqeN1d3ls?pQPW&FH z+$&xu1G+sOkiM93Cqy|z>P|4b(Yy5cC{Ni^!t`K1am8Mgw_?9Qt&w-9R1bSD?&WGA zKb$bXH-g+D$0MR!x>VY!8Kay@M#t7J&4EI}iR(C;;kcxr3vehl)hOeA@r^fSRza;- z@q59$9y;gWl^|Qf)Jwd1j4Gf&Oq{F-7@7V$G^_T`v)Q*IN%clI?MU9K(V#F4SNy& zrjL8R@09>f$@!3P`z)kA66qcJS(sMBVDkkoHR6XrRx4+Bl2_k3MMFb(*_4Q=nZLpX zWQtT$p6NsM`dZqB%Zd}L&UbrWFgoLCL#H#j0~UMR`v|=y*4^{ZtRe%shHIH^W2}t$ zw7Vr_1;*Jp$y~;?2F-%MYco|f&tXh)Z9D3r61daJKemZ1>>7@x&d7+&c)oFe`4q&1 zV*>R46z+{@5^mbD0Hif%;8lE>I%2Pe z5&Md+g8(2|e_+J0J8?%JWED?i!;zwOV5P2aSMOM|#@@HatEYLz5$fMik=hWQaQX!w zYP#DEF~y*M?yg@yV9VK`-;3icdxopUoR$@mhMnOqz;kMQM1eMR`4YTMCoHtR;zY+l@J4-Bl zD~m7|HEjkJU9On;ZXRaB)L+ShlG6$pM&5Z?GG()A*P%!alOjxD(EW|AqV8^jQRJV` zAOR0CP(Pp!nhXhR$ON)ZEu1TU@>1kShNkHRd^t4lyG76;H0>r~b6b3k-{E*B z$XaG^5PIDlB*EqKSvGxlQeXt}3{6Oh;<>R$GqMCma%?=Jsr5Hy!!!x28Quu=pH*-r zu2Rdesm!_eabA-KHx3Yt@sC2_(;U(UzSCNh-U_e9D4{*hax8NcieCskk0q0uY4KxV$xZ&jssSr5*3>2<>#Sl;#$h%%L3&0J<#9}~^-v=&AVxawq)>=)!e=fY{6dk;c)jiL}IfVCJqwP$6dinae%vF&2UTjhy@|I6oGic^HsYn zS_mljQQ$3@fIf?6x~^+P%n{cDVvPIYFmM@e2@fHQSAuVS#q7j|qCA&cMnINl0_q1f z6UUe^NxjtkO-HEgz*opW%ig8eO5Pm7Db(z&o2+h0ZKd`Az%7Kq)*zActd9syv4+`!e4uNRZ%Ld8$A5M@G`AO5n%ElJVH zSuiSz{3@Ql=zn!ES9PeX1Gsa$i=B(K6m0dJG}oi}1Tr^HkC|Mex9!C!L(qC;{|bh+ zqiVHZ6O9cFj2c|lHcY+%e-JFC%rxwbt0?-h0=ftNqUFZDXr}N zxx=!9hi+7g0?`Eiqj`vsF|y3XNh9k9<@xN~$IU@Ol&8j=n?oX&NY(Q~lA_m6j|3WF zP`Gl*MZ0kV&E(J+B^d+1;|qTtQp)SObRrL%N(4v6?tQ$aT|LoAmw9~$Egm7A)XV2> zP~;e**vw+^2%L%wjNB3+Ml71aEDks6c^F(c+!DR* zeJy;T{{DXV^7XW9c(k8i-Sa*yP$rkK7G@{axSv`gNG3rfmi4BZVY+}{Gha9qUAa;% z#6w79;%S=7o`@F!X`nF1&2M8k7Ho-`eiq;LM2iTqeRfnFMTFf(I~piKXB#cl@Z=YQ zwn0jGum=FiMQ}^7wW@~@8@(e*0=h{SL-k_pJ^U)e8X{G_ID~hVwl`jzjNt|&W;23> z7a8;qNRUOK@Fiii|^=jlfATEEWKA0hzPklL~PVPK^ZDK;hj}8b=`4P^%i6_v&0sNH7 zyf}}Ym>%qoJ8&9&L}Y()9Z(RZY_NmNqK(uEZsgc7BWc75;{_Qlgu8{aL45PI6A=zd*zo?Pha}s z44|NJ^j!^#6vgr=7bcBO6pCAK`C^QQwk+;PHHB6wfIS(uGY$_O(&j~1F#_jVKA|JH zD9V2Il?8SNHjj=(GPR?0;V6G@+$kf#+N-^F4wl0fdgH-c&;tlXAoS*U4=(%@?Jn5` znP3fjO}kH1yO$)|$o0`3v?Rn&fN=Gc5G(D>V{kM*SDQQ$iZLM(QTEq$nzfO~to9o^ z9`@cny?_w(b*^0ryi2`)a?s(Baj{jgSD~W6DHDDFD(y(KtR2f81U70Olgs%93X3)6 z@xp?W<1rZ}cna8W*^CroR(>5LXN>_OcPGp4J&tT7jY;Y51--<&s%zTf_g<<+ZTL-D zW1VWECJ0p0VV!+d^-(g&!4F>vVwTH$r}5wf`Og~JAoKlk44)uU>Hse^rzKw;M)GAz({K2Dk6xx_bNnALrCF%wj@!hP0fIr>AsP^VT-8GYqqbc zelR$Qym@tv!SL|{GFgH_FX*g{9rHsAdkd*V%;@E>c&SUzM4qNG|2Ni~b@=_e?KOLo z@c&;GdPHxd^}v#^*oD=qc7@s4dBt5lc#m*pKDMj>GMo==;O}iu>KI?F3Qf3HbMZwl zHkB}-6k|%27+6`l=q(8*6rAGXZu>Mdm6IYcQ}^Lh)ol&Oy%#5!F(SS5v;9ig>#+L} zB7KdKfHe(W`E!dHuBP&7I7BJmT5rbPoALKv;%_QLepZSr6A826U29TF`kSvC2xTOm|G1b%duYztor7{(FdOw&Ky`?=m z%h3b7zebX_aGoaks25W8EWS_RS&HEjOzrL%K90!6*WSK^pMl`OG=%Y+MRv1tVANA~X_V8hBNIV29pnjAJ@!tP`WWy+Trccawq zQU%PHrUI2Tr6IYLeN%@Muc^2VkI5p%(3WT@u_sc{(Ro%KUT?h}Z3?49LF-La%Sq3wQW6wJ z-~QP-RXls*Xu&`ph!}U}X7jg1IoaR~p^nx?-QYA;#lO59A{gbmLlqkXImIZ7S-#m# zCxhznk*-u~#46+0YX-XsJP>uX-3-STz0u}rotQZ!-|!czj?G*D7=JZ}EtXDqKJ}~E zJ5Tl^az38cqM#N=wr&v%5nZ!wkjXa>n!~~qel;2lLYT`va#(laid=XQ)DF`+`WCrh zkQmq;v9HlgVhL)}Bm4IlLzolaJH@FV?RF2rW7&%K@Azy%R~7c_?Vz8> zc#B^8sfMU%)87w1yNzY|AS*YI?Cg5-FNM9EC!%5JNCC<1#3}xZRR=>OpdSoO)%sJnX#+@;6<)jdXPDH;PfYp(!g~C9& z+BECo?!KE~KQ^a3V82!|+Pp|{J_jG=E18=eRom2l(kht|PW&OI>3H+T?zh-C`)_snJj)JUM`tqL7xhf^3c0c4`)}F8 zgrl}!6GLdlZ!CRU#f`Nfd$--ncX-WiZ;&fag#xk@6~6=yp;8+EEM9*n5FCo`@Sh&z z%IOMD{Vzw}Q`ZL2?V@G}+xu0M;~P#_0-*KPdRMT4>rL-Si#6f$@P+TW)cSKV_$|Vj zu&bz@k=vQZzB}E+XK>T3xocEK7|2mfbbf$Lg#Fl-Et1gz5Vy*{IIDaWtkIQ7Qd(T^!4&g3rhy4sj)x)`*Y;O9Pw9< z8hQP8Y3X`x>yLFSDUdktgvAN5qB{miuqrZWRtjrTjwx5-O|L?22$BRL|(4iS!#G%=@hQ=hdhx@w$9)^B8Nq3VT&egnz2cL zJ~|0f_XjS{=tB-|As0$yW?vN6OJGjbk?sw403XUVY=}pn*?A@n=Qk#}9wfHBtA1=M&WkOmuy<@uX_AZcp=j5anJvg=4jM7upbXvC;vCh5Q+|y#v`QUWkcpB;5K7ax`5dva&BFNCDwNB?DZ&3lr?4^4Hy8M^q^u-0p$ zI_p^0d7;*XLUYpQYLXxg>W^Bj7ieuLFv@Bfs{xKcTs30cHYJv?^pX7KtP-Lw6ru*i zZy&&KGnbB#f?9LHVzpBMo)j%mW3lo;D5br^e5ZNgibdwjz*8`FFEEf_gv8ZE?SUOA zEujK^6xSk-;wn~YmQev=0Z_~w=DCvhDhfIQ>6HB4l>>U5(Ld4)75ab1He!pq`ITY# z>9u*;&3_t(pZhaanlO{UKkj|OC0sEM0q`f^fJwlAPY%f zpSL3reNY^u`LBvu$W{jI(RlEUwWA~qFqdfsWUGZR$!`R2E92Pp%5FMFNa6~ONBNcc zYAEae)WD#3+L=v=sl>9|=l3r>8=83FshwBuWKEravF@bvmTf<8;*Y+0YGiP9?6}`9 zuRzZoyL|^Id2x29vR+9iOB;h=h(#>RnDrVa|NLSrC;5QxHy)>jo;KQ_{3{21q1R( zdL@EeLB{o3)0&kd@ldDfdBIDp@QqD=cdDk$+_Bi zJv7}|hWxVPOlEd#`h(Rz#RbEk&<)N?HtlOVvdS-vHBKhR&wmhw>5*z->)b~Xhc3t1 zS-C!V*SIhKd;NjMga6?7z!3{2tjzt@dAR=QL1U@5U(u1#$KT{azpGbhTPn(6tq|x*3$% z)j4CB?(}i*pRqqwJKQ2U=$oq$uL)q#(k;~#!XnK_spgodg`a&gFOp*PEQF+qN&d^8 z?D%AbdUGD9I-D*x;Aa|Qi-+bVr%f}DLqf7xM0N2B72wfF*0K}G4vfw4VDRNtVwQBf~na)iwD30FnD9vW3x2I1!EP(kBI0yLxGl>zTy5!aZ86M=%x zY=n7$l*@o*gSO@_XhgxPP8d|XohHUSh_DEh9TJy;MH3b$vMd`#OoegSWX}<>Eoz+6 z;598QlRzZ{m(I=s*EF37Z>9}rqlJ(jXo=2M(*S${%%_LKb~Xn2c5hnI4P8N!Of?mV zXvGHc!p02`%>&^&vk@2`b+D4HG6xp>PCxn#`M`v~5*^+%+}IDQwqX$)*D;5JG640A zNXeQMQrI4h(k@QGvAi!Vq6%|#dRL*<3~FOlu%$AH$`x5eIz$}hr$$s9E9+}^*;pwk zR7Im2fu#SllL(8DGQL>^cW1Y@Ju()L9sN#ie4i-DY!&>VoNe^0r6hyRreK`NP#yBu zMg4@0Q!u06{_+MagL{1wzE3fs36D;In$~bSnDHwCIT2@KQmDiZ?zmcVnndHj%#D~# z!9rL_W97rOyzni2(@&#MJ%-U17EnWFK6tmcEdcKrRxY(r>A9Xen{BPnC45CD&+WvS zWb!GGrt5i-w$XG#R;>pry?*s|q*ra?Aj|{IL`vm}v)iDY&9Z(m8MB8?85LQ&{Kb|a zsW{a0!9C>-5fts59weod0;+2qk-Aq?3)<2+n}@G275?de^Uhs#DPQw)-@#plvtZc~ zj>qJ3p5hF&C<2OX`6sb18g3oU#qWRpHb_}dmt`cA zi`gc2Tb}O1bio{A%u`Z+0)TVmi&bZOE;x-VBLOn8x_AM%4c4o37)PF}UKl>zcpzVM z+pyFj781x8;Ij-E+g4`sn1oF-bN*U$bxWIxQ6^p2J<|J1^q5XZU4dQk48{KsUR zZvr=P^LMY-sYyBOrb1M+qqqUeo@4>d6{=YSxZ$`f30D_g`InO7g43qks^%bB;~YtF z3*bfu(J@m^sE9&J{_l!`ok~l>VxDt47eYv!RuO=d=k*E=WF0$lF;NslhCQv%Kg4i_ zDv3|pQW*HI=Lv45EJ`Bs!24+mqr3UvF8-~|JZWs^m8Dj{*He2tozBqqWNlc8o4T@l z;=_4?T-s8_&WlHT|CL$`viw68(w@;T_Z9)w6+7vOc=GE4=Ix@l=S9^YJ5H=%uN^7P zuE6sDvr}d__mcj)Dkw_J8fF6%&9Es#Tp2VeJ16wvBk!qvnONOW5axwWGSVyzK}kq1 zD-iRN{zXkO&jD#MDh1)A;4VT610;CPA}{u7pz)YvdzCf1b=ghg-7yC4I_i2Qd2 zt8e5^No= z4sBxVHpZVKH2Gy;sDMqJ_~@3Ty0VNAoyM|mqlNI7d1~PQ+eYyc%@%TMu4))2HIdrC z0NX9-+Cm;fS{dtLLgEA7<(XtEzbVI+RBRi-F~!Z1(S#k53EaDw!aEnOq!&hu*2PyU z=0)b9Rv`7C%Yvj*K)>~ECgOp57|yWHU<_vo0OPz%fA{gRa~0sNr2QL$7UZ&mdQmS#!%uI2{}BV{F{~XzzVnIddLwN&^X` z3y6TYOjPWL3g*OFzP`8LaRUj$WuPW<;mRS2&FMEWiq0YWqfeorFWj$!bVBr`W@)A-6Mg}f0$SbzT9SFz0yals+QP7+ky7IlDaG7VIRMmg^{_bZovL9~0 zD!>f{uwVzhvOrO-+9*%S>Z-ONDI2Z{@StJWIW+(~F+2IfS3UNABTlA8WH*g z18exMbP0Yk#GI*{v_7_ieQu&n((H;v1FZ611?6~P?b3U(+`S*1UObN z{FA?6`SMn*(&%;%?Hsuxj%V8!@_VZrtSSxXf4ERrO!-ISuf6v6COH*n2KV>o)sR!x`!T00o)bi5 zbz_H)*Idfi9?V-ed$pfVr>A;xi6E)yWMlS=(S760q#6v{I-if>hb04p{4_9CsE#pu zs8HETewJU_*qmWhAOlv=!yggKg}oNNxH~-~R(Sreg+blg{hdE52Gi?-7#dFAHwQMi+Z1n4wmx zSAUHFSM5=>Y`mnnQRrZrGO2fd-iTH)njRzc+lV;HY7JAk!44E?5u6a~y^jOf2JhB@ zEJ^2PM;ZY?IE(&!3oGiCM#kfget?{eK+|ZuOx8NRLQX*>lPOydBvWrgZep9#bllB9@Z)y38SnqQj;BD}(lg`Zs$@c=eIzxfD{(|@G>dAwb z2Trt#hv+44{pVyNR;RrEcDK#Krn}bt~{uet#bOM91wZ*revdQv zYysihkDwEz9PaFhK1O%#FG}JAkNf?;NW`G-8){IzvR) z?Fh7c9IK*N5ZeIv+EzSMyaFn$S>6w>IxtP%flzrSn>U?)DYZogXDa`$O~FTprdo^U zN(6^ixbBI?;#I1C@i@mS4oLw7zqLOZ9k2q9SGp`mxBsdQ5ZmXhO9iU4|C-2%@FLh! zzTrhzRyq!~^oPheq)F|(tv?;~xg`sJbAn522JFPNT8Mip4U?1%$X&sHdbc(Zc}eWg zzeHZNxZ690@v2KQq`c5YhIn^8J9fqxrW^TT=(l~X7T+3no>Ob>AoccM&-OWWg2o7Y zMY$*%N7QzbhB|*U(fDSG=!$sg{uU%7yA7L*m_BlWzQ_X75M8Sv_-gUrS*57B8Sqh8 z&dux zWaAWjdD$AP|F$t+wT7fjH46IvtDgCb-(w6V2xZnbc2mjzTVvdq{EN}QOM9O~h4UYQ z4%xAT?LJ>HHtkqJ4Xs@-GL52DrjtCwad(ryGunMw@XKm1QCGDFv&^tjcS)IIF)Sn} zOO%!H`XXUJ7#(Ik+O;lGv+E|8;0S1Gwo_O<9>hJAC57AjehVJ}HhI2P4V zc;UY;`GzMri}e6uEB^m(lMDPk%9a1_UmOwo9hl?ZI-3W|tf;=Xr}~!%$wo$f2V41e zKz87c`u(E*C+1`A8vt+ht3SAE{f3XA&FB_j3_#nc&U%mf z#gMRs_eA}iNDIF7m&8XTU3RRmQimg5YpSY!h@g+-3>}ITDo_U0w;dpFfkG6h=nx+9 zH{8MYR~VE5CKw8+00IH`rD*RGD;j(#%Qvn`teU=&O0EIsE5k2rE+#sCNS-B-T!K@Y ztnyf~6BdXTrY5kqpAOM!<@u4v+%`XGg~bKSFEosgweI0cZuadEy~ULO_R=iO41W6I z-j4^r|L>chy|yrT-Aooi{Dmu>#?}K=+>2p-Dk`oo+gZ=`v^ue^RP|4H*8>tM{H5c? z|0MTNoBOz9Lc>2XCv@rvEyBljPmJfi5rao;Tl{p^3t? zih(KTk@YvyxZ?7~`T^=G4|wdYBXY|WpCI}X9@YL-7~&K3r7f&YIr*Mmu;9ga|Lj`K>An>8ZLS)1T89upDkbE<^Fe(FdAn^- z%k__jEZw0&0Bcpk)TbM-Kke@6r$;OG6SvU)nS@Y0k%Y}h#I2_@*Mzp$dWL4<+UU4r z%O6el+vWLNQmhfeo^ z$Wl5hgmUrT4(7+PhYuuwS~Ki$j*dE>Uh8tZ&tZl-9g^LYcew%Z2H*{!zKGD@>zTfB z6(4C6Ry%3084=V0eB@GE3}+2Urf~C?^pcz!>0AyslIbUtf`WQ>N)xeai}zh6PM6%c z1xoFGUCOOn`mt6{N};s7i2{5Be^a%B)-rMlf`cZDqWL^Cjz3qsr<5W znO-ywP&;(Gs?rHgEAaaGBzD@O-<|6lb`L;~^+xG=a1EBRl8`?$e&hQ6ZRX)*H1H5)VPje%JLl2zubyd{n zBJGmVw!=MQ(e=~&H_q{%DsK0Z4%vvX2H*Uf|uS%%g9N5kKo!d`%V4oN(x(Z@CVs zMQlKJ74pVqQ`|T}v4_fx<^#gM*3Sq(`2#GjmRFQ8qhMit5SN#Nf|;CS4y?T#7r=bE zE>Ri+H*TFKnzA%ABO=+z1Wiohg7y>+%dpfa%&gTy?djyriP70^qF}+Zyha7v%5oJk zY*sYmH9OR_ktK`wP{{_RtxrX-dbhHJckZppPgkJlN>kx^7Wb^LjlAYpQt;gu2Ae7% zu|nRxP%vH)XKE8OGavQLS#p?tok)hzd`8ZMapUcslc|3N@?gisz}?O*~Ow%4T65p#BF+rUjW&(N7{y zJb_lG3s0YJ)NnZl@dDdgF+}zO(N{xtk7rZTkChPJ2LD+2OAUN0!rKjxkIm0^Y%R76 z$=I-F{8!7~{fKD0^uPXd8*cj**iFs8^VRV$H+=dL@qYu}Hre@6_fGyhGpCD)d(RUA zcDydomWb{~xvO~rmvTLZ`@2=j6@l#1zF)!HSekmTUp*AqE06@-o%x>u{sRL2>dR&g zeWy-N3ftq*E^qe;U)6nbK(Vzt$;V9{5R@S-0GCDbNgGAufWxVp@(NzS&AV0sYAKf7 zAbnbbs~!FgQ}sF$y`oM5k(w6``yv#fl>&yc56^4>NC_Z-VqUxi20X|yK)+y|`MGcW zb>-mugr83^!{2Gpq+#1K#LtFE2s*&nWbNZI9+FW=zNLIW$e}0_FDxld^vQ4iVB+hU z9Y5{bu6L_GuV#x90U5^bK3Z8Po#r`CX>8&@PvuI^%_(#Xu zXDgq7qG`?ujapCqwGWeF8$J~5dz>Jj3Sc$$+Yzqq{_y!RI9nadIWdy?SjOHzc7JN3 z%3E|Drh-6Rz!?w-rcloxaqg~CzWX;<*Q7&wR#QOTyc;$zrSpu`O!e}CcDp_?(1z!y z@4oM9%2ez4&d1@2neV^7?7&jM2{vjJOmxV=*1VvzBl)wm6Jett3qLo%b=I`1Kxxr8 zf3%bx4%{~FPCt?7{;Hr}1P=!8 zwy!px`01`VDl0AHWbmJTA`xz(54!XiN5ll~quXA|?Kz95{^IJ7&x^KErGifrbn0Kky$Mu}~bc->oq_Z*zrMX9VCsM?u)}w5u zO_3oPPmKG9;NQcFRe<5vPxHbfge+p>>TrX}^ll%37gypD$EDK;KT#T&mkqXde_y~m zeNbvzeeN$Oc>$sU=4*<%z`o8sB#i-Gt%_om4_MYVG}up*p)TiWBuF3oweOxfmz%9? zNYaKdtRZ{;G8ChY7NOcTqU*N#K9JFbF=ce}C1PTLj(LC>?Z4gw< zxbL}RzO4(>a9!Fy!@1eC*KpPJ&F;ZJghpT)HnMz`U~61xxSWN<;kA_)fok?NzFRL( zVJ2g`F-}lN_cRU*mzKSu)P39Lf*?u+laPwjQS-6lO&i$$pvI6A7G_sL|9CO`b(|=d z38QXc_7>Z2@{XLI-YhnqE{5{w;oNZ_3!_{&iG^3d^{-Z%?q3yUN8W9$79rV4T!(w| z87gz-RL`N;s+VjSaV?K$%&sAhx$%W=T89eD8$B6w$6S_M=bIRomhW`O+4f~ zhstC{M0OCe6<9tr`t?ggqw!=OO(z%wFJUu*WHAXiLwADIvRs5q=?3E{?s`1tC5Z~i zRaV)w(Ev9k+9yXcF*Y~wHC{t%ZJy9!^DwtuPCL!WnC)Ru;>C=RI zI>cdI_lZ7>i?td519cfN*^{mHb0a`W?Ttt&t@SHYww0bRHFDq9t=?G8>Vgza!j4ML zRwJw~yF>=v|5Ta1HQJndB(QzrXkc&quElW`M;$lPcW2MQqZ%>+9?KadAC0BP=)$ zQvlbTp{Uqh2Ah0%^3#pi#9A~oUaKP-p1VOuGc4ul{#j zVDXDJHm!3#kH=a@n(H6a1%ISc8YvYJWRr>^RgccC8&{oE{P$}WpC(;JswT#r%l5hq z{EB^;U{6Mm;D@a#IquUI50#uHxMGz0JXdN&7+xw}NudMoJsTZJ-J@^;pqzA!0U3Un zDi*R=$%5b5(#HA7~u-)ro-n*M;dlUtXOja`pc`UU?_b z6g|R1o<=GKL~hDL6v~jz*5J-bzs-oB2y2Jzno8NURz2CDWNRAP2ZJp5f$&`YXtQ|b z|8~6sl9BVj&FP7e=X(^-=#RwLx~>1>kAv14-E|9K*tk~sT64x!%_V~>z!aFjA0Cf! z*E;)ORQZH5=OQ;eaB3{CmYE%wZ!+-6@C!Gk537vZKoplX3C1<|2O(HajPcFM>j|8=Kj{JK)%uw+mqCutZ4NrUxS5wgpfq6P*8 zf7y@e7Yzt!7P4pKXu>1B&4w(2ytfEh0&TQRq0 zgOgvpaDU4L=6N=Wkwp>Wp@PekYo-D+#DqwK#laD2YUbGUaIo+h8poK@ z@e=_87FrFmwR$v^j~F4^{*0LFz_{7$2PY_UwxoDZe`z>E<$e#6XPP3;QD@JiGHv-I zSgX_o7ese`@Gr!y3X;StMWYilENlyn?b{U79%u#68V+1e;Yn zb#1bT&g@?mW*nTG$*mQByA0;XpN_wkLAzl$nsS`SU^?^JME-9t01mh_FG!IcIjcxY za-`%Y28}0hge$Y-z_GvD*d~CvUerSc44eli6&eIMQ6H`JujEhO-tAtk3n{F23;t-N$Lm&ajETstFk+v`_g2Hrd8FG464}Yk`z`0Z7>g?S(J?HXkH3FQBnTg?(3b{ zTo$!d?1iHtn|NI`Bw^zLn^S@8NG6{Y`Rsr{FaTB={UgWeZIHH8jZioNS|# zk~L4ZXD&@M3)L;xgcaMV=ns}(y$bkDRSV(GeeGTs*F2}LyTByot?!TuX6)4?o zHzo;!l~go+J4PO=1Sn%i(zZ?dGLpDXm{qe{GkEWrhvqUdC9`D3S`dkh`G~QSg3~Rx zUfqnFK&6Xy2j~3BqD?Qj3kp^6C?PNp&=lj!-r#~?grcTQDuH&wTBs&Rp&`CdZGdWI z5CwB-#SMX_2abml5G+B>lsqg<1$D1lWrj^GR7V_^{(tj=%79E|DG~;5BpfUh`S5U1 zZl0#bF(-O@-GGx3A+D@)8I%*Vs%7;B{?9y=;xG)TEjxQ@Ex4rn;hR4|4fb}kfvP=Q z$#yiW?q=P7Z&;f;&FPgnXE;`CtTZTgGBu@VZ&Nex?EmyRqPA+GYE_w2->+yl;k?~* z%gE&@*Z#*sl#sVY=P z$SP~54S42EuY)!s%kecXJv@k`7-#*}@TN-gF(L}!(tTPVAsf_@DLZz-Qoi}IzH1F&3{Ip=c$edZDY!@C(=+tk;FFuAyi8P_E8N{0 zLL()MPydpzoe5EVnm`3OEhdT+7gEu7Q+T0`+(=lJQ$?B{l?6=Pa5$2dN{o44Z$`1j zf+tBH^D>0XW~@BQc(cvRPI=vY7$^(5zzBqzJ0+!hK}Lm1{MQ))OsF00zux;yB% z`nx;b(y}p{ZW0v&Pbh~&467>xA*slKu6=QG4L22=VH@T<%Nx;-Cpsgo;4+G9fu3Eu zd2m^OE*uIDBV#ofdgLF`1z_Of;(03<2y^KIb`IRA^@4-JvV$+RX=ynO{iw;+rtpE{ zt_>2Pof?5XS8Zdmbd5OZV1uN)N4`8fJbfA^k=0jxNk+MV*o=lKiUO-@3-e)sL~vu{ zSFne#-tcy#Ix2^Bl6&gSMXX?W8If5p;CtUDgPv7;n+eOvf6m#!B(8^1*iTjly5Ey8 zFNaLQoyM*t*{C>0QvR%{BO@_^hC)$Ju1hcE1j(r3|Jb|30<28M>ObsHEOx#M9&F)t zBZYRwg$^VOcjAj%qMzYpOk^O>Fxo=->t!I77p1@HxYVgL9Ku#G#f%-cK-NB_BDtr2 z88SGvz*B?jV89IUhtR-)(2>t6ph~^9GYhNQls=7LGQ$sJ;Ofk%(i9qC@6XoZ&)~uu zmmgk%`w7)Q2mFgD9gR*SfJK}pi!2wSd#_d^grcEMKKlMNZWj(e!eS|+L7SH0&@~0S z+r(DaeS(#(e6+ZehTq?H{lU&U;bH_T$K0SS-{+W@X4S3mERh$qB6Xiv`_XuW{^Qxu z>I|Cx4Fy8C>rAuA8ZE(YFJI-P1jtS6;gMIlR!-`Sp8f=T9NH zYKQ;)1{X{kYn!g2pcCF&jztvRmP7+()gs3NOtsd_pDuUub`f{JWB3LH?F&qJG^^Q3 zCoY40I^x)W)O|e{=r6xz0;#hv+7ep+^Bd|*KGhPuTWI@uq+RcGI=5ux&V;&dlq@HO zIPVS;wkJe|AjH?rGQzz0Ve8{znEa^uL4R)7^hvzcC-n2W`xN(>wJ&`)uYXDQVO!Lt z_R+EIefgM&Fg#j7bnj{EI8PcGwvOvl$FRiL^|#u~hOYRIsHz}v6aEygo7^#iNArbg zN?dZ?_%qu+5TTP61267fy@iKGTb6z#T;Zr8-9CclHVvJWb$o7XYey(onr`F~<;lo- zS8ZOBpv=B8`x6uEtYqcYjvY$5KY+2Q_7SdN)XYzQhR!OwuXF4CP%c% z9Bi)G1Ww+qcKWJ&;Lig5mVad*^D$=y6zRXuKg1st!vDv=2qvN8pTfFc3bJ28!u9nf zh5dCjSBu?)tU07c(QWr3$&*O%Hb+$dTs4sIecHAdq4>-T*%ej%f>e#-g!w=D1Kdtq zOBv?04Z~x0GQ{XyIDLL^WFvIxp;iy@?QKtn@@M74-3+aKqS@kfX2%-9*2c)cuuCRrF~Se~sbN|=E+$H?6(!bxYi+zUIruArV!V8A2{m^b zclL#Zf3*aW}mYFp_^n?OpQ#kryRZ@ zODwlwi}h;37mZ8I3p>Ij7eQTPrM?qof~wXg+58=hWR2x_Xt9>R=Os$ZtFczYmP->f zMhi7?L16CPEk3(sK{w=seCq$?XrtMk^5J%5iz9ov?jv2gf6Tj-u9+HPN5om{7mqhpv)F0R!i z>>79rEW2wJ2(#4|{g$9fI250s!Ranh{ipBOY0*tJVr8RUMx+6`R$kh#J(#8# zY1U6RsQ}O(l}a|%%~Nj}LY4L?e+HhzhQ%nQUlkM!2*gMp2U4x@V^CA+kQUK5nCiao zWGwu&CU6_{mzn^;3bBT+QWT6d;G#u=_)ObjRH7zz!Fx%N{w^$KK`*n6c^h2#5OHGh zL~&J?YN2t+62);5u*_J*%V*iIa@?yfnoMuIyTN63R@McUP?ow};_6bo%Y~Z(_2A)N zt}UP(oib})kFq=9E2^Ry$&i z;x^&*Qk7@S>+X$#8(rq@xN_et-Ueol%rcvqv`(%&C+(dVhGp*m{2FQbzF=ADELT4H z>B0>jt=ghZ+7x_!$N&8+t~f@UnGMn)&C(oP>L33>2p0VD~6H~$MdD3?=p?gZ~0=v z99nwP+eV6F3d!*Gv88R4EUSGzQADGV#wLHQcAf{GKbBa4c1-%7@^$Imj6-OQp8}bE zXLEBm@q1KVKnkUlraLA^c;xyA=Khe7)imwk`9@haXES$x?|INS(BVPN72s>LMO~|-kSygJa+9+H z^4~L2LZg&KYA8`6#Fz=4`Z`jcuP#>k5bjg8Bh^!}6UUMKrQ1QgW8RO_ zv|8!ZTh-iAy;Xf$wvNaScL3^1{tVWwn!&_+Yn2*Zu*s@~t)^=RMO9>YjdZ8U10iL$+BGlk zqVUru-rqWDNXhbq=}O(n>!)Vq-k;1VON-Ay%HKGd9s*6gW~0Q)khX8F)PSfcmhoZ+ zB@ajzz}T+X8F7VR|CNeY&80uqIC(n+&Cjc?iTU-{cHN8s6&vi3=>*$I?>L48CM6h_ za`%<-v;%4budPD6PAo+02T$ZKDBx0;?N;p?2LeKJUHz8OgqcvZ#Jn(QFp!@a-^{GQ-u#-Q>FL_!Fs<5P5|*tnrX?$6 zRlt2CpkI2V+7e%g*0fTP1brG6J(QDCpE%?XmN(M>)}Bp{%N=w8VCrVD^M8Em_Z(TY z0}d4fIi^B*@Zzb`w^rfqv-XS*U+cxHz|`SjTS0KK;fK0b5S-;GY|rqZf~=w#8G2Wo zRuWBNh+a6r;Q=7Rij;81O(t57i+hrlML8u)051UPw3TvM;)u3%6In@9b z#QQ8qQ@UvbXTUKljg8BTKm}?D+xIe047V8-FjFR>fi*V|P4y2Y-*Ij?02lt5?n7B; zOxQxr7-1L88N_8n=Zg4v2Ij6j@%X+moHFzk&a}P!jdkP$8b(~0n;fi$7okLZWu>SN zlsQzU3rz_w!hKzYfy^2rF#sjD>nrhb)TspKv-IVwt35vq3eX~;F8S~8lkJ}5buHbY zx9DkMuV2oC)^C&CyqlB-`b#3zHxqYLnWIkUT&euy$lGJI83P)Ka%^Benv3N1mA@DC zbMg|^@A$KIPjBu))c|U7!80X-wJ{}cZzA?mt2%mS?I)Kb@OkM<#UsPrdj)KDJ~=Bl zFROt%nse3ap{7AylJfxAe=+`NO%L*cn7hlzl6M76wVN9kG0w)2DNV^9MF(s&8sxNt zWyjGSf6rdl8*34WByam;tmjzEho|HQj$B0+#L|?AFigEib5ceqTd3BmE7%}5X`!9; zJDTF%NMq|B9$g-z|_UT)?YjweO^4@1oSQvAY`t3mYe z;c`H=cIiqC0}qv;n-O%tn*Ca?T5j9fX(RYDnm^<9xF%Q>$Vr+=;i2U5f)H-4(b(W)xjjZ;8qj?KILEJ2t1BR!ZuV6jK zF3)jY`tUc0C|qO>`fPiVj2Kw$Y3oSZ^&&+?yCIa;MdT%Fk%@l&sJRkQ=5piO%Ulnb zM7E9yo0i|b&|Grf=Lp1pStGhc$( zx~aA5nKHv`=ZRmN-6acV4hvY^d-|*+0AvEP1duHqkbL49G!M$s%BqP zGsA1qtb9L=A=UaV%U{=2AF$PG<3pBKQSobJi4lXh zaLlmz4%@M=Xe{cz6BlnyD+3GbAeY7aD2~hZSR#v5*o#Y5LWWaTc}+{Eoiq|t9sLWn z^b#YB9(N3hF*G|~)y7aWF+R?-SJ}W^)`QhCOhH>wo^rF+oHR<625T8+mR4Yolz~X8 z$a%D!l#jKfzPI(JS`}#b0pyPLUUqi^k2lkUsy)3&iiO#T-OnUZMTh2XgXXSo3o+Zo zp~a~*%wPG?*T~Yqv^8bvGVb)>#0Kb_*Ax%2jz7VAm`Os7$;T+5g?J3<~hWlq>W>Wc4Bdq@XVR`^q%63KXr55o4m?n9sGE+w$j z3{)E$4C)1#937OS2%?l$yYb$pSXJaTSK~QQ;Zv7LcWT$?Ib+mTU#BoxhdxuAe(wYD`{|vBUrjT&;V|GLMkPmc@MwZb|8@G*yO)+r z#k?N5C2LkJu~3mPF1Z~{LKPK3DCpB{8r!&v@$D)foT>TPg&yM%D(AqE*>FENgkh1Vk z^NOk$NzBai8*bU>sZKTSE11WBZDAOvN|-aD((HaNw2ki-Xt}xmF!T(q1_FE|K*4pl zoXbSLseESMe}Y(rsc2J!A@00l$ZkQv3df4(S`%372JBI~xU}<7cM-OP2>Q@O=%am^ zAGi2sDW0wE*sOpLr`qjmVn`2wOG`Bd7Qw|ekcUf-@1?S^cejPrKQX4P_C-qo^~vyarhwd z-uFLNo$@21TfqhrBm%5`2K3c8y;)k*Y*!v!h+K&k`thHZIYlHytyHcFss)U6s7ny& zJR~Q8hzDQ?;=zBWE0)X=yA8bvQ5z^VErCa@9C66?-W{M&i;D|oe2{XH!Z5^&1C+E+ z;M-m80NYt4^pG3jOVyX!lU%DMO%7taTP1Tm>vU+ViaH|cj)Op(%*O+TMRND=q1Xk z7ju84kCsl`$)|Q(8_XFuj@s){0!z4kYxtiafYyHFTg5dkcICnONJ*^FPw=$NDjMxKluRZ<(C@G z*-pkoiQ=faH?Cl3#IS7xLzNh_ec>H?lBt%pAY*@fuY9iaXXAYnIS2>OiCyEi;-jqn zxQQ>0NCJYqq>l@8`;~_LxOJCH|B*FM6^7`X%k4=k>xN>iCr{0`h98eXA*&4^i zl)*VSNq_ZbiMi?0>DAK3biqR)a_Mi%H7HxlKuZD2gptR!i%0_>q2A#Y zIm04huVG3gR1wD$hIkXD6(pn1pGv{p+yK1##xU~MTwI<8>wQ;2QrzVHyAKs| z^u7mCk{cLOFNP7me?nc1`@p37OS;eWhZuSC_EWAvBDQP^$9RLlx8ohR{)DUeB~=Ro z3*YqjhwWC^*HjuG+w=MV(5A;*ofZC1w0{i==S(e8Vb6TrIrl$=eYSW@z@7}jxbvNZ z_-3TK`7sby?rYha@!UY25`VSM@_;-SIYb z$shwcj4%{lE;KSDX1`Rdgi%DcPG(mO1th81$5$?l7ty1~#+#DI1m%fGFFb(?QQVI8H zPdfB5fp}?j#Iz|?6IEcCVD!MmITLG(z+XuBVhjVg`61Jm3!^!-09D%Xa9TNbPqF?Z zr<$%vg)&{WZnnhd%n-5kbJPvGHwcN(W;9&iy8|_b*?epcqn;tGU3YBk0Yl6*C^4v` zyZ->18rupZi^%;jp^Z^N00maXt)eij8QsbLo-p`nQX}#HIn?RQ!IfQ~{72%NzBY67 zKmJUJ4fs1Qj4dJZ4A&U+hc!%Y)BuADcG656=olx^=kd>eRjzj>5zz&&S;epcD#zm4)xni6E&h{Ihp5Mk z&PC2Jzf8J+B0QZ zd7S`<9w;99o^qCjMi+(SG>uM)9Lk38agzG3Tv-ML0{aYhAhqrOW_Kme#}Ey0p{;~S z@2L1W48;uYp2u{?RgN|NHtaj}uRn{R|DC~yb@Ou@m@v+Da`Cq*uZbZQVez5lkcZf^ znUVu|OzK|%0GRuF&@6oV)C@{)U0kh#+K%q{{wKaNjIci~CZ@{Vvj`<0Treion5kmV zlq&drQ@EWNhC(3Vytou@LfF=_`K=U~Ptl^(6@~{^MA)=l;rAjzAvf3oko=MN^xkFB z)(puv5cL3iCua`Qw`xkqOY0q4a|AdXbqvLPiHoV@avY=&uuDrOyjnEZ*E|`D+FHT) zbc8+d)Ex|r^DnNo%%JesoFTP-eq-{DFZ_1SYv&d%v7k zOQw$EO$Unawf3IWj9$7-yu%f$GAE&+WO~fMuV(3o>nVdeA3prKyBnLp-YpnqA)Q)ab}uG7(BWP}%j#FB7&6^hoItPeQj?v8IItxluwIYvWW? zsfbSqlA4Vf`3gzTT(YaRWysHXWorBAb6rbt;ts&M@wfJ=E-&hmS==Rsxem-fE5sOa z?$ZUFO5a%x{a^MEVS+hnk>yL>^Jk5n0EbMh3cz_FWULm|0ZQ zpf~Kj58fdtUD8^k(k{p>ZrC*(+=_>=x^VG(2&-LESPfU87;BmW(kwBm8s~SKAP=29 zDRlwaHD$UoJSH)!o8C#M&{MeZLj-|X`!A^w(&Y?ZZA4Xqh)9mnjp%xDj4poeobh-$b_jrMPvHar@f+y*>|oK~IR8GjE)nF$ zDx`|aVJrzY?^^@3($$>UPe-uPeBql56j}qtfE`LPn14>X3=p7f{@hheVJb4q-HgtT z+LoOp%#iqA@}+p*REr~;@YlK*x6L)GyDw1O3UQ&>r4yc?zLzdjXogD)-jt0Ae;A7YQaiL$ z@4)ejH@cX%;s3WPu328Yh>1^l@JUY2H^LK*41rLL#|XFl)5ZUZ3aM{g3&HI0-4b?tQEWtiR$;d@*`D_c|{^LQUq zoN69SDHX+IyNIz>YGQE=h#u#yjHRrNH$hekT#$lrn;*|u&hLc9h?8ErLFf5^_rR*MXXPch&=*gjU`n)Q`f~FJwfBS+6m(OB3 zXFMf!9RMAqt9CUWtkP;~Z8-B*e|_vF=eKKWb`QvzUC=s|^$#bPAHE1%3~fi32&%+*YvT6rkI{rHOW%RJZ3Wi>-oYyFha}J99#qkB z8ibUSJOH(pjElsPpTw_w7D9i_v1$s(Q({d|(SCl|elr=`e6dr0YZs*jh_pRol>?h$ z;YXNGjon`SNk7#vUjsPQfOC#y0wr*^Yt!}(q};}^BggLmR7rqwNMoIII{8xw*Sok{ zPdNrU!S-)4=DQ|xm|3-nkx!k0(+XJ0nwQKC?y9h}aRy+O`>yw-icUR}jBX&=nSfMp zz7zjeV_62)wd(D+fvNZvGBJN7f*vSKKKQ|Nru*KI@x;)SF3T1?Ht-u0;3D&6RI>@v z;vFHAE9bN;$bbR!bDBS4M1v6{Er828N8Jzq$j=hC9viBoWvyI29rUXxIuwm?PL~Rx zDjn^on4wCqkdX!MhA$F84>T+ezxee*S{+%u#x}eU|H$pOo}+!6``9x9=i{tPiY`T* zDwa-0BYMX3Wl)`NcLID0g7;CF$+E{UR)Hr|?**7BxG-CnG!N`$&XgTb|HcFi;m&ZQ zB<0GdwM)susTz9?EuJuJ8y_Jhn`Z5IGi}EP`|*@0nNWSc^2mQJLm$KZ(awT0o(OzW zWjV7^8^mZBBF-7^Q4OquXNEiW3Dqx2G}K7XY0o~K4BFGryDV~1mvQQ4*yM!@@BDSE zwc@Ty&Suk|b~@x=|0c1bzon?jtlt12N>9r4lW5F%&Xn!vOb6#|hcZpIQKMp(SB5O@ zhbohVh~d{>8W}Y?WX~*KV^9}+PG*|d9Un}h((Cs2;QX;Yc%9OW4r(PzMB#trNGmX& z)1gdsf)ry#RY3argHWnB&C!9bkV2`5g%IV|1xtlzGvAGgOIth(f*3I9P^f7idjQqi>55z9k^+&xg<;)I zw)TvijIKL-QU2MBki`0B?4NaCNTjg>5Q&~I>vHKyXDuv(QYZ(#pPy*|rDJqPj~NqV z4lcem{bR*^xSE{)Jr~J^M84VWneBa&S~`_4YmFeGwHXB4o#Q$ajAciJPU@gIBOf3- zX0-?0YsvksbyYvt#=I^Z(Hb$V67P+r=%);rgEEJ}s5wN_fazA8q@ju#%(ab-yoW@~ zm6LFNluM}qR@-m==3bn_S&9Nt+KhbpQ}qXa1V8SthW|cFhxPzdS|e5-dq^Rt@wWFf zYXUmGYu&n(eq8#L z6bEJ>m9_KelvJP5`R=a%N7I0OL~TcJ8`kxj?Is|#g20eAzP71WJtL5-tWl+C*wCv* zCNol3sp~m8N$7Q<^Uc#!SuaDOhzW6H=0BTK$g@irC#T8=Yiiw?g!4vE=xJ34 z7VO)CW}mP&D`6cjlWy`xevM9S)}Tm?uU{py((#tjiWl}d%nF1hbGkd9Q*8ptwah+A zsg@Q;72g7g;mLz~S-)ZXVmphTy2X`xmg|#TdF4HVb5_p8Q6rS4Wq(K2tqiLJX!?!u zf4~KZn&#LjeIliKX4qb!t?3h)Ghk5c3}N?{3H&!GK_+>;eQsc`0r?%P`1yz=rDn7prGi>)Wky$sNET?5HFB|-bMj}2# z*=>@WL#u>P!vh{4k5jmf84eU|6U*6IuvSU&$Wt+KbLws%;@+t@{i=m5UmD~El%w8B zJKf{MZfE4F|H-uQH`MMwTq$(~Hio%vb-Hm@@lFKjD#!sXJbJw9$PS%DO0(WiO3QKi z^O9(LKz2%kuJg+q9i44B!nN&@^`(;5e4A8Zf+j5^J~fs@-2;usIjHTVO0f@b6X9tN z_3$v-$eZ87GNt@nuFZW&vs|C&f<9JFFr7~%L{S#DRyB>qBu%TlDIYWMH|&2VO40oe z#fx5?-%BKW0=e+NCww;gAHRtPk?>eUs9onREGror^fdFz53M3DIyM(ci>u?S2kjmY zM(4BbVYZOw*!Xe@uShQruDDn?Q|SRD9b=L(FDqe?$%gYz$SbcEe-*osxtEU7}p7N;LF0q4%wGhK#pjNhzO;X0tO>G`3WQDNDTb&K+!qIbU*eVi`gG7Q8OY zb#6a#LA>x}9b!!%w=;0()&|~)xy_TmA87vz&O2EeN1!e?T**O5R$Y(IU4+Vp-q9D1 zJ!!W|w1|=N(uv|-e%nYN>o)--%if`AW|dB^{I}J@-}pFIy`#=l>ya;1VsP4M*}KZTOn4OCOeD z#0o3fej2$?#_$EpxE_Kmlc3}Sv3UpsI zz4PsPRD-x)qtEWs^fwqRTGNfA#}%x~_t}(QT1g2#pusndhG6}BgEZOy5XU@mY|>xh zh}tBcX=&_)#KMXyBu9SGa46y#jjIkt+bb_^T*kWL)OZ4F&8ag%<8bod$~4~l5XU^Q zv(FLRS@cm8X|JkoW7Z|&O3iig6TUDK55wpHO3xMbN%T4tJqk=H7n&iDh%tYZonu?Q zd)3vBkzpj!5Wu;Y`#4bn{-7A;6EeGdMwO04#@eE^OJ#T@+bzvFF9rWrfTBr>&D>-+l-ToxkX z#W+qz#UnbAm*&jC&_UJTuv%YI&?ZT7i;yoCQ#l}uo00DftU3n!He57f(U~rAab*H4 ziR30;$SeF$uH7FaGhKi2-Xmx~<0Volft0b&q$J*Y7nvA%Cg2-s&wmG+kFYk#>U8^` zNHpi98mtB|C`>>Y4nKF)78gES-)!+xX_y?|}X-cXyKiYv1P# zc!SVQIP!m@5oJnI)(v~>uf5Yk*E6a4W54S)FBR;){7po-uJlzfR^_?=01-VZl9yJU zxE|>9VzW|l1-PTk7dGN1_3T^$TReK>RfOhyUW^Kr$|+|~)D$F>^|B0dyT#aAx6z$z zFEKFxhZ&a#^0LC`R=gb6(V6ifrEh0#0WhYP9z6n6F0T;R2jF~A+y*;<7NA#d(y6d)KKy6S|PM4)DB{XqXWevv_2uV?Sq<2dCV?nnM< z-2^VLdnI!3HWZ&V$iFhc%8r;35iTx$4SrYUx&9dE98V2@VY;Z(_`Z3$82(l0YVXF; zuIFzwSEXH7^}u`83ByPieO{975~QTD`8E(%U-?T_d6RmW!r{gry&iVTSxu7K=Tvss zm=(@q!W?a@IeMKrSitQSCtRh2!3_AQ7n>N)l*VlhLxGHK@wG$@ip}vE?h1V?$=Ns< zWB+vP`xc0t`}3B`<{3fj(k*1lTb_x*s&5IP)6K&|SGB+F&&OT_%Qaz5 zL>X@6-`grx+4h8}i@ZY7N{m&m84O)UsT{d#xv4ev zwi$JgrD4p0x792vi|f2fHmCB0>rH#)(;=Al?n*HNcp~<*PuwXaVOhQ#9-(ALJcZ6| zwO-3dnNfevKY-d>Pi=MqLX-bz;|@`d2uvm3j(KlIWHlO=w$jOumQn&A42eH z4w2=Bw`=(MjaUHd$-{qIwX&M6B52#8sAa;|Eogy8zWcr<$Xa3 zGyloJ#v9BZT?GQFoW<1FF^KCDX4w&VgsnRWT$~RjY;7(@9yg(Rw? z)X3~jy6qb7aj(=*j9=7ZV^X!tFj2*eS&&sX+o<5AXHHn;qF6~)Px(nLL`Sci>zwJ= z8W2xtFvUIQ?{7z9zAi7or+EA!Tr{&aW~@olNaDXqrM(a}K$a`-ldGZN1@Zke6yo|j zA>4>|I=oZB;E2vW{y;J8qLJjNRn<*_Fv4Z~pqE$fSaqL4Dx& z$&;fjnE5kI@n+AKh=OlyF+`=?F|U8eMcd6ISnFdx(YLM?MslC=eJwe1?Z z!U0mZnIf4-Aee?uxd(A<62n`lI$Yn$>_L*S0Tr?%q|Nt_ApN_ ze2u=>8rQ+W05w3$zc5+g8-}5_5xA{DYcV($)*61O&)Aa8aud_%u$CE}M<2bGB4ROoEq>DTs@eXCP`%{8FpOuHZjFda4oH3Wejxf$cJF{b_%|`hJb<+_k{1q*L zwOs=(=UQ1Oy<;w&_RZH)LkY^O6mpNS066W<)PZ!H`U=a_*Q=YAOf0xQe~XKQ(BJH8s~yKB)+XbgOGSi8lEn9 zvS5>&-`FUD;}@+#Cmy=dksd&Or+UZwRfwrLq*`V1HdUv81m;M5Q9rI0uWhX0yKunR z`-im|JZgLCIYgKo)>3;3l~U>Y6Pe4JRLiFtjhRR}PFDrw!oFz|*WbHC4osKE988#+ zRHQ`31bJh|U^`N7-WotuVRK77m8t)Fowt4U4?xP?+q z1Xs+AeAe)$cpR3S`({?d@0C6NuRgg)IBlmtjDRB%obI3QJduO!`}mjO;g%&GB*WLq znnz421V8k8(r@a^!9;|sOuZ?u!-5-)%WJ9Gbo;o2IhdWJ@qQgth}9PkjE3|M2wbYb z5vwpbu+<2lfhr|i>WYKH+2~@DJalXdq)sr6pZmJ+-iW85^3z1gPJ10f9n_&yD4V#) zbhd-2(xHx$2)yjg%E8LZy7qJTL1XxVcGzR9A+W-aA5I>^~qwB9hrSVR2 z49RM;)LUUHLSf;u#Lj|j-dRZw1ST>=+LbKHy4+tfCpmU$C5^i~s@)Vfy%@e>7_R0o zl|3AN$n*fY#Tu@7(3*?74IG%99QyaA?Ys_a#G8OndM-~gFLOXpl|t`Q>9d8KCqgI9 z!c@xm+`vR4k8^j#ATGSFQe29Gg75=@S?eDu_yPMle&+FOYepQ3_uK<>~xYhocP!~GecB8 zvZMJrXgFNIJH|L6sJ`HpO+MD67BpCrj5{J;2ipArsg;F}4?k7GzyewEG91RLY8ak}W{Wu9aVr>5?; zSC!B^{fc^EV0rno=DZDbeAR-KFB#H&^OEhY-)K_6D#(NjNavn{R(;6Iy zwQK%eT>&epyg)~PbpXicH71?D6a~#0FXe15GemU>+ss_~(>1)SWEA^xtH-6_&bH8i zjIpLYx#~;645>hcpBmY{@zkvprde6~?l%c!OuP2-CnJ7oJFl#R%95E6XSFeI`p!tzN7ySuaC`r%9%!ZO=11I#;gWpcuApOCfNlD6UyPjhvT z@Cch-?4|*949crjgwjxMyE1?sW8DSNwydSVj#grMtQ-c|lQX~jKZZSe1aLs7&&$<~ zW{~m>5ztEqoki{;fIVG|=It96(1E5Oz4lMygMp8K*nhILz#|_F_NX?r`oq_&iUpB8|8GfvHBA?b(NL&oy9(YWnh!-7E~P& zYFIC$GM=dCl@p0~L0|3kdmzUkt#3YwjjYaN*uA?5v7zCDIAxQ*nR|q9uPla>?m?Z^ zeKFoKr1y35T6z76cc1>e11XmYF}5@d+CanJ$_1vN5gjL?+H9>gXFNDE?*0wLgIdSx zU~;QuIN*Rbka+yYx3X(mY;HI$QX8ZFWlzh@BI2ge%G9z)k*ke~PXjaqoRA0rp{k{8 zjQ-8iT$b<*4my{3ElLDUHNN4aB{e5ppZ%R545s0#pWx4g27`X;^>oA>#LJ_>v4+?> ztxpyy7m{L41zTVBHDBA$dSi6ry1G{kP>raJVvGDavF^AALslmDrMpYT2^u?BM-dqR zMPcl{@m(s#JI}9{F4h#dN~1wCWDU*Bb3>@j#7Rl<5)_f#FqI$*q(VNIj6NlUW^^2y zXZxA+-#UqJ_SnbF9eIhkO7nDID zV!^y6Ip%Iy#g7dJlp_D_{!MUch0fhC## zLG_{^;oCa{`KlK$KXYEZFa@I;x!U&Au1G?mmShQdKfd!;?N88zfpIv;(Um9lZHRRV}x33M4D^Pg} zjy$*VpnSap)dRiR=En@|xxS>v-D7FfxV)q`a%ywzO=2WhbNvmfw?MQ5<>UIuZTlWg zFJm#%6kV4@mgJeaLaST+@SuTyL}OD(QRtx#22`6{_5=^YaW#`PY-(_s4Zrzn>Mjvt zs(+RAX#09Bwq^%cr@f(G9z*vB>)-Xfo;FKG2ksMg5*ukfe4N`C@*WL#BH z3-(M|EMN@V+FyOXy!8bp>kK5(>gnjIr%gO zszGtjrn)||HV=FqW&_iL-E(wD(F~d!DNd%UwQS(nS@tYa-O4aiE!f>9J~xfPNWJyv zqc@bl_36OCWr;d-TMQqVX&ke5L*Mu-v5DsfK&2_4J!X*UVO}S~E-lX~F2$*KL7gWm zJD-2&V-V4<&}dRUf6EPub^V=0GTGJ5t-zPPFgA-$4G*lS8r!Ix9!+2?e&8YfJdGB| zo;iZ0m%A8I!M4n!**$@+=O(T9`ssrKBBfDMvp^zSk#AP*I__cd#ys8npd6`Hs-v}5 zaaxktRMUyrm2?vzinOX$>-(p^{dD)D;FWHij5&p92r8&!8vZiuVmpmz*S{RPGX={- z&bH@|r?RK?MntB@Pe>~rlQk@=e){jvuke?ZK`zM92Dou$fa8=nHTPM6NlWj zuiIUMgVVzG(SkDE>P5BX*olqO0_dFf(;+5)UoUX>O*QWx9Jia36;DGdQWk%_7Tp!S zFfcb?L=WJcsXI0_GuYDo*yD(>ed);~AOTJ?GQ0pO2raGrwa?Lc6Gu!D+nyPYvADWm z8zUh*_`J7PDxbwgjlFA>sXM+rbtB%r{oHwi6Gcsws!n&jHhxk{yTzV9f~QBu=?Wu3 z3Tj{=YhF^ORfZ?0Z2wQkTD0Fcyga6fg5PaQ*qMWye+vu2iy zQDF;E5q2ISDtzrP@}MixNfE6|t|#=9e%pAIzN8gGGQ?dnZ&P%R~^1)KVRdj7{fc$Z(8J(#oXbU-cG+QPHEiBC%Xe5c?wMRzWwo`_I%eO>J1>+ z>%iPxD5?GV1}b2)=#AB{Hp3dj1>`QDwjMK=R7MdD{$R$1|IdI3-8n#S)d2T^Q?L`)I2;A9o+%$QbTw^`snGM0xtHFh%(9Yq@JG5ZOxLnB%-)Ev{F!6A z^om}UA)&Kr&px)mahrSW9awkTy)QvJU8O}qS7MlL%+X*o+Iie7`;Yex`bvIAu6$n8 zU`xW;w@)e;iCJOCw5)^T&R#iJ2f@MCE(Y6kKHYYz!{6Ty#e6lB+P`dN%W*iLaBwpD z2|t~UH+htd<-s&?{8@fm2uztgPp2O=Q0BkYU^0M7v#aYCXbL#fo;^xCF(DYQT&^OU zk6;XSKr?Vbs!JmSIdd~iqmR$2#Q0c7hO(cJYGn%q!WwtkWp92!E!+XNM7s1xujoV1 zBGFXL904x6=({qa=KG!Yc?){AD`(1xsTrEt^-fl@TcGf%Mpt+O6!tLnH#$`h`sfRa z5EZ~6rPDc3irk=Tx2y!iWGnZeHeax&{tjb$m2sYZ=izB+=S?*@stNyIzns_OX#_do zfIx5|KVq)GKqqCoG7DX7cj$O__xJ=2#dC8f<%AjNa_ZEq8uBo}lyu-$>(+bX(*uNQHhXNe)Z1WUC^Y$$Q|NWo9AH3 zH<6Es=38!T$7fse-seG{G#fk>-QL+m-J$8rK`@EMNcTV8I{`}9oqo^OmBVe6(%)Ks z7WlL6`9b>4{spLO&8J#UV)g3UglD{Z#!83ZRvu&srGsI`X|F4y1F`|8`Ig`Mz(<>u zQbL9zNl0e5g1sPSDXZcMSYQaSRwI~}J)Xnr*8CmmtB+-^nJU0&bMbkr(_}f6Qi-=j zU7Z!D5nCO5HOERu4Kw^OM%ee<;-DcD+5kt{FVKFv8@yCiu#R6=KVd5Y6P{q zQWo@rD~`dgco??H?VkqXG4GY^xGfQ(lfQsC^98#vPO@ev*aaG8ozuoXFVI6Cc@1Pll9b^IBm?>Y`U+5ts0Hr@LxZ? zFYbpqU~x1QnBkO*hmS*|AT(@2A1Y+0xXGgqe%It`W2FMHXZ$3IKg76e1 zngTjpZa{n1Pkc-QG?}LLA=kx#|DI`4j?0+d$Zrj9^(|wU~nN z)3MiFkk7Eg!Ta&rQ_`=m z@-)-Fw3&@@U_3{4KWz2L5)M+evJr#idjE9rnbCgjdg^u@V+1am?sr-YJm@Wx&91Ww!AmHZJzX%Z0tRLF z@rRb(Ajs;~%cxV}{OOyW;jOATg4z@{18mhI(<1-!T>@*o?mWx*tQEs94~xkx-_l!6 z88r8bYZa6iydqBF@PHg(c{R}k#FARalmIs2(&QyH9L00wH|N{3i;XkVCl>|^sludBBahK8;}h|XlBg*f!C3q(>+r=B z(K7^M?i}5ryT>_}7QLI{YF1m~9C7$mvRHl(Gy0JEISTUmv%Z78{Qu&2rX*rN&kL@$ zqbn~GL%p5@+#9G9)49CK!P-%7h3rp-#%7x*dA_TCk-5km;VK<%ZUPX02VK69w`>VR z-wO1cziHXh<)4A56(oBQsVf%j)j>apqREr)lw>nY09^Z3mXL>0w8%JgXAm z#}3oGb#r`(p>azC=6>fie=x||`3NFm|?brM7lf_s+&(Fap4vS$y4 znF!7zyr}H+U!p)<82frN=l~922tXi?N3P31rH^zNK3I=RTlN5f)h0JwtcPG_PV%_0 z{}cVQ;y_(|6Jv;(-Ygg{ixh__I5D8dE44Es2PPzGE=n%LcE&1I5lyyj6^j!CsHH0w zhzEZZOHO*OtK+(qHAr}hCtI5VSebuJ)YDubAj^Dt^Hr|S8Fil-puO8)O#Pid&%H`A zrryR}iS}Gd+Lij#SKgGgsoc?t88iuSU^aV9u*`)>&xk!5a&PnPW7t?(;A=qe_03}$ z?r?bpsq6%&t>fA>R)jBY-ZI>ZIa$~U&_S7uL80PgO33i9!X%@_*l!(gAqik3oOzP# zme5eG8fGXo&;B(h7YNVd*@_#>W&c)n4O0b%o%(X>uaUYEOi9zxJCU_&fA;ESgaeK% znb6(64X&9CLbF3X`fynYCQZduiDDH{yziuHhKw3S08n;iaeVb(rXVV_aD#1HQdh0I zzae}Ig@;H0p`UW1iiM%Y-LjIIUA*AODr=V=Bi*wWUH?P1dB&v^eo3Xb zVs5M^Xq9!H3)B7(K5Ds=&ZiTxq<{R2_4A-W72-WeWk#aKtCf z621wAaNzCQ#j4vipt^Fm$zd9&mPn4F@K>zOM9n#&|u$ji3BlJlf5?JN0Y_9N0PjNSEC7dz|zytm+D2@I+vZEMaY z@Bg3Y9_2WnaOj%JyR}NYbhQE{lZcSO%hw_WV^MxKH8JtqAz_awTHE7I*xN|UQ@TAz zaVsr=KR&J9TDOfEf>KPhTy^e^lGAPC=WYIA2Yn=PrR;LYgU9cFMcWHlp}BEk-u7O? z`h~JYoevZ)e+p5=Pkp^aoyae21n{=w@u&-9yt+CY64JE=f@xI()fG++v~)PWvSEiDl$zR2jxxvgZN)^x2M76?VcgBof<&P5~43($@K95h!?q{mJWa{hHLL5dG+~ z0zYK0ppmJPV$%T9PQ33P4TgCe25kPJ63U>C)<*_s)@hG@4DFU^kx_||>mv*jW0Q7m zjK6trIO+86`pS-*e`Q~*lmg+@CL~Y$vI2tGvmoXLNkO^M) zE!QcWi*U~9i{%_~rpT_m%DLSYo$eLVndEz!&(ewu#CNw;;C&4Mg%x{0W{N7c6QPZ! zm~{uu#eTq^lx-pOGv~%4EB#nwC!k{-%8Jnn_;aeQ>nRXxTCr^yFBgxNF+=INyB=Lp zjxr$m=a)7F6nQz*(7pJ{;t$DYMr~YFHuHQK1o_aV0UGn^k38x)bof19WBsT1)7Umm_`euT_Q)MIVd6=jM+Te;rBeFX5T44J z`QZryKlr4Q2Azmh5lBOO+pOV0GM+0=&THO2ix_1oA;Bk1S4X4IM*}(bZDja)oXJIB z_Q-NC8T7l#+#LIV#!hA^DOM~kyZkDAD+1CYsFH!H%O#95+l(9DTYvyHt5A+bVlw&& z*p_ofbG9Z6cqWJo;VgSMIznKBNViFN-4S=wD@0TWiuv5{uOF_kqac$~g`9lB#jn*r zeiO`Qwe6o5B^}L1@_!=4wr`6`$7KCUIt0&n3=))|GqBW>KSTSOk9l>M&uTbG#0tc1 zFm~6D+*7g1n6xkAiNkL^1QD`N8`$z^(4lJ&U^tdQrgPiRWD1%8Kn&rg z>t}8n&U;c5_DxFZEC*Pn4B0yHC6G}eprz| zfae>oWo}r%-_ea}*hgKR8*RU|fS>Wom}j~X z{x~=A)a1ChmVE&V)?Vk_croMzI1H!Mhl(6;4=&{2TK(g%+kh^q+Vy!T9ey39a>#sT zt`#It%62bKMOU)4rtyW>jAhjlt%CDidNWy643^6qJ)8@-0v7v$ z)lKHDu3A>$Xl6&Ha(d~zTXWQ~iO5pFfBkEH2#Bb*ij6+^GnZ7Y$#PMRxp`#GAf z9%R?9&xDKNxy6EYdKl96Xm`d{Um5r&f*T2F?>C@jI$ z*#S`YyvALtTe&p|PFRllvAdf%?!JCX4VNRhd`|?8SH;sAOyT^hf0zkrfCXB8;ppN=!hAmvjBt|cZ330sC zdVr<=5F%Iz>QRr?g5xi4aVoSHf9b*-Q?e#%cPck&~glGR{{JSpI1Q z3$IFbM<|K&1bLYP#7zn>H*|Z3252>bt=`sevjd4wv3q~08`yVJnhS6Z!D}mgxWPOT ziO30G7&pTf#whzOO)xjapOfoO+H0(MlP}pyo$I}hA3mRo1}WG^=gn$Fpcn|xy;HsC zxgz`lAJ+1h93|pQQ#crPG@$QVWc4i034o|lTZ+I7Wpk6`nBo{`emjDMR>-v{<=N&E zXo(^!ztlgX!f6@-+BWm36?qbsA`U{Cc|ZZ{@Jeza(IC4Am){RiRUZ3MOi-bE6WV(g zWG+8?(8qid!eBT#zMJ39OGETGd^CudpWXDp;|-%-m!C82v7ERwY&*F zHFYpA@gb%h0_`!)G8ci4d38gY7GuiFZsX5L^9+5cH$Ugx@OEc~{i5TXKg7YY2y6t3 z5UgFIvqN1j$y{+f1o$I{l{??{0{d0Zx|!||IKgD7iFeLJRo|@n0~D@JMr0)uRZmr_ z4JR(}*p$nKQ7732B?hI8$b^(ME3P-J&t;WrFpVi1C(Sn`QedAycMBCLGR<}4N-~F6 zAgJ~{FByD*J*nB;Pj>0#H4K%1%x+r>l`ELnhI+a!hePJ$G=A$`p0zfhY3kF7l-xNr zg5lhWqM5!I6Kb<0c!$c)k+jh2`e5tPz~9gQ8I|nk3Y5&0cx+?|f$L1;QH*w`TuW_H z^}3KafK;snfw%v-vjf$NmxSM3orK5)e|PgwA)=;scA%YA2Ikja%SOK6H?=cr6Ch;5 z(kj}#&f&V3W1gs_i-e$iV1z-?%@(`a5sAW)B9X5 zxALPiic08E$2?`$Xi~TghiyGlbToZ)%7S|HdRG+KZ+b5m;K+pZ3_Gqe&u4EggCq9~ zOj*l`9kOrgbcIjw9n_GS0zdl~RZj;_Vwyds@xrI!$xa{X4VF?x;5kLSh4^?3?V^d8 zidc=l#NXs;2uAlwP*9ohW2I& z%J~e{Ch&=m#)4V=5*XAA)=?9%VLyFnW;p5wffS^FDLT6?v-X^$%Yw1L-ZQ5;ngbdU zq`njFJ=WQ-e(S6O%|Wl4Mn!^@(+jf3^x4Nty&(E1F^s~Iz_IgHZt7c$=sTh(Ujc)9 zE-`)!779sD&^>VoHVIqQPg`~f}*!%{og zSw1j6sS0WToXJmxC%tHxumNQ`4)1+m-7{-=2NBA>H;lF`ty5;0UdeFsj(rEiFdh%Y z%6NZcUbiXqFKCiyBmvP3>vs7B82YrQHp_Vk21wt)BA7g()nJVSa_6w!OCe3z3;ag8N$ANZHg@4W7YOxgIb-jYkslwO{=IL&<{)`F@P8cXyLWa;cov}v zG&7V(JL0mEQA6RhRj{F-j)WHu@fcGxWpz!Z+P_joVvS$tlDCwd{%z(qj>cbrQaybd zO)g`U>aV873U!aMZD(}b`1+1M+$5{}O#0_ywI<%Q+b19;G3*5FDecO=z66LrCc`m} zPfa%Adc)d$L`Vlxm}(@|BD~6-hl4#p^-Js|947Rwv#|0B>bROQ54a&+vFMw|ho`cy`cS}< z((%IGZHYzohy|g0VPJAHUaZ>oX9Hz_6jS)$ZPLCPDK+rM-97ShY%74>CCFjS@UuPI*tLdl@TY$ija>s~!JQv~zhRc)-r1oiw-WJdixxjPZ-*TN z5n4?Ybsm?KEHW$@)S~?PpJLdDQ(^d~;22~zA9SvnP{SZVY|@6UiFm1cEAmq?Va*|V zoyCIV(=N7E=m(skM6q5!w_n_Xpsk=KU?Gs3;PkDX>Xt(%vd~17bf^}P254KN2YlUA z>LE=`dsL{?&QIgObH}|EUe%aM6%F|uqWOTjkGAuFYtf zxUS=U>SpDfwwu5xrci+%64L4CO>|uy4w7(l`Oi}dXzPdmgCAsB9n-mw9EMX7gqj_V zs+}&pJnne-tTe4G7=Ttwp=CBPC7y;gWKoGw^K!p)yajS0uQ+b!yDcS`B1+@&aukYp zFD|d)J)M550qWr_H7v%X6)1UD6eb!+YEMLR;ihnbfwEKWPkEeZPA3==fi3J7=Rh`Z z+A)^UalM9{Jp*?KY2dJhYIj(@b%3A}?t4tx0nFw~1_b40zA@r z6~UyfbBcQx^W4gSD(2=~tT+TnwV_$~rkGt63nYpQdif{#BtiA02 zhh=jZPL^@glp5r*&eQ*U;CR^DC3fx!*21jg>*p{6KR2pH^64$>CXlTiCaC00!hNT9 z{d5LTFM4nV!YJ%V*80*bJFm$cUy}TO5C)BC?`XG5iTPQN`N<^9zL|ec6;W>MZybR@ zD*XMJ3`%l$2i+lX_<1pceaZ=u5I~;#JaIBX&aFn5+RY19bm?`13%q&f?I3@+=EGcj zAlpF4(seIJQI}}XQiIeK_Llu3$aA9yjqfq@lc;JS6)Xoyj!=S-TBSGUP-eIEjP2Cs zPjo?FC+Sp;Xw-n<#pEv3b>XM3En(w{UMr}v2UvA4d0A=C28H8UZPQ|i*$Pcqu<)7v zk`BvLGDZVH;&TDSwRJ+%ETJY=)n45od4+pvoZ2ZwfW&p2$UZ^%_A`&f-&OcLx)j=oJ&d=o z_QDCYORO0%m=JtR81-Dp*>fx=@{2#;5Y7rO#Gn`Vr*<2c@x>aL_Z8X8{69u{E_2c4 zdyea{^NShUKss?lpegShYio(2`!Ivb?&Y9=2lFfRn>i%1NwkUZlCqap?(tid^?Xy> z5b~LE^Y!bJMe6ZCqknNzem|>Ub2SZ9FM25=3H~63D4qpr2eY>S_ zPURp~#3C4$iU3xrWDIKltePLzBd{_h&!y-Rp>je7MaqSRSVamoTlSGWX4qc5hsv(d zF_;y4{yV)-!d|F!n9}FMgQ>y+ff7E|Q_hJ#9`w=LPGjl7{$t{kTIJPoH!#r5SCgRs8?&bxmdP>JXzLC2xvgGj@qRfj0clA%|731{+%2Xc+rypt>| zc|Ou#;AJH?`w6rWyyaLtFZ59-b;z?>zojjs8JcBCd>YJvc5&zC_z7iSW18b}?R4Tr zQWsi3luS#@(i-4INgp%dvH*LtTd<&GPdTzKSFTMRx@N4+QLRm#+ z?-6|Rvqn>?){WOtV@WB=gnI@g%(QIkk!3XMD8v1ZVZg7`+q(dV{!9*8adGywN3)ZC zK*-QsQrbFDjC;veWGzy_w=aGt8PpNi6BCgbnsAbTmkTLoCR)b( z!)yJUQ|+N$YO>f6AFrOV7m*!H7~Xe%bK}&^2o>xz7!aQBuPZ6mpzkD$iC2@m)^{mP zzAvxNwVn=d<2Bsrbu2>%1WG~=Gv0Y{DQg$tz?}m&twqS1yyZngUDf!VgzFy#D-$kB);1{Mh~?yk>o?c$S9pC`EJrZ`9V?s&^-#M}Yhun?Ge za&c~q!z@OxEsWjLU|}Z~G4|fMbEQA6qihbB8N-n~>lnr|PKHF36o0PVN=ly=^ne#r zK4mj7RSEnmh0|PCe>ygBmF`<@y=WK&=;8BI3g6){6`AA?`K8Iz8Vs!bMt8f*PRM%# ztOCRF;-!RcM(GTdZ8Ef7(mvM)*DWu-G=K`L;^uK69O(3GQJW-WNxHgU5^(CV_<(Dd zh!GWG{LrUsb4CmUYlO0oUr)(=D{Hr}kINEEQCF)bpg2zOv~Ob9phO4W_meaIPYWvU z!h}!R=|L1zxj;l`qM6DmP4!KGIeT`ZW@6MhutiSoPV|IA>FOyBCem(%ui3OjRs>)$ zVG8s!GHY~-RwB3;u*W!m0;VQqHT5XEa%|`bBkPte=ylddEeY?LlgtRyj`6tNSa2yy zw5bcSn{dK{AcFPMu_s+R`zq-ShlEwJ@okoOeYbQmv2|)R-nE`ao|{+8gB1TGJkNg; z97B9%jLEn<`#Pvz_sB65kJ&OEZ}(J$fu5|2_(OaEyutX?;4Uz`fMN|L&%e)>aB9+U zsRLR>3kw4nc9oc7S`ryT)-8Np_(JgpBVj_zrX+!7OM1Sus6f70Uz z+(p5AO#{(8pT;96!K-U>Yht+3GLp#7ujW=Uj;4(JyqPprr;kY&kcJ{*)OSE6gThEp z;v50pGHe={*q5prB#+RV+Rvh ze(yU8YGt$~e}jV`>%gE13|sc!|NFvVF7Gm`Yi{^4&ePk6)~?xr;?*cJa+jV%higok z%`Zj6H7S6*|Kv581rvsp&T8}q&uIgUI9YgLH7h#4d&-TGES?X4w+ z7&SIx`!EXiM$~{qFN;QapC3+lWw}!;OQ`$m zO`wZFM!c-+F-8eB$xY0CS$?UnWblv8JLcO*E?0~JmH|)+%#Xp9GD~VnYM;*#g$?78 zcs{oYxirn7m^eza?|jmi_9$zZQNIOaSXI2I)b3~vvra&YNItSosX}vzW+4adC;++S z8S_^+uR&;ki#Sz_&-sb$F>kF(olNeHnJiDfr76r%MxYbREJ)SQU?lX~eRK~oYYgMnm z(sV3r;VP4$3n8>V;ltI;ym5!?2;{>Ap_ECu_vD4T^LS?IgDW6`>jQ?i?VUZmjo%85 z*MJ3RGorye%uogGb2LnpRxkOd|2b81a$A4n00iQpeThzpq>&$G-+z9PXyr%Rt3isy zL#o2E-!FuNVYGV$~GcQ1D%dv{z(`ALRVfBJBJxM&8x*f9|< z@G+I`z%-8MH%m7$E@UNQv**R3MB`O2j-3Kq^OTAinw5JCM*Qkk0@&|rs%GQJ@_h?) zd--7zsxsyTyBZDZaCkBvRaHN3`k-K6Y9j0wX_h;oxHRk|&tUp5qq-^Tv=cupDDMr6NNqIN|N0E+%%hVELOJE!O~%s1V;w!L&LKVY<# zndTgfX(H{KhkIQkpnXbj=>;6$Q9ORekCT7vaYYTt-*ZIpGXUHo9p`bs1d#&+9T+zF z5A9$`Kn=$Z+VEuMQ4B6v@oyOAN=YV;8_gq$Y_#GFV#>o&Q+qSLT%{gcvLBrfgJ>a( zDau@Yl9UNs1B;Ft+|C{C6XPud;3sL!KU#kx0X{dLQ!r5kqv)dPW@W6tm;{N}rPrTD zMA-+=`4>8RH?i3Bm+R6iLFieX8?Oib4$LO*Wh9&Jbf zkOq(u^$j)hMRnl;|STUySF&kQHt#Hw-^v9PxSwB@~)GjmyP0-04E3Ud* zeAo~Qv>np@T1LMvlVH|CO7RXIRa+XPZn7CA-nf;dKUZ?@g{^B8pDtLw^9TVWCQRCu z3D`7To-5AeYQMB)3l=FOL&sq*wLp?GF7%a*D|LxH7nTWBfV{WK3Z$Z6zSd}-wLqM6 zbICtcs|`PJw`tH1!!YjgdIrW|6z*?+q-Te04EogOIs|#oMcR}uEl|ZMI>^beCj?ZD zFxErYDXU2~S9BH4hqbIH^kbG-U@Yi~eqXq4h%RujNgG~}HX2FG$JKG;#TV5HKef(uUUqfvXlc6bsNY*5DYmit{lmA`IPy}>p ziumDc*KE&(daUblVP{@wm3F!Br{d-2zNOJpME`U- zUgTa|j?Zt}`spIWy@ZW0_`4>` zTKufbrUz*^w0j6a2?^vCQosMYswcI_NJUfycs4u0X?{h{Y2J+lwB?7c=kgd~>$so? z*Vau3UIt_Qi;b9x;^JRhhI7M!wAxKXg-64I^y^{c{=1FK4`jWpVYbuHzst*b1n0s< z{42W{r(>ro?2~i7ygh%AzE5$SE;!*kFNYqpq7z)ucB3xDK}|Ap(mo-Ov$*YU2g{w) zdZ8VH^4{pjiw-?f>C#*Rhd#M9q5&g54ZdiAB<6>_()T4Qp%4d-HHJ@^QV|BRpGFev3 z{A=f?v3GQMkP9U7k`_u8OVc55q&8PFSZ-n_lmu%~0h}4uK1Lm*mn5sz6kceVs@w6A zjL>uf1#}D2@1{Ps+8+iOkBzgTt(C(GKdx49B~=h6G{czabM{4Wn};~P|G8QoT#Uf_ zHJe#=REpC0)k`WV;0+XUUS(b)0n6|287i{YZ(OHgDA|gcvhbIlUXZ+#*+U;6QDj3) z^6E8kW=Bo@;HScQ@>}x$o7@5JEnL;-T&%yNWEtA#GaE;^cO<+4*--o zm+{G1?}a#OFIuXr?R2ztK&_lh@C-S9BGVCL(W;xuDBBzEc)RB|oiek4Zi}3Em^5v!TZ!3;}eo@lVP+BQ56UXNdv_XU+ z+^9(4AJ)N=Ll<#uqn$=hyn4l&6e`L}PC1II(c6tCEJ^4Ho-Hck%fZy(k$gFv!Bu>I z00U1Kc#j(6TK5vC`E-$iQwt2<6$xmn1wpqQJqoy!gtiI_FSi7OL2pv@Vg`P#8FNeZ_8o{oGJ; z;ZMJtEUYdolpr*;X*tUoN-d(3alHv&_kJz)ZUl;EM8?P!7qacxS|p4~5CB}l3rWH^ z;>%~L{n?4PO9C=ZLUJXG*V(!t&9msO8_OtKUmXupCYM8Bd2S1ukJAK=A7;bxB$?g0 z=egsxsv1Wy6>$jSyb=3ybP2`_Tm6@D@(kFPZ7p;{jb>(a3R4nw=C?x_bP{rHe|hw9 zNnkb;TNROl3$pd2K;LGbU=V!^Z*!~XJ;-i{&Q9m}t4qU=N@#*jI5^OW+0+S?=G!Qdc`7ZMae~Gd0&mAqN~k z3)K(GzAVlx%lQ0Y>ka;`0!LGM8EFVcB6h9+(yH-V5&xibQ9Im2<7@r-e9cvc*4qub z6`Z*UVzNV%2B@o^9@F91N*MrIK&HQML=UY|p|55o*vf2Qnx_eFs_?s^-0e7nVI+c# z59#io+WvaV0RNd4W z8`eWt^U_-!lzev;yxBl#d#je;{!)6rW?kg3XglT;WR>zmJ%yJ5n7}YJf`Agb7SYz> zuuXT_ySp$4$fL$HU4MT+$lgjQ!8`auXUcZ{4%yeKRzo@*>K}X}q$)88BN&Ba*aczS zW|@j)17%+XQ#|e%PR)($$!?DI@nF;TQINbO-+vQ}gW`kK8?Mx5AvmZLf+(W?gVM>k z@3-7pNZHfDVeg$0E=W1>)k`Wbp&?!?)(tT#R18@)p39OS()#K?RdRY%gJs$*FuJ}b zM^9>XD)Ke&RQ~P9v@(0G0JSyFqn;q^N-A&Nln+BUlZY=+0c}_uuAkW-8uW925;c^? z>kbXYhKGHX(*ErVfNT4>v6IhH*?$wU7J;& zwg5Pv*CCAq{$<17n{+S8KI!Q&zSWuX(#KcS>7LU;b?1SJAHDSJk?KEBkI43S8NB4W z!@MW9Y~FB=d#8Oc2+BTb?=axf$@V<{D?`$lk(kNwzch*_*2`aN3PHF>Rl z-I&+tb98bg7C}uQAcLtzbhO(n1~=2=#ppzUyisn^w;v6L)3^|`TAsKzf$FB#qWWau zN^-vJWElsP)HqTOWaV1~)zm$;%IZ*SC&mkr7dB@csOnvGZ3B5>a3N-}UZ_lIpi_Nj z#D=Suf@_P^k?pp_tU z<_P4MPKK{@G+WyX*9oyZMQ5RXNJ&*N_ale1EkdywlyoZ=EGVq-?8-HMD)oBy54;C$ zK*HPx9U}N)JQy%&ZmZdzTY$5S@X*eOt6%8l@Obv_Uf!lg9JH3jDOzdUhs`Nuzc`)y8=&qhBEi9m7QM^VTK>9X&F z>bnUWtRy=-9h*0J9){f;ek!dS6yYb9)$974P$!?6G2*Fv23-Rt`zjZ5vx6h0Q%=r- zxtoyl%_@p|!v!2OpC+~cbj5(xbO${sH`&g#wF#aK$jvyM@aIw`&J zwkr+F&-$GsfD3<1ODA!2!&D?2uE{}6MR)u>ND$6}E z6x@|u1eE?Va33UwoI>a^`u%hsnLlDY{3@ekXg&S7OVi#ltNdq$G`b6sh8(~YgO9Qq z+A;CY*yH1$%nZ3e)aB0Gz&f6TxKk?fMVT7dMnr!CGf{0R7{Y}H^H1vYe;?}!LoD`! zpi)##n|V5t^Jl~P1@W*{*^8xm5COW0kqM@koFJZOUuRGEZx?Qp7X~Z*AP!N_mm#rV zAk#vnJ`W_HnI&@z#aNfaMc?$vkjiFlP?H z|9i2fPS}0l2d31DHcznV1y$4R*cH5|o5nTJ_Lh4NQ!!`k z0+kmKf90@Z$*ejwU-qQbkv>9{-xlVu&}rIrO!VZE;?uRvykknSI)Sm*5=*T`F1YB< z+bT&FY#lB;hIjmnSw)3{zD_b&24!JUZQnF3_5zarS7{R#yj(`> zAPh+Km0sxn9_m*8)F-=OsP1imdmUG;sJbanw?)c{s%={WwU$~ZKOX&7c+l+-4Ybd<$>Q#!ac+f?gKEfq< zZLymS5(I@!?0NU@As7^z{viwATKx9yxu;&?6mwi28I|DN!*qB8;kCueIN3+2-ZS66 ztzc9HQ;cH)$wRk|W8h29SwjT1=s~S>AzJ_O+22z{?1LAw%7)JwY*x;NzEkPH@A>6| zhbf)sq(g+dC(MTc@4Kqh?R@yG{6I5E6SiuCzgQYCpUP0}buDuOF*J<+Y4lBL$FJou z?yMyBS;+0Zz5;El4)!zZml(vKRk_j_e=T4AqU||U-Vx205ZQKtlQ2rsBE9(dQh#LD zf|4L{ZN^EC2sIl(O|Twre4zRh1w|SJ(~p5zqBRIpwT20sh{6TKnNRLi^L!9jQF4pJ zV}*^f+v{%)CP8rD%g_nDIh*tO0E{qSx#aOCkjaZ0OZJRxMrA5c2(~cA}JG9Knx%C+|Ww(0c=JTNLBoD65aa#3*I;Vr@w>3(b_T4G@qMrAUPpEPUOY z{jXH8G!!N*^s}wS>Q#za?`0$kj#9H{WixWB?2Z(AS{wbr3yy}?kwv|b8alRe z_SWH>#^=ip0WgI^P`&pDknP<g5_Qj{iuu~K_yVfvCc1PT zpB#qk(=L3#Lh8dB2GQP{y3hIXM^_cUnM>nQur*emr`pwr{w|?^%U?X(G*%PdV1dHITelKc&n|_qUHLxe0arb;dEC%i!N?!y6Gq&^Vi~YDFDXA-%v#HIMm5OnmT3X64>3#I0|7E}GYd*F?92x&pMs4Y| z{dlLH6_g0qBoI7d8}{)^8t*#id6RXD;DOZn#jBtHypQGTC5YU;^ByrG>PR^g12RUz zu=*6EW6bt6M7o0%l=}wmol5)sT6^QIt@NY~&mC_QMy7tA8aT-??!QWMijTcnmld=G zlN4)}{oc0tg)}zm_WO>x!Nr5uSxwmO5&bN2d`N<`I>APHFl&IZ@&DxJV+(rb=GQhT zm_8#k^+$B3)|d*!k38wWAwhhM0mbe|+ow;`MjsK|BZ%zYNShWAOn?!R|0|~mSb`7< z3Q+*D+dihmWOVRwae2|_?MWBAH8}Z-*cGh&sQ*v5L?-OFl+T69lGfSB3FGOK25`yO zqua>F2)=T3BNf6`_=PWw!F|2owQgBJLr*&r6*z}~bx!9rjC5KAQg>fHK=+I{ms<6i z8ERR!EE<`+Z z|LCJPAtJUXLTNZ1vE7Hb7a~T+m_A1>fqL`DmH@x_VjRv$Gg- z+6r5d27qBz`gI+<0#RKr~#gTKui zY1zQQy`e>fTRqKxB9937$cQ_PTQp9f8@3DgO;0BOhMpTA-iSA^5kzz<6{me=K z>_cu`lPbz?{JMTA`Xev@+IWI3W7pr;Vf+qb^=wk)#NLd%2&CxizHeY`=Ev)O&roy! z{E8phDd(>J5F(qHoX_-g2ol&|?0NIfF}OTD@k16Qv0r(8;ptb{g^E}}MkToVG~wz; zC}RJcvCdCWv%l7Qx0#6==a21gzsP}Ij_b8_vxVphHnQ_j;dI$!7;J`Q`k(mBdPeI5 zGC8g)Ha-rZp8c%{md^vB*rC@8A20VKkDAZ2%Q6Kvvn51t1Sp0vcmDiP_s1@{t2u-c zrl|CczHlv=TEysJ`lbVe8?a}(v6033eIQNC=bW(Alx$mY*UiGq3y9L!QNln?!@$N8 z1|BjMVI1f4c`uI|b->!A$N}(oALgv#Qnk5ahN*Rw7ghcq4i~kML6@I2MutG%gJQ*C zxZes1Do59a4ey6iYSqFo_OBe~H4IJu@tTiBZ#r+tSv{j^GIT)TmI2S5$=@}7K5_@p zu+T40bZZ00=Z9UkakfcJTN23RBAg2Cq8>(F>OUKK?b|nGygvtd7^IyL+d^MHi#kd< zw~ZI7@i{W#2hj8Z-za};O2k)&1;=1Yi*x(Hp311`?{xiw01+M=m~<6UBBj{!q*jj?Si9i(I!C4OQZH>P`L*O&7E&p4ePDH&Gf-{#rSoNJ;MXhh`z~Z@9kVo-=k$VQlgwc((9ioc~{?ZHG zsiAK5DFM9q_VF)Lj=nOrLs)+ErPBBZHI)2mkM1op#CxObaVPjlNIn&8%3*aEDgiHo`#E`Y`ebn5) zn8XgHShTAo8?dGiqSs-LydeEGm!4VS`XCCzX?>8Rv>)(~$ zMV*0i<8}wbk&rxF3z8z-Sb6bv{=?=v4H}v4+iO*xahckhD_|$wVco%rB8+BRQ#sq>q;?5&^u?|caJuh=MyL1uyIpH!3 z+}tX-I%fpFe^CiOH5t8}A0}Z~pe+!gH@=mhfy5nUvtjz47ok z!ar{I{7&~NY8{-LdsV_XN29~FFd@LzuIyJeJAG;X&7eyJqF#(`*j(Ox#rh|LMfk^Y zn2U8x=){g+5ty+W?^NI97Djjkgi?wyI5-BNYV^y;=Y799N8+~n#`mrqqTwIM1M{Kf zMcZbCvXIRXJ6b~95C58pEIZ9jwA6)q(c)gshd?Z7hUuOTT{qqwj?w=W-yLhR?^|JN60-OkjKBz5~4r=JC+A$wY|0>B!+r+@Cp-yH_pw4-i`uew+mI{)UJB z5ZAAwxyiEqMP!S}&f0lwhW{l6D1cHUrK$A}*q1gij)?QvgA5*4(Nn2_jiL z^QLzUQ9OTTo$JUlT0IUhY2H>bnWtJNgX=z2PJI%jJ0AJgz7bb^*Z?r@{58Ru6^x&E z`xGKGfeK#W>&D!+BBl@yF}L!YZ7N!XXi2uJyBad-P%5D9maM2=V+cpx^Ny}Ch>T2 zFrLFkQQoQWuIo{U0tM5vp}uPMGc{U0v{=~}7k zgm7z^Z_)Azm?k}*No(3gT96_tYg~{l!1kI;V%~Y<{vRN|Ywr>}iG|wEl9h0W`Y44<4~`Tj4Ld()&OaX=3OH~!afp@ z_NfioA0oEacYc2Lb@KZu6>~iV^dsRdyMUwG&cA-M6Qn=XIPMyXFRc@yLb9dWp0JD9 zIi8@*pYH3=4-jg`$(iBe%p@m+z&mY)G}E!@bR9Y_h_t*7yh471)aNat0%}G-xLImr zS;#Zq=H+UtH{1lY(*2skX>`mz*aUEk<0`joiyjhARGhcqy(F6o0gisbrqME{aX)#) zi*>FlkuIy(oi0%{#?{aJ3j(rIF-}ofxx^|Ud->joJ-BJ0&QB5AhKODaaD;pJ`c|D4 z!Lx0-t6>H4Hf@|=d~CJHP}Hq5rjc(Hg)|~uCJ!?q&Ge)uZPvWAhXe=uRf{?ok1=FR zp+au|w}i4S@WDDAkhcr04=}~6274SC0xP`(2eyIe<~3iP4Z^1^#D6;aFMN3R3wg0p1mks_i9Afcf-%!iSwQ;~vD)ibT5Qk*M}DhOjw z>7Cq8QY=_Mo58fi)m;CA-ubc9J1IU)iaGlk|4!^Bd`T$9&HoGwb2>A z+t>uZ&n%$mKBq=feB!TCuyUw+rg1;%oLk;NIN5h^ylyXoX`y>^vgrum%UqKF#h+Vs z7+&mJe1V5{I^P$^b){R>#YW4t}u#3nl(Kusd^D$H0dDx;p zUC`jTY;j`G!#)V~sc2IcHm7_e$w)Lv_RsFx=Mho-75m-=K2{-FThbG2<1yajRx1;9 z78O!w-|ap40QY{v<#a|Q?Q{o1IHx>Bbtga~^<5LcGXlwY4|+mhSX}IzQt+stY4L>w zGET6Y2va*>;mj~+u`6MV8_F9<(C77UH^`>J8_ooxA#R{B(G*981b;pDn>ojJAUv*lskulVvLwyOwOgEZLWXlq)z#GrKlNQ^+buwyuJT6Elw!B%D&n&+pL&#;x?&#uMkrDmZ>2F6;O8`SiY(RDPu9k#5z1XwEg zlApxO0<~Ber%Z-tcHpCv9}G-v^uJkU2@Nu+g&}$etA$nQTRv0gh|vU_TwXF@JNfF; zQ4IpxpzHP_34eC=@d2z5nl_%B6L~+2CY;rM2fp5sYFu(mckqff z7c{c=*`saL^32hX0PXuI_0Qj@y;7U1Nf8*^vqrpkJqji&HsaZlQQGXd#e@u`G^sz& zEFfn;9Q}?>2Osqg&f!ll)2+&UaV9`5;p&RIT#*t*lbmm$RAvz-Z{=;b3pduN01z9jwFnowH*>Qe09xh-{X&}zD4!(oLg5f~(MAnU6E@u$t_a|87cHqU1E_$i zY24YT(XlLKI5emTOKVS0DKZWgTe~>XIh$k;+^)F}z5zCacZiwJ;7~A>h>}AY{?f~c z9DKi3;H?lUAei(l_J}?ai+^j?sh?^q+CxeL2<)y>=$VG`r9Jol_6ja?vFc`$JlO?TphzkuH^+Y9Cc z?Cg#obco{b{)$`NCY6Y;Wi>W-@nrL zN=lJ6P3e*?$@Eo|Pd(F2aI3%;wZFu~L9nk3RFL^@ARqnx)f>qsNU5bD+s?|sgBolW0(Q24ZPLrPsl zK3ic~ur3LGpWqF(lwbb-=sjt`}h z?ILH=$zyoedThzbUuYeUaKJ|@UoGvv_xIEVZihG(fnuE1r%Esy`-U6+908YOG;L4)MVt)$|N#Q$%2kYE$K^=TQ;iK?1JFgR)>F z(SSy$PUCV9^zq0_k-$7L#c2EcnEy3X*x~+PJtg}G36kSSHpot^jR5Hl7ZW8E(aG6A z84G#>OY2+YkkAFyDgZM0mH_p>> z&-)IqG|jz)YrfaYgU{nIUlRy-U1ylDb`8a23xPK+U(dE+3cS-$jCXF0xzx5DIPJm^-L^6VBM{xTxe$-iF_%FNd*?eXsM z#5?R;pQp>+sb+q~zeaTerd-9nk4xd(Ew{*)AnMU9--f)-HB23!<{3N42~GHayu>)9 zux>;YM}jT5$5U>eT(*iU^!5!&li1rf7 z^2|^~^#*~i3Nn=0CXJe#MuM7E7XmCk46 zaFGQ0NGIGheLk#(3j=Iw{?LkVbisWqkz1c29rXV1zus(Hbj~|&7p^=0c$rv4+|kmg z?g5cXk>Wer{P6-gZkGgIoV6c!7TddcA?7Zip;l}F3wJDCJ&XgYD>q--)_N8VJ4fAq z#Mq_0u5+#4BtCmJ#nuo>)TaJx)7-?*|1-WH$S$>d?|=W?v@fAFi|yS*e#&NcQRTvz zMz0+E#9Jt7@zu;UbN>k)IYVRu+^fDBpJUsf`X0BM(Cszv{k4aoV6@ahg#R9cVLb+E z9(Occ^n+>a$7~6%>2fXRuvseh9k(*EjC)Th14WTq{C?*-ngrXYlD`Gam<0FK_Q@7r z+n_GZoUECnGdPyRSH0j6go*GXBeUgoxPTlsDvRVI)7DKx48M%^&?0)->Y{y%SVLBn z*l2IjMsKZw$OM*#B>0JqWqw{FA;X_~$sH%yW5=lRq4B|d_s`2PvLe)K^URUw%P!o^ zo*B(a1`df7!gom-KL{@z2-h!NM=xEo?6S_--!5Iw6#VvZWI{B!JJ4tt1~rWTg!L0u zx!(z)c)BJ;IjBgnlJD@#si($Fy^7APsv#Uw)w8;ffG*E>!X{{)Gov|ekxcg;`u=(Q z+47#dyu#M+P)UtNzZ)OE4A2&bV3#JE;$x21rY+6i?N@wRRz-qbiQN16wv?*K=gc`- zRF5D%dK#2#UN;hg2O@&pp<{=*4-pu@Pw$%_$iTolR+m_-yFm>+{gOTVSCFU*u+&Ta zlrBnjO5BPlP-s#YtzJ`onX4SGDV28qX|ZOr=QG%50v&ANM~^Du)gRitSXumq&jZh= zFI_30Q3J0Z6l<}%Y-O)P>0~XSv;s`#$3U`f-!Z5bT`xZTGi$`3eE7q=+cQ({Jz7B- zU6kJwCux>Du1#(bpC;85W;J=3hHg>M1qmn>{-?ioU}@X_(V`BKg2z186w=#8;bZ)E7OlS-nVbv*WDxXO+EMpg2af z3eJ|CkL@eSJ8FYHbyIx~R>D%c?`xAGaens7Cr+o?Sm%>~(Cik})OGGO^6CYs-uW>b z4h=$oae^pk>6d1}UUp=^n(O8-8r3eQpzDNOfE{XQ7pNGcoNfLb(TJaL^XPI?zkTA` za8fHg0*x(e4a#$?e&DK1a(57+eOXu;q~_H11rxsLrm&Yv_=2eNk_u}-#J3kE6>d;m zypl6lJpA4sI;E?O%Ek-F{Oh{jZUn-y@*CHIGDg2wMl&Roj4V!rr{0Tg38o=IXn4Q> z&AqDf^SW`(CX_|b0B+|kN562T>7AOw%35`VbsRerJXkZl^Iy7LSu7neOnF*rS{@IT#WRth64k9R7X1M&N zZ|e|R_HQWFx4v!iOpKP~ORw6c{4}E$`@r>{=Wz)Rf$rauqiw-pwqdf711|LuW4D?L zgirFU+Hqbj0(mV+J6j?@Q)dE=*~Y{r}hcQzyj{Z=8wz#vTeuI z?UQ7;5|Y}N)WC30G}n2I=QVh#% zFR?Kt_+2x%Z?zu?3Kvq|xS`7v&>hg`TH!DT%XsJNM-L(;gXqsTwTnwm6aR*seeWc5 znV~N=JiAc3)c94&tY$KmW!I_};=s4}BZN3(l0ZjJWi0LeXH}2>r8t$A;NYEOqFi46JK$bnCtQLpZ*J(DENeMGEJVgYNdRYUX zddh9#V748@S9Jhe^pFR9X?x*IOJx^ibUmy=!z10%>ZwKAWgm1#Ma#4o6=XFd+19HS zg}V-oi@;v%e245y&rd?X-Zbi++IP)L30W@dlQUolf&OZpGIy893`Bl^fD zHV+HMpxl*V&vcR6vYfEKprJl`^l+6<7%wx~JPy{IMniUZWC|~^8Wge6Q}*vQ>&F0M zWH0rqbLKv&#fh=jui>aFS{88k3F$Ev6;b`nkg-E~gGGIaYi091xI^m7$dh&C1q`bq zs!MKOLk+@k1B%G(-<#NRiq@QjfBw#hz zw%=DmlO&X(iqU>Nz4rMQ7_dcLhI~FB|BW*YEe2(Lu~Uc&QQ!{St6q;BXxp1dVvZe9 zg%)c*S{B%Ao9dHhh^|`IeTSCP?9EF84BX$RS}JrKy9px;DO9oL!=nD$qc|W~qrzGg zhDM7uU?YR;SJO#%?a@0LirN{3PB4F8F+^U~($pX6*6)WCPEkRmcfgGC+f6p*^DaT` z(A!6?|L}ML#+gsKJ)_a{S5UVjVpbq_AhsqH)R(nUz$6FpgO$w1rI(Fd8c@_Q*D`zY zb#pB0@_b&e#rR52RZN|d)4khwj7!{zFW>@)=t?dv^~9MZDQr>()C8=Tnu$!B14C z-Im!(>Hm+J(bAMdaRl@=WxaTTU}U8l)SnqNH&J=>-A5_Sm#QM@2X0o#ay@-?TwUjW z;H8s#rRQbC)iUWRT~Lg6$yE-PH=LNv33^6>#Xh06g8o9`9fp*jdTOj5R86Jp(j&KjyCTTQ-t?h+vp_4uV4faIAtpIaC9MKT_9 zq8ZzY&OfL}1f{4?n9Fq=N0xfG{|)szdOBr@-O!lT?`!i-zHQ#kAg`Y$VJV1=I#=#| z`c$ym0o6h;$K5Huw1r>5-?>8g>2iCCN2IO}*756=+8aerryl;8tGPc;j>D%^qC-Ca z`;xL6hOB33{)Hy&=^~%M-g+dN_}}q_@Y%x_w|^wC!U&NwHON1O-U;a7V zfg_Hz9wg+zYvqc_a_QL0s^+5`DZsxXmdM}dO1`e@t=A{X$rkH-5D`P3L!|sAYNW2~ zEq3#I$Jfh(RuXvxo&5LfxVNE7vwu&JVu{f5V0(uahYnv% z2zjtnVkB3sK2l?xOoCQ2lqh_{Rh5as+?$(v$DJ??{c^zp;Ux{hpe`0#2IDa6?sFBH z?pJw+xUidIg7bf@$L}Fl>%7h_^kftA0=!Fc%O1^V5T}*f8YdPCXJVU$bk8@9X4&UV zPdrRUhf~V0D|Z`o;WG{x#%~V$>4T{0DdYdq8}j$>x~4MR;NBJ3=3gl>JhXSCVF>Jd z1nHas8nkk}RR=Km6k~X`GWUd(Ok;%tCS&em0a`@MVN1(hC9;EjhvZG{ofPq5`x{xs za>&I_0nXMEuN9B!!AAWUS`I}Tra%)=dp3EG7uF|L@)Nh~koej`G?krpD-k=!4Rts) zjlZsZ17%VnWcY2~P7H3^z#VVO%4#^&AS-Mn0H3KL7$|!mxU9_FNs&oGUMUmFbl8ws zC)+wn>hXo{_>G_Pt?-bX4PVpNb5_Fpch(9ILiwXiI&W&gq0M|8e_mRCH=PdGlV@;l zt`FtpWLI()`zAHB(J2xwSaj<6=z*;u2;o*^4c9+5BFge^A;($5nk9x_#L|Es#+Hv};H$y2^+Y2#|RjkMLHK4`wAEQPc z?XJ9BqY`fwoyhlD?tvVUQABSa{6;9!r{f4M)hb-w{fSAW%2d9^)BkFjQ zBuk1&l4n)3vpw;=@+olU&e%sN?@dKyeZ!na~`axJ1>J#fm<} zSn_I12~c1mfe`3|`kSaDu{SiU#vaH8pvOgST2pD4bCWbbUPAIWu8Ae*ocWqGbU*Txx8g`( z0uC;CFJ3bc6V2zEiXG~iYq;D{X@QGwYwW&nTxHfbpDsH=+rn9ARfo6u%a?3-OMurC zFRi})MsPzQ&6O>`00ai-z)DDP^w^k>(7X#A|@ za=Spoz@^ke0s>EUANJ(DkHgrDld3+sfPXY<$YG|)sR+R#I4K95z#okG509=H;#Q=; zc}a!KxU$`6%EZZ@{wNjs?yXl^Gez5f8GjhfOy}G#_h&!<&+5RG^qm}uFfRpp7Zn%r zEn&#No=5)2`}xqN%zFv+7hg;d0-L)>A7&gTqF5%Ef|AL9GQhR*ggnUL$q(Eq;w}ae6d0 z&1U5jn^(a>M}j0h{eso)H06thT1fhJU;he1=H;g-Dh}5u@CVm#*aKr044fD}@LwiPD)M<` zkO6}3z0@<0F#hUY-2>F=3&+n_G1?7S{i`@+*Rj+T1};0_+u%6KVyGN@m)y)icQUfS zU(4PPnnhHV489%&$%t6i$u4@1M$>5M`e3Nr-e=xMt10YeZYgEUThuSh`$#9jDYiNh zV`%~F;x$}81QZD&Cz``g$4`s*uPO^i;5s8ar5>DIvXoML}yZ+s7RdqUCOI>u~) zDb5v~3Rl;peOGz7RZpD>E_m{eDr`q5d+-mX|0VB`m;1Dng#0aQ5C7}u;gT-HIW-s( z_AIy?7gKh;MBt&`sqW`MbNxs);E3D0MY!F|rwi1OpL;ru81zTMR}u@SLHJG2Fb%^H z`Pg{@?CjnUVFFJ8CxNEvW-Uzz5boWO5qNU;8W`?2 z4J7+9CO$Cw6F+IKEh#aG@;$qTIGjma^tY>i%{I+K=nPIweK&A519ummz3@^+sYRwP zbn!kLDpCO4J0|xz^1#qF_DVQt@63n|wH|2&LqNbsUlliRLOuHj>UCNO*Rqf%oTeHKnl89vWg)k8&U0J+P~?%EL-HT`JNc z0H>H|R+OEV_?GYoN+ia`~n``05NYcST}S~ROappp{jm5mZX|{>d6Yy5u)QkUUCQHj^p74ut{jm zYarbI?Su3?Bo>jGyd`Vk_tOEten4W(<>uDUlezm}FKkGVSl+_L`_rFEF3 zohwMSSWG{8L*th9Vy5vLnsl*My~2xgbMPQT7`vmsD7Xg9CIk=c_mQK0012R0Kp`>! zDU4tj`}qZg2ab+#Tnd7BR3})+45edl{@Mr!l4Me?ThAVX#B#9CAin}~lEXfphS=*- z^qL2RpF&6b!aO~b#1#WUIRMS>hmLB-WeAKx&I2-_k>R}&8I43=f4RcL$w)g)C{@F< zQsymMiF&CD6gkiznTUrNiG7X{b9thb=#_=bUnsUHywa;?=T|7avCxe8l>o}|0*<(- zNk2C)vlW%5&y#@GVRvPj8VodVo}=?T;N#@o8|E|cdeqzFj(=p#HifRxBgp0eH%8{2 zF-BI2xLHkv=|jl`=u|K z$cn6p1zWN<#w@DV3Y5JyqD0Y#(G^`DUVgi9tpR5_!K!?sWP-)|rQPT7hDZ!f31q;s zokr$vWXf#QyhX|ay@gIWaLqf~03Am+TFn$aSgW$0MADhtUl)7lj z^%nvt0|nljm4A#{Jkd-#WMCGNyPFu(ZM)P4x17j6z=8?=f6ur*#_*M%0Fm9^o<$e5 z>Oaj3TPQ}*UX5C6L0}@Qq@mSyN_`Wj1(TFpzMb4b!-EI91wLS5F3T)RqqW^hpYLl%wiZ93;FO=^I*x9SCB|8NQ(wh->V zxEugSkI97Kuw%?2696F~zyDRw+8^SGa)7-fQX++m{DhRTFcyfYy0)|HRBqtu==Xjj z;>be;Ccd>~z&P-PG+c|PKW8@wza##g5UUr z0FW^Q)V^OAg=>=+4Ield? z>3pkD^4iyWVS?ZZ|0DAex*d~9p@Bu=@rm9L`YJG-0+IN%_N#Tjlb!v<9m{_XJ{krF zOrQYaq>!NxwTNul!Pu-`mlbicoiM62FnFCyX}@2VBO~PUO)6E~e)URd>P^OQ4*ajt ztC4++F7igr+Tv&U&K&~TOdU*LRy0ONT|{UvXyQOUovPU0u=`Lng%ke%-CUf}36@Ds zB|A*a`?uGBxnO8+bL~7r=I6h5eu@T`7Ir#q1CKRZx3HyxgS|H7>PI&|1r7#Th-k0+B=>j`-k*D4m<=ax9A;9W z6>F$>=CBhrp?1OPr=J|6Kbe0s)!sfeOReDO@Of2m zK;5$+GldF!q2;UrFCF`Z*DQ2|648j{)#9~5ellvw>sSm8bLryfR@=<)d9Iy-gm1`+ z2Kx8jSzTsT#>@rlmDFh5jg`6e-PabD1|EJez7=&_E7KSTL$2e7yWa{cC@G3-(amof z<(GoZ2Do4?dm9VRhMpWfhq5uc)S{0oRB4Uc0wY;GxSPHdDKgw!OE7Y`QP)bg@FXS`+qltJW1ebg=#i+vKKb6 zn^&EMSqopf-tSkxLsdIV%VmUDHli0f(uou*EXoxW#B~T>+Nc%WjaoP- zn7@?;FP{HrRQD9aQ!vRaGRgtbfuX)}lu^jEt??o1_WME?s+q(sES&5#KTq4uyv%ba zWptYs)Q)EPC>#nuppy~p6uW{~`A^pG!oT3GVN zdH-`+mWsL^C;zz*^_8&s+!4}Wq2SQ}{X=9Yzv;>mI4dN5CktNcpB(l650fSp_}o8l z(R3Z+VrMs+?x7BUFmkn=sk&8DpSfrsg|i?2#w+K$BFRu27xA|&%IUN%r$2#tuYy@w zR_OOVTKy(B&r-sM39;U!_FI-_Q>bxN5rV)lWNbZ>4c55#>pEXxo)i6Ipp5%Reg=f1 zOxSeDA}2T+O-F-96nrxLU;tvp<=5t;U^gO5WAfG4Qy32oon~JNCH5ANxlOa!<|q7- zG~cM!I$%&D`_zW(iwG*4FBXs-0QrE#-oCL8O-ngXX)M8%zk(D()nEIAVW9NQWf6BR zZbbKAm*T7e5G`>PIw9P)_)qc57sD`1X$n(;W&osOOiU1X4uN8Z?sXWROka@Q=Ph<% z-G7cS91Tm|b}%zR2+#Pb{I2HvVW;sjo_whLS6MG;jm>^3gmNYlh9rD)68f^6IIROL z;X9`kH@ZI0!3+66yZlR{L}X?zNATA#ZGo1z4HBDL6xoaDaH?jxTAwlBL3@e{3KIZ< zuPsG)0$YPgU-0ri6S6CG5QL7X7u+R4O9&LSf(gpK_h33sZ3jza-DM{PYsmK1|4d>L z$>j$SI4&GCf`ifBmF;`~$m9FFKYF4Wfw7}sl;u$Ze2BoS!mQC{bUCQ&X%Xc~J}jS8 z5}V>L)&;HF%Wt)4Eh?-1fuG*stzSSqJa)h8egwy^n@~vr<~VL!DX}upN_Ex#DX*!H z#V~yA-Cb3u7<88l19A2c)F<&)e-l)bs8d0<)_CZ9<^snwGQar1y+iq3(WMHipo~bq zM;r|&s;9|nk=jpyV_(r2jK7yz{X{LC>N_pn#IC|X;}d`4 z9jS8M3K94W6V9~}>xxrJ{C+?b0fs&eWkZP}advqyu@7|`huR9+e%k!hB2o-&0-?R+?bBpXeo`dKDp>?m1D&B=fPwD;o^p8r4M$A-)S)x7b>u1t)V=3Vyp^Z1 z>p@QO|7oiEHWMo+V#)B{?l?NW7+PDT7;@*(liv2|%INkaJg4TV7+$#QgrTKB zYruZ$)(yi=Y5GVLm91n`1Gtu`eqT{3hg538zbJy5F>7jRx!YpZX16OA8WKFd-7ba4 z{+UjEe7dUDG;VgUTBxqsEnf_J{Er?%I%<)vyq#zCY{N7J4TzBNq79W$z4nBnP6OX( zK8f*R?YJ^p29w_Rkc{1}T$7BHljKd66ueq^nSb6rl|p5`sYn)vf}Z1cTKr(C;>j^| zs(yIA21dsZzmiS2>OqCSkhw&)%vet^V=}`JE7H*uqgZP&l6+Gk9|=L=Pbk{9k3hsM z^4??t_s~`Szg|g^NJ2ipu0#W$?;mRCzh`TC%#1%)I$#Z|zr9=2EoG^w!822zIcr!9 zB$ZVC3@ivW;>y+np&S7+os!DErxKfa)ejWXeuovpLuq)P?rQ#c8WA?@8L7x%wsdVF z>tF+MCac@oO&u!ulz}E>XLotY?Uey+Ff5v)+`C5#V>KZkM{YT(;rW%+BH-Qi9iK9> ztC$kHl3wr)W@=DGcoQ8mw!#|k~WZx}i7=%R9rz$SV8-^J&m{myDMIRyEfz|YC zGCUsD_?)b2LdNei7gZ{CrQOyrP~mkNVjwiMOn?QpvW$W0`6d`@TRw^d7Tu z;Pl-;=wr~qH||C3PISzH!)Lmc5?$1UBKHij>@}6{xk%O>m?3qHS~gF8)2prZ8aWgf z(TyMi`Kt$GE9y}S*(|e)))Yn@e=FVn3%Z&zly(i7U|1?eP{`!f1*MCO<oEXdYxp%!Z7mMdCE=Vub#H0>$+C*i}cWQ#OTTTK1E_rwDynxrge zKLMXc9fOgG|GdS&m}4z|1TAbF`ow6fby0tRhjMP#L$G?IM>powUqEE#@BQg0N%JL4 zF42N0mok{80-orWh`dzz%)))?OOi`};!oW<7~itj!uzr;zQIMPGjXVyd9m8fG675z zF^4(A`&wLH8$u}GALce?iDSE(bl+mgY}NkiykVGCXiPR9CWn)g#+2@CQNtCEc~?53 zJ#Q4!xX-6kjY%P&XfUz~MOvizrE^~*#+7A)?L2kCSzJa#q?uP3$v9u@iueDYAin*L zr^i#7@uRX2Aiyq1=aj+_QQ?HerSfH^n*4DNhl6VMA~JLeY0JM=y?qV35ZI!>WELxN zjJ{!6mxHIDWJhapN)L$Dq)IjjcXl7T*$yK_9i1q*+b9QcdBSp(&jqf0YY!c1zpm39 z>f|0r{x-mYPLHjJ1#KEHZgV$qj~j7|$uI9nuK_ zrn`?Ds_yQh;o|Y!$*_{Rn_8=i->oPh9b(B2GaLKBwDRLv&6@^X!I>AOjlMZe%BcBf zJrX2*{e<;BQwaBx@Q&)XsVvvLE0-VcAMR7jrFZ=+B|z?t(HX!q(1SC>O8Pns)gj`K z3I&lcbpMkC7%DRd2{)m#6=#vtXcUrrSoHCL(#>AZ_cBZ$rJt(qG<>TjeYh}bz1Nz&>LQ0((Zm> z3@QI&A-!jl^*|3_`i?D|*nGzsJ={XAPd4lUA&RH5mmLA62=i0UT-t*nGhgo5$TOpis?WnO0pkrtUF<8i~myvjYM~USP zfAg|P`lua_zTgE!S?+8sKA&|&aFt!EPs5sp1?5fUT5?^BJgsMdH^*k)ShzQ)ezC)O zGvji8Pu?g=CqsqR6fa8KR$E-ElYR3a`zFzG{=!!K|4vFNWNEo(v*C!xe2v>~unRo-KuvpaM zc!M*3Q8!&Pr8+rl{U2n68(hs_GUzkpaGat28X}b6SAEaS|5Bz(nS*yK8Gl*u86!Rt z(puU>VV5U;0Bo&b5)Kgc{DX>rf0zCB)0Jlre?wDoy7=5>XMN}?)>`@!zv_YEubB}x zLe!v8Xf~bw@-2XBKA=(7Y;44V zW0MMO7BO|jHbUQ$YC&}vwKa={8dMD4v&vDKZPiCynf^gGCyK2ujr4YcHA81BbmV_M z2uJm`znXWL_Wn0a^`$7~Jk)p99;8og;4E(Yw*KJ!aDgszQM+>&vGBRz9#X-q5=vZV zBA?A5L>)x9%2IKgo>xznr;^A@U(A(Qp{bh>Ir_TDSUbS}Zk2L^*N0N68|mi`+?1<{ zZQ`ZnNaC1?`ZzrGCZKt)wx3`bUAiSY_IDn+{|it=!2~2FY5=V8gCPJGrePlNxSjL$ zNDDB;PHb9+mvA-dS)I0jca6MMBUfEPr+3=xP-w$z-^YkWyH_-|4LOXr4(If15N75_ z$&rbLrw5KMOQL!xbd(`F0t=ZrXquR4b;ZR50zF$wEl)aeGKnf0@&pJhv08~yATi{a zl`aJidnk{4>Vz||?WOUh9Xpn#Ff_yQUK&ll_1Hti?<0jj2>eK!a)2pXmNar5&{kkP zsXiu*?`d6CUZWETdTL6#Rk`m;HzvPG3pol)79+VpU($_W_P0+g6&H(^lxCe=moea4 z*rdqI|8Y&YA|oHQt*vgl>lTqhisGA7t_fB$)!87LYXBCxH-+VQ0d=^G?wZ;JN+A)Y zF2WwTV4|)iaI9AUI1ga1OSP*MJoKmxp40aSl`JnAjqcKQshXZz)~Bp2R(Uz!0d-KC zY`ENZj9;1T753ADFcqM4W~@T;L*9nK)EacLU15O;EWhoW^5&McP_`Mn2Hw>~}%vaS0DL>OHyS-YqzqLe}X$6%JEx@Gj#xqT|`~i^-sO3 z)6eAw?qV;g91bVv3S`^ZZ{tDq1b=zB^T?i*LN*D_w1H1Ol?3DyotyPS6Jr!H zCv}-vznc_ZU9Y^^>FUf_lz(m2b1)O!E`#EoK*>~B!-doJhgm|Vj|iQrSqV?8bG*NW z>9)~G4m7${Ld{O&Bc(#Hu!CVCt}~IXE3cKE^J>>BZkXpZI%lVw*>v>@$Eq3adZvOK z*ZZ5Xzo%!`@2E}_2pg__xSu{snn0so?iG$-K#sO(D1k^~=ChkLTx)GCZBNZnI9SB* zdjv+id;du!)6>`izJz?4hv=xGhxL**i}dNV`i|A7o29lE*>96d$<9S`8YKa93D;t^ zAdS5#@tp!uXT)9{7Bh8iL zRz2PyY%zD2TS zDz>sr`7CpW2;xm()%2`J1wi&J8YtLm9!C2JPnxxl4_u?mp*VPbX34nQXNw~(MeNc@ z?0EW+CYUFz!DxM3?*}>#9f!i8v0&Q|Y`fyO&yxnlIkf9-&-J z<@(@Dd_6QjQ&yVAeW-YJ!g-!iv@Bnt#P7qsN#3ywgOx98rj7IW^VD`FwMu#L(R>h; zyLyY0_?@B5s6pGW>lXUflI)_|q3&6&Hmx>4eTvc#Jw6csXCEEdS@JUq-WmSV@ej+) za)LOvY;h-y+D>!>uSb?6*%s)c*V&FTo&^89YmTXXWL;VMyYQ)PEEEl?b3*UXAWnX8 zh`j%unzkT6H;skJ6W}r5A`o(owZTwOFO;r ztxl-eF#7q^fQ3jTGcYdepMSSeS&A~T;X5o@rz&HMx)}%g!@m1uf zoVoLWAYZJl$EXQ_T`=umqYTkm1bdC|L+Y;BNX$XlOcPHSWAPL#=;O%;~ij3g{ z7urbd&X*!QoCC-GqQqX+Jz}^_>}MqR!co;!JwD;1#IHEZc9|LCyiA+{rByJ`Z9DQ%f@X;2{e$h@!v%+=x-0VP^=Fw3+j;VYRximg{UdNwFWn z9iX_-I9)Xt^%U+NlY@X7xcu2?yagB|Ka6=7f(*NmIGMnllvfqn-9p)82p&I}%9 zXhMz5f3t)$vtaV|gbJrSxaTicBYvi^$drnE*#ya z#dxN9H3Vht%z5-+qq;9dbk~=u&>si6p^}OzV1IC$$azWV>mFM_VhJKE3~5gyne-%W z!v9`9d;SLs5BkE>Yf5^H>Uw-LL3mToCNadYG_1CX#o z_;ywb%(g8C>E|@t;(XfqG%0)9bLymViB~t=ACB z>zjcD=|uw&K>u`WQBbyo(x~q&W>OqCT2^TEv>Cr6UtjcP}@P(k>p;<*-S|2x{!NRa;l=Nl%d&NG_2&q7|-+D-BqAtDBK4P)CLm`-mj5cG_tQO5sMF zg-Z_&l~Ws;<7V0PYp$eaBdR!6N(L(ih=40XsSMc&`lI+ z^q#CmKYMW90uAptG6UZBTbUELWV<*=ae1+szR_{?rLh>2o?_T=I`& ziw3@$>olZ2@%Y4r6x!dor^UzF^b`lU?Q!NNFbJ^}xMenDl97L4l&z0$MP&H$cmRk0 z*Wx)7H6baA3q?0>uB7U3wqv%*`Ou>4*fL;Uvgez}(DsP; zL9DrePqD$O#816!{fe*Ivl#d)Y7{p&dWIZi6tH9mV@i@tIsWmuJBP71k+NK?{%^OG zsPAt0(GXhVS{rkT1(@vnm=TjG==|G?iruSvOgP2WqxNOwHNRlfTyGI)YKIT*A{(1| zw^TsbL-(&*U=D(9h?WfZ=8*7QhS-V_>@j(fLIA?keu-`+aHcP2sm||?>-OytuNr+0 z6Do^&b%xalv5t|uGP#T9O8SvIbtxcS`KgydAi^(7VkukH(Io*;{>uu~I$)Txx5g4s zz@}H5Xn4}L0!PA&vkSiuG2E5q-nFd0?+Rjnj=u!`GU}2HxB3@Q^+*x;A7z1+cG-Z- z3f7(uW8+9^;R2%V)?$$Z?{E9D&)Q_(I&_Ta9jp0p?$i&z?K4hXGX+|hAHpE<>zg|z z8fa}h@j!mUWyOrwH=f~<LkXChvtlo6mB=V3rNS^1$h#Zx~T=_JP@2xh+pn7yT**gICao& zUnyl~^efQ9iY0Hwo7O4}gf4AD5+R<$n8T>3uoU|WL)PM~)oQ^N|KhqO112TJS`D?g zKOgIrK-t~+LGqM5r^W%E4%e~~7}VC>3vNNs;0t-_66@nFLq3?$=z72%w6waLQfFPY zq?_R&csXZl=yIr-!q6vt#S6wlAa{`5jik}97|u{4BVdJwEIkE+zYDs@|M~3tH5!jb zou?{v7S3RXZ-E6rXDGQk_@RsDd9s~#)q6?hpMgqo+PCNw z)-)|UZtYUD`##4R-Xx*49kB;S1B0ply8avSa%w(j{tJR$3R#}XOLR^vy7tQ;G z#TVk6~>nGLFgf z?0QKQhhq|>>?vCM*MR&5e=o7Hb$Y<}-&6s9r>kS>8fNkLWh?wYH=EifJmjg%1qDcM!OiY#ce~$E z6%vWpGvCSNx8Jijfs~c+!1TH3ecyKu(3Dw(P6u-D=)G9n<+i}l+Vx$uebgf}&84%C z1~7@cFFOgCq15*bzhJ=jj4)(+i*0d_Tjdr@{PCf!@ntH6u(ZQ56_RVIuWQ?xmmz6d zg^K~9drFn1Z+53Ij?_3(u^5@W>SHAVE7{&#YdG?c3`X=!wKXH+Dd((NVTH51hnz~+ zbh=Mc;~5_4mcAjTJ-&ZT?uI1%Y?egby;5u;gbLO?9qj?8-JVU=P-Sj9lmJ&DV-6uB zM_{A(k5?)Q1UqDQdK%awswJBy+$KLxsi9hM-*fMOFI#xXC-ds*i)JAGiIMQs8`_Q- zis~{Xo>Ohr>80)J(UHrrj7`2;Dj>>FKDl9ru#=L*8*iMBFT~dp9I593rz~o;d2T-# zMuZo-e!8uA-;m>Z=P{Z5qnR%Bim7RHz5n)8LB;}og{%Dxh+U#qA6J#aB0^6}jyo5xnnh0gH;ETuvLsW+8g^A_4OF(^IK*Rs5FdY+SILE3Y!A{R3#z@8N*x%2-c@Yr@AaR~R_3B2mA>dJzfX9Dd_)V~1 z0P|&VSV}Zgo}AU-$=??aJpo;G8Y(7k^Od7b6rVwnsT8lzlAwB>9A~NdG__k8Tvok# z>=yiqDw3-MIRh+C~1Qb3;g`;(ONvRf&P65L-$# z@A9ckXB$VL~jAm>Q6Gvp>bd*tcLHq7<^2YL# zhj`ok7}#U z#<4kzfy>?(zB@f)^o;wy9~_(>vE;Y~R-R>Qsr$m|E!aHoMaa3qPX;M|k|lcQ5KW6~ z|5qH_drrt6=m@Ws7~k@P7_H{GL@kf)Mbrnm2~Py4=*^U#K;a;YSz=wBM=>R)l>5SI zE{wSVcQn%iWZ(aHNsvj+Wq2$<H0Bt@{zI&%X|fH7vrj zdhWyi2TUo<_MuH4D-*;VB7Cq*`g8H#jf-08Ovm3#SFReSSMM51YfLXAPU9K$)CO4E z+4F>NgrNv<3oOJbb{2ZLB=(;u*b4*+ea}P7ZAu$7@7<|-=0amicYlRXdv2q{kxp+O z1`mE~ws%ZpqQl_B_NOXlA0eL;ySUj|3f?31#0HiPRdhk}Sg=CpcRSZRKGio2f);Vm z@o`wu)Vuu9U11Ma+b8<%V{#gJbC^OXp8om+-+(Zs^P8mWg0|crP=Ec}ZoKQIPj(^M zJiF=Lty9ZS@B=}JCd(hm>mafeI`8vlU~~@A6FKiY3L*uOVMuyu1tUk-_1wKA>ng0c zJHQt9%T%(3BSbP%EdoPD)k+STozFp8ibKTrPk#JuPzZZd2LlY7C{NPdc$^-J$Ntli z*~cV`03cT&f%Sh=VzW;t4zpO8)2Q^IKNCF8zPVy^7z^I0{PMt_G(K#3h`QeHU zB6i4?N#s%|AE-?dh`N4fxwHbErDI>k7L)maIXTPcji^*}H;8&YAe$a+a;+dWLMUf_ zXJ!d+=}|IejN>{#?R83Igl^_G<`S3%7;Nv(DJV}kiYQIaW@#u=+_=^Zt!#!ctEB+D z3MEQm<^wRc`_CGKwaJI_8SQaNop#8}Ce9FcHHK4EW=ZI|;A%1qmI|jMibZ+LY!e3h zT1?BhucdKo5sk-%g7mO4@X)#uM3p(`4^cDyp7XmZu_8rndP8^0mxamd4?mY$=P*#H zpq9$exJ*8~Jd4T4-c`~LW`&M=l{n)ZdU6N(+3c@W1N1kyPCir<(vgG)d#&{VmdyO> z+hOBOTT5#N%WZThO659qF~wHJhby^PuTNv+XlDHfsMp$x7En!5J=Or$1OV#;QAPpA804{pa`D^CqOP(o3%tsP89tS}|`qM^-Q zK<6ec(M0%);eE<#a;gKZ!TrngdYkjlV9f<}k!J&_New-MQ1ExXqrS+33at|!;PKXW z$FX)W+gPO@qK6%&3uWMO3C%ZroNC??}linEZ;3=jvb8o_Cm8{VYUS(?g+AZ+u~1#l`Zzvf)Bz zpxrHMR`vMex-A2STo@hnw^sB$ok0JLD&l~I9jOPP8U}LSx4u(@Bis6JN-I5%s#(m#w1Za`6BW;w!=w_YV`^RHq&NN0BHWmcGdtiPP+!Z32{@+&_W@*b5v zed*V_>SDftab~@0!6p7yMcRgPcVFpkaco~|*!=(`12gB**LRkE>G>0Fc!H z6BE)nD-SEIv`!o47{zWN;pQ~sp?Np=KqwpLZ%sIN6e@~_J}5w^sG+p_Wumql92}z( zU){Fi11SAQ@uBu!?=Te?)ZulXxeD6j2g)h^Kstj5ZU}{U`rDw%F7#@WqF(Wq)hw(0Yt$swh{l)Y& zdSZAr@&tu-+Vj_8*@rh?A`Yy)NCYMq8Q-H-#|X~x+#|8SnO?OQdzwDM!(+ZJ#Z}E{ z4b}VCHr?_pqtcwr>N+how~G4VyFH!p^shjPGMM8?z1X8lSKIZjI-#clD5m1d>=hiT2e5edndK(c z+mtNU@OKonArYtsJ*sbeqLSjQfRS3Lq&?19Mogpi9Wi0vG3R>S`n+f`Ygf=y?p%UJ zKiikUf3|CQ8BK9-{2Y`#0wxtY_4CCEu4pz7ZOG8o>t4|(nVIK}%?LT3OD|SvG@aLD1JtJcA zqM|d_$x%?59xPzI9@xA_zs8-T)t}KeXr-RAo0B0U{%UdOr-!mm;>%ZQjVzoE9Rs9E z`Nk)5gYWo9phOas+z=)%32LOKbRWZyDRr%j4ityoHAd`L{C1~Ww1vA^ObyHTguleX(zcFA~ z{GBi!!Awd?iH)?84nlh$f)!w~lxX@qIqNt~aVVjm=c3lVFhqZKG7b@i69je!lSYMKlUkKbSN_%c_Fn5N9rx+iKD1{Ti! z4%MlGV-uLKfcpwqETx)L5~PoK3O)mnA@~*_*~x*vQWW#s*pK4@TjJa({S7gVElQA*cxy-MDGhf2G2oEznWrv0vjPn9DoeJH!!v3saLR*BQFiKRb zyKyv9HCLsg)IEwTwP5niZ8!JNS!zbI+;F|TB{I(e$hZE3kwc?LmWU2fJo>9ecuLWh z7iJH}Wd)r4ALbVXceaKYf-giu4;Yt~qeobAFbR#`^VCR3j( z1>ylgp@^G++ucLm5G?9%;Wb!N^!=e%|Q zb2VV9sB1XSH$d~{s>#$?VT)nvwJ!; zPtff4UPbVc$>@-KIsz9*qjTP2LXF(t+ZS5bk}SyeR6W?N&dg~LtZx@z6W@ZmuPWi? ztLaY6}x%-0a6_cc_u`ykDE?V0#92!Y_iba^+U%RvXLp2{s)# zT5KMf$Kr=DX4)$hL6h<7wS93Or+d=>DM#5OFasR0AD5Y)T~|{8b>sY(PaKxn*zlG& zkluK!=nEt!Jj%{egl#Frq)DbV6cr0i-DT}5vm1@9Ei^z`i)CbJuz)>~H7#c4PUn31$|~fL-nDf;I?m@pfQTQWs3TiM0lT zkRs?Rw4e~$@TySHcfUL$Xw9jR`G;7bxhuL!GGcI}<^Py`U1-oac@Vv0-6fv}nfAYw z)I;gYQsYSdY3V$Yu}nLE7JMu%-1v+?p;;x3_uB=VWwJ0K@n)$pq*uAx`6RcDB9OOQ zR4gvn!s=pY){~WEGTBq>&>Lus|8(Zcsuq(XDUr{m_(1uB{+(n1_vi^cia1Nm^8sGg z*asWz2@D6tBYCg{jr(!)NV>I&9E_uUAjdZ*ZL8(%`hs_XF@D*w)&=u}WDuKWf`h^>(C;(w z3%BTwmp+g-j(YVLq%YP*a?m{0Btrj(QU~q8mF5wdOt-oiiA6zwY7kG|Zc(QVE^QSp zA8Z+D3laheVKE()ZL@U852aUpHwP}!NA5c;H&pHr#=m+*VTTrr4`iwe$ti$M z!nOWCrSz-RFi$yL0T+BK%YjVRB|)nfEZ!^@9;!$+&5BaDJEF?>8~a*U%UNM`Dlx5` zn7-W;y^V+wO0bwhwWb^b=Y?uISg2b_AG=hir86-41Yq{Kudwct{62M#C&DXQwM~o& zcWw(;L{w24{eAv_+t@q7PFO)ATX9pj>JMD`YhH&URG??U$GfO4t_Ll-;uS4Ah5FK| zFC)R={0i(Kptekq^vj*-m`5d-zX&ad>LU&nnm#QAxtH9hX3VT7`aq^9=~AjmWFKjt zXsb?@pZ_A{awyUBd{RO^`>8maORqyBGV!K5FAz5Xv+*KL4}N_ zk=ZD-(#C}Kb;!ROB-vQb%qKWm^IFf^^J7!~B>b(?Si1AguqD$Yq`lx-kcac^Mec~2 zscs;_wtQ>3H5MgZhKeVV3>qegkKPo+V6E%pNrRs8*HU?|{9WHG68k3UtI9RbqksBS zzL{SVUyOp6lTG}-r$jR(F7%FkEyS#j(?}+;m)bx?dSRj(Fe{OlDfV`JYv;41@?nnv zzGO{MpV+uK>+w%dVyDjBuSC)iC)GW96i5|djz~Q~w9+jL21brI6ud`F-cGp!aKgFe z`x{KO=a^bo7b-{D9{s2yY}JP}8U-Q#8bqFNnwb_3volj4`hF5~I6oIBoNbZsH+R{| zEkQI4&qLg-!pi3`CSDrB#013(r1hOx=C@sQ{blR@%CC7t%Bm{ql@rBMBJXsvk%p?m<{n0y;K6(t3M*M zN092K{BnZcZ=sHjVv6y=Py{E&SqfZ~vE=N*WhlFXSjhM0N0a<5VhZqONcypSOeP|5x;|J(o7A1!YhmY>rU zn+ed13ic(K4&?Bp-eusM0A$bvaM0g=IKP>`#vdQnec?atD6DuLp@|d=ey}L^{Fv`i zRn}MaKYxERa1Lt7XCbmZ;;#4KoE%-S{LZ(acGd{qU|r-`^`$t-V~-bCh(ZiDif#pNN7@fN0t}E5k8e@+rB1*M2Jg!8^P`9wRec|Ki>Q1fP_)GWH}^D*rwu5t3Kq+f2HB zSqV_)#v^#hx}eQmz~v8w!S)1UVBv*}lTAsdxJ}GOV{59#7xMkyKxCjTYtd<8AVXGM zVJOQ?CxUS@<;X4l68?m52OL2!`bN5aN=g9_io=UM3>!>q*D@b~{`$j@XzH%B7b>JX zSB*P;DR9|n*GsgB?mm0&I zr?P|{CFfZ-NMdGMznj=NQQ#@At|H61-fe|sB7$=(ZvSaeJJq4bUA0R}8G4E)`Zf{c z!LCo$lq85riPCAJrea*pHw0cmwxDa@kN^2VtRuXBzMI_wQ%KT&boKjoy!)Zg6t-YV z7E@qC4oKvL&bH)~f(cX@YMcmxJ@?-IG z7Cw&N+v-j5x9ds?EnBk;IHINJdFP~t7}pMG>(|dyff9p$0a@5kAySDXv>Ha2KH(Q3 zJ~?i6psYNe7FwJE8ZOB$&)BP27Dq_594o>x#Afa$6V#_#(qTe+B&&?~t5S!@kaea1 zSX6B4lZKPfi{~$X-p=+~ZszBcS@_=@%D7j)clkX&=q#%=Q|^R0j-;%~A~|GNlR`}x zQw6(?iWVwCXyh$M0p6!IUz4&u+vCk~7=B5c%z6BFpz34dS%mjpFBlSOiN}%^8OjaP zKA1UL4A_Rsb97@-xv@=o(w7FZ@E_yw-#b;dI*LW@NrWy_?(%#x@<->iB^wWICE!xB zh@Jbzeacu8(_KAhdrw#xvO3-un*~~nI-7(0N{_h?fa2_h&(#fucpBeK%hvUn5)YA7 zgNytrpW_*!zc>|DhvOmbwjV(9$s02~lG3JmoQV4@3mzd)z<_HFReeN1ta@R)9VE$_ zo>Qz7VA}bh$sfN`Xy6#Zad$a=dE`_ao{wH;^@B|9x#&F`R!f$5;)^Dl@NbQ!r_foK zzn8%LUON91bP9Wh4s5~$8MAg$%I_|9%T7ld}X< zLy7tD0}26g_FEW{gBrO^`~@SfYFv+3rmC?LWt0r5C5lZC-XUFG!X53QZ1j~NEZ9gX z6Fz~u(MCa zJ=x}8ULOd@PZSMwR%!oK0ys&hHi(26B!;}~&M+900oTn>tj-OtQTDTkTy4(E1#|)) z&K+(HisBu_L}Kw)wDhRim;ypSGyiZS7D~6yP70Nab;B-8)b;6sV-PrTv)VSctiIvy zOUSs>y0r~~s}Dpn7MGZ+hcatDPLyh*?NPc)YYYcnUmX&( zJc@q^|%QW@@>8H$Bgv|p^GhR27KL%B8iboFz) z9l~UBeqP;NE8JzFXsz4q1F<5+FT0<1n>%o(o9hiM{h0kLo^WJQxc?Nh;>vPDOEQI} zd337Jv$BM)D#nTJ_#dv(0crlk_j?m3STRXO^;A) z=Y81;PfwQAH<0}ils)4aAVa4}!_5X-%F8WnME>Ec_9l!8?Z#z1(G{8gUj1}7xyav~r%%Vt61b*u7f9RDB z$St_#Y%{Y8?Po_1Z6n4PUo?-tx?5785A@u9Nk&2;o(aCkv`ANqs4f|X@t{)`CJFqX z6$^sNXh`dH6r>1L@E&7?<5#hI=5HkxA&!)@Dl6GR1ih&l9!>R5uzTNfla5DVJ`3DdE~kuus52<4`cI_eV(8~K6Z1!!Z7H_N8u5jnVJgU}taCoHY1l*46VHLfg@ zjc3ZSL6BC&x_#CwPfUpL$E9I-(9EiQ!hX1EvE+*CIhVzy$B9WFLNVxHdMPznifXeg z+ecRM_H&U!6N}4V6py)%sD+9rKe~oK(h~4R7Wom z25tr@kYvi+plT})bjQsj7~4(Z@ImHX@(I}l?;__Wq~`vsd8k81Wt>+^GD5-Ic*|+Y z`)bQ@p|yW?C4J|6M7bI-H@jUpPrdoCMcDnvS8nzpt1h&zc70^Db%!ryFyph}VuPgI zCiGR0di;LB#|zz1=Xq3J=gHfQp5k~mAT%5$L$@0MSqWeiAeOivdSr~TDdoO!iYxXKt#EzXvj{iA@5;Qp2{5``Hlvn77-%{L$*z6 zMx${&_Wh7x#Esu2c&MqecdA@uedKD!gL6jc<~jds3)|W~6lE6hBLjSj@?iyZr+Pyw zgk8YW=eP`4x^Ci2HU4LSeJpW=`!QB1XT^@X7z9 zVd0|X$T`9emfsJTVwOjQAt&9 zN8-no4U5T;0$kGZAV>?Je60Jx<~gMC0K@j9Szo&IHC4Sw3qTMyru9isemNGKBS5Tq z>k&TS&dL+DT}x)mq_ z@<*;DEStzl|CPz{Z>bRtpV#&E2|prY^tlH7sFPS_aQQr8Z&m9UY_un_VH5~C1%Sh!5XqD@LyE);=J9_(Wu=WStM#_&dzbBVB)Ex^=j)a3ox| zZXd!K-u^+rNPex>EhE2V2lkEbB8?|id<}&ykk&6@YU(bsH_-kJPJd%}suSB)7Hu8R zt6_5|j;}8booq{e>DgyqlSWO-TD;qIS#EHUJ^b&x&aUy#AXmY~tZDe3`Mi-}ns+T9V6l#$AhTsC{`48f zT&Ra+MbCJuyi*Y z!4+%X%VcHTNB&mOq|cgCC#j@+lZW_O>i>4lq2G+ zchAU806(lr80$ReKeJ%fVf&ZbM>QdkjS5f|lFxDho_oCQc$W@l%`X5&K)S!ZR9CZ* zeem%;^}U3azWi|)cu)d@Il&TS!)XHZS?D$=7{w^39wXp6dr&ywvdO|7R+)1SMGiZrui2Zhn|(BSh9sRn{j``nv3(DVHR-s~fXW;NJgS!_6 zEg2tDrE%JK2Q?SXY?=G@>6d4snzR<1kSt);%lKsRW_Cy*SW=vo2j<=gIC7)CWE*r1 z&$2$oB_1DITmcVKCd5H_+P_=0dUojkf_n{*<}%sL>+`3+*d^bYc(Vw_3(_&VDu#1) zHFV$)f&mtDHMe3PPK{QOIby(|v!V#hwXGxURc?^Il;%MzsjNmiDb00T))qJoWUxh-RB9rZgSFqHMRt+@G*hm zX$Ip+7tJ6$`D`5j@n;vCbjx#Sb@LT{6CbS;NAg&0p?AUjRLlwLC+*^+_)X$9gCzO% z=|w!3J@!Nu?rkJ5CH9Uxsq#z@9l+AiF%4KO!q|2Mm|z7PAAntc0XrVF1SJUq(76R9 zn~s}VkNwFl!T2BwgPE8-Q+9^uQv+LVGZ_K16T+TcxaeXVkG1%3wJ!?0E``3*V~wFl zHI(}wM#-s#UA358++vxvyI%_YFr~CDO?I#pwznjli8Uy|q;e^&3vB2v{YeR0_OJe` zY;pK^klb-9ZMnE)%?HTH_Mdvtx#BK1vmqgh@_bSw@LgDN;po(Q=zN1W+R7BjnzEKg z`$8@XdFbXjplwbw6JrSyQD0@`#@49L8jE>=V}|!;}lFT z{Bw2}Xi)^we9t$8-qyxsSZF@K=QK7CRvOAGNdztj3<`Lu2`T7CdJ-;dD3xm;7Ef4H z76z+sGP?b94MUJo3=C1=bG@puJK0G1@-twU^uEOqwVyYSu6@>-sB5f{cR>>k6coQv z45JR!u{6lF65v*7Hbs0fB|<}&XJ~S2o17QdrL=a~ZfWmQffC(N4Fy?$F|#8SW7KX3 z{S<7Dk-AKXUFaK7hKf-Q+==FK@@Cc zCN=R5(!oM{glMw5_RLirT~&F0?h%vG1 z1FI-cHk@@vBxScM{53xvg%$(AaKw_Liv*7|i}c zSX*`^7T<|HWb`O;h2vDJoFLyj^mFi{F*Q`HzJ(7vBfh2`qJYiytvE;J9zII2j|qiQbu6JdATurSa>5QCC~ zn6@a}Afx*-K0d#=lU4sfTyP}ldJ2edA+;)I;Y$%Sl?k@;8?D1aNAeOXK0G+>so@F@ zYVmY!23M*LzPhSqHTQX>~Lx$(!)q)UZEkYf7wqJ!n2?CZpdb%m40!8|(dGjB`3 z%quSAj?T)>w!uJU%V3i|QR|QJuttIh|9Pn;hZ=*jjeHR#e#Fui77c_naFc0yN|oyrtA_(3x2 z9Bc`+!$S9Ba+CBu^Lj#Y>d3@kGEK&TU>d?7WidGyYfWex&b`)KsN$Ji$K#HuESXm5 z%=nwev;S$0mA%jy?jQn)_<_T?;Rv<1vO_Q&*26?(q(IAaVF|Z)^p*cimUTM80oX;q zqQdk;Qjt=ZM8~$eLC{h1JG8jZ!R&^7H)&M*B=*XEF9bqP2O#^Jf$B- zUy>+j^*@tkt-*n?hkiu`>4!{g#XMsdfn>pq6!xtKF_c?~Q66fY;?s0{eUKFI;a*y< zHdr!zup0hGv5@OjCf$Vb&?`O>tWjsZhh(4vL^&aony??qKqVS;Dox+h$Slv463i!x z&uJuaA73j{bc|vRjB<77>+0R(se^?V!i5!9_ryWRWx2-rNay00A#{YL$`r;H6MN7) zqdBLg_ELqKa?IcPnyfuU#<7ps0B5|ha1q)}UK-9Ad;L|yahy$?&aIB*0%XLoCu3;qGmmr6>!6B@3eGlY zZfvyXqM^+`37hA=);`ka_?C?uMDeOVk4wPz#x%y^E|aP7^U6_iB2jj`*wi}J?f~Vz zQQ>I&j(y=wRg*PUc&_UYoSAzAjm=O|Ew0E)q@Ofg=ukgDV#S6}xx%WRCp&q7iTtgD{)%UKhQl&m-Jja`{I>7(#VzE|6Z3vK0y(;KB=Oc#~5 z2MJj!9AR)v0f`FG%ZjN2yZiHNsR3;Ei$xGsmQST&7Lq&%J$B^xlW5oWIncG=r#CkS zfBM-H$?4$zFmI1UrlQjX;J`xbLW>7>c!%DUm7roEBJEq7r~&cf&-1?vupuWk?hI~g zpEuz3KYx~cOl0X;XmVJFR+Pmem7dcH3DkZn7_NDnQGJ;O{F!uu*SE2q+n=?hr!qT) zmk<8He`wl>Yn9PXJF}clhlBlCSdm5)idyHt82Lp%;yv!{&esg*@YsXr63_}&L~ZaJ zDqz!}ilGMllcfJK@b2+WAjKp`!86~;?4G1kGX z-77V!)F+uLe(n)Sbv;VFG%oDYI=MT!#8V1~9d3LR1pqbKxRZ8&dzW%st;xHOR58>AgkhVvLyF(->L_ z(LsU=&aFOu8G^d$n{Pq<9L;p&9Bz$4&;^;deXCWykL@GeG(E3rLykY-4gg{{fK`siVL?pJE zPBK`UAAV%^6o3L~5od`cafkei&Sk87-737W&k$3DBUR4l04A~@X;};0X@POM`tlK&Gn8sHXld&akjM150CjYizuN5 zs@GNOV~U)62AHQa=2XTT$-v*f8K&|?+&nq+SmOa))ne(Lz1A=4zt(;-erML|iHuND zwbdCu%hDuCSjK;Xw9>FGY$-<|815bpZO>}vvkdb;hBKbRM>rd$4uWCP6ZdRX0aFGI zHKm6i7BgC&`7Lt=fo-(EMs)l5p{KjJCPu;?2B(Efpr?PtRUj+lE zK0u%^g97YJcU!u$Kv5kOnz*Lxl$rA}3;j>ryJ{m|JF7=}d4r;#$$eE^&+dl1tsn9l zdd`3uRKGpDF}pL$#0w?c!X37zHP3^9qEz8tea<=4Yp@Bx7as2|ioKJIS{a6Rirfp-7%9=~D;>y$C2CmN#4T&t`r4KMtq zoK8)cp+S%VHx?8GC%Oeqgt$YEI_ zpMi2Y z7(=BaHwwFou92uQ#EZS%iG7n_aapqWI%Kv&9IqMrMJc@;U6+{r5Op$%Ao z?l5$8{=-E=snx4um-%MEXTZZqV+`mPWIfK7mighaEN61`xmMZ8r1tVF9PfCuZvZOM z5fcZ~LSmDyp2cqfH?QfAB3KX0?jgHMjY}#aXH;j+h+c^&C&0aUa*t_K%ltv4(+}4@ zyr5GG)70^-&~4-+ia;{EoIs93S#ZUGl?2ED*87aQXIL#?Cv&@&=5DFYwB2IwdF(WF zY-AH#w-!}eV3qdt!Rt9=)|TX1F30=L$#Na0N#MHrG1>QvErGoSWAQtJHh#5Y{JlOE zxmQfFTyQmeHaTudo@x>+i&1#_t=$i$A#vzbz;YuZM1Lj(a_z{FBxgPq>&hA=7*oXCm>741x`@BsYr{A{iklpOOky7GFrWsBOpM}4rw8t8cOAu^dWnnJ+g8Upe%YDv4m(1}bP zVuV%*H%?14vipuPj7y+p$$Ml29n^#d_`t~w)-2TmuNse2>#Ao<=(op6JQ^*yt1Lx2T$;K@+Ti*2<_q z9O3fIoEAt9yb)M>V3|Bn@X8L~4I+wEW)-TNYUk_uCQWUOl)rptcJU&T zjTaWM)AXOV+!9+*c6c1!rFCTe$89oh3*HF*o_(3xeln*$I6?Im^(RCZ2#-K3l_ z*q11-TBIeklQMPj;~8a!~7Ax6CJ(~bA>}5pD`wpfw-$gl9+CM z19I6c>k-CZ+kOTV`?>oQmlt1qJp+}ycchp_aUVkfmtmsAP|jORBsL0Ve_TM~!?UL- z$B`ZIqBEx8mL0Fej_D?wGRf+zgcp*$7OT~@i{7q_2@;>pi>0Dk75fa?rzrNadcDuX zH@YUt0epXX(--$#;$Pf!_Z^iRFbz^#AnNqibwax0mrcG4#8VX&-kH_PGprR^!sPUG zTQy(?$s{2Pz9`;yD(=8SExEuM;2;&VjGV`|ny)5;@X0F=iJd}_&qN}v(~d&itSCx? zr*qvRi45WY)E`;=9m2tB6lyXKsvk=^w4+mP17*79??yRgb5Ei)`PsEB}3X&Us^>86TL$heZF^{zDH z3mLuw?l7+R`_ukT^SXVPH%`Dkmu$md1jlIP(!Di&{Fb_n&tcI7^Lzisj9#R3ibSs`0mg z3=MrN=0(C5e1A4>2U%f~P(5r;)M^T8ULYBZWfVcw%L@gy2%gB+3$H>KBw7eCtGf+P zX(r?E#gZ+w;Ia~dVmhFzWNH%y-VO!Hy{zrc=8_BY_+uC9bP}6T6A0-RC?8|A2BcL; z(H#$};Y=gZM4N*~1!7tbXurCO=3TVr2SW4xJA z*jkmF)>%0rsH+p-v_4d5CzDMyV+J)Hq@nB!KRN~`qgZl2v50Me5-4byox%6a(5Y|6 z6uzn_09&MvxGyS)KDf7`4wm^=Q{?J-oL;sVQeE-sRgEY75>}UrBh+VUr33S#>RbSa zN)0S&zYT8Xg+DQlDziqwxR~5RN-b>Vw80mkSw6!;2R>yLjG+6g zadfY1CjpF>zTOeyBdPP@f+~zztC?KWBayQ*PX#B^>eCvORf9;zBqBd0UQcpQS6#Mv zb)6?cCx zaMpi07n?G${WEFsw^9OzL;^#O0;;R^yvR(0%(PB8@4^!7oecO+jsh&-!*#b)XlntP zZZjX|%=W`-8AX(|lB%Fq!6oN$1~3iKZ#W`3RND8x?y0Io3Xp_~5L+Ab7T=`*t&l#_ z3M!VH+SusMhZM17U{^YR>otAD()U8x;1e0i=)nSj@fri`0Wq*m2+wyjEN!@aEKVD!gz{x?_iq=NKTKGn19mq z%Dr!P9t7Pu=-^D)Y%~|21gU?_tGbIE^6<;quKQdT-e^oxYTyw{uk9_~$8|HqZu;JvP_mcoo3|peDR%yCE=bx_ zULU6*^m|G>S9W9^GjyAEt-ZBdO~aaB-}}YUTOQqH%g*O+p9Ri#DHcX9#L*7DBBTmy z_#JB2$!qhMs|dAme_vga$7>mX&K+oTbl5JOu#HRaDz^SPDNQn=^g3L3vrfGQQ6J$n zDf8+YJf&q)>vNYilj+g6FOO5O3{F_}T9z;JC8!43zbp z#B5zCAp|TU%OnGh^}A!;0yzfGm%2tn1lIEm@9YJfoIUG8ypb2S4Jtavs+|!=tTo{H zuEhu8xSmR6BoRVQMsC4-?pM&t2m4}=K$E5k`bEjTd^_vdGHi0SGJQ7CMeaP`wC0p6 zAP>-{yWzHXJ@GwdwB5ctdqqGfX~H6!@&?dv0Sd7Uzw_b{G`W)c6T^BR#H)ULWjBNqn-iuf>w1mkGEg-!?q% zJxcP_um{%e$gpQ=mQ99!6R+6-FOl*DCh(|0DsX*zC6LPU4}&qxVY~O{olVQv$+RbT zr7c;gS3F%ZI(hH?5APh_LFA;Av zp2_hw)T;M^g#8Hu8f}zwM5ASvGmCEa{?h$r#fABJ)=ubfTr2Eo~NBLWNOY){UARbNkq^;s|LuP zvE;4QGj%VC=Gfg$A)*f`vf*45i4MK_&9vgqw}u`)w(@pLGhV}<1Gu9X+wN2-=23XE zdHy6;?Ke#|KsJzMoysr<1bp5vHzy~{GI?0Wj%w+RN>gs@4oM7$@^7ZH(W|H~Hr`A@ zqH(yJ!Y_Ijqg5xi63VMUB!&*~D7H8yI10)L4Wk-XL%Sx|#rBm@SRf|=9>hi~PE%5h z?yTmjP|gUm6S$=}6#k~z&ZTESB_>2ck=kb&Z|?B)iH3C*HY^4+Jw6MyqdU7dOdg}L z10^(H1ouk5|1{Z?2}T)jiJS!!H0~FpwdcD4cHE$hVD*|N?B3g8)q{tGXni9mLalva zE3Na*?s0Yi?Uj z+v&TBk3ftscAWhMgjXxvAXDPGjdJf;l!u;y!er!9^6hO{0Dbj>B4ckIYb zZwbom{RHS1v+^W-_3Dh#wpZ$Vyp-Z!1Sc_PRn_q;M-1ZyiD~6Uk(7vS0(tmSF5n0{ zm6L0}uzN|nUrO8o=4r!iCH##;^B4OB{2PlfRF@5h<2K;yzz^EL76}S*&9@cIx-mj+ zSm2%$a!ksAZuy>C-?(*6NHHp;#Bhox7@Cy)=8_@<(iWe_W>!|R9N=jm%37zma#t-g zfH-)v){U;8n8V-7Ml-=wRpyBRpH3}oKXF4S4RX2&T5$Zg#O~P;=N1#_PABM*XF1iN zp?>T_ZMGe#(uxi@Ig)s|Q~z3t3FNUxbh2tKoQZ0VMu|yydsZsE4I6+-tAz<0xb1ti z{VG22BfY#%sWps^Zk9@~DC)_&aDq(#r_OhM1XA&_Qi`X%;YsDSW~61mJmN}#k7sz< zAPX;e<>o%-Z0-6vnPj~Ft$pBTOC{d&UV!{q-rXO(=*{GWH4584Yy0J!3k?kS3D+7DskO}5~Re6HIs z%-8GQ8@nuzSPQ2?1WV(j{?EVzUDDwyFU#tEI$d4sbE* zm0PPJMRV8_@(V65VH8d;$l3)5)p#8ZM$lK)(@o83*Dn9&+~|PF9!*8 zzYOD-R)Osm3HP-gdepng5w(hX2(0z<cwW8U}4|M zR1Z%MflHOPBqh@cLr;KZ}XE$$(c-k^cOQPybD?GuHqymCD0(c@b)m-sYQjjADz(u&z z97!^w5SVj%Yj$Je$pqS)?$y2zZ%T~U6;{${!KKW2yV67RHL|BJ?~n>jt&wyj(ODG$ zXZ-tc*!@Fm9u?{V@jVZakYCTc{R+F~Jc0dE?_;Gje=iuo9IJ5JvW@Onvxp{m%Z|Ax zQFY9}IGWd=JH(;$A-iZUa5GHFBl~1In%d%JJp4mMGB?6U4UPQk|YSRe!gOYra$?F_>KAcA=tQ~i|2*X5*8$0W08sE?2dr zewQpQtAZK8is6IV0j&=g9lsl3+35XHvm61rXaT5UNqH_PGEOy=8hRwkI}9OfJm_9u zI{0&-6_9p_ff-CMjgkW}HyM=(SHMn!x$8W_V)Tl$vy{)kF&KB|cznbdlUvXM zkMi$5Q#3GRj$5l~a>4bsHcIZq*PIcn@d~j_lTsaotYEMc?QD%S@)^4z%Qv&2l2+^# zs}TKl_^zJ?>bjeG7;NrgE+Yj6jwC*=;bCEX*7qicezlO~m%t)E-L-jz<5K}`^-y_y z`7KhG(mV>1`H~{?Jum7$uwn(@oU}}zK zIn`z%!;2&n=9!Qr)*v{RllGMgf*uy$&E|ufUg3Dg>wN==-RHAjbna1N7z7UZ2j_-` z?WVxE)Y;DlQue`vS zf2QCq>D$;Ja>0b#d{PV8T)?SL&TDX;A>zb|*m7jpAOdwz`T#6h;)lAdD0Sj$jpa_<1+z|Q#rQ)lctdR{~NiWR-cxJp)JNx*8 ziG@fN4I*qqmsH|h6Z_7~)-3R)LT;Vo$|n6$1?OteEyD8eLqym58FDhT6P8LM`)XQl zv>M-ya`z{w!@f$AU<)VCnD(5rG(ZQ5e}wb;o}oCQ%muU26uOGewXFNWG-}DT?40c> zjTQ=-Ryu%?BXRdaU&&mmMIO_B3QG{C8am6rEa&yqj9~+YsInqvqUC}d!K{jTScVc? z*$@(*SclFFJS)(=xtzw3o_^DP%=`|181y0ntBiPAq{Y*@ZtP*8KH(qYHJJh zNu0!p2n2Y5&p|nBL_x!v2PF-c_zyNGi^WV#BW&o1dC27?GFQA zvRm5+|8fyyiy#JZkrS$%D*64Xkw}JU*1c`~c8HaVB!Jz*yQV2x(42CWEz731pi5b` z!Yv9<+ao(m|J^9#3>7gK+n8wI4$(v;=k!_6pSJogr5-Ppg<@~9)$s6Wy0SrcVG&bd zLFWp9oQMs)(W`>bumP(ezAQY(W z5-P-s$}Goq{jk(fwmn_;#UqQT&17G&U%nhF6i{W{YI0IEMHsH2974Crjt*qm2RWP7|@%A8I*ht+Pq2>&M34Ce(1d($xh51Q4f> za(pN3=J>fND1ZOgKQ}m(8mleQ{MW3+f3n@Fa{7J2jPNt+{y0k=WnYv+@L1_+*?PNq zKK!&VT%13au+>*g2U5StBJmSFcBQWessizia?Wzo($ox12JGi(h77BIaC889$zS!E%s#0bfh=H+ zyxR@ryYL%6`xo`as3aG>et1(l@Bo$uvgaQu89|*<4rp7UYeyAB9$S5j{&>_Vai&Uw zufo=i-6C$w0*j`tR?Y3YaTGBir^bvC)z?E|u?W=aU*HK<8h}FYD;qQX&Moh;S$0&b z6YQch1T^&)fP)uVQ*Rn^Tqpp2U1k9Gu2DXVpUel>_%Fc6upHrAurX; zX&j&#&MnviJ@9_W@@kKSe_P<7uem6Rv+CKWfn{UZ;LCUcO6;&$MUAH9smu{=F5<1O z#mPJzd#Zg`g}1oD2053vL%V+O%6Tle5$FLgE*hE0Q2o~fQaMiHt*BMgSnHwBzxPWR zWob4SNOWKGe5XrdHWz@P6;S9q!+pvZzR*UqI2==4A6HHOpP`$c(v!vYJ*NO66_7b4 z***ObQ^5!MKTYS*To>ip8NMPCSM`-gWq6_oD?ur#lL(&=YYj~}N70>WeX%^e0iC3l zC{!nqyWpX2W$y7R2tN)BPCOxF!9D#c>$(BzR5=F2guZynT|j|>fFBM%VWbX8oJOtF z5La?KER^e5YL~94s4=F2h@JhcahbfOZ1Qs96feY;Qc8r~qi4OyU=9~LZ$Gt20<7pKJ)ulhmXX*Y~wjOYHd8-G%R`a{P{s^1MOz6Gi`0C08nrCOc<(ur7}W{%`X7-4hD~C=PZgFGZizuoi{z_Gqy+(S zJ>tKHTZrnBFz#&Nq!+2yKx!_UGId-)dpt>d6sl%?)%rvG1TWkqKb|$$@zfGOUdtUR zi@n_lFubbT17UJeG+@nNKkVpIV8*oXBFU{K32{-KApDJ@Y>H0=BV2l-Ti^pM6F`dY z03$<7uM!DQ4=XTCo;oxzV8T^a)`R1vo3|1gNhT2$*6122c^bszx{@R=6g?_nwlXX>x%u4$0ImDkGk$zl zF4)HaUYW+GL?VE9*>*oj#PJz~cYR87J0D-p%<0)lEo=N!l2IXWK9yOWv>+Q}3G~A} zO`7%m{J4jtXMPx+eaH7{&YpOoW~4a{YNX0mJGgc;kS0JmqV=$By&;sn`D`j0Nj^Ce@DI2rGegRSbJ`aJ=_Q4dU23qLdO0XzOh z7ihY%7VA~kHG>0$6G829+Jb95nZanu<4^N?OJe^iHMUwLkbYurI?pZHtYYFz>UJ2< z(~KvV{22GDjdFQB@fq`Ow|q?YewKH6EsNrVAWq68CA^FYr7?B87dwP)H~w%(ah?CW zq?&yb5OP7W45+%tUo`UDaZ^YqPftd&2PO=`_VUDuMMDyHk3?^TFuE+mu^}8S6ofJq zD}8GdxcJt=(1Bo-Lla!eWxNuZ88Bs*irLKSz^L$5aYmmVnxvd4B`~(z_-JeK3+kD% zJ$xo;3Sa(Cwq*pYmMLl$=Bj=KmoptiPa8sapWfEMoV=tjj@pYr^+X|>0O!b=k|>eZ zY2UTJYiB`))55d{`yWD`zjEAktQ79Y9D|-+{;7jE#QpP|S45ZvVSRDEZQX`|f!@zg zHVgtZ<>}m8d2HU%!&j#4jG~LN*rRZl&mD(+A|uC(`PC&T%yBO+)qH#%Q@N|P-Y%y( zbs|#P^RFqJvDl^bh|cH`e5&W`Pum=zpkCLfLq*&?mHh@9h?aE=2#riNm0F59OU^u& zdOXP_WoZhs0fbxnOW`OTh1`G3W!ThFTfoe_i!K_HEW;j z!Wg@LQ86okLNGG;vVZxaaof4dy1jSX|4uIw@WVj{eIf(SzHl%FEw3^w)O?w~!r>Wk zL{dIe&Jl*7oQYCFMTCdQ&-gQ$uk>{Np84fOf{?e5)o&5NCD9xe$*R)A@HB#=ExT0a zMLm>DRUW~qEzv98yFfoL8oRd6`SRa&N-?5RV%)IIn=16yy^)Ff^OfCAVr!Gbopq#wd#a=^SQ`EBO3DJ zvJOIF7ey8;T0MRyLM|#yq9TBM-Fa2g5_FZkLHN7`5C-I1Dg>vtEUodA2C%m8AeFC4 z88{G5Zz)_O1$U!^b}+Ia36elE-+$)Npl=*k_dh>uOi}%BZjm!exzA?2Vt*_?l4!vb zCq?I^(mJo@%SLLs5{fiC)%l8qX>USBl0b$zlhIvHhUoc|t2W2`YJOB|4{Bs6Y8tH1 zjh8%7YE8{!41nswCjuiH3vk8?t0cxZ7(gl`8PGtI&CEG-OcVYE@wjU}uV2og}r&)K;be(^% zA}T*&N*1OR7xEd+D?+FerlQOR$zN}*ZYrvsK0NxM5Z%awu*RDe$oBvS-jo&edDXZCQuqf z4zp=xK9({GcfLDkw~`klPr9QFay6vSe3=OpJP~%D{#kXX+9cNzdK@*WQlsjmbDiyd zw7|hVVxYX;Qp5B18G6FduSdx3lBZX~1&c@aQ0%8aKZMLDwgb&%>FJHd#>7Om0RikI zIN)p)j_E8u7tf)A?&2+o$>(POmE`pA`oz0=MUx3;7Z-$w0Cu=f+xSmuA8~;>Vp@1g z+LyD*b)1ER9ZmJALQwjVa5hx}Z=mut;PTXoCw?W?Eu`i$IC2u~Q>F`DkZQO<2shd`=g2uT{j`R(s5a>N z7^tH*QLm}LJi1Hxrt?e=yQzFwn)XIWjDd73`Te{wUX4O?=!gi|$K#S0e4eL2-$gU1 zZYcwFu`Jmz251SO&uA}^@*~^FkWc(xMhWBXCjW)$ua}aIrX8w$KLZ`TZ4WdM3Yn3D zFQ20-)V?OIOW<5^dnK^1MnnnJEe@Np-{Z1k^f6|wOq^skk32@{uR$l)8&Y#r%8(?@ zUvMH;d)+VcY@CSY<14C3CE72XP)Yzt{BnSr1tknqTx}Q%N}e2O0uYHn5d%zREX63M zR!VJi6{9qv?n%spQ(HF&YW8lHh#&7CrQ2>*+A~z0)-M#LVi9SkZMF?Xs}dnUo>+Q^ zFwpjQXj*W_B;blAhi5IqCZXEOUf^WnY5bTR-2k;M?8bZijISo#W6$_4UM!$zKGMG+ z&}RKTU)Mm|zzy4ugA*K2`tK$&Atjkp;3Biu90eMuHL#p$#q&sCG5K2hh0MR+XrNWc z0Y4S0)}1w20KD5YTCm*-)%Yj>%>7l%xV3lMWHMXsVon@F+pqqF0fIEOARqx4=IK@7 zwJgw2U_5ze%Y~D04eD270ul8D!1?V&m$VtjPJ_KX9}~ji(UL8{=|7LDY0V25r)H}S zHJRcuGB{cgQcyO}oLRx_q_3Hb?8?o+v}X2s5MwBSVjv-JkiFsU*vdz_Lw>gLSz<6* zPc4*Pv@$%o55XWB0WF7$HxZZUv1GVE{MIz$@rTpp!4Ee3`7DF$Nrq)?2q+iALfA8Y zOvB%7TSQhn31Yxxgdw-nKP><-h=&m;sC|}ff;trCZMWaqz(o96p9mfE6PSb;{{b5h zvB=)kHOjWaM~vi(wzv?R;hKA!)fC#sTA#DfU>rbuD0f+1JeB~eZfW^OH|#k`>m43m zf2l=W&EkaT_ptO72r62CX~Z`BmXV(6*@|1fNA{-rzYdp8t#*ZP*@7n3e_Gom2cwQrVYOZ(ha zJ3`MY*?&B@n?OyGd26yD*5dBPw!}#>sb)qOA$(<$;6fi|P94Zpo10t6jq9Tg=dCo= zWL;CkR;z$>oYdL)#q-q(Yi5$HuTM2UWSt+~6bQhu7(tcNB+o`9Uo7_5>Zr0fp(G@C zm;M%|&EIgxnZ>YG1Cb4ML}enEA-wh(HBq4NdYYr_*8LYlcNzBT zhT(V-r!6`DA|s0k`l$o|-H-^Xy=mG2Bs%^acnPl60QU6T!eUr$>9oF~VNk#2Cbt~y zMiQD!ZsGU43%F7&AJ>+^^=k}@x!|Ago&+Jz?q(cpg5eOHg59FwrM4ue^I}eqP|GRy zm!rPlh>#gjV>Z5go@zu(mb*@zE*A;CtGM3?aVVVm$i~~XeQe;iM_ZD5oAEM>NI1cQ!+X{zJM=kQVNB0FLS+eL`FnT13B4KWgk4)hkPc# zYG-(>Ww$jt>mAC$6Bi^uE8>MnfeA=m=p25MWJzXGt%C80!fw9`Kxox)UN#8AK5H;N zynv5M;%^3}W)?(1=burzFpD<>e{BU^xXOgQtbsDI85sq$SlW7Gb#?6qSYr;#!iMC~ zx%~D|g*3=(n7i4nk>Y}=n>I~lar}V%4o;hnl=2~07$papnhI8H67SYE(i}8tZn$iU zbb`Mp%V7_dMlwS=6d6Q}DARtBG;oQvVtF+GIj3TzWOj|gf_$*wC&48AZ5e3&*BlDE z%)iWJiF3QD%w)}mRA|r;X|hq7?{+l>$>{(dy3(7Is z5z6Vs@SKSY80ujVk7fm8K)CGo!+g?iH)uB66Dp2-Ma37!`m+2ib&4<9aBAOMOGN zv{583K9A0`Aufu9yLis2RbdsH;*iM$<<`SoxlAEtYXoOFq?U)uqB0%ntDqcS%=FL> zmXsZ`&!Z&D-W#XQ2@~{Wj*rdNnPX}{z^4tdnk+0|+b<;-i@5;S~ zdSyYX%U$T&vs{CzGrfTdP_OlvwpnMPN)e{1%wDJBqVbj%b%PZ1RW9*!)90pm$f+fK zDn*f2(cc;`RX?@Sv2p7YFg41klutS~fL(z~M8OPVB-g?>R1)@l@>8EPqKF`V(F?M9 zY@Cl{A-bh96l^Je6~-TWL?N*82VyZ!Convg`qcE~Qt8y{Ls_%%V?_`>M$d9t?zd2= z$BD9jYkvxnK!=h z6j*SV4`2erT!4HkfB@N+T6{z!dA;6+4S4&snk8{5x#nx(!{K5>i)uR;pl?^6DonO< zil6#*Q3n;wlwttav80;5=&raS?~Kh*DU`#Qm_#rf^ZAVRKa)KKdvUIOhY+tt><%W^U9RuEU6r1 z9wa1pO&ybvc8ZZ{5ox&c9a^O;cAi%hOy1pCdw!g>6Qd9LWgY7jjP8(Tv$Z+h{bf(( zJUM{3(XcXF-M=^R+k)9KSL?$0N6*Xo2eUR^H;=*CRW2(P5v~~}d@@FjM@F=9FdmhL zJ&J39^)lG5$~(SGMQ9mU7||p3VTPNsGUKCzJ&AN0cU zCI~;T^v~Th(q7W2`A3s7rtI(K2;BBg|UAI=*Z$L`wD}VE@v`-9LB@YgtLA_Mrlf zGm=ZrNj&(`jR(*g|G(xs9LZNaVZr*g`Q+ zGaj0EVryS&`Sck$Sb86?DKXRf(E2pP5HzoH&R5J3EFzdX!3900FqoE& zqI}=NuUTSpAuM@4>OK-U@=cUjW52({3Q?a{4?;f4`s*ehTSg-5^9E*`wO{u``HyVF5sP^lc<8|86x z5*v%_6Dr7mmocZZN678l07pQ$zn^6SpZFj;&7ZPu0f_;_3dOtSYQ+S`yZf#FTO;V0 zo$*9TW%(pV+*k{|dCzMi&uk&ov{UmmqIEv77QR?W9eynDmD{Hs(4bR<)Veo<;n^@# zQc}3v6n(A%pkf+|mZ#HuOJ?*^iB{7)J{b41!~&gxzV^1^qj?t0xIjBI&r#hd6J*%K zvl|yT##lKFsw)dpRE)O_PL3|*N;UWYf?KSs>Ks;b=By2uh)rHGq;b?76}|pX(?_06 zyIZn4@X72*w;~$R6k1OXV`ppyGFKjrOgdy!hK9yLVUH?`(D-X5q_i{XoaL{+G7+h!E<9c@@2uzd81zP!EYYZp-3elhVWKdNHqpo(eE~MUc z(->W(tR0)z>1ppj-4<(Ixo~{IXPClvvFMTzZsI5CeOEen>hOLeSSQztuEMMsjV4Nn zlmDaw!oX_l47f@H0#(z^To9YBr4TL=o>p>)lva?83byOL3n}suUxhl}J?`{Dpf%z3 z+a)80$x~Z<2O&7Y`YMV5s#^ zmp7_3EmZ6wl1qG&8y84#7v0QI^6Inf*E{)_~+iyPp z1s(Q1OyEPdh4%SBB$p z_lqU`Sb`90+NF6vx;82$<*e2;?_UpYk&N@Lq#b`LDa-XX?CfE;!(-07P^{+wG*xVl z*Mp`FJGRkfFI5MYDY9DLto;&--5N}K0Q84*(ex6BzXzEI#V-H%z9Fb$8jX}(0z;F7C;{76byDG8`@`46H@`V%-rxeQ%t<34+0am`~-#7@Z z7xnNE1Ae0N?!~ENv{C^{^&uCBc$j5M8|)6XU!X{7vZt%GJajq>7-L;W7y3Ge&|)Sf zyX(*c7QwxjaGN*bT#a7Rhr93bUWQV0EyJrqQ%X`ye1_7EWfv-D9d4SQh=s!9IS;dPTP}-o2PmlMrwLw$!Tr=N&v&E#~rSuL*GZFfuO zlf{$2wlHPPU|Y3t_<@@c>>C#tRdzF zeS>n`aMT%<*Ppa#AaRoLH`?b`LT!nlS%#nIN4}fjbYW+y0NIXB56ZUJbg6BTMm0Ix zwNRynn7L}A$eo&zc%4T@ti7O4Mv6M#By1RdA4{xcyI7x}@)QsHH&%E3nj$K2f~XRr=z`Yz(YV5g#0ahd{ew>%jO1ai-j}Xt zF@>!AyU zj`uh@exG$7sOWR_10>@beUo?9>_m0=G=$W!M?bH&!bsx2Z*G?205!QxZZX=9<0fdJdQN5`3cNtv6u7`7HV_#_oU8>bN}<|205mBk-&)Tph2 zn2c$Tt-=5)k$e|tKTt8`@x$3(40_M_pNdrMlkdQi*83d`YKl-H955O{+>-d$uyvpj z=29<%#L489DCg$%*Iro?j2Ty?=&r5ju1+jo3M=#v+Ir{I1+HZg)?{Hm zCnr@DxrBQ&Jk7in?ty9h*d>hjVZrWeGiktF&Ex;B6!q!!VA*gg0sm%Y9<(KTz?I$2 zbA+Uyj;5&kjp7vNk z_O_a~uj_^DSZ(m;)3(Zd0~!ZTHY0dCaXS{M--|{3ajIp9^?mW-n>;psuXC`c#Ev^i z;T^1EE9z*iem?O;aB#u;BLLO32WS+|ECFhwy3=*wx>z;WXqIrk6XfYcRmSs;^MugT zc~qH;%1^#lEABRRJI?lk6pMBB8}I6{e){{?lvEyyMbJJCu)7~yDA4IV`T3o61|?S% zgSyc*wZ-{X5qStT^U9WY(1l03A)i6-3JO42ozv_Tt&pJP(&v#|2((T=r$AYN8S5XS zSsLdb_1RI>!|wpAPhR@t!g%5%@_3>2Oy+)s=Cw9J{5!OFgNA0bV=0Ik2@fB5OX)iQ zNd53k2dohP+Y@!2N-%irUqXa8#dUEvNOeE9&)eF8;7GXZd`^8D;I<`m|6!*3aZP0; zH5ik{cwJQ6J5avT7$B4OuxGtb`PEF=acUpj zyNKOWl~+5EwLzYiv7G~jAqQti-xiZWAD$`Oz0@u!cq_OTG~a%zX>}wuud&fW1SM#L zuIx`scx7;@U-RP6_FNg=f_TRViZO7%%vi3URIfHbQ}qFXYf#ZTj|zcEEkuzgJyZAk z@*5%rJ|GX_2%4fJFA^Dv#PFx%;S$bi9J3_A>50d~*whgYY{0b}jBCDyuCDEO_H~iX zvd*nG*jQe6E;wjj#T?q5pxNj7rC0yVP>=5fP2L=#7!Q17O-*Yi&eRRAPuO(ETLl;k zi;9q8Tl8g5YBZOUw&aQ~UuikD(gnE>@h&sU*c2K|_hHFahMfZWwm%UEDjOyS}*oskZ=q8h>Ubv%mvuxpgXTzc!&@gzx-me-QD61L#$f| zZQ)d4z!ey@K{ui#+T`+#a)F6qwFjN4$_fU#C124>NTBLlRZ$XF?kVBE)wG?3FMES7 z2-9>v{G70_sh=SCx&LXn0<4&GbC6>1Z*Pw%;pv)Y$1%`jY8@>F~cvddYds?-J%6 zgWuhbcJ>UY%>D7#Jn{pp4+@3PHMN=`*9V}NheO>HsQ5@tSVVqxqvMF zsqq|CX+3Lz){Q=X?uyvb*JinnyQhbDlW!6FKC{&T4T;fu7Vkd%) z8&dap%-4;Nf-TrQv@y7e%&j6l4$L;eEg;K|2IU^@p31<@4Iw?)CA7w1WLUv96gYoMn5aEHF{(i+Y7hr~O!V!D!f zM%DnazJkCrKYsBs6zckr+7mHEyG}qYT_p5@@1u7>; z@AuPaDAAk?U%hp2-7Fl~G~>{_pF2p}OqK3B9wesi$^G)zXV73~{ldrad$xenrl`0m z&Vf-jiBcS?84LiYrQ}_CSr@QAIuAcy;>|u>O{CJtB#E%N>751Ats)hOj;t(T7!CUV zOg_`tj($BvPkuwh?8ut%8$L{+93@izk8|mDMN@`Ty$6L+Th(oPl-Rn5dA+aT9`3q~ z6H~c9Uj{WPhq(&MG>s@%=hBnrRe03~Sh4Dai}BXyA1{9F_b{X-{+`T-4Um4sL4jL6(&h~) zk#RbY9-m>(KF4f=+VSkx&Q7^j=v6U=;p^O$_L=h*+w4V}4pJ0_21#E9lD2T?{=Khu z_jhQ!!?X2q+r)Jdy?4TS0B!noXahU7C$OiWeF<;r#pj-+)7j6ECCCX427@6#QH9Gc z_0Y>% z6>=5h8VO(kD6I#_9O&rgbHtPESXQh|5R=*l)@bMfqO@%C=xp2GM#4Ygnp+iieveR8 zW-Ypa&r8QhW1n!aQQI8HbtF5gVNqdjLxK9I{k5|{wvRrSDVA_XQWQl{!*2P7w7)k< z!t6MOqa)`y6homUlK;G~^t~QVW@t~|WCkWxP313QY4xP%xVz?uI`7034dvTC#nV_o z(lCKS`3fP%w%mq6Q0AzsF^fz1T>)Z59)p@>33!1tO#g2ABMWo^NIGn%V0LDLE& zNHeTKlLd*0dPO^;n!i*Jvi6*I^C6ND;FOI*gSf)P^o4`SRFq*%QHKSj&gxi@wp5+S z-bYmNXJ7$sXkFA8YmXna82(SK@wu&L)x~>sdK%H3*~O&@Him=om;=9ZUiy8(h-TX+ z=bKM1qA^qbLTY4F%jC&S!}!H2IOl`g#B57GnM7STc3szb8_e7a z@wJuv+$*mykj6YpBUy=|nsp>=rVP^y?IMPFx8lpf-yW5euWfTVy4K=Fco_;4Fr)>RTIfB_m`R2eh9r= zWKWD8Mq(8 zza%pMBU(jfgH{a7hBM2ksABAIpLELV!TY?HiyNkA7Voh<%K_GQo<;=X^4D`mR-L#E z^ac6Fe<%#>q!BoAq!Cja|NeauFrFzLW-S9mz4n>$F3nY*nk#2C%N1fJBLLoX=hCqg zw52V#&I(Li8{!iXncuYym%8|SlE*2A>`-s3^Il})GDcJ#jt4g0LsyPpVq}u6!W0-`Vy9 zLhaDd2WM89ALiCSxgCJ?3@ENrdkWJ9>pM>#&QxVu#_#}dvxfdd8Uv4UxnhYH(!~XP z71R<%G_Pw`4P^Bh!_>DdA0=WLt%bp+^fwMXckBEy9Itn4*r8V$Ywukz;S`?vveUo{ zZ#e;ds6xCxSS6r9T(O0nY=>}tG-mEM9}pYK0ng;2Mw$x*_9X57VI@+4h@E7~^u@zT zUgB=+C!CpU zVHhGovFji(J14-3R0O$3hPytunb{}gATeQ40S%X`S>E-{m?d~J*Vt-VZu^pc9%Va5 z@-5)r_m6t$X?=C|dz^dUkz5m0B#0z|STEP&5ll&+&>PDPDUa(y8EhSIQ0e<_XmkfC zYnq5zX-$%NzUtZ)pZaEi8S^|vt}xhQ2CKM1x(sbuCZ8VW;QTu5LZsj)6(Uhp5VfdW zyDy?<2f=0hxmw(QTo>z`(n`nlU~}yX)pd1eVYFP3bs4QT(1G)~**qSL*p?8&=O9m! zX3I#S7@7v6pYd^G_bnaKrXF)Ygb_Hn-}tRXk>ihNtY+7d;~h;JJmEIZUUefYDybRp zDuY@Us0fF=C+)Pyig;kYoXD%uEsSF=v>e%QGRm`6s0Rs|Glq*mTEKAJ2<<+C^GRMJ zqm-~yE;u#ylC#s!)7j@VJ10FBKn>LeSr@cT970}qougm)BfMU1Zq7Qby{aFA8E^tD6dBNecku9TvzZs24b zG;%?&RKV_G=2}+F>DfjpK_YHvBq`yQXk|h3Obfe{ENX>g-o8?ML|E*(oNU^+)m3ey z*Zmc4M&BURN(GTkJi!ssVsqpa5$DwfO{Z+dp(vmxx@xVcYj`tx+@}Pedzp#>qmc~G$Cs^D)SST=MI9*$MTzFMA~xR|-@0J3W2x<6tL@vo0vWmvvfX@r zW7=t3h}FMr#Lx9xZ>nmKK}TvWJ^7CDuMuK(txU>5^-CwzWcZ@)g-kz*8huj})SYog zjVj0s1^}UWKWe6>|60FurT1ov%C4ro#?beTt8fx@-o(XDA<|Zjij!XxIL(aAN1Xmzq%!`$OPY}gL*MX;emA9c z`5BRx?QRp38bF5{p^|iFO?vIWluWnq{~iXheJJHoBd9{7>#h0!}y>LR~F{vrvl~uqyMvzV>td zqeUz6Gej!5Y#s5;3FTqiN_mx0!gJqv0!bGlY@yHS4_E$PcP8|U+#yoER6THWFULre zEN;~<4COIM*bDs3A_ejql`o&v^HL@)q;4;8Rez7Q(wdAJ1>m@^?z>+c9KIHqff*vp z(N1q%-ST$5smEEJ%Y=5&GaL^ctWqmg>hh>Rj3AsX%BAEghG=#^I-F&|W*%(%X2=q3 zdtPV%ne}>Aw6SKuYvzG@T>-xjfh2TbbBY{7E`R;sv1#~m_#E_LzTR7)#y zdUzyRvfJWA6@!npS2mD3n#vZ?4GIX_0EuY}?y{v~(xPW3$LqUR8VYJOC~=xt{|H?& zpcGqfz%sjy!Hg_83qEKtz9R5uyVrRb6$TRfl%vDQ<)A&c|Kx ztLpHDt*VghgT{mj*ECE9I`)YhSP>AA;yen+On_p&p`TZ}n?`q0_uj3kKj*bMT8)4= z*;&m)S7?|xVgVj1eWzJ)*E39XDtBselqxAGn+nS7o2~R=``&Ee4j6amuWx*cyD3#g z=O1K|a3sm{Z45#$V2EqkT;v;8^b0T$cfF{6BhcWvAHq#`T3a;J6pTbT>;+s29721Z zf+b%Q@MF}8-f;e(M87N+@?#d_TYUE@KnA*mE!d0$tK97k4gpO=%*CSRvWuN2oUj&U zLZjYOZs6xvq3abL!rIuf=SRi+?AgQQ36V{JGa5QuoG46!9`5dfxyRT-N}tga_Xdk>sM4A-mZz z*Fefls;VQK5*7x4p^Z->RORrj7q%+yM;^;EMdp2l18*xlMloKo!%2cPfI z(T~GzO@#8rmKxI#H{4L-v(dJwIjs0|ouss#=BGi}O0~-R#_+!$z^f6mYGlgkyJKHl z?qXONkgvd9Tlso}a}hmo3*5Vs!0){61vAaS<=um$!^(@XVaO?#y{XP|ttrasXO~_^ zg?i5!pa3J4?zQ$;s#VLyn(&4Lh_obonV23ddaxCUORI$#XXu7^<3oF6j|4~Ez@5mJUoZOE~Gqb0hR(4(m5conmLVPWz$-y7l-~-EE)`k9H@$$+9X! zaOUhz>)72Ddv=AHC6l6y(6*kM^bc!f0oZjw(2omwGZ~6Nq)9_&|If| zOFdBKr%_8_ykR?F!(L@yrUFsPms}cth&RM1%%#g#)c*xN=1Jr)?TDRELuL|~9x8uJ zYOif4{c6wY@kD3A3PI_IXPU{5&>4qm$KA&=|@$oeZ&j8Or0NEP$+5PUO(Gc7fLe zn_YH`$d+Y(dH#W4l!Z|ScFFP{7em3L7pcH0#!zJOwwxKqfN(_bInf3ag}Slj&2=vT zqfKzjC{R}ZL1>Ib^Z514xb9S&-EQ-0({LP68IHJ~6JwDglnL6}C@?q2MFvIl!XZB{ zlx)8u7WBOdu3>xt12HXyS`|0DdCRP*ZN4e3G&chlnuBM`{Ot#OXp8T${01QY@z+4F ztYM$W9b6o4U!<nSprVXzAa^Iv>8RtdRd*d=go@5yC5>|fv8)q8q+ z8Oe0+k73E0fJL1ryUA+jXc%Ih2B?zKa)5Tkx0#i7>vDuA&npdhU>$&oZbU zq$T>!63RnW%VwHTbVhAM}XbwM_(CJ{Jyr#Hsgt zz({=4MTc^oH|MbC_|yNWwg&B9ykUo9ZXJ{5(SNWhuD?H2fIj`P9}3%J_?&ZBfTYJo*9$DR67ju$04wR*|x+f82IZ#HY7*PrV`ARlk$3amuG z84(3>r|9T6ZrXsr0}%Y%+uhunqiyj*^n3W46jm#^Da;Yq}t|OFh*{15K0++fWcvmpQIC@t@Be+ap8~cg1oPa z$(MZBV};@TjgKZP3AcdJIP_l+%DV)FirJh&6Ryy2-VTf& ziYE8YNe(Loe^yMAnyh`)Kgt7%k;st*W6MHG43nheY>G+KD!IZMr+v6gyZha;)C#O& zOK*0$+9Gw_rkQ5W^L%tz!YimOK36oeKTWAi7pdWuIZN7_UFA4MGW=9VXxc}TUSVaF z#(LMr7$h-$xmkcugm;qTJtRtW9MJ^wBYI~cBkeU0J+l7pSwM(&&~_Q7Sgx#~^VJ>9 zJ`OY89|{-KCp>7i^4lM3FDM=W*yW)@ga92{L`Nf&kgK;Q?eaTH@;j zC1`zXH)cyP=`bvMVzHZbY@mMee(xQFa#Z7CmI7IW@-jqOo{xH)9+Ge(Xd~8!Pi~c5 zIDgyb9ePw#rC6uXS1Xh~NX8PSyB?~x0(!NtBBmFg#xC8p4sMwb$9g_37^cW;?&06` zsA}`I(74^8dPEx0-PP;3fd{SGiok~h?T-p*F*=V92r6kEXjbDHp6|8@cs=rXyPklR zE7l++y#uuve*f`z>DSSUpuxW2AJ@o`$s&popvhXf(QWf$LnL=JCpC&SyW8!mHT?li zKS0fBX@ALoy+)cAE_boNHbg5n6*rM|2oZg@sjy@x%L9cC7}iof?8Uv7uG_FtLtD(0Z@UxfMP=3 z7g$!8!lHb989fX@K$6Wz2V7Kjy=a-J7P45Rs;llM(;_Kw_kX<#xDCl4`)ENtR5ywZ zu~cx@6|D^^{#9VKp^PAF!UYS-!J%ehgNSpl}Nu zD}mpvSl@iidjSl05n6fHtflOm7cDN3yFWdWe z&Wi#s5@LbX)4nklU0~Bfga@!_rTcAS$dCD3Zb!$SesEm82=Z?>ZqR`c%w(3%YDg0_ zOV*8FjGT+2ZCd^Z@SXOqm=$|67hIHWbtH}&S(&0|x1w2FBMa4Ul5N{Aa)@>C;R-ua zYayv$Ly=md$bq=Zc_a;G?err!cesBF%hkNWGtSU5)GX?}43~mw*mDBhTo(ST#G-;t zg{1Lwq)F7^%&!+5^$^@%I>Q^`HkKpqZ_W}B&imNU-odie$oP47`BD*xj*-m$xr;7K z>6@d6+FjFL$l?;KNy+hKx`~~X!4Vq!#Dt*-Lb!#M20dzK_jg&8+Nzi9zC55BHuyDw zo#$MY&C~i8>!;0qrxfk~S6FZgXitOe4|~mgSR%S_b?_i+hs;=;7kFpB9VcSP;f#5^t|!sQf=2b0^JK*)eVY zRx2GHuE6XR9bA0FDC@s+nJrmobI0P3FI&-eJr|t<>=bo(b`E{aq8pp;ej5=^dq`-H zH=F|rHNx&t9*&ssOnbbBj@gPV%@9rh(9#_>}e$uAl# zQxg7ep7XQe-S~^(%mII{=MWf401lsox4d37m)oba$dMEl6y8_Ul$V7UT}4LF*h3#% zvH+@w<@NR7;dUdjjA1!qj6?KzZ)xjp>NRyF$#MD3G8U6LTqU8PX7iJGdjxT8$&pij z3X_zMD!m#r)@JBDw*Axzax~s9L9p%TiZafd##~3yL5RU~35E_OW$%v2moFJnQ_AF~ z7qSg}-1gVt6cY1(t5B9+(X*)b4p+a1Ic2Yk9huag%l|wwa4z3d+!5Xxe*bNZK(5ft z>_(+dEq-d#G2XhRXdODTkAENGW;ek4)2sQDj%;#ZkzBgfeqsZknY>0P=`d;0I%Ff{ zn}&^D`HEeb;>+al>3aL)RA4PFi-F1h{5e-`vW8f>a#4M+Q{COPrv;3thf!(qchrab zh2mcfUUk`K>IW1g8ZlYpzu~+_9zA6+9`pA(kXDg`&&qh2>*qOU=QQ%HFxJg6!5MbUdUYVGMn<$u7A;iMg_~&YAP*h>U;#eQcuObvFG6 zlspBVpqs^3nwBUX>k&j0Y$bwx+82Pz5{pqmMuc52d|dDzVTvDEOai+oF=9uxflqO9 z=t#Dtr>mHX!Oxmlt-0ukQO%fc(=LLI^|?=;*?n2%-~DZFIk(GijolVxs}tDJ z$7EQ#_p*hh<99wO-hXw!pp;w)n#hSht}N3TQO}7LlmWDDC8_nx%G{)gGRqtVMIXhE z&vcT26c>l(DwtYxX8w9*2d||A|9LAjT7A2?=Y>r?(3ZZ|gjpw*vJ<_3)0+Cm_QP=W z@M(QeQR>GU()#2aI(&;4!C?7RLzyp0iX8MQWbSeDHbgdk-wkUThTFvJD_D&->UCc5 z1R1WIk~OP>-46X!sV5W!WPeO>?*|4;aQx4NdEueX1`i6>A3uttf9GqMV0!)jl@~); zGGAmdia?b|Cu9W2_q3n+H124PmiRPc7C6d025nK7KHEoW#CZjo=@ zdChCM6~|W`zD$m)j8ph$jfrt9bjG`;y3b{NHZMo9Ed771~7$bo4bd;Jb^l@ZW>S$40sOP>NyPZ*c7<=U>Nx;$fiNOMfMU~ zDN;pz&FZsA{qz;Hik~N(9q?{Y|BTmx6g6JgvsH50N4|iSC-hU#5lUy32iz}oWgmGQ zK@Iu)dp>1V4#NB+Y~2z36(IB6hr_UOjQ9vB3gHj5-8sN_u`@ zW#jpmNDW{uvW$1$&M&Tu_LjmA@T$?4uNhgaVj$2@mKWxY;l5HMytzq58$chRAbghB zCp-1835@s-YOAH>JP+`V3MOcodd^{x*tb?A| z6U#wRXm~L_CkOJ_h7&Fy6QE;^VjwMva^iWA$&8J9VS$`xgE%|m$CciR+Hj~@`W|wT zIxw(1oi1LzO}|Dx;{W9_QqHha9S6~K`LaEmK#t_p1#qyL`eRR!imY5nO`%>{z=d*@ zLJdcG)JduVwNWqhwa^)5V~h9yE~^sWIT>=%Ax5c=M$zQ}mSjIZ=Sh}BeQ+^UXwuJr z`}xl*!8k6rC6b;PqMcQ>tN)|c5ew-EU^FaPT1nBI;@g$T8F@c%UdHz*o>Jw=QQwvwK~YFP*CG{- zq9z~b4YXnNy9Qr5*58ARY)0M=`q)ivi1Qv54K>T0r0OK=KV(kvEUw3U+Q0}K(7Da1 zJkR1A`mQsr+D8P7)2(*eK;D^Wn7ws#p#DU1S^N>t2!xHi;wPL#O!;6QMZUvt@?xCZ ze-ENRMOibX@QT4;lD6_C57D$8!UZ`8WHVI43v+7Q{hj0jwsJGllnAK=<;zGLmAXMD zu=5NLLqBj}GExLU(2wS=MEKXz^Z;!N-Ye*A{DZe03?D`NP7=nPm>dL)AxAs>*WhOn z&QXca9-<$wIF;u)7Y)9|L{U;)o&w_^r5>D++P}D{WTRLvHsW5McO)`J)|H(8j`6^i zD-)kngc@aYRXG>hRt7W>vUAoWmMj{7O`w(byNIz81a!gOs`=Rc_RVuI$a{i~ON3vd z0jLI)pj)I%QTnpGR1gLyoDjY^F(Q@>WfAat9+4+OD7?|G8TrYdHp)o!ROI|+r=`s+ zd!rPOAZb*sSVELzefcWoF6B>hwd#oWaa5=`*1j+=T@Vhm3>TIc#lIx;+!c$6ad2g2 zUXJ>vlJ&5(R;=@}ArRhijhiBeRf(CY)lc&7GNgvna5v0ShRD-E13Qq+l~TDpw-80@ zs^a^C))dMhocJu!-3Wgx;<(CHb^)m=-s|LvHM~&G<4+&!SXcoKXgT7QJXtg_Zh?~m zsCgI4?B)Huj~xku7fj1+ZSqB`(wzlq!352w%Z*~f_jsz? zpjMU3B_4C$+g2OD^`RQ2zQfd*5JB2prRkyM9FeYg9pBy%SY}Cbg2&3Zs$t(noDQTA zp_(+z6hM&+Rk}^cz36OXXRz^7`65*-$71XJf4X5O1@m`D!7^xDL;7^odUOR=f>mSz z?1#KwUzBQUbiHm(;VDkl`XXR_$S7S4m;rHRPN7Lj#WVFVXGnUMg~o`_5P;tmQ1E^b zHyO)+{GT?@c~~fU#Y)$+*FW7wXQ2}Q^6p0fLJ*0cZTO+6B|9I4Nbi0hs(cqR=&gS5^{VRZwa}>DpmLB#RD0z< z+Q7rs{tEwxStRpX426=1&Z9V{{4}n#YVJbq#GuWMC&s37=~@r0**#0UO>;=ut#IMj zD7zOf3!CxECVt$s&SaHvPB8S8u_|)rs4IRya`bPJc2Szo$iE;YDS@4K{>YRVR9O4UXY-q3dY%nauf5p`(lyYcOw=lgEtO zA;hOksRLE_!y*uNrWs-PLJ1u}Q0ahk2torAM`UF;xG?$uj7yZiAb2?eujk;HwCoMV zHMX^fjchHvdUWt^WM>{nR=>V5+w{^i)O$9FN z5p~a%Gw`Us<`a-UH_t*@oSb&ixPol})YlzWp zbzxMKS28j3qca|IOcN~GDxE-wb0at1B>Bk`T-*8M+W^iq^);0m=`@`#rJ5{RnIr>N zysSJu@Er_@Px%%sJAdBbtk3yzueAIyI=FBlbXNa+X4~9vPJiosl%MnP$^6aCKd$;f z`;DNLOd8Mdd{KYceWpJG5rLp_Ls)5+2{9H=*^6B`0*oh={<5F9Jp?PK6{XB(D_EhD z7%xLA&hOq5R;nuY@h)K@Hl*u%pY<%PtfUE*GV{%r;lkfGAz0oB1^fTU`)?P#zk)wG z&P$p(XUq(%r+uRsI%}dUjt^)d5(O;RE3MN55=>?8R3;Y?WycN0`@Mw)B!b1%4)rRC zBty2&V-J;`K25P*22b_aEhGb!nqf9wiom4U!?|3=tz}w29_XImr!5ccR!^ucH5xC1 z_Tb-F)e$GaET)X_z%J~Y+7+XF($!CZGTSiez0FoN=5(xwPuJ<-RLZ9w7G@u|Cwjrjh`H2CAvY3|DsCgsdA9aF8rAa*x(;#t`?=Rx$sBSWq+%a)5lNyVRJ0(|%8Z-0 zm_Ltb|E+WXXTHz^pVABo=hA4mGTx> zg&sRB)TRB!fJF`cY{&Cb1$Y7$K2g-pP1Bl5^JsTM4FdH$H8S&`&rV78axw!J%fBqEk;mpYbWkns}Yti7cZv;Zo^PnI$(kwuWwe_rT9xz_J|1 zlM1qgf-mMLy9Z^<38Z*G8L&Db#ADg!_JIBX3M)GU8Hj_HUFI+M{ZsUmbYnEn6M3}S z$h3~jjbyN5d-_z=10v0oD5EW=-?d}_R}+o+O2HQ`g#qgm&Dj1>-Ox3|qbz$$E|Ole z6&(r-30P58OuGQZf(O?>&T0$i?$oRUw$@cy!Q zHk2_K%*GBr8Kx{5vJpv41ICX0gq@w@$~%|q?B>U@%s?@g#en4c3%2tVUbHnOYhH|O z=ePq6mO`x%Oh^By0!Rj^rP76^cQFJOz(9^{+8mGQ6TN6w9HloCWR#|ZEdn=h$v&nmm;R^ zm+3b{UrHe29=bZmv>#6S>t%MRMJfL@!Kr_noF3;dA|JyQQ;|tW3@a4}R_UfyRk>Ui zkBs|Viy{A92Gt}>XYl2v+hl6b!*i?5x%nGVL(TVPHba-UW9A-yk>a1_u1?Yvwa^q|r z<8^^i_u@vm-8I+{NbVH!2ej4P@^2V8)m5qqA|C<{rk$Jgn5f8{LNag!0nVi`1V3=g zD4%}ir8p#zJ>YT5&Ig3wJgrIqX|Hg~6){-1px4aV7q~)x^Ma5azG0bS0$j2S>*n~tTR$eEH-#?GC1{1Fb zSb(Y(p~_tnIu^<&<0jO=s8BEs5)Ea6C1p)6Nfo(B78O>&c@+#wqD<b|#}IkSF!;`@VIk zL7ZibyJnp~0G7&>M&H zyX6s{4)Y`pXi(&uK(a(m_U9E#+=)jSuVEjSOW5od%fwjFi|s86u_1%fB3rSgPiP9& zgSA-GTO;c%GeHsx5ezm*ky|MVnxUX!=hGzG7=RQ=8=N`&m^rNab58T<^uTI}OzOP_ z|0A(eik^y&KiiFHkm5Bw6q?XkeA(etM}Ay~$f*X%_569u{i|-s^3g^R(Yv5@r%jt; z-P{)U%D$@#U@xXx3zHOY*4Wlo==I3O0?lt`kBuYhP@FdLrO2#8>|#MSiW4} zZ~H=5J(pe=;HPjr+Jz3mb~KUw@LU!?csDZfJ#@J(I8a2~0l&7UY?{9Y~ zp%T47ODGXisW*L55x_l{LNzJk;=&3nmaTFLud;f0G$IxxE(JklDf9OY&IieaQ(vTa zZPI$XX{eEr4Zovgef(C%(8J_>#yo+<;XLJ!l2F>tNR-`gF@FDz`Rd;#MP1raFajoh z-Ryek%*}XDV7ERubrRA>`4G9jU>rSn!GzGwRUiZ(dOkU}qvewfAE;J{GLEd>X?UZ3 z;U4D!(j=bgF%k{dix}fop(Z|ehB}Km?FE<&IFgPfB#pD%yf*R&S!DGAs??9j0zKU0 zL4Au5bNVgbuCqU4q0d|7Ys#!I(TxK=oZH4*{Lj#v@KLRhzzZM(oVHX5SLoyV$u``1 zu_|Go#u9HzOvnW`ZB{S^Q^;pdN0kT_M?zODL<5ja61prYeesl>l^AM8tp-=1`^goV zXv269+~?(A`hZHxVfY~0ags3R#n&)^79Z4JC)~xuz71M5DC^yd2FSGa;g~ZrZS(k| zl6_kStuNp9*2t+laz&}J1_Cqa4KkRTbs05x)e~!P!O(HfgN+79<~3kpdrf?XY|E;J zm(w^VHq}btVPc*r%N<8SWaS*Euy>wIuFV)>5y^H;IB+gyN+pz!Dr~F2IKu_9n28F; z9M7ppIsKa)7OI$5L93Trog+B*4cK&b%(F8*pjJZ{G+}^_kuvq)?(9S-5S#e?8>HM` ze%ZiNqf4?Xc?As0>1iE?t@wk>n|n5;0wP?^m@RBb(} z2Ih9z^q4Ji-|1YQSFZ1&qX2ORM%@?NQnd|q&fnd>3J6P8b8gtx%J5Gp!KlM12zttC zTZZVc8=ToGlu>h*b0)YQ)*No%jt0SErk}-RN$uZqof!@NAFZz-44QN2aYuU zF;?q)mNuEtl_x#PVMJ`RvN`i%oYDiXd1bk29xdlTAA%jscWA!8eTAS=q)$vt;hnuwL)s!`Ww%O= z5Uk+EEnI&4XuVFf^-#qEQqJ`30W8JS#(P;;y9oWAkN%Gbu&(#jqfP4AMEi6Ng%40g zIGA6sw7M&bUXpa7t10|s;jRD%>ml;}0>N~kZ)F`(<&->EP*8{Afjg>*!T4e}QRx*( zzEaO}Q(cjdz`24yY~7MyMtTMx*3-65#kl}xOIrEP#sk&7p36ke$AB~MGkVg;J@a;4 zieS`kwuffB9uzdwd97j(oFZ4NW|kHePH*)bpG=_IL`)iwZW=r)3CBPQ+RSnclA1=dJ<**%!2_) z_u%blawH$C_JxWl|9osLNOpA&P1tCRR^lx0;nCGJ1RHaC}zhm%}^L)8`w7{Z4DgmTNfjad7ljqx?`A#sNnmZm@CJ z&60{<){<@i!wwT-OP)&M(_{fHyjrRzv*4aXcbY1}>j(?IxRtQ83@{2UvYHEm=DjB3TWPrh>GkZZDE?@5&K^EAUdevk$RI+WWlgx&lHW$ zqu-)8**N!po>00=N3Aoe$~*TtP1VMv4fw-skSR!-)ubhE*oXBg5g+4>O>4>R^^<=?|u6y)7u_KL(P- zF)9rgc(yT*(IdJ_#XMD;S1gASTe62&7p42_|BbK1YEF)g$45eM_d=~cA70o6qa?>2 zaqROrnd*Ae1(8V^EQV~K<@Bsm8F`Ng2mALjsS&ogGltQNt<1N&$jQHs~sbvxt1fqzBQtV}_gUGRie1&R|K5M{p z7VU<0C`UQw#Nw?cH)f08nBjTm^q?avc`_VCnV>5j0UN9MFw$u}ZuGOVMRG#Z9@Fe- z-v}hZsXx|_u*ZQ}s@Ulmy~Rknv}sR>CyPi=S0o`CDD}OC*rL<-a??v2(1YV_sxVLU zK;Ne?domh0v_@<}?1!xd_hFE5yQnZBsHB}wKHPFshYLhMC^`gGcwUrx-L{m@mS`^*c)Jw>p8*-v7JhV1687@nyTvBT< zDtU{LYI)Rc8FfZ_1I0jk{Q2wPTQ(Je35}mQDlQzv7CZOAOod2qe=_>EaRt<8KzVO# zq>DkO)46?i=8f1iIasE&*Md)ORD3#K>c9=@Qk_cJw>0bcE%QK^4n~z|Pco zBhIGO*(r}7@b0|^+e8t0&xC@<0W!Zv^B`Gt7OKWQ-*-Es=)r^8Y9s7^XYPZ=IRbqSgt@@KtG%x_p$ z{&(V)!`)p?;b%f`FJ`a~jPE$?SwP;*JgCYkXopt;o49Ba?He`rdp#svXFATcWoih% zRzKv{#(6Fck2YMn86m#{o3W)Ea^k0AoPyb+oaoNhWA(hATkwjP!5@Are~#r{v8rS!X_s>l1~H0a&aelSYrSz#4PClwh_esynA^dRiWR zJdA?!(bN1EG1p71U+_nV@h=u%I+r$XIX|OkozpNBaa2gLCMv;vy^Fr_TlM`;LlZ7v z=&-k|U-5HCC`A_}+-iKaH&ad$2ev6(boSy%l_P$d4?B+WaifhUP2t9$Aebxfsct9Y z%GF63WUcG*zksG{z+}jBWgb^^>JKaSDbp0VufM*My^ffyW!&zIWKaIJ>XZ)J!EluYsWs1_SClB-F|7 z9BB)h-`1E%EP}=8?a;y(hS7@W+oH*+!84ZXTHKnQZ7Ux59qbUb;92q=wz1?xVXnFK zD%Z4uk`L7)s{dE7PlwNQd=Fhzm{O-E?p+)iiyxMiz4l1> zSv#EyQ8vT85JFPF;qq%?>!;c4Hd9IT5LNJeofd23VM_N5Dy;AUb?VEV!;DAi^Bce- z9FNtF4eI>y*F)DKB^F9P2@S^^zp_5OxDRLBxi4>55$Q+2xA&?+Rv={%zMRvs!izKv zraoN|@y(#yOY5ny<-hs6b$1|K)VxWxv_ALriL~NxSI8nLb#}1^IpoRy$dNxI(XS|o zNQA3ChDztvWAlm48AacKh#Ts@u>u-4(N>2wW2(!W?g_Q({JVFBP~u{*6<$WOCUVg< zCEMX*bCH}o!8kku-}Li#gvqHriY#)q%SlsGyIr=R@;E|b5}7PeHhyJ(M2qzPr&FLh zd5>To&d=1t>p=WzQL={)Fa>BAUd(@~=9Tu6;Nw%sPlo%*67mK;x9I?ONvSZ2cY#Bd z)||WIhTskS7<9zfxi>Be2sks|{TGghIlpkaaBG4`ELz86vgt?~;jhkwHlVuLW{u$b zNX7XBuqd75)JJ!Iw2zkA`7du%5z&2LoV!l32iJE;?dAyX5p5_Df=(Q9_&T{1p~^Vd_A%txMMs zwSF>~en=?=KM;(KPaeXU`sDNk1<*rXBwKGjf?GdN z{*9uTO!z01KGc!boGQkb_f6kV&mrg*e>`o>c5w#Y5388JJ*vr|VE1@ETsf_4TZgo^R(&&>!R}!qr|`)iywy8#7w(86#C){!!Y%~59dp}1e~NHEQim7S4`%jsfg0(MC?_JgvJ_7A zai&W9eA{h6Y>4>185p*&z1$NTIDuVr;~vpu%t^lOP4_DsN(VbQFnRsxo!OhQX`h@6 zLZxC*1^1Z#a&&_npHa?UMH9Wg)>TwKIG)`R8Aa#N`M_j3&ECU)_OF_&h@orj198+_ z=vLD0@~grM$Y-L2pw}fPhH|oz{Cx0(VnAz!#5o{QZ)r(cU;+)Ii6BbL%Jn&AyJT1O zbV6i`WVq|4!Rcs5M2$Vc@!ioxbIw=m}RdFNTzuSS(~|HMZJ9rr&}V({A%O z<_F4tG%0Z8aaSB0!`N$#M2`a_s=IB5ueAS zk0d*vZ#mye-!jIbfyvlcNcf9s*GLR&d zr?_+kTN+K%|{GktgJ3nj60;Y+k%_}Qq<9A){m!cGLqesS({8DMlsRO|JS zJa=~Sp_xUmH?Vt|6Cb(@_iI;-BII8DjgMZDXXoQxJvs27d{H}zBi9BNF_Wv5iA&^B z&kotUW!-)E;Sp9+)vrJn`-gqzmLqx&lP5pd_!M-kb(R?*m7VK z6(1QlxhV{;z=t%#^oAEnqit0qP-}}t2hwz40cty9;Q~{MEc0ixi8grAh-%C?#y6a_&{nANJ+G13Zv`TCT(%4b)xF{hE z9?<*q3d!!M!M9%;fwYf5>|>r8?)%@e=fU~1ZJMC4Qy#Z{fausq7apk9qZ8}494}@N zS|@cOo?U&{KHlBy4C0Z!M)B0Z3llEWsosA+oM zl4_U^b@((akj$*1bQNS~V9LMFej(PhM%_WyXg6wK6D(CYf#hH9c2Q<)-~dIaT+zz| z#R=)CeBmql+Tz7f%j|WSYf-P#$&&$pK6nV!wAh## zfs1)0@5C8rT`Alav+2Iwi(l!oWhw}084|^OwAmjp$FLp2QDzipXI{C!jtgI{_W8qC zniIvU5XrX0D2l8!SigE&@!=fW`d-d52a#bFi=b?eJ!GNAhmE6sdB4*YYRb~71n%0$W2jkw5S$<$K-ap#)Zb63jLCX_+Aq(63mLd4L zCidPsbygg@IWa!-a`%j%8HM4na~I2SG$}J&;=%4>bMO*X_3ZPX4X?C!o9R2#Wn8SN zvLf@W27Q_;D*1-_#xNxHGb@R5!lv@i^33=BI?hE7ohdq*qwrhM(_PRnp^Wa)wE}SE zlg9oxYKKpZa>ft>r{naYI}e9RB}G+-qPXD>jcD^Hv(Ip`NSjOt&6K&lO%aVuW+F*f z8H0=drhDUBGNIGS0iGL7yLH`fKe8`{a#s=cFsU8_n1MQ+Lg_49Vt2IeGaDUtwbN4$MBIda^^ew_WbGc~zSpa=V|a zu~(l#nBYoGsGc+@u5Eixb}fT46ywxRBj~}2+r!VAA+?`5NW8_`4Kpm)`OvTt8paow z!V4@>i|8iHTMsUJVC|bfqEjNAf@9B`Agk}v>CP_M4s3ELLeMUr+F_W&^OfFKv-1u- zoAs37vTz(GC&(C?A7pboIJQ^H8l$m3V_ep+6l>-iL(f{4agf}P{C?IfJTP-kRsRX; zv8o2LMW?VMUdaJUXQ9powO7h5h`OQK{rjm{*iLWl!-AWx*^5=+?yfa=pKrTz$kE)t zd;v=H`+{)KNxF5K}M-OzO;gk7nu!gbp=ksqW7YtfGw0k@ZSx7Qh;&sbDEgDybFn zMY}Pa0+76}YpiJFeb~F}anbPx-jpmG^u5B<5(r90Fj9E>**gcqmS&N9;7UM%>_%9QTzHP(D)-n-am55H9^6J13Wi$Okz`<4BPhQ`KLo82-HvCBO7Ea zNNb&-$1TLP!2a49f}s>7Hqij~9NaBId%8aGsjs(XqFZTovOR&92o2r#@ zd$JMWi$YTZbrmE5yD%Eml4qQBxs?t#za+(u+S>eTB z_NyIdh!?UapddLp9zvkJIHp##+0*t_hwv*lG+!u6uQ)gb5D;0l76{sEK{B$DuH?aG zr_B&@k5x1Juwo#uU(P#nr3m!%i)>;t`J4k5A#mx?uU@PIy0PLr+O=64kw6s-b-0lu z4%g#lx}UF4guYK~SiBhjM$k8@|8#&d%j2k)E7Kw4;M6oQt>AMZ3*mh=(cJcS%hnQr!Q3>R#&aLd$R4yB1iKG>(Rz=7M6Q> z&TqJC6XOO(Mq*5C(61uOH(jEjXJ?KJRcqrkB0*CEe>-Y`^U~5Wgv%WV%DM6p+&VQ- z=>GUIH$1Z*BsV+)^36Y-dqEh(Ny7ga{Ah^mRGcpNLJ3!_|Cv^m>9c6<Rd;l#x&nCO$Zqn*M zv*?G^i-IApIb%asJlu$TPwLNgMzqC0qp4tCqvR?<57W70fVv~eJ2o9YCpD}!02Im9HuQK(J8yoI(m;`re7=k zz*keo_Mnk6yLE}ku1~JLAlK=rC<|w#y0x)%RGFe!p|NUdm%>pehtgk%86S6OVoqU* zu2>!7;X19>^Y779)ady-{G$GBleDKPYiH8;Kh*z!zzYqr=$OW3J5x0q<|jow(O*PS zKtyJxAP2`DkUjp9Q^L{G!)I$HFws*-qynzR{VVF$3}z~UU63gprGhA6m*abdR*wtU zmDV@t6zF$Ez;bhV!gzAxxdb{nD?2w=O~6cre#rvBZ?k=NZ;T!infj&8rlQC$W6HJe zcybipHvgtoafn#o1~N8yVg91-*Gl%E$ZB7H-0F-MN&0AbzQepA{M&t-g?x6UDvm(; z?YqM9uS^IJN?m!~zGc|WseVXw_$~X*x)y%;VFKi(?}9|nRVDjblv$0{geP+iM*c@TIi7?3=xtF~$l-+NTtLqD!_c!ySe zun>bj_w}R0H@2?A1^YXrr8hZBc*@D^zec**`i!scq4!(n$*y19#9xsbp!!T2L|1f% z&Q~8+^u%%f?k+&6&jUa#gg4aUuqq5CvC2$|DM+veN&yfIELd`gbYPrD5RSWS(LA|q zp#$^sAT5{uaP`aobMA^{w>SRLqQt1c=osf8+0FoS|FyxqwVN@0MpIh@4`s$NU`G%v zVLEWh^DlOQ%!4V0Ya7M0wa;2+q2mJ92xBdudC06V*+F7Z=<=j(@=rxWQIpy@TP}e~ z4Qsd}tp@}V3KpT*#_9*1!ETTD)B|OJszB8-kz*Z;Lfdecwf9$N>cn@ZMkK#>3Wa)dw2?^?2B1kJ=z zX&V-H6fIq1-1pV)hLmTL)>k<$L-D5LaCq&R>%(~u$s85Wmh^%UJ=S8C!GR(#oD?x< z>cRvw6@uds&hc4Ny9~2Eobu)Jclu9gOIEvgy^lk6T))!X^yjP&Huiq_fUBiyDHH6U zN)GoE+jj-xZhULvKLg}|JYfN3-srFDEhfT#kcQO>e!hIPO0otkC6!jaoi`Q0!ur##nv>icHNU3a#R)y z{DUoU6{;mz3}nzE&L)hCO?UR@&qN@5z{Upg^(i`A&|%V-q#BLtQ}li&DnK7ep#dh+ z-`ZHb`SNp2Y(bzAPs=#YhOct6;fM;NH}cBT2Q;h6pVIHR5Ndl;GK?JYTN@ljIpp45 zBs9hr+tUr88 z`$LuEnc8P1_Mi}7fVGJmp-jSIU;pSKg65De1Wy)LSnv*buz#_exJaM)(3NfH|?K}2z{ZHur+Pw_<&W_$t5 zcH*VvJwdHuiNzTx$W(MxG^;UHPoc-k3*59IB%J7_jFbBoY3W6)NAAI z6600DDb>O>>O_n-+@=KjJV%KdYSXtEGfR@D~L9YcTiep6B^l22$t)aQ6_Vb}C2 zt{a^`yKZ4C=ScJPXVj*Iu}(?&0uROfg&)H%6HC{84<)K_!Gaj&?7lso_bJk?2I`3c z_#k7$=0*$WI51tidy62}opIv(?k3Vm0iIV*|$sWPd$1ETV zB9N%kHxpKn=@eC(agkkEX$AwwA5?_cS8lKe&}HMgE92{e_ooe z9lk7NGfO9#ub0)|68_70esA+T{8eM~W+{M2vU*&-kBiDDKH_x`l~L+Us4-xy0**_}AVz6*il+d(dh1eml#v>?+LoxV9jU6!_@^f3;S?3-7} zR`jj$ZRFnCvkpbm9^3pre_Dj7sI{Q0^<&4)DdEaBM2LOqW|x9a8FEokXQ&%3XsQ#f zub0~B(vOV@%;sTMCpi8;DazpLSrQso8{&ZxqilUEcU5i#Ha7zWK0N?hUp+PCNc{Z2W3?*VorDp z&p7yu&`8Wka5dx`F__`3c!Fo`j^h>IjzN<2<0L{B31Rp|X5A_&QZ-Ji&LioVf6%bu zw2$dWl19LY)PE3>fFA@=4u(V5GjE30F%|Wa#HS*5Go06#AbY>MvY7n4$-8-{*oS^` z{kib!xbeTZvK0#B*H|60| zGh2H;kj1euCtY@(y1W5l*CSui#xN#lw0cupUl z1QD_u0N5oeoMvPuzoQ5fegR5vh4NVPu#T5*dy!Mqa0CJl73YecA6~e?@jD-9(;jSZ<2&lI(%}^_W%FS{_n)7gm)r4=CyY#GWio=cFKz|sTC#l zGE9>zhG_(MBA}c^edTx+{^lIJSBoL+ndVpD`qufpzUwU5<8m2LA&Y7;^K&lpiPa!+ zr?YuE?(58ynIvlb;0jR}adBWQ>Go(|$E+9f8E$brecl{07dXtGTGje+2U z3hpX{yPQLVnL=4NQZ5=heYPBD_$DKlY<|c2BvLisue5jSgo732sSkOaLvQ0__+$jy zD5evsS>9Od*mKgjPIB5vkg^-msmS5-?%tEdUbB~(=VqrZunVn|qM3&Zkk3G$grWw8 zla|yh@_oHw<@4BS4E&VWNnM92K+c6e0d)-ul?D-OY~i!AB5V^TcG^3A9Fr%rM&gWo z9{PAZY0wzyEgpOx-I#U7Pjy*W=yeHyY1c-5e#Ub9*j&#&+xk#oO5=L+M-opz z*t$W2aqjjw&=lo%fZJyQcLCtFiRYVzKa9b#Q^DXC=r@NSS7ry#q7im(#2F%}a(hAzk}J0Yrf(_{4ryeMZl!~P1!NRwg36xz4HKi$*H z!D*c1kVgbiKkC ztFP~?DcQ>HW}a8b)-8R*+SbRvf$%LA#tGWpb1#Hx#&?0)ui!YOZXG%vCbU5Av!`6F zrdJymXD>=5Sh<^KAsE?7^T$)CgsDdBTU|h`%vEu8$dm%bo2)%P%@86({un$Kd*DtR z&zbFG+6vzwLS@57M=4fa{`Vn+E9g}{XH0bwqjFcz_+l(Zo&ZJ2H8&ul z(fUFGh7W)Ey`^M@Srl9gc?-_zQLmf^l%U1qT9C9B7wm^#y`76hD(5tsQV%*E_0!-& zdgb64LUgmKs}2`bqONFGQYrxzy|apt5aXG^$0jf+hVYzITCH~e<=;0$_&)3}M5%+rK{{un@K+ABf<8(`=>hT{7kkjmA6 z7?gpm-gX1FPHAOed~?gFe4j#=GADz6%R+hOMl+UAT1}pQDJdoeYNnjdOnAD6UTs`kbYStbdj4>- zw_5NTnC#vWlc%T2t_!=6UPo(+kV*4G5NXq-i^v+Mg)l?B%;YsR>CfCK*Tx$%3|wF{{Uo{C?83TxV=uN}%65mITomisQHqPTamoOK z2!LmPcgzV-W4$>-POx@O1P}y~y>KnO!pSfaYtvoKHEb6KIwm;VVBBe^?Nc>$U0FNU zn_m?$uU``Z1Q9S%e|+wyNtwPA!-auRaFn<*m_7f^jS`j9F7%d!3j;w=c6`am zTBep?qH^3N)!$th2!hBW_LyS*ek1!c*(CBv4mi>V3){)(c0cP^>|9oCCB0(PWd;)1 zH>Y)32DaTE7hSA|7=ezB*Gc+!@jc8U{XMhmo{5&EDX`T90qXM_Dd-n@#j7-6~iOiqUXi=H(oT-q0d z)S+z_yCElicT!H7njaAX`>6YUSJc?O-8@5Q+bx+E)Z4N-lLie-f5s?!;CFgtc+A6( zO=24mG1_~Oqh*bqF*n?kO;YV}rF(qZ;EmFbKs#@+`{JmAh4XHGs(6l&W& zDkwV{+6El3(*L}Q6HPt~2`6ibR?$fQztyk~eykcBal`??V=Dz{!-6*Tw%t|8FeyvU z|D@5z8to^yrld32eKZ~V@oBnJD{B3dO>o0W5&Uca3v{aG@H1q8C?K`)05l3U zT%m(ofRv~v_DX1GoNf2E0z*mt1g55PwyQeujKc)eT!lPLd$};9y@nyAFUHUY=F5&+vwMwV*kK0)e8f%XT$VlCFFhC*OlKx6g z;1ILMU*YATyUnWK6nC?GH==l>AtOiDO!zncdb;6sR^zio4nP{k5@YQY8SvihAu+>d z%@5Q5{O!HWCo8UdRXf*IMygUTvrlLG`eOUSx!C~iKjICCVR)i)KuHGpvz_rSoM zB`_fBs02UYwGTcy>Ya+Q0q}pp04)(WS3FS~G4CER+t95pwdA+Z;5Mhe5lQ(JTjz<* z98pVunMMAOB|0pB+eUb^vn=S?&P>^BvE6~Tjfhr*a${6xGOr@t60=OKf{_Nx)cTER zxG&Q3P^AN*tlf|k-4mBVhg)WS6SNKvycjLT`rK{CqY1ZKoVLGfbo@|Z`3QL!%TH~d zi8eOI%WU$bkys3#NqgVRu zS0nP-C*)`fW`rGxOR_vvX}vGfqh>>62H6JEHjw1t5?bG;eeBuy&JG6?McX3whFR7l zT5(B);2w1RXa?DaX>QY$S60zpYhP-y=rxIWXq)8!+APyu6z3|O1@}m3qeG6!dMPc3 zToHICRV>MLnRMRNQy~J%LFbyy88e@;?sA1^F!1>`P=El8Ali6SUu?1zoWU1qPMR}u5&-$T z04l|Ob{VYj?c9PC3GD>$P7Ge1N5jhRi&FZpBd%V3=(ce)YKohOvi^~$jlscJAAqYmVs zd`jC`84TRzn!0M2F~C`&*5actYuujdjCvIx@pFbUjy&Ij+lCH|Y{9m64R=J9eAN4xmC={Eh8T3rw%k6x9gUP zkgf3Pp%L(38KU@u&)bYq{&$l{{=`v)o5YcyNLZljG5HPCh3T<$q28 zNd3dl`(hAY(0=2r+^HGJo`ILt@LWMgyzC98K{tZ7T^jYhx7eFK=noqi6X< zSh9Uj*;qp>+wv(01L&Uwh4* zRs+H&`MH|4=hd{8w(+*H=C)jdiiFPD+DJR>f+l72!&+#Bo?!Yx?pl1ZzxVPSREZ zP|HIn{bicQr7Fuchi-Z>;aOmLPu#`wKPdgDFAp~rk3C>U$EP%Q{nKM>sLKx_>YjxU zLdvEX9MUJ!i3|oDW)EWdhybj8w)A7_F^Eo!+8WvX|BBG%)B9hzBrF4qOW7km1e%ur z<$u)H`AqzXji@$ZrU*JG^IkV=p{SwzmNDSw)e-{2IvFK|+EvaZ#g8j&v%#tPYWrLZ_pj+?PH2SioS z>e@t~)k!{K^vc8&R7U*G@JXK#me|I*dzsVqJVt?5pL>7X)|os0FF-vetHhC2eN z?4rK>JRjMn9Qb~PVOrMpvgZcLm+E__Ae6{+Aw^<9#qx8P_#{9{KY=4eIgO2)g{<*f z3#)lwe*gdT#g32X7Wnsec(HUsQulb43(e_agfU4K+MmotCPp3eD7yWC&&R0GKD>vP z25Ad`r-P0m{DQJ??n?R0<@(HJ$fodQ*dsam*Iu~By8w9kM{s=TGM_`Ljy<7bs%9Qs zxc%V=R@QuRtl+{uum1KgS6}_O#Mm!DV|wa3styhP59f9Z4buY@f{=4E)&Ktru|i4B zDsWh(vd*shD!Eau7fd$(!N=mE=i^jg!dBt{$eb;F3l4|1r``BM zzP@klHVm--KqL~^gVVbvXYUN@!q1D|oP$?c{vgAcE)m77vDQnxRqpt_=JF=-{^JsQPri1vP&us!WE&5u+%tr>LEhxoh2`Wv%J%j@b0M%od=$AGWCtD zm6@;b5Lqzc2=Qpd{aLEu?caIkF_niS~#sS0}aSN zdO*As0%+)~F-*+QfqG<$IpMsuf2Qn0Akp(>qv!Z$`2?Riow`R>%!dP~1sEa{`FvdM zYPLLtx>@og^#klqroDyrC(M5D3rFvj))a2X0)#iMlIPfRXs^#$lN9g>wi?{vbP^U3 zOKw6j;kw@<4wJR*i&tNlXiN(gjku6L6&4_dkX6`4u`z$7Y>RQ=lc?M8Hqr(VpQ9LH zi>jYFuqwH-_m%e&|5}!-Rw0fxfED|7?a!LX$;bhDpd{!BY$xx~VZ!sCELwo!Gq{u=CGq}e~h4X@9aS;3ey)RFj5iH%nx;KMwi0 zV-k+Xo5k}Fi^Vv1V*m14^8{4D1jIY`y7FBiOQ%2KdLlI5gb586!G(~)Q<*VUf7puh zPt-#&j?^4OdzCrhcf&htKfMzNqkP%VdrCL%ECQH@d&%lgG(py$-TlX+hyW}i9_K3y zHUqo_)e{E+(e!sT7B36 zo-Q-2oM-`BhW^ceoP@yu{{}GZH>gU$O+;x&!!;U;P5NGXsq2W;mf9nO>PjJqFmLb- z6H-ILXn5}6C%v1hC*D1o(A01Z`r_yY$%o6wN09`A zb!+YWE%x{gzLe9R^P~@wR$#aqMJWjM)KD*iM^UL=Dnam=6W2kYrrroW3areV>Pa?v zU9&&-1hCFBj3s@M&|-<3`8jTopbd)^1{j+wwHY=Lpgo5MY)l?6!-_>YUx`Jwm9?Wo z^=AM(D=?NU1c@aIcN=qpkD!*FD#Ie4SLzwuPysbh3A*;M*~Ajr11k}+k_~mOX4Rhq z=!D)6)s6hph^Gs4tcRdImsCVl%d1Q-iim;KJOed7U0_3L?CI^%w$)=V0CrY+%{Y_l zvYsqA<^;E?>BwtsV^$lfL@}%Nu%4%RiBG0Dxvc9=#^-g}u69=g)mdG0H{In9evX5y zrgMPmW29Z2(o1rT!XY?#PH}d*-P-}@b50Mru0z-w;5uu(SAArlyzozE7l%}V0dclH z0p$eq@xOpRgn6>thU;VEj`u=$El8cU7)xFS!#yhjzRSr@f^MNRIzF|(>$blzJieiC zIOItl8&(lmz=K@DxMth4!m}7DoF{yw# zq1J$Jhwix3?mii)VX9gzQ&9EJ!FUn4nI~&%>Wh$oa-nxZIpM6F^`r~3i(*7|PY7yg zRE^DA(_`vLYcT+2lKN6jx8gu_`DU5QZ_dgmPs8bQveqDgcMP}INd+qus`QX%uGZ2( zu5E`oqj~u2Y3cYAmSn3Kp4F_BGdidxBSHt_^r_GsZY)W23#Ezzc^an!RHzc4N+nPl zRSk7*=&h*yWzBn1MZdi*DkL`2I1RE!48x-lsE8`x_w4Fq?A(=(OBq_lu(Kr^a-A*r zIdg_=wS$D$o;zrWDppPfc!4-kINU2J9R@QG40u*Qs+HsQXAe4}^4WiSwx9h()8gUol<`7^77^S^H=24k=n!db0-nDF-V&4i(O>K>)KZrcvIy108Bu$zyB+CXRU@}54B8K>MeQy+o_+pa@Ia7^ZKm)l|{UVMP@9`#3)H3_?asL z=h8?x_e(D)OeZR@$6CCM-Pw#7sql9a;`ru&@lZDaUJnAfbV zv^Dc4lgBdugN9;x;f5QrzBx^{;(+ogTor37} zcwDl947@dL|J?f$;i&>;@6ih3U(NUtDCxn+4wRgZTr7U+u(F z2ygz_ZcKOPuyz_@>Rf_ZYI{d%Vr> z*-|g6v2E7lZQVRN#3OXpQ#n8b2ulawVZf^O2%SrXyzeV;2+6sQt}<5O38qP=>gQN&pFj_a}y6)SLD zM$M9?yAPE(U#q#H(_X!pq#g+8?R8PUgIYPLAfi@IwADN8bx}b??SH!pnD**L zil?`9Oo>FH>=?C=q1+6$kJT=y$VQ>u40U{6xuEvy6=Wc&b8wq)ZA*hX2T|sTItObP z3i#IcWsX+6G8ygFi{#8=FSg1GltLl4qBHZc%07992{M*=Ogs}`0wo7;utn+nFAu^ssAN=2T7F^dt~J~;`ZYA1G>ghRgDSdSCjEz0JGVty zdv?;+&rqI*#Udx4u%#c_f3kHq%#~O;YZ3NZM>YSpH8MOlE3q*210L9F53)5hoIb~{ zf#ZLASLX$dAM8}TLk0B24*olh0ni-2p}jAjsEOXf%wKc2u3Jl^b0?A$v;*O9`-#pi z2R^r;7ju+-m;{lYpNqJTZYKvGbZb|rmbcFE{*$~NMlZAyrAXB+82|>+@xk>wjcI+7 z^sJ5HXyuUtw2O&ozctv^$>(s5mMr~J7^afk8AW^Oc5*ZfsA$lOSAqB{>N=SRXZIe3 zvLagkRSwW0G?%!3x3*9B+_F~7Tg6&rZ!=wDEVj=GbnWt4d{+-H=@v;BIK`XDc#W$& zWj=h2ey?cn5yu$Xb+RziZGRt)@*3^HXT{(jW~h3!H8+dG9~1*q;onT1yQ{=lcYFt& zd6f(=q9bskLnXs$R)*iYmeDk{ovQW4ZVEetDxhf`?}>o_0{bYH6qDHR( zbR54Q=E_v8ri><7op_)S->IEFzCzfwWe$TXpd~VdXBGtgYJ9s#tIB41BiS3$TZsw8 zTt<}k!6wSvcPqztJI8k-hq;xr$7{`cw0b`W?N*Ks-<0>!|EC!=4MPT#n-WnZY3=JG z{l(T6S&B*0r$!WE{c)H$qk@k3F`&F@c~Z75$_VrCl{9KrlT%`Gl%3dk4QG)~dZzV% zyaiu}<#RJ5azjZk3z>IO234_wGZhx8JkLO&Il5SC6-mz1e2#1G(9fu?kbMHuUbNNxYb08Z~XuM zcDXK%^9AFZ{@K~nl)L(QeEj&ke@6AxzAoXG_iw!+ zZt~A-+`$Z_d^`6OCjyjree1=Q!_{2H?5gHsM8Eqy1kSh1|Gpu}x{E0nOlKCxdbQ-k z@$m}nhxd^&p))`qmh@PkZq4WWdIJb4Nq61tyS9OlojyVFWaio45d!akN*JF5woZN(LuH)zIad5EkBC$sgN{ zia1s9c1iyr^RU~~&Y^^w^}$%a~;O19FICKQuVjykgym2H_AVTC@a$=i$o! zz?r9=LlK{KR4JZ^yiruxID~{Bi%F;HX?_Q9WONn@(h`ZAhpQlP=4nGI3bdXy?fpMa z-vU1;axA$e_b~i&;dvFd6MoC+EK;Q}a$erhcvAPKV3SSvhKnmN5l8CAXGW zs{(e)f|l_jM7_7tH19L2I-Q_tc8au~RK2H*owauRIV)Byg=I_O&Lw8en-G~TSNV`C zlBxGrp3VD=dYYDCnjMzbGaIA)8~;LU=?0QM{UZp>0IQbU={L1IwO<2%NcWMzZsk&jRbe+ z$){AybDcJKXj^U#h-$7x3A%Q<)d3W*5G8pbos}8gj%UU02Mn?E0CDt~j7+Dx;K+!x zgF~G*q6W{Je@XqOOO-<%eUMJejPAhGV)p|EdL96)@mT;$+t<}VX!v*Njn|Yk2X#{4 z)_I_koGBGTl}X+`-T=@8kacDwv#}qzHFqca?Zfo;!Vlvwf)u2oY^&!ps&60JMcRz9DgVj6PF zf=pQ^piK4`a~Y&3B0FJZI?L|1!`H5)7b%YrQQw?I&e zhFc*fPUD0PTzk*F$Otuk&It8p;ls%Zk$p^&!W-aK4cq3zFclGPfJX=0+WY`DN)^d% zs~WneC31AM1Yh|+c7@b@Hf9?gu=*^t)i-?5;#2({V?rGgRa&BExCfLFPrRIrcn zswO%|t#(YQ;5*EtBf2S|bkSz|mfq?QzG^5|mReC!RB&|kmG29unGcfhkGlLUlgBnP zj9Sfo#Y)kSN55)!?NXXS?GM8m)nT6WsE%)4%{&Bkd;=HCK<4TdD6XepaQ6(&;bw6p z-c&WhCx|x%=06_U{>8Iw<-lu>0$PP)7?y=OT#0{0+MeNRfG!o{5@*d1p;BRKSZXLp z)AZXj(5Dsr(&;duVW6V2tJ9d5K{Mp`GghIcb*%E#md@sr zm(b#PoxzsPJcyA9EsobYY{^VdWF53PUKh0GvJ)}FpvCdJoVCiXt|_Be{V`{*U=mie zEl=~BrX$pD+XXG^G8%7QlAWmuYhdpxFEj3T3Dd{FsbDh3*n!yx}s z)gNK9=2#l$M!k}obxmqe-jM+89}G+G(@v?iq?w zW8-DBX{*ht3sF;1Dw{9=o0fMX*DyTpx*8fxm7Db1rhRzaH5@ujm7nz5#(j9)H53L+ zoul-6Qa?g_*Of3~>LTT~g7O(?PBm?HzXE2A=x?p!j6!CBk!tTlW2}$JRrm}UY$8kA#m@5_~Dw5m1S6R_?P2CD4kk+~*J^yjVsF`yyJQxMy?| zihV{8p()STOX#TFbtIk%U2MuaSkXeynD-&vi}51UVaL!`R-Sp5AW{Wh|yLvkimv+5Spj2bbIq8RX)BoiV~uoW;}-7dpYe3`4KTjNkT^VZH8J&$8-c6Dp5W=gXQ$Ah;4l~#SX>O z3gYDB$izmT4WC0ZJ_IegkS`K2xP`B$P*PBw)LmD*9+`jqJ#`xtE6pLuyG4|)BHCz* z)JxEH3o3tyHt49-MO{`Sm8NShk4~xrwVmCLglkw9?3DjlY|bgbMHv&j*fSbc2xQ+r zjPRj@NyF>lmv12nbA4ZrE&yT$!-z6#dZXd%#}8N-sh1s0n)z8!Gs7>EQyx~)@Jp_rPgFAhRL2$1KGR8y6G#p}d@2>_Q zjX)OKJCHiR^B3LTQJy|7lRCXep4{vdd{Z@M5ebitx6WxBHdC#eJMy8on{n`eMDe}; zl)stD0V=PH2}hXoE30z?Bc%X*0ghW8nHb*X{30Tw^Pp3dl| z7$N4_pXAX|G)p0T72%s_M(Rlp^KL$eu4MoigeEP1AbPhb{2GjgWYC-AT_fMjD5Ik+ zytfB-!hFuMM!d^!r5a zt`-S7qu=@gZN_D8-K2swn>+Z*8B5U^tydb;II15m>N=Z%>G$uNr2i4sc(p0SFB(%V z6;b9Vz0atD@Hc77bm7lx(afbWuP#xFmbf%XCB_;Qvs0F8~fI4&_R4uNht~TufHAXM|U?sR&BoqWFA& zt)|;e~O~f)}E0sz-B`Xv&;sE$3dJB8nGv300 zqm{eu*ges+DHCQ>HaA6|?%0Gh07+$%xF+kf)y=jHD^OL*vQ5=T`F%PHK+bp z)3Y^p-{kw31K;>B-r#F|k++d@i!`TwB-7ULUZ%NgL;p1g=4%GH*0n=3W{6m^*Vz}Y z@uC-R+JqY@ff%(5DPsVOK&E4nd?NvvTWU$74*zCnPH5HUmv z@j!x*6eJI+K{`+Z#D)Zr1d>A~kP+Geg+VlifdTe`7)XI3yas0=Kr#>^A4;JL8leOF zVI1aR1?bp7P87kbsD!#`fr0oF)366uky?)~p8ajI=Nf~}7cAd>{G1iLp1Ekvu5NrS zd(~RAH%e+YYt$?(DZ4rxnjOkRiAZ5aMcc&48cF8JoQQOuRAWzf0+EC} zCudN8&7p!wNrh@yJ*@ZDTlXtSJObpDfGjmaS`1;4X`z9b*hG|o%z>Z~(Q$|<_$AY( zZKmx$X{V_xyxXipSvz``PUH=I)--TT_Z`|b%P#8{9ADaFVK=nXJTrZ2t_e+MYO@?< z$kE52ZnTM}TVi*=JN8^}V~Z_rf9E?}bma{dIKHXXHd-uaTodx7NQ*IRF35DMpSw-U zb8sXMq@1DSlhYHVqpTVlYpts!wMAsgQ>LR+w-WMN7M|pl_4&T_0#C@o1b~0C!$9a* zf!2C3>~%=xo4MjuPg}kD^F<_E?XGU~VS6y&jz5r8O(@|+A=ApNGOsLJ7LjG?r0Uf! zv6M2(u5R&Fr&h_OlTDop>z<4n?LYLLHuvT3?(4?}Szk!uX#s0Gc5Uo6{udwzrg+6I zyvA2wcRTUdQs)(yuc5vYzTZ_}eRk2mo@2`mTYfkWd&u6yQ>%V1>~B&Z3EFhND@)?r zVvVblCmi8v_3-ab|JK8%*TMAk%!a8V*}a!NK8=634VmN`y=kKdedfHw;DQ|$SB?k; z&RP~;b&UM62LahF?nMn6)6U7)JGj%W&%N*5aU}!^Pj}yT?9OLy07weHMCSlW$Qdj? zg?GwK_MKU}RIpQZ*F~|P_}h&9vR>x)RR7l?F*>ZNAkin`DFz=7MeN5266fSa{06~F?8Vp<<2iuV|%+cJ<*VJb< zXY)Da@Z(N5)PS)EPtPEM+>%_B9QBzJPvArci6fCO^*VM?vVBKc`+7)PlaEBUvo3a4 zZ@6b1KRU%n3P+C}7z!~Lhc4-`ab+ z_HNznKSgFw{?dPyPUtfbj?YydmH+4B`Rn!j`oS9Z%Kg3it?HUip73wKFAl|9ulrw5 z*8@MN*DKY(_sjBs`M=Lw%K!Jn>hJHx+F$MU|K<9>`Y-pD#$Ds*t}b%5+vv1;naAvb z4bFH0WDAE)!8Il+4Q!%ykWK75bmyc??t9~>8yO7~&s6lqo@!HF*_G9>b~RZ`wO=>& zS(`#jEVqifD!roW8anT(!|wH{_dU_`z1F*Z*{?lsti^V^=*w1n*SK$hM+&;q(n&Kd z6xwKzRPeQP)#)w>d-?<)Tp1vXqrrN=$sg`DdZoy z%QHOW1w*W}&m{}2vMo2sAQfpzCM&rm_l4!1bfn0xAR@{^B58ycNpx`}*9Uc`stdi* zZ&kEkC)LtaYu%`%P%~}S8CaRI+MLyF%aR@0OJjR$9qZbVO&Dmd#a0?+&|HfR+i2{< zH*UT4l7I3(AM$D6IO?jq9{ZW|4&CzDTVEhx(4d3{JOVDz!7f<1NKjz|3IGNWG7Ja; zUqX;0azUb`LarnwFW^Y&;E*vuL>z*`IRsDzz#bX^uz~wv`C41I-v?3&?$9k=|tGQmZ@jTA`9mlYfdiak!#g@fhUCjxv_DR}@I-gLpfrQ!8IAI>TOGSd} zqjzCy3?teU?r?_95X6m1Q|W-W->GS{VDsgnZV{~6&ON4(n=g4ERHxeeZApIiNQf#< z&}7mwA$Zth@_S`O&0FxQ$D8gfb^=aq;gVvwFhMWs1unbDnHMJsZ6Syr~}OP^T$Ee72gTcvhJ zc9V!|)*ITkZ|LiMI|0|T78H4dh4D;Kxc8Ra!xV zbSY&1eErwVz3W^M$|stjsYRq2?sKQ^^VaOXWj%tnbr0?on9O5gpX zQ|sNVWkXcHXTe9pAM}_HTQh5caa8}zjOUuhOS&bgbbAzGXlnvQmfy2Lba*bZsrn*( zQk_8TdHpp=x+KiTkDvn2lYzFyJEI*mrVAlw(pu_Fpo2fP!C<&ZeLf}{Fu*;ZghguU z=H?dXmZ8zlAQ%f9l$&o&_qVJDAxC-C(;x$MZ`vv<&MC)7>B>jIke$Y+3JKXM=?(d} zhW0E;|ID-)rUg*v>9n+OP59<7vqnOg3I8TBRIrLz@`Cq^y;UN*g?bQITPa`BavSLw z0#gb8_O3)YHkZFMoL7#qF~CkIv5k_zNi8l0SzyKcE|j{ zz8Oo#Rop~QC1<7M(EFcpezU4W7^l_rBEfUaxH0K&x%JGr8&^NyMntZ)TA70R?EUy8;+bTnLvL_S5 zA0$1c!EtgmCL`$2N3Ek0Yyi|9z?2TUE`JKjM5HYxQn5Q`Cdlo@?u_9R8;w8f9BePp z9G9rjYI$RXxJep-o+yL#C3naG}y?(OidtZXsW`4cqn~UmM0ek zkT0wRRJ(#ZRVO^tU9R%K+H(NrzslfnyXV@xh?)~(dLEdPCAR4w*&m*;*ADmaiGz~w z{Gbj~59G%I_@0mU2m)|?R+1orxCTs(ABxjjFY%?4wYUBjQYhoQhZEuoK~05C*91^u zD7NKTQHVbKrnHW0EaZ!6D9MEASh%5Y3&y)eEOcK~SKYN9zm9f#!s=X-r^KQ3sX$_+ z)DiBEnV}e|?@Htkf>X&)I+g+`BkKbAJ-kk!J4tgW639fWQWS%AF z5dYIG_V0|8V~`*W*Bcrt$02}t-vVrD8BrBbt}D)Nc&?M6%O@VlHYd4Jiy#~6x7cNU zxTv@bs^&_Xo2yj1t7|qxiR-uh*6}T6SP4GY`8h#+Vzpf|1kBOHi`aAIL5q*_jUAfY zz(S^{=vQmJyM358Q6SNOqF@cT^(D^cNr-{FuEY%xpQZ)7baZBnkU#hbKXKG4D!gK#_VtTSp#JRq z=WX`G7Y{xZkMuk?99Y$B8g53JeA#O9>1a}*O_N*+y;>9VX3?v=EOv$ z#L4$neag7t{v_AwW{T07Q?M@32*UK#IwTje`?mZ2Y0mjIpU>pG|9^h`5+!}zeIRbq za&n^BRZm#f6FkyV*A=qxTf_zGL;24LbtNm~6ex_^Lx?$vlC(I8q%sey~fw}i&-@!_p)>sAgJ638r4oy1e+R^ z6gYi00h6$<$zvwdQ(DHucqAF4)aYqbW$=sXIv@qN$z>kp^b2x%HLW_o(^L_3oweyc zst10XUp=iG$ek|&D&X`%&CS)?2kGy9amV|MmiZ@es7>F0B#GG1dhUbrE+o;BmP4?X zLpg;Pdw<+_fuQHQ5LbA#xubK+G=fzAE-rejTSan;C%z@;R}TW>Sn8zB`TLE`4_6-z zpXd{kOs)qMG#<{yXLKQr$v;<% z=CKLoD<7Zp?KPrsYUJ3EmZoXdLkQH^1v+8*Py2hwq9kMY@%6G;fA!oo&{sXuHT2?XV4I8GxX2O+_Yy(+iw ze>_O1+t(={6Xn_Kn%DZ6sd4*r3QTcvyR=_xVZ7Ef2I*r+=b;^Ark~x?aIb+5gS9cA zk3Y;nFS~u+ex&6OW9m@FWh=8%m(b-)A$}JF?ufxRh6(Y`{dpYzL9*w+PPRn9lRbV= zc_^AhCNNroN+3^OMFpYu3Dv6&+QYmp`#?$@PeK^D4P9 zBZnJZC}v;MnN+z=T*Cf`|7$X|y6O!zwq8lGBG|JN#@hIyYRV_XzxEx5AB?&lM80s< zD=zzl=JTldT{4xk%=ChS3tkm?CQztj+=WDp8{o}ZGT=sB-7crO?IrEw!6mu&D7-3} zNQTBil3wWO23@?fIt()h0K<2ha87Tml=tqPD6|(XTtEOW^C{T(R28Rl!+lDU^UMEP zWk=X`i?`v+19P>4k08%O4sss~xnTHOTrM#l)U~5^ca&qJ5QbTXSTlF*#%lf|4kJ8c zuixB0MuHdll9m`l0zBjWPw&xFJ>vI~A_IY*aBJ$rEqGk1F*kO5JHBchKLKFH&LFvY z_vi5X=bk8(BGP0Ol;=}LutpF_Qb;UcRjH`t_v2}cl*q2GZ_&xfYRkx!pQddC` z&KBCG;IXIgbvZq}8q#ezPHGEWn-r|yMNNR^BU=Y)JQBMDVv&9#6N6N?L*6L;_$>_t z0_V z!nn;*EkxiIwPlbAg*0+pjFix|)bu@`(mp)8L@XsO#1ILjr`NbQ62Sg_*W6jn2C_=e zbf|#1{u_JJp{T|u`Eg~*{l6MU3=b9VB3~WeQX*(-0gY4JS;HLqc1ykYe7XBoK+EKvC#!*67;*q%h`TBPu+wjVx_aFlPbtTJ~M z7<_q};hs4MB)^3PN*#Kp_bsa49~^OlOefJ#Bc+`XySv&KqF-X!yW3OgBsjW7xNfgC zF-BUq1kw1T-k2!VQyTf{3jnFchc${Nid%9PfT6puzZxoVq5DAwmIIT7I3hf*$6zhX znG7E;;xybI^T}HmPQQ=+ zph&L%MrU419Xs>~-X#Y?!h=c!6?}JioWpl<&a&w~c}bX{!tkbUsg{7E9M;INFKtP# z=kNob+w}187TNABWeB@CEf{;|J{>INObaRT^8PZjU_>WsQAoIZ`&HI!-fz=LTVcp(+9%-glJ}e zi26d_$L_;F2je=DTnaBx;1%qqaR)#C&hR&|FrHXA@Xm_>6{tYyVv`a{IGPMvtB6zQ zhv{rze}^SF(naWK7AaZH1jvGwcY%M!h$fu6i4bl09XyE(H2Jk7n)P2yN zQVDUw=DQG5oOU?G3W8FIU$r+f9;E(u^ly@ttRew`UY=7UcNirh{oq4pFfm2|-MP=l z+-mTHzfds|`rt`uuV*?@@DLIR2(73ZfY*34K!H)AidHmn*{+;7X3b7z10{4(VEyNUlT@25+C7i-rN&poRL zoL2W3Z6YNJ$drLfVwiq{THGIRu1#OpTfj;R!jhydBW?0uAyFhD^RL4|l)L%%J>ru) zXcqlmN8!?xJK$Dc{Y;_XE~jgbpWFo)iK0lCz|`M5{m1I7HAVK64UvmcHCsSrJsZnP zwyfGFE(|zU;9%5lnjN*j-218hr7hY%*d6*TF!H}G@vQQzkiPeS;7sq%YZzi!6HX(R z+g0gzucJrZ-fDhaN+#d40PQV&NXg$ev`kQH`sMiyt;B#hodriECjFbhhTo=r#qc+T zZNKr?PQ`Z2B(Ra-I?Rb#;LBR_&kp1qbBP+NyfmP-^FM5funI3$6`rjt?%%s)6B`O`Z3B2M$-$tj!5AIrkH_ zi3G4v$H0B`C`_S#4*0qR3zf6r05kvQL>^_FIX%;&-i9B1jSY_WGCd?f@u2s2wwrZWZEkc8p~E~i zK-4&8u_BhM`jHbm(VG%ltQA+i$b$|oE<)Qsc;_wY>IgyZ!o?|5=?YUQE=;%i8$h1d z=;Bw=pB?Tkqf8U(Oo)_zrBHs;oSVzz6p3$76ss3+nd1asGp__BPS?^m8%5 zXY-NWa)A{Wa{w~Py8|9xkY|2^O5%IrMj7~qom~h_;6Z3gFQc{8I zgTswn{ft`G)|0b}?o$FgpzD?}O@n2jB1;nC4|4T&$#d2%eLjLtv=*FaPKN8Rp)p=d zsEQ|vD+s(=efHu}K= z-pJ?N1R5*JC4{_EDZ?3v4>`fHRPyS%YeSVaJy*<#2)DukItnR#P>IjK7OovPb%@o)1uD9 z*4as}lSg5FjQjqqCOLov;lbY)I(_HTehHw*J#%!Ww8%{BPP(ktDlM5fw`VPs+B*2f zZ4l1-$@UY&p-TuS6$79&5vN(D+6z585jsc{LfI`9)@gD7&I&f&j!pT=ye5rlBXd?~ z$_$6Z!PyhUtcJ{BVzo&mI*j=ZlA#TQm6T4Q)#O%IT zj@$;cf?!6kz z=nsAlA3>0z9g(~x=yc>_6F-A~>hU_X9p!fJ|BHu1iemsKw^Q7ZUG-6aiGky82;Hb! z4N(Dy0p6M}7UXY~K(iAykRkW&K@5V(Jz6!i4jcL02y~d;HlX04zq8#xbdp!!)Yn3L zQ#MLlk+1CHK@0!nl6=h%OLkmPP0U|%(Q_1V_Mc z_(6&&ijYxl0;1@AF({P1fWXH0jelVGO?BV(qS4sk*_u|S$HZv!-w5@S;%l>JQVWQ4aS*Pwz2;S1fOF8crY~NLSvu=zsWsW zk5?&wJu!CAzXTvOHzliO7lmS*MHxK$j6iwwlE{7A%BXofL= znpg9)`=WuINeZT3op@rLy9Z$@43{PNTDXe~`chx#FdS)P`6hZuPSfK@XtJfF#lUV? zekBK;k|CNZUmG+$#tbXxbjB&TavGMOnRb%s@t`t)B%)g(b#wv674)j`!4HYyM7$g4 z^A*qkfB^$<(hzOdb;`K*U!)EZNZAzH+1CxAdNJq=2#hEMqJl;@>w_a&SuxVM zG~GJoV`<(0?N76!l1G6MPyLS1gfoTz%%^?;J}Oo?7tTP#{v9l+W*%w&I!VHr^n~7K z*-*lHC9rAt@y{}O8L7o1S)UQLIUX5X6OG@D%Sbyxkw%#jW1IDmtjEgkR-S681n59) zIQTXM_-$J@@a_LHI-eMiI}3k(^-NTUQEL1Wz=IGH=(h_nnk@CGiOHVzz)w*0%-rd! zH;EV4_)Zz|Y)(K`TM17vH61uIbh^b9S5naH=mvIovT9GdwvtPM$@p4&mFIUIiIaKi zr-FXjQrN2%%1q`RgKTS*wu1*YY!h7yWMV6ZO*vJrVsH-%KrW_KPjrCIvB|Ynb2%?% zr(JO6#^N5g`?4>OujG3Ne)@<0XkfyTftw+3|YItO4%kRBF}_>T6TlG@>Q{qiK?dR0%$!ahIv~D zLg2^rgY^s7Uw~GcCm+D*_wDuaF(3}2B@nj&CF%s*p)B50Xb-+biFXHTBOJDRaze~P zNHdtfG%FKCQX=hLbmcE#T3280V? zDarX z2(}~7?uhL6+JAji@`)ze-2*16O12ln=w+NuENEN60viwBFi4#$5K2&D8f`Dl99$z^ zmPzo05LVEHwqE#BZuKDxi;1sLRnz#j1+?JoEKTa#7Ae_|4V(i^s1iZsmr^i?se{} zK>OuR9(9c?>;(U}7n1Js=A*RfXLdXnOlzmomf}2fgYTgMAa2`V5W@BFS)wBt|MZEw zjk~wqMOsQ+uH%?Xfm+2u%f^6?EZ*Op?j~or0ca|nSX%`UX*bfpd0hySX5Wq%Nv{HU zGHO`9r(gALqN0Y{b@?cA^7V*eyteX=T4x9&YSTmtRDVitf}|$F&uvXh#V}!h8+^Cz z8>rJlvA+|rp_wW$*SOV?3&dT&8U-JxKum`jCnw@w6vd;1b7F-2$|#Wd<)J$1NpCV2 z58Xmb57^kQyx1lJ#p?#i;5h_9`_MIlI;cH2d*HAUL;I4Dz!88CUx%djYB*`G79m_4 z)M%Wev$+Fd=O&YfH&}BVNNs?pnLfHHdh6N4NmO&O1ZfjpGTa*PIOK0-fd*1@`9LM0JD-+Wr$H3iw>Ud2A4~Ev&nK z3L4{e2iysz*3DsGs+)q1`AN06|O-b zs#2J#gzf+_lrtR)Sr<7-VF>n~*Zxyt*3!rh`@0m?=DK#afj|sq6;m&RX+wDf^3tf5 z+iiDbUHJmDL$D`>O8P)wAO*&{%HBpIt;L82s)wt*%F%x4RMIA1({}##>mCdk%K^`eB z%flW7Lr6$QTGO24CaHevQMbGlYl45BvnaB+GTqjZBy%9Vg#5W{rwY|{^{6{(Z7pwe znAE3q*gHV7;-E=Gxd+!a?MuqBu1#3ND$~b?uHgZ9_LlZvGnj`yBW1`XnWrsunA>GB z3cq|?zpQNOvPg&-gyyl`wdIhB*&faw4`!_)h+L{<+jr7E;OZs>om|(+=v(CMz8*^M zm2)oUy}U&p`8S2wIk3^=bGDu}kk3Z|0Q!C9?sy)uQAI%lEuGb^3AfT{;OT55hrfAq zITlW!S#n#7)a|m~i!}KOvl(RC16&!1tl;g?G)+lzH#RmR5RmrYnE>}lJ`|*g8)0D- zIHXrOIl(R;@;{PA#)Mrm)lMvi_BhM&TB5-AaTubXst+mcPtX!`hsHN@)$F3kxWlD5 zVi%3-`zUjOSe9)f@PCW_FTlR~_{TMybkm~iUoVX>SuBP=HYC@{Prw^7<+-;1M^P3& z`O@6^A{OpQ2#x2(YA{YhMUKDu|9k~)QCV72fL$vG3W9cS_>K363?IH8>R$mT+xyn_ zFFZ*-Y1D8`JzR97cBE2lHiC|kgeZ(Bj{Sp%OMNd4kL}ny4+WATmn9{fAHsu4vsi=8 zNm)bnx54gl?4$a7Vy&!Sqxk|SJ`yaDIj8OE*)No(K@w}UX)k`j!>eWCh$^5f`|kDR zyd_q}m-*(GT2388faY-2zL{P+hsYdu2h6Mg4++nsGMbg+!x>NY!jHm@_Eb}EQcO6%0fGsojrWQ%bS-$6x5?8sFlP$CqjWr*?W z{Suc<2dWlCt>B6r#4Mz^E~BCk)&eS@{&CtLNTH<9pSQ`pHNnS{s)Fn@voUqW2KJHM zV8zfe^p&SzW1D`z+x$mmba1Fxm!X6dDN&7}?EBoq?WLM2qnwL+eh7WQ)I$S?)p;%8 zxVinEs4gQeKP1+QH7lcNXXAuyfsj~Alb|3l>Po3@Mx50+`R*roiA43^(PJJwe|yq+ z!GxV`lGFWIARwwjs)O3(}pyeYBb(R+W3>qkOc$Brw!5hOv4tTVw^xlT~IcMsk zrqW)2gB{n9DL;_Uim;KTs%;%MiZdDg)br-c;lSLzoK-?A-N`L?chfz76@T*Y3A&z} z&8)bt1n-x-Efx6G)_w#(*x_H5qvoP)WVo&R$ zx8@<&+}4Qj!C&T3Of`IqZD6TtCaHboZ@NvlZiU`A>{q8?_TkoQeF%Ro{^5@SdsT~? zOt^z}8`^Al^6osZv{)klowonSqdZKjMZs9%QJ=tx*kl@BQH?FxAfo(3xALsPpdT+-1=28U#8nOBX;Z8Tp zjC&0V2ike1*i&uj=?GURK@}j($*`?S;9wmu!0A$VA`VyNfEvN zGLux@g4Dqt`m>iPBkvDTsCAIUUi~X0>cJN6`NHl(>vtPWz#pULCh=5u@8cInSoGlB zqcYqVEilK%`Y&uCgQz_p=UNRS2T}f$`<*A#Pz@0sdJ?!B+$U-pP)H2Mg1bl&-`CWo zo)IXQSBW&q+5L#CL!r7(mBt~Lg#ISXnfSal^CWG6yJgW0Iqfj3aG6^XWPr$D^;r4D%cmHWwBBms5Nr0~&PycOrqJY>Io5m0#O@MCCF#55 z28h;_gM7!d;zPUb2R2qR91d;)c^sIL50PphRZKoyL;ZPdoMrou9_l2nFwih_(K~To zlG)3K(aTzSmWbjku`fJaf5&k9XKY%TC1mbWo@T4087k>sK#zJZJ_XF2;zP+uIX=ipU zp=Sq9wR|!hFva2mAl#hrTm=7(A5iIJr0WlKtc!f4n9(W(#e z){2$ioD=I7ZMS#H!0UC0h84Ec?O7xlXTa#Pn8`BP4C`P`X!^;jOS0yYT)UJvGv+#) z6tYTi1m&(d%Lsh?g+7p(0?W19kdkdR*PFG8x76l+G)%G)(%%`lSR=XbhP>(AUObl5 zR~3_IL@|<@FaMq2WhxXcEP&N)oS#K_HC*x7_vu^@ZIS#$uMDMd2mi5Gn{DP8>#{*vIv*U!)-K zV@<4A!X0ZX*6OxH^>%vAi$yQd%#1DZNRjk(X02VZ!5U80ch?8E1ZqjW;f=MjiIUUC z)aRAQ#&G89@6{$_&y#zdRf3}*m1qWpRZDRHX_k_O?*#D)EFu`(%Z;c@my9x!X`E(? zsE#3masF13!No01<&G{vu$ z{~f5)@Q<=0kP?esdTdS+pX1bOpP_hU5J~C%f&6Dzitwz>)|~#fO>}bxmIT1A#JuhcyU< z0E$P$jx2}Qb85xMFqA8)_=V6Wy%w??@`uaq^9U@;`v88v@?_w_s+y-v$82=sH~cry zgTNkgiU$iPJD{Fl^M?0m`a@L4>eWyD_4uCUk()VPv&x|+aoC_AR_C1=w?=}QrxgqTT+{-83!$4Mw060f~CeJ@w>EPE%Fe<8WgUYqg)u%~H>wK|Re zdEUv>{1ktzF!gXp<2cV)RsjzYpk5C5v>`RqOVOrtbL-YNMM{dVB`B?>l6aDEaeA0j zz*ZUb3LO9`+EpL;ZdN?W3`ugYh`^1kyWdcA;93)ya?D!Si($P2GrwL1q^f~+^&5lV zwZc)W3!%tvQZRp9BR>>wKyywp4!ra4y5(wS5`kI2X`S(eZnSZo4GYru)!=r4p_xboL6dt7-!-k_| z5~SD%X%HJ;<0E)I*>_}hlz7h`yhC~;1hG%SZ{K8nP~slG1X0Kr8{5hjK!rhCXKTk? ziHSn}gedN(Z4Tt8;NAm&-lLZVe-g@5r^wd=wy-kGVID=AJ)1?ZB6Sa0FjFYTWYGu& zz6YZP692-ZnUo51wA~^cGIsXNFMQEAx)}LrGI{kWnf-wuO&^=5)OcoIHF)OLjEA+9 zh-x9K10J&+{@`PaOB$Dvl0c%Xq$NyAxXkTntM!*fTs2CD3s^6kP zcKJug{;<(k(1Fqj8iXZvyc!OUYtcltsWGwIOMkFI}e9Rq9z&craV)&H-Hm}mgJzKQX1=%mx+2YI~KLyRat6C8=uJH zJe_;jv9*>>g6#9dT!K7zv#D-FoJ1X1*rNLGe}$7g_SnW*am*qw4&06F`9o_zsl2Go zmvb&(toOA)A^!Tw*dn`^ub?Mzoh!%kr!FHNp)*b4czSmP$iTSEmp;)kcWiv z4sX6FUv_uBG3+C4;W7hYKCF}hyBU7haj?C-FMX({%deh(`Fv9qsk_u(E=y=p1iBAS zHLhrs-_^2&rFBT16E##(O1H6aRrqY5!#Ih+Ymy7EaUy4{j`WMeKM~$ys^E}AM5=#9 z?@^cICF@!r|K_Db$2fqkuIjpLXglU6u{1Y`y&q!#y6BlNGjF2oHF(9|bH9ox?QH*t zFCF~o3F5ayu~8ipFTX%S25%j{PPclmL@Y^p_QWo{?yip!^=y57Or`+#Vf*;=_7+rK z|Ky>|QiO2+vJNZc_fH5)-j(dSorc)wGqttZ*3yxt3N~S~hrP_)8;=(1;E(9<$O0BN z^`B#CIhbI(XPtDCrNb;AW2k^xXf`T>IUt6Yy`wyH;d8i`y1Nvb@uQ2atl;Fr9Yna- z-E+;zVOi6xgZH*&9(OcZ8ntJ*1EGcXoi(DSjPL^X)>YV2e#%V?T=^~=g=&R@R1Klw zg3FU`HOluc2Gm>2dm9NcUe`gQnOOX&{sQnG4!{%AuZs0~RZ85v+a(2a0T(Rvref@Z z-e^xoC=Dc-g5Mca#(cAlV~6j2p#7GPBnd5F*}RiH~j={er9v-Cy(qP8;Y1` zsW;V|#fwHEjP^}Z1sGYTt3s-yCgtq18mGh2A{fA;Jc3l#mSst@CMJ31p~d_~+S{U2 z)#0kh`KltX>HK0pV>stWHd-3OmdW-9r7p#K!!%=mjdYf486ThE6hTH+<=2ivzj+^Q zyeygq$TqZGvcf5UvuJ@)x`c;xXJ?yieMA;tMM}-@irU_ZGt{hPcfKMtY5x#-~?t^(0yeMa76`md}p^ABkXx>%VgWr-h1h#>1xG|_bJS@_ISyfkdUP%R1of*C>k%^VYwJvN(`9@ z*r<`Y!$xc$VzAjv(QS2;@=sn_*9)C-Q%7zdFA^$oHMB8DM9^Bz-9X>H!~tr9uYZfa zB$sT9)!~NJiu*oMFfM;6r@WsV4$xNTK3QI(v;G4aEkqXW)$Gd6jNUdK?967-iPX>! z-S^(v)zGK~(y9*@8G#r7Sa;LvU@1HY&|)1!9UQ~dwkOQQM4Oa$LX7$ z+V9aeFnr02eNH>6*LdPKv={R-SacC}kjOW0DD~SZ`xfpunAKHG>303KNLPBEq{mz0 zl{Q`@6yrEof)Q02{Iz;?*#l}1S=@HxdlVK~XS`?)b!E2~w}?#;1u^t=;$#E;o0SW= z<_*#ajIz@?es(#TNEk|8x5P3SX*w%;0G2(^yH~o2bPFYggW?9+$)TM|M+HEb%Qlv4p1TtvO~46go<7y*=yI$yFsm#lF@!9r9b>XbH^0wiFV`9|EB= zY)Kf^%dZQhzaD6EN+vg#eZ2b7kga>lU+h*_XWs4h6n%H6aLQi0v33F{_=UN`vLPve zHI_!~?KH{_w%kbPZ~RzMneIks(e^fG_;K*oOi%qEu@JV2_C7*a1wA_O#+&11jcwd{ zhnFRVB+QmOCmX$OpI%c8+FNQh&v%8|`U*#)!%^4)b))t1;L1?M)W;%(BhePgQ4qv4 z^7F4n9i^i>9)u8*WpvrQW=Rn4tLFdWp5h7ptmgmp=%k`_-gNoHF^_0GohL>}irA>0tk46f~GP>TWP0_FRurxvufT z^Mg4+STY$v65>+a;>03ksC)IeIlBf=g!dgsh^BPW;oUB$74LdeW`{qD3NrrTopzeU zz8*hJad|gaR$wydQT&n3zkelv8q12Jp3z+Z&3x~}lvAkFtTnHepGzb36n${nS<9#7 zT>ioipSRAG_PtH!v`~!7TBNTl<5L5{m2k)aR|2884$`w+`SR7{)A!=|bqOo2ZLlN+ zspS^+*bJ_4xDQtbk@>Yeozv^D3km_>igINqN(Y9~XgHomyH65L5tb$NKa<55GHn+q zxby}t!u|qI6hWWkxv$`(T35QN@%4Fg3a`rnTxb>AGy z+*}LI!mHiUS(8psvr1QD=q#L3fLgH1UI}{i7o@UWfkvADBj^|Co5}F`qMOO^37Q}I zBs^f^!51x`q*vwMcz-X5kc7sC&1U5(T?dh*;uWcS1EF&0-8DO~LS8sVGt@)D@;SA7 zxi530R)3w(g!{+Nn`X_&P%)FumQ1ZXXVQ&gb1UVW1$^WMke*D+3U?as$m6k-uT+nY zI;?jC@=u=H>@ua?plb2eQSk}bB=o_Gq-X)J!+Ly4d7lB=s_v-gVA0ZTuoz zB79Ek^7DrG0ebZVb7P`$Z6p50-G22e38y^*j7sZ%Awr?_rV1EFwF|IoM~&=%3U!s# zI|Q{InJmsAxkM9*&np03@FvpeC?E5vSDz3Ry0#vQpga#D00+thD=0t+hzP?RFGE(L zvv9^CKAYbhx_bdy{QotR+inynIcSW7{31jiei8H<|0zpOcT^m}TbZ96b7PvajOuMDcPY{ZP@+9@^xAL=UkiS42JyR=>Bc;xcpG@7cP7-JXC;So6j&L7vR^ZJ;D0E=}(?cPajW|V4)ss#F~L2%m(N&oe- zjD&s>6WM8j+~Q9|?doY4_MKx>Y$REg36JwXgzw%#XWt^bEte(z6yi%Rp%B8wU}F=< zhs$u5^MVQ?#S@8tjXJ^0KMi#MM%oc9Vlvm%{j39!O*sR1Ne}^^$nabtr>V3{b3#K0 z+NkEJX}vefXYobMi8uf^V@CJpqWMa-Pbm;m*eM<(8@fX}^|gro@l)uSWr~d>_a}k! zh#W?QjY5P|lZdLc1JA~%WRu;E1}f-)oXRCCfj-Fsu?+A_5^2wr$N(0S;lEG4O|T%t zys<-JYa1(#frZJt&Qkz-@>&uZgxUz+%iekG1PH*7I;Fp;>t6K(xrp|;rnj?LP#_4C z<|J$+A_&(~i|m*y6*`BH!|Nps!Xdtt>)1NbflMnd!U;%V=T9*poU3bi;vL9AM=<3w zafBAI!^D`_Ax}8!_gr-mPSyhgV9(@N^$4Q{JY6)l%)TfTZ+RBl5kwj!RkQ@SFxOQ| z&W@S_`Y{8d#x>hCr7{`sz<<<%HMC4qg+YusPa6BfBR~^+q z`w65l(?kHkQs8YIRl4o$M}E9hea^9ezxp&d^_4FPk4w$cuxZ1T9XpM1^|De4tq2dA zD*__f9O!_j#46cYF0z%nu7`$X^Pz345(DVonm z|G%47*+0{hzlpH^Q#1&rLu_6Qc6;;|8nn(-U08u5;KO6vw9fKLbM!7|X`4teR0w*YFYBccsHNaDKbg`7OC@2Np?- z&&FW+^qlQMs10smuTS*`JbN)Xm@l0x87j#Vr1*}jDtJ_*fr)xo!X)X4ElIRRqA2JU z9^HdU^lSAl;PYFxT6w(EN20nGS@X`Ebk$|k_}o9Z^a*MP?Z=|mM^LYSoi?%QyMkcq%%Hlps z)9QI--5h_;XBGE<*80l?%pF{;wcSCdTyn#wzI5Lc&j3Jh!U!i~k%DV5h9f+23}J{x zD)Lc@cAUc|o?smJ@#31<;q{w$A%FJ<02nNRbO7k-23UhYLK5uDfRSV=Mk@}`n#~bJ6YKv*$r1f9`S{Q}gJX_y> zK%D?yKsWtseKy8lqC#(izXoGx(tg7_n9|=tMpF#}fczg^`{^XuUl?=&xc^BQR3Z=k zJB-Hu2*-zu#mIk}%tp-QKe~a>$R*1~9pz{+U;*}m0Wv^KlaC99Vail}?r;d9abV~D zl8RG=e^j``IHwex=gKpV9?~pg@0zdxWGe@`dBsg6L(±*XCkOkRr2XZ1eil7-j$2a&6KcGdW9R$Tw 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ð7Omy6z>61$2S5u_}O1Il& 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 RFYx}CYQFw`<9`l)NgO|#*mVE^ diff --git a/site/assets/MANIFEST-Latin-Modern-Math.txt b/site/assets/MANIFEST-Latin-Modern-Math.txt deleted file mode 100644 index c84e1e5a..00000000 --- a/site/assets/MANIFEST-Latin-Modern-Math.txt +++ /dev/null @@ -1,60 +0,0 @@ -########################################################################### -############ The TeX Gyre Collection of Fonts ############ -########################################################################### - -Font: Latin Modern Math -Authors: Bogus\l{}aw Jackowski, Piotr Strzelczyk and Piotr Pianowski -Version: 1.959 -Date: 5 IX 2014 - -Copyright 2012--2014 for TeX Gyre math extensions by B. Jackowski, -P. Strzelczyk and P. Pianowski (on behalf of TeX Users Groups). - -This work can be freely used and distributed under -the GUST Font License (GFL -- see GUST-FONT-LICENSE.txt) -which is actually an instance of the LaTeX Project Public License -(LPPL -- see http://www.latex-project.org/lppl.txt). - -This work has the maintenance status "maintained". The Current Maintainer -of this work is Bogus\l{}aw Jackowski, Piotr Strzelczyk and Piotr Pianowski. - -This work consists of the files listed in this file. - -Below, in three sections required by the GUST Font License, -font names and file names specific for the Latin Modern Math -font are listed. - -NOTE: the names of the directories are not subject to the renaming -restrictions. - -1. Fonts whose names should be changed in derived works as requested - by clause 1 of GUST-FONT-LICENSE.txt - - 1.1 OTF menu names - Latin Modern Math - LatinModernMath-Regular - -2. Files whose names should be changed in derived works as requested - by clause 1 of GUST-FONT-LICENSE.txt - - 2.1 otf/latinmodern-math.otf - - 2.2 doc/MANIFEST-Latin-Modern-Math.txt - doc/README-Latin-Modern-Math.txt - doc/presentation-lmodern_math.pdf - doc/math-test.tex - doc/math-test-context.tex - doc/test-context-latinmodern_math.pdf - doc/test-context-latinmodern_math.tex - doc/test-lualatex-latinmodern_math.pdf - doc/test-lualatex-latinmodern_math.tex - doc/test-xelatex-latinmodern_math.pdf - doc/test-xelatex-latinmodern_math.tex - doc/test-word-tg_latinmodern_math.docx - doc/test-word-tg_latinmodern_math.pdf - -3. Files whose names need not be changed in derived works as requested - by clause 1 of GUST-FONT-LICENSE.txt - - doc/GUST-FONT-LICENSE.txt - doc/INSTALL.txt diff --git a/site/assets/README-Latin-Modern-Math.txt b/site/assets/README-Latin-Modern-Math.txt deleted file mode 100644 index 30c8e602..00000000 --- a/site/assets/README-Latin-Modern-Math.txt +++ /dev/null @@ -1,92 +0,0 @@ -########################################################################### -############ Latin Modern Collection of Fonts ############ -########################################################################### - -Font: Latin Modern Math -Authors: Bogus\l{}aw Jackowski, Piotr Strzelczyk and Piotr Pianowski -Version: 1.959 -Date: 5 IX 2014 - -License: - % Copyright 2012--2014 for the Latin Modern math extensions by B. Jackowski, - % P. Strzelczyk and P. Pianowski (on behalf of TeX Users Groups). - % - % This work can be freely used and distributed under - % the GUST Font License (GFL -- see GUST-FONT-LICENSE.txt) - % which is actually an instance of the LaTeX Project Public License - % (LPPL -- see http://www.latex-project.org/lppl.txt). - % - % This work has the maintenance status "maintained". The Current Maintainer - % of this work is Bogus\l{}aw Jackowski, Piotr Strzelczyk and Piotr Pianowski. - % - % This work consists of the files listed - % in the MANIFEST-Latin-Modern-Math.txt file. - -########################################################################### -############ A BRIEF DESCRIPTION OF THE FONT ############ -########################################################################### - -Latin Modern Math is a math companion for the Latin Modern family -of fonts (see http://www.gust.org.pl/projects/e-foundry/latin-modern) in -the OpenType format. - -The math OTF fonts should contain a special table, MATH, described in the -confidential Microsoft document "The MATH table and OpenType Features -for Math Processing". Moreover, they should contain a broad collection -of special characters (see "Draft Unicode Technical Report #25. -UNICODE SUPPORT FOR MATHEMATICS" by Barbara Beeton, Asmus Freytag, -and Murray Sargent III). In particular, math OTF fonts are expected -to contain the following scripts: a basic serif script (regular, bold, -italic and bold italic), a calligraphic script (regular and bold), -a double-struck script, a fraktur script (regular and bold), a sans-serif -script (regular, bold, oblique and bold oblique), and a monospaced script. - -The basic script is, obviously, Latin Modern. Some scripts, however, -are borrowed from other fonts (the current selection, however, may -be subject to change), belonging, however, to the "TeX circle": - - * the calligraphic and fraktur alphabets are excerpted from the renowned - Euler family (http://en.wikipedia.org/wiki/AMS_Euler); - - * the double struck script is excerpted from Alan Jeffrey's bbold font - (http://www.tug.org/texlive/Contents/live/texmf-dist/doc/latex/bbold/bbold.pdf) - - * the sans serif and monospaced alphabets are excerpted from - the Latin Modern Sans and Latin Modern Mono fonts - (http://www.gust.org.pl/projects/e-foundry/latin-modern); - sans serif bold Greek symbols (required by the already mentioned - "Unicode Technical Report #25") were prepared using D.E. Knuth's - font sources with some manual tuning - -The main math component, that is, the math extension, was programmed -from scratch, with an attempt to retain the visual compatiblility -with the original D.E. Knuth's fonts. In particular, all symbols -(with a few exceptions) appearing in the D.E. Knuth's "canonical" fonts -have the same width (rounded) as the corresponding Knuthian ones. - -Note that the members of all the mentioned alphabets, except -the main roman alphabet, should be considerd symbols, not letters; -symbols are not expected to occur in a text stream; instead, -they are expected to appear lonely, perhaps with some embellishments -like subscripts, superscripts, primes, dots above and below, etc. - -To produce the font, MetaType1 and the FontForge library were used: -the Type1 PostScript font containing all relevant characters was -generated with the MetaType1 engine, and the result was converted -into the OTF format with all the necessary data structures by -a Python script employing the FontForge library. - -Recent changes (ver. 1.958 --> ver. 1.959) comprised -mainly interline settings in OTF tables (HHEA and -OS/2) and the correction of unicode slots assigned to -the contour integrals (glyphs `clockwise contour -integral', u+2232, and `anticlockwise contour -integral', u+2233, used to have swapped slots). - - * * * - -The TeX Gyre Math Project was launched and is supported by -TeX USERS GROUPS (CS TUG, DANTE eV, GUST, NTG, TUG India, TUG, UK TUG). -Hearty thanks to the representatives of these groups and also -to all people who helped with their work, comments, ideas, -remarks, bug reports, objections, hints, consolations, etc. diff --git a/site/assets/STIXTwoMath-Regular.woff2 b/site/assets/STIXTwoMath-Regular.woff2 deleted file mode 100644 index 3b97c9c897e5f52c544eaf4e89ebb15c4f2c1c22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 551908 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%0AR_4GRx4Aqn`o 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

    I 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�qCoH&L_EJ$U1w$NHQ)_Dw34D)w=0c+wo3}d(cY8R4S zlNv^CU|-IT`H-}o2XTF0P<65js{~cuKb>zayOfoUAy@{Sqbli~q|P?K-7gVL_`DQl z;@D7}NzH04^ZIm{YGkWT?(VJQVu7C|z*z(@6Zz?#?nLd`lK$ec_D%Mx>TV@f$Vi@$ zcEc5mQ;(8`)w`3eY(&U*PGX#bs(X(>hmly!->P)FDjPaFGxNHvE;DxPGzG$M-#;h3 z@tuGf-#Pp|yVLsHLNi3V>5TX%uNY7oZDldFSV2S#eRLfn56|(vknIDi zrYFPXXK`t!N%xpz&yK@L>ecbiDxsN<@}# z$OZ*oBO1HtVAd$gAU4EpQ8gVKCSMAu{v<<){~RzpNjAviOVV(Y9FsPV1+lL1HdWJ} zVPvD;HnF-I3&V%;JfM?_h(Dqwh)6zSvH63hr!3MM6llg;hc-a1;DXOx&GwnC%~nJ% z`v8z(h#(Z;0Y=4wEBC2;>oTW9>Ry^_t%8YPw94$3Wb#2+SC+Pjv5|?LeT-D98Xf!E zxvpKUiAe<)YWQP|c!@mDEKD(N7+OBCrLH;P<$B+8zk4wpY^+mK)-(rCuQvCoSaI36 z`hT-QH*S`J0P@fw%OkdO4^2BvPyobAAVoboQ!8XIh$t>!iI2tH%(Bn;81+J8Ii+9o zd!Ud4Ntw{%iy95DAVQD|`mYZqXic~cpkDZ=@FpN$X*Riu%2)@js|yo;I4%`4?qJ8K zdz>O~QKSE8*O()VRw_s^ns%oN1bpFXd-F050=Ruq3iq8tG_A%Y9lV6@cVmsPJqZs8IY8-nv}(YY4({A0JxOmZ;c}Rp80y7u#`w(wiU1kv=smLUCcom2B3+K* zfs<9_kKwM{fR}=HGqDfJFFk>Z7%_|o==rwn>0>0ZiK}cJjNX`%ovC4P#j1j11<=)G z)gko08f)RhbFhD_@94=^zM+2vFjNBUby?aY(S)&DI-`!QF>1}AG~{t2lxwSG(q-Gy zC~F5%+qPg6%qZImJ1B|y5$lcBYVlT;t1>3Ef-!8}Rb#3{kS!Mg&gwd^3ql~mvWb)B z3|#78%T(`ug!R`&ev}`7No6tV5==7%D&?&#l(Qxf5+9wKCm}onD?2C3w?&mEe*Wx5 z>0@#~J0*(ba-Ouw`s^`+B8rzmz?2y3`N!sOqH(7QT7Vb;P*h`&H|g%f&BiADyzZK5 zTq?4hbwPQC2d=Byvskp$gE60cwq<8W?T_Xsb3TeIvXQb@zY$qIAWqKT+0 zid~>=r$Vgh{H`S;h|5=WZ|$pu4HHb8Wi3m$qfA`=o@Jq!?gzxr%f;MSDaV3yF0j}* zs-iN{FC}66+`2Q)2FM%_!%a?W>&8U*LyR|4D6_!7!4_RmA@hioGiuxOjxF8#(XxMp zh3TOgAZ7rB=>UqCMKZ_RX<7G$rcqLTK0ni>iBl4c$qZZQSt-8zrh7PZ*H(QOyqlbr zd!yY1Yk@u>A6C)k`ieVvK|arN?%5#|piul_iC-rj<2Agvwk1eK3&x1DZW45-Lf-yF+W6YjK4_T5~NXb#cf^sgmxwMA; z$wU35h`eujGs1L$l#^x3C?Ux$zt|8c4&`1NF%@^*2C>p&>fs@M>E(>X#8FqpGMpW0 zu_(r9$q@PKi&w%ex1D2r#J72eGSh-GaZlBrIcMEdKv!@s*A}`h0n*UE@Uv$~>=t>; zR6Ot0WHZ!BaVx0Z@=x&${-1s1X)Ze*UHDhzKJd&`tVu$|iPxJq1UajVV_~djO@|N`{XS)%%i={Jr_%+LGrT0yAjFtK;UsQ1l zAW4u{2ou3{)6E-zcOcwMLc~5}&;`7cov616pvrukzwjPyabMgvhp%>10;&-=HeR-Z zvRoe7AO(au0CoR^?*KtSzP}?mY*%lBlj6bz$l_k5V)vtbE$)eFevG7&4)W%$ex?m3 zu3ST+k6#U!MSjGzE{8RbB2Ko%ymKMoD%9WVYN?XRppTwM{9z$Qv*oHni%6ZjAyT?9 zmJ-;U83Uy65gz+V2{ac%)^X=Rv{j2dXmds-wIA(1I~eQeNZcCcL4+;PL4`DLIN1+BH95@o&i zKpWTjTEZkb%qRLxPz?|&U79}bf88s03y7SmQBa%u#i$LTuCHxsV}6P>(9n~ zR-876I*2x(D9C3Hgw5d~i15%=M4EJVWH@PXS{}IskT8WtX3E;>fUQX;7H$x&6JN>k zM>tN#FMt*NQO=gPMvqgd-4-*rB_fv{G=*Ub%n?C;KeM*@5<%iw!_#x7z3c;2E7-;=o}~FWMfop}I-Y}w=20u|uYBnPM43NLPm0M%^m=?) z;-ar&iMXNJ=)|SD1KU~r3xjmIckEF#998F_=h(K)rrz zY=_`4EHf@D9)o3cT(EuwX<-hrt0CR$aQD<4oS>od-B%OFRRpIh&CQo#U9fQye+UmP zeh8GP8eQ?yx1v;kH_=pPjf*!OGmFCNk1>u1|E0~i3P1kY$RlIQ{{YXG?-HHA5Jg)b zq&R;`W&N=~C?#2@;lz_4SxD*lxvdT?IJzW5Xa7*S*WlZh42(`aY_1{f-P;+2xB~W4czgo-b5qkFS>^OWISRn__3zXKZ~s36|-=2 z=Wh&d{(Y3D;{3zl@<_m$0$_4^J34Yj{QJfC<95QDKK;sS-2IVg+n1Q8Zrp z2h+|tyQX)cT83Z}$`8TCMX#0aSlXt6!?VQ5LyL}>#94EK-lopOD?I4XXVCv46!^8| z(vSDIa<71wi*SfR!~#F`C-ApoERYSzN?CNSg#$|9{+Y)&5a^93QKMzf0+z9`>z@uYD~<1os8PHTdPjMM!#ysLZE-j%I< zHm`^?Qz6(#uYlGD9X>f&f>x4k7Yo2;0_Oox*8D{B;hM$LlXe|I;b92X=Q`InMO_TZ4xw~nxp4Hocxpt zwuD3A7NVaJc!!`_w1qDHMV9G5t}!+xBJm*IpQ>* z9cz#*!&$V5oJau&2~t#cLq6JYTk|9x$lvbzX!|4B_OZb5#UKXXJ837tC2tHu2VXRp z&oN!=r>dd>x5573g0o$qnvROgZgsyF7tf*u*BLK@YXwIP9R0SYa-;2Z&0UD;l&ByT z<3;T5yy?{vEvQ|$`T3p88bULQkHdN`01m?AQ-E($;tgk59f#tHNKMFpLJ*d-_dQiz zL6ULeg*p92_K;oXK%J)KM3~gGFP*<5KF8=VTrv zLf@d}?r54WyMfjy8_FnkP#1Fo*@Qa3PSwBJY%yC^J~MXhF<|w`f{X;D?Cay_`~1zb zOKuBPJ%Ei-;ZvCIS800@Va7lhNmXYt20%{Bdd|bfkBN3Oq^d3G-iE!Jpi;zr^*P-LE`zy?1`9iZ4@1sB4b2I*I<3$kzWh9n2jcoX|Xzys0_I)96W^O z^IT~y{<;5DSbW=aL#ZS-?=niDjwvHBM25<&)4f5sVQ3YCSnlBka+TS(4rk3T(&>M} z-2bfjSWB>z{(+$q$Y`P`dYQ%lVB(_SzkFqGN!yuctbLU0+p)xf{>y><0i;OKgw*Y| zDz%#pvMJb-O;_xIG3K4w=S#CvjMj^$evwn2O?1DLh$GK^o;9E6OC9pRkX&hkQ-hhl z5vyhha8jN*pOr$L1nhoslwK?y^z>90zxJS_zi&NBG%R@i@UkL8caSPLa;-H7jvi94 z50NWmadeW84B>dD1dl}Vz>5FW2A0`CK2CQuN`-uq?byvn1Q<(!zjVSl$oMMrCmIL) zHGq{TnXW{w=$43C8*t9}&jlu0;P;1#U##?7i1?eW68j!W8;g%olp~vr6c9K#6*-1- z+q$>R#oO?c<;d$1JjdZP)~E&u1deB}sESbWLx%`{Yc3RdzI4}PH_3@ycR)g;XW10u zc?%3ReDm%Yr2+#lK7@?{no-bu|M2S_Ht^3cu2T?i0tzqe1l#XH^L)Xs-jyk_mVQqi zH_P; zLZg52-J;zQ6G4>(jcZ395HS_s`bI=7Na&$JNTvp$Z57*asg=?T%$CDEG0LU+*3YdV*q`~DtyN_^YIryXODeFT}v_9B`{$}hSul}05O@%@uK!0 z=~qTDvsHZE%Z7wMnM4kw%V}P{STNHNNQ<4p3j%W5UmFmBc@ zp8~c(C@!J+09e}Zu{nVAm%rE9CZqbY!gQ-m-3&bL9H|N53XD(1pLHsZ@+gGa2Lp#m zPhNC=`$>=wu%{lMQK@%YU^Ho5Fm)LDop5NZB~H+f3g_)i<=t9NbN1vEQ3mMsE7WRt zC=MvpQsb{@w&;%aZaGJ<5OLohH+qa9la7r2(h3rc004kGd`1IAc@du6X(XN8e^i@h zX`p>|WjCmRt)A>sLqY$m-`y?Im_sJ<+o>d(qx^{Nw74iK@1&WV19A%llE)tNKDANQwTY^jUUiVfpqt48`stN zD>!1OXq=-*^0TE2IGJ#I4n4#kh=LX9?a+Vabm04Q`i}@ywiHsG;}=fjkaNaR29J8{ zC}<#lapDMX(A%uDQkK64zEg?Npz?8@s7! z+pMOpcyHPE?8;hUg7%w}`kI#vNb<3#iasYK(_&`8*n}773)}VJZokJ#(2>JnPShA7 z-c-?#49|Ypi;<8Y_IQYnvzm60Ope~ZX;O+s_S$?b{SH3XrkzP0xjC8^bLedmjzt_)g1WqblMe#Sx-1{r*sa}eqqg%Aq z$j5_)=9VI(fbZMCH;57S0LcRH&QS)kCvJJ+D%+X5RB@%@%Q(9P(ML7ctY_!)Y$aew z{^yrV43RC?a|Jm8umkdV6;Y8Tsj{XBUS|Xe0U_Rnk75=R;!+{(3$iWLPAUW-Dg@zW zOC=DpfLmtIV;`xexS@CrTyuabiKP5yCH@g|dZD(=o>~8PP3L8C44$L8rx1NvR7f`T z&J8DxzRFl{ZPT)+7rzUo$5551p}RYtOh!IdkhSPzP{4L^@JmjEW(+>P!&k&LY2nl9AQY?fv?%)i-$%Dc`vSrDcn}Qw38*r8c)p8;4BOv z1W3ju7J0H1-5?`%pvV@|5BB=}A;Xm+;6VLHrna!5uK2%6oE(Ex3uo_)};|?0=zn9TI zL7f%H84|B~vz6;r@CqzWYyyEu5^VS;E|SA_M246ypJZfFa>aT=-8A93(Pp*?wZvhJ zEJbqrD)45L@EzLB!o|Q+l0JUY8DG#gOs$U}^=I4+&ci}Kyc+b=e}ca8Eu;M~o6MXB z2HkQATOo0y=U^q0-@MJ%xwp}n9R*`?szddAM~$nvDZJS@#DS-EC3|vs!R(2S5p!+F zr#5&BCzOH!S7Z_tG=v{cKv7c&1!j~-Kkm~o0H4L#5MRn@dV$3tR@xj5?4^O0aFXrO z6=K`m@Z^~!J0h50i=eM-MS#uZG^tlHqFB5p?5zK`vJIeP9T>c_!G?PL3T^V|rZfI*%j!ybq9u20~Q z@o8q}x+Y=jlx%({4no|t8`|U{g^d4L3C|R{P^qF`VJClT{|P!sfwFO0V>V*VI>WMz z&GbKnqo9VxFq(@sjHz6r{ujNF6i2I9fk_vyZ-6<{!2EVl%=oDHztR4i3`qr`!X8yF znR68!+lrL3fz%GyA;lb!-~cz^4t&H)k4A+2MN2(7JTv(Qct3{%l`i|acBWT1~!K=@|EbdAkIgv(V*RRVtj)c_2uoK+^Q8A_jhBDEEpPw)-si5*`H_(mE~Y#g<nTcE)lZC zKFfqIL^CeTMf!$pA@I6@T|C^aeSwAn_U1jkm;U<1|C{Z#jAwVX5d9u31$^Q)O~Jd= zpXA+E=l2x~u;cHJ#QhEyOku29#fROsVtK?i zA0r@_lC6L_5*GVn{VmSYAz;l2`3dG3a7S~IS!<%-(pZZa9Zb=HlRanl6QqI&ANc#C z*rfdpyFg72XjVp$~f;J1gDt49r$My=KA(;rdUbjXa z7eW8^TYhD64C2{Xv>zh(*(agPNi6A%pa(%)-T>!RR|^79Dfv3Y8bf}+2Fi7FmQyVy zz-N~cXS5(7V(a>6+T55+xMd9$ASF82(Pl=4`0}U0Cs#%-rYx6+RZ+iiI>8)+(^-+K|l9eG>{@s5dY^O+cJz?fg7SW`> zFqbgZuZNa2=t~$qcJtc(>EDNZ=$*^993-5V{Hp2HT4YwodC3CYM;ruC8g&Zg1(c0 zreB872_WITQh3G-Wfh!XO*sIGi6ZGj0ZlqR31t<@+rPbk)f~OhPs6}^0mXJ-uV_4} zP+-NT(b+kKwH~YiuzopR3uol6f6GV&eIH~X9*bR8h$OIVYfHw8bkHh}ISPK%4g9|_ zsj|qsslZu|B@6Ws2EqMLg@VzqE`^{(S2YuvBoJk(X+F)7f z&2!VpABTW^|8Pa4a3fFPyN%)%#x)(Jv>Rs}xndxMIGSd00KwHGKAKhKMs`J9xfz0N zkH4+!UHI-L)hbPq^#qsBpe(64<__+ro(y;dg8+a9&~Fgr==jQ5Cb|m6KRygN!p^GX z`bk|jukSM>Ikl7&i(4{-4gIXM<-c@Q$NogOXM3D(naEn_K5iXSQHijT1yu5Cgb(=9aT9h4Aj%b|5 zX3X)&eSx4#yA|U|r6a?to*@j@BoSoD5$6&0n}QSH+D}Z~?5lT?a1Ky_PjCHXN(lWz zZX+vrmlbd@F0Ls?S#tq%8nH;vao~1pMo!lN>t;MroP-Fu*>qw0JdG%@AVaY)Pr+<{ zZrH9>oLG*QBn`)Ag_FPzG0hOf(J}~ysK(ycXelqV6&22cHgiX^<0eJh)p0iI=nfZV zzUcv^Pf}(&)ktrLrplla%QG*g3}GSp*_X+3>f9>I0aDbewS6?*s(%LwwYL!nu!Z;X zuid60Fdy#E;HiJWc512FdjYtaI`L{fPuyb_BX9i@?Kw5YzUL9F$Djaq-*#cL;Cx0@ z2yNB(7bp}5Y8S3cvcMrwvl9H~CI7TN(`T-CLLVYdZ2;pHG^Gzq1b~1R%JHY^>2q{i zdv+CXij542R>qL-jRd8>+w|DSXA%ehFYX(hWx(C|eW{~pZz3->`{feQ?mP#l8XRtz zk<1^UhcAe!GJ%e`b_C-_=lI(jojVvbTq&WchYMtcdzjCG)*;F-H_z4d>e$B$W7HCA^-gxjsj_i#@nkLL=JdN``% zYA#vaaOygp8Kk?#PoXV_LtY4l0;QBn zQywu$=?hn0X=u9J+&N`KDec5)*5wl=9R07@fT} z8+97o;tl)-2q**Z*CNox{t?mMQ)5OWaWMLe*egYrd-KEUt>MmNGs9% zQ;OL#zoHw^Nn*${E4!^rTc7|140m@6)i~<+3;V_?l0szSt!1wi3(UE~J*N5qte&db ztj;Q>!27}nz@rj)%z@XrqT;v>!K@!8U#kDg4uEmsP2HR9u3HiP&c!BFgDMg6<*&bM z*`2>(06tG5gjVp-x?8-C@n)Z}bfo-5#8YBDFjI1KH$^#v;B|?-QkwzxH(?J4#JC4b z?nkcdz>zOiM(0#>W^SIin5Rcjt=w{bo5t zoiu|@BAl0ctS)_dD{R=g*o3Q5ofk;H!!iHg47PcN7(M3-cbgi5ux6HKvpUnI1QW_X zcyIej!LfNY6$T!rMvo87t}FWml>lLG?5SDoZ{FH^H4^j{JOa9dO%U;1_rW>nzW~VV z@bbuRv>HRz`yeUIl@@^dDkShmuzOJTAa-pa=|KsHI=|p}E|^Tf;E)1P9NNS+VnA_i zkSh-0b4Vb*ib%&G;TM#r?gbXc<^Oeww>#{N!0h_DqH8FOAC5c{^D?r+Buj-;Oxh<0|%ykKO>$FlY)*sQd6Mf?R2zlaA zKK}7YZT(?M>(~tIEU;^a+=zL$yV?7>NkyaZfkP_?Gip!P7UX|UF&Ap$4$}+iwVyfx z1MZ6O0)+KPx+j>TGlkvjQe}7^UmlAG(cE)+5ujKf@Y@hsjFKDR{+l44SubL$vqw6A z5|I~Bs8fIeu17+Dt_NPz7*cP9vvyOuY;~Lxqyz>#wlOae_>N-eGyykb1&}RD^iM0| z(>vAD7no;0k`Hm4e@Tw@^|sWCFCxER7`}ledkwhV6blzVE_)WjNaM}s*@l7%Ig*a> z&E6yyVeL_u7c`XxjExSSF#nAS2bq-5;G7ulRU^Bz6wYa|)aGpEfZz5HQ*$>szShHs zA9)1*-Q9fLMFoV2im7cR8@}L{I(5iXzTr0fqkLoztIi%%^(+NS6Tivb5T&?DVIi$o z`0e4ob23nNfG(>duykyB;!BY(OyQpICjZttt~tyJuEyfj>VOjyV3zw>a~nAz(?1Y0{Z6TkhloY1tuNU8Rd34Ntx zZrNUyqzt39o$Y`$-nTAghMEk1=+c%1SARI`kSbFhs4hX?F3xK7F{r(*j!fuBXwqo5sGuZS1jpfE6)9h$(<(m*g(_*`vkHpaQd2qApCkX?tn9F- z{?1-hB)#$?j4Aal1(w;e#Pdpnv z!{PkY2;JNSZ4Y!ciC>Zj+F>6S>;;o}{oxi&G#bscf>zPvbZ&t}1EJMv=oZ%|JV`9e z6N60q+hd5ryHFvVo?zXl`m*ko!!)4N6pJOoklnGeOI3+xRDt*X*D3rpMh zLTjwxmr1MMV&N(x$sF^_qvS+x;}{Kk9DV`A@Q8{7pFEoyBk#K=WvhBCglFo(rT>{& zITncVEDMts5hQdb08)hF^T=_bAsS%DvsaUBdIdQL+$*Bx7?`!+I&t9ytTC+N(_l&k zAF(Ik7h&azGN8-;O;%Ar0s&uO4n-54QLl~#?F%97>zaViT*ouYZ2`DscnGv)xo(Za zE){`N12Q`qIP)Tx^mxn><)p1uc+mE$UGn%`Pt^_IZ~8YP zBH%;{rOYKQXZCx(!+$q4G@GOmKunFS)@T6<9lG|DL z^YRQJ{@yxzHn2}2gR}_! zaq8)GzT!I8eT~+eHe7*u>HWno$VUu85~rWfDILQjzhj%8yic1!k0}m7oNj#=F!#K* z?5Us-INmY$!*3LcPi?GSy9LUFrKmVQvTs9S#J5siCyln1fYgoztH1*LzjE7$ z-gKQZF>-41m(3um$A8mMU#&#iyz9U~4=A(%!!A`k)Ia^nha!4Lfjoky8>0N3x?NwL z5I1cLp<=I3_-}Zg8Fpv^TSt7dK)@8}<`v0X0c8PJX!N(#UmTQOeT-J3E|3V^9u3DBy5!$OmCjG65p zv05q6f4Xn12lRvM_1{EI5fn=VcZWhJ1fs_2^Tw83LdKX1(@f|uu!p?aA~2aHC&IML zw`H>yM+X`WxlE^w5| z9+@Sn8t%H1up`QiXzuA{D8538QL;fr(5EHROCFcg=>qvy(UwCw1C~aF zDx4H&9r4`|FeNIJpeCTCQ%DR`Xu0cr{=O%d-WDk1Bf9qspK2>axf1k75B$%+&G$25 z+Bxmh^vFq4a4TG-xJj=^BU#liO6eHlo2~52hvsWI_)fO<3{yE=G`Sl|6uwCXR=)vF( z|MiC{R&dAKhq*>${>7ApC+~$5{ZWx$u<>e_p>L=I&D3F1PNrV%qTLUY=)nzRY_AIqUQqYCh5X+>Cup*=>(#Hw9w;q$c zoMck;@AyLy{e3Ap!1y63pDYXatH3C~WZ75JSlo-4u`PO?IW4$FuUx~TUwBB2ke;jj z%NK;UchaasfGUcKU<0=FkDvBj*y@-dAn9WY8-=3Zd=X1cq&x=@QLHUkRu!YPhm%uu zdGpqHcFRMSU^^E+4}#Ufq8ma7uS`4bw%aQ~K)|wgN87eiL~#osQJ3#! zLDs)=OLi^e31g+h>2?B9rhnnRqTRt0!IcD!I)Y-rVk+MB%^<}=j$G)GU(C4!LCTA;nfdG-XhztVq6p>NauS z>H3?(iB3$77NplASetPvP9QR*#(z(3TyL$d#J8$QVE&*noCx|dl(gmF00&1fAwVf8 z*WV{f5fFA8)kk$=bl$ISEhHm8^EiH5aFO3`*3FT0%9t?& z)KuR@=2zDN*)aC=q}AM4;-}0EDa~R{09doHJ+XcI5+T&V$LZA7M8AUBCsi9{3Mp*K zv99LI;c8~=_k@?5M}}o&UN47!L8D&8ZXHYh#S}p7$c5#6_QzL=FaTxis9!?XKRqzR z5k$Bnz6jO)3E9&l=uZm4oS3SA!N{L8;ss`m!qb`oXBv9smvY^TFx5 zXD+O<5P(!CH6ri6*(fZ0q@}ZC!6>ASq6XKRsH9filbcRsY zT#x+{Fuvvi^XpO088MZhb4Xr|VBxNMD+e{|Be_Y2oiLxi%=V1RY+)qf%;MWK56tSP`N3Ctnz3k0$LrPU@uMouf2OjFvGIW<{@) z>jgKT?dB81*7vE+?VfzCvW3zckM=VVH(|xAPS@$g3Ldhg<=6^56ZbAB)?CO*s>3aq zW4VbsU@1PJfQSCUsrR=&t+(qhw{a0Z5T)}aeK5fA`)JYIus~PDqwRC;g=WM=n3$iq zi6Fcz;(iZXEw)m`t`Fd29!(Xdlhn5(4ld`{-Liwim-2*mszaAzByX3&WJY)Pr|=>w zGuzDDd#ho*fiemV)vxfHiJ)f73bfGE*nx_*UDPb~3(%kNK=td%W||dz>=u3ee&`lK zKecvRqj_7}(&a#%0#uPoD9Ms_!2Guvn4XkJO_X77C-#hCDanYF299c{$~zga=3bwW z8QKb$K7Ad5wiZxjS?FoTIR+Em3WNCTf4=+CDe(WWimZG+2};aidld1gkL!t#9vO;& zX9%pQN?IhS2x0Wa^5MgG3Du1v8DYc^yRokXCF-ei$->HSc<^fhrE|7%dESAg{T?7wrf(@P)oxD;l1JI=o$F_Px8k-;nv!?d`P;#h`+M=X6v*U5SF{}Qh#bb!J zaiJa%rU~R|=+?b`Mpv_L^x2qFbm1&E&2zD5SI@)v0>%QMc>Vm;Cke`d(oe+6w%sS` zkoZQ_wxE=z3-3p&++E|im<&3idf0pS&Iyj9?7EuroO|v5#b|$E^s#@d9*_-9*{u1G zII4Z_9i4{A-YEdmrrXyoemj`xfc0y?E!lFKUi~i;Jy$DwWFx$SFFXU103rFluPHCq z@3h*MjB8zCkDo;!c=za{h~ri3Nn)oiBpa}}M|9#p1Q()fIIj^qmeA+u;;Veeo$m;? zm9z5+53$Y=llKYGzgWw*BO6>;I164d)su^UUt)@P)X!_xmINZq)#|x#Q0y ztHa?YJL<#r-;a1nZ!$N7|7w`s)`b5!goIG(B%z-?K#46EGV~NNdoyRs%_%eOlWv`N zpJU)rkf>67W8jLo$`>FXc-js-Rw1Cm5qXe(g&lqAS_RD+5DJ_D`cZqO!d@{ zmg}EVN=8JY`s&}GUU5%H&K6o<_Br-__z1GO+4skUoP;_71u&n{Q2jpA6E22Y7$w>P z^cqOn3Y^&uMQ5j7KW(wj$Ys4k@+jEQXe;FFYZ~4RoU9(wOvvG-uX?4mN8ZZ_d}Ye4 zi>K$NTK;hnI}E326Wxh{`q9IbSaty)+ev_syUbzFF0uAAbek*-gZhB^f6!DPZSq(Fu%RY6j@6yR!b{Bl-5W6RwCDHK**Wu4c0JO&{iYZJo&E{1 zzaeYR;uu2H-Q%hRAm-=kIW&FI0W%z*kY4fb#P(lP#+~9~ydY*~^AZuE=~Jlh(?5G$ zn$ckuLf??lA2BhoBEe^J6DpRp>h?oH`wjNzYQ>-eyvqLVAtmaHr9YDlL<3AA+oFpB zE>cs?W@f&q>Z%|7>NjT{jtchzJ=xsEb1U*iay&dHx)U83&P1?bpa~8p3TH*k%w97`Dj=N1%5VV zPRk`JeEu{ORCy`$LW|tX#lxD3JVhTSqEPiKJNty!xOq}44l!Y#)~LzYAzzEXNpN)~ zb4kRep#McWP?B%lKs=W&~vTA!;tetoRis+$7BG)#6uRQLxf9gM5Zo46LU;3t3PR(slQGGvcC0+3YpPI_- z3xj*-Nau0IK$Qu$e5 z$zEv;??`d^W!v8FsQvOWiuc6o_FlM=OZR3HI}UAA=UDu$$o%)c%Lw`>%dDgB-SoQB z>~Q{$@G2MnX+RU7_6>)U6U{U|CR$`@3(;Ks)M!0Xz@fgFReZnO=CylORQL;~KlYHG zdi#1#N6lcsN342}9(}T#hy!jCJiL(zxAiI12F*0gO;F{Haf^Jk^K~2C0m1Y$~Z_Et>Oy2w7etl8cxR5V-&j#<=XnBk@H_y(aDhKzg z+rKz4k-3>-ef!|hPBObLqq&47Cd=%QyvNu)l)Jm;tw4pwX*7WF*W80aeCd%OEn}9G zYw6+NSlAF%8VO)f4ExKtxIKen_clrlZHI~U>fv_%oSa--V{49lu${8&Y`T96Ew>uv z(?R~3vF&DmHN$~boI{!d>Z5)byD_dIJ8cv`b$;y&S{P`J#+2e&rM);1vtsHkJ@vqA zgyIY(_e9d$+TeWo51dWJ5rkUO7UljSc6(Dh}M6$vLvaMrF8z)(EtPrFec!!{$dqZcL|>-@9o8 zt4e3;dQ#QQkl0&GKf9cT+1x6a9gy`s5)$%W z>N(Q9nN0jcNJTJ?rFXGD*570sY>iRvOP8lOMXVj(vD;$vOnJD-DS*D~%Qp)RPMB_+ z8^7p)FCRLMIdZ<-nIK0Fms$@(OdW%c8VOEk)|rd3(pTnl zceL$$vP?p`(i7hGmG-xHjkW8|7prN^A+W{l_e!B%^1VW9sdb5>`1xS}(>F=3$LR`S zrTL%dCDrSQvMVGD0Uy7br<~`mP3!_BH+J$@GA^;rW)+)9ChjHu5T!}(aF! zup(Y$=t`s%;!Q$;&jB&Z!Xd^=?UM9bW)J}Y*p2>R|Vbp0|Sm^@4X6`165{C?*qL3z!^<|cr|fLcA8afIOq`tluN&}Tg-=EOEGcirnB zRX#S&a8KXk9}r5yac0-L_PrYf5_-Js!s^e$qX=HE5Ypv+%xXUs(f$BSYF5jAakIE~ zGPAy0O^eF90NZ>al~jGWTg(iT7E{P1jn%k3K?hJ?cq!c|m|^d$d+?shQ>p*&@&$h|3st#r&9t%ZoCBVTj7`cV$;s15n6$F*W6%nG=<+ zDLajt0kcId77NUBObub|$Tpihe$pgyDqT>82@f6VCf`&+nflt`P=y{mGHIkLqg*00 zsnT)45Ism2qLk98yCEvbQ_l|upv2ZIRLyRZB2l-S#>FabP5`Jf_jsaO1ju=@U`4k> z1&*6GyZurtT5|A(@LADzVqhTaO6zl9)a>R`?iG_|bY&i}aw&QmeC3%N79|LmjUGBo z7VoqJ^9RlheIzjN0Le5|3U1RDziz+FMn)CLQlgYZAm>#LxdA>ZiU1e9#iu7NKqDs1 zr*3CVe{dgnKOmfKiz$`+g;qA-E!BN*N<9-{7@5Ha!@c(DtpHVjw= zfFi{O#}ESPw^&9k9|$A+tr_ONmJA}CMjztUK9FzTT(A!@$2kvjb%MyWje7X7x2MKk z$kk;Q{20vF+F+(_V&+yimVw4=Is)lPlu{`=w;LhnUX6>g=Bk-Nrnr@Zr6Zlm&U_9S zjGrj+?Fno;BebNBlPaoz9py1H)DSO3r6Kn*OS=dbSgv)MtG(e9lr=z4ho}Xg%8l!p z!eH3x&BgS9MY~4@rkI;OpXIh!4#Z*tU#FkBjomZC&JRzBJ|8}XxjhsE!vw#1T-|r! z+)#$uWCDuSV{6B9dxE{8o{&Z|UV1U-k!eZjN^=vk!`K`Jp(tSA++s8+;6VSJin7MV zWMW3A=2QzHSFkN8324jKoF;(+$-nw4eSDD+hxt_F^N$<)*-`S>h<1X`g4RTiu4pHA z2SJ`~l_s)2)?_wd9DO3b^9g%_n22wu`>xMqb540*t4Nkjpo~kPRF=kh?!^ zOT;QPd8pBl^*{b3L8&CLL}p3SYp#M%+KW z1sx#bc+>V+EP4CO$NCoxQrvn}8sS4Ct-|=DFICPKcT+rD-u=qkN1v3SM%=?->3iGe zjv#;f%THU*$u=2B5=u$8za9YdC_ZQef5HZP#0Y2hfI~ z%9e>_opj`4{imr#h55S2ePO`)#YFK1BEF(R5XPD7`#xcgT6lUsBQ3VA`y7|E{(O`O zH|&xk)3$UA=4e%A!31MRKwfvhBOd@;P~F-U472DEEo3BWV0G5P9VBn`cqUcDR^I`-46w)FW9|WZ$l`LM^pI?2 z;Yt|45P7jx6*$@iNOrLAi8yx`@OtRwEc56(bzHO?EN|DiX_#f79mHt%9B>~y?;-7N z4xJGy@r$b?s(EtNA+WK9iH>Kyk9IIL7f_*NeOi9r(<-+3o3qe4+cfYm-yD8kg7G4v zf?VG*djMcl00F;c7HtBKHJ7mCXQ)2V`{mvrq%Z7Zfm{snW^Q>z zLh>6sA~Mk5;gf-8OO!wOqsxt>9(2!!{iIllnmuyr7n`SCKIYCbRsA{OQe$ZE^)hF= z=y>IoAe_Nnf?N#5ozND%q=FdlLTyo+>m0yJ1mEPeJwzu=mYLh1K%}u8=`0{-dA8e` z40IfNHl)L=>W3OWI;yoq=KknhJPY(fVC^rtcs%GeH~-!jfSz?oy1v=X!H`+e-gJG* z1F0HD2Sv#G)RDy!hYI}}XdzpS5sgDN2x&x{d_QwLC}Y6R`uiiDLeT?-g3Khu7ZIeO#q-k9We2e z)))ug)lJ2Ww*h^G=+8$f4{61Fu!06g32B;v=o|Y5lCGIayuHy?|8@|p1t*78p3Xv~ zEV%mim^m%%E#*Ys%sY+V1snW*+el^JCO{>jU0UOAle2*#Bc@hVkicMp>8^!g#>4tp zOeN|j%~#jQGQzpi?*c*2+kz@t^x=3cn2hEyu{cWl;Xp9}K|sF02M8WM!!;!PTLBnx zO_8NITN=|0$IsDNV#$Clz6pBCUR<5+bB~SM)*ntCG9BOBpDR7Xr4-!~78`)uRns~> zCU_Y<5fZKoesutVmSu7AT(e`R)*>o^wjZX)G@1G^NHiZ)U z7DBw;EFr7qMn0L=j@MQ^9klxTYbeZ?Z#o2)XpDvqXs`Z48`Ro&C@h;U&n$nw?>1Gn z@f&Z(7DR}&Ybs<1wFZ>{l2h%a`~~}=kQYoRJslP6p3zJeTm_DNk}EJm#Q;RVOgY*4F!+ylvGTK7N2F`0QGH3E45uk0Y}6yacD z>z1Cj9#VF-j*nsfF;Mw8870F1ucEWHndJSy9PBCQTY&9x>cSa5kg{OAQQY1gLnnvY z?(B!cOh5jQ0(3V(oTp)E$Lm9m+AGaqWCMuf?-51=H5?kylh;1NeKF40K60CKp!um(-3^pI}6`{3=|EEj@nB~7DJpC)-`Zl3J2QJGHK5`~p9C7B&l+KZT|1yh7ian)*u z3S5zyIk?UD7m3)HLzWZ{oX>{(ndj=^nmcLXKQH5t-kHn*5I=>)IM&!pb!uh(XgL|8 zv;?)`7q~j(GD`7d;w*L6a2?^FnynXDt#xC`ozo+7Ahq%??Yg1wj*~yk1stKIpS6zJ zUDqy(zb+q&8GxN<#Sn8!CDt|=B-pr-?GDbSdv`pUJS?6ks7C+P`<~jwHv#)=4VyJ_ z=iMtFjp5Y(DzV_uGWzSXQ0|bhek(6J&umjl#dHRxKh%+rDuHQZiE|w*bWj>2u zfzH3L6v%ZlKfP6~9r*Jk`tMjQllt6@hP!`FiMb{DJn#`mBl0sgb6l+en^=F!?yAec zXnQa~BkyhMjDq-EH~sDEJCx9nf09_~Ncn>T&c-}M1{ja9D!@ZQGa-CfP7RbfpCN29 zvHQG`=Q|If+v?4PndN&Ze4IJcpsiW?IJg3gLOpkX2ABt;!p$s6NdtMq+Duw!WtAi_ zmfCi~p+68(r;s!vV!xPOzWYfc?TJdwb{FZwj6?INWKO{DF=azdzQiz8e@NC-VUo4l3>ox4HqzS`w#tD!bk^xPPH%`r3QbKYVI)Gk7psG{jYspSB4%snEECII5 zowN|kr*Zs2NlOqq0=MF*;1!Re0~AGlB}7G*x`<69_E&jX+^C^Mg#2QFZ~MNz?BAdh z#uAlVg_r0E)CL*p>#YV>|34U@Hc~HbFl1v0Boc}Lys3mKWg?A_teiZi4%)(ARK!$L zh0$g;!=#>HzdA*71^|?)Cro7%6=R!+dQz9l>`{w6l*KL@WMPZJ?f1C+9zTAXWpBO8 zKCOS3*W6^aJ1MdrdF&de6_Up|vI(*Vg+}xZ*^p;bv*IroOGruRffl%9u0daC&CPSJ zIrdudr+@5csdX;14P+YZhEqkCcb~>29~IWZH^Qu*zyl6;r^#Py8;&{*LLHu_9IP~Y z12$t}sFKmYL0`wGqpn%Tvmh4cWnFZ1bZunSw;rVxCf9aNNNQNkLm8VR#de!a=6HC~ zr_}6N>E|%8KE!D>^91LkJ2L;6vUfcwcYmvf>f$A?mxI0+p=wpIh8uGW6*Fj=^n!)45&BD@bu}5nqf+xr%)@!rhjiU4||Xv5~djk5r0*^ZV3n z5dDlnt3p`nnm><{krH4=v7RgBkV5LB{;1|H7*!xDVoJyAgQLP4`Pd!*d+m567n7x^ zU3I43uhDZxr&(j;%kfQnK;gF(HI}XeWtlAl)7R>zy|N6<-yAgp_oss<=NE5`ED~0N z32wphgpaZe1m|_0-<#5s@}K?gu-xy&s$*QO2@d(5SQ)I6<~3^XENY0Tc%#<7J)=Co z>gr7p3o2#h$k8#;KmpNYd@x{DjCQKb$mWi5d{P?>bc*?>ItUSr+pJSl|0E9Madg^9a0KAJ^yO;kVxIm0?a zApowd0}}ki-5n3!Q2kRd+`3j>m0JnaAbh|igZ@NJ`|7O$sx8I}18VvGJB1q7gp)FJ zyP_t{Odm4Af^Sj5nF(;4-ekhNE+s|Em|!{)a9mbi&LafKsf<*pDqePL35KgY8Mj*2 zJLLK5r!P?7vr|J?Z$e(E7S{VEsqg{>h`Isj0k9kJgUb?q?(vbnt4~>9`EGh=m4d!0 z)Ta$+&fooFwYo)4R6>s7YtGyCa<$s$rieX=8~^c<-p1!F){|qgQ9%WbBTF*E z*A7#-kZm2@cv&G0tM#nS`@|HE0+8^|@?ySp|K2Q9x_nb#n&lb%M80lTa)tj(l=QtL zFIWAZP#l(ujdQY|ZWjJ|Co9PRpvOd+B$RuKg@W>X`G~39FBkDQC4=t3r;I3CW)Ej6 za*qX?$xJ?$Xy#^?)x(*JhyypE%P41uwKzHd`t^$P>o@0?PH557X>$#qU0#ZNyEJvB zd!9^|Um%|@)7E8*k0JGgY|nMTA5($BF~Qa&QjmtRh5IByQP-eUcD!%{=cIku1M;tI z-mwGW2JTnTLBpe3>SB{RfCm5Zf15aQ7o*XBk50GT16n`XQe-Mds@v1g5wqs6Zpca! z;Mfc zx_pihjQo2V&)8&)CEJLeDN z#xpv|y*st@aFNJ3#W=3LG30}+S%Lo`9%(!+t}qGrY~Nd6VP7;te_$>~?Y6gvP_fkp z$aXy2BJ9TPEESldM+lmODh>s5>8+KKahFq5Nv4n0fq_d=-ULW8h#xjNeix~}EG?Yhk2B7E2H3C9upz#vr9xpHHVF~= z^p`8fD4&6T_K|o$`=a7$PW8qAE7TS`M)(W|{9T|8oidz`c@NnWM zaunNOW6E6{n;RCy9|(*t6~z`EjRywvXge^9vlTq{-J`Fx{DTUdryW2NRJ`2(cl$~0 zLi|ZJwPD-&Q=h4}ef++oN3F9LSq`_w1;YP!;Mr?-e}aQ^W?*_sTy~2aA5f1h#Mt#y z0#@-d-33x?SL6Iwr*3BeJoX>Z6;K^82J@OP1aq0q`6mN9K{Tx!isvNLiL3(AuKZf< zw5s%7d;rk^xy086y`MfK!%O&LyNUr)SDaMkyS;w6v zAE#w56-fzl%E)G{Fd*^TJay5Vyuz7Bffzhg*l#*A<9+ z`|sQSTCI(sYXqxUsxA9k8qwW}i5~{U=TA*9K%M!-ZaolyV?OG43hGNd7JDcCd%H+wsY@6lQDL!An@&vMeJug75dq`r}WS`v@h@K<7?oF8$t151`ME1y`~* zMuB)U>v)4(5|1s9&3V9RbLZqGx~P*`EMfCDKq-c7BFn+VwHST62FOFc;{v8x%%*!F z0Nmbr$6n}7vRfAuKIQ{S$P9}1akg87EIcEbwXDWqjQkSK+6;b3v zl%ziu7h*3HN&bbZnbA%RgWlx{e4FC zoHTS6jgF9TQhD;9rp+6*xuV^)ubT5@Vvhro3l!aNCW#%gvMl7B(y~UPuo^^x?^^*_ z5{Q`b*cV_gFBslXu=6j?UR1{>)97>`TgjtGVx5$%iy1@teadJ7#|PjDE<6%(Qn1zl z1Nj5WvLwftK4d=)vs`FB=m;JiDLzWze)tMu$ReoqfR$W0Q6c5HJ*OY#+0`w0L!X_B zTD~!tvRcJ&k0zB@L(G(eE@w~sW-Q51@kXZ8lEy_llAh;@RrkGR|9UG&Ic~p0b3^G^t(C*j#Lti0! z1YR%(UcSWe`a!(-Bci{5cz7?~O(8Rb>QoDRa!A-T&HfH?Kk5zcq=C)JRrLCe;+HQ_ zd$Mquj`X@8We7fv^3SOK?zDF2*9^+caa~*r-qH}U;EYlI0ijSi6?gt%_wZyk?xhI? zl5Q5r9NJ?!Q6l5QY0X0?f=^I?U@Z7WJtY9=jTV4O#>y$!{rz3TH*qvPzd#JV0*QeU zQT`W2zc#G}*o|NZ7R09rihh=4Tr#?YMm8od!|U(vx3+NYrw*=!`evTYfs>>B1=qeY zt*7xCL6P~eP8sa2W?nd&PSgSTKgO4SO6dQ0OZn6W`*%bAgMJ`mvw+quShfXAxA@pD zIbY4}!YDSJgVP5xwhVf)%;{RnmSCPT$}{!_1&n@%!9y7MEb0lH=F~kIMdOJm7~%|l zrlT0V6NkD73_U`cOk8Zz&kf`ncj}Ygp*_LeVb!w63t`YVZXW#V%q?9A$`SQ!cs9uB z44gq5l(;)CKU6k;_z3<($e|4cmotywzm4VrhF()81%oAF|wP0aP@=2tFcs9Tbl~jViR&OEkgFPJ1#=n+ zjx%A~x|;D;Xj13ow!5?Sj7S~q!lW7mcDDz(W{M|>K}kR1_N{=SIf|-uRaLh;fKjbR z^ju56fxzTr#0TN?MM?0e^f4a|Gqoqne=m}oa~;%KmFCV8HBC*&zkNb30|2$GNenPK z@456yKM1JbB`LuN!HXh7#a&7aR2_rYcnsJHu=fp%YEZIN&B5bMOwda#-d9 zh#Rm|0?3D#@c=YDc3K7%*D;A@1W2$z+75r_2wQHL->S@25LEn_tzd>+6bVoX_Gbf1 z>-o{}2nw*%XQ?S1I%ow%`dsE$Uf7BNY=YL3i24JWTZlLH=E{LAXE8~`P}*@JWrk!8 zfJt^$=`YrK36PuS(LpLiHIf9~L9c|2EO;E0`2Qe7ldD-4_hFm|F*Z`eeZkir1iuMQ za9(4<>i+_6GKC!YdEP=GqV$s;XCE!ocS)WCL4672HYpc>+CGuLeq5%r=|+Bwlz1xt zXOLb0OIz;%+FkI>>V~<94s4@bZd&!yIT(VRz2VtK_dSeu2_QdSz-KfKX_inng2M{3 zTB1$JQ7pxfndJr}G~1y|Xh%`FhtWnU@=Un(e6rKEp~jhSElM5Mr1?S9qy`A|84?)r zzx*3Inj~n`t6DEHsL@K)P_l38f1xTjRT9K3Cn-MfY9-F;T>2e_@-SR`XaPddJ7ZhE z#d@Y%N))$mD;zXv$JA_8N3$QOzgWo-!0iTgSA&z-6E?Gm`)cmOp<tUUfNUs9LUYw_n9rH<7NeS zKdW_f;GqmPTtcvz$eRt4>b`4!Kk=CEFy!&*f*Zu#c4GNmT^b9|(BgxgyIoP-6Yf}^ zN-UgG%?RJF;h;rxNK2#v;g&2fCe~u&@dSoSiMRrbENZLyI-8~&-vR|J>JeU4yy4IG zzrfynaQ<}sjV;%4!B!d^FgcHJ>A=ZwWVPQC>h|g|C^#-AB8nR&-EHIjnc$XoSafBt z?-Mm;dPJ0<41W%mr?AtWdz34A}mhgP&0+98%fEJK(fZ1fsDYbxuG*i6C&p%=QTwT zZsA$KJnu0VS(k1SEF5jwdg21eAcQ=ke=CA#O;V^YrUUz}H z4q|0JP1$?hUe0XAM{ryQB?iEeWuJ2#&}bK5BA;V?lNQSu&vWv}k-KmZbmjTc{>(p? zX;LN{;lI;QcSCZ?ZF+$@hh$y!Et^uAy;#kmJ6uY62%pree!lfvQf$fI9QHrP}YyP@n4_3fRAY9pXIWV*sjD5sd>gI z;~z>>F}b7K?Gszcu`zB#cpLl?wIAJxa|M9N+?c`He22~!UVXDi^Afy+u-^cp^_6HR zRv*h~DHjcJX^zm{kmi}%?lV>_9fkP#9zs-lA7i?y`Vi2nH+&c%$`~KH+P&|byP$fn zZKU|pk8~b*lW`YmR_7hO07u4+n;1TsK@2%Q?t}Ce0wkjWH1yy-xJB32_mA|ec$Gep zushd#V3WVn1_U&yg{+(>^`$34l5zPnK&f|$z3a4><`Yh8f5A8=2riduK+DU#^n6g7 zs}P4(X?_(3m_SbBs~J$st=^B8)AU#x9i+4|{8k|~PFdvehQKxmI$i1{)F$?%-NNB{ z-88x+AvVDbmIf2^nIFrgM3h1<@jxD3n2r_M9=G8Xw`z+^nKF4<8G#G0_DU1)ltU@j~|83<4Cl^q9+V@`|ShE^6U6^An3%ONGK1r>w$j zRE3k`OwqNYX{Un+KECyVxw&<69eWch`I?o{Nx3Hw8``#zfP8*MG+=B-8IOYCr|vrd zMc21(IcRI4+$zw(fGy%fG*SkCTkaVrm=n&QgV{4=aQKh zx{v(_vpbZxd{g!vH3=sMi&)Pn<;NXJfnTjoiQe&N4n`@y6ug+A^6CZ;DrMJ?Yp7Ha z%BKa-?<=qFoV1u`QZJ?ADinh0Z(PK2cw^SB&(|eU?vL*2x(g?(DFFUDD0l9o@+l`o z`d&yzkPoLM)GNlDR&q~7Ia|S?Kh0N}V$cG&3<)cE z4Afz!-r9$%JOu3M)Zk;9O2?)+{uiX#CTU@bv^5K>Tc#4@tm@W$?{%`3E3{%7ptp%W zN}|LqF-Hz(W<;~Fqm-K=140^W!L$)rq05FS14RFBsMvKq$20{ zq7*VQksr%so%*N9ygX-5f4C`Zn~AQ@bnBV4B@JhxSNn>XhKr5&Q^c<9rzN9m&+9AV zi)#0q9K;L2_xA*e!BwqdaQon3ewU_8``?7eJ(f~~{}(!&ju?mJFF5?cE&vLF`5#fM zL#CxnO4%9aRs@|QzJB)(!xvl@(u0wfk}i(hRLahfkp~B|9YF&fAn8B31;W;%d?4-OCqZ;k(_czyXLO$357)coMt4N7!P<_l<> z6Iagj1V+M-)!2hj6fPc=VL(cYYCec&@n9hnp6ktKM1OzaHkl)zvkL{R1m$UezuJmG z9`t{Cu`Cj;C|xTz388!?<IA{^ZHa_}lj1;sveu5zTYZAQlH{yN@W2LWvp|kQ>iDW*uiL81Y9iL*WiP-H99>w?v2 zh0`&X9*D@lGZh>~9ayU8>4J@i4z`~oW2P8;H@X*lWKR9zhCHw5&C;3C#e^u#j=A64 zcv1XF3UbWhbCp+cZ(*SD;bR1kWAZ};KQ}^ZXG-sXLpb#+cN8u7XaXM>L8&*xto9bO z(_^ZdFuL-TB8x1Fsjxz!;IIN-UvU!`RFl^^$s1Kqnt<^%Ki+j@0M`}cIwtarcRu1V zy^}}lZ}|Bv@{woAM?`F-XzXdwYCva14FQ z=qNx2r~wA;)i;s*T35-i%MBBg_-5RvXi0)@5HDviw#@{?zmZ+S;w|}dL6e0GxAsTW zV#Wvnyd~GWAHhk2z~Gzh=c3!~2D0MaG@Hz@cFL0fG-1Y%p6sNUvL@E_bP$-#zF@H0h|jaY7^OQ%Pr7FX z9FIKY2rwo1JzTEV4(y8gJstH@*!ZD3K&D(+_Im>1FeV51=WB>1>?d^wCt!pblb*WH zGp|I33xBb$QEh?%u2%@A9rx=p@X2Q!i^kLCwpOZ@h)mwj8yIu#AakapA9IyjZBxl= z9Dw=*A&^w*hgJZrx-ogFgw-}`hwE_KO<ECl>6^uy3Ac&*w6Te zacb^CIljyxexhq6L#;FDQM5?%X)rzZDM)~qfAEs5@=Pq^v@&-Pxwg#DT7%%in(`n2 z^ZM2vqAQ$zl*8=C0SVAZH4>54yZZ)yf;&5YSUa(^VBwYZhVJ@_oZ;xB?aIfpKX`l%mY-Z~c7b(B zO$|f^&D#)wWq<#C_2nmZkDG6|w4_`-RppuW<5orq@8xx6@Y;6Q^88N=G@HRxS&wK$P9WP^p-%l>ZIcLKCU9*lR9Ka04y2rVX4m2e>1DTEn9PfzRq z=krwL>buAfn(=Sbj(h}D9+d5eh))+w!wE$#zSRO z;rO3{&VS)7f8)#n*v9L(6Z8fCcM@Ogyr6qk^%rEb5aTw~sNxF=O!3*>S2p5p)l_i@ z5SJCP5TKU`Yu|7MpO23m9ju)cZsNYUQfG0QXI|cg){ucTK-6Fa`JKPJLAy5%Gw@b? z?x_Bt!xI<+lK6I$qo~-IqOJ8%#W(mV#!<0kNEZQCw3{ZAo|scBlOGe@(qqVLZkuk5 zbgiAWfLgmp;WpA%K9s45|Dp%N9gYB+g{p|_?+N-CpC{A?iQMm~CX3ak`)Z!te~dhW z0HO*lM7a`ndlvcUo$|5SNa((Xj-qv@;d*gWGP*e-30-SQz>1oCiv5M&WKg_6?Z^L841}xw)##8DB#@C%eeQKEG-_K8LD!(%zLdT7 zdJ9vJvOqv7C{;7baQp!oi|^OrLVne>1ZGEeyd?KZYKdsw0i7vRs63s^AdcD`5$Z%L zu@FRekiFMZZ~yZorPI~+3)rxg#J!JS6|XG#-BDQNcNh~GT*|0q9Wi)ORjZLctL$>2 z6rGd$dqv7KFNN%+kqb}A$nYZFl}DhubB!oQy22Vo#U3l2=P98am%6Z6svGRPn*8$1 z1FUNJ4&c-GlTG#4f!ux_{3cB()Q5}HT~Lo*oV^0Nz=Oqj2jSQpRb}th3Z<&b6H*h* z)~2P}y=q`VikDH%UzRNpaQEqPWujO(zdB7w&@+bVddn9S5KC}ZG1P^vCKf}J_6o&L zY*`aT1 zJ=tTY5Yl<6%8MvNDTWy=8fbPa!%@ZD+M36QsV4Xb8hv{LXak|`N3(W`U9H0G#VT%C43Jfy^;-RLZ3ZFfJEHX; zzev%m8(>vZDf{h3f1g1%0%y*bim#-FbukPpQAd(=Dmo+1> zI4U=@CulzkIuK44)u$zVf7{bEl96&vJc3yyIk2%+--Z`?pZ>rQp~u+@;&Q8$MLg}6 zn*m)h%fl~l9}z;?G}PN|3tlOoepF@|t+jtBM-L>06gg5syS){?bq*vhED9uNdc@ z){%yZpOQv-jLQ8}g)qFR^m_ahKH{p{H*EUT&9zR5HdSpIZH{&?Pd+#kR2+}%XiTfp z^5cjsR(oRk4kMok!{XTD)1HegA(V8LV#DIV@aAiw5Xuuj_+vf2pt3C9r=U3AoB+ccJHv#`vyD> z4Hono9v3h~8fOXP&LNHcIlHwr$(uJ-JOVJ-&{1@S+c|;-gu_0Kp63-Uahf69CiVim``rjwUXPJ0-lPEAgb7U(dmA zHF#&hIXJF_lyhD0-3cH7qTQ&u#LoJB9pI8?CHCACE%K$raNjL1YorN2?sc zHZ<3}O}YW68q>y*2Fs_koWMwXN(Z5^Sq}$s1$*;?8id&ZoKz<5#5*jl31$MX86z%) zp5*}^JPREbB6CY`7u z(O%RvF==3xva-gR(;$IqnL(_y#JxnszH|sdj)fuQ??}Q%mXwkimiu2SqW04g?(J%G zB6R_ZlUCwBv+yUd{yV%>K2#c4z_?smqlTYKwZmnL)}w8(P1u%bj1mknqqf0F&no3B z<(Z&jBg{No8cLqEl96sC2%)wTV+vjupjft&6fA62pvY>-PjR^payzY}vJ`jH^)Hz> zV44d%#-Qf`aXq~NE{N$mDP-q#{v-H{54mw6-_d!9DGj<&bm3CUB00UNz9YCt%Ee2J zN)$45?a(Q4Ob|2_8g3kdbSA_oJ1UXvQg+_KX7Qm>T*Oac*#P?URNqV-PoP*%66hy) zIqT?uMtsWEb6O7Nr1M#nPiA zBoq!Hc-RwA-BRjnIFywv+~2e&~{wyr&&+&C68yx1D$$Ga4u&JWtczWuRy`aBkXRPVJi>Z27qEK-tbi3kM4V$uf;@VL6;unoED^Tp zTLC3EfKNEj0tKoPHB1YXRad#)IMtsL;LE9Hv(xmxFI}#^o@0GWg6uj z=hnf^llo`#%agCL%(j>R>#xE#A+7&>O-IFYF5F+tULCjPqlm2S9t$N zu~Mg2&4f-|4sWg$!nE&Vo%}Wak3gex6iLX%)6Z?=1ApWit%JL z9eQR8{6Tg<0M|P=thrNm@~u_PyY}4rc^r#Qowu`iTW%T#3v-eNO~%!^)5We8vQo`w z=r5ci25=8WBbjqA@ki(*2N*SlEy?7xEdW!}H-<^D?s%~_sXPgYPp6S~s0 zk#8(K&YocC)T-6mBRKKfpe1OJ6TAVX=;a#ZR7p11II|x*^k)VDAsq{a({P^(%uV~3 z86%Ub7}dC&!~Ru;KrT<>a_STm%U04WYGG%?0MVxK*FOZ{kp_Tk0b4IJpew}ZuBXD*jSnXT>2NB^SC;T$S}n>&UrWkxt!~rHWtAm( zWZL07nGDaATWh?JK-}(FnM4*5@H-rvlc*)C3_5q0wbi%fQ(iZ_+*Ss$Z`{qI$|;dk zQ9+gm8`3xUGz7BFS`i3n8e#!M)ZD6xi8ZJ@KJKaYZ3hMj%L}o#VQzoBDOZGAprMAj zeGSWPgjpQyNd?DtK7Xx%Tr52yDr^&+##yCbH z?HG$D6i5>+l(X>(#0V%8nmrqypvtZZ>v$DYfihqw;hpjU%$@nh+mwKtl;eA+2)((p zIpazbpjJ$DvUVMsFZ;xR8~=l~)T6J9F-^I{ekxqZ#C%-P$<+QvHLvAM%o!IxW#`ie z<4^y}gMm3VXpIc-9CuRoZN)bl0enATbW&cp{7I#|(bB=6{f)J=-DXOq&iOr$!&qSW zK)*agTEq<_e#o(;BHsI^e+%fxeCThneqw1-_E@N`9mN>vybq>nMtamlw(P#sLWoXn z&xT|>LlDQc(zWUH@Y6D?8<$ClU0jMcOxlM(CT_P0)cRk0^&8j)P4%p(gdO`Xmaxs1 zKMO-kx0W$Zs1`4LoG0#-GU|aTD(Qv>TB~>n{$SoPEd7)mX@W*gGP)`*snkL?55HLEa+u7W%CwG7zk-}{5O@0Zi)if&=A zRSmf;Oqa-$@^swEoq5s0L>GRWhCm@ z!#66AVG24?#ab~&t)eWXdsoiLIcvU0L>Lrfa1MJ9aU36`#VcV4EE{Hp)CvZ#Rve;o z=rKCO+*)Yuf#fhr96t$etH>Qmw465*Aq_4X8c<5};2+6cVXo|j+|LH z#FsH!we(OnEVl!#j&^?b!hr=R|fOCeuJ%DU~{DFiN8H!nj* zrKa`BMvFG8SA%mN+7ib2ZnuY=2|Ep35g@NVx-Vasnmtz#f}{bC#5|&`J3=+@{3(Bz zytwq`fQf#iNAxf;m~j#&rPlvHUOZ052Or^~CCIF_Y2C3(UZAx8QGc1QX-#@p;R+G$ z@+_~d2RsEG8Q@T!Qt(p^xC|e$`Z>fusDYBg-yi@aIpC;3jVEf(6-PM@>J~ z9zP!Asg~K*qx{MSkh%moE5t(G3S%s)!Y7(D69M5y>8XQzWcSJC`$H(zUrzfLz|+39>aYlRh)`3lE!R+Js&eb+@o zK*8$2bH^7V@1;{-_0eBtkDXE{`%-!D_}z)@fYqzddZP7$0b*MgdP9RXu@G!Udb`3g zLZ(@;aDh*WfK}uf=XH}y-xe5u}2?x&;o9e2FJUi)|EkF1z0Yxu6eCiwFL;PrG9(W`Q`O%$l;xdqxB$aao3{c|#v$fN5 zM`)@mh)7=L#m+j4cbR(JJ$6LBlROf=P-bPV7LT zNxlc%VB53R69?{>qH(ADjHditQN|0oz=EqFDwB0SV+uB4e;#dH!~Xgltyedsme)jT zDo)!Y&R7RHKmDW&jbB*6 ze)s9=+IuFNw2Z%@Wm-Nn)YP0Gpp{&7Eij-RRywc6mX&yuLl6Z=s*133Qm9;{Y+*+l z;ES2F2EUhpMiP*+${3iloz@>$3e?x2xNuvZXDRzK#2+b!JBtt^Gr%Z-L=O zEeDUCyW$I7)^0q^$-1kc`^UwkJ{xU&4-ceGecSPD2x>H{0QZV}#qdZ8H&fgkCiFdJ zdzGge8N_HWI21;^US&iQkEZn2Q@ zLvOfR8liksfZ9l*%XfItTW2&GP=ZV=$lzT2i@&`ttGirMcsLDF&-1xnLE`K!|6x1x z9yu8J-l9fBAdPEg71eBpffoVjbP84)&4V5n2a%*hu-QY zOQm#_e=KmWm|Fv+ZvCeh%uD7ypxI6KNh}%UWJTMs2wOf}vEW#NSu*w@+?X_?4#nUZ zso*dMG$6UYuGAUJt^0nnN4MclHuLGDqjvFyXcI2OYQNBhpvgU-`D&56i^?Sn={^+s zyluJR`(REsu*&IoX2=+=b6MCBJrT3t-jjEzN1yG0l4^EYb7LO^$maS?oT8&+|UWZx4?=lsK0LLodZ+2g3`)mmF?QeXs9e6fNV>Dk* zS#jEV#-;55?RZbh=-|{wVbCiCeP)bF)6r9ZEbu&3|0kA7Spk{c`73ovAW(849dXIV zW@FSy&rlGx#Opg$=_XJj>9b{6Ah&Iw$kMuedWMa z_HIr%B)W%TT$RD}Y63UK*m9;nDU(-~Zd+q&PG*_z+WC%NWs>=_|D(Q}Pdu_jPpw-p zar+MujG&qthL8Pay3bK3kNnrSfe)T&CUm!~x^A{F)9b5Ry~^}8Txmv|5~qGT4pl=P zLBT(p{Sc^9gkHz)MR6>Ze1?bp4C_hpERj4$8mG1p&yHwFyr2US)T&y^WSqqTnMvqa zNXyc^$KtWW`~e+TFeCJhy4=WP(U0P3EYwaRKcBZ&*k@!#raQl8ZkEGT)I~7TPc)8H zBRP^sijvXYLkOYF=H4)@XN!U(kbvZN)Dp+I7&vQMCsy=ZfI<*5xdI{#y#cB|DMIo; zvelG-2>BD9oN8{-D3M?wvJ;)OBs)lSAcQm$RXGx7P3Oy)Kxb>z*x?lZYm|x)2TI3K z%L7)r&DbcF0b@X4-RRdaz!pFMQ#iI@@p|RsZ3^9E`csxDJEl^zvrWLP!Jl3A-Y-+<8g2aHe* zs#`s9(}c@kX!a{b&=6paoj%oe(_UlQ81R0(u&MzntBc$oV9 ziEr%H(_LFLQl;PHxu+@C;?JtwE2a32Ut7-u`~og#daBLXW`*PYz0@k;k2GSR=FAID zFw$%{H-y}=%ND~vNqZY$kVt|&7A;Ab&F_obT+G{SY0kiCFGjSrBI{zsfQo5BA+F@% zO94+p&qU@hK2w`?{C23>{K$4;>gv=^^O}G!tnHB7WSf&__T_~9vuK}73`)~XCLHTTnZ_jo+=fO*7L?HrNIAh)#UH;nVT0S6Prbv?a zx|??K5&ehRDJ2aTwq%47Q2H;TC5t9MG9&+LUJx}+GB|O3zwmCKyP=@SHJ#(#4KxcGj zc&?hNm8v~Dgd@5oZYrBZy?8tCntD+*E(}n4@fqd0+F=^DRi^H<-&6{x{S8QOPejUG ztzbT##2R`hd5YGwER1%YB%g(DwC&?X{YqraYHiyw|~n9 zv#}~waWze9HMw~+R3e6WfjN|HuxHt{RZkvubx#j>Z}r?)ZgQC-fFS)J<#2*FN$!wH zN@FX+-~drTuD@TtJADF&j8snjD>wdcO(eXIGa7jt4ykLt(?k%~4;ft1{H9Nv}ii1x7DZ7A4uYRVi>#l-F`BMltP?>H67@ zabdh>WknecW2q4K@`oRYuFBCWLAxar3OdtkHA+(885L~}(4`!|WL!bg1n!n>-6#VW zUWAehJrrCsCrAol_<&_{luBR~;O~iepSB*u+D*9Mj1eIWcm}_r7pK@ZKg%dsNC>qQ zqC+HJsAygOiY)HJaJ z>TdYkIPo%^P!nl>{T#M8=4UteaTF>PFB4>-!SqS1>oar9+qh(FK)d{*5mKw@A?sUO z+_$^g37TG;-k4m&*$o+o>||mcTQAY@+TiBkD&E86Ud7rcx}rsRczQFfd*80Ds2wlK z#yRS&4bHZ&7NRputFE~^HCCpm5=r|DCB*ZL-LLTib zmWA;JH3;TkE336y(8n1@yLhE2K_Xs>2YJ4kfzXfwC>qu*rQAqV;g%HUnz`^vF8pC4 znqfCsiP4>+0GvN$F^HU$2;of-ORd#BG{^CrD}mEuHwOU~-~u@S6S?I;spX~|D6t?Q zfNQW~q&kIftl7M-X*y`$(9IlcL0rq{q9lD%F z8Ix2nHRkh~2fLXmDgCZz0r$C{#+oN;=_J*t)w-Pw9BXQ?c3r+&2?Ow2a}uI#4(v&O z_XMTBFD5c2ny?&cIfOEiVMym0G~&D^X4KqFNV$a^D6=470##fhU}csBqZi6dYPQAM z!)AQ!Ww0{7JGU~0jTt^;tP|uq2iDxw{M6huu5C~f@Q5Hs9ioD|6$TP%T2C*{I7Epe zJ<{|;(5GQ+TZ0Ihrjy)C(JrC8x5n5$HL`8o?*ZPH;<(<4l^P36NP$>VQL3VV{}DKu z{*3MbdTYTGHD`ILNv2jfx4LF05)VyrA}!D8wO{9k4e28DjK1@r%O_!jCIs^r8B7!H zBn)V#;oucpqMckJu8ssoj#O0@bzHl_NKB_I3M3V^TPX^fCg#+dR=?9|d4|aV9Iu*2 zBADQ9JidAiQg-q=NtPMc2d#fFE9uDS2AzZ(RiH4vF~)&`jA>eDwmCiVKO2O=-zdb7 z(O@K@lGLrWj222lqVEzR43=vy(`=uQG)JU)SF`i1`(?#%~$Q;lD?1dB^h5 zUf;?nz5=70=i0sZ_w_Z_VTta4gy*`oV|`(5X?1DyifXd1P4ZZw+P>Pg(zVfpX`CS8 zIck~K(be9K{So((2M7B*8}Zq`UFqo@mKEV6jUAjDo*TkT@Xw>x0mLD^hD4Z~bH-5L zaPJ^CqRg@9ECz=A@B(^nuVanI{lhl0)<$<8xMoWDn|Z=GU#6hsy9rdG?ltWfd@G)n zyxu*0_#t2AoAMbvn1YRNZ*At|j-rnZh~;cHWIdseMBNbPUS>aPi|2@H@sOcBgAGEz0wgShB{JR}VXjN7}@gt(-ki)7h{PZ!J1z-5T%INWb zAYPQM4UI_(<+vrx|_9ZcV`*ed_RSoI_S)EY?#wyJgveE>TM zGLWg$sY=#JWWA~j=rkQ{L3Pxj#9lUNyHqw`SEX&cdazr$o52h;s{AMPNIx<-jQR8T z@jB;ZJ)xyJg*qrL@UDd0+qB=U%V-it&d_)Gz0;xP5c+A|9@TS6I@!MFS#=8CmlwMw zni3`rJW-POTC~BvC#eri(UyI&&ojupgWVnyc|5~MO~(&?Hr(K%lt@0*muSj0=qkB2 zJETt_p@G?cd!5iYcElVxv)x zb)0^J51^t${?Cs=%$zsMcW}}$OdxUGI4ryG3O{Ey6Fr319g?`U&GIYnCdw;Ln_t%7 zh&zP_>{f0_Ap#u|<5;9z@f9JFB07K;W#=#?Vy1{~yXR9MswXSxj2zK23@Rz~A_XZT z|M6usw<~F^7=$zA2zF~9dJ_q_$gWLNqStqx;!KOjZh_@Kk9I#;sKhPz-Q z`cJ9r3kphP<8P|`s~zb`+A~9N6th%p3aa{jMS8b&IIaaH>QR?dCgPQz^j9M4Hv=r9 z076N+Bd15`qg}{N6 zR5Sygb9DXQ=ua3d94B2Gpzq4|Q_Ex&HI)xJ#7LWVpPyh<%=q(&NFzKgz!|=Icz4>D z9*2QvXKF!o+bd*MwDUbQ)g+&AwT*82nk8sI8u$FmY=c9M}3yiKkNI8=pnxdZ9ky4=)Fi_e| zD}q_|G6VmFEvA?LS95h|1MyB10_DY}gSjJ`-ewr=iFc7tx-EAN`AvshSBI(U;w3$*W13DrZuuqP%9u_BsLCfy)&fX@5Q+RUJSzDLX6&VjB)) z-03!X7pVRfUsJh;3xc#j1eBzNU7E^iuyB`w}+ca zI!AL-Y~TE`?vLTm5TK};mgc8a zNFpd7ED_=XlB4E4r*UV%bF+a&{7zSoyok-@T6IIP@4Jsl;N2Q~hVT_q^IkF};O?&> zm`MJ;RxQVsWSiiv6E4DyGPkX-Ke>9wdMW9DMwwdVv~RDeLqin5y*dR^K}X@$R98^7w9=?2+hq!(_c9;GxMNmTKeK==>;0J& zCsk)_nqrnmGu13EVqk1Qg)A=hpcxjkD(6VnVi;0!g=syDsNi-5PZsgsu>Y&MnjODp z&yU0~J(}F}UF!n*-z|r&haUI5gSasoDyF8A8>8V7E7=?Ns62{b5ij9aXZFSycC3LU z?O5c{y}h9TgB=@r2&%xY$+qJE%BymLwr0%mRO#cvU1xO-!n|e=Pnqsx90Jm_et)%2 z)VKdwM&0sBC2!Sn>u>J|rRaRguJ28*R@L471@niQ92xSWDJu{-du7u52~7Y3P(Iet znf(a?GVEC7`e@aX+5{t~7+>}x->jtqpJno$0`I*>{~Q7qy`CD@#l&SM?|F?{%8K0* zQ+YJjzYcNySKNahVTbwHjUWYNg(DSJ0cm2HVX>$^h&qG3SzJH9DqL(grPWln5{qE2 ziN&-CE?8tRa~jQBzB<(8M#N={)E$(hyh{#)nZfPQv_m&(ZR`NM$@cdDDVC-UGI9?O z;o@t6h}j7As7d$tehyl#GWZOUAmcYWahbt;bkXm92ke&UXrTCB?kI7_;d7s(M(hne zI-|3x=qh}n3DrXASN|STCy%NAzrTcB2E>4D=SY~6*;GL!d>N^sN^-2s zH@{Nr)}6+ONTqae6T;U?Sc`rkw(fW}#9$V${b|+!a-EvSYqx`zkqEC)I9Mu|3tdN3 z59+}2*goD^G4srVG@p}*O#e87+3m?S($kSzAt@bQdCzv$@952$r(?$3%RFVET=;NI z-7fhK)>Zsp&3;faU9Wov^30k)k)iAO9T+gKyhYZct!Z|e|9(st$-O6FuPNSvm)L^k zOD_&DnPegzGhUF$G6HW|ne_g!?1|oXrJcrl3RLP1w_j5}KR=65Bwn%erJDHG)5JmN z{n3Y9rR^^QDFQ!5W&PDWv=J>6#4bf{#T&GnOO+ixw%GKAH~@w&b9G0nnsyv940A1k ztHA*kU^BciLiFE{4H;;M3O}FRaD-q0Xjb)*lnR?Hw$pL| zCCh%ox&+Rr)bG>Y`7_*P<-2__%^>N>S3*9SVv@`7(B&CVp+ZuSTC*9+@~y1c!|m-o zJ7tPB6mRF4l~L^i7?t4&ijQ?B zDVXuc%i(Dp)Cq zMV#Tz6*hS*=J4JYyW6MLN4m&CQ-UDe5*}^+GX?A4(BwD0!8<7N?X%x!*>%~?JFkHd zEF@d{YI$Gt$nNz>oMTDHyz+o3&B?Z?y}*>lJ4U^%PUEj z%207?OV^2-XE`udF2Fh4b9c-QtlZmJL$gH3=!pn47}ETF8*PMF-4_2Hr***}GBlKbixC7^LwFvSR>Rkk|LCM8z*(0t4>`I9l01jW#zE zntEB=lk0z^X-@+rgA2WVOECt8AA`xp52H1MGT^V?o`w|dX?Y^WcUP)3+eC@~lPpuB zh7;NR`_;0d2K1v$m3UB0T$raJZcTfN-%mqKAp5!$&X;4QUIR`q_`vTHk=0vmWJXe= zpinKS>e`i~yYwIUy;@k^ZT(#(coKx--nbs~>=rVrAAkTwBNBH2lnXQ@eqwdXhS5Vt z5kR9V-l3xiRmIlN&$y0RLUR6)x|I;w&KjULv%ac_6Sb3Tl;GY#vVi-XlY9gYvTbNp zldrPNo$@DbRTrpB3tN68iJZhSRGpB8FmMx*xQ3|0BQp7+i;37x6`A$Oh`YSgQi*n1 z66m=`66$ldt*ddV6m-hST!5Qx{kiA5b}=yhk6x5V3)<$==TBUk!)Yu#`n>IHbV&p= z+I~2&NcBJAI@J(_o?#mNcs5B)zhCQ8g)IZ_?w;jiUF`3LZjz>lFMntyzCLHW`VrEg zfhj@MYBW@0ZG^C9@M2Ayrd9Jf$(n&NJyW}R)uu69u`ihs+y|{v#qr;@Z z(=R06R>`1W0dER+woLQIoI|dl5EOAd`EUdy8Y^hy)n_6fdO#ipBWCXbX*Op7vtPdi zLU}2E-ONid9ZNDmA=a@4k*V-GFVpzrOGLIw)>*94QwjrPrM8YDBQq;NDle%>ihS$G zi_c=Yk2O`nFnt}`dLDg_De=^VV44pu}F(A8A*qBG|t2^SJDlxVX`KQm@coG zo8*6Sk2TN{jmFeOBeWYRNkJn%Sd#^Znc8{Ve@{_x50428GrE$RIQhZ^0~b}V-ulHd z{W|+H>%t5fWH)OKbx`Z)+HJ~q1T{8^w{VW#sOeBCXINEWdBjezMJjE8(vZ7M35@;v1tE@q+cZP0kH$7=yi>XK-khlndB z^=*&OrePwAkuPpyeMD-5a%reDepwVyrdpCjm|%KiSHg;Xxz9C(uqIfnTP}ny&9Yy7 ze6tlC1Nl+=xO#U8L7=F58w=UC)5DK8OL23{?0X{`(JoZ&S~O`DyL16o;Oua)7KMRm zE`?)$PfM-LqPE2R0IzWr%)%F!Z@s+de4{-V_Yhez@}@EGU6icP!?2zTYkq! zlt*3)rzD-Me7k;R7c_c{z%Hlyp_(YJTCho)>p|i6{^630iN5=qKRmcfOVyrFn)~tdmx?|WsX?}wg4So%qr9aN~_GY3M+Unp- ztjRoH108WmV1th@TWJ#=Kh*H>{d*Z}?v?sSwS9EWxu1`QrcU^FBA~M<3+kUVB?a*7 zgnuW(ezK^c$h4(W$?DqaIAzkd3yZb}JQdBqW1{^Kj@|3#8ZozDLd$W3n>c|*#oF`r z5n9sob%ax|londj&-G)-B70vZAtGv$r4vHd`R>{r$J8|Xu>#Yk;(tOpIeanf6n6@x zq%r`Z!8(b^Mahsc5!=F&>|Hqx`y+q@#8}+E+84s(cPFxY6)rL~R=h&&bCuB8tKa$0 z>3kgMV#h|B;M!_^_QEV23mqPm>qfX^0awukA^6U$V6xyeQZ+w$m)AdiNmxb_@0;`g zi4>7#4*ppn|*YTpGBk&rfX9AS$R3Do#?7}dyPamnRUU(b11*+Emd2#GYN9VY$wqDGvkKjCTL z>Pi}R@}$`@>Tjo~elu9NeWy{Sct|)}u+5a3Y6Tf7MN!?X+DI;+XB&*%BQm&dLRG^9 zd>T&{d*=BvCbvx&v~#sir{3@4>J7Xto>nUyvtW-tg=3PARw^4(fbFVxYlki>h{3j3 zw)0!BM*b-)c(@g7_2kI)EdgF}JPx->X0&r9{OQH3JAkOo@9wzi zDMo|aDWJR40`1tWL;y7|RZ}2e-|AYi^Jfo2cW|7m2n`*cc;qZt#XaI_w(SX6smtH) zHAw=$#gMSFB|P8N{Owq&sp{D7&-XR`Y_exBx5F46_8e94`HXz4aF_|%djOGnB5Anj zCGy3WoH&a=(gXeE`tpF3iKkd4NPB?Ipv~3D0&)@O$Q+;l2cthzL43V#x8H{dk<7&0 z1k(nr7aww9Kf6Hj%6}hn@pOJ4+4n9Qg!}ud#i?UxL7?eac3r%H+hokHR^}aj9Kq0D zqDIh?y%+v|vG>QY1D2`vWD9xe?b3$nB!23|)ZHVJ!v%06k?^DL*z$tTsG>!~GarC} z?UISH8ciO73j*JU1+qZGcLYw0X=4Jn@HW)Ww$c3XTrvVaGLU)9#p%fqBt2T}b(<%Sh~DgagF4wy$OmxycT77n;r2(P+&3?G>u(P@+tq*?3V#ePL|Z4SI)&n!x6riq zmO-zayX4Mz~GtlFP7y^l&iufHU67p4*fOhq4;OvX2zndRQd`9`&*># z+DtV3NxxaS`_Z4We=N|bA&^g#m3f6jbwr0F!W`ynRlBx3TumiEDfYDSdyIN=N3kQt zcTt;oiBml=mq<|PM%UYWnA(SGnUU@G53^Q3POY;%AWlUO*Ud_!3ZoX^cWqY#YM8>8 zZ3UR#jx`;o;z!@qbKd50`nTn6h8HS$MZQm&OaFrOSycIKCjg9SOs=s^X4xti(fL9{TOXbd*a@9UH*cx_|n&aKZI+_Z>sxgIVbPv zoymT=2Xl%Zds^^as?D_uxU7Q9S`k+Y>d<3geCzQtTw}05hek`%2zLU0QNz3Q`OXsj z*1~=eV=$gWdrOzC-@rIgQGiy|aig7V9_Db;#<)L(f9w~dGeW+HK}4j z6}T~oI-lGA0Yb+ZipU){GWd2`XxDv~l{y+P%foj1UUA%svc=t(a^$zTW>^&gje zD4jyy5YwnphTHv|`T2e9Ymn5oI&f>A;c{cmCKdSgM;8bDQ55!EirB76jDoBEyK1o{ zJ*>y*mypCqiBN{fLsA^Nvt`EU0cg~hXVRYf&IthcHN8?7?|T4&&{Umh=$?3Yle&Fk z`%$}>?L0v1OAU|tzfJ1e=GW>_uzX{Qa<3(op|@F7d-9))R)_VRQa`Mx6ENBhm-=CL=Caqc-xY@&YW0MXl6YZ$(Zg|AsHK;AO z11u<5uDr%@xfG0LcfkhY>h3SE=wkV%+%4WLJChP$?;4EqzpkC^V$M!<|Kk7|;OUW< za&B?1w@GSWTQ(w?h!{D0oe%M*Nvl2zNIbgM-p_mL*6=Aedv0~aAFhroO7FY2r78FB zp_1L0ng5&ZrF$p3Y;xN>up~oTyg?Qa(gB{a=AP!vJ&^iUpF8Ynd`*t}F0?U(NUiIt zq4woYe5bu>Az%`c8=0iQBd2YMm(wo}nOB`I=sFlUSM1XwWd>(_g(u+bl)7fAO+wx^ zOlueMiAmkxkk_3B*Ml#8c|sX-#<>B}7&s6i0oaY0>u3JP0CDvQVv~ws6I36H7)E8m zH9jA#%7Y)yM=Cj$JKgF^Fq&B83zZujmKO}X&j5Q%_t-mV{kjE;-F)Xq{s)KtR&d$Fun#^VuXe^ozmQXA)WnFappp~iU%B$0#YrsgRR^|Qo&@xSzeki;HP`jUMhdQc;dJfnib!X*0!ucseW z+D+Bb6R>9Cv+yxKkb)QE9KYSH9@@cYMh!wc+VE(04mV@=&8xpJLH^R2IZRkR}H_^y1X=QL|ZMGkPMwBLSM;SQ;U#dB-|=`}!*B$c^W3 z0(M`}Q4v#djbo>xwd@-*KYuSO3T`sV?Spd-L|-9Rz&7T`Q!<zGvw%j6M2VsfR5Gwk*5!d3_zq9?RagHBV5fJyYN`C-5D4 z$A*X|6_NZ!Q?JY~M;pcgpe7AHfXa_lxK>@NU~jXyh!cMI*x-g*@ex!{Tr+XkDmw{l z1HW38-X9|)SXA)3Z`3E<5DZclld{4%o4N_R6cP=5pym60v zE&5kWUN_aN7rp4NlMhbb7Ededp1nvu_T7d(lvmaegRnlMXiXrUVJeo;CGEZY0XPfP z;-|e=oLk>E@5eG@ zj>ls6x_qiun~wf?O6$uh53;DmP@iU2`NaD;xLk4r1Kq_c z-y0|r^4Z_Lo-d4P&Cew-NN(CT62-STWC=Oel}WH{YwgJVQQlL#uco+ zVdO#UblH7DQ^SflX4lM~CRDFd%xw@@IeJwUENi!vttr!;w(1f;Jv3`GhxoB8G78Iw zZ_|o>*IEFWPERhIWk+$Kc2W!LZES{p()1ia%6s(dC*G!v7sBiPn%nJMKlRxiL+Y4&={Cxyscp}faDlfo?jfOTm7@f0WIdb>-<5zy%m z35md|r7mw0v+AYew%N3NnzMQWiJyNL{@~J(%g^zm!)T3X=IB-Le{1VD>DI8ae*vn?UhIj+=o1izqE(RSD>q&o8 z0q0V3EGaKCeHL{w+5vMWC@(726i@^aLOLx%o)vn@DI}*w+eW0`mbbkO!UP{5+vPyCli>hh({Dey z;@Z4n-JF@*vwb=mPg5Prax*@pxrccq-wM$h8>DJ>{I>ODeuy2j(ov9Xr?hR-Yu0ho zCG9i6zx+M8>oz`Jb00WybeAxf({90>p+4)x1;U;{<2|<5DG#w;K4jZ1a*#13u zJ3M}X%XOw=9Gso;jC@Ib#Q2dkX7|+$O;RNoudhXf>lS;=%#qsBwf^mak{bgt;8exu z8t%`L*c5Hp01RP@To!lXBEc#L0KPE6pXs^+Vq|z8I-qclHRn`G^PDB(=XzdGxV!J}NZu&T5>PX0yn6BKt%(*&q&db>1LJU8MA& zN)jyDK5iV=(^HQzKTZ=RQcLgjVO5*U^DC|S7@Lx+SJpsvoAFMJ@F%~Pv^jt&Ty8s% zdo<^puVP6oJF(=u85^4wZC5=52CHmo|7hw;@>}cX;VS|;PPZ9x z$;R~)X`pK%YB4S^4-{#CvU|)=QKvxvAmJd^XkuPX1Vka*|B8Wvy6hTM$j z1u{m=x4I$Rxm}dZJs0l6=J~NId1|FK_n9xxJb>pf@($+1Ib0r5G6A~Vj5uZzP%h!x zRw>*RVwy-UX5poLLng~*(MwI=%jmAnCv4(W!O6t5c|BJcg`|p_ky<>3KRuQz^?il% zjL!-EyhKdoEtJ8<7I#OJd+T+Bg2Eh zQ@W6BtFb}~w|ma)uz6Q*$p^>QQ&fq5*D)GxDacs(i~ zW_;&msTOeqt+Y%$5peq(Vq^BKs;KF;r!YsTb4DvaD?OtE13oRqf312Dl|*g{X;hQa zR8MP!N>1+(0rn-X%HbIM?*3$G`tfu+ik6>h?@)(+XH5#DC#csmhFcEgvyQLj+)C_V z*ytJQEaJ9=gPFTG8JbS(aUt^L)zC~&U)3iTZ$`cO20O5Ts&$s_n{I&v-W65MbSKFY z{;xe=1Lz1tw05V{VuqXkW)AN58nrTVSgA{QMjm4n_ojcB2ZvkwaoU|9*xmGfA#a*6 z(VhR8emPnt_x|d`$*rmBVvEzGxdx^vT=h(`pCkI;;dYcnOPLs$yyp=ZIi10qQX;A_ zbIMa*9ri9_dBBJ5-k8TITuwg$xofy(U;gA}sN)=GKXjp*?LW@skS4Mf`COyj{AVta z+pQ$=J5j%C+?z5Sn12Dci}Qigzknu(M0Jv)NoYVuE9T5}@MdntO0iR8bEP%!qSfJN zia+)Y@n8>^%e=W%oJl*q2ec-ZjNTo$41T9dw7HD4NY>YX7T=1=P4Fv1+qYVjAwzP$ zJ~RxJo8c@W&HRWQvFM%O{p&7ug{JX6U+-zk$!$ClWxu0AsQf>YFJad}f^m~6o+wt2 zgbNbNc_R`FprK*JSB`keODfm)Bp-FE$z~d$K02EkXKK#o7vRTK_W~pS+daOm<;*;V zT{tc`e~$mMoNz{~46NfmsPs#;#JL+&K#BIe?K2hrZ@r^caLYmbiV<%2X1S{7D6_DvbKc9U8coDr4 z|6R7XGlvzNQux?IdqkVyP$?;cnpih`m%i~K-MFx|=AYa)hk)A>u)(CDS=y|gYy){% zHCrc*WUu=wmUbXbeiR(PR*LNGF`v{TTozlFDkSh8O9EtoP+Ru?dXkekxuWvR1|y1h z)ys@9Pa{a)2Vckl{w4=L6Sd!EohHrqp)ew(c-2iLvK(O#vZa37;c@ z{#8_guUBG_CpLB25cS8imT#>5G8^w!>I$NMaoORn0&gr9QK=jF;C1!z72omKU9}EAb8tYGMbZu@7ReuIc{_)R zZ+Am3duE>Hmgt4XW?32N{`{f;CxBDB96^+%{~9!EWct@1bXy#s z!frqAu3@D{y_eF&_wPWF8K;;3nrE#wHaIsCGD_RAIXL1&N}nw=!h4!faMXv66$0B^ zJVfj?xRm;I4e`J*z%T>(_pWDLf{!1pK!5CHWbUdLH^v-ASWq{ z)`;)G$+aQC>^7(=4)a#UW{l?kv_ly# zDgg@BY7J%r&zB*ijpp=3-ZJ?X5r^%J02oQ_oB!QNafkB0?sa z71yO2ZLVrWf<~IcGehad4^+V-7TNVmd7qv`dpOld&=ZngE$OBd7DaXy^1L_dqn@5* zJmGyO7VzvAzeb8@FB8}3&tpXUu9Y%>!Aas2EHhE?cd~ew4Ay{|!1GhlhQfh)(@Qsj);zQHBZPa^%$tK?Sy0zp&@f&A+4zzc!XT> zA_oRZ`n+v7+_(yPsQgabrT2Az66EwUd6$PNQv$DM&uGSAG{e9{5dC1h_ln50#ybK^ zp?Xc&uJ}XJ+47U@@ps9wrePE&RW6G@3F{J5s!&uBuQV!4|_NxOa& z7koF{Xos~%d|w!pU0aMf`mMkTH)rJrO(g>y%0OnxjbI%~W`(nRp%%|9Qe0*3R2oy_ z2I=slXH@;m)i-xCc#>147;ZTV~%%Rtaf!}x!B zR^Lpn2KyK3f_O);&2}e)sdxV7V=NekL64LrUxuG(tuXBTfE}ikMJjdnWKD~-Ucj-$&Md7~j@YZI9sB2t zY@YZa&~^VDo{)NQmRAqWZ$T4->hjcvlhN5Be}|t`10(pjTpAtJyTY^_Wai?}Z?Aje zL{5`{yetKMU&YMlo;BZL_b+xqZ%}Sj;ghvi4P+^yiRr}C7WY-UTFlGX8!%ybzED-A zMB^+i(7uZR0=L<+`L3{|2O~+LY-{5G*&M((k zNTuN#zJk`|fH^V5KeI4rbvEi-fno z*ilhQ$lpvQ&fbh!^4PvDoyc-*`tw!r+H_onpwqickMV+-B92oj39c1yO~fiHIIC7XB#jE#6v$8Crp6jC|)^?-g?x zF8>9Zi_}5FA88^)rPFIhFxSelHJo8ncpK(=RC|ykKJW{UYv)m#tZbEY9!QUCoqd7_@~=wyl*xTLLlIhn72W`NGT-Fn*!KIOJey{yqFQkbtygafFM5Tz-+6u z=jOZZx>i~ACk;@n$Ww%#ek8SueUxQCK}d=?t(k0tBu5Rik$03(>u1xJpaa{{g3NCR zJAF=ICGH>V%l<_xa4XgMWHnP4JO;YyX4juIb2^s=q%d1ibhLlSh6x$xcy zu9e~#a|g46KHvpHqAb;BO7-!3IGBCTjk%O1*@})uR z7^}FF;S?0^ieG4n{ey$4SCq$?+^2GjhFpx#)yC4;hQN3Y#qa(3E0XX>7M4$hhk_2g z0oZ*G9%v^7@{k7eI+OK*ER$5_GIh{hYS(TPe}~`U28-e{9Rujf-F{Qp*BR_%oJkSK zBCW^$^MH_Za@qasT%x-Ae0wvIGYIcmKVl0h>Ktuo;;yjWp*u^#ual^g@7@{${^ZhXfNT#gZY)!W>GvO`9d!rD@YMQt3^tDG z_Qz50(-!p-P54acGl8#n`8TwWz&J&`(F+sBh$$XTxSiQ%wD+4M>kg)^ z@bi-MuqUqdgNDw1VqPiq*Z<@Gi~2HA6t1x2 z`PM3<@aisMe6vvVnfSKc2j~esm<3&|_^7t|q+_Ax*To9873+@KNvK5oIF1_2)fTu( zs0s;f>LW8}7;~2k9ky{<3W=&zlQb!Z&Q%;UGrMWXstxi9%+&4z{NEL7tOk@E&?XpuZLP6DklGV6 z>PBRI*c&z9W}&x zw*akeWiWePl3ks9u$<6@TNvliKR&jVy{>wbk$dE7TYMiQ<@Q2%y%{-|&h@H2MNJTg z4L#*1Rxb70;UX!w{;c)0N}r2hvUcGvRRve`KQ}&D|pn=~yCAiF2t_?DHz*!>>;VL$$SH^=n zT~xo|sUx7r7ZV0)u-g^qul5MAc*U9P=Jc9cIb+KT*|PG0pu#{Bt_#2aVd#C0vYlW_ z+Ejim7|%+{Ff(8f9MmKmAYjxOF1F7%3cFac5*qd=RK=f_FUS!>RRp6qPGJtTg7jvKHj5DttGYxz1T1?Y10W(eXvCS z*vU}Q%~#Ly^BzErozt96b*_2m?iyRvSL4t%*6alp?htw~yU(T?gs{RkEQOv)8nRHM zROID6G`OgwMc$UB2ZW!6zw`6Q1>}(Nz?(D<7m9o{c$#BM2drDDS4UE{Is|<~94UVB zgeFXFVh_yhAW5I(6?Rrcez^|a+8Jeue_zuB9~J|~@LjO?y#t@U1yX$|f7v`xV1SPaYe z!e`)y4r4ev8SgCrKe%nOyHEQHMn32wCrvkae`c7FVJMbPU<{op6bU>hJ3V)}M}HTb zeWgguf5R%QigpuStJKqY1coHdSx%Jf=5f_eexWYJ z(sII8DzMow9KEmkz&T=dYMsRdX&gKoU0ocI2xOiF$N##mFqLqD#E#&(#*9#{%xbpI zQaqakPHHJpcw|KqZr?)angZ_+2IUf%>@Zvqx+)DX+GT{f#EnR;u|?fvx_G)f=bgmU zLy-ls91CYts(A}vd{KC~?b^kc(^VmTk0HEU2(lH`vb(P6HK6>ODV^c0QfX`PeVJQl z`qT%e01gL;d?CP0C2Ow-57Moa>`Qj zGqAb%EM2>{Tc^wu%^U~|sRlKD`?AsOA^|hN_T?kQ6-`ikLD54rSJ+IO-;eEifToRCZ~<1uoSJ^Pilx_n{dmcil$ z>-k1@kul47gBUB3cV^S&4L3BpenHi0t&$lnJwauifB*B^m8W_&?B9hb^Qjw-S{Pbs zGME@MzP8p@(G{}?`Q1s0#n)u=mT90yC^UDP6k#v<2Z1WggE zh|<{I@4393NfKjsQGO}A&9ZOv8ny>E{#i#jR#YlApLHcYzFdXBQu9)d9|LveCA+0L z;`iGcHq2iZUv8WzdNgI0V}C$Pye{1o*6Dpi92dUW?FQqaqh~>M!4)Az5hC#%t+Q2) zkmwBL8{#Yr&nrM?hq!L$a$4sTzt4KVp|05YFgQ{h+B&m#G(%J?UYQm1Da?#)>jbOT zwi;06pqA8@0rPJAu>ppD6~d!uYDJ1%4OpD(DE2P7>U;H@ZGBRe))`mmn*n3Lz+2uo z>aJKC3H_v`Ep#%*6?U?pV(iZ!hp$|Qy85Q^B-BEu+{)!qv_zw~A@2MO$x$shMXKN$ z$W>Lta#YA=Mr_*-B3W4!`FcB>8X75yKxRMX8sQMs*E<}J<4&YB!g_Q7O+d20Q!0>3 zA*sE4dK}VdF|C0601>FQ?{Adx4oHIgOPr)PgY78L>>hOzdE(EMfb5*gz?F?XVe(dj zj6VoFsD>tdOj8Vh4j`W4D8R$uJ`ZC5@b!%*i7cSIzg-dozGeM z%fKFbJV%XVACR#o!gU;BVu@RHxOcHslX<)g%JtYp(6z;?`ErpPqn5E90Rd*vDeE;4 zKWL$7nJlL6u)1x^HS~&b*%tqE9p z`H__^JIJmMk`H$N2LJl%J&*p+$BS+tqK^KZ+uOcxH?cECYw&}^%XeDDswh2pI?A)I z_KG82Xqr_64RwUZtW#Q-?-tSVNK=rG=c$n8=EEqiASXv6T*r}@C=nf_2$w!VUX!Kw z-}G!@9ZyH!ZE?*~`WHw2%`bbZKde#yIlJvF|sV z$yWLqCnp=FNsF$IvexhQtj%`0wpv-R#)Ink3F?Z_Huto|@1)mpE2n~Vm};*uOle1m zYn^f)kZ4&XOK$kucZ(7F9yFt|0ANPlQj^K{w&~0enQQBj3~f=qwDA42ZZPjQ3s;wN z_9x;!Y)%p9a^Yf67j=qU@1m5U{4pVF);_OWL(+vE?+6d47mFL-fCy~2~k6LaLD=e7=zFt5L{IEF}TX7BY zHXCm#_{Z|KWIuJBIup;g`59dERm<*AIx;+TST@P2z!omoz~YQmFiWJb-;Tq;AT2hv z|1J}Jzx}=!^!Tagi(xLF9zt`#;fiI+T8E1{rL0}=qq{%ZDDo&xQ4h)REq->6PZURG zW&NTG@nqlXwdbgS#9Z6pi2tIdV8-KvMj0@UNYlB94VLo01ao&xa(q&mu&?;hz4F{v z>XgwT#~{2pql8JUJ6sx{RV1=g{8ngjc=2JB7kasWC;Rc4J1Ai_+C<1h z#hVuI&iRLZ7^iIz<3kP;Ab+(X`ulNL1ZTYeb&WfCu6oYq!>fpt?DpYlu(Dp4>3NXg z2MFb}QV(H+?jd^Y>P)XB!EPUaEGK;ui$OWnbH*DSOw3&gD%H@h$zekhR@>>TD3{L? z9$A+W<82NN#8WRg}xkpXB#BItbAd34=@@7S;w%QLWdLNEN_S+4`;&j8y|-l~s7f)}#`Q+796D zwd(KRqa$R+$0qPn4W-L*SidmgG*G@F8jZqsHr4^gWaa_*5-21cg$c8KS`t>D4GB$6 zd}S&VYV$#HrOTlPq_2V@n~_)Y+F(g?22e+q06Yf~P&;1H0X0aS_J=7w-7)GqZ);^HY)!2hh=&_ZLy@R0yLxC5F+`Eg%2R-3I zf(L>3(Yg0W9Upb4Ruil;mvrxh4vu!EUT*%6-*F0g5TBN8w!_}8n4E(M3=0*n>eX$5 z%WH}4NRb%CkqDr8^#`5j=vp7P!_CAXqM`)FYu@azK>r5f2qs>`iRjb!ybWGpY!h(= z0Tog`Wd59MU*9haJSf7B1W$ToKjegM#MQBX2QqtJp5Xj)^s? zxTpFmZ571pJMkWODTXL?XF^zl%dJY7%|cYW;t&?2t5uVyParP3OCcnnzg0tLUm?2P z@enV-n5T{XA2bNw%0m!U6i6@|{Mb3G zd+?XklS~ixopw?3F%5+8gjCpL29dwT?C?jYP!AIyX?QbCXeahoT6j-?u`@!R@dpVj z<|l_v&50QjLxY(ivNPsHVYsfv0O^W(tab&&6_CL==kz+MkhaLIlcF0GTeqa+>-fW=U1DN_~z5JeD`apXwgo z4}o5nV5$D4H}H5@{ew&W6~c9WSdG`i1|9sbT*62p^$tFgX2Gf>6kDovRmV&xW(*kw zGh@V@O8pZdX*;jlp|l^Oj81ypCpBTHbiTdqQxJBE|Jo1aAM1&vHRCW_h`r7ODVv zYAMjjTrb&qfgbVJQ-8qlmQa7KfRCCtRN!sb4EqdanJWktlu)|ef8=s9~>T8jg&9y z{w#rhk@}zY_o5>g!K*@*!?oU9JZ)AYWqRJ9qCRm>=>7C=`QAIpotX)+w|X4S0e8%n z5fXtfM@wD7vdnQRS%O^vCgGL}=sdd7>7#vtYK|(na=%d_BGv(@<9WPi zVdM#xV$>6uqVS2h;re=xY;@dfOaxi3z(^f4yBB7j&sWU4gIE$iDBV!MsQ2`;_UyhG4=j~fKtoF#Uv<}h$C-Qb5azrlYBXEj+DY0iYo>Cn71yv9ZTCsDHJs4W79nL^H^733pMrIi_KNDZ7`D1$u{6~M49C)wPV%L}jv7w< zN$$O(w{0rd09E6fr^s;5*@jV&a6bMl$hnS@_LT1%67W@TVEFl!C^_6qk-fn++xq^P zT0mAi-qS=!{%GDax5v3q!}mqTf=A!180j%@L{uA4VkMOH)Wv<%PtLrzZ`C}%Y9mEd zjYEO6y!EuCnIN~$sV%zNI22;m21{GdFMApr@35T;l*#t zP&{L8s1;c*9$q(U@(z-r_C>Ojg>SkitxRvJ8T%vxIYuuzZB0~_*tl~ zgtIVkxbKPX%<@qI4{1;hpw(3`j%!@GN%`)6+r6mnZo^bCP3>>W1n!fkd~n#>_rQJ& zB-S&Kd}O`9(+=-#mJql}hD*uE8+}hFFy-MfMXI};T|N&K%+|pj>B|R?bfqHGUug-E ztMTF62t4?X-A-+=>j*&C`9?V zL_D3rBQN+}#i~Ctueb&Qcx{Ad2%~BtFb`%vx@7t&5(=!W^)}4_T>SFg{i=Uy{r#3n z;FMacl|BaM3moX`pZYWkls7TkS%mQY*USNsO{^?1{IjvZ^6^&jbO=wqV5%b32$?_h z9!Q8Rp%8FMT8Mqk+I&=Mx+`*qw89OLc{C=MZ{z>wv_(bgvidI{2VZ`)*#tar?X2{) zG#?yXy#gAWNsAB(MJ%F-HQXVMN0^VR#FK@OG0gB7yI}Zph$E}Q?0oRZt5k0C6e$v4 z)(F`7uxO#6_(ff6iTX;z&(A{Yo^HPc0qm{C`8XGjzAB>ae?oy>Ok;#CDq^uE%w9V= z{yjtUaY{Vdc~Ppm2DxqTI;TP>LY53lFhC!d3e*xl=>_^LF3kAx#i zjuoyzi?x<4o`#8H*g zJ$UT7dEM{To^LvOR{;nguR}dGYZJ)>o{xebj|>1=fYHC4FQ5&*{!Sc91uO9NMC!3W zN>;o|8Ghsa3zK*ds|=Bb4}z4CDq6XQ>g9R_4(jmMXUD4l26(MneRB6!z`uLCh>Jc$ zg^xGFjh3*VL5Vv!o_Hk&JnjByF(d?R#{PzFV>tB*BWv6R2Hy^;#;LOpO;s)MOJmQE z)-7>X;lRztXtgfy&KrD>y|B}|G?qn61b`L7Sj7t zED695c-kG40J?z9j3WRie1-0K#dj%f$)gt^P1UvT^MsXyP=G!AAjJolRM3iO<2v?Y z>`-9Hl#h~*UR8mIQ!}ThC!}fT9Vin;ZN$f0;ijasIpyB70HG$Z2RA}`Ls>xhxkl}AmF7ZzRyF1tjqAh)ogs6f}1<8AiF!M z0oL<*TWk-oo1C252{arHNUck<+(99MTDkq<7Zq9vwM4O?=< zM`Gg5vCZ+?$_RPk831mC0q|*~I*g$P?EsJuZtlE-#$724@SZoy;=94v9nu(XeB9c1 zm3UTyA}|~IZ4>dga}dEQe61avd~nH5a`39-HtV#?NPoHbTPL+1K?f1fy#R3iQGh?W zE_hfxjTLzbN-cq99}#F`sv z11uk0vWx7^ZZ+7<{#vHH^g||6`6FSe*ecX~qB+%bx48!b-(iyW(|J0$RXu)cX{I&G zso%4Oc;Z(iGP)d(-+7=Vr&ro>*%UI4<yBM7T} zY9guF<$u~9-wNo?ZdY)881i4Zg5p<^yRgOS6(;*=0{8kz>LUQI>sQe>u%xXZ%q_L`FZ{ti(#nyCG}oSk&=+_{iK zOPo_5ATN_nIX*GiRotly$Sfthu@O~i3>s)dNX0CAb1;Ca!-=~Hg8_^zdSzsz)(C(h zF?iz7CUOQCJcgE?{dkOu;oQljxk^u5MlZFjrQA#vO}T}BZ@qH)$(Q4yqtg^^d&ar* zfu)wD5xqgaSmxz^iSb>Nj@1ovmXg;#A60E&BQTGV91X(iv*=UwAy`Hz9%cqYkV~Qm z_^0S^NC<+lfG*r{KABrh@K4-8bJtM=+zA8>`DgW4u0Q*J3T~x&y`2=om6o9CVsRBvTSq7;>~EAK1fI(DqWL%L+U^yM;ow*U>Tug zSRaVSEONYCo*&JFgdi9T=)fx`aa;9X`}^By`zBfr93TX^z>fh2{Qc1XUD8&b57S$r zkz}97jhRk8p+8IB3(aT4E-F5bW`@<;SRYJT;ED22zr8qCJMT-t7^8 zD}WS8(SkEMAV~u$;%SOTmdy<{8n>Cpr;-Ctu6N3P=L9_tqlsNHjh;fi3Q3PjTR;jjSxdDp1j2 ze&qI|C1)gtJ{ipy<YK zJ|#psxQw81;{EjiM~_TUj%J+n&HX1;JVh0osG62+)_ivKF7xL-Fij)_OLNb1%)_l7qM+8PWE#Whka)1I~&_zAf8Jg3@O#6;xhL4 zO(mWqWdwx_AEp3{;D$_3k<<1;=72B>iYBC~U(Qb17p|o#pL&k1AC7AD;;LUfBy{S> zTXY)F6R{e-*%+^(u>6TzTt@)+cT&dT)+7{Pev$%-n;;J@)yc%Y#vw$D-!-OBv4t0r#P-6(75|RK~<6ypdX6SPa9VhWDMoZm~GT`u$f5Fh4 zB=#e(@-tnX8alLdNRJv0$}3H1G}$4DT7Q2v$d{Z7+` zWR~r=PEEc)sb6=^(L3T%lo^s40ZYi*;AmMiZ+(Wlg!^;s#9prgq5M1U-ZFF|nPqEq z``yd2`?2HsmoIu3^Du$Cf7l&;(5J-8qPJaT5kY`4XlEH0?=d+3xDp);~?q z?3H8p#bYQmRInbt;rKSklf`F-#!C(j3a%L5MipK7n< zJ`{72XJ}+E!ors$RbtEOp>ficth|P6J-%+a41{rcsb@;&!j~CJ9PK5j#LHEQo* zZQI{NqvdqU^Orp2gM0~u@^yLobxjMBS+-y66rclX@mT;PcwxECm(KYDX#4qZ$W=4f zukX0y%&&HEh$rjFQ!KIZ-bLk6N6A$@%hyqztq9A5qzqS$0Z>xnK^IHroWsMn^3dVm z-BC>6%##Vn9r<%I^k&vV&cs!G7HvgT9x2mt-53Q|YP{h>8T_5P;oEpGfT17t9PufT z%3EpgTTKy(EZPEB#K|LN5VwrUh@i!1ogZzvrEd5Rz6*FbhfePGE0D^c(%nTvF^T+y zWW+Vv4*F=m4tM{Yhitm~1?TWBH}4w0lc#WZ6@RpiRFyTh2JzjvulU% zwxmH&-GuEy>rWuX4}x-Yl|+6(C-RE)dZhn`v&KGbV|pGn*3@2CH+-*UI^@-tI23{c z38eU5(AL}_ksr|q--(Qj9U1A(bD@CR0seO_t16bEo5ncu^9~GQ&mfoF7M09VTSX707CXYpn>5o(+`O()x;76&_tYLL`~&K{DTi zh=_>nLQgpx4f4k>N}{f#EeY~6EY1YdziCSX*M)@;!!L&l$8>jVj2syIN19XJ9W#eU z+A%*nF%Po6D|;dz{HLW&hmy{E@*0Q zDfoP1+ql)KAH>zSYU+uD97|@t!xk=;T=#%cd=1+C<&tEjRXh8xLo)6jqx>4S`FSBo zl-)*4={IE@muBp=tt;SQE_|5W-7OSkMe+0If)7$kFxBXH^Z0!5m1!?jp}j|`oNAO> zveS>KeFvk30EiytDMP!uY(qP$rWD$hYO!th*Q_<$Jy{=EU#<-Wk*B!BKI6xS!SXdp zDi8J3^_o=@Ze4KueWy&7--b1?oJ6+)>14;-D-#BH!ssqH26=OYOeMS)Rzh(P)Z0T4 z^{!E4%6g5Fma3<*v>IzI3=d0UN(S=ta66=icw@sswCn2WLPw1H-Smuo|L}DjtfJtP zq8#XSxZxTOE$aYi@Yyo!OW$}>n^IhjC?k5`=Rg6q{~FN1j=oALqQA9;7x22e{o3mi`2ZOTeEgRS1qgU-^LI^Zd?}~JY*M1ztgQT?P}6uDG`IYnVl-UkxNiEyV_I7**0n^W{F#VnmNxKt^6V)F0sNrbZmZhG>k zghbdcI~#>rGhi7SH@-W-YQ`;)IOT&bU+)e@m+@rG7FU{Ka#+9LTxcdu7xh=Rz!{)U zwm9GVpTsVv7@34E)x!+cVQ1d6LY!rMC&_;?(<|Ad*wmBPLH74xvrH7+b6WbZ zg-k_8xaGy=;f1OEC-#+LF7w7J$R5OSd|DR#h z%aB-1fAgVF$~=!++=VfViqapVvXgoO22)ks6x`C?4+nkKUxXSwwlFG2`a1alX8j;J zL7a%mbHe3Y*@Zp^ap5J5gi#mj=?zwYa=R}HjO(*LKDaEfd`_G6anJ>~gc(z{9z&sD zY&H>oq6r}->6h#kc89%;n=U1$Q3`#{a1fBBq`Vz{LE={9QVGKDcO*H5X-qr5JCbll zSsM4JtlRE<|4 zo6w4|BKNnZ?%H6O+*6-c)qU0sYJkG_r`=hf)rq5i1@+Yvgk#_r-^G^1+Cv4YJ0y3T z-P*#mtg5l8FIjQ@_fh%VU%tl4dHybrn=uQVRu>EY9$8XF`v`D)~JVCUsFy=@F@;c{YboFy7&R3xi`qPx& zB17c;R62O$Do}(_Jh$K(h2QgbVBGo>D+7k-T2v$>+bc4=W034S^#^QjSM6Z- zQ%^=v%~d~nnlsLB{MPFQ&SYHV#dHqPyi!?6sUfXN(JYhG<5kxt(rdOmU~R}_tQk0( zl@3C4(tN{I@M;0gi3Xtp2^0uuUfPtPJJSf%`nJXex$s(GY9dE4btzd|IWSV^=RlV=Sb2&3gRLc7N?8EFfOwQC4IsuO26?83U~^@j zq$Q=)Xz;R8Nc81b`X95wJ^YPW-xL^VoE_!64%?|^jqq9`>pe=Kkt1LF_!r{#S$k;P zhz(S$DZF)Vn*IpseK;EI3sv_mF0Q|hx0zX>AKdoOS5;qq`q%Y0O?>-N0y&_7m$l?lM1g46Pav$o4BC;I7r}Hmix_teeXJR|a@Nky zz3B*5H>-uhzf1A>_uE>CvH$$`LH&OBp0I)S{@q(~Id@5QDTe6F%cmtqO}#5vqE@7Q zHTng{RfPSOd@%xdVp;6hn1+!gxPVb_B>GK${cy{|nf>2Wp(dv_J?2Mu+O%6s@vJ&4 zPnWWwO?P*KZBoDo~r9j#O64e50glEpc&e{aU$okE3nsKz8ZfE7u}he^vKmA zPpT{e)4Fzjddywb&Q4FLD|*5z`)OiL@$S{@n?h!t zf>Tw^>eirOM#a0YPH^_5N1J?HGVGrReB2Ui)94ENF3F<#P;8jv^tYV;;4I(ZbVI>k zc%|^1UPXcZ5RcibCahXf+5VR48<6jED-YHnp%|}k*I3T`UmE(w%Dl}Zt(fL;hb`1b zR$?-~vmuHeq-UG=Mh;qF`(Lf^H zCnaG2bL{7R6){iYDmLkYokIA%411qzsYjZa1VV^kvhZRD```HXs&o7#2qO^vtHx{!iY_aldQFj@ zC689j+KJ?3e~KXTXV0jXR(rS<3UImW7f_b)Cz73L-pZ;BBtAj5qGU2`GxyozC{&+k zJ&weGYZ&YxM}Xi5L#2VSfDVW8Ny1LvSswcY7MFmEe&P-ac1ji^1-6-EgcK5CJa|sH zO3DD|1O2VMr84F*T!kU4MB6GeHi26!_Z)NRLM8wXftCGgl`}9mvO4Nvi5G;6XY-hP zdC;G=8p2?CKa9hs`(2Tj->8K>E2AG%AFz0rw}li=i_oF0B9buuZZ6E}xQ%1~`QzVy z70UL#M9?@@x8eFg{Ml05ANo_Bq}L{VpasMJzbbb=M+22~E&cRnT1D0_TOr9gpoZHsj8~dgE@Q z^Fh{AEAqTk@$TOJA{4D1=cZ>VkO2Z92zn1%nyLGxn#<^v){_;$n6=-05T;xPB%Dap z)8y5M3CdD5lQjuk#Uee?{!l7D3VaJZ@Bpa;PsCmFRkdmrIhg_zx{-+fmE-!qHsoeK z>L>LJH`mr(ZvEF@&qhE?20r|h97R9m8u+y!NFAVwX1|m2+<&gbezC9sF*P$uh=c>d zwr9g9015?NVSfw4?wybpUc<2M-B4a?^;Ee;j|D7##9U)wYD5^Ajc^U@Gww^9ygz%noB797H5!3V|@(|{W z&%+4Nt-_f9!W6T_=8JWQ0WsVu4@JNoM&r{deMkI_%Z3#+YzH5IC{Uxa?u{`l+^%NgfyV*-svde?YRaKtSWf$9Hn3y8N(t!DC(gD_T zRdpS9A&|T4I|=|YJ-U7*b_CHn(Mr%6NtFEET`kmhJ_?Kq+{g8$xVE@i#HU6!y9x8S zw0f)W`OD^gCF+wictR=jPrf1=Hv^&vDPf>@%rU!+VgIM&w-OaTY32Try1qK51!bK% z?F`b(u}bq+mf_+sA@QI~Ke2dj;oefJR;739VVc_MFkr2a$d%1aJ+tmtN$CL8J_LUG z)2E4mPI~g~iVk9HK>Szvqfza0H3&GX`zV;J>Fjh?19}k6lOgZirFU63U%RWhJiy+2 z`P^zj#vb%w@jKh)Z|W*w|9`eOu`j~CUJ7M8Ee*Hk1sTV_^4KqjTL~^i9pl=0hp5|I z4c2E18M^Osy6U{_k`Y`g#Y3>Xvv!dNcFsO!4r zNXcLkt`-W1J#Fny6P&-lYUh;8I0>3ErSp|s&X)G#jw(jToUg{_s2Jpfz%M#;Nb0LA zV&48dtA!cql*1j-xh)vZa9qg^Xas`nbSNvm#?&1>@hp1t#Di=u=wOtw_tH9m&|Xf{WtLxX}+5^i-(=}y(8p@p+S=?o37ax?Mhw?WK4xRwdonrSZh&pJ(uju zys56v)p6j3vqz)kcyV>UhT;3%&wTlKH!&n!ZV5yG*}yV4{tv-D*&%HshmMm|$16HJ z$mPSG>lgA{4{6Y@>(5&j4cc>Cd4hfxq;2Cp$4KAFs?MmlDLDjJ^{l~LdQ1BmkhG0; zpCH4>4n}m4tG=BZ1M%~HzO()VU-9zJ++Ho@=q~L#LrC~+{X5&bUal4$JUm}nCGBAB zy1qkywkS&6lVFg1F1l`)krrQPshvA?Mw?U74)l#aSGE0;YqyxR`a6rJqL!S}Y)9;= zeaj_oS3_Em>|~#MYeAW7LtGR{usb2H!P517CTH4+j@Zv2fm~5TzC01!k3gYJl||B* zUe4tEBl#2`jpMlK19?;G2yv*6vs(7HZ_Y%APTQysT!rZ1r4!&;Rs`~L>dG7pQ19Z7 z->zO3mju9b&$LGDM7?{(R3Ue|MIf;)7q=kEPiA(p*MW1XHeOCo$nClSq;} z5H5m^r>mRlC}~QZC%p_XY1Ox?q*DhylH%ZfP@9X^1q69T+Ld@4Q17kn*TH@9`OlWh ze!j+|zVzip2T)xoziNfxH7Jasw}7zHC4uqH2W3JsKO4ydKg}}cj?H3h1F<6px~3y+ z=Kl`k@y>QsT#cSI-?*}N?M0pOoFnS^-d-*%fxAussy%Ntm&;v?JtQX!MFE9!eI&^S z`6 zxTOLj6s4kREb9dfu)w4Sm=@6o7G$@>X*{IzK7oKw+LA%NK zmWzj+suWz;d*nf%M$iT4+2jIbZqyY zm_TLaBmPOpUQ4TJ?zWTN&A=Ph;zjqU77#f>b?kBWZb*Q)*vXcW*w<2$G{-I9l5GkLGd9&4G2-5S0f*u5_9rG zpvS{ZG^6;g_V1nU_HN~AKEP={lui7X^3~x=sCF9ggEC~Qt>5$XN2nK%G*PRc9O>%| zsCUVAfrI|~r|Z#bz0h%lz4smj4C3OWmmm9)Q#&?B{V}_vR|K)@J}cLuK2_QmbP=Nc z?bkjg&p2?2yuvDBDIN0kD;NHFzIf+KDLUK{1-n1!pB{y@1FDX}`kGZm;4K%ixbOlF zz~k4i9es*Gm}}c7GYleN<$IaK%j}OmKXR8C>Sh5j+9%NCPEVtb3n%E#pPCVx5Vq?B zfbLXkhr?XkX1!zmwUO7#>e`Oc6Mt&Uws+1sG_eXbF3t)XH)BT6Whry46`Da?qIq#B zGAqF_*AWMVhjK?{)e_Yz;qBDriUO{p1aFs%(gT?BEe=ehk3JP2r!loCs|Tpb;rS7E zLT+@#h(r@w0|4P3AkkM&tsiYAQLPw#8DSpg!*NC(BHF#+IHg^o#{fNMGDhK<>dN-k z-{ib_x%T=Fsp^1UDp{!c^KP@SM0xq+QeLAb@XWQDnu;Yx*r?lpI{LjkfYI-bCG?Dp zdW*24emT_}e+B1x5$9>1|Fp?3B3gCYl3#)Bm0HZxK9%)LJIz9CS`3c_Ar!tND?xjg~wlnJz_Feap!rIk`UaJi`b6*cC+u4qkX@6w7d7)} zKUx5g)+}+gbNh5`U$VDkd?dQdMKRA6>(%}_=S~@%t9VGb**9~%K?burjq^-1qm#{x zz)3sH_eL7Gkcur5ONb2;`GFzMOCowTnmhS~AxMuGq1m`lp3mqy`%ba?!Z!BE)L6S6 zOnTJ=IBfKF#pxbczvlweTV1F1PCeo0Ne=v~k9rGFj};DoJDM-3 zaq9;s@NJw3{4=v0ntzX0MOH2j3QVO$tsbO#LX(h?g|Ikdew7Qs951AS}$ z+x$1wIr%bz4|v2_iXTc3F6C75s29rkNF*0GMZ6J>K8Wutf~kd^kJBL+LIU-JpzlI> z_Ll|3<$6mIuRw-p%0=uBV{j4LY($24Hlb;ntHoT=={0#)3kjfrLFhuf(UedEY!y<7 z9~>mbY^&Tq$VCidAe*;!HUl;oo)z`S^3$pMABuZz=?&g)Z&{1&OGXWL@yn^q{e0;v zR1JL2`Xe?G8LHoH_VrB+E5ct=3|n)6@Mu_XEcQ!9;vAd9QXwRtKVTPQ853Zh-o$^D zPltJMRy$7iC<(GGud!aFcaIEbT^l8CWNReOF8j*!P#3iR;j{z_>}$gaOEX623`#^ zDhFj18cdHr&l5U`g>K-P#^YEmjl)F5-#&`p&jsM3`-w3X;);s7u%|to=!90H%Kmx& zfTHiEfeb%~fdp*DlT`g86ItbZ@z7fC+gR6599j|UDzjdS(rvX%jd;3%4eyw$?o`Ko zO4LW01_fLm>%adUC#aT>^kjs6G}N#DeO$uE6s=08ni3h@C{=Jcem*!=rK)T~D|8e3 zErmriU!7*edZJTW^xb27`yU~1cN_M0y^z}TGjT5HzsFz`v#C{kD23#X1Np5Zz6o!? zay%IhaCtm>C#0*8y0%6}zR3k)Fp9Vq5JqEDO+OTRu?6^GJn%PfP@&Yr01N!hz{XBmbmS~cB^`}3 zFUL$LV+G7yNi&_2@Wx`k`<-`62<;q!n)qPwLs%7C*yvPfql>0DVLIj(xVs?sfxZfzdkLzOUZohQ@|lgAo|iK z0Fx>TJ&l`u?=qpRjPL3eLzQy1WGJo6CsSv#*Y65@Rf!Kq%CBT|yYhP(O(IVFK;t@k zW23`v?)4;33?xsGJ`uF0(pgc9dR*ouK7I66s1aC6b|^uK(CZ)SSsB1%2_#sG9KAc` zBg=A#ziL@#iLNdsSi6c%kanSKy^dY`KRux@S^IzZ5c%KQW6h$>oqnR|i_73>Xm>hY19g+68%1rqE%6w4*zkn17_hfW zt5+O|2`AZbxyHVN zF19Dd`kmj%?yMDyQUgmyNYH#Wae1b6XVve-?i=&F626sq10e?Xgxqxz9%47bGd*WV zr3zBdmYF8A(S( z3T*A|H%8%HMiW9w1LZ^m0^wZscZOJ2N$632O!HN>Nf=7e?2Tq~SG;XOW>z=vTRwf? zr@x!Z?lf3WkEHD9=@5RPLn92K#h_q#v3WQ+01`w_&nN^2eip#s6yFNtAyRy}MP(WI zrI?9K(WTG7Io!^z?&Wt3V5TS}zj2X7EV+~i)N<3_n)K$AgAlYKtZf*4-%zhqR<^Xv zsr>rQ_{FL1PS0u6#icO&Rc*T0zX%@f_|+SVf`40C2iIY}dwoqilm6F5AzE_L z@UH%$oN0EZCI)*dAO(J=OZ$iKB86%G+vb6Uc=?!o?U75yoBJu)`t@`66Kr_O>w{zs=`AVH6uvOC6VtW;+>nYRuH?72Fg( zrFrAS_l=vXQe6t%n~Gje4VDb|ci2t$Bgb5=Hx|{YE7FF#=A^|J&b3{18XF&_Y3@I8 zMK&z9>&viHGW~*dFV>)9k44st7VW#@#zLw0ZYH?1bq~M+gPc$0*hS!(?L_e9Bk&ZC zt5q_tr4~1?w@CxRQ1a_ZsO<;UjX&5?BJ1A!Lb!5;TK4i}+;(`&JZ2HRW*tPRCs&l3 zUc_MX_SSOvZ;UCNur>$p$U3xE$i&wZQl=bZSZzprQwf1A2%c&n< zW>|Yd)ywI4e`O)_3YaYQC5fTKm8;bf8Ol}4L|r^Dc`}-UyWJIHCHtLjky^>6+Sq`d z=+=X~*LOM%U$m!(E^HqN`c&v*v9ZeesdIn|#*Ok628$>1K{8>=#HUa8EDHq%@{f{8 z9Q-SLo48+o_jXPDzYOs)tG0|Ip zP}A`$pEZ8otHD@N=grYhSB2S4cS*gJ zp~`t$e@?S15Vjhjt3>?Y#z5hf7}!f03ua1+B0SW_D9-iWcoU1K3qd!OI_{+H0P6Bc zU2w~Qmhch4yx0g;uz(bjVh|CT@pi$A+p}AS;8_5G4N(Fy0l=Z)Sp`t-X8CBf*G;(t zK*GQscb_lG&J3+=-tjSk2?66Hb*3r`>I)EZ+RgIJY};244Wv>9J2dwcl?!;b zS`_gGI=tZeRM?mDFY`)lvs9uOb*?mwb_)VD$n)F%SY0@7#|y;kOGiXkZ}A6q{vUiMu4NW?77*R5)Ob=i4s*5_y*_(9yWb_jG#PH?`uzs*k1H z^(f_h#D6fD!k)0n?}1MzwO6Hie;~_ULjXrWxWAfAXKD*j?!-oR4glb(ImbJQI_qIo z%))>C9shGUQY#%$hYqLaA>>^LCLJ|_q}8%1KBh{d2qo?Z>T-Ij$J@CI>yN0Se0#6Aq+SX=PbzFJQ7?}%AAXJ)ju|37A5 zMJxEf=pjEdiq;{;xV3C;{bH+A26HF}a%+|b6`h8%Qw%14lQEudv*0EI^F@eakt+QI;Rv^#7oZME6Ha4^?RfrlP92Rno|DCQ=eAehAqe0~26@>F5(l3skt?K0VI_%g?jc;U{v!`n5< z57Cl`=2WBj4|@M${xsECn7i9N-?zSL9~8a&dg}E@v!33c6xBSPQ)^B)4tcjO&52UH zkzEdYXVbrb);=(A&z_`;&3k(z{_D^9?-|upMdJ;eHhEk-U4dT8Yf@K}1Q#OypZ{P^ zqM&J;rNq`0`{r-2+XC2@p}{7n>$I?cz8q(Rp}3oRPvB=m__>9JRXWj147M4A-ly-@ z!JokZv{wc~xn=OY=cIoPG5o*qud!CULVsBA?}Ie^^suJZi1P{73&+YB{)AS(;*s zI>pC0I$>&dTxzz_rus1*I><&j=Xq9UzMXHTr>rKi*(7-w|4k9@s z`8BLD1Do$u9`x$(FY-m6>|Td;N;uhk5J3E`Or^XU@-gJ)z=Wx_n9&Xf3jxTl6_U%A z>(B#fqX2mS6s_)glPab}Ky)b%&QnRnlpOdk7qcV})aEo{ERzb99`F-rf2$Pi?@R63 z^TKPFD+d-n`Y2uKo|y-S!LADUzuPB1zr)Sl_Qi_%?9ts<{{R2@vdR5j$%~-Rx|EL9 zAPf@5!fb_4FX;-!6%ZS>5(o(24_#@6^f+2dItyjj zNdPj0K!D-LmMpB11Wu^853{*0*Da#f-O8bWjdkB)`Ep8>{@33)WlYy?qKqK7^8IQTQTea#MJVR=+pY04 z@Z%zH;a(ff^-7}C_35a#_W$@d$`cwLjQBA$$y^tASTp2@KYtj; zs|4fz_t5u8X8u1)afJGHEB@uruRHNyel}~a2Jw4y%^|NAG5HfCn_`|%2{D0${}_{q z{B3$KojHx#hD@TlVG;)Rb^NzBG^=zUlzuVvvlk3K zgL4@!S;V-BN!AVmPhc?h07)cFyG#VEe|M)nj9ScVsS7WIHI=(e7+ce;>t%wY;^Fd| z{XN8*3f`Y?)v>wDgzrR{Z}92AAMF>(bmhJep+nK~|J>3elCjFo4`GtB!Wrdi6?TL; z`al1?+AS-*6k+QbG=^?fNeaMyQpIxNN1vXoSUBV05OET61x6a zqz^RH8B=^WoIcsA8ZrR3kk&VHNaLWy(CEbuu}}Le{#h0 z-;^f=OB%7bIbTbgw`8{?o9byb1dKRyy|y3}AWVh|hLpOfZhwkjX-1;k<6+PsB3SNi z30nmX7K7E&jqNX9q9zd{#-E1s%-=9vooDku-$u- zjZb--l=rtol<4#xX?@TrxoyGWJ1DUM3G(|1`UGqREJ(Px|6EVt@eF@8vR4{HVfh`4d0P%8{@WM;V*RfE? z+C7)#tDyB&Rp(cmKftTCL>;#-M>vJv?iDZ|g#13QB0L-rBhnNmMN}iLH}vaB)qDHQ z*|5VJ9ik4G;E{mlKRT~k`=j@YSARO`WuS*rKe`&_6yA{o97Xy*U89>V4rqJ@dU^KMg?mw`BXnn|NlY@Jb{``RgwL7~Rbl zd3Da35!FExdzeCpv!dFmm@6U3>#l{Ic+v`g^<8~w0-@k~uLmvDa8FAnhCtt07UCK? z^iR?~ohiAVo)ddHnI1Zf3$;1cowvAU*4D=Noxhpri9r->xjafPLGah3&WF2^V3(}> z!3Wg$Ctthz$V^j`4*z`GI0=PIYdZoT%cI^oGI zcpG-@e6Wg7ET{muTs6*iqZf6u4a-WWR~`10vY(y2hikF0p;>45Zq3#xn|v8tTPs(~ z3!YopyI*T}7XDPbgp@_G)mPUd-b$&hk=|@gm>eyOk_2E_Hfb-9#rI;$FA?z^pL`B5 zGPf9#ko46Bz~`&Riv!qm^~+|g9D}0!zh5f+4JH=ppY~WiKKpnur*X@?Y1QyP6{5n3 zmNY@5d?ck1(C_~8ETMIX3J*iA%dd8amsO#b+vDwXqVZ@=kjmWo-wgp;GN$_{WWG}4 zb6Pg>>GBn=uS}osGHe?qOUGOmq}w=!L-OGjS$^=PRV81eScIBc(|$&N$r}E3VHYvQ zYf2p#@O54_$rQWBxv=`!M0|a5V)s#r$2BdJw6p#AlVFxnFwv{_5Bp!L=fTU3_9*aC4hlDExG7kE|PX$NIwHSRch+k{5><642CAixI8NO;nD%obueyv zSnaII8sHgohdfG_rL{g{d-MKU0cW^)kpo%Q{(n_6A(Ad-0WS@D;s!@x~F<8t>2vX>Yv(90M4T1V`<89AyOQ_OsvZQ;uFAa+zxRu{GEi8{ zN(H%OM4{1AVxYlBwak{0U`p2hV6^rSWRzJ;G^6pqC^W0?&9h^-&zBz4{>aKoPw%GH zYh&%K#c%)2QraI#rTy!+UutW+jNH;ximdb+e7sqlSd?+IQ?*($_@lHW;4UB$uH{nWS>D7Nww+Mlg8?jbgb>OmB;f?E zh(cB&{p)vxvPxd0nCjaoxU{if!UtCI_g?F`fXf17i?h45AV6HoINwD%F(zzNUZh*>{X~M+PMh)4b-P#l&QhmdZF~K( zB%R%D!c56t+_tbVRkuRA^QYSrBWG=V+h6FC)EieAw-vvqq*f*X-3>Y@l;YbzPFiX< z6jCJQM6u)Ev+czxwtnUizr;m%=gkfP1}Nnife{Tr!-Om6Jx&E+J2-ayiq7sa8y!1~ zE45O0sGw`?Sc1XsHks{r=a=i{w$ML_Gm+}*D(Qy5e-* zKRo+y$Hu*h9KEHFrbP81UkSpNt=rW7)N(gbx};c>b7lvi;;!z_p8fFLFkcrpM$AH= z?vniap;-?_j4>(BW&IMld`eh~QQ`9}IT`8axsWF(-~2^M3V;QKc(KhO*b^{8_wfTF zRQ|;q%T3{C#vXO3SaJtDY}$euL@(*g1;D;G>W<`~ z31Ln029lV(f)e={pKV(S-+d<9qV`9z+UoWI-7jd(ZEUV3$qI{M%j@sfv2=f%YBkwr z&_M=`b_P0P$A}t^oTDZoX4}z55>en9xyh)3!?8G8D*+s)&u(0&?^S0 z8NR$Km2N*DxDzzp9re$ysT~*;iBf+48o` zlxy{$(1|!h4f^#nf5!W+4PL^u+rD^Pet9rvJ$0Xa%OWa=lb=`#{HiB?KiBcJ@G18$ zHpQ8A`RqzqkEAA6?FN}%pBB0s?TgNqIVj@_joxN}Nv>=A4LH+n3xz>LZjF^uagV7s z7nF`g3`Qh+BHJOxzCD+OHeu>cE6BFE?mAd)G7+_97psV$j=Dvg@Edz`;bd0fBxrp=!XgHSi#w2IL>!%e~O%Lkf>zr6ojm5o`Qu5T8 ziO}+Y{agO(lEiU;XA2UDJN0hw-`?r&oEKTVG~D8#Z5RkQ28vs7wB8ZC2z`;oL3vF; zcSBD-3>awqfwF*omnFQ)Fg)k4@74YM6v61ObTN~h(FZ1x%1SxMmDch;ttz@9k~k(D zn|bSCm~^$MZ22J{SAcRf0v6FVp)cPt2*Ix2-*rVM2 zaeyM@iV8;|lioJ!LKG*c&M{4`?UQLxVOvc$f;}x~duQ15yI@_55-$1@ML9yS`jN^! z?B7p<(46eM8-rai7?^#vx2%8hE-U!G4nTAD)~)r4iEy2JKC^auKvag}q`lA_`Q^^e z>-;kB@pzv$v7FU#CAKC;TT{@~nMQy1!jivdGk118dL6fpNPVDJ`DbMq+-?l^0$k^R z8$*=HNk@Bfwh=g%4=s=F5#D87&A$L5MV4NILRtaSs_#+tvf|PZNn)4A<(8xwL-$s+dzI)`8}xZxc(u(KD^vAIzlFq$??T z4s7`FR5tpnK>N$A&e7TPMSgO{ue@As!{jRrI^%R{nnjcS*48xwK({uMZk&*jZ~c$% z>GJV_AuWbiJZ->J*KUurB`v!&K3E&i#%w%CUlBwA*J|a&=s|WsCyWzgDVUF}50flP z!wE8qiW3pS^;HHRkl2d8#4hnzP7*j8lT@110y>)4Xz}QKPxQuOmRW!C57XrivA!JN zEET6a2c!W7^q-y`5w=8_VEh2vH-5o61?qZ!($E4|uk6T#kvv8~1naNQx_(NP_~;B| zml?F+07+O$^u3-x_J`fOgw?;{D|nT1d|uMadXA{A#tz}X_uaX-Nl~O)Q*m%#&$Twn z9*?Io%63MKqC1PLuz3mm8qL&yR z_(I$bHB6!H0qx+Y_dfYwmo^T}l5_8LPY>U3UT(I!ozAR2`8O6a?33&NO9B|z3@NK) z0Fbi?`vqX1oTr>*UeMU3G6H=AN^1Y`em^{r50_D#TAedwoFAH0CB@Ex4cAU(BZ`@s z3fsokwye51MJ+Hih$t|lMWd#eC`VIa1rU|hK6&ACK0sB2i5;n{2RNr^ zr$_|ax1Mh0?>mIo(mn)vV-XeRLO$44Dlm~1IX-hZmO3j zDitwpM*un&lzM2)s-&UHo^AT?lL!m`v3l!p_y7lX6-?J-0bEsNi4?iHk?y=bpMv$p z_eawq=?y-0t?lo4m*YiXNMR*o>>EF?HQRY$bT$an>{00Iv77XOu?g^S}zR$`=k ztNj_Fbs)ko(#*FmZbm3&XavfglFFDc|5QtJzvixP=!&D;xIVfuZ1%{NAZCUxs5Z(v z!va5|?$_()HdlgPv*98o0tTpE^#l+4cA8e@^&538{ycbN{bmzp^p0;2!N zF|~Sim1+`yAu;Reeqp)8JZ5L#47#nPS*qkAMBL1g0<8?Ba5 zk($wH7{O-g(ln>ASgm1e0*n%fTs~5W!a2fq^(bL`t z`PpyZU7jyX`X#^^{a+a{(J$D;Uy)_6SHPr4C9}I{=FVaI8lvJ|^MkUdC9yqovjwcb zhA70xiBQ5L#@IFjBxV%`MN!ARi-AEPg*UhC`WhT0#w$S`7pU<5I#VKa`fqSp(=}cp z&-~m!8fpAZCC+k`GFxxXC!2q+C&lr7-6``nDr+64dMZh{y>d`3sA?UQ0q+Y4EMyPH4&l@X zDRm`%9b3CLqU`=7zv7Z){g+Y~}?0}s) zHknQ{S*U9sqL|rytt#~lXyY9d*QYiO3$NNM+X;8PLozW0Rs)vk*l-1Mk{P|6sbGS2 zGFAU^c2Xk|Abvm1#uFJn<&>2`%avx=A!--wTt5S3@}hrY?&RJn1RRhzKm1^r`C9g0 zBJtyrqEXr*i_L+88Cj^7xo#%P%cmS+oUOY(htCb%b2J@)y|*g7INkWX?ada z>|6l8PVi;x_*^*xc$My|zVEj2QL04UEVL>OtwyI7X%Oj0wIQfOoXlGZ!pFM{Uph8;ctp=VLq}4F0Vy5=-75c(Wf5UbVQT zUdL!ZOsMvibezt$YsV43Kb`6kZQFCR6a-wuFgSsI(cFkQiC>5mT^`}cPt$I$C42k9 zf!J%h9#kM|s%?YhhnyN1P)#^ot~aqM#xsLE3khM)bP`>%MHfS-LEM{eYT1wWMHkeqwZe< z*%q-PAOQVWL-$j6Xc!`M;u8oML>(ng=3#6%ua8elH4y^`;m~mk53>ywNx;_ZXj}Pv zCK6>o7qm4zjDx1gd7h}{rs@fhqA3)_>u+MaHS10u&lQ^ib{I!Z9DK!@&V|`h-Dv37fub<+&9In3AwU7 zeZcr#-Fszm39naq=klI9$0KM$7g&gk5+k&I?pFfIDv#&e!}tE^%Y=*S|E>ay3_9zL z>8oKUHQz0ieMP5H!Z5SJH}M})xxk4r*X?MY2WmKDtq${CmTtoOLmc4@xs%HyLUSwS z-`X!>!46q(#b*4^7r-D$9|WsHS=@s_g7V(f*f6wzcgNnIyA^bu;ppJO%eAvIs9*wn zB*y6l5V|8&U}`SNUwHdo&C*uYn5H01V0*+!f4~26yCF zqc$j&TdoG7TS7I~?a3;5=+wr;3G~5Ne$3yONzz+`2jvKPCJ#a{D37fR9D=LSzs=OX zQkbtKs|aJ{wt`S-q|S%=h(Z~f3eN+XKi^2h!Fmgg49ksmy1EK^K%GC~o7z5+66FEg z*Cm}dF#?T#=tOo4RLDcESSZjmTA651x|3&WnL;*2B!~8R7n;Li6O(F|6l_<8^{V>9 z{7Xld;97Qbe_@>PR&&2)h}UQq8XAmMna>97v>>{)4x+<$V?EJb9}O;%=_DE=3YtGy zXxDG(9T?PUru9l0>B}!DaamB@rR}=2xrHe)w%PyWlI0ea(~0AQq!sotv`eTT{Z-OK zdFNK7y+ye+%Ndq{EeuUfVdEU&q^o*&?JA)kFx~7Z69i?0m{-`*|U^!nj5$X+MlZ@($ zwS4-1#|V%2IjO9ul@q{?=H&2D$4if!IhUOYZ<`-Ii#O{ikFy`{h?4Krlal$pV#$&TCP%QbPDd1E^llG4^6C1aim3|AehBdB z3LxvhN07TrCZ$Qt*^xVeb;Z)+F)9fj;Dz2`?4hRsNc$gRor z)lp)^@h($wB%IuDes{KT|D>I8Ut|89s684aIQQ-Ok(R!(klgE^Z@roB_V)+loBzk@ zQ2eo_{zkN1pR5-JuDOZ>eW?FgUU+g3wUt_%#yTHQ50?G;v>LxTfbYDG$oD+~X~A2e z4!YRZpiv}&^N0Yf8a7HBk9uvrJC0Pdaae^Vo5V~^bm z^HM;;T|1PxwC|3JTS1&!R^{3pWr3KmyIo9CjO3fH@hBI>Msn+=nIMuc=n716GZAt& z079|?NO(zKVkwwXDz`R{Lbb|*4dm9cqExG@Vq853F7(DuTPCCMx?aLcm*5~^@v{E_ zHwjxrxtBOuP#`XX=(i@LXz$*-U3kyx>4SJfeXE;I?TCncdhwFBhl8;L#O{XG!S*oe z%WMp?{I~-rJ+URS*|`;LnOwU#*_waE94JK3g#0uxthU};u%~{|H3&IV-%?dujwl|| zYGupgE*!nwkOPS4+NzSAp6Q#t@#V>G?}ewyVLgqzJ7RGonH_fH%~O{$eTps?SWm!z zTvjEM%uW}uYFfI$?xv5_!&ZcZ8URs0eLG1HiE@ej|wVxqDeZj%5I_XE7T!^yUjq*X`8lY(EdvV1_moS25z$0ub?&^+a2 zYON`IZiEnLP;;MA!;W9NuAh|;PARPm>8I0F=bgfyyJ2!ZT`U&xzwxn^Uf&a(_4=-V z!9RAE5;-2H;Cs{PwN~0l zhM}>BU4nOqmo~*Xi>rm$Q;M6ak4I>7r>)PNkD6E_pdNo7@!T63V+rPP<{{!KO;M~O zNuIS={YvNfA{le_`fPSxo4)%(aZee|VB6UX(hceI-R!H$gXe})#Dq86K7ydDT?|U{ zA8+WrD!VPOef-hI)y7bFu860WK-E^>rpVi=lyW8n)^Lv&5ioBe^ZJLfzSrAcws$K$59<_{6u3;3VP?El?C&@{H9TLsMM64EPB_wN6gZ>1b3f-t1cM7$aC$bJRRKaatE!K9smtlG-Hg6ycoce?Ewf|4m zm&c{gKKpS5v&f->F^mF>8szV@yHwLGTf#X3DxuxjX8^R^%Mzi0<}HHgSG-`Jok2k` znOCcKD+K6czdEb!e{1(Y_W1;p)oJ?p^c;Z&YeK@5|KpN2wL#8PHnhV`4XeAx0m&?$o{~j*OrG_9rV4*n zK|GToUItXTV%U}2VWk4zI_2vlq)dAcJdFrE{qe8^y(6@c0j869RWLy!|a(H z3n@S3cXGUcj^x@ic@|Q}jGP#jsx{{kIo?&V7VS`gyd-#mSuThzGS<*X0`gtaa6v?(p>@_&TeQCF~mc>-fOs8Pfnye0@YmM_C9qA2piKhYcPkwzX{sE5 zOtjgLS3R7gJ|amE5ULU@46HW8!<#2ChXJ8P?Pu1NWn9sI40XPrE}cD(i3n(f8jWzi zBX3;a1tm>yex8`0dc91F%B!|FkF^Zg>0UZAO#Er zNS;-UE48j?_gPOYqBjiRDB*5Hm%@jJ>qVXZmOd+mta%S#T)`>GXVxPVq<-@7_s?CVm4;B9FS3=^b@+*9ig8yTKr=j3u1N zgE_LxtuXXcr-OBfj2o}`SZ)U=;IT1nP zUH;w%bzYu)oILM85$Y^kz{ZH_f*xhDZ?SmurWu%zFzRg3Sr=)r!!Xun*3$m`N1ao< zuSv4V-S2?D=o;O=DoWK~yyWb>^U>gv7WapX=l1_CwAx9G?EKsE-)Qp(L*zn+hMyML zV1#iXl3%Zew(t?Z%efa%`d1^C8XVnJt^d~5RrX!+u72^$(xruw>N*{g_yH^C7U>Qa zcezRZ*w}Z8XS$|ZzvV3qaD8>ltymJ)=0D;m`qEXKp8wJR%TOB`&idF=hVT37Rq+Pl z%$WJ&k)^>cdbB+FQ`$eLN~>wxCLzP|{c~aW$I(G1x4CA{NX7bCuJ@Sh!Jc_>G>6~u zM1B^99LGb~)xBP|XhnCeT<%wQ-fd@Xbee;?y3Tg6lgsX&InFCPxsPj|8{t~3pChAw zAqN~;pKJWe(+720j}IiW<&PzHUw6$nga7YLUe-;G;$uK7bphRz{ePbk&)QiaRSsuY zJeS;m%1kcrbGhXoRHv*48)}aHBdb;{N%nZUtJLS--S*PzN>9y!fa|Xz645O*`n<-$-<&s#r&;L)Xu<8SKvd!>Gvy_Z$?DvgHKxpX^r;%WqsMKB|c#~uIP zY-7K@qF`$5k3$U({!UpghRo3#k$L_?IxJ<28ma_sjGh+mvT2l|`LzX6Mzmo0kv|J%7G<=zIOoW_<~rH_QTV_}ruKZTbNP7yp*G>$+dqw*1%Llh%tkKaZmJXza!jh@CThQ>vezHzxh#^F~! z*@{e@k?Zypv2Lj4vpxTk8j=)44JU|dsO6Shuot1whW~c?$tQ5k)~b^nKc1xuLs-7aKgoUEwqo30q%dvhJj#pFRe6Tz;BiV41zRdbF( z-?W7NGy|{v0r-e#a!NDu5ga)iuegqyY9DBP@CD~`@*=`SsEhXI;3If#96_I10*`)r zW%Xl1$`AQ0tv+ey_4o%4gAF5*$N*DoK?vHyZMjD2K;p|Xo^%E{G0Uxufs?gy0 zOq26oU%=B17?u~)UXR>@NA^M6v?E`8y`Lz#&k?Y|aPi80N)}F}A?7k8(Xw7G6))Sa zNk5=h>2bA)3~IRO2N2cQ0w;OvpCll<_8j=NwOXkUnXOoD3*b?|WB%S(*9hv7pLRxR zbl2V4m^fooma|Cr1PX2B^z7bnA~QLbc;Rt#=Nuy;r@b*?d2-4>zv`B)0D(L#n@^NT z?Quo0g6Gr-f6q*^ZFIDBx$HvSTMej&_dsMJc|9Z#gnllwwfTXt2PFk6XUxsvm&Prh z5svH%6L*C0nEsPz+b2Dp+*Ce&nxrQtfhAb`A^O&8mtP+sG!aptQ8+AJ9->M3uA}^# zjy`1e?vr*%Wh}&pkou1fpYxN9{?Tmv@}E)utR>XnQXJd!7v8kw=scT7EM;Oreg^qi zN<)F|Yk3=UwY0K!F+<1^f{12X2vbDqTW52Z1-M$^b#Hdh5_*B9mAe-;W(BU2zMeaR z0*WJ_|L7>~YE>foun|jt+k+RJrI5ukJvx-olN9nhP0oidJ^bIr35yhhd00B1q;1Yv z-TT&jO_Mdl54;gn2h;+NY`eIcc5zylQ9iY=(hAvW#bFbHNOt#qO6n8>NOI{tJe|HI z*wjVR$)W4|PoC~bHTG4?c0GFHx(w(fHuOSEg?Z6*>r7?xuMf=Lrsw zZsxITh6`!!3UVOQQ+-V<`V3b5!3N~#4yt*~xEb#?3SZ$|@M>CmxPPu=>1nTg0po!` ztt*WcxR+i#{w*RQZGXP-O^WU4x^nX(4HM%IC%RQvxtl~Dy=7I&S7cP;bx{@Ik+bLl zH04>31n%mfKml-lL;Ekb;f5J3UdBSJyLuRC zUez;IQ~NGXj*b0D>H3QP_@DTw>eZhizUlQg6lDgO@R=Z_i4Sd>$3No}A%Wx*oOpTi z578rPqJA7di;8%mPqLs+p2c14YjG{egR=k+8}f~4IN+zL<%{+Zc{NY&^BLT_=ja}y zE1exv5V?KKckchmp5=Q9JTyLI zqCU$Q^PRF?uZR2J?sa;9V#-R-^#0Z$5%KSo7JjnyX*=IL-97BzQ(xE|bp~HFM)l0q z-QE{0S>ui2(Pqs_D%g{v%8Y|m0Jj2$<7k6X@@yP@`6BApiAN6l;diM^n{Ph7{MMS8 zZP8bdM%lgA-zo&wCG>F>N0ET)<-&=pnzq{n5I{1gvo&As*rD(&grSxf))Lk2u2h;fpK#Zc9I89yBn#%;MzraUDrNeD~FBtRuX1yeHO~jiLw-qh}Qy7zlVchZLd#j{f2jLkQjl8LOTopcYL96fSBLTk0^;p^d6hzYC? zm{cT57U$%_T0b3+24|nivLcNrPe=RGPgg-Fn8Krv;)G3NNk%vXSd5IXRnRn?vtAYH znkxJ4$B!g)>JXz{PDV>_&&A^h+L*BH3_lgUnQq0wrr1)OD}n1Dw_446oSAp@9(_7p z8vLXoqy4U~(%i5(r^P;&`Kt!9*80F#yQ#D)>f?X`$n;Ir+NKj9!o>w?vK;&zrHGH( z()LI@uIdm(0H`EaQ{KF16r|>ne>prj{|llGh5roZo*a$$PnjMv;sSEaYmz|&4k8O+ z_S%4)G=~4|RU3-|oIn(_WfK{X&4Fj|7`E8b(~+Obj-ut#XY0*!aw|D2CkXtQ1NxZq zk+AWM4kZOE@-rwfGpNjd1#!Qpaux+8SJCzhyI+v}|F=OzbGkSsT1{iOrN_g~fw=9xGgiOkKTslp@P+UJMBJb9>K%=soIWXhs+4k zc9Yg2Fvmfh%~VWu8Sw~{FlXUCpV=`))WPeCIKFiL&m@0;l{xS&Fi6@k<`yxd zTQOeIV6hGp)Ml)$gs_r1`K^K2f7dKEP1u0E`g{EnLUQ-_PY!?Hkh9+HzGA!Ie|L2B z*u^uJ@UNvDGL!i;%S*T}5Jxe%rcF-9Z%%GbZ*dp?$XH@a*Kia?ej&@_=Bkg<#B&oo z%+6npF*?`k)3hAP&6TT?q#=$g{IozzNNy6z)|IGD@>_2s1>OPpSWEGpCjxeZ-5j2^ zU`6jAY`iLQ2vaCB@{Nn>Tj1O|H_(RMay*t~!ThbOy;msaDfhwEX1HdXZ=XWNxHk2IgOz&@g0H}}ov!ms zh{<_E%b3jJnukLV{p=tPwX4C9T`c)lI>fs>kH(nT$!>gyKXb?ocfZ`7af7tJtIu#F zr_W?TWlv#!==Q^QdS6w$n=mc(%E;3i(VR)Zt{vnL{J+EFvBx9~Am42NYR7B4?OdC4 z>Eev0=(3)3I?lhE>`Q2Rfnl26bNqU8XkSpxHKqvAt*`(7-3e9F%2F{8{B9#eMfJJ7 zbh+QR4NrGev!2O5{jQ&X2V)w~R+m|cEtksq#W~A}50hD3D)T%OgcX{b5E?ivj5{4e zs~E7#6UQ#rd34!?SGIUw;>?ZT=eI;|k;(vNv;Idy4fZ9;+ul=D%Boiai`oWSAx!^t zX~-P0aGyOQP*|b+Beo2aBu}<|$MpkTKhkKld%cmOT0^7hwBPKDO0#L2N`=D(7e0Rz zBhZKYE2Qfu*~hI(eRT#pY+7^C8K_)w_@*xU8ct8O=`I}IC)uNPysQjq+Qkq;NlbGi zp+$s$57B=Ee%&kllYu6PWQL$Iqe6TfAItH!+-LwyGS{5K9*yY$|A^c3Z|meG!2>4gxW4ED#$hHED~d~ zLMUNibV(;J1j=OPh$3N_j!yIf?HYFX*63yJ=>L}+S@@tlBOwZ-A_oEqdbK#X-go)8 z2(46+=0Lp3DSIeXDkLY<n(<+^i23?14}M7KQ|`LCRi(6V?u{9I%UMefb9mth{@C5 z-x?|wn)(%er0?w^(f@3C)C-rI_;D^rZ&*2eil1`gx~An00VMu@Z0E+Kaz}$MbCRNl zgNFNdqI$&~6uCc8p5_1bI5cHmPbiG6`2iTWUU|g_B%pgci;+eQ{pn`X&?fObWv`wj zeFN8Tn~P4)?L&8^-HFNPhHk2AKRjEvPFnU)7~b!Gx?zF28V=ivKem;Oz*o#L`|M7=yg3X_+Ymz)I zVD#!`8{gcca8ITqV@!hF6~Cs94hsGhcJ9R_qSEEM`=^k=>lT-EE?u&IPt9$5=Y{yv z-qx!-7T~^3X*&oC^7eM1`d6w%#YI^P`DmLvpEL6+&Hcp)m2oVgHxNK*xCWJ|2rA5= ziQC;d0Nfw`hpIkGl9`o~HHVZC^* z#I|94SUKV`>~q!33(w^75j$9a^Zmb2exhV{GNQ`*_{$HrmTGiUn%}KN&r~!y#6F8Y zcI$nveEfD@r)KVBmv+>9?}>%g;hg~K(4Lr3}r z7IX~j0s62^${HSA3PaDWMeA_{sRtc$=ZV>b#{MR0RUSPUsCXuB6U!(SYg=FAw$l8c zvejOo3;Ogu{pvtiL_?o}o{~J*eWkYSpTDjF@FT_I{?Ub%Q*?oki2IhF29jLgm_x}c zzZAJ}dLah?&=jwxHa36)YPj_9y#`uZjJD3RtxA0UMWzThBnjvp;E#Pc%5 zl5c6jf~eCq)k^z=@C{iB&JQGQMvox(Sfyp~0|AXSg)aGS*E8 z6(n3$J{nr>prCf>M8QAXiB-;{u>Ld;t5HTpA3GNFf<0X_D{Y`F_{1r;MX{m_(FN z)AgF6?5eXAY)TO-n;L~-19_A`-Im>%%`ov?W_i|3y{2z?a(W}87sJe~!M9&6-%aH!AN z-kIa^0Ahy(SM}G2{bEr_&ulg)&&d)At~>X&JWyIU;ospFJ=nHkH>k1YN3z8z%z65m z^<7ZV+0~hnr8i$@wLP)BW9fGE*UKpYwpEHiI4rn<>exzI@GIdCEDa4xQFu3l`bKHe)kE;*a_29f-6V#z`sy;eH47#>h-B(B z|AA_VLTL8obu%;wL)12>avy0*>p z8iFvLs+kFLF{r>7c@EW-3*8k6|Gt_hP-7SYO~Fyz?PR*>D7kso5OJ<%+uTqWvS;wR z5BpWAe?6M;I~VSM3l*i3E}m<0|0=UC#6yvvQl&*L=NWp46DPen0hOU~Foc z+7Yf`CYglQnE88D6ghfWMG({Bo}?v&RaWLPB$Kg*Gk)g>`A%Qp4s`fqy~b4?o6BN~ zVhNH2^d0CAoDzz^T~?eH@}e;|Z$La&74t0)tlr4G4%~xbt)7Bn&hAg1_k~8OcxEMzi(xQw1@r&vPw`Y>!Ivg{wqpT*gu1|58!|1{s zYA(IcZ{@wJE2CjwB*f#M>&I?9ywU!T(nCcYEXV=({m{tnYpw%%_HHBA+JYbsc?9zl zg6mjj;*eg)$D^Dez;cgPIF9<46*xyuo!S=<{WpaKflV7;_*{;+798J#;^P0L*P7n} zg!*yOP|bO5sG-Cwj3f<}{)~>4v_C^*HGLfpiLLw~0NvF!MW2|H%F$Sz_p#JqCD{I+ z3CYob`%ggO6R$8Z-dh?&q0}eh9Gs_85K0tQFB_lEw;xEh4R2i_XQmsS7U*iT)#QeA z!4T@~M8!caDnd(mq12L+p1%2>vSjl7{QA%$c%^ew zsV>HOXJJy!4M7#g`8B2koR|ddt$I}(OE2J=EJMmC!UG>PcLVkaYfJi|#aa zO($l-C!E5lsbJOyqUqSRQkwBI!z!eZcDm|7yaor_1x#+`*U;*NNxoI_myl zot?^WIkz=5H1%w?=&<$x^(3FS8664tP=X4>K@SV9v4yf=GQ&m^%+Ru>iLiOdjtjd#_;P>o zb=fzjYBc)YV^fPkX?mu0b<};6STLZ;cd(dG9=e4LA<)Gnv#>HaB^pCVIqYHJnGFkA zyw1?h<3brXW3>UoBq1G(r~U;>_j!}mPq#E0_C)C@J_a~~C*UPyJkGh!6HK_N>2Z_+ z*W1nmRN%k{;+^mT9vSr_@9fMXTk*`uNaol#^lH*CO2Dj*Yt`^87Ncf7vvJXulU>dp zZy;{IDPmq8v-+4u_Ro!aA(XC!X!&T5)|Xr znB!O;2OirU#@iX$f5Dk}M$KL#4b+413(Z%ln|o6AH8_C|e#dh{>5t3Ga!Mg$NzPbM z!XjX`5kWmkiq`A@d`^m_a#Da4bBK=PLiJA^7ie{amJc3a2+U05HSL@IbO4Gbg`V%Q z?iW&#etuMVgLw`zSra0Npbr`)f+(A$NurFhQTiat2%2;lppg=E)A3mn{a(x^D#Op3 zQjq#yppMZ6nTn8;ThRT2GP=xbqC6o4Nc)5Jpm;3Y8pKgW)T9b;@;GoIC6;6h@MiP_ z$-~X9!Semc=n`El49`}(Linm~jD|gtKp58^-&29%zo-6SDt2G-?mvU{Z>WC+J8p_w zzBn&_^roO^@N-Sz>|+}IYocgc*C=t(CfqX7sGpd{dAvHQtciXbrT?dAgiQvf}uXV3~P8Y=pcXI$&;3iN~mF?zXhvA3@^+;)Ah9xIH^Z=w+Q z(7c->pI*aa^Vclx*cLHF7KXVbxRsdLh&Q*sD|CFXqH5>qdf* z>qv&PxXk?Qy&x+O`0B))$S9KXn{m(EUI$x9J>KXio#jMV-6x{q~GiK zpo#9QU*uL`rnQsQ!4oUGF^5av7N*^wbH<>RRSJw;-gzI8TGrBd!f;t;o(&Kg)cg5l z_)w#FwR3pN%al_(KU!N^IqXrz+Z|f%eZwj;Di!u%6quSaBPlW)2A;=L73>7dt5F$e zyrZUjkK$SFbgzKb=ltndCFYn;?RY!Rc3p%A7vE6Em+K$rEb9~)CaQRE2X`u{<>@0- z;9Wth0s+hGK_=#RZj4svq%Upnw{Fcr+cy>_lQUb$BbO=z?vk4w<5GtmaYRb8%Nxf6 z(uEs0MJ#4L;JrgUz@^ISk95zL#qu!++VlXdQ0$0%n)--Ux?s1{>bh6=#C7WBPg$x8 zV?ap+Qyx>Knv%5|S^N3z?>%vB*D3hk*W2y=Gy;W0{ooZ<82FWnUO5$MC9EtpT9d6N z1pl2|U$#9AAhwy!c3QnvQ`Ij#dyus1K&PG2JDN?!9I2D}cKe_q8W%QxD|nM~H@!xN zpPXw~c!{d*LUU8!d1w%EI&xZc^oN%5KRiPSfH^8{x?VMSEf?B9s&KL(ndl5)_{Mp`WD-e1d2#nbx>y zX+JhkT5PDYsz_3aezrMsdo1U;&U6$-vo|=7H#HHgp)Jz1o4__;tL_7t>QK2{iabAU zMmSqytsK}{(L!6gn-Eq#>nGv&^|RXA8d_a9dC^jS)cx1?*eY@tukzwIF8^~nrR811 zWhS=q$V?wGXXO{jmv~f(8G?4?7i|-NTT$N6;>+0&R<|#M(WuInUmfggg;3S68@`l7 z+wrWj@_0qw&9D1){HzpX-K=NlgttBXxRP$S5;|vSQuve8LH=+2Bt92N@b4&>v5j0q zhG1mHwI~Sm5yD3f0=a@!-(#0ttL)_PrS~zMK*9-5nHxZ_>^;8_EV(McDQ&xkH=%xsB`eRkK!La#Gm})fKwJ*bhSzi@eK~h>mYw zf3UB9-)~mp{cOCAHq+ezv?v1j{1h%(vZVU*ZQaQo`|@@U+YeoGH_Dcs&y`BYtKBY{ zNw1MfTd0{8K9BPa#4j{e62z6Gm^fU3QL9c$S@fTNE0tlwLAMGHhc+rSJ2Y~~clTz3 zpwe~zQjMng=Vq>a-~=g&6tqQe+dDmVF!YMVGHVLEdW&QSC3hc~veC=^G>fgWO#7)r z(u-;s_)WUo%Vw=+p#wh0S_j76&IKF&;G4zrPZg!TS{fW2^EXhm-!oT1NzPt#&|HV* zLsN!Jk{Son?Pc}jd*^8l>7%LBv&dCA&1Uir)VXyFUnDz1+x{A;rI*k$$~sj zL6qH}V*L>H*GQFbKz)4>M<%t;l>o{rQj}*36b)~XsGGI$WUgEx0<|?hiLwn95teBq ziUP?!#ViAr09Up^_|mkBi!lDf+LzlXkEN!RRU=#AK&*_aKTKJ*Y@ee&u~bB;`@@u1 z|7jH0hr%TXPM~|O^90QgrBonoYOMnD$Mf^6PjrHP)5@*1@M_IKC`-w*z_48B+89-{ zru^3~Tb|8G3qRaQB`~PCx!{Y}fSJLQ$Y?Sq z|Mvb|xzc4admraqQmEE`S4N4?E;rvbG;`%txqLg>IQq?xD!DyJ zOY{aQ=2)4)PC|gng!n`Lb_@}MGmXg({zpin>Y<=GU>g|1s7!WdV7|1-L##r3zu8+7 zKT<=D3VDn;sFLbf{vjmCAhz_@rSoT2<7z~GC(dn(c@faCDmA*O3gmO~&Ge#MbkU>O zYgBvq?sTB`f(6srMyfS^e57<@_|Omn>F+BD_vN*_H@6B57pG~z< zL}W94YbtXo5w!Ooc`I;8W`)jVrA#n>_RNrxJ**a`I9aBx8^RlciQ)Jx`(vFdo(rWl zJ8Cys>EjAp4#u_dj_9C0=Tp2?hNJLTBkiD)LSw-KFy@(YoRZ01M)!5p?1&1qc-gA@ zA}*@ZqlcBL?V?j===2*68=Wj9f({;fZ*%*6tN!)biT6UJ`x=JwstrYgdm`+n32?zpBzs43-uDZSg15w+fQy74eiylc}EYq z4<%VuI=5zH4g5>!b?@5a=>gE09MM6^{ii|~KDZusY1tU7^IOhOx)8nQZ``pz1q1Z* zsWL*nnLjT`=Ug1c=0ae)nub?m6sP$LS7AA>#{G|vnDX?QBQbh|a#wKlx);1sLuis! zTCw*m#8}<6KN|dg$#UuR%rb5l>-V?+;Nmc;%&Be{XRD+V1w0267xG9$UK7gQv?(~q zt?U^rc0YCU_M?sdaJoJ?{xs6FId+0eLzKTh>)*4!zc-nj8f1_0Y$kh)TelUiYX~#CF|@ z9pV!`#MG%e-RGntid2fK<|2qRvumORrQw_OXvVNi+jI;^{SToo?v7SYX7;!#2=4xU z>o$*m4QmFKHF;y0^pi9pak@eqCfR=(Ah`Nd0Ke_2C><~!PSA|OKlQQN2Y-;!3|5eW zaVQJtv5-bGIcs+|ukLgOs7=_{hq|0rvMNnRyxHl*39R8Amit5*Jaer~1nY986N$do z*VeJZ6I?^6^7ie~SIV+`)>zpncIAwziPTUW-rn-A_wS9da%vB)SpScs?b0Sva_;R-A6(C@RiXw8RUBX=(Bo{ z<2js@$1>F8?N2Vj*8G_#rcqxw-Pi*|N#z$2azoFpUcQJOFSC&Q(3Alv@BDiA0(qQm zI3TC%SJN+lIZ39p&s&Z#WBqd#M6xe0|Kev7u3?}vdXl>0;1+8?-G($wr6>Q){VOOL zC2D=DX!-%xqvO;Aeat*gsnx|~@#=9_Fi+1QYs`CS5F39Hx9Cwf4YogBXxuOWh~$8e zv3j_79PbIAIjmvoP~O5QlCXkF$Kw{(AXV(fbJbtyZ65HBxFD3e+3^$xoxK$t>o^?Qu^&nxL`pcL$y(bsMJdhwBUbQKX-b@@BOBXQ%m_U=wlhqPxW(>rC zO(cNv!$A|Kwy7na>s`9}#?YDEk@Q}(rJGATDa)72C z>eeZ-wUR2tu}+MYgaUpflGiw9IgW|xvK$^=b#lF^fCB_{OC}KECyxfMab=X28-%#7KH;6-rRm98GrB@nJJL}BjU;f^Bv?T zZaGiM%z6n{Y!ZcaPhEd;0bf&t(|aN6{Ucdh^LG;bUd6QMP1{xSzlH(z{Ou>UKT7i^ z<2CENMk(B}$@ebM-yhq%#lYRE*3z7!Wqxdb|0Uez&Tvb=(M$*6V~gY@cN#W}Fx=$y)kS z%nA*Z#no~U;Hh@#ago;F%>px&7{#oFT{ECLSdL|oi8F4_0#4rHPePuj|TpnYLYkp-Kt1T4xX?AmPHgiAtq1uq{Jn3|X5EfU7E_ zudBI(ksDcRlBK=0W0FuCb*hlUZIxWt*7!DAzWjfa7n&5hfsKvXX}8rk%Pza?Ms>rC zBRM3G!OiDzyK{-Hjy(DvTfZJ6#8-D8CE12oLGEDh#X{6k{Y1tK=?!snRmmzb2STc> zk6*w27vhwOzb$lrqxS^;{L1J^*%I+OEMU5vPpF(4Sb!mHb@=W3Lqy>8iVt80tDq6AvftU6BFi!j>?RibitJ2p$mX7s|J)XC)&Lw=V z%dNz$G-^o>u@pdnTwEuwQq}~v^ii3jNWBjDf*VhDJVHb$J&0^`{G0;TmB4{Ar zNoMNjWs&?F*#Fu$?7kbbx7}jiQmOK|M}!+V&uBC=dXwV4?gz2*UH0VKlOigbw{^;H>v*w z`A9?34v?was10R)(3Al$H>OJQnB_sdu?98hC1X(|SMThqiq(m~O|_Z*FyGTRKi&KEEIk|RwL(tH-_^nL0*-wB ztf1T-jOQEl5eWd3LbZMgk$Krrg)sUXO+*1*L|YKGok(;ini(rzx?J?Wr9&!@#p4_n)+E>NAAR-+Wb!pB(LBZ3uoJg5r%b8=5}}?_ zRa-9%WBe2oui(g2^9#$=vA>yVu6K@;Q za!?w;KVq}N*dk1UhKQrzBkOMU3zSYKrN3aHziHGpLd0@cQGa8MX{DJyV(dMAS8dv+ z?7_X(w!R0gUo~miwspgrdYaMkbbd~nnA`M(rZttE-&Y0cT8P%Hv%X!2uE^1+Lf^Q3 zOv3SR5_zW@8HW13j=4kF1T_QxP&bgz>rWVA{|6s|++gplRue6w{lUGKubL!ev)oa+ zO`jR&(ya4UrI>c;P&t>ZmBp?O$rXjyI0&(ktpUCMdfwp!}d zg3{x4(lrnOzY+U2dj%|52I&q2Z<(me_OkkSU`n9kdZ5r|$u>H7hEKceeW6MvGc-uD zc$AN}Z*SaqW%|rOgG-QmYiDSgsQ!@!y|YUNWOhNaQj|g;Zr~sLJCV+@*YnHao=wv3 z*qykz`CiLR0unx|E5m-O(x2#SfhMjCIG{TS4S@pv#?4zGC#qLuLGO2d4Vt<{Y4u^o zM%1y1bx2{NFn0M=w9+3h1!*CNigJ2Og{TgZ1wBMdzB=*^x_q@RT4`%D^`<*~>n{v} zA93~uRucp@1G83JAYrV|;R%b!2nnZAE>@Kgy3swiDxU=DF6}I!R<;mIM}tRR4F=%I0M!pjb%tdnSj{A zT1O8?&=V0tm6OozDpAA|4ea+ku#Wc7!d^%~wdot%&hAPiz}7Q~NCNetnO?OUHgI&2 zcapa^=ZnJ|wpm~vTjgOx)Zv77?$w73?=mc<9;=X3+E;p~R75-B_PD*R|CU?RXKPf% zD3mAds_Od#A>YXu;y|oE99@sx>Iz9IAnzww- zl$=f=DMh_=bl&*Kt2F92Xs=9Ll6;Ty;Y{c6?U;jpf6@l!k%U>4B5Rfk^O+>9oQ_K! z*^F(Cz%GPzhfXAxjoBmM%=E>2YT85hhQM zPW*r*JrI7pQwX3If9i~x-bawMw>yAj$2zfmHL|KKWgzrrA$5Llw7-~hJB4$lud0H}Zh5b@J(_HeFL1l1J!h+;iRU&k3@hPpzS=l&C5MJ< zYvUZWwraNWJBlB3V|sLf=983!W6w4%tj7bKb8tuW`j87b{%I*Kr=KLLv=YY?gbSjj?sC-p7%?;AuZpnL?>d&ftL*qYZH-qM znIeO?c3EviTJHG&aW@uq#)WDv7!vgrj9F4;b~nIOKvsV3-$+ZyRt z)2iJhR;}KDa6h&r8||=rtQ|_|)fGj@*B^23yhrYD>e}^iCUIR06p|YHzFV8MI$rCE zMkuM<=XjQ6TCA`@^^0kIK2*%JBwZxo#8^jaMc424wccZPD6^Z9N(xSGvE+22!>5nY zAuZSCT%Lp@Rj~)oRiRoCfKqcH1;|T>DHU>V1tghr6&KOSm?9*(9?;v|nuokxm|RwI z@<3{J6c?q|bC5kTG-i*@MCq@MA$6?{nyJH=57~iJs)URprnb=^iU!T7859@>LuFoQ zSb0^}ZL0aGr7kGlSXeaeL}>^nEc=WuGwq{TQJL9kcV|urPOHSAuHVaaI+H&oyMo=p zfE#hZI91SFfa-PXTVXLxynn7p?E&lPk_^g-sDH0$?L6DP2ms~mlln6|aKcWBf9kFX z@b(d6Q-D3j-jqSaqg_>g2LcuaBV{LJv8)JeHd2y&s!9vOSMQ~y{PSHDX31wJZZ-v!Gt%>;S(%QSenJJWp|lAlIpAIw+)UMi8a4 zh{Acs11#UbYb;DvGfcT!mdm(e+cDbN)kDRv#|=wsx;5Pe&#X@)6hYtV@`zVD*-;R# z$fD%B?HK91p^CkP%3f6zP@uMGmKRtN#kGounA#x90!*VM0kKZd1^m>iBgy8Bc^US@@krg4TQn`i|c;2P{nV^#Jyou%;RyVNj^E;p#eWu}f6$yZRz>;U^gu z1Rx39-~>6tdNK*p@zE80c>b{`&G0ApH@>lUr1y%9b1aeseza&1G!8#p)X)E63U;!9 z3dYZ{Li{80+MD3;rgtwc2~Iq=3PXC#%w&SR^ieWWkhfPzSMrA`Ns@i3BiV_ev3H|@ zux&tCpWOJ3La>sVi)EHWkm*8){14#~$_%ip88(Apk-2{!9A5NwYmW|j_O1O>hUq4P z%v&(nraUbC?e0@Hnmz|1u9^|k5GQ5Ee6y|}@}#9-_Z?jkF`1we- zCfOs70GbdQ9%|+2Ii|mO?y^vthqfu@Dh&as*5M>L{?8 zdzuuu@fHcwsq|rd=K^{nQd-Fkb-#sDxrQj!J5)N8_ihe2V4eQnnBt$MD#kD-9WNo! zn7Dv3aHmek`esSRI>q#KW?G#$2-Pt#cfb9t=+GY`3HRhhCj)deWAAH6z`D zo$6OQQ)k`FD_`l#5IaW~&Pss@9F_s0ii@DU@hknKSt8&k>JVrWKO)VXaMjwM3B!v1 zlv-b&)`OOTVZQ#)Lxk~?>?t>$Po8E%bAo*|%>2Nq_z0GM1nfW%L0u?7D-Qrd-A zdKX<0x)7J*wosz(CEhd}=sB_o0n5dl2*EK1cm+c$C4NWw17_13kpNK*k~gk&0ru+( zqMBtLx@yv$Ipwlniqs{lE(4CrnSZZ~@xwoKwlEWmwchC|bq(GzYJz2d|2J-)JctDn z{!`b41-8`+cP}fb5FfvRC*)qUVqxkf6b9<>{D-)ny!ujS&5so2GNwBkerHK5zT#Dh z-x6pwqj18s{guFYJ)-BNOD=66wZ~nMSt8m&7JnYZzu=jblUqlhvSzoHH+v2Q_k}Ob zOx-J(?Cg9T>T#e76vgZr4u3~%*-1UI`>P6aWA>Js2W@22oF(7nUAzi-3v3%d@`$GN zA&nOT00pJrMSIk)Ny&i?uzWBT9jwykJbKO|nXEgnEB-jUcw92v(!bni#{$Y&E#Bi{eK zFl6gbtKMRVaQ2umWj1fq^8RHYw2%4E8W}5#Lvg*}k@MB5!J+G-5cj8Qb#{U2A#gas zTe>%@yTF_TbI;|1Yk9F&n;`o;f0uFxC5LX!EUmG9)X@tWG+>IoNydTm3Iansjj)E(io|}~54>7?v ze65+Zv75(anZ))~=QxeHmm_i7S|sEWY|3xIea)XhN8G9NIz6%HL4gc+Rh5k27G1g03I&Q;B<_X9G< zP5K?;2s~y<{W)ZeS7{huBcxZWW8xcolG^|NeZ#X!*I(WUfdTQS(a)>%YAZ=|>8{V< z>}7Q{;!pK$;+@YCE9nrIS|-(SN!4mo#tGoi*KAayC7me{Rn7V85WDV$PFt|&s#e#V z?tDjXWW)@1B(*`loLeW2cS0}r{MgeEHf`vaXGxe#f78jekZSTX|E6BPT3h|Zu2`+E z?p+h^xgJXwm(Ddb-X@Q|wfl!*#k3+69o}0SK>Nev(CHlb{CEo;Ftq4&Iu}BAVsBJ% z;&>#&pdgVO<{wQ2=je%-cK;BeosIQ(h#^`jnxG@MGeL*LO=AoNJ<<7oGwlxR{Dr#A z64*z~zv8jm%Izk%hFQ{2@y4b-DTWzZ2e%4$`qODXgenchRaEO%46#@DA7&8!EPH}c z&AB?V49|6G7KkXjzZW@%H(Ca0tDJ43`$duS5wAB5zaMh!*8|sc$J*NejUL;<{mSy- z803~h%2d6}K^yKp{YEH_l`(#u2hDw9K^OwaNuZ-^!%8(9sZnDX)%T8#6&B~5zBXx8 z@n=nH;z}N>))!OMWh82sFe^n<;3Wi1Uv)A29iQJgV8Y&B*gPF#$rMi zCD6eZ#V%9$_8<8nn(KpwwYKe7z<)lgGI^|IZI^OQnkzt_zv7*+5k%()Hu zd3a0sMBgRHb3tnm2AucOG{(Dlm;BCpgFz5@G-#p`zl$g2cgWz?Lx+P_ld(U=maja? zw)nlOr?!`-8PjXmKN4WUZ~cW<&OoWN{XfkLLh04lK1SsWAPdIRg;t@d|BqI2Y}LtQ zd*%{dj;)#m>TJ;V=M6mXfza0n91WQQtHO{;kI!|3^6o9E_LSZ01&R}u){C$kyT!62 z9!lOm9l+Sb@!(On)!I#q!O8%e3mqK^@Eb%|gcU=ECQUQw_>j!D_SIOc{(jVu)71C( z;aVU^!D)2l;MrEW3nEo&>@Qwwt!d7hWsr`cS{Ld%Und>(E)jvI<)GaUYBC-PFvwIRvHnf2#sj>fp_KPBb) z%i&stOjz(YLRo}lE}@6o%Du~Oi(|c zw3=*o7qS8blN~s0Gg+ZvX5yWdsBE4zV(MjX)*cOMznBcPYib51R<+hPJ+cd_?60CZ zK~`VM<`w*sj7m-AGEuq3b;dALPtY?GS`v@#wi`q@K0%M7I5({K`geW)wLAW$ob$Pm z-B>8vwp-Yxc8lksOEzv6via;1(*$KAS1UR=n;o39JEseM&dt!=H44K=EX?l@fjm%q`m7VQ^8cA*hifD;wBq0cT8!<0YJ&&Wj;g`v{R- z7ivgjh7Cnz#SF5xGFl=lX6^_BpCTt|*KUeXrEp2IXQ`g~>|{DU&i36{@pmCx8%`T4 zY0$4YB2vKRAMSp?y464IVeV_ynwJlJs93*Jp-|ydvKTB(DvElVx=c4D*r#pH?ij^^ ztFd=H;jhSLt!S^zaL-9Jd-8tziwhfGy?+od;E)>?`{!g`Drw5ohHWZ&xVG|F$xJQr zLjsdH?R<{_DbNnQ*iW>zQzKK>vGdzN=;wd=ELLI7DhbA!`vMW_qE9 zgv0-snXObtEQ%b4ak*~l-3Z^sX749B#83q|q#;{p%WFPU734W$Mf@EC=-&sI}*eTwD6REG8O2|N&~Pmp)bimdW1>%MZSf8$JJy4ZvD=uSZb4>{B}wcHl!Rb{_Dmhm`d!YAP3H- zI`i6m1J&{1(=TwCvzg5fWMASDftb5kh&Ly_!ygoEdWnNLJBc#!n4q66-ubrLNY>Uj zC`R`aewZ;t#EOT7uZ7>-5+wdA+Jr^7XA8*o6Rwt7fb<3;UBH)7+&DqhI*ZT$h)=te37s#q&hZHQbdz>uIL2*YUP zP#9%XY89^l4F6I15^_k2SpvQ`cuE^GsZv-!Wr}XD%)H&K&%CP^8=bs=4$*H6{{OF5 z{lWGsCKG-bWWFnc<0Q+Ie7=* zY#=l8YdxBE{5`aPW%OAe?m7NMa+p4JE)>PLEnj6WvpHAAAo@ooo++tk8LZ1zI9pLW zOlvlF7h?^D{C4u6kBSk?Y_B^^@z+~-Y0fC;%{8%g9fO}!YxLC9qGhwf={HO$nKR3V zK=zbT6Gl5pp4pD-9nMu*fhlQs)=jXy%22oJcz{SdhpUaJf7%spDI zh&dlk$3c9sNi`0q^!SYaNOG^KUcNPNb@OnR{lN=~?)Eb%b7Pzb(boB|`-T;m9Vj}G zI!Tz#v=G~%mHn3Yv0oAUguyczv#@PDk3=8M@N1O1d&*eCru^vDW>M0%vj5CJ&bVkr z|M5>DN5lHrpv?m7{xh4nx<-P~U$^UF7{G&6svFY#s*>E8g^`a9bFvG!p0^cT6 znWv#VU7S@HJTAM|T56Sw<(7ruzmA2L<|XY7zn=s6X8oD*3K#D4rEF4Eg7rhBvnIpF zYT^7ntBqpQHpDw~vc}>@b}BXA`>6G^-)0^)kq1sD3fa%1c~8C(CpeoeTu%J3EJJTl z=0?*bF_QO}t6Ye~3pCm|4|FgHjQtg_;>?pA^S1FM);&zuKSI~#p9xz{Ku@)JIudVt z!dA#+%}t-jrA^48BZw}NDU=qpl1C4=8<{c?7akclZPx0FbF3Ias$GK8_TK<#5NxUIF5@^#xl z6uM%%_g|TpGnMkFS(y_E_%BX33~nU&%aX5lrM?40kfB3sqeK1#)mj8%Si>m93}6>! ztRdFhk<<&MoTaha^rH0aHajVQa2OaemlPa8+}!C0JcN1X$*fcQlUu@mfF$#+4igo0 z$HIn(9ozh0*7$ZtSDmiOi-~`f`~oHLB*#t;eqSk;b40r&RJ~VUp!#SXDp$mECvJI0 z7o96I9T<4gVT3m3Jz zic5SWoLMLsGE9=r&b_y-?PpILV61RrbP1b(yR)^YfoR?_X!!*YVGtMrr9qbrEY`S) zyLJW!{qk$mw(b1G{Vo_UT4kOK2DE+;3@@liUxc3zR{fH(p-cMSY5TYT_HH*!Qcg~k zu=Ct1?-dQ9pWN4XzJp0>k1^{1nL8@<+^cpPy!aXGYmlPG?vj-% z>51TLmPQybdyiUQtRdxWf#KG%tQ5m|XD%SXEtY4zar$!*jhMC==2ap^TWwVg6ArNm zLs-gu8M{cxi5zknh54n}l7`t}z;)ZAK9IM<4IroCEMAsGV&%QlKJGj1HdF9x81dJi zUEbo)EHP5(jzgfR1VMyb^yiNR682G+6e$~`OSCf&Y1tP%I4E66m^}Jep~w?SnS9BLS*C-H)T`S7RB)FS}H%q=xN!Mg*A|FJupMXdIbd| z!;5LFi0yb>orw_Y19fDOuKz_!|-Jk=Y({S}^q^ zLzQ6A9@WvqoCw9pI-SF47^cHwKZ>n=hrk7f;SavCv8~LhJsKV!n7YSCP`%=l{yud} z{E_v5COR^hFL@6XWI_5*;x9zJ!CBJl1 z8yLN}y%A%#gK$%#&DuviAk8^ah8}5%f)|}(Du%*wVS0Fd9WQ#Y3gaahR1`1QH@r35 zLw|%VtBg&n66_|*jZ@QPY;VEKEK^|OEZg#hpU2%-kN$T+Po<*p==QIAD+U6 z(8sN$7-Q1;0&Ie`SMMCEM4`gmuol} zx@^AB?g-oj-)2J>^w{5#`wDPvwpABUFm8UE1y6)|9=!|WW_3lQv*#(1e4bW@8+ZNj zDIH6*Zl%eMwXUcJ_^fQu1UQ25IoH4StJ`&2MLlr1UbIui8AfMG0giCkl6Z^@8BB`p zLGU=F$H5;TUe+tp?m3<-P2gMs&|v`sAdzjKy!kE-FV-8F?rl8jEL9%mD~Ligt%63}1Upa1>u5hAy#E>(_i-=J~pmef=< z0ip@D<@l1SCA5890K~xcg0Qy}g1oq`q?CPReCt9#XD0LIq7jpg6zPizLQI)a*aP`$AdFZLcEjdk@B^@nRJ`~*tEsQBU;ujcd~T zKR3ygEAk5Lx(VbrnegV!1HMN`DsgH#0{5MgyYn{8-zIai@?j~UHCXa(D4`IcciI7GT<^j_7}szlH6$FYKCXzEGtKOS*~vD7G$4M+t;Izo0l z6w)hx0{}DdCo!{PQ1EyeC72&bL9lbd~7&S7gA`+%Yz3s65D+wTiSE_H#g@suso z6_R>>7ObM{|5B5NQN;Qzid^v5f23)Yf|#k*i(O5x{h6l*Ry=13+bCt_e`xJ13_sLA*p$R|ik1xl+cX&}rg+7O-6DPf?G0W7m77XZ*4U8CzlVDKuYw3**E&9Qbv|R!=%WL?vx3d*w2-ocQfjr zo-X0^fG;lJjytqCprEKP7=!hQt)W1C)`ok60{-&;`B_&@t59Cc3`j|qmpa#ut^XYZO9vL} zlI#CHxOE|{iQ$RcpOvqP2=s$ufl-6AJ-OhPL4YUdo*jDSSpZS+qFA2aHCgZdXF%G0@Nbufnm-S{=rA5!@ge$bbJ@V4MiQ4 zGlzAq)}@UD)!cYMRn%ZV_F9O{9xShjF#It39+O_|WV3!q?|K$XOr}>+K+6tY);XQC zt{GJmRHxE()m>68B=;3!d7Jzk`99u5^|(c(yPMQDEW%9FSh__*wvFQEC&ZkjC)l|d z+tPVe*YSE=K3d{JmIf4uu>_LNpNx@oVm!^|q_)kSGLQF&?9`9H)L&T+E@7-RV*aLr z$eRlM@H3%#bq~0r5lxrge=BZGEEW?^zRZfH7wt}ul?~ij3CIcfqeCBw_4*>1Iy#q; z;;6ymv_QKse>7Gm3Aq^UlPq6-j)@hwK$*XpW8}BaLLvMdz1iU(8{2U57<$6idHMfZ z$u~24wOXGm4aZ%ICt`6G%94Jkko+;M4wbSH~15!rQZVuK)Z#cS7^$v2BxAZR%syXk~k(dhCPui2v9tVF0 zY-MOj=qLZdX@9L@#F~&FXC|!p*hco%jx_+3)vluMH0V}IPxTCQJa$|&O{*IuQ5{uK zn4v>Gj`56TwJYNFMUd#?;U?4ig8;1u55=+-61NcpeS2aHKOhRo@{`7$Fs65AsqAvX zr{EeK6>}17n5#EA3U@7#-L^|G5{A~kZy-hDCD?Z%y)p$Aj#hH&rf@d^Q>b&;?8D-8 zWPQQI9Swha-Vq#faz} z_hjDxoP4D};>i;)ZXI4Z%H}c8K90N_P#HDY)0av2F}eNNu`C~hhZk9h>vI%>e7Da- zWaL<-g(UaSzHOY|BU;k+^fM@m-+Z=RzUe(E8flsexy@-*SmlqYbDs@A+Q0HY74#cX zqp&y5BoBXw-^XC8Iet+k)wDK7W8goVD2#J=Kp_+l1%JhzZnyAVJ`OUavACMc+zn>DpIk6Ma*_ ztBpvgBg}ltk2=hlF+CzX+1+o|XvmBI8jaS!e};xw@>Zk)g}q;fR4secaC8pj&LjrJ zg~#K4UJ2I=nmKk%+^B`Jp~F!zMP%zx?6VN>b)?}(W;1yU_|#Iqp)M$&b?y@OJEp`g zy@u7D!gHvO3z-req}ckctzxd>RTfIQw@+3AFtoOoc|`Z>0}fr4=TUdXj`7*wgRn0R zA-QD)HT+bxNb#Phhsp2pmZuCbBPnzi7pL{S#w8yQ>Su(#&H@DB;L>AafHTe<8L7e{+}w-VbnnbeIw`_%xx zbRGD)>yk!jof^7%?L6(GF=|vumw@Y3d$KFJq+L^FFe+G>B|X8`McCJv2j~zc9dSlQ zT*yLDq8t0cz4ygfA*zvt=yRjXk>+=iq<>a+(4G~c+4=BW>Q-W_TloKIdh=($URj@r z`K_?}kq;G{jaH`+Ebo5&ldjNkm$m)LKgNuS+eCzG3JYv0+RfY@iN4gwHY)pb-jlY= zaGl(sQ6HWO!+jyscCV<3uTEr(matwd$c%RvdkKwXLsewDP~5SfZRL78MM(I-f~5IK zWaGm;iGZ%Q8PEuY+E4c&{o@N*HlE2^{)Ldf`4G?yMJ(q5>HPjQE~fKp`)1P%UHQmk zAAQkVkWo->uY!_Y6RJtLCn#3by~7+Rnwy!WKMBYq!2__vmBCW+4jD=hr8zrq6w|Ii zW7U};xi%OIp_s5ie~d8`_Mvun?x$zov9)qgnJ4dVr5yF~CuflN=x&duTw^Fc>Z~1R zoVsE~zk%=J08_iC$Hp4)tB2Rz>T#Qf)Ld@*V1E7z3Z!Qp$?F=JPagR_QU}-6t6-A; z=Kb#W(Zm?#EfcVPK%NPpdpF9fCvo$Et$2m)AaTQnZKmL4R)sVfhUgPKM3AedzJo?` zln$>r3^fo$XokPm6m5c;4_F=%k2FWsn`*g=+^N+AOD*4C|K0N5cfz|dCWAQu-xe=N zd=;YkI}+2*Fd;#9@z@DC*8RX~;vAiuU*(V)pj7QRB&<60*O&Q-e^Upxlf+>W~eA8~J*8#zoEz?VvD)n=KGCBM`DogI{u zLA7sv{t;Uu7{hWFaRQUddodLIXoObF&-zzy5Q2ICezuEK2{vsLKW!$=Zbd;rDJAcl z8tfIGFuQywOcT}-k001H^YH^mW!8Ht%83};HfeEYI)u9z!+U?K?d)#08*ud%v7VRR zEl*-s?uiv6+$M4*Uhv`ba^a7YOL}N6=7_v$4!I-9loQXBBfIkZ72wf4JA8(VQjArTPNd69a_lg~(<;KCT%IDej!=QUm-LMyo z{1*N-%T{juxLLP1f{0Rg@suoA-}Q`V>O?Kk&veF1aX;;hY17Bc8Ds8}faR4R515&YO6x;zfUY4g^xty@Tk>+>Hr(T?uG+$ zCet`0hbQ7U-82X7mUjMxz~SHq^Uo1&uP&tI{qS9zS|OQtL(x-XHNEQ@D?Ze2H#h4u z6}E{qCNRH5)9@+00^>XEyApO6NJIkW|0G2rq?$#FjnN{ZUb=}@^y36iZ!Ub;$HYJ> z^!aIX=B6mNgt|&N7#(=-kcs3H@~!X&XP{{BQv;t&i%mfm>M;l@M1e8JA#BX_QGle& z_6MvMuP!Q2*5{sXNw3*1_p_b##|rPFpO(7C%SDzJLoL;MowpPdQ?@Mz7b*gs5y;8Y zh6`euJ-pm(S75o&sF(%z0=y74xWSnJ^%AH_qPp;23X2|w+vMU^I;e-0?7i+MR$}S8 zp8Yy?G_Z-PuSumi=C^s=*6Pkt1Y8^>;Vtw>)zbz3a2eCm@TH^2Z>!WxzHk~lmr{rH zh5asw*Uz1qB+R<+8Jq~X5xv2q;CLlKNTR!Z8l@O5c4(TX-`WGgo~(nMtd}#zsUFDy7bz>n}(7hEnpJ2m7*uMfG>m+PLmld z!O$+@l#=4|#PHn~Q8Ttm!G4`47MMl1)P)e&Z5KJ4zNreE;oWq@VDi8B>f>F{OtBb# zapY@3>bMcN-{d83C|~xjf%~~nHgnM?YEj28ZxVh1gi4_DtKh?zp$jNqdAlp|*<%Am zvw|w!nJhOd#LPSM5n~(f)y9GiIXCah`xp|!;~d_@d`mBPwD=)Mm|N=TLn$>@cj509 zSH?)i%AmKxxV6&sqGZD=zgK*=lN_<6I=OC%>bnsn{w=mDYKjo@##gB$p~w-MSwXVC z2TSiAf_Pa>2p$BuTuUR{3891lw`;MGPvmzfK1$i;w{OE<`PVp~ zov$YRqWD@+(cnjHBhmWaJf5t)Mj@BIz3=NqxlA~OHIQP97+opLovP-Hg zw5H=0lOy4TU(geOXbw&&N5y`=Tv=zqOGt(8nAh`Ni#hnzCy8lp)GJ?)X1WY2Lj)7Q zAI#4XQTFu@G3#SOrlo8LcO-wQnshd$tq70)8@`%sWP8s7Wa{Gu(=$b z_2uVNP2Q_;n}wyYjnLigsj;*$6+6WgLaGHjgvuogcIb`h+2u6LaMxaxS8}`7$zF~A zLeN6cU*;6hq@wibSe{0|Z`{#kM3oF`CA0K-sLnm|!c|j#_*$gewAc($nt+P&CT!Ng z8c+M2krg4jjTPUot&qZmN?ru7e|hlIA*W^rXtE1yJQDF7p65&!24+#n`yD@7FT92C zrRw#!geVIts4py1k+ePT(%6Qg9|%;4U0E?mu*b@T&5o<-eeeI41GPgQaN>V^rko~1 zDtF_%-JR^|XuCCnsrUsF;2IT4NX9a3O^NwBCo0WNf+q1XC3?%H=~jp%Ms>wHwfZ5x z7LxQIM=v^Y*vfKzPyE(?HndU?DY6WbI5?R~fF;qr~fi^$9(* zaKn@#FGc7a)h22?;1|RgG?dXjhGyg-mwk8dW z1Y5%)*KMyjzKYykAsodi#`NZ$xqT9FYgxUvkH(s)wW*))>9R8%6dYcuzLjlbO(L(} z_#sO7OJ2?aC}s$R?DW?=7zMYbJsWEHH`XivEvBD&7VfHi`*0!322u=S3*>dMcoGi2 zg~5|45yR;9OIaDbVzZtpXN0*VCZ5yv;<+||JGT}-rHeV$%T*vk#~e;&TKlHwnHau` z{n8y9@5z4k(EO!Tk^8n0cPR%tMk*RUMZX^Y~Saxr+68f->l2 z9`P>rxo*{7^#Mbw1a<3%C@E%9%9}8XVfuXG|MV_P9WL!(=!M$7cq>|nyPl<`1T&pk zS8<_`#co3~euB*us9qOQ(Od|Ds8W67{;#9Fx< z9~hl|aZm07du?L0+4+u_&aK+lVaMYKHdyiv)DU!*E;b?Hu==j*1Zor3-;9uiOO%go zFf9*M${JeLWJ#e21a~I*$>o8va5Ey`NJ( zea>)BA1-9c5J3eesMj8_lyPLq(o6QlR4V*?GEbkpY+BHx75EDs>0R1yfaJdG$0o=_ z{DV$UP5M%h6<;tt;WAyh6r4T>dW+*e4TlX+vCVtO6zRY&zC>)b$D6!gpQq%yxqFAP zA@uEdO=zx26b4lbwn{XuOTG#vz@_>IpJvtq91gUd2LAzxAUk{MSLaG;GIY`%n{xL8 z$rg41beb;(^I)@v8i=LAKCjF-E!rSD)m4J-7H`kEEO*+_Z~AY~QL)u~+hvd^`@F8q z^1XnM2=#P4bM7b5IrV_LNcO}WDlot@aRpmiJ%F;tWvBtl09J zF37iDK0Hq{yY70CW@L)niMQiF`I+MWu#VdR?~=u(P-7`#VjTxMWo%ib{AGiqlmpEW zZCv}qanY!}xu?c-J2kzpw=A*)i}h z?D_er^?>d3lugJa4{Km_h?jrXJG&oGyPdg>7KfF(Be=&V1pfDH9gWYq1Bd9c=K6qp1}(L3yB*YdD?#q_tQvqC$v-recFi`*?4Fiuiq_!DcbP z!?=!!27n79DT+D4XxX___l}hyRWa3ff@CSEo2Kd0H`VQiNT8kK9si~{63>s4G)#t- z76QT>Bqn_*wC|Uf_`0Ruz+>DdA<6<}x#44v%_t*W{K3nR9)C3pmk#15AueLTkPJ(q z_eO8}&LDQiwPD0KJS8N&+~XgyQ;mtr5H+a6AbZB;yfrqPP;sFifT1;+MkNi4#yV+P zd96G~i;pxcZfZJRO8O`%12=Ed1P*1=DhYB))B@KdIAG)7d7B8h!i*2f=xn!^04gY1 zR;@xBf=$eTyURIMjk{kd+D0N)InN7s1b?6irPYMnTO*dyZy_kT)HJ!z7mn{7BCIwA z&{yO8$6Th{^y#n){hXu-c@lXyU_AG@k1}VXx!U2$Ixc<@ycOCA*2VQ{F6I|Nx*VJz>s(YL*!2`Rgvg0nI18JT(`PU>5R*OJjv9&M@e#X;uTTMC43WC-w4QbyPYr@Z)S$v3oBGL?g6E68;O0cFPJu}?0PT8 z^~l_Ai5$LkI2BTP?CbqYA{2&v9O|ntIuc$s#vw4CxvEs1das<@Cn3N66=j_~RJ8r?HK+X-|}7YM5$y2z{%$Rg~G&W|z-`PczzlL*M7F$J4F2 zU+6a>$UFuF42{V5J^c%?@pVwcWWC~~KcxV%0OCpH zO+Viup31#4XVb=ry-+fqbko@tANGBh{rOtLeI2HD%V6?l-u?J5z((5ahJ||%ggAeU zyGor9FM!Ye@;zYrioaU%$BiIkiaS+QZHQ^phVCqFt9M^J(qe~qLnWm(%iN71(Jk5_ zA$mxvKOunWY5t~~t#pqFDm)5L1|klJ)F*E8zUfPMy6zdymw7i$5p>mXYZ-Kj%};x7 z_oVg?1T$ICBKcMAr3$ZTZ>r%UPuS4omWRGtlD~ z*-UDm>NY^d-&%m3Hg&T*O*f6I{&EnVQFNk+{=|JHOkNl5!Z`zlZBjb6FGzdB0e#;A zk}3r4&gxVT-$9&^j=ax~Yq~SUDEd^>zgs-5mZl*H3`Y9==G)=T&ZayuWfXgZ*<(W2 z=iA>RWI=I`HFDjODKCwx$lz{wP(8f4ykPQ9$~$F=OImO)R8)l`mjq4l<%n)7B^7qZ z?d;+#70N^r0FW*kqLhvM%n2u-V`M5T(C~8;pbSJlzAV!;jG<(D<6Iq(dpy=K=F&-f zBcjnXTa+q($sJ!KGlX`&KWxYT1M~zoZ}j#bfxcnGR6UY~jmhaV#9{~MVw61?AB9|3 zF3GNk7Qcog=+tzq(XbL0maX1kC+{3KRLqGJ>AoD}R4(^Tz4Fbpj<&Q{m-agp$=vLZExrM7gFq zxg-wufHd`-Faaq_>wV|}@>6ylT@!>_eq6lE`$(pixoR#5hJ3FRv<}MU?};Yp46%$z zAIv(BXuS@E3!xI9wY{XO_a)^#s1hhn<91@z8V<51wmSNU(_KPjLBPhRre80E23hfC z&8l&JoM#NpQ*QuwXNXZHGsY^FWQ+3qn9C9%WxGk!gmK>3Gl=~sC=H9l+Q2YbPH z-n9l3%yLckGrkyIz#~{hWL=sT1ZzXQG#d|Y;N-$0b;lNT(ZG>??l1^?D4M&ene$!Y z{GIF5g(?&XYQd&y*w>o9bCp|yqN)v){bRI%$TyMM38$iP^>i)_Ii_4xZK9I9yNyDS zHYeITq_{&w^ighDViFd)^H&@3NgN$3T)A3Kk_E~E#I3yAk5y#4HX-`sJ`p4J4kifI zl4XEZC7w85vEJHWt+Vo1q?{%)j&c-jRso3cYgVAhR$j&1#nsOj5LcrdL2jGa0?R@y zi?#}b;PJD#oEVF5{OekcbZb`)86o$@6oYc~o%(u@je&Fr$GKOW_GVJ6aq10#?M^Tc ziB+wh;n4MQ6w+!o&mGG+oZ|?#utjd;457YvE)seOZ!uc?hzcAHU1b3M(b5u3Y7w8Z zjpnU%Ey76H{8*bgqq`LQey@X;{t?!(>as;>tmxN z9+pJSV{(*-+5iwL#SPcpAnJ72c%wvd_axP%)_%B2;+pTDDMfAF=y;~RTZN6jgJDys zWX%CXwIwDgMiYoy67F5*v`#9?vyn}K27f$PLU*QX|1@>uY~TOAMTDlg2Hp_09u^gp zR}H;iX2o7`HPK2Ma}d=q`zwCRQhHoLcW@=L6kPXHZZAWBYoulEp7db{;QwaoNI$M_ zKmP{`L`x3{#Z}%u>0wx4QLq2n+RaD1=BIHmBYg}NS?O$0N`!Kd>oA8L?A+KIyAHhf zC4Ml-ZZQTxY^~ytB>ZTN-W~{K2VAHCa)m9au3eLVd{PX0X!m z1$qG>NU)8kKc!Rw#?3v=O&T0@`|NQ>{KWg=_|ITp?gErzGM1_=X^80c? zSU&pjWdGauT@*2hMRPe*Cgkd^Vky`O6!Ccm8WK|?IeJ)Gyca0$JAVQ1_ob`$o7iIM_+DC?6Xb!#+l@JOcv2#!g7 zh2^uzoL>iq0T~`vqL4X@J?pZ0y8PT9pJcFQD5Nz8<_1o=+>^1)#s$v%*B*JMbUnAR z@G>a60m<|sii*Fpqo%9<$MRK7DuMqG@QGKNQU_ULpyG9g!qW3qoz`J8Fe#bcla(#- zp6Jhoonc6-_t$+8P1skW0rDxR!dJea3-ZDSost++n{h-N!W}1H1bTXr6@5@VGuZLl zwGhW3*`(=)=f*1m2NsfxP^K+1_#G`!HxVm=BX$DmFzwIU7Aj`jlx%;OjKfb#A&{gW zvE_t0gXpp9$=|;}1X8ltLm8J+&k<~7_#)%TLHNX9&1Gtj(+mY)t9T=~bIvYfI$R-b zNw!SG(2Lx3+Vb_LQ?M>Ezw!vdKB88C@O*)6O(2+Mu}p_MZZKF%uDgZH2JeQ%EIs;$1AmzlnSh*gjQrI zMxS7vd(P@@*ja~$4OqQV^8#+1-Z@r|8;DcI{mRI{^o_XQg>C-bK;Hwq z1!MmfIO(WW#$-s(v%Y&`jm}HSl`u_}ZdD0`{n}62QwXy_ZV=tBLw9YB0K=(AoxRA* z2(qFz33JVDghF8^9l%%IzQ(PC&uMlvmw1}htbe|ajW-AU%G`GwDk1$Fa5f=D5_OIg zl*2Ilf^g080^VdJAJhm#(8ox00kHkukGpLkMOv&)bYK8!oK3dKz{hG5sy)dWB6R`5z&Ce6|-0jbJ=){PUq-^Q>i;V}k zXg$Ep>yJ5Y!my8R!rdPZt+!Az9ddYJb{ZsVx>QN!-vzMxMV_Q_Rhy(0xQSkvoQTUq zI<#)2#d$fJB|yaRhaLP%V#3Vu7sY!~kSbm&d5E$IJs<%i&Zuhn}9j_)#1z=1=Y zpBhcQ*)e=cU>9Z**`bQ#pNHDDf^xdQMnSLY#(#7NX z3wmozykhcEAGOA{r<*W0VZ3w}9fldgq8~Pp=vy_L-@eSs9C2Fp(r^d%O|T>SuPWFY z|J1tMaztD<2^Y}wsDRxW#j})FBd75OWYglpQ^F8((Ty|=#{4+V!Tr{k#3_4a^-8H% z;~h=N1(dyYbOscbm)CC9JhBDcZ^Jg`KcD^=NIe>TwF3!&ZYYXHVs z^_?z^-fpsNCib6z$7SsEO&px4_-0Y&7E))O{%b9^akQ{4%sP6QUuoeHQ%Z3(Hp5WH z;HB?-_H8y@u;6igpOa?xuFj>K&RJl%bgK6$vP-b)^dCYPCYR}|Jz_5#m_#Mxo|zuU zbZ>VKWfd!#|A7$S2Q3t*D?Z{x9uyZQNne(=L=B$#*Y&VQT3m0#UBM_fB`0(Vc+Yir z1V(@NcK2(j;7wlWNCGnsexO&YSsumU{1_pst>@!CZqsy;rND^Xq7Q#09=oR;Kkm{Zw`JV4HuikH%n7fc)DZxUB*8d@Tom6O8>r{#CvO zyXE>p%jg-f(k67)53o9ESi_b7;igQ?xRK^$87#okbG5^BG4{yKaJ@Z_bA;iO27NHK zLb7=x{naa`xhv=hU3Uu>(tDmwh8SS!FW9d^Uo*a3df(U37{{u^kIvE2Dd9}z$Yj|8 z^Y8@SR~|s%K|8)GS%ulbI>)(BJq^iNyMNy$F8kw+r>JQJOiprm0unXFwK^?oF%;3W zMGOK8_@Qzs`FWy#D~rDv2hbB$?5RBej=Qz;bOr)Q1sycI6qj;#{a5$AD!-G9B2=sz zo_P9w^{CYqQ_-_-;Oif8(J*!3>?V*bG_L!U#--*~%kgvWxV^?Y>#+6@5)s?yU>>%l zDj3Fh^{8zryYtcARdMxii-HEL0Xz0#1U9`B>fcgt5>EN!LX4#Lcs`=!b3s%b zo64u)ozuLLEN!DlxlWx(2cj(>HvxbiDj2UrUU{gqM%4ffYt`I0{R%~4blON2CMxYE zm~&yI;JAIFt-eqPln6O|zQeyY^~If65=+HA)(y3}3DkLp--T*jSHu1MyEH2M{5a@) zk8Ecv8a7h#r{fp(tmgbb89@9a+rNj1Ul&I3CAYvm5)69*j7XvLEL$*#le_Y9ugr-L zgb^V63N!%0`Nk6Vn*~JYd;E$jb|$`BkEihpsn3K6N9q$9lW60P+Wd1vCjLot*U&gmje6 zqccFKex54qDoeLU>BCZIxLsy^a$Oagl;ZLMg_zI~lTAtaN-U}%lH+_S#H5I!Nl;Gq ztkFFt#1$NKBqV`^bTN1TCJ$8+jJsrNydfnO^{;v@e*7|<_Y z^)QzaeVDJnSm^!9(diccXS&(FkW>EFt&t4r77vuJZu;OSx#sFjVjmm0RN@eAz zYPSOV=)50$a!?Dt@Q)G8A-gy~7;76` zhZNW#LkO|TRdJL;X2zGx2Zbkl3K)P6R>++K{K_+fEgh~QJ@uwlhpPW_bj0O*T4)cc z8|ML3bLn+uoZy#zGJb-$<`k!yFk-jGPgVZZYE$%%UZ;C^A{M$U!&B?t3t8u)ojK}~ zbtyLtHn;oiXOOsmC=pg?=-Pk}M2OZL*Pcr7ENx;_TwIb}SAPK|_!Gb65~80k?*V!Gw+w$;#ZA=U`F1?0WrS`LmS8%AHDz$TGVgT1=n8tUT@(_VBw7rDg zoR@St{EWvzr_l(eT%SrD+{5oK-b&x>2R5!Pt)~Qzre}{KKK$?diMo?NxT><_#YF3A zQ#yyexHl;nh2(1i7&BvoK)sl8%)54|QMpA|cTWM+QOP!n#zzmw`(r*CKf(nevLyMA zzTLggM`tBu(}N18WlQ`o>LHO%(5 zN7`)QyvtKiGzzeAi)i3t2*}P6Y3J3YQm2I|KS12hyAJoXZNlg3`zpM}s;o{AMm)7j zXUX#m*VD>EF7O;IbbW;i3T<_Sq?)F7n~rb${?oCPD_yt&f+BUjdP|F(WADAqCOJ7y z{%ySt>-NKev0KbiB%h0jUp0q^U8)bYWQ$Y0K1zIx-b}4|&(A7p-;5K=v(owEO}Olk z?e2?%(7^+a92CykVO-C4%^I)6gTC{T*9B+D74C-H^s>*gbWb56sA|0=pc%SYITXF+ z)!t=b2ed6C9n|20{VP|6q(r-f)8S)0N^JlkM@7A+EX<@}&JoEv7ggj;m8>J46o~Y_PUnc8DkCWA)An8M0CG6QZrqSu&lJ;GX8f^) zv9Yl5mb<2CS6#j&MJsmOmaiY@Y*-yB-dS*Gi#`a$8~Zx6F3d{b5bgDFvFOa&eU0yj zTmW~BTfsNow9sTPsuQ%74wD%1(DMk5<7>33&`KmC7~cne0|mqE8EcHyz(Hgp6g zdsn4O0%lm0ZQUh`Deicep-VZn&U3KtD7lOoqKF?K)t0FTbY=Uk9k!aWOK$e>c6k>* zJoZ3`uiYOAWw(M4^?B!u#;d?iLym@gm?Db1jMJkr@J1z^^Q?mb0c!2HDJ41e2V4JSSep&4*JCk#+-V=5a%mr0; z8(Qgu@}@w`j={rs$&D)in34L=gZ1KYI0&-`j>I)2?~KRm(}<&4Z;$WsB+1Z$M)id{ z?MZ*C0|-I6A(aamCnq_kfRI#?PKno!q+9}-9sXO3*P&$L4lHPmig9=$lB6?GN@OeU znVciTC-sHDTm=zZUPt9SQnQAfHdnr@ZoZ=#sz!$W!L;;xuO3najDiYM`Dhf~Oz{z! zH`T1cKa*V{t~)D1oK$4UVjQ4epSa8a$&9at9h~wP<97Qn)P3%XFq?Qhq-4t++S)|F zw>?Pga1Z7ihcKQV<+(yC)?lA+jP?2!FZ!-r>&>OUQ{GQ5yH^+M&-zn4!!9NY1_RoZ z=j(OHe@S}>XN7N&Q0-kHJ5~z-hqs|WELgeT^y|SFoIzgQOxo&5ad^y{Oav7VLPGnf zpT&vS?;G{`ZYwq4`e42hwWG&jH1=vrSI{I9lao?`lF*Bk_IViIfW}cVPdtOD;*5?v(e}gsZ?rmwR-DbJGt1WT54vZ~CSyEJs z72`M>GP5_h-^LgoTe9=Px`KKlKl61LjPZaKJSs8F$zigyFHj58X9ax_bMNm&^d-T6 zALTCzwf&z$hTcE>=KTMG)qs0y1GB?%OG_N5VNAaA<_3FzHC7deXX9s@kv&*m=p0wM zjUEikzE(OBOh!7Q5v~dpB8=RUS3impcj;Xr2j9U>%t!H15Q!a zio81d7d{l)?Z>`p9~p!#VrV$Q-92uhnh&(@yJ_G8h&E?4X-JbN_kZHYCUMU~J{7eC zD3CJuxB`{EM`Bs|!Cmy%mrL+#&ph^$+Y~A6mjE~OE^W+L!dxb3h)X}Oc~fUoh?744 zVX=eD0I6oijGX80yve2-VqVpkr=y_C+wWZW$~XtgaacVz@07-6*qBmv`m?bjaP(>z z%pIT~;+^U|3czl_;x&U$XWju{oY5y*!B@5GVD|7~G2n{Q1(o?r9I1=}dnuM1lYv=v z@W(6{ma98#L!$=P9Aga-N=eMybiDO>=5U8ASr}hTB{dBN8bRbdeU}Qj4qspXl<8;w zH$q@V0CKSb`mMRxQl#n>vND|I-d|zLg0@W8^+Fe#14V zY`sagsp7UCKDRTlOv5mIpNO4hh5v8c1W9(5^_3+b1(#ErZDCvqWIR!Xn@u>&$7hCt z`c2#n64j9-xB$rUsnBvq*f>efao_HBn*ugD59E#_^NYW@G3L6radHs8?E2*1JLhs5 z)OgZc4sJkQ^N&;Kw2Y5#kmsHE9%iK*lkHl)!~-+>x6USq8NZ|AWR{j{n~V!-Xowmo z#*r4$ng^*6B(A?ILV(8J(S^ml?j&_idFXjA*qC|7c_I!(b4>YW60;CcR=1T;{!DjU zSW2%wEYc*rF<*Q&x)R*D`t8z?_gGDvwposexSqO+w&_#FB!|D6Zf8%(7 zTiuoV{!j9dZjg=L_9UhBhFn32s;kmX56G=iKiqF5KQH(xP-&JyN|t$^lt7VvpnZ zqQq2W{k|4G6ek9wl#ZUkqhDeXf0WMh;(8hGq`f*KGoGpjZ0=ZiqfY*2|L4ZeJb68K z>W__rPlA(Lu;L{8poDv9o#35u#d**svuLm6{r2=lPp=jC+|vp4ES|67^Qla;G3ivr z#k^L_f^7{Y4pFq5VEtC}Hol8KyBH?&Z*m!NQ}vq+E1!P;)g~TH6kJV;t2n)XRt<3P z4o7&$8%_U`|DC0RaZGsoZ_l^ckH5c!zWQ7E$OL5s!J8BwcA4(gH!$CMZ%aqt$a-~q ze#u;fzcnHacpAf|DWSgZpJ&UN_!bx5ZH2$Zp1XVO`oa-Oz#W=wV*Tt3RvJH=kR<-k zuaveLx?fZ#hg>%jIm5>!Nf>Ca=%wj`>7#xEQc>y`)$r6A5#GYWQ3;ji2$kx(BZ2)N z#K#Ejk_bs)@`pP?%EHt_v2Xr(*EpSp`Kd$$>BDT0i_(1YHqhEXzFc)NoKK~`O)1|J z9&s2Q373NU?#Ge<(x?=sXA8(%?c0`r<7YeV79nZli#D&#04FR~?10xEB}9e=^zwkH zKM}G$r}TWPwXzJc-2;0@yLso(Sl%<5f3R9@f02c+uvoTmqfHWv!_*oW3d)O5t>4UT z7|NVH>sIpAx>p0{RsDi%C{N1Tti;oz4g#o>w4!&3viyzaNDqrcEW3BmH9cGb4bpW3L* z(mx#s{S)2LvX|!C>c&+h<5xayYff2D`}b{h`~FB>sk80Bz2Tu^%Vz^Gu?L~yvb2Y) zcpHh1k)CDepRv0fJ1I^<=-K*BzuMZk5$tkp&`W=l)=+vrs~R8<<9P!}Axe z#)|HDuJ`rcX}Lm&Ki>Y*Ww%bhhao*@O0{`XCpU8pNYzry=x^-q&!}aS8=~HFP;?1L zafdS&(+m-5>O~K%?!Sn8lug#VdB3PzGzuJ``&?T%5xU}{UDKrk2I_z3S#NLRKyD~P zluB?4o~kGnOEA&6>0%SThBrQ3!57J`@NP#_Ddv=ciBS2U?7gTGB)YL&B?WBvl&R`l zS?RXHTcBuXf!l*7=}n`#9$=i?2Q9s5R1w7t@Ldvn3q`ZQa_Ot&xow_pUpkTCCax_N zV!!_(wr&&fZa36f%u-=ogOW2?!qt2_silTFG$-dSTa39qg0i%T`ZysvrHl7XFJ?qC zk+;v4ff70s>?sMC`EMH~Ofg7tO7NtQ4!SFFQc!9d;K0Kk=|beuII`f0_{X)OlW^Wd z6gf(H%0K-z&(Psmx?S<|qb_%|yR3VMyYy;!jD?oG1wiX~8JlmS?0T}10z~#Xj-{Y6 zC#7?3zwK+&d3f2hpA0#&YAyS(!XTUbp-T`x@?h;1Uw2hWoA8Bf$|Le97$opqLA<0C z{^OiZL{&HSVMpJ)FZoo*mshc6Hzsy`eMQ+bljo6bs6jwKP>X8bct-KfF%bn+S5q8r zE-~)pR$T`TFhE1`ytM$>VBDnrQiUDAxoT-(xD5ajJV)X>3*e)wA7>=#bBqS$cIfJ` z#a*LKhE15zZ&*w)QPh;I>C5Wl_ey81H(Jf_wl+hsP03{F9OeL$ZAjDl`u35R&-G`u zXvkoOWY7a^Kd&$2$2zi+g*2wg$1C=jk|LH%k}(|_a;V6DX3(t5JL}g4E$PP>sfSmb znKqfz-e;e<2r>n!GL&(}!oMD>F})oTodxiw=hGW?fPj~lVI6+*WY3zgYg`0t7|>sA zs|jj;``i?rAmZgZE9sQtdakeTHZS@`?PT9`;Za?DeY51ukNc`+HTsZ8C8IOM`=@4o zLzBd{tZ2DC5`mCG0-vq+jbT?c^)2Py7L&s>BN=A1SxWy5X%{Bsff=F@w|45V^+z9h z`2YJ+)LBEPmLE02;i`L0>9~z++do()o?ldM>Uh8wZ8htxy<#FHbZpn!a6yHzqtFFW;7~AM?0dSAdD#Kp|cnyso9vidK7uq7jY%Y20b=;`U02_zRQxc}rA z`1QfRPbj$|8mBfLk2;DjyZvZdQAYY4OI*dFjy7-`aG{ST9X$yrlAa6zlvsEaal-{7 z$}`dk=O;RN8~~yLC?NdOP~_x9TyWs7_`1Og)h?MRBd-38#i@VzGmm&Ne0AKyCwUdY1)Ro)L(G*d&B7F5zGpKR#o*4-u`Iqq zH{$Ts;GBNG35SsAB|kNgFaw@R|8zf$&hImGTZ`x}3jB2mvSs6$iV~;q# zB9Ac1k}lCW;U|BYjwf7{ZCTawP4G z$@7&F@!_^3zdCmb=4~@?Y`oG6@j()a9y5je2(H0qKgtB}dn8%rzur~8=RgJJy&ow4 zuX-9*S1;en#27|`W7sdB3xx&wi;co2m0LHqec)DQx^u-Scvsntt%VmiyZUokgFw~7n`ZF(z&&Dn;P|WW z5j^~)8Aq}=4II(Vp!N3;}`8I2+X<-FAR|*A$UB~5JI-je8yk-N>A7GP0hK!^OZSECw(y3JsYV$fMR70=vWkC7*H$E z4L!Kwlk?^KgV$|&H`AqESBQmtV@ZQ>Cxr(U0t*~=-zdG+OVlsepOt{H=WjNGIvAJD zDcIZ;)MF!>b{k!9p4x*?DTA|>e7m2IY)$OaAo47%u5$Kk&JbLv5wEKpjn&-AhBlyG94&;{VjS~r>!D@wEKE5imxGke!3N;<@*Q;<*N zBPSom0CHh>-x-QSt~L5(E^E!cDe|IS;F^dKMKZSzr0Ljql)C7;Jz0oS^vy!aFn}{X*i2#gy(1@hYd+#GQ$&0^&Ar= z3{I^fDOCzCiM>zU$HW%w+-X;6gA-v4fGaJ?b85L~7=>jQK!WD^Yi|Sz{tUvOHcob4 zlD(K!#dMGVJF{^)`P!{0#g3@8N~?)6AaZ3X?{C&#D!q7m8sXqB(UThoSRUC)sxKy5 z^Bdyb#JYG$LWBpkWqNq3-!o5wLex+mt#3WR-hq=z&5yk-8RqJt3S^&n`1E?>%ob+h zn@-JcfQ;6wScK9v*RCSaA z{FS9VwoB`t|LSQymbcj}9(J-2^;bN&fV~R#ApYY(z?9hg#Cuq{eGiliG4-wAH!Qzn1_N1b zd8Q3X!w@U%dfAt8feAp_Ro9`>O@AFS-5^6L8!#CjYF#^FEiMF~Fs`F5FarE8GP!HR zj0&WQ28X!XA5fGHMJH;5N`<$Rb7y~msuaGMa%uQOFuc3Zcx6voO~thXZTA5>tKMz9 zPBnCHpxoyYm0@r8**bgoZWe9r|FjK(-@a!M_Q2J4qO$eGS~~BSu;fW1NE53zGPe6X zT%i#(6Xe1KF}>4)CI>6h1%555C#!ejvie=QmVdUXMd(jTxR;GeZ+RUgZ?#(jzvShI zq08~7+2e~aLwpAPMd%j*&hc^f!~*Q#O>wl~010@e_ST|I)t033LaBJ*yp}^!A+@y3 z<_93TyeIf`0z{5440B7OIrC)nBKarQkBdFns$^(}J!Qk{{Om|t7I zoSQ9uNs$;O_z(b6K&`*;VBuZtx1720eUmA$Q+^p0WJlxC{6bj3DU<$FMs9GjqpbphQ%jDDN*BDLp*M@VOG*bT)A-P)QSRz!q^pBK|TXLEy?^n5)WL z#xi6*aeIHt%MZhr3Qezh_cAjp<0luS@il#K5>+f^|ROd7Wx#ElW|*d|Zk^m6>M$;{(}CXKwk* zQ(Ducy6B|wJf72g)bv`O9|_G7j)q^e-S(uK>63~drL6y zyhNIKW+BPKfrKGp+IJFkF>88CcC6uu8|wG`nB4g>pm!A`f_n$MNMU65Q|sj(P8Btx z1<4`p82%dC$%LFU*+>ozoXqK9P>ES+1`9@XrE~IF1rKj?glcNrAQUkOJNbu=0{-Cjq27B0 z5rUZIghuMaOjsW@zw~$*rN7gfpOA*Wx1K^KWSkMnM_vL5@rWCQHpViB-vn|u_(k{- zGlhT?ZaNrw&Pn0vddT39s&7mJrf@aF?HveVEF6(OF-qdcrHU+Mg(1s{0F-|iS@P3V zYAR;d?{@CE-gO+2g6W%GUIB3oex5jKLZpm3>at1i(MxgA1KwixM)B5)bH(u!4116S zMy%n;Sj;Jmh`*Ka>5YCx1U$QgKz?V5V8uJuhn8IV#(js5f{tlW)$LhxMe?vON8M}> z@+dxd3Ii2P1XK=e7@ivu8vKg*n%a$Z)I=6LCDI2X+SD(TuDGJhz6JL`6bzZzkP z*#bI{S=RD*dgQETLs)Vy`#nzbMccaiPT6?-k6&jRj;FSvj4F^)J`vNf(bA?jK~5-eB|YG`xIkJWR4`Iwd4f^{q*yv7)GGnL^b9W;K{yt_|Z)}mD^YUqz8c>EOnDl*G!tOPX z*fHAo21p*h%3XH{cIwX)SKhop5|9*?OBg2{D-Xo-lGo;{$s0m2nB_a)q%`3_c zNvRE@p}v7+#h~?3bIN=HnBYTlL|z{gfF{~kNaPt1AL7@khF%YpF9+nA+l7QL0mBV+ z1i61kB2Lobn3ZEej61YRHS}VjT(48cSGVBl;ioZ+xVZKs;Tlkye?d;Qtq5bDBL|ymMt+0O#Ns%dNIuYPuwOqbsGzm| z$)@nyGsb)}8N)+}5nPeoHO)5acx&f_sV(jz3L1F@S&Dk2C4wD50lPGXO|q&XnbE=| zrr@SfH$4wSE)GSs3)PKDa@~Z_INWf%{6Kl_?K1)m4Gkoly%mn`*fUyzX{xx64x=?+ zjzogk#mpiNB5d?|zI^rVQc4N8)lEnd%9sk8)m*05d$-t{6iYJ#dBI4|1%k}6LX%5yi7c=RlKpK=Kj#*hRH&c? z8ra};e0aoA;jP4$)fy(bYK7S&O=RP+qCC5bG1(%(kc5orts$WYaT2*D4I(0eQA`DvY+5! zc$$0KwP~M$2+8`9*|;U8dlY;JHXv$N=G@JaHAFu&XRCCdl2^h zeUtTI(#$NZRdQ8o>+voWj27@02FG#l_LC$+F47KEN!MFr5$A)E0C*#h_jxYOklL7~ zsmley$%zX+=3e9$I)MypNHW4|HX^C{D&Qo%AFr(wsI(4R)VmF5JYGwhYs=O!DlJ;y9$dTp zShl21k`ErGz57zm{$a0Bk_{&|+00IgbPGx?R+hNXD~SCIywe^djIMIN4R{$VWmBcW zO^}**m^kncQd|(?%{S5z6WQv@J-N5u=hi8=Jnx%=ivp1M5Kt;YZ_d|DNrTqNX-sEc zqVxBxM26zJq1v3Gg9(w;-na_io_zJ*uoH*=F}KhP&Pkowt)DWNG@(S-;~(_`3WFZe z4|!cC7k{S7FC*(h`C;EP0FsdJD^CD^YClQJM7K@oUF7t^W((n;SSgz$_N-tiXEMqe zmH?I4WCnJXrsGs9o~k9caxb?XL>!Ky4b4^RC`#y#cd|xZpq+ zwJ#BmzLX0-mho^oK{qakueH^N><&^zFY`@EYuW%UJr|4TmHeX~u_)hv0_uNb8K5aYRvi_oC8)Wn1@cH_2@su!Q9-I7ZJ(^LHVqKB~4i zhOJ(x(#X(4xX$yswU6b0DyK_?I{`T(_mz}Aa)gP?_i_}EaFdR=u)Rf-%Q^|_-Ftx5 zVET?Z=UJwIlFp39Z=%CI`40UcGO_T=ptXm~-LMJemb?$ncus&@leVSH#leRzVE1`K zXdteBg>5atd9$eVoc&HA1B{sNCfhC;*?eT({S{%*)qGCA45>wuN;ch|3UB|lBhue} zuRshm@W$my=eNM2y3dRNE~kaG*FSL+JrCon09rqXm{!;^5@tt;-+DWxoP8+@UIbug zaKLb*tqoy>2tWkEw_eX16Cw6<4J#Al&ig`YUq*;qAGyQi*WqIto*B73%W~*ZW)cW* zNJ+;5IgmG3MwM>l#J+lJ2{xpp0Gg`qN$pr~CGCyqaRXEDj}@f62aOF!mh;TOv0W-w zvaWKu&%w35xi`et=w7Zr*24b;xOqsUf7Ov^!Fo0i7D zlPxT%OY$^AcesItvM%-y-qQdd2B5vL zr@e>Gt$YD7hCxCjj7|miXAeGZ^bB`_0ucL}E5-K<8N7xm*X*%Wm0bh;HrSHX48{pR z3TPfdQb~1|YojX1!07z7D}YmV^X z8YR>t;0273ij6_G;g35SW!5Y*I93es{D&^;2nssxjY2sTw*@&6>hQKYSZ7-2(emdZA|aRB!L#Ov zQNZ!hD3HTpYfy&Q>21UQn%9TTkIe&$0=2wA5MmF-Ac8qYs@SsJv&)Y3M+3tc3?CHI z5wW8SAv{!MFYwE@T+fw5A%VwFI|T*0^76Pa@kEpXTs9ZwR4SgWC0%ueYtJIukO&PF zl3b948dOu^$EDE58I5XZudbKHNo%MOaI%%a| zPB&(fHkis(Bbg7V{;;V(AbUY%r^Y#b#u#Ko3jG39+& ziYwdVhJ}GdqeX)}XtCfdj%uWN6KP@>bE_P!(XPPqrn~!RhRRi;8O!N!4hx{!)riawOBYbB%!b^9o-gp9+bx3o9I){Vb>g zN%@>ltStAxf;6)KD>sA*N{m0zqJnM$G#H0wLo@IL3GCVM2KJSa4P^sHFVMjZ6c>bl6eV3(YIi80 z$d`S9K9S>-S-dV%oeikAl?!e33F2`|yz3oFM z=X%Twl^<{?9KN8N238gvV-LQpa-&Cn&LBHwh=m_IwlAlTIVaZ<7A?pxFB+t|+TK>M z=Bv2Q&-+e2MvNM_l&*zS<|`hmLpSjk)mT!!>n;drJ|fmA!;e7`a$bUX5;toPD^cJO z7#Gj&IH@38gLU9g)+!VuxvXHz*>-FF`GUbCGCo%;G9a^L)RmE9OfBCYjerDD0nu0c z3Xbtrv2X@knf8U#NLM-hpGfXeWuEaBPzL;|zz*z09=4$`of&-c859%H(O+4^;6D3^ zoTxo7n{(NZ`>HDe6nCWGG+lY@H!W$k0Bome2Jp-|${u`~Redr-=yg_BhUnijHA@@2 z8Q6{^NDn}rIcQcU;Zx&uFc?+oAv?ZThwT*uMaW(Sh#5clHsNTHMSA_awu%`? zSb+kE!T9)U{aI!1d**)x#rsr@(B9~!u;dwb`h40Sn)j9+5#Yu_S2d{c2DHagrIojS z7ni`Psapt)b7+6+)XPfv8x8<79+EcV({%U(TMvAUZ&xGdW9WTV9s*FD19yOlA{anp zK{G|d1D(H;mt@rM@-S7n`lNSvJC*I>(*kbP9jdVwQI?iew*W$`!tP6K%BiHzxMTXr?-o!W$-kQl}v&oh%)PAr4m#ryPuHxtoGw&=Yj-8Kd zDbJNkVy69{U3!Tv&;=dh?*o#OkWoG_@$Gudjczh9_AP22pa#9JoiByOhlvF605CHS zMOi5hFkUMwY={O!yTAKb<0>19au)NzLqjuWnC*OimC|phOuYJ=c!C*JX@I5 zC^!>AdYCXDvDHYoGwplrjG)j6W@HJqqU%HR>=AMU@% zErIWdReMAvNadvEM{C()Q^?o#<(ZfyCOcj}BN(sb;k2+01|KHuP=3JlNQ90V{QlNv z0S?mg8@swA=OSBRI7`ORwAIVH5;3uYK#h_B4-tJhOgU4csJ7Tn3#IV@!6tTK{K?6{tcYYt zLKvT$_*@<73zgHXn}M+t1Y7uAh<%ud!2AvKYH&myb&fh&Cg>jz{zE@`QWFYjsZS7W z)6)zMXDI*plFyCPF;P77HxnIvv;TU{|(DB~nemItq4et7;ew-EkDiS8{S zpy zA@eSpYP!`_zt7S^go?Yvs&H~6EoAFBRrFe0>DK)lImUk%#sC#}{w6)he41ljYT95O>t4Nemj zbc4VJjO)kKdcAEa9W{6zaqXTHc~zK=BDlKlBita~6=saG)6NgGGVW3#DTi)2gs%;i zwtm6!w+FWU>%JrW*5m|U5R?ynBv@T~{Iypk!6Q^wA62QixDAlU=r%MDMhT9z8sjdQ zb^r43)PbS#o*ypKTWjLBwI1yx+Ha`KJ8Z6VwsZ+Oz-AK3?hcYR%+vqm4YooTcga6L z=|waN(+~-SDx54R3F5E0zM79I<&9>6k%wNUe!cjnsO%aLxJuE{&L`k!K@k=q6BE&` zV-ALSKlLi97^0&YIb-(5GExzhq>LN`hFwbEe97;YKzKAx$Pn`Dei5W9jUpC;RIrWe z&3Pbc_8U-4myEzWjv+(kFxltTEEugZW|h9u2X$OgsGs!D_eMgkxymHsK43i#v{)Q=R~TV<4G`qRBQtyd zr#z8^SV#kNNWAU`FYrw{oU-`O4?jr>A}9qGx0GWC216SsO-HLT^TrtP@~^DUM%&6z zab_{GOmL_PebcM8Uz;l^2)?2zc`gW_}V5;7l(GH@mq+5*Wh``QfW320uq_+g3ZyDGLe{~J} zQu*uFr$O&m!07d%F(bt%?uA=g3aF|g;sur93g_wvr9o->s8GPfC_%-_fOWyw5i~Y`)I+7uV{JDEqF22c~ zdVek3n@KKpO@c3z?hQOOdBh$KUKR6zhDH$4O`tFX6BF^xps07$>$1@(0*8MZ7<}|8 z=_?9`mDG0*Z0+N`9yrf+_Z-M93{UzqjR+JM+leVBX`^rV%Kd5*Sp$LH5H#z=CUuLh z4Myr8&tb};L?Vnbr95{x=W?=5TLx;Bosw0a`YffXIGKt_QOh{GWJ*jp>3)j}r#BFFxkpCFD|+x)z~2!?}6|Ubx05lV|wP`58~l zq=vAC67ux#QySp~Te~xPPRwIF0shjo^Xu`G9imf^L5tW2Sj|dQPT~^hvq_eZ`(++{ zQ1iNU7!H7dKfv3yZK`sygB(Ap$&Ky`i1mm>ejXW8O0o)D!>2Ncj1U6^sM0D>EOySu z94s>VJba)E=2430Fa6a-GcVdDW*K^Os zV^7`s!_Sa;LSQ?@wEb#I;NYulDDOl+H3TT@oPCzRL0<`o7*zDJyOstY1V|OcEebg_ zr~*T7dqcNxh7P{9-?6CYVm~7_IiA8 zQ#iP3PGxu=4j9L69h!G9_mDvKyAwJ zxflK0a1JfIJ5WH9nstQYT}UUsFFL5+)D$5TSAH0`A9U&orM$FnBj?8JMtyXx^;A%{ zD&s&@NWZ-fiwG*2ssT?9-fkz=NI({x$VTOPRk5RbuusW)=(f6l;Gjauv?Lw~Xk?chY#duuQ}>82Vpl`d#BML@ETnZG?XJZF6_ zc73~6rf8)uSU7elEQ>eGg0$>%-CW)H$ubgB0Zk#*%cW20LC?@iGYD-=)&|^Dw7~GE zlT(2}(m{;Y~1^P~ebf0-Qr2$`yM|m7hpk zyRyXT3L{eU_KG!pLio+y72fSW$P0&_5F$(E;JQ`48CjEOEM}#+Hb0_B$BGmfYhUQ+ z%kMzpqS#}mxUzc_m@+KG!XV4orcc988t4V9TPj?01&-z~iYc{E4fJ%Az6Mt@XQY!M zrW|1gx;!~o_J)Dq?azg?Vbz-b@qZvv3Boh@^Y%f=UlDs~wnT1JlAODRoC$QausLPq zlZL!)>orT7NC*G=u@Acr&|c{KBL5RlG+({BhO@`1lpP`cYhW{aee;u(xv+uFu*F&X zEyt!LU})ClxuZ@+d~Pvr-y;n5*G{3%g0e}R@bSevs8P}p&bHOI>^Z;TJZm5TTtkxH zxcY4^`JbZ>wAYEXrgut0&U;ILAF?!^-$YE$L@tox80{$vviy6=ok4$;aqjAHl!2H7 zwA{5mr{;cAQ#0_msr{D$>(nMzV*H{9(miLLh?VNRc^%#|;IE%)=c{g`Oqs#H-KMrC z22b=bMc(AW4qLC2<~rjC8x@y*_ZoAQD(Dpi#bvPaCI96t06e|}v2 zlTFV1|4T!xOwEXb+GG$APnc6{R zHJ3geiZ9MWC2Z0A&@xCamD>H|!r5PLAAPbH!CNFa=KC>z`5Zyq}AF|22Tno!b zjV@~>F;eH@65J$fqHTU=f2QOU>|jSFzFvZLSGT_5rd+j~4W89XB)(W(d@{`@dp*s? zgVSa+YYs3TSdBkOz(?07`1di&8};RZWBJ%%AHobGFnM^?%$5Zf%0&(4528>F&lH|A zsa1g@@6b1IljEJKl!Au%!S;3s&BAQQ>VSr1UUAQghR|3R!3md*-DKcci#n_-DA}7* zfK&kEAA2Kg<_&u8&t}?Gkd!qmiY3cvpdP`-XbU;axgs9E$jDyq}QRB3G?D|e@_qZ8?H!@HoI(po$CIuPq|PD2vw zIlOO(B4bGLr*FC{y=RI}xfLA?Kpg&m&Sz>P)2oJcOoEWh~ms1G|Wt4ji3r^(Y z`CEB?K?0Et!x`4`znpFDE2p)jpTy2-hBj8`t)5AFpD=Dw1ExkU@nYn(QxinDpdibC zn9>{bgct>q%R7S&093BsG^GN3z#KmL9J3QxeukghAkKon;Z?b&ejFvcdIPl}&Fi*> zG1tXAS`dq;H5E_AJXPtec+sBk;1}b=SihHIz8$Z9va08*VY(5{LT761EHRBlXaSOs zO`e2oM<&K@2PiuYNc22pQrh~ea(17{w}x9!JhRd!p?3Vxv-wiutzy1tGwjX_FYJPYwf4z zh`&`54KCKxi)9+0yL9#%l_4r0w1OKkT;C9^nJ{92qi#Cf3e_?iQ&1O_A03MD*j2Wv zjxwF{@(XhE*8m2xrrDwq8BqK4 zsI#8{#nT(Ta3<#$#s_+*O;pd`rB)6H`hd)tP9#|GGaiyE_W_%W$ZrW_9V#0&vC8#| zjWNpD4%n7_B2HjMh-H#o-L&_hPOu|93vL$8Z55T%mr{zLj|4Sds>xKT;kpA31}It( zWcf7t?E-j6-U7PBo^VXs7~9qfE(e4vye8!C{`6fo!xCo=Pr1jEuyFnXgx36+?``V=~kk75Op*BCHPvB#JSQjbHcSR>3;cWgkH4eaXA z9Ro`jrL#7*c6^t=Fcqmi9fyEOux`BIZOz`XW?82KsPD&Hui}N6YQ(rNr|-NtD)hiD zA>rk5`+}cpO;oa?hY%uX5AS!XI{scaY%Yo9DSG1E9 zfh2&r7FBq&3eDF?1z+4B!$^35siX;eMIP9c8smE=>y16aMw_iBy-kN9;gTVgEox)R zfF!70r=mB)$KX1FG++E~p{!ech#f(er2@qWM72@J%?8=l=XGSL%o~*t%8#Af<$R%f zJ$6arQ@|`hevX5FDkDp#|>_MI2qoF*PuazzG80HAg zySz&1LA>!Lk3K5!BMaM;Exkq&iSwsOdCrW z4@Ohq-x=dJm$`UoIN#}QV+%bd<{5aWmIHaSvzs4vdF)XI_gme8gSUuih)Cg^Gevtt z#ARo{5f;;-L(FHLv%T^rsIsC*F7-J`vOl|=I$D3j3I6T2x(*y8=$@p|u}`<~Y@Nh0(>Ey?b#$R)*=~y(I(^T^Org>huN$e& z-yqZJK=_L1$?JhslRVeP<$*I4FV@hV_w|36N(Yx1`+j(rhTlP<% zsiuVO5J%6&CXJv3!Fw!KpsxY57F`SNT>Z8_v};V!THk!=)!MtS0rQzAzj2e1G=XMw zm$A~9m1i9pkpeG)7dldZDzyn;Q~-9R+H}xhjhW9e!~i~CkigkY$`T9#D=GK&7xFjV zDDN~j0UBI+)$@LsJj}&JzB25b_aR}V6u;U)ng}T!z|>BOS4=aE?cu%+iL%kqBug8d zDp%T>;(2qSn6YwD`1O3`Qgr(cE)NuB(D!Y{aK$V7^x+_^ucd%F!0@CNqr%W|uNJ7l z7VFZNJo!3L8$`Km-25r_>t?A&X@kr{c1Pm7GpI<;j}IcLY9pU7goXTdOgFy zK#pJdyw2C>phL<~WH5?>7cJ~pgUaYPL{pQ%%2r)!{o4^Wo0mf z#GFBz77%O_EKhj60`Bav=SKm`@@&X$tCsYw%`P>{SFUp@{nS?_ZDKX>yjt}&uo5%BsMUy_`6^sQ@UmioA$7+f%teuG?#qe+0?c>XIN9)3iE$x?ql z(g=MvUlMeM<3I!SHDdz@5!&`%VOfzmN_b%s?@2Xz0|w-_XxIMDMsjeIh%S z)e<9P3iY0U!fWl24y&vmoLwyDa50x^)K8k5l7b!`ruN~l-c!J(s?zkBM2cAEJ;{JS z$W$JYYc2t2p`ogRiS{@%E*KHugd5SwFI@tEO)ti)8fw(!LS%ZH7M0yALN@46Z_pW) zoA=tU=brdQ%nj~6AdOz>=2lu>XTaHw0G7kvK0oe2ijX4|20RuUyjtGvHGURR6KD?* z;knO%t91H=`sSjzh`8-XG67o1o;kh* zar{I{3$>g@)rOGi0-%fJSTNl`n8CakEy*Q_Ja?3khvOT@inyVSrWFhnp6iky!#Qz|SQ!00?f?^& z@I#NjKwba7^??+kV)=Byec$%U)!IR!>ea1!=OreAry_B?s;DGb(kDtp=&9)@* zb|PeZKb;E*OqxMNl#ILgSunMHi56ALG`tO*d+A?GYwG1EGJstJyGdyag$=)I)^ zYZlt<2esV_55uo0X?{uQSjl_4EIkUCDxQu>31;!4XaC->C4n9OB|IZ;`jv7esY-0G z4)m#A5LGlkoP@jj%N@ceid>hU71jnXm>fuIEZiKWWJ=nw?U13SUSAAb2HEDqofm5x zBzwt@y*{1}X66)h|9sS(fO#fCPM?w2O52?d6UOX~@BKEP-LK-1t5{V%LaN-9Z%LGX zA_RUfG`q}5Bo|pp>F8thx3w{xWN1?8^U4=f77uC33KE|y!(yp=IzJyFQGH@3W>>z z1{b$~7qtp_JK62r+$4Hbql!!rjnv_ z85(lrt(pUbP6&6av`c5JbPFDMJU}J5M~`WMQU~AkaSJ8j_n^)anXej9{?+#W`KHo_ zD$-X`n26^kYik;bNwJg#kIazeWZsFQya1FG{K3f9jI#Xw&RZtpt$N37YEpX-AIZx-fk_91Z~#LY zl2fJd?SCa}5kn=S+K^L~J^hu-=lZwuj~?j!@%uMD7w5n?zO5DmEVkYpzv_Xl2uh6= zsH|ZOOnd~F)v=_9lzL8~G^-tf$R2vD{ z6=O%etcyNRT_;{vvv(;{afMxIt5zCjrX{e6c&s2#H-7A$c^`DoL0g4kk|<7qcv0RZ zA293Bkf!oAzl;WE1*OA(;KDpnQo{xF*d-9h^N17Zy&R-T zdRsP59@{D2Jw?SehnjRNNwk4??w(@Y&IKJjtZkK=IrX@s#@{0fu*}`sl6pl8ETncg zumLkZGhy`gFty;QLjMWr2cC@ZBb(jEBcVqJ1HA!?e`h6Dv5nzA-h?GWTBgy@9W|d* zRN+(R!Zn(Ah6{q}naceX0F>TAN*<+6yJVBfMsRE9tH+}@@86dZcWqx@zi9&)3Rlh0dtlU7`o7?VxRqn`0 zsm~N}HF?D6mA&wzvq7EyE~T!dPsg6^CCL_FNWl84K2O>g(D~r)3h{q9#|H>J>SprICW3Jgcebm=}m_AxF9fCcvXZ3 zOEwyw4C(iUJb^GyDAW5&fKhl*(?g7V& z={CXf=~QW5q9xKMaMxE23&4E3v%qMSOFtFBn72>ckL>=OhD52{l_wV7*1_N16>vsS zGmEdje%R&W@H!B=#fLWtQWu=R^{$Tc=)#16LGzj4o%im9bDj>M_CWmOA5bdnvJ_PioaP;jW!ctw%Yo9*Bq1O9wfd`G{`*kt z6Egk8Wo3`7;KtDfVbMAMcV=*h4y1f6q=@kvP8!PZ*T(!n5A=Q>0Rs2zF-VMo_cHj+K+2(aQoWG>w{PgIS%X4 zy%13eVuBj4Gy?|>;Q|@&WFj`tDfhwV;X|>gTl6I`s+d|JfU$W&sPLL4qtx1g7ARq= zIi556nkaRO&kYu&tLCEmnr|G_3(-H)4lm3KcNyq-)~>n0Rx;1jxOGw?_<{5DM6NGt zEHHm!4i`R{5|834c=4xO(1!A6}Zu(V~PF1 zRI1CSwi6-m$4AOZ0X8or)vJlo%*m7eL^42-u9_Y`^pV0(Y4may<5s3L(Wsx&no>M2 z6_%ggZaJ8u0+aSUP3^9J*PHk8rH~Sd8#?o)bq^Ee@F4^B@DpgY_75pO7IQ3bzLab* zQk$>1?pBb7H0!0|%&(Yc>_QpodZlpQPl60fphh)HKBzaw+=S@{>bB=AKXI{wu`J_I zc1q3nUN!19UFP|Hb3~Ica7jr-7Mx|~3uutdm{!wwYX47kibVv77D3F+#u?R`Rwdy0l~^i6-BA@=eeUTJKUCp^rW4 z+#b5P66w{GBJ&nq#tG+X7KW1PNTt3!UGWkrS)A|f-oR9yR-Gjs79O=MPSpw}j2Xq- zg%}CI>c=>n=UjNfK&mq5>h}{LC`)@2-Qg}PzwX54!4QQEEeT2aJf(}HX ztHt0qeJA(-M5kIt06Y&e&D7uAubtj{lrqICc(qf9^#MJg0b#{C*C0GCDIXC*`h%_Dc%6<=ynW8^s358U92}X} zQ~|aL$v@7OJjAd4BE*BOhFN26-1!gUkneW;r!%R~S9B=pPV`zH>MFJM&;6?GIpHaD z1k?MeQ+N+Ov&ZTBGVnF?ill1Fmpv|vZ6^@j&6DYBY&Au-Tg;KQdS+IVDC*#zjx`#G zCtZ!a>EYN|Vj=$5sscc(DMu3C$$dGw(0lFaD}VzmrUjxTjJsy9)+Y7jxL}=APWqeK z>`_2yniV>k5N$p>DDYmc9V`?Zr}er-&gnpNcLJckF6L}bPEy4iHvhm`MLMJ>)M!G? z5T73AbGK)#6F~a)F)%@6VpCo=HKhIY>O2CvtU(EpFa-XuN_8>3gSJ^<>iu#XFpZOu z2VT}(#kbjbyR6`G5sKRSJ-P)p3!pek_v#M_uQyq;&Ro0Am`lgwAgUorvLlZT42fYk>j`4^*Z&uj7@OcV!dbeXyMVy#6hcXH%?`%cT!6=9agh>gg7pj-G}m({ zJ>B)e_rGN~OKF4yIQrT61?o*K+mdm_U*IBrbPsra!P4(1pE%qnt%JTQI9E zR11KN(tp?L(Mg4@{B_D73&wE6GRwbqtO*Ox)xsWTKES-urw@eb{l>t(kCAHDk6|fl zy!XuIO>8(EoiI|xj&i?jcX9%% zU5lh^y|Y+zfK1v@J$mr-a;ud#XFj0lV~R7?Nd2aPvreyQf6j=E|loUp09W4MN$} zwok3=fT3;A(}EdFSzjrdQ|gW9D}(h_e_$2{>b<*ONdx*M!!wEnls-5pJ6Whib>Osd z;|-K(2*YwHZnPYkCJNC$=PLek39$kKk^k(Ai9}=$nh=&C$H4^H zEft!a=D4k0ifR>S`cu_Ko?N+pLT5?#y9`+Na(3oh-8XcWaxN<+_iNEs@-C`H_R!k&h2lKP&;~i$j(R!w zDG0m#-`;woHvtxhiBGO+Fj{_jWiOt^Y8Uh5hwdxDOAzQT2I=np?Rj^2K!I(Hg_+s7 z%hZ%M7NHl36MGyH=ao0_!ABiB)k_qTC>DoODJRPUa#W&keSbEGZ{k~agMr{US!t`4 zC?mhclwrKlYUZ#>&ENO0VC1qB{%QT&=S?-2&h759zn^}dCM!$_ya@6#C+Esp0rleW z2t6f|EnBF=i55Wu?HQ&UZu{N~CnH+U8lYGGlS>rJ?e8@EiXvIImFz}09Zpir8Q7fH zxMQRNGr(1BE4m{Gv{2Rl;7pS*6&G0{Due$krqqh*_;yfqS*z{W^^&H=4|V8GVEHln z_RL2|ATOuq+yGM0j&kA}U=`gbh+ZySz=ZG>O;XogvhZJ0Z8Q!v4X!rc#pA6w)z)q@ z-uns8iNIZ7h!dMJ5PHLeGnw6aUBOV6@uvMoMVV z^}2ZXem<9AZ=j==aaRu+@czX^rMu|*jPYO$cqb?V(eeSp-;Eo6K%%_?E~|nGs{2=< z0gi&U1KYKttEa0HmARYKw0l*w%p{7{txfjdiMZQZV5?DV%w*pzH{p>{aWSCK ziJu+)^d7XAI$?fEu2ix=`}R5@(9;W|H7It+F?dG!>i~Mcm?GH|#%V~?psV5Tbr`FW z`~B_BZ-o=x03_QAx!i+BtbB$GOLvj{j7=l?IG)Br)czFlt;S70An`o_x>Uk=^^=R` z7da1)IXn_`9|uUSV@oclWPl)(_fhRDuM8?+g%Fk3czj(f=;^kVOWGxP2@?$ao%@thzzhL(a{CD(!f9!G02pN~}1mcqYlF>!yoNPcVmhKGLy3)|HTH z5wvi(F><4tccHX)Mwo|nT*uUbuS0&B1T5fDFbeaADbgO0nVdtV8$6G@TmW5Y)YFAJ z>iWT%Rg?=A`)6+F0dX=tA=`-NWKV6XN%t`PW3PiMPxRu$ZB~Pq81%8qtvge8+5Jv6 zeNO2CM7YJrHFqvST#wvlZS}k1L}?3mUm^7&wum|RUsi52ss!*DZ!&WbD=SMt)#R%&VIzI{jh+sULI6ZS zyT4hYPS_pLHqt#(!(33H-w;Q5rfI_SFC8wW!NeXz{_*pkv9465Robl9#;zCM!20+Q z?YTkhX#q@0pu_w{?VYG`qPEvB2@_H-;ecS*Rp&7QyMY~dsW{<$oT@T-Csdt~^tKdy z#~Sy2_K!TcKUHm>)U$cPfSX-5c+uW?PgYC9HZk}Pk4*IZpq!Y(Mu7utg;nY|c@XKz z4N;4Rxr035gW2eXSzvhZQR@_)*bi%Lr904IJy8acD8WPQY*DN$K14%39XrH))tLpK zC;80*R!pgvC}FPs#vsPPK)Tult`4Vi96F+Ml547Z6Jos$^PDzo04s3fNON5jBro|) zlkr@!b;w)A8SasszaP=qs}PNPL2gY(l9N7tw@60?T&EAIs{z$F6uZp8@4+!I6{gN7 zX%zoSh9g1tMPn59QYnCuI?pUonqb06Oj+W$Ya)~q^ab>>`p-&O*jCIkeE(^iOYy6z_uo0NMAyJq2j(^<; z&Qzt9qEEQG$|uBtvwN=icW#MbW}ZYqd|;2ZI^O4R4-;Vg1?`O0@nalT3Ha)`W%R9} z=xygH6eUua+6ts*Sm5J=N`U2$7)r|@%4NYR4}Ja-*ZTJzsmrOe(+~BqXziIR_>Frk zM6=e-pOpo=ENq2GKSgR~AxlGy1wdp1M)?ccDx^}6fISwB=s2sr8!?X8_C}1egc@Fv z&oLWKhPDE`Gdr$PfyHUFII9c~DovxJ<7kE2fEQ^ZhPV77K;bNfhj!BN+K|Dir-Adp zyF=nUU#W9ip*rg3IZ&rb&rQMc3!kjMBLURQ2-q5Ax57f4nDM%i{~)fXJ>AQEctx4X zoQb!g(jl12nhEiiZY+^*=W{4)k$?8+E_LQ83K;d4nt*4{k7kLX*ixgi$ycMon^15m zzZC8eEeNI8;?O*LIZu*%=2%91&&dWA`42x z6Doca4@1F;dfDEM^DfcI*9wO*m_AaUi8mhL5_;(Y7`yB!`$0j*A096}ggMkPjRY11 zy{V)~T}z@?;som>%b75wfHxHv}bAsCShuOwQt$RGaA{eKUbn z=4UzcwXwOR@&L%DKzy(!?hq+fqB{cGP=x!mMTkpA;|VWfn!Wja)4=p>$X2*%YI6TW zaz4kn7Q+EEV7rzMn_!4>Yut!WBbVM&cWmsaO9lZ_+M`qs?ij*+2~_7tCD7JASMuK7NFPOO5dL7}<5_7u1PMZMpJ zichA=_0dMIxh@kVSJjZvY=ei2goBaIE*Xm!)1X0Uvleq6YjD&l=dssTSjR2TI$~zE z|FI8-{BFSJn0ig!8DQX%V;ZNN9@OG?Tam4RTCSQ;4SB3hzuA|?F!v_sQ*(kS%J_8P z<)G+g`!Kltif8H-Dm6^D%`Me~jbI8NLmg47F?5pRT|g-~grC(9fW&}nZkXz8Yyw1k zu3KS!l+B;Y>kLH37;ltPi(^y(gOe-2rUDDqxozkJMvcp`C&)f3F+p1NQ~(DF%@_O) zK)Tel2Pk70suIe?O4m+cOEpkF+$||SF%ZK9;|2Yqe!ZFE$#7YKzAh-E_oyP zweX0hsM~W+k{ZE#f*7@|sr`0N(i!Y6JcQHQCDsDqbh_+06&Phc!GDl-;ZvZ&i;wZt z6fyV%FtE>9Dd~hI39r{0v^);%BpNj-E!?EJba2Lbfaq0q~Y}{ zgH~$Fn)E7CI+$;`)H#E>+U>6v!FZ5aml1Y!N*B~l7Q?uHyR9!P#<)Bu`x8D6{~^53 z9BhR?#KihKVj3ohcdQ=c+|w(`Cxn+75DT%FuSz8_=-XP&etVU=VZd8-B6)UQ%3vte z1;?%nC5S`ko0hu?hy#&*J|YQ=bsrdUCt!z|mrEKv4yr=%X`DTO$Uz7!9fqVx@^u52 zPODIM!bH{V<=jJG+=AIlojNXb!FsTKyNY@90d&ri23W*=MV1k{|dnCec*Mw@YYlj(b=tmHt2P|26*!{;I?c^?<|!n~o5C3u;8p{p%Ty*(PdEG@n*ot~x zu^GWN-sW0sxR{De5Ak(9!B$U`;3p~M-=xL+T{1kPG!UP#QsvU=0EejRYm=avpLrRs zs$m4dacE?ru~PqhHpaz6%~PP<d65IY!uGMb#36A=#*;y%BW$G6%q|e(gBJ9s+rw8(5p&~5kK)0Ushert5_S3z{ z+0Te0S!=&4<@H3ExlCt^qiUnm4(Ishd3NF^8LE#ivNed$+hSrKWwcAV66S!(j*E&|U#9ZGFKp zS$NOy4+?V9#wgt((U;1Wu@FDkj(3Sb#Jj40Ij!ifW}qk1NAbG~04*VRh%GFoVkm4r zG4G|0r<<=^sb4;%0kePVoK=J}VVKc3J9>mb(L1oF1<+m1Ux`?n%txye-a@#iV;-0E zQ7QSfW?&4ZR)UL3&z=IgJ96NdokjD+Uw|;DeUP$|%afKo4~8~jAYPRjNaJ)V z5Cst`9WL8s?_YI$SX_tY8lzJS{+gSMZw!W@*XSH2$##1TZ)pkJZLZ3JdZc{4n7-R8 z%wOKSfJ;=AEHKE_D;<`OYnZ*qiy}^v5+9pN^Z{|}aF`;d)5=k9@wG8b!&*ue`qp{X z#!N2-Zj+$8{yblYI7|KP$fcC$;*cWA_YZSM_KJC!r%|9wt36f=cUGA2Yl3 z$dE`f60FFpFE64>$iK~y`faNvZKO^&m~5f|ek3JoR}Jk+UFXTVHP zu-H>m?~WYddU1@RnHqnN8a;s((?x1G9rQPbFY)yyJl#Rp!qwAr&#v zr2Z}HzW_Z4i1n@JeGsj|NcBfQ=!dzzm38!g&MXm95U>GtzO&mcL2-9~w!$jVo*PeE zLN?%y;gZr37lcS%5-Tq9MU)h1%B*CHNbU6Tu%_Lk0f)fvN`K4)Y5(NyZstm+D9e%hAc9CT$}1N@0(_)5kAN(V=-EUgD=+{g?!?6*jTcR zPeC?_TaXX#dctNDadAI&s8wIcS^Fc(3TcO)5sdI~*eKEO4}H1oi`R@Ak;mejOYREY zpv8~qN@AG`;<)23;$pjLFLa%1xn6{XmaJxOTqN)`4-xj&7R+m4onJ|v4UYV6Kktp%4--Dx3x>Adox<6n9IHfw8p_`%W)zNkF%m&+vjp-B+~s6s>8gQ-{+ zI>QI@<`D)NJ{ONYLUjt_biJg^grWk@NKNJZFAfdhce3p1p+dS2CAuo(oZ9#dt6Cp%9A;ZusTAuOOiiYC0XxTdO!#X&}kr+ zscp`pruzNb8PBpgyolF{`3C6VuWmS{lXt{Xmx{6nBYX^&yEP(AZF53x5fcCl@k$J< z)INt%{T4T6LQy`d-l~4_n{8i>+6;H-(`zc`5E=AYpD)0{1!crDPx~BFZxvzj?|3=* z)0F>uBw;R~;mXC#Rg#}40(?cJ%cMa4i3;`X?4RL-Jp1IDG&Ou~e*u>pBr5itQ zwdJSH3o4Jp2{E?-u%SzPsH*8Sqz1S z4Z1tqBmx7Kz~iNS-?G;{37o~Z(*t5&vg>!lUs!w`4|tmCbz)2<5r6}34&ENK$j8wm zR}0_dX9pW-&{42i>(2zCQ^B7<`0dQTvD)hTC@+hcG)@!?{$qa-5(Lvy`QBf@+GLfmXr6;t|VdxWefe0(5N6Z%RvUwhoOywM9!1 z!#DeX^H$qgZvOX_LGYh6{ywEroIdxS(??D8-YL0r0W$c(6@nC#F5!7eEYrYV3_H?f z>YCm-Yt+?HYb@7Tg%dH)aZ<0XBw;fTYfjAPc!9Dm#pg96Y?P*lYb0*FNnpqTe?FwB zc3%A5amoOD@>wPWpKW3Je(cn?;o0ulKxmbzce;-zuDN@H8yH&Zw2G4^av_^K7~J-$ zmXPt*&AV@UO7X^hJFXlt$!lbJI~%}R4;94OZdllXZa?XF^%HbXf5hYed_mfBO8t}beC@r^`hsG+6oGm%pQ8dL zU5d|6#YBPj4wve;c50lAz{Y=18H5**<&k!~l3(}J05b8iFqmE;9ESdq@w>XAguaUt zV;Md+s>@}vvW$4= zWc%{moV-<5_UJu{nM5L`9ngctu6MTIm4Kd9ei9{rPUyiriTv2d^-vehwcS*!D<7*G za&KI|nfSLh6U4l~;50hX7;BQAv1xz@EuJ@ccSo9Mb4Bf9CtZ;wWM%My!Z3`L2=pAP z``QX7pvM-c?)E$ITuJ45Q=ZNd9HL#(AHNbBO7*hYWRbRw5WhQ_WeO0(cQ;=~nJ%xk z4MX|#q_my|z+;4LXm}*g-(@KY_&{Vy++c@DA=HqWkHwdWSmUrVX)B;;S-1ySuQood z`Akc+-nn__E-1J_uECg-dLTC^rQAQi2aV?EA3JULNMoeB#vltWedq|18B?6N!Nv%_ z;j?ll7qrdY@nQ(F=+T;%oINb_39{FIQ+{e#fMFHD!T#sb9>Kn4ef@OZnsh5 z7Ykmxo=7I5is<(Z>kap|N<@l*PJ`&)Zy#)auv6Ys*t51rQU%w1>c{W`rImK}yVFU4 z2gTnk&3j?xP+cm(=KUwnN~4vKdLjBCN#%U7&vTznA-d4J2UXgH}j@o&dyp^eUzuya-q< zqVa5nNxl;`vp2}aDnr6=`J(70+$b5OMSzM5+P^t@p&I8-cuO6yT+z2zLpFD!B!8bJ z1Fu$VBNQd{!(Wx0Aw`~uz$4jGLYIdG#Q>l4kcR9BOI6N%7o%k<$uLwYD>SFhWo&7rJvIf-2NlS6e^;BxvFem5^9s9k+Ls`@RVzdtu!BurFgzFYBq&M9VAS>Ul#$9lJ9Gxb+ncr_U&u4v`r zNWbEhV>!tka{k%=rDXG!+TT!~i{9$_sz3Aa3yD;Kcbs^&1^YCoZnsL}UCEDJQ9Q$Y za=nK412O-QKq}LJySvauk|#doSD$x4A(tmzS45RXyK4=al~ z6&8ts^4*b1!Yi7Z);7l8rmW|;PMRq~!8L-`$W->1osM4Oj5XK7s0te&8byE^iddY9 zIC1OFtO*l1OK6n|lX2X=18X)5LD$4JZesc3AB3KGVR}Ssl2)|$1-BO6#P@6cJ(rgK>45M{+4)!_HLjvVV2q^*=`%a zREBAS!M|woONYBA*YmOiSfK_e?Clajdz;?5x8*lJOy`lK?Bb+I=RVv|$s%r-s+;$4 zLoH%Jp+7veU!6A3UbaRo`|V`3+2l1r>fI3f6%efl zzg<)gbYi1xVI@ zZ57#7_4~zguf(v%@H>jDjTRiqc;PK!63O&mEn(4<3iVJ&v6$HDcTfM3ToEKg8#pY7 zpe^~83G&Y2#Zt~+fcd@XLhPh}fZ&%= z9uE7Iv}DqawG~lP<7$_)Ks4@eN5J%+^{= ze@5{LzG*3N9|P5!@uI57z*eS3q3RT9=-Nw8a{dtus_%1>leaZc60hbKx_cUe-$b2O zBEp`X_b#w^hd<^yLQ^@_k%EOYJ7|)A*6wQ9JzMDGbbFlYO%H!~q*c7dVo?B+U3rgV zM!b&Qrb`zN(}`2!CwX8PofhiA9ZF;iq*F=QTiK9R$XKWVC-Y+8t0LlOwa4v+^2D(BW_u@tj%***u9}~7i(t=;9CvWZ z4&+DI&Gcr>xeiL7H*O^+J{K+Us%#L#no^S8W4?3ar=6Eh}4?tBwQA zuWPTJoCl2~%;t}r34gOPCskOxR%P1r0g`lUZP@t6Sx&EP4U@Ys!bNuscXRkhv3 z*p4v#L#UYZy~~&3h^%7LH#ftj(G2Jr&mfmiIxjjDTrvK+Y0a`$FP9QKh3^LUcm-b4 zWNj_bQmndb%N;=ID@pn^u{Or=mXSTeub0?pwEpC8c7>)-ZY?-daTZC+S#d0=&`ftu zEI~Jm5qQk$_%pebKIHdsq@Ky}<@Z#DgXBp^pBr=DGd>H(@0Ae;02PZcHm0zH$JEYt z(^)mSu1eH=i8A0Z(3Qkk=Do+ zt1%csnh*N8h6Erg7Jy_5EXiaU47k&?4XIdku)ya4HE`2(FzZDI@|(QaG)#9V4`}}R z5lU@f=TZP__)FC}mw`!gQT|U}J|=dPph9YjCY!vX>_vRTIHcdJo+k-_i-O6+ajgGC z4>Jhio&U%y{b_PXRm)GoShbMmD3Va`-!=s4m{miFGzGklAVe&vQ`e<%x3rjIjYvVe zoqpce0YEa=KVn@|EOF8uYbO?;{}|5g0Yz}79%u&dE)9U~=l=!_`4UcMu!C2U!lmn@ z6`|!z{0kTj!FkVbINUxsRF}>g6OU9HOf)@B9^%2)s4Iesd|^KW zt-*y7%9Q(A#4)7N%-jlqWR?*V00V5yU{7Dn7cX5OtqjfIcq)szHB89&cL<*LOH(R^ zILkDHPZr3_r@c{|UK={m;^_}Y!2tH`%!ef~4&SJpiL23JW%=O~i#z~x^8fkl7Jsl@ z&d~Nuw(5<-gdw!54omWmMyh~TaAUta;X|d^*V%1P+VEtwqP>N061+D>J2QqSpw%6{ zl}Xmz#h)s~bQ=Fe4Zt7=OL!8J-dWi@{d6K~KwXnd8;CR~;C|BEw=oSf5u1gV5wGD8 zDdXR4Xx+rprq^G5hK8ud!mC#6`Ex;|*T5WEg8@Gjsp5CcF|>W9(o%I2R(`$AH_jH_ zad*$hc~wVqWsOV{{~{vfCJ9`tZZHD$_+8?}BBV760iz)y`+*jvnn1M3n z+0(>!$T)N^lV08z0N2fjIfPQ-6t=s~CNsdUIWF+eW{^47hgHvL2zsBAjtkchJU*q5 zC+p6<;@4jWKJoI-#oDKH=S)N9ncbA`c-cGX8A*A`dU1|H&YM&#!FT6;^D?bCz9uFj zs#bx9N&yJq4N`NEhIzpuP1gu6R?^`G&kx_Tm0yAxe_bU8SiYDLFqBpqj47z5xcl4S zP1>7wT#Edf`@{%|Z>;NYudoz?7QKEgg&s!3ZB>=}Qb->iMnDk+MKsVZL5$nWgA0oN z_rZ9fd7Ve!Ju7@4__Aur4C{5fZtWs_02kqShW18vQU3bsBW-Bjp%;6~X$Ft&Y}h+^ zZ&fdL3w?~huS!++L2bPh`LsouthC4RZwjz#ai3TLu#{svIk5~w@%Y5kbOV+s`EcYB?$lG`lH2ap`fZAY;CMl z?dy%ZDNS-V=m>P%13{dhKad&CCOI6odtbAq04_VM@B634$9`?9fkVe-s56@@ZNkd^ zqu~Q2Gc59}XLFfk zf-r}fJgD&uqjByqUi*d@N|9gFaDrqHO#Ve7rkD2irvX&+L2g-=K^bn;pFd{j8L?uT z@2LXl7d+8<7aJk~fF6Lzc6gAX?al{7shDcCw>GZ@VBx!;xA8wVrJlQJJ`*Ife5_fpQSnRu z5Bw*OrW_iAA`Mtw9pU)i@od^Rbeb+Y2P%FLa*VQ(I)5WOCIq~^a1Vf)?|md)RS?uE zQqUpyDb}f^r4@K0+SoWGbqF}_QN>Sw%l#5a@Ngjx;T&a5VY^#xHU-Fmdi6APCiB=| z#%CZMr9vHQI(8+8qQuk7}HXj!SmZCDClmAwL}jf1k-w^t-xScV^0O&kky z%xor1o(V8l*GAcY@T>8;oVpwyg4~Ruj;%(;BqOmLrf+tt-dzU3MYxoqJw4v)Y;8U^ zh35S8_7jX?A5LF6j^7z5xOo5DUHzI3`tDbk3Bw-FQgvtiy2Q>~JF+H6+dA1m@j}0A zB=a|0c_ZDxRQjM%#Pz7=6Y7to;CUU?L}Il9BJ6rhbdlW5;MCII^|+)itAm~lWI!*)p8l{ z>NL`@2;Z&jsP2e18+j6P5N?#VTxx%@z-ZuV0c;9wz4XyH>UIR4}{06yox~4V>#ORv{Dw_$!?Iiz|Yl z`lOO_sCTdAN-!|oz3gAUP+7ks-5?ggBa!%3V40RA&km&MNUts+%5lL*To`&FmsY1- z3_Yk89B@F;&sgPu$_Iq1V1+^hstq*!Cl3Hfgggjg{R4OTFUIN?^{eXX09sm?Bb(MF zZ7&P>>>vWV1r1v_CML(J^5x=R9F4;gbX2{}$c(of0;@8^VU+5=O(*jS_p6&$G#m`{ zz#GGAaP|C_V~4947mpHuI81%y8~W$I@Y8!AyUZRnv>v?(#wtvr7|``x1$vW5ByjJh zZ7Fu%6x{u6g}6j>w{9xPqsRYm3u`(J0|d04%U=4lSBf9uVToZT~; z()@sCqyTCh#=aJepZGrz)3esQTIK*ai<>Q}n;6HhmaxTvbpzA*ImZ9gK@A1iV6oeO zOmQ1~TT=h$0aJXZulVX~o%$%Yw zrfdD#geNONrwUAK?7-$0Y;WPD1*?dFCJ^_riW`%FJemP~#8rSC=nB?@QrQM9oc2a& znLqDWZ>ujqgprV6qT6pzwA*sfDbvCVv?U^HFP2Ga2cEq-9fQ_wMBiATZdU^da-Mpd z1V#f$z?9KY)PoGvf-!;Vulquz+AR}lV@RRB(I>l$*)v=BnxOm#=wJoVH`SA?!6{%)iG9(`@PX|r; z1+xD^1^hz4Ai^QU4~kEC5P^C0PtPS)ftE5)Rp&r(E3l+0GnV_Ga*$9N_SX2|*f`!7` zxeF_VbV15M2tSC&Tp`LJhY{Jd#)-ZFCB-}|OvS4b2FRU`teqc$u~yHybj2GXTl`)# z5;X_3zRnzv7RtO=TH+-AX_(EBkQ@^SIr4+5rVp=cX?-54!3wxLh=EuK1$4x|%lsn0 zIs^u`;RBpCuIb|_4)d8tmM+U?H=gE-a-b^z!b*L#4)5BGnj@5lk;2*w7gPO_fV_2y zI#ML4ENa5EBzFmOOV1X#m=teywyfP#NtyY1wQPH(;F>QO@PmbY3l&=kkSneO2T4L} z+)WOPJUC9Ak-J&9;edWvKPr|RHFdWXyq#HJDC24q);z_Pr$ozMwFt(TDD4 zJdl_#h^E$GifA_%I31_tX?jQO8B3mKVh7_h{*4TRuw$nJMcg5q@!TT(Du*;cD;~ht zo$#JGrf1ynkdnAqdT;<5;@Bq)a121VghFE5={z%o1erE6NTP@!?9*z0t&1;Rwl2^N;81H25(Wri6o&y_deuBr?HZsxc{88#YH z<~~`0wM2AOPX%RO>u@Z}qm6-~#?cjqi?9ZAIQPIe)77(nDN!1!xdq_g+HfszIi3-a zPG9p}z9ebay+R>m-mentODGQwXIE82&>WUTht?TfsJ z{J8==1sa8eBH`b6%v@BLL-E`m@^Y-fQSl^pa0#QZL^$7JOJH*gFUn=YJggHYdXnil zL7ym$7#7NLoA(NKwoV6mS%d|Kl|ELE8D#`KlhjO)hy3!lhe+WNf^-J<8|REcy>gDH zN%OA^-Vm>xF?&YVcJ2g z;ra9;gHEfi^$eF7jvdic&cPCsuzwpbBzH+h(cz)M97F1iE(Duak_|gf0kzrKD*H4G z^7r~z+ZMG@THbi|j zV;j+8jcKhpQ%lGVOq+XLwQ)nbn-;5gQB@mh$j!{G8xA406>;%r()@(&^FHI9`;>*5 z;VXxM(lbdTt|%8XX(#ib>ufJ`SGYxhcnj~aJghnZZ+>owFSnMEnrm;Z!qllem><@B zcD?0t+DC^3#`z2aI}{u3;OqX? zQgg;m;*yUZDrL<4j*xeCUSZ(oMX5Nxr?G+JCZ#qB+qsN9qeBExG&fervNp6WW&v(J z6HKRW_1YE{VD-^X>TQGCfYhl$XmPvk1*Zx~QGIs#Iwa=_8Oayt?0~{ccavRoOP~JS z6$mV|HoM8;W!in&TUSQa3+`?~*kaDIWcwUzuA2xTy*wMxG)Z^*TlmiG-V@Ni^58l=lROCxs1bkDVYvAWZG z@~ZodS26WE#;x|u2HWLxyRkIky4RYKr+$7qgBR&f8gPuYnyh%pK@G457W+N8DXBuM zPc|<`X^Y@VbutKjTW^q;0-tF{CLD23{|??r;Pho7u^&a@Bdyf|STX7bDxQAKENI1? z8CYy>j+56N6*mv%n^tH+iRxH1;J6AdY4pj;C4cz({WK*0iDVyU7p)G6>ve{5a#*P| zz(Hrc;rdlr|DSPHFS^i5aT#Z{9LjuQDf=2#->-k6Xe>8VF%}upI2;a(jn~sMiEOr6 zDM^=r)T|1`Y@JcB6TJ+U5VAsaCb;N~*Iy58j7@cQBB(Ln3TU$iVm*-r4la1BtGB^w z1y)rW>6>+I(L9b=K6E0-(sQ8WjL%53aUDLw1IiIg*&uqR=yvN2bDprQqeH9}mcoat z#6Yax%Rj3uiODPA;m%_afURx4YJs$ znUMx7Ht0ajt-E>oCr{*2BNbNM)4xJD5q#b3Z37? ziZRz)`{-j+u37f4rG{d1SfRLmFf}dLOr6Q?mfdgJ_W?${`D01cGu!Ti(`+OH? zAq#RjiLj;zZXDp%7}TOdRNfPw&^h*~N_v0m)C~P(Dc@I~aQ3`l{gs-l)*U~)(wD19 zG|qG0iv@%!8&YLztH(vvbGb21 z>J$npbD>8SuUH>sWo)fh!HQiEE05*&mYnTRgS=x4bwed%57bfmt}E5-oe$d; z%Gjpmq?I(aJJq1jNfLmIk2P4Sr7(F)cS=>trXKosR#)wm3xJbkAE)xxc++GovwY+wXO?Z3zyRQ`2hh zeFb2{N2pqXD8iHHZoSQVJI5Fv?ArXsXND8c*#7fpi%*oQT#(F@H^Gu*XS$|WfYQSS zTSI?X9T@SzucMYL3A|r$IhbQ~I#cW%54qOW%OHLW(P zd>%aD=*t-7+)zT~gl$$S7V#z!0J0`<;vubGXQ+N z+{bpT^%mTW3krr>{Y~MUr>BZms+b$uDa*>5U_KP#LjeK4OZE~4fkRRP&j!D8gF~mB zk}(Epkcl%<>Sdx(T2g1JiIC<*T6_Uw-zf)(fFO|wSf~<&a@Tv*5($eGZwGX5DzJBr z_#_WPFYh$G>tpTBn3RcRr&89M!Y-F{e||dB&;n8&i*Oj>NRmlJC5?o@ zAWU^g<^;1?EVl?w@D>xs4zVezjG%UU={dNTyP9WNOEk`We~8>r&YLolK8IvV^vzVdy!HONSH@(gbN=inl>w7UNW4mF^_2@C#?gLLiRW-V-R zI{h_--QXr@DFC@X7D)fj(kxmrLpImS?$%Qk2FV;`b%@LRtf`AZy}np3f)h5F+1F(o z8}%4Xi+<}z%WGIJL>$>lsxfmw1k^}9_I&v<#D%zbfFzeH$b6rjd9X*kM-k~V>5pV> zP+0j=E7FF)KtL92{oA|3f_+$mh4s(Cra`%dg$wl;uR9O9QM0ZRTj;JqRsQx&-p0b? zKAG-XN@mkY80#O~FFX@Q2Ry^sUQDcTL2Im_dUmAWJ9h8YH@5YK_-XacfhyJYM}i06 zi;EG)MG=y~)Q@(6niYvHODCSPviR|&B=LWLsoJNZ2Si7SEkpZoAm-r*Rx{b^qkc2F7|hMdFzR^`jh6i_(1g zHZVFqzFK`Ql1~-+Oz0o0smHAdZn$G8^2@}KI2snnRe{kkUn+?ps?e$d7KNn;W&yky z!|s3&8H$I|m!n~+fnT3|HaRb{L~J#G}NgaiUHfetD3YIpLJ@>tpy8riUtpe6D0Iq3zrD z6y}$S(MP~q#`gmlHVz&(OODuo>ZQw_q-rwVeJ)tW{_DmDV~Vj%>g519Rsg z;7b=R3xM@6wvBkn_#H%J!8ieDALZd}?lmd;(PtX*kRy!Jw|*Dh2iu2!@V@tpjR0^V zv>pNT?(_2RXwPSVFaA_dKS>D zc^GQl_EEuIpmlX;pOj>`v#1Ys9*R2tBdZf52=XHz&oVQivjBLGhBN#4q3G=mug1Hk z=52XcjNVC#j+r^ma;~so(`e7v*&&m1&xc<4Kl3_I05alKp%ghC=-=sd+boH&H!rt^ zFkM(T9ZTH`_7^Iy#eBDjo8=m%VY493EmkczDb=C5gEj6f`U}*ZEOzH{x@@LJ-XxM- zIv5V~UPH25>D~URPNDMqe~F>~Hm^RCA{$`ykRT^ue9+B9qL`=>`TnBMO4*O`$R|yU z{wyHlHTaO_hf6QLmQ&Hjf7mdKJ&ey<_3nEsW}&C0E7jvg&t*&?_Q)Wf@5B1iS{?PX zJj=-AdeI?A;~zJQR^gn{$Z}Nkgxn{naYFEWKPO!stb+FasaOXd*84ZfHLv+KjdCjb z0E+`A-W_CXpfqKdRw*L(TPi2sI(mpYwLgeM#cL#%aLm7k9*nKEdWvi0tuUsrMlQtr zM?#OIO7NvArO6b`jMyf7c47D4Up%$BG4KJq^X>lCW7`YEdc0@yA(MH}_@HR0F z8bg5Pg{I=XFxt3RS@}HUfxI2Yy2n;0Q3o6_P(5$Wd$jkbF7h*tdz=+32q&J#(gv%# zR&EVLd3_Lp@}xef-nR?s7b~=F0t7S4Z&(# zN0-Hpj|j4nEqL~h)^TOAS&o>EzkUTROU#Q6TaMTmocTItFnd z6?@@1m&#pmVr{K0Q|L%%CZ3ov@#-SlmoRxrSFQ;`9p7#3Rn=DB%jXP>h{k(g$y;UK zejLz32I(|rEc(Q4)(z#|>k%V#5rBTO*5IbBJ&`&uS`zf#_43?F z+n(F=l>;kMz{{Qgz3JPi1Ov8@lrIIbaihEDsG5Z;L)RV$+K74Si~Rl?o;4Z=ouq^6 zTfcaX?D(d7efI5>*! zvP%vzewc(ePCvCZ`0QQ6UexXFiDCO+Ebll%ZvVOgu?>7X5pNwLz=jUq@FWvDh8Gnq zIl81dXviWHK8MXaxn5=xZ&mejouS7sKyO$edy<0n;1;yxdnmGZWS;}LQ`HL-M}K^i zaHgH7>H@jpS!(D#Wa_SiC5 zGJJo5-_bm!3VpDpwS{MG6LYY%{VnEkM8}j7!Q3&7QknB5c+=H%4cp9 zuHA;V<;U#H^hV=Jxda4|L0kb5*YS|$Z$`Rgu*S~P>N>v37ZF`k>k=o z-I(CGW8j)BV65=xBEs5L#TH&(4z zcH?9Lke!t;jur{nDu zuYdCD6EgbMy1kx1yjsw6rSMM}3y9Ru0jKm&ec5iY1C(Yy5tZkOP>gLVD!X8bb5)OTptwO26 zj!c1P*-(0ahG)k9wRIpQw4q*Sh7)qHevmF6^*nFyc{X(qzzqPb0Q-Y|tbgiLhItQZ zJI5Eko7nY1-Z)HD%?E?Sf|p9LovE@I&72r#czbAKqcNF=SeR-6gek%(#w=}XQc$2$ zCY4NvWn`2qEu=92;i)qgBeO)Mo15yBq!~KXsc59z!zcd+h+XGNv9Sa-c{H zP76=rQ+&P5$GTI(GodV?Td`D`Jz)!9C^Xnl;zK0Vzp~5{^(tqvB73{U>_4jb=Ly?- zALw9+P8L{Ot(~=Xb`K(N35xQ{;-(H`uwMbFzW^$=Td*27;NNu;bWqO{Jsn)hKURYj5G>qp(_1q6CcS2Wt?<|!MHiMlaaXP zh_?;or4IU01oe6HrFRQSogxg&NFgO*w!4fy+p$l-y{ZC8#4z|!fl{ZI$AnSw;1cLC zSGo2|unB)fe%&}sEDw0SRcoQSm@?7swY{Rj zPj(0JZ;KyKJjma!4{|Oc7bdthZA4HGL21Wm-m8Z21oQUcb=I;I@HC+XX*rTS?lMGy zqEk-+s$iLHW#%n!w-cyBiH#?bZn4$*jy{J3RK?3IUH%%>(xxGr{8clh_jtB>yaHNk zp^0*CN|2ID0H>YtcNUj(7`r;_>AsIjw~zQLyA~W!p4F?RKjf6 zgcYp_L+uIRc?;Iu#+8j;&t`}|LdInhfHL7%)qgRu4;Ky~CMDJI zaFqZQLVvpdp{M_o8T*k?MGRqXh0v0ICUziHnz>P)HT{fbH9x>#2n2}{+|-IF6w+>} zX$1#|B#(Ju_=r4P;8+IK-gJFCxc;vv_G58>VqB2;!Gs@h6{L#hpqZJsWsOkH=m82V z#1@Tu$WN1%Ii@M!nkF=yFz6(=&H5P4wg1lH6$v&3hNRVg@zzY#ceEl+9Ci^J;^`Uf#;Betz1j|WvCWmY>57T%9O!x$pQwe zwu(+fxgtS&>H>jgY)ThWlo-LyyKr5jAjj6|2RMZObPD&&lSS^2L0YTS|3B>$k^r1OrZ) zSDCRK!kTfifMl8bg^!Sr=g>=&-(~iXeO*7n1(8Vf%P{A$0`yy zF@llvkTok=FGX|wNU3k(sq&dl+_tuw0(TNIqmmqHwks@=l{sZknc;ra}V@(7wA;G982;qx(F2Dz9=F`9yjaj5ZzTJ%=RMrS*JKU*kLO@#nOHcK0Vg&%Hm_ zr1xGVO*-=`$%_6&eZu(cDbN*LP!ZUhf5foIU5%mz(E)^Lj0oGJd2Dcgeh$rg&-(MY zM-6xw6S6{D&=4W!gAY5FqK$m0IbS>Hx#5aCI2&B*urT3uVTBN#d|{IsX%v$aBiM5o z_qHZ4_-cpAaCMA4B78(<#G%jwK+tmOE9lb@32+r42rjfQCxfpqCFtq9Ic0%1-I|?j zh&6s#@P$W8{NgJq8g2ey3*E;!<@Hp2U3@FGbJ1SEqnfZ8Ej^Cx^O^Kr(ggjDj{jaW zLdGJ0&$Z8xgF&~RqkO11FD{i<0Y(~H2BJ+djFHy?*#gNCK0|+s5PkT<#zhUSi!7ht zK*?I{hFzvHCSVFYoafvt|14>o{Q)3p5i1T^j?Y8omyzl}rt(tR-zePEapS@@G20(`pjK|#IvH~ zvZtnAlGS85UwIVC0q2!0Z68@WnDCVD@P)jXx$>1BjF9$4Ya-El-S2sV{~+jQ**N>2 z1BMy{l&>A$f(~B^@idl~igIyiX#JBdYJgP30h6|N!U^8Q6CJ;@d0z9isB@D5{g8F1 zrJ*9exgl#J^!;#yP$M@SU1n^e>4RLZ`7rD8k1rePCq<(1og=G5%{Q`TSw4fQ9h zhO9p{rA*Ar@XZuFJ|hGh=|ILL2_T_U*rJQ@J?F)6Mf@Hi@pB;Zbqm^+!&TtqE#G*j?8y@(N zOKv(4p#!Cb!_HLevM_rK+hYrKyWZrBusRMuG7sN0IBuO2+@WnxkS&q5Bc@`gDTD_Q zC$7l)Q_UuJ;?AxIQ=7as6nx+nxij2}EBJQ+<(#8A?4%WS$+Q|KFol##Q#e=upr>bU zX87i(0LTPi+^RWVz3uuLK?RNWC)+&bj_!EvU?`%2+vqTI{niVqViz~@VGz+6yeyP5 zn)^2OWhFX7+)M&BO--z>v#cOWT;^_l&SlPU9HI8F7HYAZmLoxI@6-@Ugz~2fwLo)= z9^8A+w@8h&A`lkri2V;61!IM#(BLMm!Ad3j*YM}ubDJ#-^;E(P2ZBxn&m1cJA*FSz z1xQ}B%IuQFGjUiYW^^$YGwIED@=|K+oczqNt~}dPh^=fC**h1Cb5ac#h6sXeCMiD= zCwJSR*R7tQqq|L&;NWYW4JjUc)$OEue&BX{`Q<9$Y|FDF(Cy9Ad*pVD56pT78v1&U zJKVO1o}O7bPeNNe#6Lz7I+5yAk)CTnntK_Ep z`HzxMJ(tm!7^uW3gztiShe?Hch7d*r+=;xBwIR6o;f;nu7CRJdg<5~S4;5ns3BxaN z+$V!1v-DG1hXykEju%ou8&C&Ivm4Eky7P(gfewkiJ*UH{-%HWq3s8o8*;t|Halt!K z945sBye<^(#wEicH1>XP!So4|+9ht@eKqF8*+=t@E}ZanpIxkd)&5_2!Ay#`e7$dc z1sOYrGT0B5q5X5`Qd=rQ`lFa&$Wabe4}^$InP}mdAPz$}qZhbDFB2E7{j7g>WMice zP*?$5cNsx05uhO;+WtdAn4gj0$~BIYC-|q3&w)a64Nmro%o3-^%4RoNz-%Cr;_i#c66We@lY$^ZA`p|#C+0xXg0TatFW+}_lBe;dU_Qxo`s6E z9}z=uXhgtwMLwI6?7dE=G*{iem)oD^a8$#W;+DrKo@7fZJkM}sSP)W@a?m!^*DHAs zAw}WNKfSn4&;66e%Um7Xzfux>(_LxksEm@PyX}ZhU025Dgt3NE&>G zS!Yj_-hf$4UL5H8_Y&g&E#-udWj$P8)QwV(8@xf0ty8}t>4{*`fB7b#^IipQR+~}@ zxQ2h!BW083gMJrziB_9SY74A;0^o$u}lwYY?n3Z2XfEbBcG zV^Wr71($8+NMi8VMy@R%l-{+NT!Iw|s{o`?vb9YYQG}B5Qa!mqIW+>PvuJ+z_TUvq zmdPb(5uo9c%4=skYtpF{aTo3YoPQ{y(xrrWb7>NAO9jqwfa2>Qj2`L*A%{>IbL8C7 zR)UFzD@U-nxiQw8VQqxQV-B>aZhv9W1kir9EhwbC4*9xMY-QT6tgzw>oif1*vp3<; z*G!XMSpJ{T4~}xMj4?GnAMZ*WQs#_e|Fz@NCB8SIhh)X~SEpQ`fsBqmQ~kJ{VKUHY zSA@u878L{$Kn{w!S#SCkDth3PUWDNudCqwF;G^RadRywL9eTPc&Z@z9Y(1-`;n z*_XRgHbWibB=g)VY)n}RG$wY7Z9|@yWS|)%%6=G5YqTdg*AHbmdPB}Na!1~%D%}BX z;+t%v*6}4k2}Y0CE&C;6jHc)?k)b+W>4JsivBr#$%XzUeIk%3tehf_{jFbKC~#aJLjvvVtfWM_nsjj7cIcMM z=_;>odL`Ob26X2mjP#?*5K9&cLrf%ljJ7}1GZ_0Ht;O}1s@lo2Em-2+wAscTuNNb60 zA?u2Gt0N1*f$|%0&B6E&*B3=w{Qh;a^!<{nUQ-m0KSIDEH-es|_<&q8;hi8OEo%tB zg6Qb{fX=@u<{fxuZ!a`cY@f~SEop171B)$8Ko1i)!z|PCGi<*Y-L5)$+&;bWCjASuy)Yb1X zH{uEB7e2K~j9$xBdB76s%oULQXV=afPC4M)sj6?m+`tBHhK30lbI-`|yWW5OWq?s5YWF`a{%+p>t`FN4PdR5h>#6vxWr_ zX7_bE*lt?6xw3E(MZ_mjH)z(}0j`dYK(aV^Z6O(6hp!8#v&%iENBR)LgFfpuK#C)z z+>;2FBko&!doi1+0Cb=OiV%YGUQr+ms5X3hc5?XE8y&GwSP=10k3a$U-y9dBYYpju zg}ER>xb8b#*0ZtXDNw>6JcuN%Qx@y6gvxuBl9*sHsJ(q2jTa{_qg=sa3)p|Et)2%_ zE^iUtg3I{!dx(RB&JciWI zOBoeQjJ8;R1)c`D;*HW6&b3IQm<>$gM=$s&75H*!ksVCn$E@wh*zR=VzZqlO z|C@AU7HFYXy$T!vK!ChRN3F75T%5lEDbE0jt2Ni^2Q~Ih?#e0Pt8m8yu!KHRt%XitSM&4qZxBhf=& zK4J$>qiaGZMV456=nH()gjEfBgOI`4gv@qWCzxsZTabZ?Gwz@o`NL-x$8I|I&#@X; zY=;~rKZR=Kye#_kOsl!RB7d+~!RKpZ5s*@b;A$dNl1ZLLHcb?J?D8ye4Hy| znDf0?h7whmj8m6$pVsCX??7P?@o(&PoIo{pp_K{QeC8Q+JggmhO&V7wdhF(>4)i*f zwtxBi1&Q^M<*{m9K{l{Oj#zo#fE)!k?w1d2=AJ?52$D-7QHF92AY+24$V@^fN9y1( zs&|LHc-(@0H3Ma+xr8JZ021ihy>q^esUu%PnfA0Y^*n`9=o;Q&lJ@41&0!gG?o=Wa zzk6d7tF(c3ia@#7r$3pfufF@Mgb&3|%Us~cUOd?C$F%`}rx);JAZug4O-0fxYwJ?C z@TeZStsqDc2I#z)sDlMCUhSqxH?F9sB*U12S^wItK7=(6kr-$2C~!vFH#d?@8k|mC zewod2I-(8VD}$0iJY6}s(v2|**p(DV05TnJG@za?iH$-S6js*bG8`z}B<2<}mc>^O9hM$+Hnh8fmT+JDW-`m#K*DXD>3q(ah~j>H2AUdOR*Rak45I0}qk* z%Jn z$YRN0mOTBs>RXCeRDY=sFoDRvMv_6f;%$8}O#qnSKuWG8q|Ey>yxoRAu-N_TY&Cdz z8es7z)OvPVu)f5)2C8&X=ct>t!s5>G-@hTf4XJ>R${KFgx>y=cSA7eSD~iDZK~H5_ zR=12MRYBe*cRP#c$>0BIov589gZTmrH*4yShD#1kXe(hq;cA-}M>@)JETtXi6RGsR zY#h&=E%S_LL>8+!MP1;)pkR1%n|ofc4)*0SO2El-=@qun%=pD$p2+0ND)V1C9a)_0 zAC2M_&Mz{jU@wFeF)f;4Xl>!UG%fwsNuT;u6Fx07(+IXJqaMT(UES2{y!eBX?JU-w zf1$a6t9PJ;P3v(L=+?H>*9u5p!&*@OLvvXyv z0E8(Jiw(b(cng1tF)l5xA8H}}bq=cw<~z2gUsYgTGt#xLdLf>!n*M!_Dzql6jb~MA z?y!{eP04Y_Z3Mb-#EG?ZtqfF%**OE@iS`pMH+0?WY`$A7f^giF-ytWt!$X(;`6^rS zR@^E6>R1Hn@tB0#FjR|EAnO+4OY9~rGwJ5e)g3Clfw+Aio8%W`A^IZZ?+Eql$T7}^?UrjyE$@%F*J?-_*0PaP5iAy&%`Ack`dqE(|7WO?_#ZEcN8#pca z&)3*eUDP4@>Szd=$;d~15EyVSXs>GE^P+s;k{$*9vus|cL8uY;7OTMb zxt-AzUnn8oosag2=A&uxg`ox8bSbwK?h@O!D@id`V~$^1%@&w_Y}@z#NeSO8NVG&v`c6SVIT%N!9j3 z68xjoxQ68Ar=`d$5kL*7L`P0x7X-68|51i=OC0E1d@cj+C`F|?mE;N$!$=wcpVDu) z4o|4*_E}&hmqc_howqdf7!(nE-*bWp+S(w1X|Gv~>@ z2FIWXxL0&IS!c>BVf}341P24JwObN>e@=NtXvWV6FIm8=9vr4A-T5SXU^N)0C)(;M zTKy_2Yc8Q0l=zCoxFh-IzNtzMbP{hR2+S4Z#<)Ipi@kmp1k;Ekqe&YSFknv;E#s&1 zPrFqQIOh=OW-ckFrPh`{HG7JEC7+EKKpb(D$ZwzoHgIA({v;^6GxJuP+t9s68TfHv z_y-@6q0(SROT9c`i<jT5uvQeCsJi&m0ESBUO}s9C3T z6;0|UI8*m@3i!-Ohtn+Y?+%tVoPPZdvNAatuU zqrv2f_9Q@j04!!6W^U=;K!pN$S_F$ZqgxvEl83JPwSSzFJw<_bR>ChiyL_H4_D?-L z4E)4g+0A&XF`5}neuG1VQt`?U-d{PzyKG+#wYvh9$LGs6c!xQH)Y1JX%N=`#2qXMg z?hCVJ;mLFD0$vCGD-D=9jvq5c*Brv+K+(L3& z?}mh}kgL51UOD~TOqgZa7b6?Y1WiCu0)z-Kv3~v=Qv|H?>u^2Yeh4605Hl;f;K)i; zXY|$&!~kknk{v0Vb}r^iqVgoG8=I;dh;*@XB6JXN)7l6$pz04~SwUu?&#nqL=N(m2 z36#1%90Qrna^dG|g(bOpoa?B^KA}4}xaXAM!&li-L&zon$~z=cJz77(@#Bu}ON{SZAMD;%H9QrrOJ8 zv1kKfmat)A|LhFL*C(~(DN%q@oNil%TO|yXmkQY*I3IM^n{L99L*BhpYPl8ye?f zXA%XrgHgwM8#z7-vSVz+NBz?0M+Zr8-N#gfXtP@SIEGcsVhsWnOFYUiDqPN7$WCyk zi+BVog~PJIm&@Px7%IHQWherM8sMT79}TdV$6^aUs@O;!+2800gLw_iNA^e zeM(O#9A^9|)W1^{0g*=T`tA%7JMM)k!>7ih8JU^8<6(sNMkjKsXR z9M7ObM$R{Z*5nsf%}+{6tlG3}8%6DF4P+3@3|jr>$_XTuDl%a)e$7Zx8f5!4xxbLJLug02XS-0btp9GGL9sJojENl70x}8?E;D*SATAMb0cf1I~>k`+-@ACK~|g zhTzf_6aP-yU?iIO5Q#5VxDgP|91Tk4a5DJk74Lcs73g1(a%B{UZwE!Ur}{vqX(kH* zqhHFZeZ!tZtjw;-5AfzOp3WP)-;UTW{Aj)2PpT`pOgpBL*ofXOEV^!kL4b!rG7n8& z50DU{#VaQMtEd$)N!y5Q&1$#eo5Z4r>O(6~-b@dwP}Rp}l{ z*|7@7i}ih^uKA3zj5Pg^0*WOk^KmS|!U`0`mkeq=52pGi&rVf#nIY}>l*?zQ2gbt~i2coP$75ip$Ur*|-1@IUJez?;L@inpmt_hXGU9q)$=_7f_o z1xNzzKYgd^hqpFKn*8wzu+F9qETUr*YAn9m!x&vav|!D}4jo~Lz$2C=n>6~dPu^jR ztRcVpp`)R#!Ax#yLf!YAeSH6TJh!)?^;0=83*nyZ7q=V9Frjzuqr#DKGm8JW~V53O(8UoRoH*)4&tgHseh%LF1f3K^PI2^ z-R3qk+{v{@zTu`p-?)z|8SJ0 zKOd8hfv!CZS+Y9i+_shCT5LgHk?HY|EoovJx z*f)#* zV|>WMCT}t1E8Qt}k>N|Y!=wY9L@wj=_q870nuAcAXXwY(4mUxCq3jM+fZ49S%J~gk z`npct)$#g@aJi(P1@JhH`mxW!e5*>IEP|X9AerHB7qzH^%c_dgX5zUNhUj)H77#j6 zng!rP0-M5IIG?^(D?1^!uel3lj^)L<0`v!g&7j2@rt)E;3KA3}PP=z2q*7nnE+N-( zjGSUn4pmqAjEh&wTXw&-tN;Q8?2%lICa(iZ5%C2pCjJlU*=V$b@ul#CPNM-}h8rt( z08v>T{*p84jBL&r@?pib6|BHH-H{KZ5Ai8Jh( ztl=X=-~32rh|33>z*b#zOrDT{d=4WW`==s{;ZAO~I1Q)jDANUha&ChB z&Ygkz*sVFE768~}A-M%E{mzh^AT-Ckm&gLspYP0S{lPRw)FA*d<0?Ig3Zs2&R zg`%yo7ES?`!17hQfX-#f99wtb&4UW)gIy+#2Z>VJ(qc!X`NJ*fli>+O9!;6 z!b5RgU;01Ea4N_$Q~5Zc+*4YI2Spxt+S(ebPJb>@2ld@rQ-WSqS;71j7?YVV^4TjU zKEqOAg02CQEA=WyX=iHJDeY+>w2RgtyQA0FuqnofNAc>|h$Kqoe__gaa9ducW-ta^ z3yA(9P@f^MlzfBWTj%0-1x$0!3`BiWsESWvKT)bNa396VMirP=9r_)+g(>RxThT28 z>xSC>&@n{A)J>hu|2V(+&B4(^EsEHocC%(!Yy`n43^%DjTkvmIJY(Qb4pxZJ2t+Kv zvxCArQ@;BT^gI)l!foZMK$Nd(^{b_(4?!<_9m|px?H0IcFw*p_IjK zrHetpie`rjWCng_#-BrtGUfr{j#*I&Hv%G74IVR4_zyI6y-O;;v{^z1OI%^mfc%W= zb9W;oSbcuSO=dP=Iv*G-joKoGkZae{6%Lc{`r-I&j4^zySuiHbJ&yLdRqX_32`M)o zCwy;y{Z_}t>5G?QN zY_-A!%fqY3X%bcnG+F8q~!Yt^P2MCrvKIw93d?3%iCoJZO>gyV(w0?1M6eXS(o=P>9-WqzZfZ=5(vf zUmUx7c6Dg`XlaY0Y34~IkZ52OR|S}}gcK2;a^=ztGf!5oWh5>Jl7R$1p02J+_;~4! zUenP7Fplx=Fno$LxniaS|DArKT28-;$%d!KgHyjir3@lOI5VFxM~@HV|sj z212@nLtyF@%kFu`3a&;+x-drrc_; z;MXaG83o46FCnz@W`==*(p2HghTx!^4l5&(kv|OMBRy|`AwC=^g!!csV?3Lgv67)W zcbq2obB;Ti4P>Rw0aP$w0Z*$$y`ZJvUU=F0rAKe-fR1w9M)d0tC>MkORKAg*Ha5c; z^_FFBB)-@4 zCrl+1g_Xx%_S#oIrc{99xueRgBF)5=4?aPtu-DbVD0?6*O&h>qUP$}SIag@l+m<@l zc>NUFK4+ZXa_Gl6%U>&983mOX7=8iI!Z1c-6Oc(i^N(k7Hq`@a;e;5AM`)dBlfmjQ zVndE&LwJ$wYin~_DwEY~^DE8DbynC%eO)Z+RDc=RE4~Ny?&E#XbL%7XL0=^M3dU|+ z38qPhBDki2dHB$&Fq4}G*cMx(AbrB{hNpDslmUd9OT2L^Aec+ufihpi*uvZB?Y-vG zvFNOP!b7}ojo#cH0;ynk^uu`^Sd7&I>C)sW=)VsMo*edh_--zvih-N=m6B z!Psi~Naqm@Fz4msYv9fLywLXVT>}a)L#5CEncuOS_jDM0Dj_)B9hVdA$`$|KJ>N+J zZ>QSuyh!~)g^DyLUr-Oc)OaASYO_DVqeB%g;S)t}Qz|R04PkJ3P}J}8aFU8iyM}Cs zOf~g>%|6=*+ot{^q$;$IfaFJyedr2x-9D-B55`PMSYQ%knX?nsl6I%VXbd0Whp{>I z?QRVNw~!xv z2DjAlYu?BTha-zooB2*r93sHVkaw!+Jc&h6O}3))x;#yc$cw;*mPenxs%OxG3=Tbp zAhk*OK>@CI3Jap-PO1nMa6yWW5LBaG40JZV!}r%0yzoM>Z=pTg1(oJ>B?Gc?N`>M8 z=S-rMJ+U&y?=(P8NDlvKFlBaXy zO4AfD^titPDyYv- zsYaX>kBt$yyG%Vp3>1fl9!J0f)4Dx@_bF2!=p{sd;9uZ;0&yc(yfVulu=iy#w8KjXA1Kr!J6($4%qH20)+5!yw?4BnBYY8pH6I+^*gqc30L)P@ z%z@FKEml1&vTRP?@WE9IoyN)wAT9o;Nk1sja5%&LsGNRAq|=`F*=CP;k@ppCqcHjk zFhIN4$Q3+Cy#6?eV&V!ZqJ4C7map}#tskD(dNYmGYZ|ziT;dk!A9MXe#AvufKS=vw z?604-mn;hT|NV%VDiZ-rrrQTtt>YceGxrOXgZr$Uk~GBp7FSC+Cqa&OV*dR*w_r^n zwFhIZ>xw8-Qng@a6V19&pA#Vj@>jT=(oyF1WRVzg&1e^CMwyU1{SpGn<-%}muN|xZ zig?t;BAmFnxjEdtz))l6g!7$DQDeIN<73V9k=w4L>q&^f`c|=Bm>RbWechq}zm=JE ztp->@(HQ8uPnj-GG>6Zs#zVP(u)w!{v&)dcb3Kb8R)^GfBbLMO-mn3pvR2(888xMD zHxr=kN8o;Fw_8Ot(usSZ5F~caQrSP@+0&l9&=x?+_~W%DG_${iSc~98ZI0A@-Z~Zy zq8eyf;QcIAad%QSLprS$Z=Z&*HPjAve1@QV_vi2Le8?ffhV0r_*spp!J>}{s^I%YY zXT28c0ujo5s>*Pi41rEXA}E_pG?h36fOI`n{?3TG#1ICX@FXdf?N6${bgBt2ikG{p z2-rsu=z1{yN+(d%l4RiYX`cck991vm1hQQH;!Vh>XHlV)|4X?f#I^vRg8}RZFV^rm zH+V#m?+^^9#4_q|MJ(W`~g^v1?Vu=BGwL z&wmb;FgWxN*NOP?X)4Dp))t@BDLEqn5=0lE^j(em7Nhu50@RzcbB1Ef&;eUglv=-< zf7vwGceV5QpG(KxyDf)#JvO<&QDJx_zTHAe?<%^s{?mzipgt$OzNxjj654mt8DF4e ztZ^8Kl`!ckIYa>GmH>%Bsu?M&Yk*xHJ(VL!n|pTaEnuA&&*+q2 z`rZ3r|BagSV8hha%Hv&6{eSl~N>AeTqym7_>pL5NX0RO$?#O|3h^2xKQ&9_m_Mj3B!6_Y}h;ydH|z7w{vf^ay~If2yX($Y5=M*ATK6t`6xj_wbX&sck;Z; z#!nSV#q+5!P_s2NaTlPhQ6!|%A*}6(sr3}t*vu8LbFIDe{8DexGZ^gvTA=Wny*Wi} z>!WXH@hUVpt?%`;RKt~U=_75qOs0%7Y2^i;I=8>g1Dl2q#u>NF)02?^jy;souz!w> zDgWsUvyy1!EOuV}2&z7Yg0ZpjK7usmd<^S4Y*1qZRuyc0yw0V^G~{*hIMM1w&@a4O z=j$C)1o8E;BCY-}xDT~h!2tAPf`5)uZ11O3m0-ts{97~mh{Jvp>VGvzXtaVM>FiJU za!YjyOVNcwKZP>s%hJ%4biZfq7hAM4?@FDH$-LY|*vF`MIuu;OcvMimk;;TrUq!H{ z-$MG>Q53Lf5Ni_hc+ZK5_p`(0q@bJFq-hngn>ll$kEnVJ(iJmtgZWClqS46`?dA!c zF_Cu2u~aaBuif9Jrn1qylsa4Ufjo%focF6pONQ;rST_$+%1laWrJs&DzX@t=fB_At{#>&DtxcF=r0(r`>DOGY zU@B`lmfg~~t=E8oW;vZqU7RPTq@hb{ve)=j>CGs(G4cq41J2{!e5?tRywBpBT-;9; zp&I5d*f>ZF&~zEW@*3vZavhd13CdK$z}V`(2Ibicn6D%j%?fJjo+YG9qu+q;LU zs5QT&>U}~hKWc*%>)0cIsDLOOHw~y0x%EAnMRKs1cp(+fGP&oUi5^de zAuW?Gdck;~M(rULQajuKU4pc)NJ9+OGTfw_8Rl%tnZXd*?74S8233JTEM1$nL*Ehb z^X>tw8G}yB8fBFd8geOeB{Q%>mGq8?m_t1iXdI@|_Wx5W6;L3wYg0h4eRU+FPFA(Q z2>n@Rdsola=*6Y-J*VY6nl%|a%+f4IQ|V~ExvDOI1;SaSz_2oBZAMLwEHb`Tnr8+| zG2n0>pN26J=+d8d&k^ML)GA7u&`3x)d)i0b4&I`G5`}5 zFIfy1H#p6(%(grLEL_K5GLh;GUyT94`KKPc_}o25y3Het3n}zV>jy(Ld4of9Om<1$@Ccy~u9RR4GY^+!^c&q50-B#h0UCvbpiLHOyjbxbXFuF!} zV*jt{uN!a`HX90Z_LB@+V}`u_T@0zoUEUMTHA`1+l2 z1exsl7*$aqv_RE>E6#|@nygc<^?HC0R}ozhj*3caeF?r*$O4#HBJz)EeyQN=;5@6R z^XLZRlkfG0ZuMlgz0fM7+tKSesJFr~e7hG&`bgAN+kxx$+%e)#FSxp0UIgBz?we_t z^i99V<_Lu2J9%-Y8dpQnusZ743O!?U@m87^GB?4FkL#&e6d=&GjbiG~w|fp7;BwdI2ougaN!crZv;)#_k}!5@i0CKnIaC z0ip%QHN2mm>0s~vdMjvDA{$fJo!$8TAl|7c=qpAQAeW`jz~=(fqHmK?Uc%eWwsDWi zh%3jE5Wj=+IgtCN*z`uf8RiW{362`_OLeu}7>Ua!WpfF}1;QvvfGAO@hR1D+ERVEH z;8QR3iGGF&*+SLpw#@=bi(&@9tH_Jc-;(yOk6@$Z$=9Gi76AejG5?e;7w!v^*Pe&n zxC99`=eZ&m$y_XEVNP;#BRdvwqoF`Xvs(%fKkxO54%(;0B%~x1l zTMy(@1}`>Uu2yQ>VNm3?v~Ull7o&<+DThqsvRGgBTi;2*=$ZUVL}2P7(%iX*n3ID_ zvc2v%U3&{X`bXeX6^CYslKn5jJM%jJ?Mu7{uUN;yI4|LEFIpFG>A?iV;-zA26+q?F zCsBa;n%Nu}<63Hy!bsb9W7rBY4k7bSk8NQTg^}w=eOVkRou?O$Rjb`A?^@sadgVrd z7g37|>|>x@13)ra1&*FpQ1qFzoA~@zbhMOuz6NZa?&c4bJ@2D0XOgiyf+>_`sN^Uj zTrCZn?57{kSk^5o$cRGd=VWx`tIgwjbE40oV|pD&UT6WB#!lyka`I63>s)_VA4S4}S%JwMoURz?1LmDXP!R@4e9YD?DC-XOyXl@txhXUr!&1(+kA$ zJ@&8)<HvK%H(=DZ%o`u?C--U%!HT@_cx>ju%HU1>C@jPMN1611#T@^j!0g!@Yq@52R zR=5`XVty%lO@{#4f-{3>SpaiRMOC zuL_LDoce&U96|Ye3af|{Bt86;x5s*}(3{vV@1Y9;$%@IV!S?8lPj#-;Vn z1*|0A6OxrEa;u+5O1#&?Ka&#G`@4lSBrV$xpxN)UfKI=dYI>G9p-JFBWZU&h{g}y` z3Tk$YcY(cXgyAKLA>qAYW|;TK3y=Ke4|_zY4p4}o3Vp`T8VB5OFr=$cq{rSB3cCkP zH_OHlE6yMLiiS*nD|Pp8!%NiCYtIoUDk@mvZNb(!++4nkd@~MBIQf=&ZysnZKYR%B z#l@F=y-%-JUKG3{=9Cz$ZW<*Giq=(PViHLf?nUiOV+Si>#R_yM`O=kTEbQryXMrgJ zcsrAfcnZ-=CC;ild2GBrq4 zkNdQia-l)!&zhMi)uAp_wRIfiAF6H#n_;`fVYXZPP5(k&*mtqf5}FIj=hLi8ug*I* z#sL1ANXI2PSWcFf9~SO*JZo3;zSGv<<|A=14>BFle?d)|1aa__SQ0^xY0?Imsa0t{k^kw;%3w^1gvSm#NkHPS9UAlBEYRo8!}NVx#cyPDS>HS++-nX0hHF4P*8 zJB9afMBZ?tAR8;`5A6O00emU2;}zgaOVlt{)9V!ni6xQ+TXo8%12pt}$F>JlxXKq( zQw%-|ODE(`R6_f&&+7GTSn4Tc8lB@tI*0W;{40&~Xm7kHt0j?`Ec_~uyz1G=S*>g_ zGzQ}xjpyg@LRoJH+8617f30y7P}6GPPkOEMuR}zw$9HMNGsmgaFV2}lP4Y4Pg{$CN ze}LSqMBm{g@t99YXaTUY{~7gnlqO;yXYdh2o60@_q6F#JCT|9V=qkdrGv<(b@|i~G zgptk;`W^n|Mjzr3bN8<^&T1gAC9n{gq6I9J9w?~|&}_G#>s2}eapwoFZU7#S zjsz)R`4X8mYjq_cdf(awUxnnyh%}{OdTnzyoJcKm=NtPdWvavBFEhr!QrJ=-1W1ig z&8zDH8{%l^GW7fs=;&Hl&w*36ft!ZJ^gjp# zd95C8C9ai9{SqIexj)B5EdUyCUl7m{2q%CGYXK{*5yQEf-f*jzSR+}mR;L9tKcm}j zP=PC^9#>W3_VP5UJ1tCv#UNpCCKCe$4l2s5Kz$J29W(n(kB%JLDeZ7pfNFu7xXTbR zYt-as6!7f1P3xkBjP#F6+26#Ui|;FyfWlD!CCuo$NJ9r! zpyu9vSU#c=P+0#&+BiBmA{Oa^WYM_b!yH~Wms7PhY3|W8NmKbSat9NDuL!|}*RBVq zG)D}AUYCD^jVkTdUG-piY*q+Vj>!DC$nPJEadbTF&4f$f_L@UBPMZwM?ZTrNPYf9+ z;o;q!B~UM5C(=L8o~V1niG@NX;*^e^Byce>pXy)3h%9ElA~sES{o^()N+3lAlqh*` zmYfCSaEOP%Y<5RbLf;rBFk+<1(<_=;a<{`gp*Z|hG|wfblnHscH`I_nzQP{*dz~(# z7%!jT`r##bbZ5A@H1R@P%5J;miga@E<(-DYHPbWCJR?`~tXuWeZx(Fsb8|WvXxN@M zV9a!)niw-W)O9Elfse@UP)Icr^i{xhZp@;SyO8&5o8=JC%zgz3&8z9Qv1X5^GBw~W zeFV~6Z^#QgIYva*4?bKPg?RnG0~Q4g5`?5#)(rzk^M^C!Y5)g1q$iH=9I6=+yG!6z zNz~4&W}8x&N)9v&>}+AsZ48X@ayxbfoL&duJC7RFoB|5~S4lq@bL@6qbuho$B~?GB zdnT&E3VVsGfyPdaJ&ALfY94q@(e#hXms5_|?X-C*E1eZ5@NPi#u4e-JBE?nS)MBXu zCfXKH>#r|{3wRs@i3-~znFSUo50XezATjC8-&NdbE&58`D1Bt%Ou?9*|FEbp+_7LN z>akmg9A#j&a@mhm;8NXJqm-|hJ}tu=0rpwB6Y4TaW1`|4F8Jzzcv<%tWcGVlD=9Oy zV~lsTP5RIgMe<6)G$u+Xsn_1Jf#Qxkv`}-6AZ4JZmI;@9EG8H~(NF4*{9p_dmKf!O zmmO=pU(o4^jdglQclKJcfoZ=%cYI=so)mb}2C72e?>q3^$Ap+>uu#RbQu|WoEWA^1G00sA zy+RgO!aN=0Yxa-(CfdX{jlZR}bFpUHk`{0WV3Y^>uO5#D(q8`b+y{o2C;?+2j3kz? zuORM$f|&mGMa~_g6Bxf`Lo3AUFWjrGiXIU14>%+XRm4w_n4f^WmF7ERM5>+3dDU^FQc5B^qYWl<}x7UM#OF^9j_X-jAe`2y#)?i=o zMAAWf*d>Zx#<3%a|Ff6$oY@>-Z=IO3WwJgaYkh0A=Hu|yrZQQ1NO*N+BlEP-1;hQV zP&S}`sFex+F-oi*rl(ZBpY$w)disb-FLMAiS_>)6@pCsZO2R=Pb1sggeTh&GzZTvN zKa|=Tj6p&Zp=`*qruJvWeWB!H6M&NRSgNx>Q~oJUeUQzY6U0$G4ZXRd`<&8B?Bg7b z%@Ea@NLEB{&=-jMmS-Q#xzLe`<|?Y%V)asM=Q2!_I*Zm8dwxGF<)m1lz5HM$`9+}K zX8}wToF#Z#lG|PdBz_Z8c#z44Qpk{3)Lzh-(c!lawQ_w|J-MgR&S;p#vQx>8pV(HI zS1&WqUTSJ3U==9sh1$?@DV5gC#yl`*a6f~AT|3fw(8yM)IK^0)hJ|by|GaT<%)ypA zOa=`Wnd-}ULHKF+&Z{OLmt%hCvi!8&3DTMPz&uc4kIcF~Q;R}(lj@aY!jQeD+t(t% z^gA(BT?s_?yxRC&Eu--lsckANQ_S7XWBV45y^W;WVLPXDM+4wX`W>;FN}}(#O^Y8v zmkOR7IB^CSyev&)4RmK;H<(s!fh@T>yaixpOAsS@%CDOSZp7sE?^o-8b~rRc^1`d9 z`qy`@J;>v{l~c#WopjpjEm@?lomdpiG7A%X!)3%qc*JRtsuuub$>2kI3{!+UHaZ`7 z=gt(t%txLH|D3dsF@^W!JZ6uP*KR=SG%A}s5;|+GFJ}a9eVpx~mTIaAzkssf35`Z8O^p zUcm{kRd?Q&02t~MC8Vzp1pxEslhgg0W5EI}Y(r0;4J5JzcsSonpZ|i?q-%?B%6JP2 z7Cfb~MBnbs(Knu1u5x@#ikjjpOar#1r>oYyTv6fOJ`*MVDpa&m+8N?q9K1aIE>8`X z)*m_LVn&XXuT-i7X^Ge&%<_@sZP3ManPY@F1Vn;U@woB zq~(mQ3#(3uZi>8%;1T@z8nk#_#qW3X$fI-P+;mG-oupoJ2L}9^^xp~Tw)~WJ@ZPXN(o2a(AWNoTjH|`Lj#zH}8f;0k!JVccg9xJ`~8{OmQ#UD#B^<$sy z)C}1?J>!|0VPA)X&39)$cjsqbGptSnG^SFF3~l*|*d=5Kl`%?GI?hA5%q_Fx*i(Av zc_Fhu=zyM?8FtnQ>$+a1HZeol>yc0Ne+ShoA9El#o6GKY?16L@rs}`k0spA5w{o*z z&8f_?p#lppD5t9q-s#w@l58Q)C7>fWmavSfL2Zl>7mxA~EOLnqAV5h2XJ(~P1)qZu zBsvAI%=^^$Fj$bJh||dL;jbCPXd&|;Jpet&wnKU|<93T7O;W$(M&-@mRXKmR$ES^C zdspoIQ)y|Lp|ydqNZAZo&NYrzN3fc_;`(+ceb8pi5Zur8ZgH5*i7C}*QMVE~0*Pc6 zn!}n>a8=a#h`2O4rs$@{h9}E4(7$D@?4fz$Oa=D z24tPG_bxH4>7S}JQn%1HYS76Ujfr_+2?Y}pidzC(m5pWs!+@VnClPZNWjElm=?*O@|()(;;vkWR5)3TZ|?Q=*!FlB4?gp%xI)YDNWyD} zpdJU10X96z=OQ1{J5U16?U)4V8?;T7Ca6Tt^CrUv&fgQMZ1AkU?8SG$!5F4^I6RcW zz7^rxk4L`TA>%$!YnHWm4KOx=7t3h8*2^+86p5$Zq_f>)nuQ(bTCbNOF%>IVIXV>7 zbPW{tZ_8h-10An?+a%PaM9yMYScEuFHJ0X+K9@)h5K|$?cqg+AVF;5VnCp8C0U~wY zaPR`R{1I`+Q<)gr6-xQK2??mVIp(E7KCoRR?`eV{@zmTtqVE7)ABd<%;s^`Az!^=Y z5RBEFWM)o4F(k^-@G#2gUeoVVv zN{ug{J^Z(eB|0Hd5d+AgrX1mnoP({A1KEoR0Nk!D{(xE(WavSnHbP=R(M4kq_xi27 zNTd(|(l*2Zx`(gQ6cT^|lV(eX&e$w%^?2hE)Z{1DcDTMU?J}2rdAb5hqEI6qlpm-> zg|p{i8?!2KV4=}yWDe=6{xU)OCga(BWjuQc*2XB8IPvA%lGU!o?+PIYJsIRODV+bZ zF<%SN_Rq69yipi>i%rnYTi^D)h|?NHJrq?HiV6xeyBCC*6wc9_umL~@**#HNXQPTY?##Sq5?j1Is2vB>{fUCLTO1wbB-n105$2^+nglcYU%-zM?pV+`nF zZix4@@Zxoza%yK)Jm1o}<7b|}V0E<>S;=3d)@wG6^W*=Ce($2{>s^qM_-7N|c+mUp zK8xJJzA~i&QduV!5I}1|dQ(Ks@!~Me`z8SGO@bsc>!Ri_bqA`LJN;se>xGmWWFmFy zPCn0>NTv~-?>NegK+(jIB87s(M%_zWB_2p=b*yzov`ib{>&X`J@|_q#8hCbM(L|AT zkz7)cLBD(fU<)uc=ZjadpUxi}ZlwNGU_+lj9f0=PzdiiL%)yEJx@VHtC;Y4_=r{C+ zx_7TYCU!~5jE;Qna?4UTMEM-8F<$H%P)!3fp4xOSrG?6IiJ?yg@7f(S?W~CuA&;*5 zMM=R{%h0K3u2KaX`uX|!gpl<0k1J8C;a_yPFTL$Ks3Q*l*a$EgIwV3<22Q-^pM$KB z?WEWK?n@S}7q-O<%}w@f%=4Thz_I^n8=EnZA`USRx-~TM24J*7D0)A z&MTMPCyfyI{q3W9CJWytQMVt5wQcxor!?U7$RLw#(#N@>UF#-8Y1~TA^JW}a*!HQJ zkmcqt0-V4!;C1`9-4W~L_0sG+xj?V|U)1_cG#>8GxLE>rA+jzvrhESJBX8}zErE7& zw$ZG_87t_+FHRRV$JriO)Qavu8TF2k;KJPE?DcPmt3THI`4Z`SC)9_Dd5aK%FXj+a z1I6@(n;wbhRtn3b>aA+g=$gQZ?^R-foaub-tg*BV6?F2oGFOJLvPI<;HE^ZG)cbt* zd4C`18R;JDoPk{2Lhbi#|E%6T!AN54rewm~C)*Zh7vvq%vZt>}Ohj!Wd++~V)$zrf zciy1+an4DmA635~+B=I6YmPG5S{$FX?^Ugxg;;|wx*FKJ=$57pFjIm=UmV`?4zZ;W z^<%L0!}rp=J%jg(E%X?#ko7@4Bp8qBk_rna>7LfS1JbnFi91m{o+B=;Fyv{JFp%ur z%4d)8jUnV>vvh@;HiP_==`34@=mX#;6_vPXl+464Z1H1 zC3S!U02+-F*&NJYCJK$i4e96O8$0}pR)qT?^&!TqrjHFo$G1`{rjfr46&-XQK?;CuZ(-$)+O(iQG3ybNXaP9d_a~ z;?jE+5Fw7~0=QLxNGjSd?D1}^{ot>C093H!A zDc&{9u zvPCLT23#iS2Y^&Rey~U0ThOywMGV24zdFJ2Iu($1=G~bzz}u22yO(o ztsuO6dkKSeMl!YQ<<(Y=7V2|UMOVS770fplov^&NoIs6UsSplH(R0CRLK$Y_X!CMuG#P@r@3BMJ&PwGw>PmA8>3WZ*&_@UxqiPTD8q_RKO z>jH~c{kzEb+aQC+K9Yk6{RdDR&1DyRuqgTsNU zN{~eHpvjM=f&0N?r6U(Q>VPpOD^y?NQ^rHoTl3fLfHih1E|D0Q*)d|HA%5V|;|(ea zJM165tU@KBxyy>*NkAQPbTlP&qt)|?Oa}i<4u!+c)h}LMN&}$5=x+V*-ed*+e?6M>6UnUE5Dt7)Hz%VPD93yLjD4RSM z3}9xGg25yXLw}>eFZ-ABhjxoUMmqZ_bdU^mq$rKx{)PpC(o_Scq z#a_nmCTY!OT5q=UdUDKsRTGG#HCq?X&x-Go@-HUY60JAteoj@u&$Ee=#$MT#;UfjF z--{D8oA@rd7!>^LExRXpH#V((%NMI25fL^xzHd1FN!zerbIz%G>J3>ZSsd3YTEx}M zZ&Zuh2XrxgE^0o1`VRCDfpfu9F`2)+*vpQU)wV5SC~7iaetyD65d-xPL8?*bmha@Q z0n!?8ZWePjxSXH`h+~P1x@uw#nUD>)HDpdUg1yKs*J0}TDDcUuTN^-A-#Jo93NZ(Q z{`1-C;k-x*|HY@|!zl#Wkv%UuA)7Rr$b0Z_iJ9qph0fY%(r2GzIQ($)b; zQS;WrP4jrM)+0tmV`A6r)xDH@Ys_nzE6+x*v4fBer+7@Je;LtTUATXOQo;x8vw@WvD~WLq9OWz zdo(j^7sm#j`1!ILCT+~hkOLekIO4>gmyz=>pGNKYG@+VB#4dO5ShMpx34%*gEQF~N z1%T*41}_q^-U2M>LD%BuLc=6luNj^Szd_n^>GlUrys0-vU+4?|DO47DJaYViQAzuN z?UHx=55DR(z1l3#q7=aK#}T0VAMQ~6UCEF`t)Wu822Wh$#e_OkqgMu$;ciaxY5@S4 zG~rw->Xx8}Vk35q#plbJM#~RxO9F#sOe5H4R86AN;LF+t_Y?30p%s^Uk~xOytI&Tz zkir6Z`Y*k@M=UJ;dboG?o(4Lyb==1&;XzPtpa$iLsMyQ?CGD4qjl7ch#QKUb{^Ggq zG(kISpH|;JTj8m<0B(eV>NAZ&wq4?-aAqBcpa>XOb+SC zCltsL$|jPq*||S$1z~Bx&V~I{qHv`=|7QseKv4_KfZ}A~<=2t6c>9mfSvAHGqemqE z64qEzN@X~-iY`F=taW{fyayTa?Bu$=A;CSv_m`l8Qay&%f|l(%_`Xk>$b)lF8kRIxvF6R52DkDszckFc#nIo; zgbK(j!5Q!LDP~K!h8dqSCsFP-T?VMOuCt`nP6SE%9Klk3gt6x=Xao8t3n#Lo=1ALd zFUf{EjPQWR_9yZR|9Gdpn?WO6A6BniL=O^dpB3W<$+Gp|7|h*nGGZ=ySniEA_zT+x z&iyC=f_}incldP@j~wv&{61Cl#QW}XLe-YQPw9mL;J3cVxrdo&cZ?@35qafT88wvm&TrqHLKe(z6_@j&i>LTFN z(`RWw6lDHwLkgIX=4|P&{k1AdDqbH(_F=JiWTi(E=<$Uz6`JYKIV9MoF#=BTu78m0 zSz{qTN2Y0v{mtE#AwV{1>vLgFMNcsJ#Rg^Wmyre-nt&RxKbajmp>k+kd+W&6RpQ%# zPFjgfEU(%7pP?9ctQ=TbFK$NlQbf{*UN|9<*|*lbcW&>fg;HW;mm(mG3LY4OPX_?G zTAkEa59WQuydt%qTGji&=j-0-QXDK;Y~7)Ae}HQg!{0L`~L_k;>wWc)cqL7sd_ zOaV(l6Lk>%^j0mZZczZ%Jt_j)xP< zpuc@Y4Dyj&mJ)mY>G#BmOTyJ;QU67S#~9izAs6TPtODALyq@{*(AQ^mmShvSHcq>o zkSQm%uE&ndEUWN!S)YcBu&{UthgbV(lv|AZVm7%Z)U$J@=MaAde|d_VD#E}oIm|oQ z`2jJE!?!9Qm*;CtB)wj);33w&BBb+&{VcSF7K*Zl)I%d~jwL1tMA>B|RQ7N{K7Fyl znyxzZ)4CHm=W41FsqUAwxH>~PY?50{_#!s7hVu3tnsSzouMT*7(Oo0INAr%w^yvjA*L2*8QMNVUMrm z&Kah0CdOvbMZ`NfP(tswJ&rnyx7j(hx`Ph(i0`2>YGcu5-G2U1*f4ifbiVA?j~P~w z*dCzd*g)<3CR>>&@eo7=-)eskFKfHWHVOVCjs+!gWGiuZ_9iAQ%=?60L;w`R)CxR% zIX^KF7bHeC(yCmVVu8!IzaANp%ao#(H7_MSn_a;>d1a4GdThrKKTvRrlOKD+m?^ytj?u$l%Xx04)F$u!_xG{V6XQ;qK6CfC?{vv23t^;}Ef`Or z+QHpl1;3-Y;>Ht^Z&RN*l*LzX>u#wi(-8Ju^>z|%Kx3WtjfPTipY$d{L=aN1SUO7} zxCsjykR5*lW_EpZGM|2UTKFpPIn~QEtb=yn>B+vxYQaNI%o=XY)Q;D^6KrlgtO)(I z@7Yu3(7*ydF^Q4j{C|x+nn`~TH4`qa02IDFTIuZ5)k~3g%LqHd?KAw_Ld+rR69oVh z9NR$)Wf+W4?Rm21Cr#^~$kfa~RseAA%c?FCSW$DW57zD4e_tlQc$uhG_}soavDz#YRQ1E%oh{0+YH$ao$uG2m1ha{CnEi{NXEV7pk3+@|G}{WWHFG^C zyV!&sZzrxWs8fP^`g4`@P*!p8LT{Fe@Z8$HSyGI?+x2%j;nKcu+S6^2pWDB11GeL# zlF=jK86zI&P*+{XMmL!6>iDie7RP8N_plB4fIXS4?T38|Lfv=&-QsN3vOKB}Z3;NSy%ccS*C?a)ki zBCjEsN!)OnWRd!CVhl$9yKAuWs4h{Yl5mqYc?M()l&OYohSq7!JNq_l> zlV!y2eZuF|pz^9Z0$>mfg4DvtncAKL!z!Zccz->=3xGR6N@$ZR7nsCF{aX_z4n+b>BxnGuiS?fVJ{A%UTZm zvCOwjf&4DS+Pij2|B?S2pZ&5n#X_)JFm!RHF=2`!v7hwMJRiCZ?m^k;R3*R`;n7U( z(4M80jrE7-(06ukzK#(V067R~<<*W9o_~CP`;cahzWm;4kM0=AJ9TB+Uz0lS?&3|1 zHFYw9LC<@CPBwqO@o{ZCFsQy4;qhTqcZ1rN7G~c7^--l!LPY)>Cbpdr7-{=#fOowm zND6@?hnR-fI{Ks$It;-3mgT8jw|Ohx1Vhl)_HMpM!ZBO)rN7e$_9Pb<CW#;*0pV2 z%}A}{(fk%MzzoJI0OlaL{uo+0YPTyo4StuZzOJahSGsUi|6Mg@EodT%U#k%j2wf^ zQ|<6!!9Tw@Kmf=)ubk`7glT?lYdYa7Bq|K=+4 zGrLCs*G`u;$;_JPK3&nYYN{Hpg+TS?Ou8;^94f@xx8#K%%=Bzwcv|1fEJe6uG5A!9 zS%ibp87-iFeelcYZ!tgBC9df{Kx!D{?rZphkdICFI{W+9SZ-gUz8%FwPqRmF{aIt} zwGb|Cb~PRANQ`Mj;5kl|QzvlDBM>GhT7=fDm;G zSI(#9>X4qu%t17{bd|1b0QQswQXfy+W|EZ ze9KMPm_$~~5s81XiO@ti<6GHA`M?m->AVL2lckt?>l^QCr|&DT><|`OhBo;D)&!1VUFBLMk5~WDM(AB&Lrn*Me+KB=)c}IRrvRP-UIQ2)w85dM*D*rD z5A&_>LV-GptY~%{c+lfxYhPYr;|N2^KY~A;TCG4N&S+&jmIkn(#c|5tEqoh7%}P2j zL{gM{o#9B(3Biu@@l6IbN_^aCrw^7>e|s6}z)v}1q@UsBlLfQcBNoM4-*fXZ~{38Q%V=Xz!|rId(A8{8P!luGFdFg(w`HyR@Rp z8l;Serr89~6`~$mIG_|I)WDwAY@(6&ENPLk2DQZkD|s=!kuXH=cV+E(3C2M^v!)|n z2RXxEF{4zog_gVHC9~_$h*DnPvIM7g&!{{)mT7A1ET=I$slrX<%<_lAe)Wu?pMv6c6}-!kWea`djc?O1>~U zDo^Isda=OSn3NZn;_Uz@Fq78Fl+3_Y%MpbmdlabR5!rw*_IqDPmND#x*9g&~5De0; zhbo(w7E-_)(l{gxbqq(pgh5jK>AXq?6^d-=ERi&Va8fVp^^ON^6x`=tTT!-Z`s+G_ z7;f(i@mjV&X<4~K#{wR(36u?#l5q*x71`?@pJHR;S{!H~gmbSx_;t5n4b|)2^G_gc z01K`wU@D?Bc;CT$C#4mx;rln2{i&7lp?9v9RT7#mSaZI(;P^w_lw8c{>RBPpcl%06 zl=svnCR3!ct`&-K>wn`^mSt4#VVGNf?lYU8;|R7zH|^_)YCx<|QwjLD*If(Cnu;)5 z!PFo+bUXHibSV?kNRVC>Wmh5R&q6`#l%lC1m_dfMI_w-oQN^+#IJph+*PmH}jqYxN?f`;_t0s;UA34uY8i1OPn^+a;> zoYy#>_f~Ai1({6jTC^+MAHe6Y7L^85n77Cvj z37;oE#A$)cWM9AMVzoIGvW26F)M+?vTr?8x%0pf%EwDjwz4gDHkWwRSc`?qC&JJ6h zQBh4MGtJTESEZ`!^UoZ{_A1c`ak`o;{)P>z4KaHya^X)#THN%;p+-b^99vlkX+r4x zva98Iqr#qeeS*k&<8}QzCDlEnzT1rKHf7G+Y(wZr8)pqkH4gTfTU{(w##ZWqhYIM= zo-vJ*OL(114GJl8U`I^5AS79A}SS8&i|7R_%xj~>uoqid6%?h)Oh zj32hW{g#b{(653SV#OKNK^Sp=8{B#x>A%6cMziM?IL3*dxO%+i0)J7L->DiUVd2pHi1EXH%98Yps|SIavE-9xI$=K6 zURJ@<(_!{j0w0(6$dBmBd}#XPQ^*Y+ zb}ys9sh%2Gol&f~dlyqVZ&<|4R?IF7%J%n0;Lvfc8DwoI9fVh10U82602Uo*2&0ki zho>UAelk#ZB}jvpnUyYLZ?)|b#f{v}m2yB6<$%bH*4nd9^2dTX8)xyiIlE7Kb8*1- zcT#CWe>gz#f*cDi<()Ju+kEUI11!gq_{D2{|2NM2w92e<_`lE7iUpYoV0T)iF|CZwzTtikLim{f4zw+ zkhrJ~@vU4yX{&4P0$bQP8A5@$FJv`FIhN5Drm*+gLocu8@#S=;o*J3-XdR#pAj4}h zMi=!VdZ?g%N`T}TLuL8)L!Gg*sCAxpk)vxG0w6#3ZsBIR+rryaZ-b$0p-3=?@H=LWI&EAV{2J( z>b}EdW-BxnF9JqEbijr`8RL{TzJKT$EK)>WYboyi-VKF8w zYm0bsnAo(BT8dS+-TN5sSHaFR1D@$W4UEauSdY=e0XO^o@^l&&8$95-dqC&l@=4s) zB?$5&Ug+UN?gelsu$hVrIMg=l8#70=$!(me{a~E*r?a4T;hc@rXiY(6HEa~b(m?Lm zn@-4Wv6i}D+ZVp?2T>1h2-E7U)tW{9`sJ+p$bei|;+Kf(tsOXd44}%g@?qhSAj5IG zha&(+aUrf}x5#z;*{##e!{V?`4K-#dM<{p6QXz^0GBviInfU;5mui7~Y!NanomFWs zzc`(C6CINPoQ05Xgp{*yF>Qed4(V{+y+{2I0rLBr;gKkCi5X(zw9a}4)%d)8yN`R; zFd^Ycc=bfeD~$cv9@ygs>jC@ z+>jJEc`UL|84FpEOB*f^xUda!sbfH;5S8BuPZ)cv8!G9)#%?^+jc{A(uTIapf>ix| zHD9eia-84B$n`Q0idR+$8I`#vUjK_l2K!@yq6eLiB8o=39G?0&xWn~p+rPn@aUEJM zBk#~&GZ>D#c{knX4hws(8HsfjJv$ zHAbW{T9l;Qb_ys^@FXtWKNvxE+hR!5B;);<$POge79PZ!()qKP2NKKjOypJ1pI*Xr(J@nsK3rwElFl}~=X`S}{Wf6^3fxKUZS+tB zt$`K6Pp+UGH@P?!vz+Ez%p!gnGBbNV(t)rWB}=HcPQn~SKGAWSN-b~AG>ST5UhOYx zr90i~>kXj@Ts!KT{=Z(}1(sGQ+_ztzI?1*>xi0fOEIa%}jldpEA<5_Yl zpzhIUfH!=zjcf<8h!EcWDFDgryppEDFUN%2ntE~L!EJ})e&#JTEjh&o5W#2q>FU+9^J z#a~?LJC*m)9)*m>{Ax_@+Xm|6p-&&gKJ1YzDy(<=t3l1g!vA+Ji-z-$z6gM z!o?Q{499|x3=ur$eMIe~!6mZ+Wq|{~5#cF8hSr=MQ!SpanSj>?QqRE6a6mTtLf?Nn$^_r^!6p>n9dg3-%AH)QeW56|F$4-pk60y&xwm_$eqlv9UI4tqZ- z2p7)g2S6PP{=O+c+3G__Ui=X5bg) zf1q320AM6A?*CFS4oC+|fMq~BPy{pq!@wM{4g3QhLjWigiU7rc62p6725t}nDJX;r zs0KY)zyV=shjeI#Sy+ZGIDiYN;2r@KAOb8v2uJ`Gpa*P#7l;69pbZRw34jAT-~v2B z2uK7epc)K-5%30Vf_L}k#GMmX3;X*K>uJqE|Bh< z0CmdyC?Tg03pylb7Ppd1ZAkAnJ$*~Q+y`6@OK3BgK`WY~BZlHwT#U(>g`2PxPhgcl zoBoHBzDG=Ogb%8i2^+H1>2or%AhN|;3R`XcI4nE#s4%B;;qmA))0#hNL>q1XKPotM z%6KWIo=Hx9&bzP{N!f)}^*7UM`&|iqU4;soR_xJY%F!1;_28B`x0LWoWHUe1HQwF3*E^FEqtAu?4m6>IljetrE~zt>;%Pjw`IVwGrO zj5&^Rfu}%RIHO%oaeY{e*tGoe+W3r6d3_&Lj_h#A3HN!yI~0M;u;Yl7dQdYPJR8(t zC@i7E;4`vxR9j>z*+!n4(V6QrC;Ha@H?-F^1llUhu-u+ z`Jzv{Y`HJ$Z}#0@`0LLX=bC%`+0K@hpMtQYZ;5?M{WIF>HK{4z0F%bjP0XOez#b`D zgm__|g)6h2cZVHg9^p-f$TJ=oup-JeEgo~Dlv1e*wWYNl!bM6~q^EqJCTWu{(*uWY zt=aL`vOVwPCk~yY$Rtv3V)tV0jLmGdC{?db>pi#ZT3MT2+1aXlUwtCFZ_@Kf{lnQS|o^`01F8cMMuHN0|HTQc_dA)*9A+Ai!*&+BVD zvee2ux7wC_|1K{zG^1u5oPJ}+U4Dl{w+$_vUMNKvy{Z8%S2RU7YGJ~yKY!x}zb@vB zcf7;`_VLAd6Rake$PXFFqpq0Bfugc*BN-{l3Zq}Npt~W8X-k6KofOe^OhC*}idW`X zQbLVsCa8?L(VYixd}MdgY9#AO6Ac*mnon-wzz zZ1!ZZ{0Sz{Y?O<9C!axfA+ru0FKtjrbY*SV+kQ6JK`+HCG-=u678On-DwZq&`5l7o$S9oxN=!LWV#<~`Gm=6V`JtNgeBm(Tx0ul$fR+W6b=c4Pkr{-K5_{kXsT)9?HNKk*;@IQVm} zuQ}cPG;ht#=vSj(-u}3)w##j`_w57nP>^sUiYj?2Nlix5%BpOM%cVTZPzWJ~6-iXF zB#=|#MU_-mk~jfquu(z{9WCj02Di$_&T+H7e` z_Yn{Bjzq*eJ|%zoe8%!S{m(~z&VG8afBU_EY&&~svL?nI{N(>4#}*@PdjqWUGMpXuR8tQUwrPoJMb3`k$iCuyzzWNqChUlZ5jC})6$hn zPUO)P%L1K4t3xh7goShz? z7nK0or!OgF$b{}&uWqZ#5JX`}fVm)fm@L>Tdoj@k#tZ8#yyhPUZ4qO5Q$k?|3D0jI z#&gd~uk$dmx@r&vxkESl?)@$0=n3=42IHvOwbo)K;|Y!@N@!d>zk79vr#S5(hd*Pf z*b4x4LEJp z$?Z}+9$jmfP^a$VJgMa8nfvGA1By@X)nce<=R;(z2AXA$Mv&iZlh?%K{%rwORm#QN zD#!SJslNa9)(kpm{C&fd#sBmvVpn$Gcwe6XaUQS^oHBT2> zp?UxqiebF%=R(2;;pZUD@3@a61Hrit6Gpjp_10hpT%RP4l4$AIx5Xwbb;3Xmi4oM_ z!25OC!ApPwj){{z(^f?(Mz2F!zN2>!^ufhL38wu#NAq3^m;qQs#k$H$ea)UdI-^?3 zp^y#w;RpeJWrSxhVTZuJf~9AH&-#k~+aum`76MvkNO*p`fVRlkkx~8pQl1E&5cuOt zMfC^8Y$e|aiUADeu)D~)ZX9->3u)tL>;?gge6BgB8sK zQ1$lQ#-5`qS|b~^-_8EC-R{`BIYNe8*lWEoJ0;F_3A=+)^|lAcU)8LCdzSsfP)Ys~ zt)fS`&9%o?iRYe3Kpp@|K(@a{Eo*BN;l(0@FTL9bG$9e`B%S=iwThUC(~I!p7!O~n z1?npysH19qr02f(dpjAmDQ!grJm1Y!lhV-N9?T-cBO!yQ?K{=&lxm7qQkv(GT({%QRvkS6A_7*TUO6HYk)h9nR6Nztto#B)h;N_ zid71_HJ_KLTGeS3YUe?|>XSg-9%1Ip`CPy=f{ug3)dI9B^k7fB+m0YOv+w&za4%`0 z#E}(Ats9J33cqg0=%6~08eV20oz~w}OR(^7>#zrQ2ttyQ+?a+@-4DXgbM~_jJ{OM3 z(Fi-UV?_^so~p!Lr_w*6p2$R#hQBhLId%^Sd)Du}e`8JsVlXb0r!OeF}%r->P$?IKG-yqTLI*W z9`nUyF&5--(gjLdj~Q0h|K0$L1IJugkJZ~BP7!)jH>lJU7UzW7F*KkWF05EauOKj| zp!YFwXvIRD9>6C{LRuQ2;?E!ST2`GJOyQ=p@AMJH1Mm}q`Uu#a6+x*uS!5V#WXn@o zb_PphSX#~}Baz=5Rcz=fT^t(1P+8J5o^LcL1WT1ZqQzg`uWa8CIfDsz2BY$MdxJfW zpH3W#9O;=GiP3~>^XO_oC`DNm6P2A}y>K!YV;s!bH&cAp`M(A|+hD)w`RVY+O7z?(} z6vl=&J__cvfl$$!8kZr`Y+@r~MgiJVFHC;Y$H+a;&yGF+`<9RegP*Ycj~*ZwR~iBr zRUIVAF|zee`Ti|SJ@{ywGZ zHt5)$35eU9klT@6?h{1JJp%?&xD`Pdy*+gnUEEzUkPR>{`mq6GU(jPb+B72eKdFZM zyAhHCXK!Bm6mT{u+!S*A!~d`K>ss0&NK#C6A_p@sgdPt#$_B%vH}4Y;0XM2=dK)*~ zGx&`PZhL8a;KkFaP|XsoVa%`>I-x8`WNe8I1I^ zkQ^Y@dS9bjVYXA`u6gdrVC{o2TLS`DSC*>G13pw8l4XqUJmv}D!OE;a-a#`KcsRjo zO{lu9He+(z&3r{Lo7}h!A-0jPW{+&p!A>UJHx`cF)z!T!}JsAR!G<(PIXkGi*KPtuOM_qyNWCw+UM`qvD#1~2FbhEP-+?mf|_ zl1Y1U%r)*ze^_Je8!1;dNS>1CAm8cI-JBxR{KW)PpBE*(Mvo_s8)j$IWV(4Ou9YB< zA$D%AGgw3L)jxXp*6R__SP)}|hBGx0A57rbHOIbCMVgpcSjvKy zyij*LX~Y7BfX1pogii_X&efaC!9s(X8Ria7ig^8s;m)e#b88kaa@{r@(8R)|-xkB% z$AB0*WzqxJ7tsX`V*J_j(8yuh|qUW99-=D5r-Eb(sSV`Y;_^*a&GNkwKP13Q!Jnn&{tK2$LX&K!kY_eQY&^)rVEJ6%i|C4m-E* zSid`8TVLC6Kbr#uyE7KUiIe8B8Y)KOrn9l}I|xklK4FJrm$eY4nq(LUF+Lq#lkz@! z(sA-NhTg7DeeFPo^36y)%TZ7O7|!E z9vJj~yh~(##9J%W}%-Oq;FH@^Kr@RrKe1E2u)1B4v$EvwYQekh*@b~vsa zrUKpa-s0zced*`eY1Lep4({n40Z*II&r^`s|ucWX*B|lLr*PQIg*D3Y2Kk zJo(iZ=_FoFq&cwcat_(lVmT`0MOt|uQO>Sro)vD1Hx6hEd~cjR{U=Rgk8H<-_BmK- zr~xQMbt7Ck*jg8PORPI+zv-t47H=QzITGBE>Q=kdpHK~8hIeIf!7a~};l-r7xPG#q zOU{hs;3SR7YtfL#YZ|(H<@0q;_C9KNpk;m?J)#hBF0nw_W5!$r_8iTDhS0PH|1=C( z?wWUZxh152J3I57u@N#0%V&Z}A&LX*}*CAYQnweGwi3-4U@61i=XzK!OPsCyi zrI#_ilLGib)FKyMN#qe}lRz2N(XzZ)j%U`2J4+xDK7F<AGi4Kb@+ zcvgk9qkMUkL^?B>PCL)me=z`Tit9hsHVyp^A?cWnRr^T)Jg_?>%n>}4hOCaJ=Y#>X zGD*?f!4LA;@;u43j>Gb+FWIIeH81IX&((MUige2h3{rambRK zT=}hYz7#GqEj)^oG>KYG#pIGrVx1FNaW@M4Ldm;`iC`UD6iR^a#RVT2<8=v9$H2sd zaUQr10yFuNwlp~7jyG*$K(!-!>Q#)NzVi7YAdMQZJLE)n9F~7?>Jcl=h-j^Do20iX zT%8<&vRMpy*-yQ@p2DIzex=EJ&LBbP;Uj)0yB_|UKM2SdMo92r1*BIV+&P#q^MDmg z=hEjC_`l0LLj`&P=;g~+SoIQ)Y^LIKR5xTajkUqVV5R`XFy#0jpqKuled+c9V&f0M zU-{FB%S4Ek8tnyns*u9}2o#D7l2TzOn$EL6#E8(sLy8s~S=J3F;U2%>|Wea4XZdZfD>ysn|?w0Q9p z<%JlC7Cg-T$C!Wgd}~klf_4E)X0k6d2^OqpS@v)>Pp_+lk~J?0dUUKni0xcj%!+vI zvdj6aBGfE-B9_ug=PQ55SX(@LfpyE?IPT#FMn^5s&kC3hg7k1p;+hQ@taxv6B288s zghBxDI%F3euCdv|IIx)tD=}X3&=e5uJA^SA9NHt$|Hal~!!@Cgw*Rlg|D|v)9b#s0 z)m@)tJc3uoSCil2_Dz9r-tg{uZWX6AZ3&G(34gQwZ_JY`rLNmUu?#>#0147m)7P0c zpMkb2?$8y$wq#oKZ->Nt;3uY&`)%y_2KX+&71?xowin%NnJSP%%vI~Iy^c=l6Ndin zd&}<1@!Cn;$1CmNHpR!vDW}|4;|4&G88=uID=L9cjEexts3d36k?gQLq~sMR#n`Zw@o^cfE14@1aPriZ;9n=XRlN*lSPv5Fa{g^_bV_DL#Cj@@$N&tNn>h zL=x96t?@UjfCh_K!=4e(LC|&zO$XjZ-;YS#z7n+K2wz4S*Yp(X7JocYPIhqe#b?@u!Hz%-C?2M@-z%Pqx)_z0{r&M&jUB&1eyG0iwL$e zLadk-DU&lA>J@VNUkNw%H{_#j&~vH3Wb4DKD(htFHwFED(qF=#utlo$ zD-`yeg;bq7BRzSj2!3OcA)~W&B4(FaWuY2Ng1XEOF#W7auiaovT_RSrUK#@|Jn|* z?Lyj^J5xrcbMZE#-f6Vs{N1?Z{8JF#$!3{cD+a0@%kKyTX4?U)2|b4Gq#J#%dQE|suqFWThC&sT9fs& zMgFdiT`|I+&eXHhEUSamIQA!g35=H;7C9~5{g1Gas8^Mg_Upeh7+uQzJzsLO|7l=a z0SmwL5G3Hmiv#a&?=zL~7?vIOe&=nCj@e#nLGy&4mMwzJ)yRlmx{0SD9B8cN>=c59!fWKqY$6M`0Ji=CP37ez)Z!4`qIZX!Q|27JT&kHCN-Ctj_UY zH*KX+uYK^y+>?wr`U$2OWLeNZk7jvavoXjRr!iTZF|Ag#7$=!lCv=lb1K+eTyTve( zaM!67V-_wblv;{?MCg2beyB@dFVEWZCLPHbMRqplxq1p&9~5KbJTby`^4UJtrdRNp zhN!k0VRpGWy+okqc+@-&n;;5mbRVTZsCnCrGn(L%DKX&e8l|Ai+_ zLt*dr&h{i*mb#_Yz$cit)Bof!iF);pTm&b9DE>z;!?8FMQxvz0||$av9C z`xDymE9}W8j39^4-@>XKD=)l-`;FCGYX!oud;v6_azbK#B#2R`BbzD4=4MYbgDtaPO(%!s;YX$0s8mS;6ihH%l#6C&gnqvNqvDPe%X0g5=<{ksy{SQYkAHBYc zRWl!oznIfj^1cQDK1j$v=yc$HyfH*;KWMbHs& zsb?AZUcGzUeRWAP6O$5RYXn;&qK#X79+g;X;E}I3{3zi^+|_ut-pJ(KnchRY7z5FJ z=WN1#8iAk0LBTTFK(xCy-kyGC=*I;FipZX$vTt;hR+BSZI+-TR_gajhxX$s(EJ;LY zW(+muv3kHc6VmAkjl6$_u;lwe!j7Cr)$O^hap z0mEXir9t4N{Ym`GXY@0l3=80SsU`TpPn9rZQO}_XtysiU4q{*e4weY*d1W8TGk%_n zetG({`gF}oeg07@O=h^vbM5wcJPePQemT`pf$sFGO?5d#BP#Ifk$gs&P!nR&p|&_%W%i+FBq; ztSh_AFjm-BJ}`d0f|>rTq`$v>#x_auOjuOiIM6DNjs=wRCAB18g(Y5S|EB=_^=KEH zS9UTzGkJuD5(;d-gg0tvDFwK~1P0!;)gGMj{O6|inCf4YF@j(c{1g*IPasdiiSpy3Hfa*W| zI)7Nn>bc<5z^b)LY=qh#)kAAU!Qzw3E`IPIhbPmR@c+DoX~p@QTWeK^V}7rWum6%! zT5Z6VTimf4RqV4H(chOg9VUcwJz1jZ0@LQfG_TAg7(+ud*}YW&|8u$6B0ovEH?lq= z=h}KRVbUi;@$uGWK`V+=Ucx9Y7AjG5C{UKB?_RB29)o6#Hx<1tD0^Qnw_HAXDr)Ke zxo`DZKvHq~;IOd@55$(V&X}_)$gF5}1N;U80&Rg24_`@?)va_axwovxpdGkptC(%XeH4|5u8H4!IwxZ3S) z&84f|o<5T+D}7dMNkcPt}-u{OSG~7+^DAGg4^5}UL5PZVPFJG_sc+FPL2J1DaA3~Id-fhw{dlIM+sxwngat-YXeUDL8@ql_+J4N~*#=m) z8XEStW&?a0YP6oG^>A`}IQfV?ee`aMSLCZP3!eDqw*;&s};&jqeLlDyM< zjia;P1P>)0FTh^+Us%KvgpXK)`L)ogjb!!5STsV z?Y``+f31P8928vTTQl}(lGeUmg!-57C|3Xkj~Yz&&6}?FRD_5F=_8E@E0bm_BtN1; zru=<%iOLolh~c;0D0}nfPRb1Wgf8HZdDE9B7*%H8JBxb)rWR%f+VlF9%jWGEc;NpO z>CO)yeQN$^G=R4VY@HZ*1jn2qO?dXj&K*O?Z-KN)_tBuVw3Rgv9aZ17`@_^0NabvK z_-k9vFUB4@&{G8^}?1H;4^a||sr;!vxjDnn_yyLmGj5Y} z+n1G(j{m|pbQ2bKFiR3j#<%V;cr5-_A2SV@7Jsmxd*$Hou&!LgNEN7vm{P z?HZD5^@eM*S|ovkxy`C7{XUI%f&Ipfo_8KQEB$-;m*p~*#yge!O9r;R2fmzoOF*z1 zsUept(z4LKC?%C*X%l^+4++#;2XIk#D?w0A2T(rX@%VDcjNKo%)P*wR(JXz8ZsH*G$JpWjYH?5 zE6_;wTxF{sMmkdQGd*BpSbe?SO=Ri?%8fUqiP_GDMC{c47()rJrXuNTiff?fqyPwPdcudrm7Ye* zEPqLJ(%5xH#`Br9ZVp?bY>lcNAgnL0fia{?O*28=Ew(NAA6%O4K2GIcQU4C3M)9z4 z3d&L0-~URWu=B{QZq~l1q9H=c^nSsfqJ8xlpzk=>7-3O#ezEuk0I3*P)Bw>Rp4%CK z`H@owmhQUll>;L=pLWwYh*O^VX<0s48+K-nW+-k&c;U;r-g9cL?4N6%DF6-U?NDkh zR=tS}O*uu0`ZRrLV5;h$GB_0Xt6H4M$*|+vEp8GMI*twG0-bGUFP^tNvgD{C!RG4M zXEQ29FCi1_s~3VknVmSqoC!AVEkmInwmP|_GF1|`y=^FR%F3tSEuGB9G?^{;9-p!g z1<_yr4r~(UcXOyjnNGAl0`lx;s>Q{YT@BA*H z@v1*oy>)ym`b;IKIX*EEwtT;!7+V%vdy`lXvt{1tv76XrPj|hUf`irL8jT>*#>y(5 zzYI>D5yJN!TmHa?ueR2I#&*r}NCy{)Wq(ShQ;p~f+-9f+@vJP>KBWfOTQ$yxQ?4b-Y9#M6n($4jfTv8`c8WVvQEq1nJ-j8AfD^iHp=@e_8 z-uDqBh09L%xi%yb$#Y0lYZY#cX$owL!4s*XPRi;mlRAsGTn=ta%K4+Ct#wdQH}&3o zB1>kE%g;=}K2%&z&YMT%^h{=}p^KU`X4+ssf;P%Df{#OlN)_*3RH&(zHdeNRfb3f3 zOY;D|H+$!<%K)5N^Ksv`6m>MVF7!;FGBBKJ=I2vgU%3;Pht@TqcY}lp>K$ARNN;xq zxJh4hSQ+wNWBT{aqSYBQrJ!(r_JS8(JNwclywe`+?8}xo;Gj1@ebLO}S)LpLCTU#6 z_|kY0pqVS~7Y;i*ptXfLx8D9GtHT7GepsQSa00f!QG{@OiJW9tuUl_{gEeCsjUdqw zCDC@rA|p4nacIak5#(ic6NVGMKhjxV zw6p)3mF~;qHp20J%tAi@MSnsRbwl4{Hk4%r6jKrKH-@Z6NzPJR+r%6xl0tc~L!tb< z$WkAKZIuC#w(;W0aJHCY{%T?I$cd9DZIAA^1G;|XWcOTWD9B>ekB<10EXkyHxmGx0 zqvo27W*)|7eL+<(k5GZn2} zJS$2#>pt&I>v|O1`Kf!0)owQ1(;K-~UH9?7wrgHKL2LjF{Yzr2RNt$-7Gimi+X;#=Ls%6>zfG*QmqOQFm2avvKhWf-LdQ zLID?v*X(dFMI<#xOkB(II~apS=%9pb zr>->&+`bU3jxUYSYKFPjX0*~Z2E{wcR5LN9_}0(G=(nW&RAEoyNJbLOEQyfA>{jTc zqhm+HN$;{zcGs#-e`w@W(i)0{kmpm4&Ar9WFWXyLhmuP`O~&;W;`Miwt#dfsYr$ZQ zsEDZBI8Ip$y5>-2=c0{eDnNSm4{rc|=+qs|wplEByQ-ImzG_Bk!eEgdSqf0zXQV zc%(UGTmLxrQ|hCz@v95vism=GO8U_=Txt)GtP)D?Xf9k5vN$#Ww9h_E7~IFFFZYJg z)ctlxUHCIqy^@m>v+ zqr1*cs7{VdlwsvjBFvcdYyKS%@drcr<-u?m%M61`f4QsWBtKp5E-> zb!`n;u5Kvsx2Rv)^cMDT*MVP`pdu8BP|Bu%Nw(OJ8DX8ZOkV?30$v#U+ z7bC7*OTh-|M(r+&g2!h>OaKzm65SW(n5rRYr6_qjv+XgO5-5B&1= z3;c4El-E)P+0`)vDt5S>KdV^r-+dg}`fvQz6IFoDn);$q-`}aE0%7^_?!yli0*}H1 zfsaZK?Z|TWL*B2$Qg+$3`^=CkKz+>W4)<4?5rwBKlGW+Y7HPw6y{0!i#V~s1+V_C$ zyER(}_&eqilG`Q~0XamB?(dN5p^~q?wn5YuFe^ex^of* zNT(ugWiI1&F>{IRjEo(Uv9mIEPR0x}c21_d#6U0+j;dDn(wpFb5B64%OSV@f;DcBF zCfv6x;hd9X>FfSi3MxyT^4Z!$qwX)e(a#)=r;nWdr9xoDnmWcDqy7b)VKHy`OT>}n zf)p4cA%+|NRsC%;m%=UaLo|_A-Kj%fC0Jw(;c7DYi}{cLl21=uE-vi z%Nf7Jc~dtvmCsd?Q2W&PV<{bvwnH-w?wb2;bHA>G3^a=$)K_xDl(=)&liAYRVe_hA z;Sqi~q?eA5j3X9e89pI3uOh_)H$blH5T7BiVfafVFv z5R%#|Y7*~28;idGn>abFrv{W7w@cbGM&OPP4(@BQov_ZwGa2(>f#q0Zb=YI40*5H> z8YREH1#a`aHJ1A8072WtP0Oaua{ej;h}A4j3@A@bJhn8U zXH-WFQU~=ny28pS1{RdcvNc4Lpn`**08*N$v2Rs^4xtz|ZjUq^qdks%JDzHGx7#np zGZic0jesLp>xA}(^Sy{@++W>bnhzu+ksv9xHgyA&pEb+9t_dNy0NB&hR`7}mD_Ur1 z3yo3%)w}Awjzm^H6z`G;P@#M~r~{TZp3N0G9>V}P@qx${7gml7PdjY&fb!yA30wls zc|dsfkzH%a@id>#R7xkJ!{8`V%`5uXRD8bR@3RX0Zy7;_ff5b1Uq~YaT9&E=m8IPp z*aE8!pSUaT&8?o!(}**%k4VBGlF#-um~Z9_NZ#K_@p|Kw45A>>W|-IdxfT^>7M;Zz zvN2YAJ$1>?a>W3gT3@d#PE^PKb4&XI5IaVV`v`X5D0O3!?9xtFxNJMtS5IIqzC_r# zB=a`A-q1rP`bjX{`*_^b$#E%KP^0bB!-e27R%{>485=o=ScwS?A*b*wOJqC$BTls` zCv618I*s%CD{H9%Gnxi*g=`ED++;caA$h{#%@bA(uFqVfw?SArgg!jP9}3YhLei__ z#Xk}%LZOh*BlvQBIg5M|S_#j-!*h6lEm>9@D+UAOz%;g%WbrPK)F|WMtB*7y)O|Xu znEoDj8}d~2;(jyzcNUH^ht+3KDwOqUxDdQE@BrlucvmN9Z4VN-e4y|S8@|5led@>< z{(4#Ah2}HpJl;qpmXcRf%o&4}fuQ^h?t!d1#NgAOp^*u^y^Jg@85yEvVtK$Fxxx+j zEKbHR>y9=eK)&Z&LRSyw8}d|+fJZ+1>o){%Vkb+?x_pg7S=Us))4%}2F|aPoPEQFE zIN(R&N!EAuz(-V&7<;G6bb2za&*HX};{x&y1YOdb5(rrtU%W4AA>s9Z?R9;Ko^!lR zj#|mECl2P)TY>M%Ki3`#-9_3Xhv?A#63X_22X58B+!Xu>R}3tMe3igIefUo>qmcWz zz`Z^#F8wIt=sv>ZtZwAgJLI?3zg4g2z!`K7lTwV0t^SCM$-1_sxa4H~oP(Si8@6!x z101)7nWUBM1rKKyg)3A0AY&n27#5gCL7Z{XArXMzpxz9-eHEE!Dk9!QA zPh}1|=)avvoUA!^!*K&;r}FO^hO$e*16Hl(tx$n;`Ur2a_pc`soUCUGrd=xdSTV@= zM8u>^HZvi4Ysg3AB&ML%l0*VZ~?g9#X>7T6jv^dEtQ zYdIGQ04RfJlm!xDo<&ykNV2Rn#D#{~}VzirGgRhmA zP<5L5Ze`7x4<;Ix=lY}+I=NAXd^L$*eza_#_aFU7@3c+LLJ_%(4ywLI$6msFstFq* zJ+GPZ%yoOuNql7JY}iQrAzI=z@fjAX8r(xbsgb}l>xS?Nlwu#Pl|GkMWezGpsXMre z;HW4AX^S-kK89js$TDWQ_idc*uYXw~Ll6B+&&)UGe$#kU31P#U=hbx$T^xIkpG250 zUdPx%m|+D(H}M(9s%qRs0I3&V`r(_xb|}UcF@@hPs>D$RU{#631pe!hj{m3V^$sBw zsWxmygE+aCP$SBWiXqx2m%vUd<6s@(Ail3;<8rimsY+oeUL!wm%2v8O@r+QeYVaTd zrbe69e`zHghEiNa2Vgo|nBT7ep#m=fd^0nUv&2Y9y(cRfy87N6VBgl+K@=JEJJAwE zJeHK%YrhEdHvT2#tjMm}K#jvyxlYmmysjf0^vrxoDasMbvRG>VSZ^FvYGncS3KBTW z)k$=s{mHWZptFJS4-bE#tkQGcnJ76^o-)F-_sHm>W$a>LER}IvC!VCu|#9`&WE&XW4%Uj7@$WI zr+o89r(L--jROf&el_WG)xQa$*|@^)_~&S%mn(+N@nM7g6q9)F4@Aa!#79;evgx`f zm&I2XfunFJQX$fb#({b|=teMWTh;&aIj)PQ_BjOq&1_sCK|?$HBv@VLk zdCd0DBoK(o%#eXbW3LW2r}DQ;h`ptwQ-={x;V?>(aPU-(rWO-c zHDRqtnLQdgSh{t&_zMG&O} z9qtb|Q98W;@#@l-bQX~tcA+d(4kD7kJ7W%c|3OJpD5kvJp05&3uzJMT!GL=!)7|Q= zLL8|bR(f@6)P+3QuOoYZB=E4lU7ZZ|^fvSOl^`RsoS%Rwtr$J&iC*nZ9f%GYmt#e2 zZ~l5uWTOFCPW1VLrmwVFyjX{sa%atM3SNcya&mqWu-l}6I4(5%sL2cRV=mZs$iSYQ zgfs3Fo@Ic=3GxT=O-DQX+nGCa)ibUw2Fw2l#FrAI>{9X#ITq`JbPqa!MD)PWjLnQp zy9<=ERO{uRN+ilN8e+UCnl-8g2NJ5^HkvPbo&)+3FX-$F zEdYu2_Z$A<{@0e69ri$}Yq&-yh>`fMg3pn;zU=Y0QuG~`2fB9Z@L97qP>S7eSLK`R z>ab1kbF&=s28VN^a8NkGxU;i@Q7cur*7K)A=~bswUYZ0IEiydHlPL7L1yK}cX%TKj zRI8%z`dBk)uf0><WJiY1Ow1ojsfDH_S=kYghbUMN=2WBS}=GR$EIq!MWiqvQE{_;3=Pa{))ZmSEA7Cu%74v6y|&Oknb4K6rMWk3Hwt2>Pe3 z)3fvo!5!uxWbNEzUj{PrQV^dD8&m~=kI2L8Xa)c$9$N-nX6QToF;SOeBO8lJV%Ni- z4V*x!DVfB0DxDe86Eo>Up{dQcfX(seW>h7~aAS2bS-O+WUg}4=0FTg9NiG~S zZ&0j&!Z=WvW0%k?eI$UQT?6nyuMv<^YIP7ey6q}}4J{T^um}#Sz1*ds?0^%qc={8E zr^GXv=0-TsdEL+CnRSrVR@Bw!;mE8zJ6A z`6#UnphcifZHX*Se*QOi-*N14w0t5iop@`qkbvfBCcve1&I&QDJO!w$sE-#)QKm#x zKEiVYg4}W~FwiVs`q=YPTpyZKpc*qm2 z&yWn2^-B|DFmIS6V2?}*SX=k>0n1XWdpqS|4|nhX*;NGp_`XipgLag?lqq#Nhm3Ak zahngi5S?28%QkYd@Q6_j*Se&~)P`9MOBkG|FD(<->wA7-xgRtLsL4SNWoiSp#t-R% zAC=7(lhdcOG6Un}|DS0;IbUcD6Nj6aTXu$vW`^C+^LoSsev|3p*5S{dXurrfaFcxh zmy@=-D;Ubjk&kMDlDk+loaq2B1`Tfz5T__N6q!LDnW~>x&Er|*^zwB+$RxNaukDAV zg|xH@Bnp+>tvUxRM(=0FbI*JaqD38Cq@XZG?2UCdjV|}z&uf{#^KpwXkI?eCKpcE< zD$k!rt30W{_HN35qUoQuzYFAza42;fo&JJ(;=Le~Qr!R1pAh9jd8d)A*x2yA^w9T| zMJ~ra!C?xg%*k$a_ni7wRlrWH(x#RMohtf%4`-tj4j-~U*-b@#&#bTV{_m4nm^QeT z&kd+ZOKG4~-cez;7Ux=rz{`wnP=PsYOB)dJ<2F)5+^S5CFZqzGQwhB!& zp_$Fe!RU~&Dwf0c6fgf_yl1YzM!R}jgF`>DfWZM$Z1bfi`=S01BGJ3|k+us#i@!W;wjUA564nw( z+*q9bX#8LDvbpQ?R+oo3xY}4 zUXpxsh8CVC*3S3fanuB4`Gbxq_-Ccy%&5pkhe|fKd&2(rBtkHhN`0w$5J-O-2yN}x z#r;@-$m`z&ovMT-u!K0{TO#j55O-aV=z9aXSRhVnFeT-i!vlLns8+_Vw0TkcFB;z^ z{PzFlwmf#(;Wf}lu`i-skt)~h8^)-qqvxA15*o(c#C@~FO|2K?w~F%LWNq;5o}%lh!~5M?*^ejchRk3}QkTN}zS-%H?>ncUS&9IGNXo&5 zUlLoV6Skb>-pDnIa}1!Zsh^QsGm?~k)J6(_JfT6>fNCfA-z92kFNa*hO6~V~u07$} zgStHZ(Y!3j%-JWtcZtTW742l>tY7vyV`y=>WRE`ir@^0g&9LAU74bEu%kC0*6zUYT zo?GW8dL;i;C{Q8n@K?pZ!pIYNZ%RBF=J}Nn*Q(l_zcXo~$>yXt&+sOB7EX0Ym&vj< zv;nPtCubk}FA44e)DlS9QHjx46c3A6@CdI{M`Ty1)*)AzG0%P{9DiGV6F%q;PUFC| z+aO{JQ76#x-ymYp+!HSznxIN3C%dw#rPK*;a0!vW2zH_Xr+HOtwm!>2kdspCEC#T1 zPFUWO-HZN>thWcx`=<#6N8_wjq5|dY2b zFM58K{Tll8em- zEIj*q`AF>boYD%`O=vX&&0JUHB8l|Fy@8Y{`8R>gZpagOq?t`2b7^{xA^TxeB9M#K zIeE^H;NCZUF5PcJOvon4iKKK_`|SZS@dF~rhz!MP7AL_o1H)(jTfl2I5T-%vNg?7X zx=nuwL+B&ZUgLd$8*B*zj@+EuEOQuRaof5ivMpI;Z~T6+vstR^;K@YVvTX{rO>D(yK10^CakD{HO7TEITFOjR+utWaqEi=6YqW*f*0 zS|;K6=5fenlAeGm-yj}YF0xi(Oes>lQ;gv+%>n}}T~?l?0q~bX@R@%(=_f>4MR;bp z%=(64>jA~fW`N(h3%G+0v z!st#n<;8{n`A3Q%Y-v?qzwue4aAs`7Kk3uF2xUnd9X7P$t2e?w}4xVr042qNa z{dTg&6|N%t1N=_aDB-!cSBT*5FR4P5QfeNm8ltFDkZDdNw+sDsfv<*qRHCPPo6od1 zJSOwEY_R0GzH;Y+K~@hPI@d4wmrn9yEW*gDSiho0j_J1ed-UEc#9w>e^u4gj7aHGd z+Pi;WIew}=H-L^{NX;CgaqUVH-KTrE zQIh1oc*H_mj=&;+IOdq?cGEFKi<2ef9Gl}8Va(av4?ZJ@AQt_uX3#T{zlxlkc#naG zfCVGTYN|Z!4gLjP`G?(i8CfwlrHK^4 zyh;LGvh3B^v9VLKRTicH>+Rt|ID9sjTq3N;%UBAucj)#BY)bIdQZ?lPH@it3XqHuP zatWC0rAi99L?T80d%Z&~;RYiZ$ht29(8iLC{-5tFSA~w+D?7Rf4Xn2YhsH}I^)m}v zZ%0F0{&vYOuH2rj0Uc>q{sb)P+NXxP5_Be9wf(FH(D)o9ODmF5cy7_(b*Ur3B9R82 z`aVNMvC~81A4z=3&2kiUYB23GVX4MryvLIlkn9o6!3Nyz4oM1hR%>QYptmtff4L$i z02qxLQ4uVzgCPQ5S%p-i5(E=@!&eZ%hOlKG5_#YOO+=o((=?q4*U@+Q0pBxOBWbw#!ljLtOUGEInZ!b z!9!oI&4KM64Uz;s(L*gS53^7g;Ff1L(c<_)na81R|ACR$EMakd^{)UDWMiZ5UXTIT zw8Ncor`&;7u(_ccValU)(Yw)sW0FY1cDQCkC?scT%BWZE=!(!sL0L~Vz zcr_LDWOYsJLt+fGIZhKS8|-O^dhM?$YZZ#X=n*K+Zgz@}F0B4&p1nkjE}AMV6$__J zl37F?E)5}JRKCEK@aONKx-36jsz@SEu-)jxe@meHM!TE*x61F^A-s#6bUcgN@vuJb zKc87tzy*jrvLy$u84k(lXM~+NK%?}g{KbR?EoYADr7Dt2Vn6bZ+m>R&`U765aVehH z{#wR0Cjq{AE#Gy(g3?BL)6Ce7ok}GS2dRoTl!H&N>4p=RY4umD9}#10Sh%zyf>e2V zNaOY9A|^UbN#*E(XTGKRsMv)DpHHO*WghoRAIzNRlhhXkt#RSU=Fl;GY*NAt=L#nA zAm>su(O{;Eq^5gt)NKwDdi&>n@#ybWr5My!%{6R>b5a^gundNSNgI+OgI-rVZl_C_XJ zTnqnfZ*Mk>0G+JBBlyY;mdW{&yq0Nw2{v8-5f`gUb}H{TjO0#OtO+``2(1ttx;-=W z`xN7RV|%%gRetwPssLv+bSTHuHA06t{CS!vIMHsF_iP=b_$Qd_=XNu)&yvPhc`;l; z9VR7|arb@D7j6zZ)X21&!FBRgKyOgv)KH-p=cR(QRi<0zA2=ctM=YXwvC!VI2wOYz z9b?A%B;t!Qt1AtSqf}wSQgyZcKD(XEawZ1mx>?|u(gK1PHASgpbfkBaP&mjJBxs)$ zf~Y;^J36YADHu*ABV}y~1)shq{tS%myIPx8wImlez&!A0-C~H~O;>jiKVVk>vJCex z*lHNDwnVj=O$NU>^(N$0J@9Ubf~CLBK(6nJ zuIN<5OheEPQN4;g5z?LuPQp2vM9et#_le&vXdRxGEM0I9wYo^f>A=3P@uc7x9QiKt zcxyz;ii_d<@ek(CT`zbZUo{G-)Q%M}7Ti6vy20w1OpkC>ja|qRX}+HSnkOZ6a;~Yd zN8}PmrRm{ir2-vnW!MWJ{{B>>1xO~aG)`Wf)06`Wh-M+`BM{mf5WN5pnd>zZg131y zCS&PyQ(@+Ns+}7(cvm~0jSL4~%cdChE=BkHI?i*o?A_#RBy!+W4KK@y@(>jK*1eJ_ z{K`jDc*~D*w__}>f$CYgU$OiXi8|O@7#?bfDWuG4`P+C^Z^0go-4{sqyewA()KSoV zrRoARiR`-STl?k<<`X-0FN`|%Q#T$ZB9IXHHUd|`x=u7h%RGl82-x4pbTE_#rY>@A zRd-%}OnH@}QB)_4oC`1nXIa?OiLnUB{-8)#DAv;gt@yH1v1NyTWfI<-EYO+U8tQHM zg0@6o{}_OX`|{L%b()%DYBlEp#a(lPWB-vdWYe!PF&P2pdP0Hxws}ms^0!M8cNP~@ zRm&&$IqN)*W`C62{-dC#PFo+e#(yq%1M{)4YGn(YUagw#I}K7@nuqbk!X*k{P==cr;IlQ9A2b4;#+ng;53OSWmeR;Fkb! zr(s#349YW}*N(|PtVM%#CoG7*UXITIvehn736@G-sd@fY;EzOcz4OiN$;&fqH{2h; z{r%^p*vEMtxspRJe=f2Kn3WeDx_k#KSW-cwr z!#mETAK6l#Ist<|cCO7#A# zqn~U1IhAf`yJpTl8H;0?$$V$vH>VKtijt?r%UpC_-^T7K!;iz}D2JF^)pYXDIv7Ec z!L=vamQpW=9;$74R($KmwO>Xtmqw%d5>Fj)o#>Ipv@TBUS?LCp_z}AM&LgIj>)~|1 zb#d`HjZ)RwEG>NnX@db=M$kzX$WC@q!3Nw`>+EVxju=Ry#vag2R8EBofsxr>o`scU zMBSI(@xMUGE`gy;GX%zC_j4=E9J(3aIOtn1nXzQu(QS4C&@_rlBT`V#%)IEHriun0 z+WP4w9x1z7K6>Kn5y+>chL)<2w?GeWPF%LE%4>9t{qpGR)o-wuiuweljmBauqCJm} zh=<|MtEg}78+8$Enqmbx!~Umcgu}CWQChR60;zaE0#|7qBdnt0t+Rkbm?^$&f+xIT zUU%|g&rL6wVRyHx|4LCj9lmdAYH&h4#2xWi;_qiT&UDOBGIuRZ8!YpIlva4Ted#dW zDkV|1haJfHk^(aw@5z()<%DWtVALhL(>7qXqJ*HYuzLu~!Xnfz%TD@QRyXNIs&z=P z_h~A%6!lSkCqCj_$qd+sP?N>ao|GL7dMWhTo?@>V4UXj|vM|)zn?B<|yn;ZtQoIID z5C}>>1(p@rc2q|X0_p&pbivW0-cTJfY{+N>@jTKY?wy$i_$Sidgo5-6+_xb^^(6G< zS+a2(&k;uWKNZXl5o`qSxrvB`wrn9!REYWcc)cVZ%I#udUKInO9=H`OZgqiCF%2c` zwq9*lBlmb6Axid&|UlPAr{V= zSb)vIE zqj}(0y?>V2g{?LRLE(*?kie=*{Js%)z|^Y`oL_tl)8Kd`%dP5qV_XExTvLDqO-}s z(ujCtGlHRQ+q8|qbL})o9FFg}#59^)k<47~;(# z_BU?fZTw}5KiJTGbA`75zbWe}QWY5vSkryen$N}toCRT~L60W;GQaf?b&fq111gl~ zoN(_30n^Wuex-!sLO$>krS3F&s2@>UKes{t&Wlr_r{vRkkQKQDwf*X2+?jY@ zya)P}4NZsv8_nuQarUMwWG)Y`Kv=u`5|6-HE6z%WA^eJ%eho(08E-H3RS7L+788vr zXCZhTn<}cO^O86(U;5s5f~9bXNRc&x8biyE1t(Qn9Jgdb%9yih{M0&^Hj6OGwrVZ6 zLA}~K-kIc{%Gs`)_t4WmIG)RszXFqN>q=gn1N;`t1}oU9eXlGEE|lMsz(9Uw<){*{ z?hB&h1n@C9y~q<*s#x(K$N_}?x)HY133JXMiyM^~5~JAG3_etMaY^fzduZ#N%D zd?zltKX8|$N4#g5>OkyYo?uvLO`*!$VCa~3ydK7l4n{H}>YWqIwT`y6B4Max!}U%G zcf!%Z9@0^$n06qd5y?cFiWHW5dcUiVKcbC5o_ zmyj?;f;4cUvrb^LB@IgEe-B^4d>d1a6!U`+t1T}?NrAXOBPdxBiO@R1shs7%)0R1Hd2GN z5%%jzJ|M!xM_g^e z^T+>hjaCMyavlAjq+D_{d;dFYk<2Q`uWkzFADU(ZfMqo%#wmI9=77pwJ`xmh5lL85 zh>P~WYH_HyR8`^lYoSyfb7R$FMPDU)4ZTvcvw zU|}*`*}!(W>w`Rv;C8+4zBiX>Oo?8*`Nh$CwdNdAtPuWN9`Sn~o&SZBGcKBD!{u~5 zu3n&+ctG==&wNay+L?_MLB<>^UCfd}#~wa;2pdAuAW8#DtA9V@cK$lq|MeN_98K&G zhs$I&)gCE(ojDSt>3s4>qgmD8RJ}&C&2TZzmdEY8>9o%m5&@sf?O-X>8S~oAr6Aqa zp#5%-w4Z9wJu`xUi2$2~PzeNmi7|TE2=(fK3qXh>Dl878c|^uQq%0Wqhr9%iM!Bn0 zZvph%0?0fE=|E*1{z5A1Y^lE%|r`@phtun<2K)4q}tFtE@c-p9&&L8QsIXTWVTz!ST!*l-=j4O!Y z#4HLdPmclx0=0fk{_QNx9Qgzt8KcGHYZ;uww^pd-b4D*0qt!piSBem}bGQ#g@sBtI zuE@-pTE(`NuP^swHfz1o3@5g!gvw0?_DEFOUj-?o9FD@eiieh<5(0c=ztV@FoG zL4UTPf@>DqNsZvNNQv)`%G9ipnW0b?f+6aywKUc}wVQU4H@UTlj_f-mayufL@P#tcAn9qMu=$GCL^Q}2~4Q{CxEs#7wHCLJ1T znZ>>bdb(dLkTaO=WGm(LG;>WzBbUZIGy~ADs1s(R55Wi_YpWUmQ^hC0F@_n)ySrsS zP;{PaZ4?;& z9#s^+p2N8Glf8HvSmFU6et&f6R?6ceOu1(crsIc1#c6X6h@$3Nl6GMa)8J_L%F2_J zf0n}zNIMil?5O%f^L*%WIc~q(A3pRB;T{9L%Ekj*a@u0-ji~P;hz`nT!DFZFU%2SY z=UF#s*3`$Iw6)dmZU5NW5@9oaKG#%Lg*^6ZIh4)@eKg`MVY{oz<2vMDzjKwJ!pOLzLK3 z=gmO4Q>(<&#>J(ON&Hdq+Zv`C^wA(sll-+f-a9FkJog*2rn;vU-KNi zdz!AUAha*yd|8~Vu+|j-a)n4p00j<)w<`^l0~Lq_OfT;W3=<1XyBHye(nzuQ_bz;| zYZU0;4jJcQO*FM|z2Z5uNgmf517z;bA`voJD1dr*>TEGt321_qS0tb9d@)kQ#+5@|1qZ4d|%sM<3kTp zy01gxm;tzdK6*|d;tO*3_Z~_VL>d}6WG;XNt^gVqYmn{EmenD-#EqKCBcd>n%t=uc zIIE%`iL@SoWmM$0$tKo1sW%)Lp&&I|2W$$Iegomwh{H^7FPI#G$4EwznZCw*f6b}d z-*R{-DW-Y7*|Ln3Fw~NA-(WNQe9wJl5C4ps1S^N4nFavqDVE0)6@X2p5{ABeAxDms z6eS^nBISqL`A-?~{gQ=bgpw2i08oM&NeP0WBu3;Mkx{m9j^lA0m#u`sm2I=;W&5$n zo9Ibqx}sl`QCcK)4fwnBV2TdHDoJ?`SZ^6ix*8%= z`|==?G22yEmijZ@&F*T|$%b6*NVhV6`GE|flZo_h|rZg~- z^f3-8ugf#5sgA(;xLG|LqbWZs7{L0R&I85zOVQ>uf^Tl7E6}L-9XZ9iaTvco1yXVX z6%GCD#d=P8UKOg9pfkpnd0Eo-o36x5R_xOOa~;Nyy#PWs+b4CAQf?ETT8#%Q4u?gh z@|g{*Mqebbw?gyL#)1Q@UX}Mvl?1LLg(c-#*ZbWsb@${?juqz0j7$1z@c6_Q9rp%^U7_^O*lr#WsKZHrm#E_#Sd&BR0KDa??Fvu1Y(^@vG3TheT{h|Oa4 zWuxzCGOf*0s(O{yr$@V^N?McM+4@_;E6;WNJyCv*lyV5=R_7o5o2Wn zph)mSlVz18qnru(LVvV6fCrV6JCGoYxN=JON`#Tnor_=>3qP~Xh%f5F z3N*wDGsJ=@gDTUAX<@!HU8?MVZ7fCo|MzGYyC&{4E=x!qlYj-@WiOUh8R40gCYY^; z0l}V%CvC`&+vsb-iOtK4QE)$o+1h=6{Add?2eBkXvAOdSoOCh`;=krB0CMl;ms2$# z$24Oq(&gW#MBI{Kh@l{8?mtV*X-)redT_@rCFUM}`RqarV%E7)XZp-A@r}Qk*D*?2 z^i#NsYPB7jeb>Ry;d<na{zBs)hVqLu%eei(EDZ1T&L37GT{AnCFL5sOQQiPUYLf z`s9L0c$K=6P{bh#u_QfFG0Ef-1V_y%xy-WU6}5%%;i4H1$RuKs7^G@B9?&S7{bcV0 z(->j5A%-HsR0Qr%zTxY}x0r2uCi=40bEca;Isuk!4>V9_3OfmSyMbUvp*Pt4Ze2zMxTL+2;$- zGW-RRQ#B4|BoQQGoG6kw|H4Ibb&u(*iGP*0JFR2}%9GBpT5Az@taXS6)`a&cP8Ibyn4}R>1Q0EZ5k>z; z@EzDL>JTCULk5N&muYV?+PFE6o)CUpmuuVS4rwrqI_RDBUm{`y*L!&!vdLix;*X;ph`o@ zq2I6Ju9H$<$-9!wO#fw9t?vhR0a%!z6GdSiND@UZiMmM$;?EQerLeJJp|Jq=}kmgwg#UVGx&AqAKi{YbjoP}*|>uYioR^>W}df^ZoIZ$6q}+uggy=lxn!yTToham#RH)x6x?t~anRd0xpIe(s z$dHsZzAT<6|KQT{b)#1dtiu8(MM_beV7`&Eo;j^Q)^fsr>GA1m-HPgFIUjJfe(#U4 zfoJvSz#BCoL%|~>{D)IvqG{}YFcb?02$u#3Ukj9z zw-{2!jt7Ce!bQi0SJ*@?f|waad(7hAcM+DyI6IdH3SEi{njDEj5x>qJdRt^6LfYcD zFT*`5kn3*r?X+p!uc7s=ZVU5bUv2eqGKEYwLxMA>7X{I<%~Pd!9FtAdInuj_STbuJcXcBJJHtJ6|#(v zgz?{Py0yU4g9IHy_mvpjN%u&$%f zPi|0-fl&lyCM)xJdBC9JOF_o$JWl5>YJOgDAW)lyDQYghpJ7nCIzWPIp37okPP73x zBeLjJ1x*TFObJYEKhu-`Tf;je;>$hB-5a6D4%4j)jPgX=GR}cfn9F%o=%Tv*T z`4p6?>M!Zn0kmK(_Thk0>r;apm^ zCppiF_`#I&scAg_9y2jw+1Ace01~t&IvbT%lo+(Htcx^sshbyrDeckC^p$i;`q)(9 zBn;A8*xEx1II((WJbvnSY&$9`NBjQTge2Z?)m%2Lg~7t(?IO2g;5svf(Uf*sZ;_QUOhS7nSNstM7+PFp*?(l)p%RNkqmgOlyTKyKE$f!Pl;#Eu z9?8QZA|g69{$Nt3JQdkchc|%h)UQiWfKlXlJd+z#>uVaGI z{mIApYK)8uSjChql|nNc4_P=J%)>3TSJjJxPOvAV~jcma1wMhL^7uleCw(U5O-q%9=_-cVS*$_v2NbM=e#@dEh)POmR+$B&0L`d15gA zyND>4r|)^6lloC71}D!}0>!2_G(AC5T3=v)w?<>`#Wr5qposY`oXd37>TB_z53i@= zcv#5;n;C*WGCOkxzNVWh^f`v>ihOgGV`f2HSP908bPmYKd?C=Tl_nH^j6?R%#4}?Z z2`-ubn50vk2tudVP}?15VsPqLhEU+33gI)c(%%ruC9;mYmdb0PGE-JrK9tpu?}_=s z>z#(10V8^{_@fb1g~sR@!$~ndWFRq<=69$M8^IYv5AP8e!ILA^RDgrSK-xP|Ii{a( z8|&m9{!!?hZMQ$9gn2_nmefJw3es*iWrF5nF%Quh|0D6TC!dKpp0t_A@lFm-QZy$* zo!z+l@SadLYA$X1=~ZHKWHNyn#6-n9(Oec@3R`2U-v@5BvMN;(RYLF% zB3d%2BYXIq(eFwOpC_DV{tguZU3HcJMMkbv|MX7~l$8l4HpwnOAwqG!mqPsLQda+2 z(tE9QSMrU@eM8qR{D=W*r-g`Tl?Cb36x0Acx7u6pt(JBA}3bSu- zFN-p%_MaroDqn5ySEefSM>ie98*3zU@_sqvd?wes0K1>M79XI3%d(DQSfUV=6}6uk z@+tpnn~=#XvPrxn*c{c}`n&(kStDu)WhecE1M6GBYu(Ha{Kml~Zt}>G@ezxw5z+R5 zKa2;+1ou(!Z)EBX4HGeIUvX=xqIi`g^6<#%D*@W>;5=0WH}UutnKAgic%FNNGWe#9 zykUtC24;qElha^Y8NElmF5G8P9SV=01%1lPG zHL&ogBwA&)zpqF`D25p!F08fQEeqxl*>iLCS~^vGaCJ-bX}!(_;9sBKZrz#hDq-bXQ>F#=h(aJK@F4^O^=9h4VTp?i zHYwv3U)wYv!Z&C1?cBfJl^#@_@^mOxgC2Aqx8Da6aDT;) z+Ya?*=Rc$Q&&Y9{^OHJj(RY6CsEJ8zH1d#F|0>>I(9=KAALkTGa2XRql(87P?!^pM z?yQp{RQhX5eRq7S2bUp@7)R38#L2iWJ11Ema8Aww-bv1b&S~C9_euIm5Jt|9 zFlKsZX+lg|=bCJ5M0Fco_IK*_ib)&%y1fj-X5!(`xaIG0H)zL|WGzqP=1fWhtm%!k zW|z{-O-d8w@r{(Hx6-AM5DWs2vIk>AQE(_4AzsN*K;lAhTnfHy$(KRZ<(}2fz~UF^ zVvtBh=xHtnK8h)Ns}@oH_dFq3rYfo2y>Y06$wb%h|i(TOPCGVR$+YaP@Wkp{a5^9P-t~ zd?&p;6sre|*hBXK-3dgmhhXogScB-=Lv06J-NV=lmbe4kSfC;1c20&|H%S*sQW0m# z8wVsyW~j3JlR+%?y+zhrbZ5-!zuxw8^syj1+Kg6F-ka^{j6LZn9#EwFQM&0@)yJGA ze!C0&ex5Am3r>l5z3=jd`S&d%8rqCZQvQ_f+DN+Os2q9D9Fx1)(=z_qG+6;OQ2sGp z_r6WPg|jHHBfXx58*rYa)(minNsy}*>D5dPTz*+2>K^xFNJm*J#O4-+z+nso?M4d0 zGAY0fB1SnNMsF+xnkaz4Da7~MN0jZytL~?`8eq~HBo#&iw)C46!}@`b9^yWk|K`CE z(KVNJ|FI|4JsU-$U<~iUiki=eIM0X{(+G53i^=5-Amt2&ZI9Y)k1zL#Rv-Zpf`L&4 zg#{Ta2t-zEAAsbTkJE!Aj-%tGs^23;+K&)pX1>QIuMh^+nvWHVF~*o&1Mtf`bWmz)nYJ{glNW=wi=Zr-UR^W#gS)@cPDACghqgNoX z70a^*h|i&E307I)UKgvBXqS|$AKX4d9_p#Z-&MRFO~L%NPNh;WRSPz=<(B8ETO=Z3 zM#|69#i~XCl!84*(Oxu0?aAQ*BUjjvyC!lR*{kyGietF->t0}IY7|Af)M^w8AzRS( zs+#VB>OAcl+;REb5w6YS+0JA0AqNOy#Sn8Mi#Q_C4@$-id&myRPK~;1MDRFpr0o~_ ze=|A4bIeZGg}(vU-4pm1t336q4}=5@8{Lu701S|kjE_`3D($VVE6h!dA}JO+j6%bp zBhVw}`LvZCiJx(y>a{xUkcas4J|r z8|AY|Tsvbl>kkJf-Tl18Dbg%R{%bfb;Idimms>^5YoDRwuV+4JxnWNSxwybAi2=^`mT{C=h6bL`h;-p}1CNHaFSL*M&{D zXJ;H6x@tKmlDd^jp76X+UMb)j(q5B=pOc5d?2{DU?os9J;)PnDa=pn1%A8^RGl~b$K97IB zx4qCy->2{T6dGz3;i0!yG<2bnC`ZYlURfS`BjL9$J7zhg<)&|`;f7C?-koM!1qL~NHu3bS(Yv^#wXf0bA#@eF5GrbhRW|xiskp9NO-R{xkZ0hEBq8o~R(e(vG>f)-{%I&_urF6d^jL*nQ&{`7k8WKq7q8!F@-XUH2&UMJG${f-FXeTwyIu`6Pj8|5}x~AjQvg&HP6(6f@;?EXj5IatS(Tc`<xF`~B1?lT3?;sL{ks3I$g$l^o8m#`+z z3(MnzmHVjP@AVPNI z-8&A>W&&Xb>5u|y)_5EDQ}Ofh-j2zLFoimx#}8AxLyk#F1eCxds3moXQDBl)LsE)L z&`FCqHOa@QrSzy15U5-v8%U+`Rc=D0%T;-bSGb<(ElRrO7pH`1DRZ}69_J=y1PFt_ z;9vvHuuQQr!Ds;`jEf{wQOt-MA-{i$L2(IoWrHT7T^op_hROgoGBbWx(%Z@_cTqgZ zd7_?)d%>)`CU3;E0ukmgdQ@JeSGiG$mHhwSi*B;R2meHRBrNNPHA*2 z+-gQ*wc7YQAIE#R5ij^|ntmUao9y*`UZulVh4GaXEDP8gvpA=D|M=8^*a}~h;2Y(} z(5tm+#EaIc5|-z45V25klrUDa7BN?{moe3{6|(%}FlDr5HDT1ziPf{ zJ!!aU*>5^;!*3>ZMLK2NQ3^T~^-sit?Udy+GiXMcP{mf=@OjqPCOQB~`t)MoI9Ytmp?8-Atec~HDjbK_#;X8n8<-^Bizl;)S?1Q~Xb+zGr|3755B(b#ed z3orT>U&j(D@N_Pn?_@;>W96ryUsGjZFT1~CA%%xdUs2g-6T81rmc5a)TY_$ zwX*-`Rjs(Id6yQZwe+w$EWHhA5s?bUVu)g4CN z4Oa*%ug#%+vdsTzy6;H;@!ohHF7=UoW7K=ZY+Ho=_-GlfwgV}J^_u*}6GLeChYU9R z=qA(7A)@It+yL$y+Mbe29#KY9eW6+n20UA z7$e9{y6GUk3tV%s~?&Eq#N6#XA7| zbpQ@bR4q!f!m%g{W#>LK4nQ7ZNwR+aMHs+L_Va>_*{cLK!M3O?clTx+lEy=t zEm8ru8wE1>rx{SZ`vPd-VTA0=P(;c2^9va^nl;r9FcND${^oA5M7n+hQKSBbQ!I){i6 zwkIXp1 zM5l>ZRg}6oy#P&IeUUYQBt&TSbAoo&sC3^VRQ7Yrt|IiA+ffE}fM!u&S>q$prvXQF zI{iL}S2)>OkNKz+K~-IOGenPz5K{o~>bRKi9%}aCwQGY*U`EypU}Jq6EmXe2ly~=* zDk0sC<~vs%O{oV6Pm#=KcrN^qa1IX>ywUZX2cp9fNg40&gk z-;kj4`S69NxGhbJChP6{U8ZJgR7{6Lx^k6Pl8I`Kjh4ZGs*AnsPKT>@L_2cS@JT6k zQ%S(uKx#~z!&TKYYf2ENr7bE-9QUpOtb~V+f;P5SZ>wD<|7~f1UYdEU_OJHH^F3$$ zY2^)kcx}!4k+adAH8~bCa#hOmPwip?YG4aVcZ~b-vdZO{KtS~6#2f-X5YTj zk3N1I&R#1_8v38`bP`bZvC96_RI%Gp)nZ;&8(h+|_Pw}fo_?9MbX^;7<_ShZOo&jY zI)K-TaL2+StPk}-)hWI=69s4^BgVB6qYrPM&*%4LzT33`t%wf;*_L2GgX_22Pk#)hh zIdA+@da|$Mf+ephLfHJqjV=_8K4y(h7>!EuOi(oUUrOaJ-pd-WfD9 za}mf>!0h){OT{F@OR!a&s$sEmGuXiBlvPy?r{9?rX7ryg-~^$3Wah%*R&`38$U z4t34M0VdmS4ErkXAsK-D1O+x=4g!VtBI*DM6Np{`#tw`VxSd>p$_c{=ozsVg@s7+{ zVhNqj>YvqCGX3{%9H>4?s6MfEJS^u(23rN*YT_xxye$kw z=ox#kN6-zv2|^a|vM&M^WQij+b7l&}6F9vWkB>m8LVOEuvI!Z!i+o5ZFkU}`_tfSZ zf$};jT*%n4t1r3g_o6|*a&%}4WRQJu)j6~i)!!sT&SsmJ1xn65ArMRx7&nxT^ymc? z*X_4naF-C;Z*aTG@|jJD=c2`FdvXNc)rom_cQ&grG+#X>;(!F;BQm*CHRUKdkb?Aj z-x(_|PvL0@CsqOM=vzfNLE}=jKqmWSAOmhrEX(XGFk3SsleXl@AqGCnhTYY!yd z!U%ghOU{Dz`&eiQf(3jA8B+--%<*}V+lhNptS)4c`g;?X`{QekP?A#(XAwOP3CKaW zE6@?-hJr$9FcPUo)2;Mleq>>THz|0=6>wG6s1y<53h^O>J)Rp=!Rsjknl?OePK?s7 zmd^gK)KXt`}RN_ps4h*QE^Mrn3>x1Og)KFPrXmCnR{ z9A=>>AEaUc5(#$b%m~#XRNIH;i=B)9OdUj_)DDg6d{W!XOXiW zo@-KpH?w(P`p%s(-ng!E;8&lwx3x2sVQC=DjAO%;JPdf?XA4 zHykZ3U*BnQ=A=oGPLXKoyiY}UFoNFM=K&64G57~P&ItyZRWN6k%;o(1T?Eb641=k6 zAAHs#C1qk9rWMDvmCGcKJ$6>2##M#71^l4P-Wf%K*mCKkPQ8 z^=UI5ys}=`62i%~EFUm56XL#6p>k^Tn4h*ne79IrR7c6h&E{j*@Xjs*8dR=al4Q87 zC=^NgTj~-Udc{4P9*7|DcUv}{Cao?zFauX(|KdBeVLCo`0)hx+VqGsO4vD;pMfHSj zzHd(#qd`zL@R-=I0$nxk(z%q@Gw`ya@CD<&Yl4{}X^;p;PLGxIWCULc6=uAs2rIHkP4f&KX4Qzy@5j%GjNzs7Jqn@y1qJ=Z9D#i40 zJv-cn3Pih-lKvet^%+YkW_8)Psexi*&w+d9m$L*UB-?7g=sJxK9*)CCDrBSitwnJL zeMC#|^^QycV~`sCc5>J)VxpnsLrwCEQ@~OMBgeI(sWeIYf)_MmzXnOTf_r>!H6z{0 zoynVS-So8&S;01JCfqPebo}YPrMtaJK`kvmU*{1r&Q^4^DH&|efRy3&AWc&5a%6$3 z+6Udlo>_T4-(txKv@~zMqx#i z;ODZF^9AE%GrfZ$?#fCPTy1L1%6?Nf#BpfBjbIXP1agLZ_*Ow%OCe*ADp1Nmc8!M$ zzO-0!W^bmZKrCJlf9tJHSA~;N{QhV6p=aFD12C}87GzVl9y|ZG260fH7;j_$^^r*@ ziVj#a)q2KO(y+d_(FEK0#~ILM=xAxNo6OD<4Yo3;RTJKrnS+ugs5zJwGvSpm%F=^c zDu8BEO5lt<(xM6eA2z&n`Rbd{A0wSrh$OSHVX;-(*Urxm2bw*&nL4Y4?r~&G+SLI+ z4n~x1_t?X2_IK234=E1n__lbZ4+|5U@aTo+wbgl{avjLi=MRI>wC|*gE~6Z%fb+b} zC6jtCDU%S<;&0i9mjrIktf>h!=F`4nC5~F(PqWo6lc5XpKa?+?u{o$bJEon>)np(k zLZaj?Af)PmBD4C1GDJ!xy}f1*ZO8=6C zlh%ydX_}5rFx>09uzQtG;23EUsH~1mggH8CMD}OZn@|$HS|N$nk*=TOd_t>M#~G4Y zYx?JBo-R^`ckl{@#hLlJs@&$aR{1_oNJ||8uRC|;W_}%z<^S~7gg7AEI(nKaWFISX zdn}Cm$j&k#s_KSBg8i&kgA@blHjb0j+vjH{mTy2c0>Ol6=swENLZ`tg)aShpvF|P# zt&csu#sb0fHFt319s+}-eZ^eqs~5r#!BnMv_qa8y5{{wVF?*E(h37_Lkz!<2Q{doY zw(vqHc@0d@?ogqLhx%I@dLPg<%dgWRgDUeh(S{}sxMGwwZF^yJD9GH&d?Wf%j25Ik zod`!HV@aDKz01bM+Qomm9w_FRdCvK4aNA|TkVLV$!*V(8 zbK?-L=&b(eXSw7je>sey^E#n%G@0fdF#2y$C~rJMz9n7#2Br0Z%)Lu6z7z8Z)&ey6lm21i{@m;i;j1@*wO!YJ<7sFOXf|s{7KyZ7O2O>dE3&1 z_STE*_8<7zvznlX*Y_GrJbgay$vnaf{+F~U-nD7_VSxT!ut&iz?$@F#xiZC+w{)UF zGPOumYD@v!E*sm*N5z&(e))>KL`A&#&Kd9kA0u)^u?${mA=j$OF-KVnJo$t#dqz5r zqR8@mUsz$%;8Xwe^G7$45*8h-j(W{4s)f6`mTES8%MQ`_84vCuMb$>PO zdKrgvSH_hkyC*i4k0Hj$mbq`gF1yi!ZMeyd#rh<}RsJA%Rq7%007d-JZCrefHQtyi z)}eJk9NK}KMC9O?g=0aRcomQEp0Z-t{{mV-rN8TTc9qkS;VyE0b2=%7)srlYb8)G z=P3iJ?*)q9MWeW4IAT7z26bzKbFZy{$H{Qj5Il>{=;Hh6iFtmE#aJ0a3AMTrMCPZy z3PmtW6Nj<+TO}X1SJhF$y*sGpoVUAky4fKGbgf25~eiv1IP z-=$i0vTB!Y?Q6VTi`Cy0xu4hj^>6h)hNHi6{rN zKpMD#sp+6AGA!By6#6J@(*WE~wam+^m;wPCMK=r+BMHx8B3aaSu5o4#59Y_0Aeg5!$`DDBF%Caq~q|n+iDWACBv{aBd{%_O19_1KIZ!E z(t~ko*C23Z|EUR{D^9?R;x6&BL}vxOD#=*|Z^{;^9N}F#%}Bhjd&k5d5w??rETF(k zD0FAY#){=^VLI1&!WL8D4!60(CxVHtcJ*bQG-Lg6GcKh=hzmEACozd6B`j!TeF63siZ zxUrKJ-`e_gV%^^%UHU>iO;4JCMWREUL~=RIPi|WeqwdCJ}++jF!O=d zKFtv&EAB!K6d~0t6|Pa8sOP}{kE{AQeD+18>S#4NKKc^t_RLE!T)_7)Mar0eLUOaK zshOtUY5#Oe$o4$~p&bmxmYhHgT?G6h5EKbvk%DwU7z~u5?x>@~iyoYUi(*#iN~g0F zTQ{bv1$Zzu8Ujz|EYOE}g1+L-2oi4%1dF$KEg|APKv(g;K)2D+ZFC>q2=pAi-OKPX zfG3O|+dl;KOGrFRyi+16$O*YY8ITv$!9jj-0g6H>pg4rXjFJ!ol+lE8x-gwS%wPyJ zeGHhzH0&^&2VlNmSRi)JLI$)SvFKa*j&o9rNlT!H%(-W$0>(<7X%-asE>X@AL#@GFRvA#G zckEFU5i(s&Rdx((QS~U&nOh^Vc;1Wbg+iC7hQyQC`B7WWVqPt^ATvi=FdG!)j?k}j zGvk@+GNHjE^Nc^G{&YV!6U?9{{co|-L3AKD%ismPOs(;KHi4;u$QV^m8_pI zGsmOv#{71_2ZE*jLYcE#*ZfemDH{pr*9(=;x0Oem#YW;#&(hhk?E!5?ANSg_949d; z+YMBd85Il)Rcp%X+xC@l4aUmmwyCpFxSt)$JivE|`g~aYc9w6qCUx?(!ZHY$)5$N}VItdT z{aOump=?cP>_M9i@6AooP)kvJUhb3xr+*PtyXcZ|yP5e$oT$#W-+z8~PxeGG!N(yI zl8SGxZ&BVGSK4mt*Ez?(T<2uM{kkKYzRXxfA|CgK%6>3P{$6LM9W&YTU zyl^J*GQ&`OkV84&&M?QZ@w`qFqF-PCqcvmpm2yySEY|0zGtd&LlVe$u+WqG&b1WlR z1C%JE9uLS%QIWPrK%vhL27b!3*0Fvsquak&R5rb^;58n?^}xa+ZudWPPVUYbHXre9 zo*b6VPEs_zD!}Zq@$2f2il+Ty*P5>N5@g4-1v~1caZ2mtP+g|}1z`aYWu&1>sVL^+ zcqlHdt(lmfyP-03i>dDc%q!`b)E5h)bvRw-9AEdy(?yc@^qP3cGBNI{nj0;T+?`wb zUTf-l)X8P(Ul0NE@p#K|Rdigs-Tah z@a66F8IyNQcAa@r=&2mLPXyKBIv0+2ZPH?62STNUmwLw8<&|HfmWjC)oi^WgXFWPO z3zf`!%0;?ky9ePcw9bLAX*m==d>r2PWn=H~yaRNXZ7#dd@BCIB_%7+ws(j}xxpAdB z-?hE(<(>c2zWvu<|Fw0WgaW(IzB@>ocYy;QG9Z8m5@bOJ1^x!NaS!$3?~8ozWcL!@ zm5F#HBNzE7LMbXxjXL~6GuqIJ9`s`fqnN-n^!FS?n8Gw>@PMn_Vska_=e&L?3bqZ8 zPD!h-^??IN;6HAAAR6ib3{xJj<%DeI1Gde5kA375Ukz|_BOA@= zCNs6^%xw0J*jP>349&55HO;0!i_G@>=G>}WfM9G2pSgOdRkfjGU(jY~=a4NbM0Us( zIgI3kFm`2yhq3RFAm6wGg2E_TZNJ+7YI{T?a;X+W!Z?&M@pQHL91v!m64Yu^wMHYe<(f>2*E>E@jx&jJc6XO__0LG`}BjZoq1< z6XvIH`-MSK=eo3IaZuL&x!(N4yn8EaFGl8GGIB4cPhH;5>vJ<+U%JZrs+NGrJwc3V zLRg8aq;<(Wn|jwAt!8W1ZItyc-*k!4CnACf$*Z{9kXmiqv1h*fW{5b1WGx5w|Th`ZZ@-kKQ5Tg0ccouz)F zgO0`%6bX(n&bfBZwRf(AdmVRc;Mt_1Z;(c)n8xx|4h-nCImA~z3ZF9~I_7r36VD<(kP+Z{nK@tYNy_n&NB&_T9QZC&I_+bn~yuGsQfAD$)_DduQ zPf9uv6&e#3pA0b)ISMU0GnQQP3MnebRZUGJO|7(b($&wvC@aQUvyn~P*|C>>hdFYR zQ)hYPBA0MMY-}aOVf$ni@$%lkeVPh;RUekA#67kBXF5k;c|-3#X1lC7qQteiCbk8U z4&tpn{+$i~&gY$CN=e&jQrj}D=f)LV1eA4llBeIL3No^~%Y0uu%=dSw=JAfzlN@Wx zfu3B@tET#?>*vQWhd9GbuXc5JKj3F*DGf9934(javRhF6U$CTwGBsN ztg&t!MK1eiJIpU>v|)L(Spn|N|7q?R22Ef2Gb&+p8dt(=+MSXx_k6 ztMz&m5a(uBUlXnVZRzJXXBpZW9+Mwt&(BsIgWuJ^g(e@z%r8oIqBB;^h#gUoml$Wl z<&iMSB-fY;vyyU-m2S$MIkzp=rFv)ZuxAadSn<$$-KY;Sp8aUQZPgXM;TcTlBlptR z;U9ccS{~ix*= z5gEJfd7YR!_H%%dn909vL}GoShEu7RXg=qNILl?OB^9><)CK z7lHw_Xw#u9VlHnO1BRfC#DU)8W1`HvzocikOTyfFd`TPq|c;s_O*}#7K}LU1w#= z^{RMD(v>RLeR74=7|qjVdSGDLZ~5B3^PEoUN)_pIb!lBw z*U~+t4e3t$$-IgkVmCP>x~|_eSXpMu(#mls4b3=f%{f=>S#6VP2Oam2IViFHR(4kcSdfqZ^Z$!y?Y%uHhksjL;Jigc)H+xDn9+`STT{y1YIipm|9sj?w_0 zpPdAnPIA3MoTn-Au4VozHuNdaTSmL|(5zqg#5WE+#7P{gpi#7Zl5L*EjGr=9Pj^<| z>Z(@LURJEtbf0BUcfIa@yx~5-M{w-;&H;AxsR8?)`j$o`Ewkf=F)Amrldk`MmO+;l z1b_M#^|sOqCbq->#gZqS|Ew3P$e{g;Zc6vkZ{D5tuw!ucZy4lgmV393>lRsSi+zqd z z;Bo+UAE3hndCv#969D;A0OUU&0Lb4wkbiw3fA^*QCG`Mh0D%1cm&yZlcp!iAKz{7| z7?7WR|D>Js=QZD(0DgMl@*|QFF{<@vsE4GUex1q7;%f(zBsERrf)%Ol`<|o*SJr;E zGcQSeRpKHNAkGEbBMdepSjLL+rlV`5!<92XCEHt~S7Kzd++hZs-`4+A|s zsNWw@@0GPQ)lm&~woGv=lm80N_iSZD%8p0Ak$kOK#uRfbvBnmA9C5}KI+|#sx|qC} zzo?mo6lMsjkenEq|?sd z@$TCVgOeG_7ytkOz^BYFYvZMW+t~o$t|gR# z=L~{(^~}BnzXzCvCVLwIunz&RBRbxzkM~LnJ2xT#{=~h2mp9j5zVQ8$51im$`24F& zBSTlLQ|*7K8qBYJ)7P}Lfac>{#*yEgbZK6&P&~1i0fPUZtNR)RECf~x=9|^1L+%hg zPSz%!slOtnt0QJQw&{UI$wj(h<$1w8{J zJBOfn=?e7K&oBuRB}wsDn5C9k?te9_vehM*U2)wz0uJaDP{TVQ21=j;M&JM;kb^=f zf-2y_2`=#9a&QQ;AqR4y2uks*p$XPt71m&riw;mp!+=9}?i}KZNG>L&WND>JEk$M! zy;C(jsFA^p%EZL13`yVQY)s8gME0iTATlTMc}mVtT7l9Fk`q!!;W{@g#f#0f!oLvPp*9XH$4)V|vtdeEuoJvtd2KKeW%zDUq=ak3hq0mOg=kODG54k!UT z)EcmY_kb370UkgPK0v*JFkpqo0dBwtLVz$30YX3wC;}B|JCFe(AQ)%@ZJ-5S0}Y@9 zbb%hw2L`|aI06^o1k9kz&~LyAdIOw+1%Lx9fB@FO7T5tV-~;>s1@Hl6fCA6}X21rx z06&lg-oO{c06*{xgn@7n3Iae72nN33Ctw6jAOR$TB#;79K^jO0nIId~f;!Lv8bJ-H z0!^R=G=nx!4_d(}7zJaX17v_KkfU1M-CTY#C5ZEqA%YkZNTrBBya32S9tu!|Fx=q* zF^EG#ow)52H}j4yKY{Q^0gB*&VmQJH&TxYVvf%=Eq#+#{$i#01ArQe=Ja;g{HXsXm z$ho?=DI*Svut6%4VT~x*BNmp3ge{_BhZrOw1y+bh0;VyGnV#ssi{`O}WvpNg>)605 z7O{ziKQOkevWUtiyS&INc`Y6+E-Ghnd5FnPRv}UgkXMX? z;^Y^ryhtUbC@Vr~;bs+Yb_wQ`XhEqKmtj%q7M7;EVk;}Lx^io(u%k9RYqzH!`|7j1 zZhPx>v{Au$&HbmUrF8r#*E zlRpn%Zh^e|WMOoshGt+u+WMzuP`U=DV{m#h3zl7|b=6o~wH5tVQJ()QP+7jJ3T>?3 zhU#qYk4-h$QltBwxYdE?&aL#%lP;}wVWTU@gQ8;sw2zMu`)$a7@vqy;amsTP6qRJ` z5>U|~sH#q!hz?oG)RAnJDAlA{i#F{#XpkUD5v4ULHBxQbQxV`%jqt!r$WVdt_I`wF*YHgLsCjwrgD|4KGtkrmu@|J z^;NfOz@X2bzfB{@;mz4KZo*`Znzdy5EnT);1=18sl_gJ+iaxXFcI!NJu!9~37-53X zK500>3P(7>8Ln_cGKLUA3?qmmi8L~>-usli4_8Q#p+JKU1KxXQ5r{%GVi1cs75)_I z$hgs{sUR0cs6ZW>(TRSHVjA1n!5$89h-3W43C?8a+dtyN+T}?E@ASHkc1oOAJ~UmF-28Jn1znOj&| zA#EkKv8{sQ#wMod*j~02Y3Uj4oy^M4;UGoz=H(X@a>Jp&RK0T}oP0A&6E8t)^yo4i1h8GxoFHvr8@sX%j5B+!Di1!#$v z0j)}M1@Jihc59|`0SF;FOhm;jDnh5qX8lE@u4ZQ5nVTcDuuyAhsRmF-BDb<)cw0?b zpeg_}&(94>2Vg$Q7Qh0M6M%)Ja9|N>G_ZKQiwG^TMsDqAFGz6rNpc3TUy>bw{gYe( z9B`8NBD{BMq_S34>Ds9@V)vnzJ9XeR*e7Yggqu2ZTu+)#M0m23ilWBySQRD2J;M}CA zri7U`E2cRq%}bw!4PQ?OSyW=lilJ7Gx8`r_e=B?5#(`en=5ISRcI>jUXOFXe`@9@D z5aQ6We*XGvgcE1d{PR!NJx|CzP6U2FdQQLmev4Ya``u=L_`|mQXOeaUfBkiszy0g6 z|NN)z{x7Bg3ULyU$1EU})&LQ(9aY)@M1$R!(j6ccJja#30P!GT{L&8~0R&E11^^_2 z;E4}j2|<&V!5{;CU70cxWa#V4m8l>F;Zv3wAQhu$RAz#V88dZR0P4czY04y!3B#r> zi$JDC%&aT{nG-pS!|b&rYF1?#$eQTcl;t2>VrN&@g6v6|L)i#&By+m51>{7|oXb{_ z3%PSWc-<(Rd)Wr^pm?6403xq=7RbBo2Ki7r-?AUbk6DkuISVNJg94empmHcEn8gbz z2Y^DEx31+dP&byWdpR7`gQe?Pjs}JC-+GmkK)qSLKIIrtU#gyd)~tW{7eoW%Fwnqq zK4=izH@I8`8p5s(Eti0XQNQ8kI?xD?Exg~-RXeyT%QJw@%WltQPSR^W^? zitiJp6+ln1dD@ljcj*k!A6)jg^aSW1-s=q4g7nc5usS>d?h@SqYr+#?lj=U$67?Ly zJg{Rm5$sKt;+KzZ`5HTZf0Z-z8IEj5Z21EmPVYuCno)oCWwg=y7;_Wv`6h)`lX=dR zH^qRbieS?;_C?Aric`^a#c-V1ts-z7Ud3~tgstV^M0`sUkpIA8!qsJQ-4^N5>y>zx z4*&bLI{|MbBuVrs_GS`qCABJ9uCCWsHkaJp#|&`U>KCB+vY< zA0S?U#dR)%p-54Ti)LC36S3l$7tf^xZYA<439Mv3rNAo{MQLbC$6N-sGI5oKzihJQ za4na6dHnm$uYA80C=^za(24~pQ7TB8a=t25VpOF@f?5qy`XjSO*_v+cYhUR%p!Npo zXh>tjY8p{x)Pl|yHMOLrWzDT2M{IrFCa?sKR}e>|9~i`3qX_yGoT7w zMX5@Ps;s0c%Bre-)l{sy%GFR+O?5P_uIklOQ+?gE)Ln0*^=V*()NZ7@jWWFP>d%B- z^}ho#hY`&;vc(#YD1;dhv!BlM2mDR-JgXY@JioK)v!yU5ce{w{0ns&MZM_Mw(O;^>-=KIZNd zJNuNq&$RV9XV~`Hm%^v)??Ygm=J1`!*ZoK9RZlal-x~WkQ*fsR7xWRYBlw`V1RWs+eI@D$G3X^p zM@YeF$%vNZFh&ZZEhS8lis(xX6Qv;r(!vz!h_UpIFd!x}Ho}CM%M8@ZahVk>7OT!@q0FkK$vATP|5k9?IMW-36u6of?z5r1F75`{^CBCuFd@=GyTtvHEP z0#+zV!jytlN|Oj>V5PDoTsc^;Jc$Rzj(xx$77e?AOf!msr9?jsc=A=&x zxTPiO77ll`BE4F}6A@%o8+b-rGOisw(4GwH0FQMfBRauToynLk@S?6{RyTM>ce0=d zysRgg*9%_Ko6PA0@9Rtc>Id)XPmT?McMT**2EnTalPyEw4MWMUNch4qa$`7rX#}}7 z623Bu+#3yF8$%w9g>Q``|BZ+5Od!uD!uKYT7n9*fQz#Hjg&#~KucpKAW>64)1AqIL zg6cc?-}e+uGvPn8C>Ul>>~%ZX1<70Z z)w@#Q8vzf92CzopsUMD;7Tn+sY!|}xTC|aqaAJj9TpX>01YJo<0x%dMIGmW26hQ=n zu(UK$5G0O75<#KKKoDgdjyfKXgjSm2L}&CElrUq{B*)RFpg==WiG;E;MJ^YmswzEo zb^4YqQ`6FtqN9V#z<|7=5fv*|uvxW=$k>>HHESkB>SS-iln2wFW+A%IoXnRe3zkeR=MczDj>6WC5zLI8?1qEZ0h=P09`*+~@@*BQl#6vi=T5;Ze7n8$K$7b{jKvyL@; z*l={0j?P|ATr_iyD^nM@gSogicOF_6PZPKejC)OZ8;pDRq5z-r2f&{Ts2~8@KEX8r zz+W4fA%lZP7-6-;&k$&M2(1x9V~iz)NU0TLB+e~`KuL*HioA5qJ==V2%M-?U%39C3 zp68aY1L-)>=?<7QR}w3GvKZ-Rdhag{{886b|2b0s@l>iA*IX7D>WDG#Qx$ zh72Vya-Hu$5u-sG<7mic!bEqBMj(jN(qs@r#bP-)91o8d$QTZdH2@kBOGIX7itttS zX8r;IGZ2JB5C(=x2*$uoe6v|(u}WYSjQSYn>ehU;#fKW9^n+HIM10Yni~%nc=E*Y z;^Q)3zIgn~4}gBbKmIHfkN{o^6ljs41UJ`&R0sf%FEpVn)>StG-Sx0U&-CVoKKfdw zU-bj%{a?Qn@x|;9g1$jJ*kErAF~nU%Gn5L$40CT8elXE*f$oTjCjz?Rlk7gw9XZkO zfbOWCJz%uaRv2T9hx1t5h4;pp;E{=$JosRWDJo4(M0sLbrp>gA6zxATVzh`At3#YP zt>TjypCw6BEjcN)Nv%|XCzh71g>U*}0N*GSe;9ivk@%t1KVyD*Id%X%iJ~mymE|f( zt*}Ck%2e~u%GwFgf9=Yy1)2I!djV;)FZ+t2{n?Mk0S8z+Scd`GDo5%XkW;Sbda-vS zH^NAxMhn^#7A-Sj896@cEsB&!AVth+an zDPm0)R~Z1aQKpp|)!1)=19`g;>zz)==;@Dl116B}tqKZdH4bMDKE7H)LTibM)sc}| zM@eZtHMI@2v^KI~V-si2HuL6fi(tXF8Y%$&x=S{zeMmVPD^!WGPFrEwjQ>E7j^$r^O1bT4}WDuofGeRwu3vy2$A$C~Tsn zm#<_YLZnESE>(sMS+c7HVD>1rT>iY$wppaXC5v5g&Hoy`RO6Lb z4tnjiW8Qe$;)bq8N{N39aUPg=z$&;K;{tJP$@xz$`%ikpd9ia z$Ar@1zjq^k4><^|7^L)ofU&|ygdI6@+$d4vL606U7A*L%;lWRU0MWfIV#LW32cb%i zCKwf_;0#!EV#1Xd1b=}XAtiC~PJtjL%0;WxDqg!2g>?ow1gc5MAzXM45E6E@Na=7dMkr($Ga=8EB_(ih8m!pU<{*?2Wc`2`nz_MtAg3{np{Pj{bOm@LzYmXf<}Vkj~Forq)0g;N6rZ)O3tWJb3u!iD|+0_-nen| zVaJXyCrwrm=#W zWn9Jx5x~G8F<}FREnE2P*dbug5fLZJNTo<2E>$5(#Y$)?S5C(VRdm&=qwlju#+r6t z-MG@OotI8se01yPuScIiznnw5aN$$C9Olqce-d|%O{t$0^y%ZQ z-!)e^ZsfPyVV*mM6&`r3;03qFs;m%Wv-S?I_ui9{=>xe|Gb}{Lz(Lf(OGqMWj<#(? z#AqX?T{}-5I(XFV~@4k0G2EcoN zyT#_WpomETAi!UN_Qa4GC;8)n*nft)-$_{V|8(}hYWf9Jj>jryTEg(b(!!cx z4hLrTP^o|)fM}2wfv_uWlSPtjgXz6&w;1MvZWmP(TUAW5NzYDGM;J48aPAu(L~)hC z@H`;Tl?Kn6&i>ukoDMb}y1cth#6}N19I!i+60?U;VgeRW$RLXl17$FQKb{X_CQ4)( z>LAAjWaO;C1U3gA=M83g-!L}-NQIhVZZy@2&NVxpc(zh+30W!s^KSWTwYO z9r4_0m=I`L97}J^4^swm2DOd{f=?&VXwXeS35&EXMnOC}6x}_R{-iv3G~)(Ef&8FR zfl!IV0Uc7h6q%%Pq$Ju1JFVGTuANB3$Yq-vqkh3k5ONqAX2Lc;)o6&8=q+J4n-b_e z`#HN2StNrU`iKsS3!NnD2zHm!?6?)N@dqV*v0W6g=Q{sh9#M7g`r0;9>bI~ z_ebdLVtKy%PAN21lo|d0qmx5oe=0JO9ZUi>9q~zt>q3$1q$VVR5o{-6sR2nV&>B|c zk0?Ycq*>*FY%fFn^jUpG$p#cG(1{pcL48mGSM~(9PPwm;$8_&+`y^X`?LPbM64mOm zpm`UB&2wLkm|Q}rTevr08@B?K3@s)Cn|Y09K_R_GD!9i$Xp z74iKSwpMM6e?`-E6d1pr@=`@lt{`h|M6kX^Lo*J8(;@hR;{cQZA+m6l?9zip)jIh8 z6=VlsdlDatk43!Sdk^^+q*56H48L}Lw6t7pqJ1)@L}Hwp8{{7NSCrnrK)+s=!v*)hyy!LCTNsQsjs42|46KbKzNm z%#Z&P+p^7ryD=k&YWYwLEiF9sLit0R_!1I&Xck#1Xy(7R_-mDa>b{Qyc-6u!BtO12 z72(#?Tj$)g8DrOo{ygeCl`S4>t?1Fp|-#g%eLz_ez#W%$VWfq`ciocn0jOXPWO@{#5ae$3- zUkoSnmH^Xgqlj5Pd=s8;xvg7Efv}4Nw`5&!!t+NB8-$qBRJ;vzVZ@>_Jx2f-p`pH$ zP>+IkAor_A@#vNzx+2ivV!{-RDKXyP5CdFe{pJ=Ck1e__yASofOn<7kkEuy6B(87- zIt%*gLHJ~vks}Wgg4&qpNQ*w2KB&%zDp|5Zvf#G&rGGm6h-nwB0W zAWXf+X0C1{wjN8X+2X`9(TT964jO@chni~9rMxoEx}!8xyXo*jFO?R{tMhQ?`&T#u zYo=PVK9rXF?~Y!9c|#COTL+K5Zcb zXABrc;rMgfIWPtK;8E@_C=^Igcb=(GI+$$!QU#!TFOq{~@yOf|$&?>Vp=7cmKR#Sw zaiV-RXrJT#>|3`$Jx5>*OT-j2(8~lDY(zGP!q))K(w3p-7|*I}Ndskfaz1h=m{5Ik zn;hznRDjM*XJq-9zJlek{X#WpA*JRQ11+>#)aRvWCa)FG4q>`r%@%#1?69tqG$yHZ zYDpPEdknUS23|UH@^n2RkIYmEAzP$4ik1V~z{> zDP7TlVPTRdrbvtXvALT1*6ccQ;kkQndAoN{0=McNmH709`9?$ChVS!(G4AvK*y+P2 z2|GvdBO~-pNIiRM-hBW-QBet%QThJ^cmNRJ0NI;B@v%VZD!FI?qIcZ1ZTlG@;RB=!TczCh7GK*?S4LHhM|k`tY;{XAJI3f5R_ z(B0kK7K{ozn?W51(0Y&ok|d!@9Gn$Rr@)oOx~p%LxoEK^P$Ur6Eo7~NQf2p!*LO{E z#(?q1J-rBqOHm*dRVOG&NU$+cJbR!@ihy78JfAxH4^l-zGmGH%>Vkw$w4$pS&=N+z zJe4!4umTNbrnA)e z0)CbAoP9|=+CA>Gu157t1U(hK149a$EUOWQa?b^Zt9+cOMUDu(Jkh%y9kyFeXc)x$fgb>NqY^%Dc?T>>T^YIV8VjLbUu^;`B~q5F^PpotE48{+*3~)d)8RYO9`WL z#AXg#p0+a?g34vG%CqOnXFf1A6pdeYLS-MQ`_B0gprUlT^-W)w6!6$=If5~vI#~|R zNpZ-nBLgH7I%25dfXbt!rpzdvoKCjUg?A=Pl4FuU0G=HSKcUrmKN~WwnlyK&Mv1{) zwloNnX$=&*!FGhQ!qJ-Ot8Nk`j$|^a*n#Y6OLFoY92h8!b`0Z^w(xV1=O*M(lkV@` zHb=Q5F`OyuVtH1Dz52~>b*3Pq`qHgiMHqxBoQqvm#?Ka#wQ4(uN$zRAQ(Jym9$x|3 zd;aL^9!m}b%31@?okQy@ufxW>)6H&i7|S7U2m<0hNiXNiI6K$%hFk}eFPcu}tkULL z(~nrfA6kX{*a4u8{L?iU^XY)u$ml31hq$KDoIguJpcr*H$xp@B`L_%d-@c1=yG8*E zwsd|}Izd;CRHj0fICdF`i_({gt*Df$9IuW$!8$6nXr^TymI_n|RGfDT1l}#g1$8eV zvy3sY+;7)pD#hqr+XgSDurp$KgD7-*Ky#r!Gr7bj@ml-HyBuXWi9%KIiEv>trSEU*I zYc*aU=DKu_$=5wi`0VBf1+0bI=1UZ5%|8C9(-yFPVus;+B$6K|*6%{w*OiZhB|BM} zM{9AlaZi&V(ZrGPzax(Wi$Wb7fhV}|OKwj$H>JS$A{4p5Dy?RKCWtC#h}7TvK}E)n zgm}-+{UojLq^>L7JWWih^x4{U zHbX+*vZY<`S;MHG4Kifl-oRp;GFW?%JymY(A(0^iFAg1)W#0e8wb(K9_$%wR!+GZT zM&&GCKKy}6k-`W>$IeOO=$za*BU|iZS z-eW)TvE#avXMiK!y4}TMF7ESwBNi~em26WXqGWN{lc!C{R+dLZh-2q8#^73*6|WWW z&T^8SkR14e;P<)DGNtBbzHqrNqMN}JAH_;+s}vA=L(kVw^zaHHE|%5_>G-*KkiUIK{zvyI+yOK@70WLGyz z$BqB0WJ)JTOofIQ*XUe9zjNy8&r!I;l5*GQ%OH=R(DFOWTRH2X?W=`D6vwCH7f4ve z0C*_pLU?)v!TJF>29biw=+R@QJ+p}<6%HhoSzH^&o#u-j0gOGBKV5zd?bV?nJV@mb zok++w<^Jpl+d7fNh@a`kGpWo~rB_LuZfY&{`wWaEp%Rr@)j2S4W80V1M6~&wG$^g> zI4TbS1CnMI%qvc6N&V^$-5U38507a>U_K-ldi?6r+98=LKot#E!k(v zs=9MPRK-YywhbSRq(e%?3}f-zfe7WjV3;EeR6KIP_htQ#u|pt~CI;vy1PG!Vse;6i zNDAWD0AccJ+i?z4&8tr+>VyS`X%Xc3?}U9;s5)fcOrYVLn&S>In00_jHA}1Q75%Vi zt}fFG$PAlQU7^##MwXV5Z9Yn8S=pbe`nVBuh1<6Sz9buCmz^4^)mtsY`p8NVJd1$= z6Kch9ytrx*6!`Tc2NxbOoBS{40sb5T<0fVmF>?0gXhdo4!WkQh0kJ|<(PA0My^J&I z<=x7)CSzXC1dM=0&ow);pto^-eUedKgNk$8_-bq!&a3Pdx;X4iY4cf*th&K+?#enk z5Y0ogiQT^vlcyCbPHa`%j+W`Yld2{x!DOFXwK1vb3$6JbH=DG9-tuM#7ynXFJ5Q6* zp)HCgh>jR0QBziAs}e1t@`a?)kdPbGw=IjbPyA|+4@I96pq)CNBMwJydgfwb%9gg> z0zM2Q1M|n6|2nloZP(nPW5(sSZM5KL1s5TNfUQeoBB8sWKmJwgv`V)(39VPuPqyvs zflvodv3A*utr1;CDnnN{sY6cIKRidwc`9$;O5_G5X(z6KudO?WRBa+nK&@H*lEN#F zd9vM^Wgm#gtm->u4%TYXIckHaZd4g@{RS~fjlaOTm7j#@&)#c=Bt{${TVbENb$S>m z?8ltEVAyc0A7|Y$@|}W}fZKyfo#-S;TNN7;O0L3(iDpS&Ko-~dz`?>t99UiAI^YV$ zCCEJ1GxnUW@<8iwRd!7ZsUWHvqQmTl=$eEVT}-AV4{P_y-;#AvXA8ae)cLAO zP~Q;?wM=)+e&Txpy$~Fv#%?Kg@pX{9r1gt3G$_u=8Wth%ecj3V)p20s;e8TXg z?ris7K&I?gP{F_-9?R;rJM{8v!gh)NQk<44!C$xSR*2k+JT`jkoctkD9Lkh_Kv>9> zDX!D%psfF9D{X%ENIaGz2L%B?y8((;6a~&q6yU*R#%UWb!2{RoIt9$3QT~UVxPf5! zd_CGSn2cRkeT_w*`sloINp6h z3)aQc8%RK~fcGK)k)S5g5#w7a-aY*NDV-QR$+58ifXpzHPuh3^!PGaZ+%zW}mxy1k z7cl$IR;N~JKl|R@%?bI?Gjrh-cd6ybO>fyDwEdQ zc&mEy8pUQsp8f-v5=8HhS$SJj5-TJ$zxNH7d#DRO#fHBd~8KTXP7#tUa*PWdj@ z&?=UoCi_qsC`*UV5!I3%K1n4ZHrWVoszgua>r4kRlXEHYR_*2bDFVV-n*%@x0LTi$ z7#d$QE~LALE+F8kvs*e8FwVMV!sfzNaP#Ll%V|wwwLVy;xx>U0_ zIHuj3&|{7Av8_T31TBVD6pjE?dI++ypuPbjBzP)*kj9kV?xd1-kp%kN>L~e)pnZhun$hyi1KzbKDk-`d1g1QufnjP zl?-o{*^_xwaNd7{?^y(%o>Q#UsYv^(O<{!~v80QGND-R=yO(5z6=mAFmSiG3!B&9v z%7VT5JpgJMHw2Q;>s{W*3Q1Uk)1jaOfn-;aq?qHuIIFrWj*|Eq*kqh~SjckC8QVxD z?WZHvWw2$Dd=DNH%Qy*txIAnGO~Hv>i~x*mg6Y;NTWSy81}FkzX8mRoPki%&>J()R zO0J?{$}2_thbjw+oDaln+CCsWl$I{IBRnE&v&=(Wcy-%fAp1eK{wj=u9HV??PZ$9L z@`TAjVe;r73MQ%IATln|T;DU`D#VuRcM;JmAY#OzAqWlvEI3%@SAZT7L5_v!KAQ@C zwl7s&gh7F1i0SA=wu#RrnRbbHc0!pb+RjR<%Mm_jCO(CwL1Ltjyr zX%$hmC{&~<;jo`*;WfbPCwGfh0&AkZu0i?HvPr5*X@GrILG3(|IABIE!xd9@n+(Nv ztke#?I~)eFF2&JeC*i`M6g5bSTqYVOlwKf@R|E(w1uk5q@iVdc9;wy&E^tyJFb0KG zB61m9C<#$X*?WqvEE6uCYpRee>p5qF*yC9Fd}BAog`#YZ2&U`3$jE{M4IUR}qz)bZ z<5$LA&&GR0W6=lXJ!u3{FrcVXaas+lGP%2()HO(O%E*OM<8sis?2MIPLlB!q zbriFI>ZS^t4ON+<1Y;GY>1%9MxqGGp}$;U?1E;1W`($fK=8_#UM z@ZmXZ)+2+~>WgE+EqXAzO|?eE%F#2D7N7Z8BO~#^&D2UXT^b|Pbj*Yt1~=oY?roaV_!$QZdZ6XCVbLqP zz#q#&%=qP~!WgEcnQ;&dzg>A)CS`@0@d{SIX$U~jM;l~0%~%q3FUyhHDa%`7>E^wi zPJ_KQ+2}OKW-uSc?DRC$I~Kj9_2z1*p<&X7!kL6zD8L}342DO|rm3JEkFiI zH^f_);-Zcv=c-fm&wIS8XLZNb^D^$M`i4}y7n-Z8QT3CT+gtXsjO|k|(>N}5BYAFN zSInN0rE?J-xAYhU{7zMvt}SF5y7uYnt-CfBFQ!dKkqUH-cNerrG%l2NBFg@8ebYTh z$UT66%gNNCYEd6ekh!>R)?2B9`5mod7`0EMCPNyDomdD9ojMKi1RXA%Dz$z1>r}BB z#CWFJKXZYw)iSMV+T%b^P?Eu3pe}>F9#F9EEbLehN)R)mWdH~Zd0rZ>VdOis*Yfri zkc&$LN2Fm+WIW)MlxNhxp&}3-HbM#nKzV<)5R+}xWKmZI>?jaZ1$;mtg_(>>vyo}T z8G*>M;R^)31hnk14?Yyf#c8<;5+0qau#iwmmu@I4TPYnc!=yQWoYb&BikL_u%r4M1-7^~tvaCC2u1~FY|1OP;-W!R+TQE;&ARSLb^>t^ zJuCV3RvvpbwYJ+qlRhA>93_M@6ddHE(>H^2GYW#7mw~4Ox-JMP90yzGXCtSZ#;IY1qCg$k+pgY?^=1Ib=kFD9k=^v@+;C zYb}V$wex~0mM8Ok)V^7yK`Km|%l{>iU`MetJ*u^Y^aWXP$`~-?Q|M^r%Y+4)u zu8e4Zf@)s_VD2XpM}C+>!K3^u(B$&_EC#9Eb4-_C0BvtrK@|(UBk9r(jk7h zbV#n){7ifHIsdS7**|HSPT6l*|l!|FnWYBCXjg5V%cx zwEaEW*91h>0XtbDMKujn44Bkt zvt~@e>N~l7DqQq-r}+L4t6Sx5P0$wX@30xIMZkniTpX#v%E^exb;6Eh?LFmFfX`J{ z#c06hPCY5RqFNAtpb%f3$rF)IdM=jeb7U1VUkfUKaL5(SUOsWdH<-_;0MWvJV8{z> zj+GT36F*^6F#~|ue|7N*S?@fGkq}h9f~jxal0Vl20J(=|=0UmKf);842NAs0xU*00 z;i)=qaX*{8moaZzHFAI&6=kTu!REONcwvFJIszz%U?qVXcTkqat^10x z{~&Fev#-m4->tSI6`#K>0A&#FGtPvVd)%qxbrR&-UfM`Rl%Kk2xs0MAYbN>Z)ymt`!C^ z7J^VnWCQD}cC*YYD%oTz1c zh^Jn8yAS%5&wBHh=%dP9OK&|UuUKr;MtcrBanm{K>gpQm8tOCsw&;*hQwY+jGFiy+ zQP`C)R5j#iWC9KiN=bxzLsXTcg0o3PtHG`N+-Z62q>Mk;Sxwj+$_dCDAalDi}rd87E|H2v1q=)9CRZ z*)~D}P0T$xM_$ZpZ!#-8TI19Fj^>`Y17qd5k5ioC!E6HO?S?-X?-Do@c&F}7LKjm? z&>LN4TITmV%18-A1v4^H!?4cy!|~Uf63So)6w4)7Hx%uBD`CW#0*QRRL+od~Cr)!FgD^e{ zUa8!3B#c$#atZQ5IfO%pX;=?VVC>H?d*Y<1`saEva6=OWCmkzD3@6i8pBJBE6Wa(f z>o+(DV;t(|38u*JHte{VO;J|Bb6wC?VqU-;BY&*o4v%akzh`pkL)b~!!C9faoQJT_ z6yCi0rz`nqG(>O;<2J~HxG-To?A^@R5_vp0&2U!!ofUC4Ynj5ERy18MJog^*bmNfd zvcdUC5L%f-R8XTI!C}F*E$WOgE9O{6eX@NgyuCRrz+nUG=1OlW(msYdkt*Se+cyXo zm`h{B=W(R`sPHddDx5hHma|woj16_QwYmhh80K){7^R$fkjk=Pe?ZuB5hjTZr*|E|dW}k$kFb*2Q5PC1h#wvf+`zWOg@gA5!GUJFdoVj!VIX^+ z-n0X!Ta=Yd2a%k#Nxvfv1*;&W+DAOj?VXYvG_|zm5A$7K$HLQH|0|4jXT+q-r$w~+4C|rF>a2^_Q^YV!H)Zl+mnOL zEX3%(k5O7y!>AZqni_nf0pTt+`QnY}QJ`2d=PWS=D7h+LDaeIkMqe0PC^2W$`jk>N zOIC9|s%hzyWmsp-on^ljfgWEK)hI)OHnO4V8+@XlCe(_GgvpcUY6gdeD-7cX?SpE} zll7^rK5XdLDK}82&aPfd`5rwapSv^xWh%#TY|DIf`GaE9oLw3E?>it8T%J^_$}piY zRP2YWzecLa&w$bk*dPkP$Xm1MUW*jmi8}BbEDG={zLI%45oT!u4>I^$LsEMgEsiTu zXEJ-_GEI~4z*zACJS~iCAx9?N3g?cMX{Z><8v<2o6>j8H_}w-c_N98A3N?s&wc;9( zB4pin#)XdpV!AuL6iNP;r4|USFhxE)r;vy~;EYq?-LZEr)A?{!jfaIAJ|9V7^vw(=xM0tNP_EHC#p7}>p!mfQ0S#^{L{P@0 zv@ik`D8^|WYSL}qk^^xh)d%DYMK2pUHzog9cq-)yawa;kv?A=dOWju>nq`Kn$EL6x zaIyf88kW1BHl|W3o=EE!lqVjt8X7GocMfe9l^aUk#jOn^uu2{BT72i}4I$z+HI^jy zI8~wMTw}`axK;OmZy4_EcFa&gnzA`Rr=7XTBhSXf?4AT374@~s(k145?47k>_@UP2 zfw!ZkA`pwbB~EKsZ`5195aT8>;mP#KHSn>}$rwfrn^iBYG zWHb!>so|mbX*HH8F5cu1PgX_kS}WpU!j-8t>4!^)vI)bpcb=cqe%r0c$)&sYk>J2$ z+Cw~Y?dvSNwF*;na|pfs*yltX8cO@<{?r_tyVKX~QD=nXa$1C7EbZ%Hebv{Q`>D2>cD!WRO)R%PeTy}hT9%P<|~;Y?RwYN{P)u3Gj{)ML+Ie#B*K z6h_xjp&i8t#za`toaXlm7TK4@NK6R%j*3;yhOjv*lf0onjO1Kgg{I1$G>K{Wsq2zy zKu_x~ZYvdyqWk0>dYVd|_=A2#Iq< z3hX`=&SS~b*YWm=}cRMT;sNT6ta&2Fh){0 zR2M7KS6Co!4)cY7x_ZX(h;|9YSAgyl0saBtN`N~9Y6Gx8fI<2s|MEaSbB{qNpqL;Z zm<;}%7@!j0#S{}s0KiRvzy$dF2AE`#p9)j7_>J%YDOyZ}QpF5>PMGDVnhqZ<6U-@d zk?=?4ImJBY*H8oyzK+L&tnQz|oyH>hZze2r%M0GbORl-%G51iLSKRZMTV4`kfqvXQFSw)hw5Po*u8Zs| z&QQ1ETb`r6yX2Y|nbpL-Z{)Jx%ZUOO!+V`uGvXm#{dF$5;uX($$V<$pKI2)BdS}q_ z^>TGoBO9MZt$HXZYqMTd9Bp&auDRyhhvLxDx^acCd&mvvN)d!AbVlD>tv3ya$ev8v5(StmHjUhsyl(IwCGq>61=+vo+4I8YB)eY3UV3&+)bH!d4VBIJ_%E4k;28ZrZ)8oDKo?ClI zAKh`;hP~&k;6??icV0o2E(CU$nD;c~NBN0)Mhm*OoP8-m(jx!FE%)RZ3L>eEn>Jzn z?vw;u@SLCM7pu|lUR`s^VxGyFQC$lS{K06?oCYeDMjO!ukDJq-d5vJVn9Z$f%awP= zL+->7MYpP-i`Swa^aZjP8xgnk?syXqRLd}m+c`SpqQkM?3LcgtCv_m*yfLLO1skI* zyyI02D)2*rI5K!y4x$WJG)*$qH%638w;XQtYmOn)R*znqH?ivbh?I9pMr>bMv-nba zX1>QTqE%k#Ev}E?ASX|{q9GkfZOoifyO3;|3q2aF!GgLJiMpWQ;9UDcz2J^gRD5sH-YOo$ O(ugTOJ+*uf)&l_48RR|y diff --git a/site/assets/Temml-Asana.css b/site/assets/Temml-Asana.css deleted file mode 100644 index 4d542692..00000000 --- a/site/assets/Temml-Asana.css +++ /dev/null @@ -1,143 +0,0 @@ -/* -Asana Math is released under the SIL Open Font License. See the files in this -directory for details. The font can be obtained from several TeX distributions -or package managers. The font does not seem to have a corresponding "non-MATH" -font, it is recommended to use a Palatino-like font for the surrounding text. - -The WOFF fonts have been obtained from -http://mirrors.ctan.org/fonts/ -*/ - -@font-face { - font-family: Asana Math; - src: local('Asana Math'), local('Asana-Math'), - url('./Asana-Math.woff2'); -} - -math { - font-style: normal; - font-weight: normal; - line-height: normal; - font-size-adjust: none; - text-indent: 0; - text-transform: none; - letter-spacing: normal; - word-wrap: normal; - direction: ltr; - /* Prevent Firefox from omitting the dot on i or j. */ - font-feature-settings: "dtls" off; -} - -math * { - border-color: currentColor; -} - -math { - font-family: Asana Math, math; -} - -/* Next line is active in Firefox and Safari. - * Not in Chromium, which recognizes display: "block math" written inline. */ -math.tml-display { display: block; } - -*.mathcal, -mo.tml-prime { - font-feature-settings: 'salt'; -} - -mrow.tml-cancel { - background: linear-gradient(to top left, - rgba(0,0,0,0) 0%, - rgba(0,0,0,0) calc(50% - 0.06em), - rgba(0,0,0,1) 50%, - rgba(0,0,0,0) calc(50% + 0.06em), - rgba(0,0,0,0) 100%); -} - -mrow.tml-bcancel { - background: linear-gradient(to top right, - rgba(0,0,0,0) 0%, - rgba(0,0,0,0) calc(50% - 0.06em), - rgba(0,0,0,1) 50%, - rgba(0,0,0,0) calc(50% + 0.06em), - rgba(0,0,0,0) 100%); -} - -mrow.tml-xcancel { - background: linear-gradient(to top left, - rgba(0,0,0,0) 0%, - rgba(0,0,0,0) calc(50% - 0.06em), - rgba(0,0,0,1) 50%, - rgba(0,0,0,0) calc(50% + 0.06em), - rgba(0,0,0,0) 100%), - linear-gradient(to top right, - rgba(0,0,0,0) 0%, - rgba(0,0,0,0) calc(50% - 0.06em), - rgba(0,0,0,1) 50%, - rgba(0,0,0,0) calc(50% + 0.06em), - rgba(0,0,0,0) 100%) -} - -/* Prevent f' from overlapping in Chromium */ -mo.prime-pad { - padding-left: 0.08em; -} - -/* Array cell justification in Firefox & WebKit */ -.tml-right { - text-align: right; -} -.tml-left { - text-align: left; -} - -/* Stretch \widetilde & set array cell justification in Chromium */ -@supports (not (-webkit-backdrop-filter: blur(1px))) and (not (-moz-appearance: none)) { - .tml-crooked-2 { - transform: scale(2.0, 1.1) - } - .tml-crooked-3 { - transform: scale(3.0, 1.3) - } - .tml-crooked-4 { - transform: scale(4.0, 1.4) - } - .tml-right { - text-align: -webkit-right; - } - .tml-left { - text-align: -webkit-left; - } -} - -/* Adjust WebKit accents */ -@supports (-webkit-backdrop-filter: blur(1px)) { - .tml-xshift { transform: translate(0px, 0.45em) } - .tml-capshift { transform: translate(0px, 0.35em) } -} - -/* flex-wrap for line-breaking in Chromium */ -math { - display: inline-flex; - flex-wrap: wrap; - align-items: baseline; -} -math > mrow { - padding: 0.5ex 0ex; -} - -/* Avoid flex-wrap in Firefox */ -@-moz-document url-prefix() { - math { display: inline; } - math > mrow { padding: 0 } -} - -/* AMS environment auto-numbering via CSS counter. */ -.tml-eqn::before { - counter-increment: tmlEqnNo; - content: "(" counter(tmlEqnNo) ")"; -} - -body { - counter-reset: tmlEqnNo; -} diff --git a/site/assets/Temml-Fira.css b/site/assets/Temml-Fira.css deleted file mode 100644 index 7596f1e3..00000000 --- a/site/assets/Temml-Fira.css +++ /dev/null @@ -1,154 +0,0 @@ -/* -Fira Math fonts are released under the SIL OPEN FONT LICENSE Version 1.1. - -The Fira Math WOFF2 font has been obtained from -http://www.gust.org.pl/projects/e-foundry/ - -The Temml.woff2 is a clone of KaTeX_Script-Regular, except that the code points -have been changed from ASCII to Unicode Mathematical Alphanumeric Symbols Script capitals, -Unicode range 1D49C to 1D4B5. -*/ - -@font-face { - font-family: 'Temml'; - src: url('Temml.woff2') format('woff2'); - font-weight: normal; - font-style: normal; -} - -@font-face { - font-family: Fira Math; - src: url('FiraMath-Regular.woff2'); -} - -math { - font-style: normal; - font-weight: normal; - line-height: normal; - font-size-adjust: none; - text-indent: 0; - text-transform: none; - letter-spacing: normal; - word-wrap: normal; - direction: ltr; - /* Prevent Firefox from omitting the dot on i or j. */ - font-feature-settings: "dtls" off; -} - -math * { - border-color: currentColor; -} - -math { - font-family: "Fira Math", math; -} - -/* Next line is active in Firefox and Safari. - * Not in Chromium, which recognizes display: "block math" written inline. */ -math.tml-display { display: block; } - -*.mathscr { - font-family: "Temml"; -} - -/* Chromium prime alignment */ -mo.tml-prime { - font-family: Temml; -} - -mrow.tml-cancel { - background: linear-gradient(to top left, - rgba(0,0,0,0) 0%, - rgba(0,0,0,0) calc(50% - 0.06em), - rgba(0,0,0,1) 50%, - rgba(0,0,0,0) calc(50% + 0.06em), - rgba(0,0,0,0) 100%); -} - -mrow.tml-bcancel { - background: linear-gradient(to top right, - rgba(0,0,0,0) 0%, - rgba(0,0,0,0) calc(50% - 0.06em), - rgba(0,0,0,1) 50%, - rgba(0,0,0,0) calc(50% + 0.06em), - rgba(0,0,0,0) 100%); -} - -mrow.tml-xcancel { - background: linear-gradient(to top left, - rgba(0,0,0,0) 0%, - rgba(0,0,0,0) calc(50% - 0.06em), - rgba(0,0,0,1) 50%, - rgba(0,0,0,0) calc(50% + 0.06em), - rgba(0,0,0,0) 100%), - linear-gradient(to top right, - rgba(0,0,0,0) 0%, - rgba(0,0,0,0) calc(50% - 0.06em), - rgba(0,0,0,1) 50%, - rgba(0,0,0,0) calc(50% + 0.06em), - rgba(0,0,0,0) 100%) -} - -/* Prevent f' from overlapping in Chromium */ -mo.prime-pad { - padding-left: 0.08em; -} - -/* Array cell justification in Firefox & WebKit */ -.tml-right { - text-align: right; -} -.tml-left { - text-align: left; -} - -/* Stretch \widetilde & set array cell justification in Chromium */ -@supports (not (-webkit-backdrop-filter: blur(1px))) and (not (-moz-appearance: none)) { - .tml-crooked-2 { - transform: scale(2.0, 1.1) - } - .tml-crooked-3 { - transform: scale(3.0, 1.3) - } - .tml-crooked-4 { - transform: scale(4.0, 1.4) - } - .tml-right { - text-align: -webkit-right; - } - .tml-left { - text-align: -webkit-left; - } -} - -/* Adjust WebKit accents */ -@supports (-webkit-backdrop-filter: blur(1px)) { - .tml-xshift { transform: translate(0px, 0.45em) } - .tml-capshift { transform: translate(0px, 0.35em) } -} - -/* flex-wrap for line-breaking in Chromium */ -math { - display: inline-flex; - flex-wrap: wrap; - align-items: baseline; -} -math > mrow { - padding: 0.5ex 0ex; -} - -/* Avoid flex-wrap in Firefox */ -@-moz-document url-prefix() { - math { display: inline; } - math > mrow { padding: 0 } -} - -/* AMS environment auto-numbering via CSS counter. */ -.tml-eqn::before { - counter-increment: tmlEqnNo; - content: "(" counter(tmlEqnNo) ")"; -} - -body { - counter-reset: tmlEqnNo; -} diff --git a/site/assets/Temml-Latin-Modern.css b/site/assets/Temml-Latin-Modern.css deleted file mode 100644 index bd2fd0a7..00000000 --- a/site/assets/Temml-Latin-Modern.css +++ /dev/null @@ -1,157 +0,0 @@ -/* -The Latin Modern fonts are released under the GUST font license, which is -legally equivalent to the LaTeX Project Public License. See the files in this -directory for details. The fonts can be obtained from several TeX distributions -or package managers. - -The Latin Modern WOFF font has been obtained from -http://www.gust.org.pl/projects/e-foundry/ - -The Temml.woff2 is a clone of KaTeX_Script-Regular, except that the code points -have been changed from ASCII to Unicode Mathematical Alphanumeric Symbols Script capitals, -Unicode range 1D49C to 1D4B5. -*/ - -@font-face { - font-family: 'Temml'; - src: url('Temml.woff2') format('woff2'); - font-weight: normal; - font-style: normal; -} - -@font-face { - font-family: Latin Modern Math; - src: url('./latinmodernmath.woff2'); -} - -math { - font-style: normal; - font-weight: normal; - line-height: normal; - font-size-adjust: none; - text-indent: 0; - text-transform: none; - letter-spacing: normal; - word-wrap: normal; - direction: ltr; - /* Prevent Firefox from omitting the dot on i or j. */ - font-feature-settings: "dtls" off; -} - -math * { - border-color: currentColor; -} - -math { - font-family: "Latin Modern Math", math; -} - -/* Next line is active in Firefox and Safari. - * Not in Chromium, which recognizes display: "block math" written inline. */ -math.tml-display { display: block; } - -*.mathscr { - font-family: "Temml"; -} - -/* Chromium prime alignment */ -mo.tml-prime { - font-family: Temml; -} - -mrow.tml-cancel { - background: linear-gradient(to top left, - rgba(0,0,0,0) 0%, - rgba(0,0,0,0) calc(50% - 0.06em), - rgba(0,0,0,1) 50%, - rgba(0,0,0,0) calc(50% + 0.06em), - rgba(0,0,0,0) 100%); -} - -mrow.tml-bcancel { - background: linear-gradient(to top right, - rgba(0,0,0,0) 0%, - rgba(0,0,0,0) calc(50% - 0.06em), - rgba(0,0,0,1) 50%, - rgba(0,0,0,0) calc(50% + 0.06em), - rgba(0,0,0,0) 100%); -} - -mrow.tml-xcancel { - background: linear-gradient(to top left, - rgba(0,0,0,0) 0%, - rgba(0,0,0,0) calc(50% - 0.06em), - rgba(0,0,0,1) 50%, - rgba(0,0,0,0) calc(50% + 0.06em), - rgba(0,0,0,0) 100%), - linear-gradient(to top right, - rgba(0,0,0,0) 0%, - rgba(0,0,0,0) calc(50% - 0.06em), - rgba(0,0,0,1) 50%, - rgba(0,0,0,0) calc(50% + 0.06em), - rgba(0,0,0,0) 100%) -} - -/* Prevent f' from overlapping in Chromium */ -mo.prime-pad { - padding-left: 0.08em; -} - -/* Array cell justification in Firefox & WebKit */ -.tml-right { - text-align: right; -} -.tml-left { - text-align: left; -} - -/* Stretch \widetilde & set array cell justification in Chromium */ -@supports (not (-webkit-backdrop-filter: blur(1px))) and (not (-moz-appearance: none)) { - .tml-crooked-2 { - transform: scale(2.0, 1.1) - } - .tml-crooked-3 { - transform: scale(3.0, 1.3) - } - .tml-crooked-4 { - transform: scale(4.0, 1.4) - } - .tml-right { - text-align: -webkit-right; - } - .tml-left { - text-align: -webkit-left; - } -} - -/* Adjust WebKit accents */ -@supports (-webkit-backdrop-filter: blur(1px)) { - .tml-xshift { transform: translate(0px, 0.45em) } - .tml-capshift { transform: translate(0px, 0.35em) } -} - -/* flex-wrap for line-breaking in Chromium */ -math { - display: inline-flex; - flex-wrap: wrap; - align-items: baseline; -} -math > mrow { - padding: 0.5ex 0ex; -} - -/* Avoid flex-wrap in Firefox */ -@-moz-document url-prefix() { - math { display: inline; } - math > mrow { padding: 0 } -} - -/* AMS environment auto-numbering via CSS counter. */ -.tml-eqn::before { - counter-increment: tmlEqnNo; - content: "(" counter(tmlEqnNo) ")"; -} - -body { - counter-reset: tmlEqnNo; -} diff --git a/site/assets/Temml-Libertinus.css b/site/assets/Temml-Libertinus.css deleted file mode 100644 index 647b6465..00000000 --- a/site/assets/Temml-Libertinus.css +++ /dev/null @@ -1,154 +0,0 @@ -/* -The Latin Modern fonts are released under the Open Font License, version 1.1. -See https://github.com/alerque/libertinus/blob/master/OFL.txt. - -The Libertinus WOFF font has been obtained from -https://github.com/alerque/libertinus - -The Temml.woff2 is a clone of KaTeX_Script-Regular, except that the code points -have been changed from ASCII to Unicode Mathematical Alphanumeric Symbols Script capitals, -Unicode range 1D49C to 1D4B5. -*/ - -@font-face { - font-family: 'Temml'; - src: url('Temml.woff2') format('woff2'); - font-weight: normal; - font-style: normal; -} - -@font-face { - font-family: Libertinus Math; - src: url('./LibertinusMath-Regular.woff2'); -} - -math { - font-style: normal; - font-weight: normal; - line-height: normal; - font-size-adjust: none; - text-indent: 0; - text-transform: none; - letter-spacing: normal; - word-wrap: normal; - direction: ltr; - /* Prevent Firefox from omitting the dot on i or j. */ - font-feature-settings: "dtls" off; -} - -math * { - border-color: currentColor; -} - -math { - font-family: Libertinus Math, math; -} - -/* Next line is active in Firefox and Safari. - * Not in Chromium, which recognizes display: "block math" written inline. */ -math.tml-display { display: block; } - -*.mathcal { - font-family: "Cambria Math", 'STIXTwoMath-Regular', "Times New Roman", math; -} - -mo.tml-prime { - font-feature-settings: 'ssty'; -} - -mrow.tml-cancel { - background: linear-gradient(to top left, - rgba(0,0,0,0) 0%, - rgba(0,0,0,0) calc(50% - 0.06em), - rgba(0,0,0,1) 50%, - rgba(0,0,0,0) calc(50% + 0.06em), - rgba(0,0,0,0) 100%); -} - -mrow.tml-bcancel { - background: linear-gradient(to top right, - rgba(0,0,0,0) 0%, - rgba(0,0,0,0) calc(50% - 0.06em), - rgba(0,0,0,1) 50%, - rgba(0,0,0,0) calc(50% + 0.06em), - rgba(0,0,0,0) 100%); -} - -mrow.tml-xcancel { - background: linear-gradient(to top left, - rgba(0,0,0,0) 0%, - rgba(0,0,0,0) calc(50% - 0.06em), - rgba(0,0,0,1) 50%, - rgba(0,0,0,0) calc(50% + 0.06em), - rgba(0,0,0,0) 100%), - linear-gradient(to top right, - rgba(0,0,0,0) 0%, - rgba(0,0,0,0) calc(50% - 0.06em), - rgba(0,0,0,1) 50%, - rgba(0,0,0,0) calc(50% + 0.06em), - rgba(0,0,0,0) 100%) -} - -/* Prevent f' from overlapping in Chromium */ -mo.prime-pad { - padding-left: 0.08em; -} - -/* Array cell justification in Firefox & WebKit */ -.tml-right { - text-align: right; -} -.tml-left { - text-align: left; -} - -/* Stretch \widetilde & set array cell justification in Chromium */ -@supports (not (-webkit-backdrop-filter: blur(1px))) and (not (-moz-appearance: none)) { - .tml-crooked-2 { - transform: scale(2.0, 1.1) - } - .tml-crooked-3 { - transform: scale(3.0, 1.3) - } - .tml-crooked-4 { - transform: scale(4.0, 1.4) - } - .tml-right { - text-align: -webkit-right; - } - .tml-left { - text-align: -webkit-left; - } -} - -/* Adjust WebKit accents */ -@supports (-webkit-backdrop-filter: blur(1px)) { - .tml-xshift { transform: translate(0px, 0.45em) } - .tml-capshift { transform: translate(0px, 0.35em) } -} - -/* flex-wrap for line-breaking in Chromium */ -math { - display: inline-flex; - flex-wrap: wrap; - align-items: baseline; -} -math > mrow { - padding: 0.5ex 0ex; -} - -/* Avoid flex-wrap in Firefox */ -@-moz-document url-prefix() { - math { display: inline; } - math > mrow { padding: 0 } -} - -/* AMS environment auto-numbering via CSS counter. */ -.tml-eqn::before { - counter-increment: tmlEqnNo; - content: "(" counter(tmlEqnNo) ")"; -} - -body { - counter-reset: tmlEqnNo; -} diff --git a/site/assets/Temml-Local.css b/site/assets/Temml-Local.css deleted file mode 100644 index 0b58a6d5..00000000 --- a/site/assets/Temml-Local.css +++ /dev/null @@ -1,140 +0,0 @@ -/* -Temml.woff2 is a clone of KaTeX_Script-Regular, except that the code points -have been changed from ASCII to Unicode Mathematical Alphanumeric Symbols Script capitals, -Unicode range 1D49C to 1D4B5. -*/ - -@font-face { - font-family: 'Temml'; - src: url('Temml.woff2') format('woff2'); - font-weight: normal; - font-style: normal; -} - -math { - font-family: "Cambria Math", 'STIXTwoMath-Regular', math; - font-style: normal; - font-weight: normal; - line-height: normal; - font-size-adjust: none; - text-indent: 0; - text-transform: none; - letter-spacing: normal; - word-wrap: normal; - direction: ltr; - /* Prevent Firefox from omitting the dot on i or j. */ - font-feature-settings: "dtls" off; -} - -math * { - border-color: currentColor; -} - -/* Next line is active in Firefox and Safari. - * Not in Chromium, which recognizes display: "block math" written inline. */ -math.tml-display { display: block; } - -math .mathscr { - font-family: "Temml"; -} - -mo.tml-prime { - font-family: Temml; -} - -mrow.tml-cancel { - background: linear-gradient(to top left, - rgba(0,0,0,0) 0%, - rgba(0,0,0,0) calc(50% - 0.06em), - rgba(0,0,0,1) 50%, - rgba(0,0,0,0) calc(50% + 0.06em), - rgba(0,0,0,0) 100%); -} - -mrow.tml-bcancel { - background: linear-gradient(to top right, - rgba(0,0,0,0) 0%, - rgba(0,0,0,0) calc(50% - 0.06em), - rgba(0,0,0,1) 50%, - rgba(0,0,0,0) calc(50% + 0.06em), - rgba(0,0,0,0) 100%); -} - -mrow.tml-xcancel { - background: linear-gradient(to top left, - rgba(0,0,0,0) 0%, - rgba(0,0,0,0) calc(50% - 0.06em), - rgba(0,0,0,1) 50%, - rgba(0,0,0,0) calc(50% + 0.06em), - rgba(0,0,0,0) 100%), - linear-gradient(to top right, - rgba(0,0,0,0) 0%, - rgba(0,0,0,0) calc(50% - 0.06em), - rgba(0,0,0,1) 50%, - rgba(0,0,0,0) calc(50% + 0.06em), - rgba(0,0,0,0) 100%) -} - -/* Prevent f' from overlapping in Chromium */ -mo.prime-pad { - padding-left: 0.08em; -} - -/* Array cell justification in Firefox & WebKit */ -.tml-right { - text-align: right; -} -.tml-left { - text-align: left; -} - -/* Stretch \widetilde & set array cell justification in Chromium */ -@supports (not (-webkit-backdrop-filter: blur(1px))) and (not (-moz-appearance: none)) { - .tml-crooked-2 { - transform: scale(2.0, 1.1) - } - .tml-crooked-3 { - transform: scale(3.0, 1.3) - } - .tml-crooked-4 { - transform: scale(4.0, 1.4) - } - .tml-right { - text-align: -webkit-right; - } - .tml-left { - text-align: -webkit-left; - } -} - -/* Adjust WebKit accents */ -@supports (-webkit-backdrop-filter: blur(1px)) { - .tml-xshift { transform: translate(0px, 0.45em) } - .tml-capshift { transform: translate(0px, 0.35em) } -} - -/* flex-wrap for line-breaking in Chromium */ -math { - display: inline-flex; - flex-wrap: wrap; - align-items: baseline; -} -math > mrow { - padding: 0.5ex 0ex; -} - -/* Avoid flex-wrap in Firefox */ -@-moz-document url-prefix() { - math { display: inline; } - math > mrow { padding: 0 } -} - -/* AMS environment auto-numbering via CSS counter. */ -.tml-eqn::before { - counter-increment: tmlEqnNo; - content: "(" counter(tmlEqnNo) ")"; -} - -body { - counter-reset: tmlEqnNo; -} diff --git a/site/assets/Temml-STIX2.css b/site/assets/Temml-STIX2.css deleted file mode 100644 index 6536ba58..00000000 --- a/site/assets/Temml-STIX2.css +++ /dev/null @@ -1,144 +0,0 @@ -/* -XITS is released under the SIL Open Font License. -See https://github.com/stipub/stixfonts/blob/master/OFL.txt details. - -The STIX2 WOFF font has been obtained from -https://github.com/stipub/stixfonts -*/ - -@font-face { - font-family: STIX2; - src: local('STIXTwoMath-Regular'), - url('./STIXTwoMath-Regular.woff2'); -} - -math { - font-style: normal; - font-weight: normal; - line-height: normal; - font-size-adjust: none; - text-indent: 0; - text-transform: none; - letter-spacing: normal; - word-wrap: normal; - direction: ltr; - /* Prevent Firefox from omitting the dot on i or j. */ - font-feature-settings: "dtls" off; -} - -math * { - border-color: currentColor; -} - -/* Next line is active in Firefox and Safari. - * Not in Chromium, which recognizes display: "block math" written inline. */ -math.tml-display { display: block; } - -math { - font-family: STIX2, math; -} - -*.mathscr { - font-feature-settings: 'ss01'; -} - -mo.tml-prime { - font-feature-settings: 'ss04'; -} - -mrow.tml-cancel { - background: linear-gradient(to top left, - rgba(0,0,0,0) 0%, - rgba(0,0,0,0) calc(50% - 0.06em), - rgba(0,0,0,1) 50%, - rgba(0,0,0,0) calc(50% + 0.06em), - rgba(0,0,0,0) 100%); -} - -mrow.tml-bcancel { - background: linear-gradient(to top right, - rgba(0,0,0,0) 0%, - rgba(0,0,0,0) calc(50% - 0.06em), - rgba(0,0,0,1) 50%, - rgba(0,0,0,0) calc(50% + 0.06em), - rgba(0,0,0,0) 100%); -} - -mrow.tml-xcancel { - background: linear-gradient(to top left, - rgba(0,0,0,0) 0%, - rgba(0,0,0,0) calc(50% - 0.06em), - rgba(0,0,0,1) 50%, - rgba(0,0,0,0) calc(50% + 0.06em), - rgba(0,0,0,0) 100%), - linear-gradient(to top right, - rgba(0,0,0,0) 0%, - rgba(0,0,0,0) calc(50% - 0.06em), - rgba(0,0,0,1) 50%, - rgba(0,0,0,0) calc(50% + 0.06em), - rgba(0,0,0,0) 100%) -} - -/* Prevent f' from overlapping in Chromium */ -mo.prime-pad { - padding-left: 0.08em; -} - -/* Array cell justification in Firefox & WebKit */ -.tml-right { - text-align: right; -} -.tml-left { - text-align: left; -} - -/* Stretch \widetilde & set array cell justification in Chromium */ -@supports (not (-webkit-backdrop-filter: blur(1px))) and (not (-moz-appearance: none)) { - .tml-crooked-2 { - transform: scale(2.0, 1.1) - } - .tml-crooked-3 { - transform: scale(3.0, 1.3) - } - .tml-crooked-4 { - transform: scale(4.0, 1.4) - } - .tml-right { - text-align: -webkit-right; - } - .tml-left { - text-align: -webkit-left; - } -} - -/* Adjust WebKit accents */ -@supports (-webkit-backdrop-filter: blur(1px)) { - .tml-xshift { transform: translate(0px, 0.45em) } - .tml-capshift { transform: translate(0px, 0.35em) } -} - -/* flex-wrap for line-breaking in Chromium */ -math { - display: inline-flex; - flex-wrap: wrap; - align-items: baseline; -} -math > mrow { - padding: 0.5ex 0ex; -} - -/* Avoid flex-wrap in Firefox */ -@-moz-document url-prefix() { - math { display: inline; } - math > mrow { padding: 0 } -} - -/* AMS environment auto-numbering via CSS counter. */ -.tml-eqn::before { - counter-increment: tmlEqnNo; - content: "(" counter(tmlEqnNo) ")"; -} - -body { - counter-reset: tmlEqnNo; -} diff --git a/site/assets/Temml.woff2 b/site/assets/Temml.woff2 deleted file mode 100644 index fccefda4b3a0d812687d62efff0d6a554347ddc8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9404 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 Cd@~6E diff --git a/site/assets/auto-render.min.js b/site/assets/auto-render.min.js deleted file mode 100644 index 55bcd20c..00000000 --- a/site/assets/auto-render.min.js +++ /dev/null @@ -1 +0,0 @@ -var renderMathInElement=function(e){"use strict";function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var n=t(e);const r=function(e,t,n){let r=n,a=0;const i=e.length;for(;re.left.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"))).join("|")+")");for(;n=e.search(l),-1!==n;){n>0&&(i.push({type:"text",data:e.slice(0,n)}),e=e.slice(n));const l=t.findIndex((t=>e.startsWith(t.left)));if(n=r(t[l].right,e,t[l].left.length),-1===n)break;const o=e.slice(0,n+t[l].right.length),s=a.test(o)?o:e.slice(t[l].left.length,n);i.push({type:"math",data:s,rawData:o,display:t[l].display}),e=e.slice(n+t[l].right.length)}return""!==e&&i.push({type:"text",data:e}),i}(e,t.delimiters);if(1===i.length&&"text"===i[0].type)return null;const l=document.createDocumentFragment();for(let e=0;e-1===e.indexOf(" "+t+" ")))&&l(r,t)}}};return function(e,t){if(!e)throw new Error("No element provided to render");const r={};for(const e in t)Object.prototype.hasOwnProperty.call(t,e)&&(r[e]=t[e]);r.delimiters=r.delimiters||[{left:"$$",right:"$$",display:!0},{left:"\\(",right:"\\)",display:!1},{left:"\\begin{equation}",right:"\\end{equation}",display:!0},{left:"\\begin{align}",right:"\\end{align}",display:!0},{left:"\\begin{alignat}",right:"\\end{alignat}",display:!0},{left:"\\begin{gather}",right:"\\end{gather}",display:!0},{left:"\\begin{CD}",right:"\\end{CD}",display:!0},{left:"\\[",right:"\\]",display:!0}],r.ignoredTags=r.ignoredTags||["script","noscript","style","textarea","pre","code","option"],r.ignoredClasses=r.ignoredClasses||[],r.errorCallback=r.errorCallback||console.error,r.macros=r.macros||{},l(e,r),n.default.postProcess(e)}}(temml); \ No newline at end of file diff --git a/site/assets/copy-tex.min.js b/site/assets/copy-tex.min.js deleted file mode 100644 index cbe6617d..00000000 --- a/site/assets/copy-tex.min.js +++ /dev/null @@ -1 +0,0 @@ -function closestMath(t){const e=t instanceof Element?t:t.parentElement;return e&&e.closest("math")}const defaultCopyDelimiters={inline:["$","$"],display:["$$","$$"]};function replaceMathwithTeX(t,e=defaultCopyDelimiters){const n=t.querySelectorAll("math");for(let t=0;tt instanceof Text?t.textContent:t.outerHTML)).join("");n.setData("text/html",l),n.setData("text/plain",replaceMathwithTeX(i).textContent),t.preventDefault()})); \ No newline at end of file diff --git a/site/assets/latinmodernmath.woff2 b/site/assets/latinmodernmath.woff2 deleted file mode 100644 index 81369b87f8c7b799b116f4d884da7d39db126643..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 388456 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

    Copy-tex test

    -

    Try copy/pasting some of the text below.

    - -

    With any second order polynomial, \(\mathrm{a}x^{2} + \mathrm{b}x + \mathrm{c} = 0\), - you can solve for the zeros with the quadratic formula:

    - -

    $$ x = \frac{-\mathrm{b} ± \sqrt{\mathrm{b}^{2} - 4 \mathrm{a}\mathrm{c}}}{2 \mathrm{a}} $$

    - -

    The system: -\(\begin{matrix} - 3 x + 2 y + z = 39 \\ - 2 x + 3 y + z = 34 \\ - x + 2 y + 3 z = 26 -\end{matrix}\) when restated in matrix format is: -\(\begin{pmatrix} - 3 & 2 & 1 \\ - 2 & 3 & 1 \\ - 1 & 2 & 3 -\end{pmatrix} -\begin{bmatrix}x \\ y \\ z \end{bmatrix} = -\begin{bmatrix}39 \\ 34 \\ 26 \end{bmatrix}\)

    - - - - \ No newline at end of file diff --git a/site/docs/docStyles.css b/site/docs/docStyles.css deleted file mode 100644 index b4099946..00000000 --- a/site/docs/docStyles.css +++ /dev/null @@ -1,377 +0,0 @@ -* { - margin: 0; -} /* reset */ - -body { - font-family: "Times New Roman", Cambria, "Cambria Math", Georgia, serif; -} - -body { - font-size: 18px; -} -@media (max-width: 830px) { - body { - font-size: 16px; - } -} -@media (max-width: 740px) { - body { - font-size: 16px; - } -} - -main { - position: absolute; - top: 0; - padding: 0px 2.5px 0px 2.5px; -} - -#sidebar { - position: fixed; - top: 0; - margin: 0px 2.5px 0px 2.5px; - overflow: fixed; -} - -#demo { - margin: 0px 2.5px 0px 2.5px; - overflow: fixed; -} - -@media all { - #sidebar { - left: 50px; - width: 245px; - } - #sidebar.narrow { - width: 100px; - } - main { - left: 330px; - width: 580px; - } - main.sptable { - left: 190px; - } - main.comp { - left: 200px; - } -} - -@media (max-width: 880px) { - #sidebar { - left: 0px; - width: 20%; - } - main { - left: 24%; - width: 75%; - } -} - -@media (max-width: 670px) { - #sidebar { - left: 0px; - width: 5%; - } - main { - left: 7%; - width: 90%; - } -} - - -h1, -h2, -h3 { - font-family: Verdana, sans-serif; - font-variant: small-caps; - letter-spacing: 0.05em; - margin-top: 3em; -} - -h1 { - font-size: 140%; - margin-top: 1em; -} -h2 { - font-size: 110%; - margin-bottom: 0.5em; -} -h3 { - font-size: 110%; - margin-bottom: 0.5em; - margin-top: 0.8em; -} -h4 { - margin-bottom: 0.5em; - margin-top: 0.8em; -} - -p { - margin-top: 1em; - line-height: 1.35; - text-align: justify; -} - -td > p:first-child { margin-top: 0em; } - -hr { - margin: 1em; -} - -/* Style subscripts and superscripts to avoid wide line spacing. */ -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} -sup { - top: -0.5em; -} -sub { - bottom: -0.25em; -} - -.direct { - font-family: "Cambria Math"; -} -.reduced { - font-size: 80%; -} -.dim { - color: gray; -} - -.indented { - margin-left: 2.5em; -} -p.indented { - margin-top: 0.25em; - text-align: left; -} -.indented p { - margin-top: 0.5em; - text-align: left; -} - -table { - font-size: inherit; - border-collapse: collapse; - width: auto; -} - -div > table { - margin-left: 0; -} - -table td { - padding: 0.3em 0.8em 0.3em 0.8em; - vertical-align: middle; - hyphens: none; - white-space: nowrap; - border: 1px solid #ddd; -} - -table th { - font-size: 95%; - padding: 0.3rem 0.5rem 0.3rem 0.5rem; - line-height: 1.05; - border-bottom: 1px solid #ccc; - white-space: nowrap; -} - -table tbody tr:nth-child(even) { - background-color: #f6f8fa; -} - -/* Column alignment. Apply these classes to the table node. */ -.c1r td:nth-child(1), .c1r th:nth-child(1), -.c2r td:nth-child(2), .c2r th:nth-child(2), -.c3r td:nth-child(3), .c3r th:nth-child(3), -.c4r td:nth-child(4), .c4r th:nth-child(4), -.c5r td:nth-child(5), .c5r th:nth-child(5), -.c6r td:nth-child(6), .c6r th:nth-child(6), -.c7r td:nth-child(7), .c7r th:nth-child(7), -.c8r td:nth-child(8), .c8r th:nth-child(8), -.c9r td:nth-child(9), .c9r th:nth-child(9) { text-align:right } - -.c1c td:nth-child(1), .c1c th:nth-child(1), -.c2c td:nth-child(2), .c2c th:nth-child(2), -.c3c td:nth-child(3), .c3c th:nth-child(3), -.c4c td:nth-child(4), .c4c th:nth-child(4), -.c5c td:nth-child(5), .c5c th:nth-child(5), -.c6c td:nth-child(6), .c6c th:nth-child(6), -.c7c td:nth-child(7), .c7c th:nth-child(7), -.c8c td:nth-child(8), .c8c th:nth-child(8), -.c9c td:nth-child(9), .c9c th:nth-child(9) { text-align:center } - -ul { - padding: 0; -} - -ol li { - position: relative; - left: 0em; - width: 88%; - line-height: 1.35; - margin-top: 0.5em; -} -ul li { - list-style-type: disc; - line-height: 1.35; - margin-top: 0.5em; - position: relative; - left: 1.8em; -} - -ul li p:first-child { - margin-top: 0; -} - -a { - text-decoration: underline; - color: black; -} - -pre { - margin: 0px; - padding: 12px 12px 12px 12px; - line-height: 1.5; - display: block; - overflow: visible; -} - -code { - font-family: Consolas, "Courier New", Courier, monospace; - font-size: 85%; - /*color: #404040;*/ - background-color: rgba(27, 31, 35, 0.05); -} -pre > code, -td code { - background-color: transparent; -} - -.no-sup { - color: dimgray; -} - -#input-container { - font-size: 0.9em; - width: 100%; - height: 3em; - border-radius: 4px; - border: 1px solid rgb(200, 200, 200); - display: inline-block; - padding: 0.5em 0.5em; - vertical-align: top; - resize: none; -} - -#demo-output { - font-size: 0.9em; - width: 100%; - height: 5em; - padding: 1em 1em; - vertical-align: top; -} - -summary { - outline: none; - cursor: pointer; -} - -.mobile-menu { - position: absolute; - background: #fff; - border: 1px solid #aaa; - padding-right: 3em; -} -.mobile-menu summary:after { - content: none; -} - -/* Table of Contents, sidebar version */ -#sidebar { - cursor: pointer; - font-family: Calibri, sans-serif; - padding-top: 0.5em; - background: #fff; -} - -#sidebar li { - list-style: none; - line-height: 1.35; - position: relative; - margin-top: 0em; - left: 0em; -} - -#sidebar ul li ul { - padding-left: 1.3em; -} - -#sidebar ul li ul li { - margin-top: 0em; - width: 88%; -} - -#sidebar a { - text-decoration: none; - color: black; -} - -/* Table of Contents, mobile version */ -#mobile-nav { - display: none; /* hidden on large screens */ - position: fixed; -} - -/* On small screens, switch from sidebar TOC to navicon and drop-down menu */ -@media screen and (max-width: 670px) { - #mobile-nav { - display: block; - } - #sidebar { - display: none; - } -} - -#mobile-nav ul { - position: absolute; - top: -9999px; - left: -9999px; - display: block; - background:#fff; - border:1px solid #aaa; - padding-right: 3em; - color: black; - display: block; -} - -#mobile-nav input[type="checkbox"]:checked ~ ul { - top: 26px; - left: 25px; -} - -input[type="checkbox"] { - display: none; -} - -#mobile-nav li { - list-style: none; - margin: 0; - padding: 0.2em; -} - -#mobile-nav li a { - width: 60px; -} - -#mobile-nav a { - text-decoration: none; - color: black; -} diff --git a/site/docs/en/administration.html b/site/docs/en/administration.html deleted file mode 100644 index 7bbe2af3..00000000 --- a/site/docs/en/administration.html +++ /dev/null @@ -1,254 +0,0 @@ - - - - - - Temml Administration - - - - -

    -

    Temml Administration

    -

    Browser Support

    -

    Temml works in browsers that support MathML. This includes Chrome, Edge, Firefox, and Safari. Temml will never work in Internet Explorer.

    -

    Installation

    -

    For use in the browser, you can download a zip file of Temml from the releases page of the Temml repository. For server-side use, you can obtain Temml via CLI commands npm install temml or yarn add temml.

    -

    The minimum browser installation needs the following files. The css file and font file must be in the same folder.

    -
    • temml.min.js

    • -
    • Temml-Local.css

    • -
    • Temml.woff2

    -

    A server-side installation should use temml.cjs or temml.mjs instead of temml.min.js.

    -

    Starter template

    -
    <!DOCTYPE html>
    -<!-- Temml requires the use of the HTML5 doctype. -->
    -<html>
    -    <head>
    -        ...
    -        <link rel="stylesheet" href="./Temml-Local.css">
    -        <script src="./temml.min.js"></script>
    -    </head>
    -    ...
    -</html>

    API

    -

    Overview

    -

    Say that you have an HTMLCollection of elements whose contents should be converted from TeX strings to math. The code for such a conversion might look like this:

    -

    Option 1: Macros do not persist between calls to Temml:

    -
    // Render all the math.
    -for (let aSpan of [...mathSpans]) {
    -    const tex = aSpan.textContent;
    -    const displayMode = aSpan.classList.contains("display");
    -    temml.render(tex, aSpan, { displayMode });
    -}
    -// Optional postProcess to render \ref{}
    -temml.postProcess(document.body);
    Option 2: Macros defined with \gdef do persist: -
    // Optional macros object to hold macros that persist between calls to Temml.
    -const macros = {}
    -// Render all the math.
    -for (let aSpan of [...mathSpans]) {
    -    const tex = aSpan.textContent;
    -    const displayMode = aSpan.classList.contains("display");
    -    // Notice the macros argument below.
    -    // It carries macros that were defined with \gdef or \global\let
    -    temml.render(tex, aSpan, { macros, displayMode });
    -}
    -// Optional postProcess to render \ref{}
    -temml.postProcess(document.body);

    Notice that you can choose when to stop macro persistence by redefining macros.

    -
    -
    -
    Option 3: Macros persist and there are some predefined macros: -

    Now say that you wish to pre-define two macros and a color with document-wide scope.

    -
    // Optional preamble to pre-define macros.
    -const macros = temml.definePreamble(
    -    `\\newcommand\\d[0]{\\operatorname{d}\\!}
    -    \\def\\foo{x^2}
    -    \\definecolor{sortaGreen}{RGB}{128,128,0}`
    -);
    -// Render all the math.
    -for (let aSpan of [...mathSpans]) {
    -    const tex = aSpan.textContent;
    -    const displayMode = aSpan.classList.contains("display");
    -    temml.render(tex, aSpan, { macros, displayMode });
    -}
    -// Optional postProcess to render \ref{}
    -temml.postProcess(document.body);
    -

    Below, we examine the parts of that code.

    -

    In-Browser

    -

    To render math in one DOM element, call temml.render with a TeX expression and a DOM element to render into:

    -
    temml.render("c = \\pm\\sqrt{a^2 + b^2}", element);

    If the element you provide is a <math> element, Temml will populate it. Otherwise, it will create a new <math> element and make it a child of the element you provide.

    -

    Server-Side

    -

    To generate MathML on the server or to generate an MathML string of the rendered math, you can use temml.renderToString:

    -
    const temml = require('./temml.cjs');  // if in Node.js
    -const mathML = temml.renderToString("c = \\pm\\sqrt{a^2 + b^2}");

    Preamble

    -

    To give document-wide scope to a set of macros or colors, define them in a preamble.

    -
    const macros = temml.definePreamble(
    -    `\\newcommand\\d[0]{\\operatorname{d}\\!}
    -    \\def\\foo{x^2}
    -    \\definecolor{sortaGreen}{RGB}{128,128,0}`
    -);

    Any valid Temml macro or \definecolor may be written into a preamble. Then include the resulting macros in the Temml options.

    -

    Options

    -

    You can provide an object of options as the last argument to temml.render and temml.renderToString. For example:

    -
    temml.render(
    -  "c = \\pm\\sqrt{a^2 + b^2}",
    -  element, 
    -  { displayMode: true,  macros }
    -);

    Available options are:

    -
    • displayMode: boolean. If true the math will be rendered in display mode, which will put the math in display style (so \int and \sum are large, for example), and will center the math on the page on its own line. If false the math will be rendered in inline mode. (default: false)

    • -
    • macros: object. A collection of custom macros. The easy way to create them is via a preamble, noted just above. Alternatively, you can provide a set of key-value pairs in which each key is a new Temml function name and each value is the expansion of the macro. Example: macros: {"\\R": "\\mathbb{R}"}.

    • -
    • annotate: boolean. If true, Temml will include an <annotation> element that contains the input TeX string. (default: false)

    • -
    • wrap: ("tex" | "=" | "none"). A mode for soft line breaks in non-display mode math. The tex option sets a soft line break after every top-level relation and binary operator, per The TeXbook, page 173. The = option sets a soft line break before the second and subsequent top-level = signs. tex is the default.

      -

      Caveats: Soft line breaks work in Chromium and Firefox, but do not work in WebKit or Safari. Display mode math gets no soft line breaks. Annotated math gets no soft line breaks. If a writer sets a hard line break via \\ or \cr, then Temml will not set any soft line breaks in that expression.

    • -
    • leqno: boolean. If true, display math has \tags rendered on the left instead of the right, like \usepackage[leqno]{amsmath} in LaTeX. (default: false)

    • -
    • colorIsTextColor: boolean. In LaTeX, \color is a switch, but in early versions of MathJax and KaTeX, \color applied its color to a second argument, the way that LaTeX \textcolor works. Set option colorIsTextColor to true if you want \color to work like early MathJax or KaTeX. (default: false)

    • -
    • 'throwOnError': boolean. If true, Temml will throw parse errors to the console. If false, Temml will write the parse error to the output of the render() function. (default: false)

    • -
    • errorColor: string. A color string given in the format "#XXX" or "#XXXXXX". This option determines the color that unsupported commands and invalid LaTeX are rendered in. (default: #b22222)

    • -
    • maxSize: [number, number]. This provides a way to cap all user-specified sizes, e.g. in \rule{500em}{500em}. The first number is the cap in em units, which will be applied to user-specified relative units. The second number is the cap in CSS pt units, which will be applied to user-specified absolute units. The default is [Infinity, Infinity], which allows users to make elements and spaces arbitrarily large.

    • -
    • maxExpand: number. Limit the number of macro expansions to the specified number, to prevent e.g. infinite macro loops. (\edef expansion counts all expanded tokens.) If set to Infinity, the macro expander will try to fully expand as in LaTeX. (default: 1000)

    • -
    • strict: boolean. If false (similar to MathJax), allow features that make writing LaTeX convenient but are not actually supported by LaTeX. If true (LaTeX faithfulness mode), throw an error for any such transgressions. (default: false)

    • -
    • xml: boolean. If true, Temml will write a namespace into the <math> element. That namespace is xmlns="http://www.w3.org/1998/Math/MathML". Such a namespace is unnecessary for modern browsers but can be helpful for other user agents, such as Microsoft Word. (default: false)

    • -
    • trust: boolean or function (default: false). If false (do not trust input), prevent any commands like \includegraphics that could enable adverse behavior, rendering them instead in errorColor. If true (trust input), allow all such commands. Provide a custom function handler(context) to customize behavior depending on the context (command, arguments e.g. a URL, etc.). A list of possible contexts:

      -
      • {command: "\\url", url, protocol}
        where protocol is a lowercased string like "http" or "https" that appears before a colon, or "_relative" for relative URLs.

      • -
      • {command: "\\href", url, protocol}

      • -
      • {command: "\\includegraphics", url, protocol}

      • -
      • {command: "\\class", class}

      • -
      • {command: "\\id", id}

      • -
      • {command: "\\style", style}

      • -
      • {command: "\\data", attributes}

      -

      Here are some sample trust settings:

      -
      • Forbid specific command: trust: (context) => context.command !== '\\includegraphics'

      • -
      • Allow specific command: trust: (context) => context.command === '\\url'

      • -
      • Allow multiple specific commands: trust: (context) => ['\\url', '\\href'].includes(context.command)

      • -
      • Allow all commands with a specific protocol: trust: (context) => context.protocol === 'http'

      • -
      • Allow all commands with specific protocols: trust: (context) => ['http', 'https', '_relative'].includes(context.protocol)

      • -
      • Allow all commands but forbid specific protocol: trust: (context) => context.protocol !== 'file'

      • -
      • Allow certain commands with specific protocols: trust: (context) => ['\\url', '\\href'].includes(context.command) && ['http', 'https', '_relative'].includes(context.protocol)

    -

    Post Process

    -

    The postProcess function implements the AMS functions \ref and \label. It should be called outside of any loop.

    -

    The main Temml functions, temml.render and temml.renderToString, each operate on only one element at a time. In contrast, the postProcess function makes two passes through the entire document. If you choose not to support \ref, postProcess can be omitted.

    -

    If Temml is used server-side, \ref and \label are still implemented at runtime with client-side JavaScript. A small file, temmlPostProcess.js, is provided to be installed in place of temml.min.js. It exposes one function:

    -
    temml.postProcess(document.body)

    If you do not provide a runtime postProcess, everything in Temml will work except \ref.

    -

    If you use the auto-render extension, it includes the post-processor nuances.

    -

    Fonts

    -

    Temml has several different pre-written CSS files. You should use only one and by that choice, you also choose a math font. There are several math fonts available and each has different advantages.

    -

    Latin Modern will provide the best quality rendering. It is a clone of Computer Modern and so is very home-like for readers accustomed to LaTeX documents. For best results, you must also serve a small (10kb) Temml.woff2 file. Then you’ll get support for \mathscr{…} and you’ll get primes at the correct vertical alignment in Chrome and Edge.

    -

    Temml-Local.css is the light-weight option. It calls two fonts: Cambria Math, which comes pre-installed in Windows, or STIX TWO, which comes pre-installed in iOS and MacOS (as of Safari 16). It also needs to be augmented with Temml.woff2.

    -

    Sadly, this option has rendering issues. Chrome botches extensible arrows and it will fail to stretch the symbol on Windows. Android does not currently provide a font with a MATH table, so it has many problems.

    -

    Asana and Libertinus have some of the same rendering problems as Cambria Math, although Asana does contain its own roundhand glyphs.

    -

    Fira Math is a sans-serif math font.

    -

    Several other math fonts exist and you can try them out at Frédéric Wang’s Mathematical OpenType Fonts.

    -

    Where to find font files:

    - -

    If you want a different math font size, you can add a rule to your own page's CSS, like this example:

    -
    math { font-size: 125%; }

    Equation numbering

    -

    In order to place automatic equation numbering in certain AMS environments, Temml contains these CSS rules:

    -
    .tml-eqn::before {
    -  counter-increment: tmlEqnNo;
    -  content: "(" counter(tmlEqnNo) ")";
    -}
    -body { counter-reset: tmlEqnNo; }

    You can overwrite the content rule to produce customized equation numbers. For instance, if chapter three of your book is in its own html file, that file’s <head> could contain:

    -
    <style>
    -   .tml-eqn::before { content: "(3." counter(tmlEqnNo) ")"; }
    -</style>

    Then the automatic equation numbering in that chapter would look like: (3.1)

    -

    If your site does not render automatic numbering properly, check if your other CSS has overwritten the Temml counter-reset.

    -

    Extensions

    -

    More Temml functionality can be added via the following extensions:

    -
    • auto-render: Find and render all math in a running HTML page.

    • -
    • copy-tex: When users select and copy <math> elements, copies their LaTeX source to the clipboard

    • -
    • mhchem: Write beautiful chemical equations easily.

    • -
    • physics: Implement much of the LaTeX physics package.

    • -
    • texvc: Support functions used in wikimedia.

    -

    To install extensions for browser use, include the appropriate file from the contrib folder of the Temml repository. Then reference the file in the <head> of the HTML page. As in this mhchem example:

    -
      <head>
    -    ...
    -    <link rel="stylesheet" href="./Temml-Local.css">
    -    <script src="./temml.min.js"></script>
    -    <script src="./mhchem.min.js"></script>
    -  </head>

    The extension reference must come after the reference to temml.min.js.

    -

    For server-side use, just use temml.cjs or temml.mjs instead of temml.min.js. temml.cjs and temml.mjs both include mhchem, physics, and texvc.

    -

    Security

    -

    Any HTML generated by Temml should be safe from <script> or other code injection attacks.

    -

    A variety of options give finer control over the security of Temml with untrusted inputs; refer to Options for more details.

    -
    • maxSize can prevent large width/height visual affronts.

    • -
    • maxExpand can prevent infinite macro loop attacks.

    • -
    • trust can allow certain commands that may load external resources or change HTML attributes and thus are not always safe (e.g., \includegraphics or \class)

    -

    Browser Issues

    -

    If you are deciding whether to render math in MathML, know that all the major browser engines now support MathML. If you want to revel in the sight of over a thousand LaTeX functions rendered well in MathML, head on over to the Temml function support page.

    -

    The rest of you, stay here. This section identifies functions that browsers render poorly.

    - - - - - - - - - - - - - - - - - -
    ItemChromiumGecko
    (Firefox)
    WebKit
    (Safari)
    Examples
    Renders well on first paintbad¹E^ABCD
    Accentsbad²𝖺^
    Integral, ∫, in display modemeh³x2
    \left( x \right)meh⁴meh⁴(x)
    \bigg(, \Bigg(, etc.meh⁵

    (2x2+2y2)

    \cancel, \bcancel, \xcancelmeh⁶meh⁶meh⁶5
    Tag placementpoor⁷

    x(tag)

    \mathllap, \mathrlapbad⁸=//
    Extensible arrowspoor⁹bad9, 10AnoteB
    Radical heightmeh¹¹meh¹¹fc
    Size 4 radicalsmeh¹²
    Line-breakingbad¹³
    mhchem subscriptsbad¹⁴H2O
    -

    Notes:

    -
    1. There are several items that WebKit places correctly only after a page refresh, or sometimes only after a back-button navigation.

    2. -
    3. WebKit renders some accents too high even after a page refresh. Temml does some work to mitigate this. It’s not enough.+ accent height

    4. -
    5. Chromium does not stretch a Cambria Math ∫ in display mode. Latin Modern is okay.+ accent italic correction

    6. -
    7. Chromium and WebKit mis+ extensible accents

    8. -
    9. Chromium sets + extensible arrows

    10. -
    11. Because Chromium does not support + height of ‖ in {Vmatrix} environment <enclose>, Temml uses background images for \cancel. It may not print properly.

    12. -
    13. WebKit mis-locates tags and AMS automatic equation numbers because it ignores width: 100% on an <mtable>.

    14. -
    15. WebKit laps are broken.

    16. -
    17. Chromium and WebKit system font extensible arrows have notes placed too high. Some do not stretch in Cambria Math. Again, Latin Modern is okay.

    18. -
    19. WebKit fails to stretch most extensible arrows.

    20. -
    21. Firefox and WebKit sometimes select radicals that are too tall. (Root cause: They don’t cramp subscripts and superscripts.)

    22. -
    23. In very tall radicals, Chromium does not accurately match the vinculum to the surd.

    24. -
    25. Automatic linebreaking (non-display mode) works in Chromium and Firefox. Not in WebKit.

    26. -
    27. WebKit hides mhchem subscripts and superscripts.

    -

    Another issue if you are targeting mobile: Android has not provided a math system font. They are planning to add a MATH table to the Noto Sans font. I don’t think it has shipped.

    -

    You can suggest revisions to this page at the Temml issues page.

    -
    -

    Copyright © 2021-2024 Ron Kok. Released under the MIT License

    -
    -
    - - - - diff --git a/site/docs/en/comparison.html b/site/docs/en/comparison.html deleted file mode 100644 index 21d4943d..00000000 --- a/site/docs/en/comparison.html +++ /dev/null @@ -1,10466 +0,0 @@ - - - - - Comparison of TeX Coverage - - - - - - - - - - -
    - -

    Foreword

    - -

    This page compares the MathML output from four TeX-to-MathML conversion libraries. You should use Firefox or Safari to view this page because they can render the MathML today. MathML will be viewable in Chrome and Edge soon.

    - -

    MathJax and KaTeX of course also render math in other formats. This comparison is limited to MathML.

    - -

    Versions used are: Temml 0.10.24, MathJax 2.7.5, KaTeX 0.13.9, and TeXZilla 1.0.2.0

    - -

    Symbols

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Symbol/FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
    +a+b\(a+b\)a+ba+ba+ba+ba+b
    -ab\(a-b\)aba-baba-ba-b
    !n!\(n!\)n!n!n!n!n!
    \!ab\(a\!b\)a ⁣ba\!baba\!ba\!b
    #y2\(\def\bar#1{#1^2} \bar{y}\)y2\def\bar#1{#1^2} \bar{y}Not supported\def\bar#1{#1^2} \bar{y}
    \##\(\#\)#\##\#
    %\(%a comment\)%a commentNot supported%a comment
    \%%\(\%\)%\%%\%
    &abcd\(\begin{matrix} a & b\\ c & d \end{matrix}\)abcd\begin{matrix} a & b\\ c & d \end{matrix}abcd\begin{matrix} a & b\\ c & d \end{matrix}\begin{matrix}
       a & b \\
       c & d
    \end{matrix}
    \&&\(\&\)&\&&\&
    '\('\)'Not supported
    \'aˊNot supportedaˊ\text{\'{a}}Not supported\text{\'{a}}
    ((\((\)((((
    ))\()\)))))
    \a b\(a\ b\)a ba\ bNot supporteda\ b
    \"a¨Not supporteda¨\text{\"{a}}Not supported\text{\"{a}}
    \$$Not supported$\text{\textdollar}Not supported
    \,ab\(a\,\,{b}\)aba\,\,{b}aba\,\,{b}a\,\,{b}
    \.a˙Not supporteda˙\text{\.{a}}Not supported\text{\.{a}}
    \:ab\(a\:\:{b}\)aba\:\:{b}aba\:\:{b}a\:\:{b}
    \;ab\(a\;\;{b}\)a    ba\;\;{b}aba\;\;{b}aa\;\;{b}
    _xi\(x_i\)xix_ixix_ix_i
    \__\(\_\)_\_Not supported
    \`aˊNot supportedaˊ\text{\'{a}}Not supported\text{\'{a}}
    <<\(<\)<<<<
    \=aˉNot supportedaˉ\text{\={a}}Not supported\text{\={a}}
    >>\( > \)>>>>
    \>ab\(a\>\>{b}\)aba\>\>{b}Not supporteda\>\>{b}
    [[\([\)[[[[
    ]]\(]\)]]]]
    {a\({a}\)a{a}a{a}{a}
    }a\({a}\)a{a}a{a}{a}
    \{{\(\{\){\{{\{
    \}}\(\}\)}\}}\}
    ||\(|\)|||
    \|\(\|\)\|\|
    ~no break\(\text{no~break}\)no break\text{no~break}Not supported\text{no~break}
    \~a˜Not supporteda˜\text{\~{a}}Not supported\text{\~{a}}
    \\abcd\(\begin{matrix} a & b\\ c & d\end{matrix}\)abcd\begin{matrix} a & b\\ c & d\end{matrix}abcd\begin{matrix} a & b\\ c & d\end{matrix}\begin{matrix}
       a & b \\
       c & d
    \end{matrix}
    \\xy\(x \\ y\)xyx \\ yNot supportedx \\ y
    ^xi\(x^i\)xix^ixix^ix^i
    \^aˆNot supportedaˆ\text{\^{a}}Not supported\text{\^{a}}
    special fraction1³⁄₄\(1\kern2mu \text{³⁄₄}\)1³⁄₄1\kern2mu \text{³⁄₄}Not supported1\kern2mu \text{³⁄₄}
    - -

    A

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
    \AANot supportedA˚\text{\AA}Not supported\text{\AA}
    \aaa˚Not supporteda˚\text{\aa}Not supported\text{\aa}
    \aboveab+1\({a \above{2pt} b+1}\)ab+1{a \above{2pt} b+1}Not supported{a \above{2pt} b+1}
    \abovewithdelimsNot supported\(a+1 \abovewithdelims [ ] 1pt b\)Not supportedNot supporteda+1 \abovewithdelims [ ] 1pt b
    \acuteeˊ\(\acute e\)eˊ\acute eNot supported\acute e
    \AEÆNot supportedÆ\text{\AE}Not supported\text{\AE}
    \aeæNot supportedæ\text{\ae}Not supported\text{\ae}
    \alef\(\alef\)\alefNot supported
    \alefsym\(\alefsym\)\alefsymNot supported
    \aleph\(\aleph\)\aleph\aleph
    {align}a=b+cd+e=f\[\begin{align}a &=b+c\\d+e&=f\end{align}\]a=b+cd+e=f\begin{align}a &=b+c\\d+e&=f\end{align}Not supported\begin{align}
       a&=b+c \\
       d+e&=f
    \end{align}
    {align*}a=b+cd+e=f\[\begin{align*}a &=b+c\\d+e&=f\end{align*}\]a=b+cd+e=f\begin{align*}a &=b+c\\d+e&=f\end{align*}Not supported\begin{align*}
       a&=b+c \\
       d+e&=f
    \end{align*}
    {aligned}x=ya=b+cx=ya=b\(\begin{aligned}x&=y & a&=b+c\\x'&=y' & a'&=b'\end{aligned}\)x=ya=b+cx=ya=b\begin{aligned}x&=y & a&=b+c\\x'&=y' & a'&=b'\end{aligned}x=ya=b+cx=ya=b\begin{aligned}x&=y & a&=b+c\\x'&=y' & a'&=b'\end{aligned}\begin{aligned}
    x&=y & a&=b+c\\
    x'&=y' & a'&=b'
    \end{aligned}
    {alignat}10x+3y=23x+13y=4\[\begin{alignat}{2}10&x+&3&y=2\\3&x+&13&y=4\end{alignat}\]10x+3y=23x+13y=4\begin{alignat}{2}10&x+&3&y=2\\3&x+&13&y=4\end{alignat}Not supported
    {alignat*}10x+3y=23x+13y=4\[\begin{alignat*}{2}10&x+&3&y=2\\3&x+&13&y=4\end{alignat*}\]10x+3y=23x+13y=4\begin{alignat*}{2}10&x+&3&y=2\\3&x+&13&y=4\end{alignat*}Not supported
    {alignedat}10x+3y=23x+13y=4\(\begin{alignedat}{2}10&x+&3&y=2\\3&x+&13&y=4\end{alignedat}\)10x+3y=23x+13y=4\begin{alignedat}{2}10&x+&3&y=2\\3&x+&13&y=4\end{alignedat}Not supported\begin{alignedat}{2}
       10&x+ &3&y = 2 \\
       3&x+&13&y = 4
    \end{alignedat}
    \allowbreakSupportedNot supportedNot supportedNot supported
    \AlphaΑ\(\Alpha\)A\AlphaΑ\Alpha
    \alphaα\(\alpha\)α\alphaα\alpha
    \amalg⨿\(\amalg\)⨿\amalg⨿\amalg
    \And&\(\And\)&\AndNot supported
    \andNot supported\(\and\)Not supportedNot supportedDeprecated
    \angNot supported\(\ang\)Not supportedNot supportedDeprecated
    \anglanNot supported
    See \enclose
    ana_{\angl n}Not supporteda_{\angl n}
    \angle\(\angle\)\angle\angle
    \anglnanNot supported
    See \enclose
    ana_\anglnNot supporteda_\angln
    \AngstromNot supportedNot supportedNot supported\Angstrom
    \approx\(\approx\)\approx\approx
    \approxeq\(\approxeq\)\approxeq\approxeq
    \arccosarccosx\(\arccos x\)arccosx\arccos xarccosx\arccos x
    \arcctgarcctgxNot supportedarcctgx\arcctg xNot supported
    \arcsinarcsinx\(\arcsin x\)arcsinx\arcsin xarcsinx\arcsin x
    \arctanarctanx\(\arctan x\)arctanx\arctan xarctanx\arctan x
    \arctgarctgxNot supportedarctgx\arctg xNot supported
    \argarg\(\arg\)arg\argarg\arg
    \argmaxarg maxxarg maxyxarg maxyxNot supportedarg maxxarg maxyxarg maxyx\begin{matrix}\argmax x \\ \argmax_y x \\\argmax\limits_y x\end{matrix}Not supported
    \argminarg minNot supportedarg min\argminNot supported
    {array}abcd\(\begin{array}{cc}a&b\\c&d\end{array}\)abcd\begin{array}{cc}a&b\\c&d\end{array}abcd\begin{array}{cc}a&b\\c&d\end{array}\begin{array}{cc}
       a & b \\
       c & d
    \end{array}
    {array}
    with lines
    abcdefghi\(\begin{array}{c|c:c}a & b & c \\ \hline d & e & f \\ \hdashline g & h & i\end{array}\)abcdefghi\begin{array}{c|c:c}a & b & c \\ \hline d & e & f \\ \hdashline g & h & i\end{array}Not supported\begin{array}{c|c:c}
    a & b & c \\ \hline
    d & e & f\\
    \hdashline g & h & i
    \end{array}
    \arrayNot supported\(\array{ a & b+1 \\ c+1 & d }\)Not supportedab+1c+1d\array{ a & b+1 \\ c+1 & d }\array{ a & b+1 \\ c+1 & d }
    \arraystretchNot supported\(\def\arraystretch{1.5}\begin{array}{cc}a&b\\c&d\end{array}\)abcd\def\arraystretch{1.5}\begin{array}{cc}a&b\\c&d\end{array}Not supported\def\arraystretch{1.5}
    \begin{array}{cc}
       a & b \\
       c & d
    \end{array}
    \ArrowvertNot supported\(\Arrowvert\)Not supportedNot supported
    \arrowvertNot supported\(\arrowvert\)Not supportedNot supported
    \ast\(\ast\)\ast\ast
    \astrosunNot supportedNot supportedNot supported
    \asymp\(\asymp\)\asymp\asymp
    \atopab\({a \atop b}\)ab{a \atop b}ab{a \atop b}{a \atop b}
    \atopwithdelimsNot supported\(a \atopwithdelims [ ] b\)Not supportedNot supporteda \atopwithdelims [ ] b
    - -

    B

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
    \backepsilon\(\backepsilon\)\backepsilon϶\backepsilon
    \backprime\(\backprime\)\backprimeNot supported
    \backdprimeNot supportedNot supportedNot supported
    \backtrprimeNot supportedNot supportedNot supported
    \backsim\(\backsim\)\backsim\backsim
    \backsimeq\(\backsimeq\)\backsimeq\backsimeq
    \backslash\\(\backslash\)\\backslash\\backslash
    \ballotxNot supportedNot supportedNot supported
    \bary\(\bar{y}\)y2\bar{y}y¯\bar{y}\bar{y}
    \barcapNot supportedNot supportedNot supported
    \barcupNot supportedNot supportedNot supported
    \barveeNot supportedNot supportedNot supported
    \barwedge\(\barwedge\)\barwedge\barwedge
    \Bbb𝔸𝔹\(\Bbb{ABC}\)ABC\Bbb{ABC}Not supported\Bbb{ABC}
    \Bbbk𝕜\(\Bbbk\)k\BbbkNot supported
    \bboxNot supportedRequires extensionNot supportedNot supported
    \bcancel5\(\bcancel{5}\)5\bcancel{5}Not supported\bcancel{5}
    \because\(\because\)\because\because
    \beginabcd\(\begin{matrix} a & b\\ c & d\end{matrix}\)abcd\begin{matrix} a & b\\ c & d\end{matrix}abcd\begin{matrix} a & b\\ c & d\end{matrix}\begin{matrix}
       a & b \\
       c & d
    \end{matrix}
    \begingroupa\(\begingroup a \endgroup\)a\begingroup a \endgroupNot supported\begingroup a\endgroup
    \BetaΒ\(\Beta\)B\BetaΒ\Beta
    \betaβ\(\beta\)β\betaβ\beta
    \beth\(\beth\)\beth\beth
    \between\(\between\)\between\between
    \bf𝐀𝐚𝐁𝐛𝟏𝟐\(\bf AaBb12\)AaBb12\bf AaBb12Not supported\bf AaBb12
    \big()\(\big(\big)\)()\big(\big)()\big(\big)\big(\big)
    \Big()\(\Big(\Big)\)()\Big(\Big)()\Big(\Big)\Big(\Big)
    \bigcap0nx0nx\(\bigcap_0^n x \; \displaystyle \bigcap_0^n x\)0nx  0nx\bigcap_0^n x \; \displaystyle \bigcap_0^n x\bigcap
    \bigcirc\(\bigcirc\)\bigcirc\bigcirc
    \bigcup0nx0nx\(\bigcup_0^n x \; \displaystyle \bigcup_0^n x\)0nx  0nx\bigcup_0^n x \; \displaystyle \bigcup_0^n x\bigcup
    \bigg()\(\bigg(\bigg)\)()\bigg(\bigg)()\bigg(\bigg)\bigg(\bigg)
    \Bigg()\(\Bigg(\Bigg)\)()\Bigg(\Bigg)()\Bigg(\Bigg)\Bigg(\Bigg)
    \biggl(\(\biggl(\)(\biggl((\biggl(\biggl(
    \Biggl(\(\Biggl(\)(\Biggl((\Biggl(\Biggl(
    \biggm|\(\biggm\vert\)\biggm\vertNot supported\biggm\vert
    \Biggm|\(\Biggm\vert\)\Biggm\vertNot supported\Biggm\vert
    \biggr)\(\biggr)\))\biggr))\biggr)\biggr)
    \Biggr)\(\Biggr)\))\Biggr))\Biggr)\Biggr)
    \bigl(\(\bigl(\)(\bigl((\bigl(\bigl(
    \Bigl(\(\Bigl(\)(\Bigl((\Bigl(\Bigl(
    \bigm|\(\bigm\vert\)\bigm\vertNot supported\bigm\vert
    \Bigm|\(\Bigm\vert\)\Bigm\vertNot supported\Bigm\vert
    \bigodot0nx0nx\(\bigodot_0^n x \; \displaystyle \bigodot_0^n x\)0nx  0nx\bigodot_0^n x \; \displaystyle \bigodot_0^n x\bigodot
    \bigominusNot supportedNot supportedNot supportedNot supported
    \bigoplus0nx0nx\(\bigoplus_0^n x \; \displaystyle \bigoplus_0^n x\)0nx  0nx\bigoplus_0^n x \; \displaystyle \bigoplus_0^n x\bigoplus
    \bigoslashNot supportedNot supportedNot supportedNot supported
    \bigotimes0nx0nx\(\bigotimes_0^n x \; \displaystyle \bigotimes_0^n x\)0nx  0nx\bigotimes_0^n x \; \displaystyle \bigotimes_0^n x\bigotimes
    \bigr)\(\bigr)\))\bigr))\bigr)\bigr)
    \Bigr)\(\Bigr)\))\Bigr))\Bigr)\Bigr)
    \bigtimesNot supportedNot supported\bigtimes
    \bigsqcapNot supportedNot supportedNot supported\bigsqcap
    \bigsqcup0nx0nx\(\bigsqcup_0^n x \; \displaystyle \bigsqcup_0^n x\)0nx  0nx\bigsqcup_0^n x \; \displaystyle \bigsqcup_0^n x\bigsqcup
    \bigstar\(\bigstar\)\bigstar\bigstar
    \bigtriangledown\(\bigtriangledown\)\bigtriangledown\bigtriangledown
    \bigtriangleup\(\bigtriangleup\)\bigtriangleup\bigtriangleup
    \biguplus0nx0nx\(\biguplus_0^n x \; \displaystyle \biguplus_0^n x\)0nx  0nx\biguplus_0^n x \; \displaystyle \biguplus_0^n x\biguplus
    \bigvee0nx0nx\(\bigvee_0^n x \; \displaystyle \bigvee_0^n x\)0nx  0nx\bigvee_0^n x \; \displaystyle \bigvee_0^n x\bigvee
    \bigwedge0nx0nx\(\bigwedge_0^n x \; \displaystyle \bigwedge_0^n x\)0nx  0nx\bigwedge_0^n x \; \displaystyle \bigwedge_0^n x\bigwedge
    \binom(nk)\(\binom n k\)(nk)\binom n k(nk)\binom n k\binom n k
    \blackhourglassNot supportedNot supportedNot supported
    \blacklozenge\(\blacklozenge\)\blacklozenge\blacklozenge
    \blacksquare\(\blacksquare\)\blacksquare\blacksquare
    \blacktriangle\(\blacktriangle\)\blacktriangle\blacktriangle
    \blacktriangledown\(\blacktriangledown\)\blacktriangledown\blacktriangledown
    \blacktriangleleft\(\blacktriangleleft\)\blacktriangleleft\blacktriangleleft
    \blacktriangleright\(\blacktriangleright\)\blacktriangleright\blacktriangleright
    \bm𝑨𝒂𝑩𝒃Not supportedAaBb\bm{AaBb}Not supported\bm{AaBb}
    {Bmatrix}{abcd}\(\begin{Bmatrix}a&b\\c&d\end{Bmatrix}\){abcd}\begin{Bmatrix}a&b\\c&d\end{Bmatrix}{abcd}\begin{Bmatrix}a&b\\c&d\end{Bmatrix}\begin{Bmatrix}
       a & b \\
       c & d
    \end{Bmatrix}
    {bmatrix}[abcd]\(\begin{bmatrix}a&b\\c&d\end{bmatrix}\)[abcd]\begin{bmatrix}a&b\\c&d\end{bmatrix}[abcd]\begin{bmatrix}a&b\\c&d\end{bmatrix}\begin{bmatrix}
       a & b \\
       c & d
    \end{bmatrix}
    \bmodamodb\(a \bmod b\)amodba \bmod bNot supporteda \bmod b
    \bold𝐀𝐚𝐁𝐛𝟏𝟐𝟑\(\bold{AaBb123}\)AaBb123\bold{AaBb123}Not supported\bold{AaBb123}
    \boldsymbol𝑨𝒂𝑩𝒃0\(\boldsymbol{AaBb0}\)AaBb0\boldsymbol{AaBb0}𝐀𝐚𝐁𝐛𝟎\boldsymbol{AaBb0}\boldsymbol{AaBb0}
    \bot\(\bot\)\bot\bot
    \BotNot supportedNot supportedNot supported
    \bowtie\(\bowtie\)\bowtie\bowtie
    \Box\(\Box\)\Box\Box
    \boxastNot supportedNot supportedNot supported
    \boxboxNot supportedNot supportedNot supported
    \boxcircleNot supportedNot supportedNot supported
    \boxdot\(\boxdot\)\boxdot\boxdot
    \boxedab\(\boxed{ab}\)ab\boxed{ab}ab\boxed{ab}\boxed{ab}
    \boxminus\(\boxminus\)\boxminus\boxminus
    \boxplus\(\boxplus\)\boxplus\boxplus
    \boxtimes\(\boxtimes\)\boxtimes\boxtimes
    \Braψ|Requires extensionψ\Bra{\psi}Not supported\Bra{\psi}
    \braψ|Requires extensionψ\bra{\psi}Not supported\bra{\psi}
    \brace{nk}\({n\brace k}\){nk}{n\brace k}Not supported{n\brace k}
    \brack[nk]\({n\brack k}\)[nk]{n\brack k}Not supported{n\brack k}
    \braketϕ|ψNot supportedϕψ\braket{\phi|\psi}Not supported\braket{\phi|\psi}
    \Braketϕ|2t2|ψRequires extenstionNot supportedNot supported\Braket{ϕ|\frac{∂^2}{∂ t^2}|ψ}
    \breveeu˘\(\breve{eu}\)eu˘\breve{eu}Not supported\breve{eu}
    \buildrelNot supported\(\buildrel \rm def \over {:=}\)Not supportedNot supported\buildrel \rm def \over {:=}
    \bull\(\bull\)\bullNot supported
    \bullet\(\bullet\)\bullet\bullet
    \Bumpeq\(\Bumpeq\)\Bumpeq\Bumpeq
    \bumpeq\(\bumpeq\)\bumpeq\bumpeq
    - -

    C

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
    \CNot supported\(\C\)Not supportedNot supportedDeprecated
    \cc¸Not supportedNot supportedNot supported\text{\c{c}}
    \cal𝒜𝒞Not supportedABC\cal ABCNot supported\cal ABC
    \cancel5\(\cancel{5}\)5\cancel{5}Not supported\cancel{5}
    \canceltoNot supportedNot supportedNot supportedNot supported
    \Cap\(\Cap\)\Cap\Cap
    \cap\(\cap\)\cap\cap
    \capbarcupNot supportedNot supportedNot supported
    \capdotNot supportedNot supportedNot supported
    \capovercupNot supportedNot supportedNot supported
    {cases}{aif bcif d\(\begin{cases}a&\text{if }b\\c&\text{if }d\end{cases}\){aif bcif d\begin{cases}a&\text{if }b\\c&\text{if }d\end{cases}{aif bcif d\begin{cases}a&\text{if }b\\c&\text{if }d\end{cases}\begin{cases}
       a &\text{if } b \\
       c &\text{if } d
    \end{cases}
    \casesNot supported\(\cases{ x & \text{if } x\ge 0\\ -x & \text{if } x\lt 0}\)Not supportedNot supported\cases{x & \text{if } x\ge 0\\
    - -x & \text{if } x\lt 0} -
    {CD}AaBbcC=D\(\begin{CD} A @>a>> B\\@VbVV @AAcA \\ C @= D\end{CD}\)AaBbcC=D\begin{CD} A @>a>> B\\@VbVV @AAcA \\ C @= D\end{CD}Not supported
    \cdot\(\cdot\)\cdot\cdot
    \cdotp·\(\cdotp\)\cdotp·\cdotp
    \cdots\(\cdots\)\cdots\cdots
    \ceABC\(\ce{A\bond{~}B\bond{~-}C}\)Not supportedNot supported\ce{A\bond{~}B\bond{~-}C}
    Requires `mhchem` extension
    \ceeNot supported\(\cee{C6H5-CHO}\)Not supportedNot supportedDeprecated by mhchem
    \cent¢Not supportedNot supportedNot supported
    \centerdotab\(a\centerdot b\)aba\centerdot bNot supportedIn LaTeX, \centerdot is a small
    square on the baseline, not
    a centered dot.
    \cfNot supported\(\cf{C6H5-CHO}\)Not supportedNot supportedDeprecated by mhchem
    \cfrac21+21+21\(\cfrac{2}{1+\cfrac{2}{1+\cfrac{2}{1}}}\)21+21+21\cfrac{2}{1+\cfrac{2}{1+\cfrac{2}{1}}}Not supported\cfrac{2}{1+\cfrac{2}{1+\cfrac{2}{1}}}
    \charNot supported
    See \unicode
    \char"263aNot supported\char"263a
    \checkoeˇ\(\check{oe}\)oeˇ\check{oe}oeˇ\check{oe}\check{oe}
    \chchNot supportedch\chNot supported
    \checkmark\(\checkmark\)\checkmarkNot supported
    \ChiΧ\(\Chi\)X\ChiNot supported
    \chiχ\(\chi\)χ\chiχ\chi
    \choose(n+1k+2)\({n+1 \choose k+2}\)(n+1k+2){n+1 \choose k+2}(n+1k+2){n+1 \choose k+2}{n+1 \choose k+2}
    \circ\(\circ\)\circ\circ
    \circeq\(\circeq\)\circeq\circeq
    \circlearrowleft\(\circlearrowleft\)\circlearrowleft\circlearrowleft
    \circlearrowright\(\circlearrowright\)\circlearrowright\circlearrowright
    \circledast\(\circledast\)\circledast\circledast
    \circledcirc\(\circledcirc\)\circledcirc\circledcirc
    \circleddash\(\circleddash\)\circleddash\circleddash
    \circledequalNot supportedNot supportedNot supported
    \circledparallelNot supportedNot supportedNot supported
    \circledR®\(\circledR\)®\circledRNot supported
    \circledS\(\circledS\)\circledSNot supported
    \circledvertNot supportedNot supportedNot supported
    \circlehbarNot supportedNot supportedNot supported
    \classabcdefghNot supportedNot supportedNot supportedab\class{mathHighlight}{cdef}gh
    \clineNot supportedNot supportedNot supportedNot supported
    \closedvarcapNot supportedNot supportedNot supported
    \closedvarcupNot supportedNot supportedNot supported
    \clubs\(\clubs\)\clubsNot supported
    \clubsuit\(\clubsuit\)\clubsuit\clubsuit
    \cnums\(\cnums\)C\cnumsNot supported
    \cohNot supportedNot supportedNot supported
    \colon:\(\colon\) ⁣:\colon:\colon
    \Colonapprox∷≈Not supported\Colonapprox∷≈\Colonapprox
    \colonapprox:Not supported:\colonapprox∶≈\colonapprox
    \Coloneq∷−Not supported\Coloneq∷−\Coloneq
    \coloneq:Not supported:\coloneq\coloneq
    \ColoneqqNot supported=\Coloneqq\Coloneqq
    \coloneqqabNot supportedaba \coloneqq baba \coloneqq b
    \Colonsim:Not supported\Colonsim∷∼\Colonsim
    \colonsim:Not supported:\colonsim∶∼\colonsim
    \colorAaBb123\(\color{#0000FF} AaBb123\)AaBb123\color{#0000FF} AaBb123AaBb123\color{#0000FF} AaBb123\color{#0000FF} AaBb123
    \colorboxBlack on red\(\colorbox{red}{Black on red}\)Black on red\colorbox{red}{Black on red}Not supported\colorbox{red}{Black on red}
    \complement\(\complement\)\complement\complement
    \Complex\(\Complex\)C\ComplexNot supported
    \concavediamondNot supportedNot supportedNot supported
    \concavediamondtickleftNot supportedNot supportedNot supported
    \concavediamondtickrightNot supportedNot supportedNot supported
    \cong\(\cong\)\cong\cong
    \CoppaϘNot supportedNot supportedNot supported
    \coppaϙNot supportedNot supportedNot supported
    \coprod0nx0nx\(\coprod_0^n x \; \displaystyle \coprod_0^n x\)0nx  0nx\coprod_0^n x \; \displaystyle \coprod_0^n x\coprod
    \copyright©Not supported©\copyrightNot supported
    \coscosx\(\cos x\)cosx\cos xcosx\cos x
    \coseccosecxNot supportedcosecx\cosec xNot supported
    \coshcoshx\(\cosh x\)coshx\cosh xcoshx\cosh x
    \cotcotx\(\cot x\)cotx\cot xcotx\cot x
    \cotgcotgxNot supportedcotgx\cotg xNot supported
    \cothcothx\(\coth x\)cothx\coth xcothx\coth x
    \crabcd\(\begin{matrix} a & b\\ c & d \end{matrix}\)abcd\begin{matrix} a & b\\ c & d \end{matrix}abcd\begin{matrix} a & b\\ c & d \end{matrix}\begin{matrix}
       a & b \cr
       c & d
    \end{matrix}
    \csccscx\(\csc x\)cscx\csc xcscx\csc x
    \cssIdNot supportedNot supportedNot supported
    \ctgctgxNot supportedctgx\ctg xNot supported
    \cthcthxNot supportedcthx\cth xNot supported
    \Cup\(\Cup\)\Cup\Cup
    \cup\(\cup\)\cup\cup
    \cupovercapNot supportedNot supportedNot supported
    \curlyeqprec\(\curlyeqprec\)\curlyeqprec\curlyeqprec
    \curlyeqsucc\(\curlyeqsucc\)\curlyeqsucc\curlyeqsucc
    \curlyvee\(\curlyvee\)\curlyvee\curlyvee
    \curlywedge\(\curlywedge\)\curlywedge\curlywedge
    \curvearrowleft\(\curvearrowleft\)\curvearrowleft\curvearrowleft
    \curvearrowright\(\curvearrowright\)\curvearrowright\curvearrowright
    - -

    D

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
    \dagNot supported\dagNot supported
    \Dagger\(\Dagger\)\DaggerNot supported
    \dagger\(\dagger\)\dagger\dagger
    \daleth\(\daleth\)\daleth\daleth
    \Darr\(\Darr\)\DarrNot supported
    \dArr\(\dArr\)\dArrNot supported
    \darr\(\darr\)\darr\darr
    {darray}abcd\(\begin{array}{cc}a & b\\c & d\end{array}\)abcd\begin{array}{cc}a & b\\c & d\end{array}abcd\begin{array}{cc}a & b\\c & d\end{array}\begin{darray}{cc}
       a & b \\
       c & d
    \end{darray}
    \dashleftarrow\(\dashleftarrow\)\dashleftarrow\dashleftarrow
    \dashrightarrow\(\dashrightarrow\)\dashrightarrow\dashrightarrow
    \dashv\(\dashv\)\dashv\dashv
    \dbinom(nk)\(\dbinom n k\)(nk)\dbinom n kNot supported\dbinom n k
    \dblcolonNot supported\dblcolon\dblcolon
    {dcases}{aif bcif dNot supported{aif bcif d\begin{dcases}a&\text{if }b\\c&\text{if }d\end{dcases}Not supported\begin{dcases}
       a &\text{if } b \\
       c &\text{if } d
    \end{dcases}
    \ddagNot supported\ddagNot supported
    \ddagger\(\ddagger\)\ddagger\ddagger
    \ddddotx….Not supportedNot supportedx\ddddot x
    \dddotxNot supportedNot supportedx\dddot x
    \ddotx¨\(\ddot x\)x¨\ddot xẍ\ddot x\ddot x
    \ddots\(\ddots\)\ddots\ddots
    \DeclareMathOperatorNot supported\(\DeclareMathOperator - {\myOp}{myOp} - \myOp(x)\) - Not supportedNot supported
    \defx2+x2\(\def\foo{x^2} \foo + \foo\)x2+x2\def\foo{x^2} \foo + \fooNot supported\def\foo{x^2} \foo + \foo
    \definecolorF=maNot supportedNot supportedNot supported
    \degdegx\(\deg x\)degx\deg xdegx\deg x
    \degree°Not supported°\degree°\degree
    \deltaδ\(\delta\)δ\deltaδ\delta
    \DeltaΔ\(\Delta\)Δ\DeltaΔ\Delta
    \detdetxdetyxdetyx\(\begin{matrix}\det x \\ \det_y x \\\det\limits_y x\end{matrix}\)detxdetyxdetyx\begin{matrix}\det x \\ \det_y x \\\det\limits_y x\end{matrix}det\det
    \DigammaNot supported\(\Digamma\)Not supportedNot supported
    \digammaϝ\(\digamma\)ϝ\digammaϝ\digamma
    \dfraca1b1\(\dfrac{a-1}{b-1}\)a1b1\dfrac{a-1}{b-1}Not supported\dfrac{a-1}{b-1}
    \diagdown\(\diagdown\)\diagdownNot supported
    \diagup\(\diagup\)\diagupNot supported
    \diameterNot supportedNot supportedNot supported
    \Diamond\(\Diamond\)\Diamond\Diamond
    \diamond\(\diamond\)\diamond\diamond
    \diamonds\(\diamonds\)\diamondsNot supported
    \diamondsuit\(\diamondsuit\)\diamondsuit\diamondsuit
    \dimdimx\(\dim x\)dimx\dim xdimx\dim x
    \displaylinesNot supported\(\displaylines{a\\ a+b=c+d}\)Not supportedNot supported\displaylines{a\\ a+b=c+d}
    \displaystyle0n\(\displaystyle\sum_0^n\)0n\displaystyle\sum_0^n0n\displaystyle\sum_0^n\displaystyle\sum_0^n
    \div÷\(\div\)÷\div÷\div
    \divideontimes\(\divideontimes\)\divideontimes\divideontimes
    \doublebarveeNot supportedNot supportedNot supported
    \dotx˙\(\dot x\)x˙\dot xx˙\dot x\dot x
    \Doteq\(\Doteq\)\Doteq\Doteq
    \doteq\(\doteq\)\doteq\doteq
    \doteqdot\(\doteqdot\)\doteqdot\doteqdot
    \dotminusNot supportedNot supported\dotminus
    \dotplus\(\dotplus\)\dotplus\dotplus
    \dotsx1++xn\(x_1 + \dots + x_n\)x1++xnx_1 + \dots + x_nx1++xnx_1 + \dots + x_nx_1 + \dots + x_n
    \dotsbx1++xn\(x_1 +\dotsb + x_n\)x1++xnx_1 +\dotsb + x_nNot supportedx_1 +\dotsb + x_n
    \dotscx,,y\(x,\dotsc,y\)x,,yx,\dotsc,yNot supportedx,\dotsc,y
    \dotsiA1A2\(\int_{A_1}\int_{A_2}\dotsi\)A1A2 ⁣\int_{A_1}\int_{A_2}\dotsiNot supported\int_{A_1}\int_{A_2}\dotsi
    \dotsmx1x2xn\(x_1 x_2 \dotsm x_n\)x1x2xnx_1 x_2 \dotsm x_nNot supportedx_1 x_2 \dotsm x_n
    \dotso\(\dotso\)\dotsoNot supported
    \doublebarwedge\(\doublebarwedge\)\doublebarwedge\doublebarwedge
    \doublecap\(\doublecap\)\doublecapNot supported
    \doublecup\(\doublecup\)\doublecupNot supported
    \Downarrow\(\Downarrow\)\Downarrow\Downarrow
    \downarrow\(\downarrow\)\downarrow\downarrow
    \downdownarrows\(\downdownarrows\)\downdownarrows\downdownarrows
    \downharpoonleft\(\downharpoonleft\)\downharpoonleft\downharpoonleft
    \downharpoonright\(\downharpoonright\)\downharpoonright\downharpoonright
    \dprimeNot supportedNot supportedNot supported
    {drcases}aif bcif d}Not supportedaif bcif d}\begin{drcases}a&\text{if }b\\c&\text{if }d\end{drcases}Not supported\begin{drcases}
       a&\text{if }b\\
       c&\text{if }d
    \end{drcases}
    - -

    E

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
    \EarthNot supportedNot supportedNot supported
    \ell\(\ell\)\ell\ell
    \elseNot supportedNot supportedNot supportedNot supported
    \empty\(\empty\)\empty\empty
    \emptyset\(\emptyset\)\emptyset\emptyset
    \encloseNot supported
    See \angl
    \(\enclose{longdiv}{500}\)
    \(\enclose{actuarial}{500}\)
    \(\enclose{phasorangle}{500}\)
    Not supportedNot supported\enclose{longdiv}{500}
    \enclose{actuarial}{500}
    \enclose{phasorangle}{500}
    Non-standard
    \endabcd\(\begin{matrix} a & b\\ c & d\end{matrix}\)abcd\begin{matrix} a & b\\ c & d\end{matrix}abcd\begin{matrix} a & b\\ c & d\end{matrix}\begin{matrix}
       a & b \\
       c & d
    \end{matrix}
    \endgroupa\(\begingroup a \endgroup\)a\begingroup a \endgroupNot supported\begingroup a\endgroup
    \enspaceab\(a\enspace b\)aba\enspace bNot supporteda\enspace b
    \EpsilonΕ\(\Epsilon\)E\EpsilonNot supported
    \epsilonϵ\(\epsilon\)ϵ\epsilonϵ\epsilon
    \eqalignNot supported\(\eqalign{3x - 4y &= 5\\x + 7 &= -2y}\)Not supportedNot supported
    \eqalignnoNot supported\(\eqalignno{3x - 4y &= 5 &(\dagger) \\ x + 7 &= -2y &(\ddagger)\\ z &= 2}\)Not supportedNot supported
    \eqcirc\(\eqcirc\)\eqcirc\eqcirc
    \Eqcolon−∷Not supported\Eqcolon−∷\Eqcolon
    \eqcolonNot supported\eqcolon\eqcolon
    {equation}·𝐃=ρv·𝐁=0\[\begin{equation}\begin{split}∇·𝐃&=ρ_v \\∇·𝐁&=0\end{split}\end{equation}\]𝐃=ρv𝐁=0\begin{equation}\begin{split}∇·𝐃&=ρ_v \\∇·𝐁&=0\end{split}\end{equation}Not supported\begin{equation}
    \begin{split}
       ∇·𝐃&=ρ_v \\
       ∇·𝐁&=0
    \end{split}
    \end{equation}
    {equation*}·𝐃=ρv·𝐁=0\[\begin{equation*}\begin{split}∇·𝐃&=ρ_v \\∇·𝐁&=0\end{split}\end{equation*}\]𝐃=ρv𝐁=0\begin{equation*}\begin{split}∇·𝐃&=ρ_v \\∇·𝐁&=0\end{split}\end{equation*}Not supported
    {eqnarray}Not supported\(\begin{eqnarray} -y &=& (x-1)^2 \\ - &=& (x-1)(x-1) \\ - &=& x^2 - 2x + 1 -\end{eqnarray}\)Not supportedNot supported
    {eqnarray*}Not supported\(\begin{eqnarray*} -y &=& (x-1)^2 \\ - &=& (x-1)(x-1) \\ - &=& x^2 - 2x + 1 -\end{eqnarray*}\)Not supportedNot supported
    \Eqqcolon=∷Not supported=\Eqqcolon=∷\Eqqcolon
    \eqqcolonNot supported\eqqcolon\eqqcolon
    \eqrefNot supportedNot supportedNot supported
    \eqsim\(\eqsim\)\eqsim\eqsim
    \eqslantgtr\(\eqslantgtr\)\eqslantgtr\eqslantgtr
    \eqslantless\(\eqslantless\)\eqslantless\eqslantless
    \equiv\(\equiv\)\equiv\equiv
    \EtaΗ\(\Eta\)H\EtaΗ\Eta
    \etaη\(\eta\)η\etaη\eta
    \ethð\(\eth\)ð\ethð\eth
    \euro\(\euro\)Not supportedNot supported
    \exist\(\exist\)\existNot supported
    \exists\(\exists\)\exists\exists
    \expexpx\(\exp x\)expx\exp xexpx\exp x
    - -

    F

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
    \fallingdotseq\(\fallingdotseq\)\fallingdotseq\fallingdotseq
    \fboxHi there!\(\fbox{Hi there!}\)Hi there!\fbox{Hi there!}Not supported\fbox{Hi there!}
    \fcolorboxA\(\fcolorbox{red}{aqua}{A}\)A\fcolorbox{red}{aqua}{A}Not supported\fcolorbox{red}{aqua}{A}
    \femaleNot supportedNot supportedNot supported\female
    \fiNot supportedNot supportedNot supportedNot supported
    \Finv\(\Finv\)\FinvNot supported
    \flat\(\flat\)\flat\flat
    \footnotesizefootnotesizeNot supportedfootnotesize\footnotesize footnotesizeNot supported\footnotesize footnotesize
    \forall\(\forall\)\forall\forall
    \fullouterjoinNot supportedNot supportedNot supported
    \fraca+bc+d\(\frac{a+b}{c+d}\)a+bc+d\frac{a+b}{c+d}a+bc+d\frac{a+b}{c+d}\frac{a+b}{c+d}
    \frak𝔄𝔞𝔅𝔟\(\frak{AaBb}\)AaBb\frak{AaBb}Not supported\frak{AaBb}
    \frown\(\frown\)\frown\frown
    - -

    G

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
    \Game\(\Game\)\GameNot supported
    \GammaΓ\(\Gamma\)Γ\GammaΓ\Gamma
    \gammaγ\(\gamma\)γ\gammaγ\gamma
    {gather}a=be=b+c\(\begin{gather}a=b\\e=b+c\end{gather}\)a=be=b+c\begin{gather}a=b\\e=b+c\end{gather}Not supported\begin{gather}
       a=b \\
       e=b+c
    \end{gather}
    {gather*}a=be=b+c\(\begin{gather*}a=b\\e=b+c\end{gather*}\)a=be=b+c\begin{gather*}a=b\\e=b+c\end{gather*}Not supported\begin{gather*}
       a=b \\
       e=b+c
    \end{gather*}
    {gathered}a=be=b+c\(\begin{gathered}a=b\\e=b+c\end{gathered}\)a=be=b+c\begin{gathered}a=b\\e=b+c\end{gathered}a=be=b+c\begin{gathered}a=b\\e=b+c\end{gathered}\begin{gathered}
       a=b \\
       e=b+c
    \end{gathered}
    \gcdgcdxgcdyxgcdyx\(\begin{matrix}\gcd x \\ \gcd_y x \\\gcd\limits_y x\end{matrix}\)gcdxgcdyxgcdyx\begin{matrix}\gcd x \\ \gcd_y x \\\gcd\limits_y x\end{matrix}gcdxgcdyxgcdlimitsyx\begin{matrix}\gcd x \\ \gcd_y x \\\gcd\limits_y x\end{matrix}
    \gdefNot supportedNot supportedy2+y2\gdef\bar#1{#1^2} \bar{y} + \bar{y}Not supported\gdef\bar#1{#1^2} \bar{y} + \bar{y}
    \ge\(\ge\)\ge\ge
    \geneuroNot supported\(\geneuro\)Not supportedNot supported
    \geneuronarrowNot supported\(\geneuronarrow\)Not supportedNot supported
    \geneurowideNot supported\(\geneurowide\)Not supportedNot supported
    \genfrac(aa+1]\(\genfrac ( ] {2pt}{0}a{a+1}\)(aa+1]\genfrac ( ] {2pt}{0}a{a+1}Not supported\genfrac ( ] {2pt}{0}a{a+1}
    \geq\(\geq\)\geq\geq
    \geqq\(\geqq\)\geqq\geqq
    \geqslant\(\geqslant\)\geqslant\geqslant
    \gets\(\gets\)\getsNot supported
    \gg\(\gg\)\gg\gg
    \ggg\(\ggg\)\ggg\ggg
    \gggtr\(\gggtr\)\gggtrNot supported
    \gimel\(\gimel\)\gimel\gimel
    \globalNot supported\(\global\def\add#1#2{#1+#2} \add 2 3\)2+3\global\def\add#1#2{#1+#2} \add 2 3Not supported\global\def\add#1#2{#1+#2} \add 2 3
    \gnapprox\(\gnapprox\)\gnapprox\gnapprox
    \gneq\(\gneq\)\gneq\gneq
    \gneqq\(\gneqq\)\gneqq\gneqq
    \gnsim\(\gnsim\)\gnsim\gnsim
    \graveeu`\(\grave{eu}\)euˋ\grave{eu}Not supported\grave{eu}
    \gta>b\(a \gt b\)a>ba \gt ba>ba \gt ba \gt b
    \gtrdot\(\gtrdot\)\gtrdot\gtrdot
    \gtrapprox\(\gtrapprox\)\gtrapprox\gtrapprox
    \gtreqless\(\gtreqless\)\gtreqless\gtreqless
    \gtreqqless\(\gtreqqless\)\gtreqqless\gtreqqless
    \gtrless\(\gtrless\)\gtrless\gtrless
    \gtrsim\(\gtrsim\)\gtrsim\gtrsim
    \gvertneqq≩︀\(\gvertneqq\)\gvertneqq≩︀\gvertneqq
    - -

    H

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
    \Ha˝Not supporteda˝\text{\H{a}}Not supported\text{\H{a}}
    \Harr\(\Harr\)\HarrNot supported
    \hArrNot supported\hArrNot supported
    \harr\(\harr\)\harrNot supported
    \hatθ^\(\hat{\theta}\)θ^\hat{\theta}θ^\hat{\theta}\hat{\theta}
    \hbar\(\hbar\)\hbar\hbar
    \hboxin a box\(\hbox{in a box}\)in a box\hbox{in a box}Not supported\hbox{in a box}
    \hdashlineabcd\(\begin{matrix}a&b\\ \hdashline c &d\end{matrix}\)abcd\begin{matrix}a&b\\ \hdashline c &d\end{matrix}Not supported\begin{matrix}
       a & b \\
       \hdashline
       c & d
    \end{matrix}
    \hearts\(\hearts\)\heartsNot supported
    \heartsuit\(\heartsuit\)\heartsuit\heartsuit
    \hfilNot supportedSee \hfillNot supportedNot supported
    \hfillNot supported\(\begin{matrix}xxxxxx & xxxxxx & xxxxxx \\ ab & \hfil ab & ab\hfil\\ \end{matrix}\)Not supportedNot supported
    \hlineabcd\(\begin{matrix}a&b\\ \hline c &d\end{matrix}\)abcd\begin{matrix}a&b\\ \hline c &d\end{matrix}Not supported\begin{matrix}
       a & b \\ \hline
       c & d
    \end{matrix}
    \hourglassNot supportedNot supportedNot supported
    \homhomx\(\hom x\)homx\hom xhomx\hom x
    \hookleftarrow\(\hookleftarrow\)\hookleftarrow\hookleftarrow
    \hookrightarrow\(\hookrightarrow\)\hookrightarrow\hookrightarrow
    \hphantomabcd\(a\hphantom{bc}d\)abcda\hphantom{bc}dNot supporteda\hphantom{bc}d
    \hrefMathJax\(\href{https://MathJax.org/}{\text{MathJax}}\)MathJax\href{https://MathJax.org/}{\text{MathJax}}Not supported\href{https://www.mathjax.org/}{\text{MathJax}}
    \hskipwid\(w\hskip1em i\hskip2em d\)widw\hskip1em i\hskip2em dNot supportedw\hskip1em i\hskip2em d
    \hslash\(\hslash\)\hslash\hslash
    \hspaceNot supported\(s\hspace7ex k\)sks\hspace7ex kNot supporteds\hspace7ex k
    \htmlClassNot supportedNot supportedNot supportedNot supported\htmlClass{foo}{x}
    \htmlDataNot supportedNot supportedNot supportedNot supported\htmlData{foo=a, bar=b}{x}
    \htmlIdNot supportedNot supportedNot supportedNot supported\htmlId{bar}{x}
    \htmlStyleNot supportedNot supportedNot supportedNot supported\htmlStyle{color: red;}{x}}
    \hugehuge\(\huge huge\)huge\huge hugeNot supported\huge huge
    \HugeHuge\(\Huge Huge\)Huge\Huge HugeNot supported\Huge Huge
    - -

    I

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
    \iıNot supportedı\text{\i}Not supported\text{\i}
    \idotsintNot supportedNot supportedNot supported
    \iddotsNot supportedNot supportedNot supportedNot supported
    \ifNot supportedNot supportedNot supportedNot supported
    \iffAB\(A\iff B\)A    BA\iff BABA\iff BA\iff B
    \ifmodeNot supportedNot supportedNot supportedNot supported
    \ifxNot supportedNot supportedNot supportedNot supported
    \iiiintNot supportedNot supportedNot supportedNot supported
    \iiint0nx0nx\(\iiint_0^n x \; \displaystyle \iiint_0^n x\)0nx  0nx\iiint_0^n x \; \displaystyle \iiint_0^n x\iiint
    \iint0nx0nx\(\iint_0^n x \; \displaystyle \iint_0^n x\)0nx  0nx\iint_0^n x \; \displaystyle \iint_0^n x\iint
    \Im\(\Im\)\Im\Im
    \image\(\image\)\imageNot supported
    \imageofNot supported\imageofNot supported
    \imathı\(\imath\)ı\imathı\imath
    \impliedbyPQ\(P\impliedby Q\)P    QP\impliedby QPQP\impliedby QP\impliedby Q
    \impliesPQ\(P\implies Q\)P    QP\implies QPQP\implies QP\implies Q
    \in\(\in\)\in\in
    \includegraphicsKA logoNot supported\includegraphics[height=0.8em, totalheight=0.9em, width=0.9em, alt=KA logo]{https://cdn.kastatic.org/images/apple-touch-icon-57x57-precomposed.new.png}Not supported
    \incohNot supportedNot supportedNot supported
    \infinfxinfyxinfyx\(\begin{matrix}\inf x \\ \inf_y x \\\inf\limits_y x\end{matrix}\)infxinfyxinfyx\begin{matrix}\inf x \\ \inf_y x \\\inf\limits_y x\end{matrix}inf\inf
    \infin\(\infin\)\infinNot supported
    \infty\(\infty\)\infty\infty
    \injliminj limxinj limyxinj limyx\(\begin{matrix}\injlim x \\ \injlim_y x \\\injlim\limits_y x\end{matrix}\)inj limxinj limyxinj limyx\begin{matrix}\injlim x \\ \injlim_y x \\\injlim\limits_y x\end{matrix}Not supported\injlim x
    \injlim_y x
    \injlim\limits_y x
    \int0nx0nx\(\int_0^n x \; \displaystyle \int_0^n x\)0nx  0nx\int_0^n x \; \displaystyle \int_0^n x\int
    \intercal\(\intercal\)\intercal\intercal
    \interleaveNot supportedNot supportedNot supported
    \intop0nx0nx\(\intop_0^n x \; \displaystyle \intop_0^n x\)0nx  0nx\intop_0^n x \; \displaystyle \intop_0^n xNot supported
    \invampNot supportedNot supportedNot supported
    \invlazysNot supportedNot supportedNot supported
    \IotaΙ\(\Iota\)I\IotaΙ\Iota
    \iotaι\(\iota\)ι\iotaι\iota
    \isin\(\isin\)\isinNot supported
    \itAaBb\({\it AaBb}\)AaBb{\it AaBb}Not supported{\it AaBb}
    - -

    JK

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
    \jȷNot supportedȷ\text{\j}Not supported\text{\j}
    \jmathȷ\(\jmath\)ȷ\jmathȷ\jmath
    \Join\(\Join\)\JoinNot supported
    \KappaΚ\(\Kappa\)K\KappaΚ\Kappa
    \kappaκ\(\kappa\)κ\kappaκ\kappa
    \kerkerx\(\ker x\)kerx\ker xkerx\ker x
    \kernIR\(I\kern-2.5pt R\)IRI\kern-2.5pt RNot supportedI\kern-2.5pt R
    \Ket|ψRequires extensionψ\Ket{\psi}Not supported\Ket{\psi}
    \ket|ψRequires extensionψ\ket{\psi}Not supported\ket{\psi}
    \KoppaϞNot supportedNot supportedNot supported
    \koppaϟNot supportedNot supportedNot supported
    - -

    L

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
    \LNot supportedNot supportedNot supportedNot supported
    \lNot supportedNot supportedNot supportedNot supported
    \LambdaΛ\(\Lambda\)Λ\LambdaΛ\Lambda
    \lambdaλ\(\lambda\)λ\lambdaλ\lambda
    \labelSee {equation}SupportedNot supported
    \land\(\land\)\landNot supported
    \langA\(\lang A\rangle\)A\lang A\rangleA\lang A\rangle\lang A\rangle
    \lAngleANot supportedNot supportedNot supported\lAngle A\rAngle
    \langleA\(\langle A\rangle\)A\langle A\rangleA\langle A\rangle\langle A\rangle
    \Larr\(\Larr\)\LarrNot supported
    \lArr\(\lArr\)\lArrNot supported
    \larr\(\larr\)\larrNot supported
    \largelarge\(\large large\)large\large largeNot supported\large large
    \LargeLarge\(\Large Large\)Large\Large LargeNot supported\Large Large
    \LARGELARGE\(\LARGE LARGE\)LARGE\LARGE LARGENot supported\LARGE LARGE
    \LaTeXLATEX\(\LaTeX\)LaTeX\LaTeXNot supported
    \lBraceNot supported\lBraceNot supported
    \lbrace{\(\lbrace\){\lbrace{\lbrace
    \lbrack[\(\lbrack\)[\lbrack[\lbrack
    \lceil\(\lceil\)\lceil\lceil
    \lcroofNot supportedNot supportedNot supportedNot supportedSee \enclose
    \ldotp.\(\ldotp\).\ldotpNot supported
    \ldots\(\ldots\)\ldots\ldots
    \le\(\le\)\le\le
    \leadsto\(\leadsto\)\leadstoNot supported
    \left{ab\(\left\lbrace \frac ab \right.\){ab\left\lbrace \frac ab \right.{ab\left\lbrace \frac ab \right.\left\lbrace \frac ab \right.
    \leftarrow\(\leftarrow\)\leftarrow\leftarrow
    \Leftarrow\(\Leftarrow\)\Leftarrow\Leftarrow
    \leftarrowtail\(\leftarrowtail\)\leftarrowtail\leftarrowtail
    \leftharpoondown\(\leftharpoondown\)\leftharpoondown\leftharpoondown
    \leftharpoonup\(\leftharpoonup\)\leftharpoonup\leftharpoonup
    \leftleftarrows\(\leftleftarrows\)\leftleftarrows\leftleftarrows
    \leftmodelsNot supportedNot supportedNot supported
    \leftmoonNot supportedNot supportedNot supported
    \leftouterjoinNot supportedNot supportedNot supported
    \Leftrightarrow\(\Leftrightarrow\)\Leftrightarrow\Leftrightarrow
    \leftrightarrow\(\leftrightarrow\)\leftrightarrow\leftrightarrow
    \leftrightarrows\(\leftrightarrows\)\leftrightarrows\leftrightarrows
    \leftrightharpoons\(\leftrightharpoons\)\leftrightharpoons\leftrightharpoons
    \leftrightsquigarrow\(\leftrightsquigarrow\)\leftrightsquigarrow\leftrightsquigarrow
    \leftrootNot supported\(\sqrt[3\leftroot1]{x}\)Not supportedNot supported
    \leftthreetimes\(\leftthreetimes\)\leftthreetimes\leftthreetimes
    \leq\(\leq\)\leq\leq
    \leqalignnoNot supportedNot supportedNot supported
    \leqq\(\leqq\)\leqq\leqq
    \leqslant\(\leqslant\)\leqslant\leqslant
    \lessapprox\(\lessapprox\)\lessapprox\lessapprox
    \lessdot\(\lessdot\)\lessdot\lessdot
    \lesseqgtr\(\lesseqgtr\)\lesseqgtr\lesseqgtr
    \lesseqqgtr\(\lesseqqgtr\)\lesseqqgtr\lesseqqgtr
    \lessgtr\(\lessgtr\)\lessgtr\lessgtr
    \lesssim\(\lesssim\)\lesssim\lesssim
    \letNot supportedNot supportedNot supported
    \lfloor\(\lfloor\)\lfloor\lfloor
    \lglg\(\lg\)lg\lglg\lg
    \lgroup\(\lgroup\)\lgroupNot supported
    \lhd\(\lhd\)\lhd\lhd
    \limlimxlimyxlimyx\(\begin{matrix}\lim x \\ \lim_y x \\\lim\limits_y x\end{matrix}\)limxlimyxlimyx\begin{matrix}\lim x \\ \lim_y x \\\lim\limits_y x\end{matrix}limyx\lim_y x\lim x
    \lim_y x
    \lim\limits_y x
    \liminflim infxlim infyxlim infyx\(\begin{matrix}\liminf x \\ \liminf_y x \\\liminf\limits_y x\end{matrix}\)lim infxlim infyxlim infyx\begin{matrix}\liminf x \\ \liminf_y x \\\liminf\limits_y x\end{matrix}liminf\liminf
    \limitslimx\(\lim\limits_x\)limx\lim\limits_xNot supported\lim\limits_x
    \limsuplim supxlim supyxlim supyx\(\begin{matrix}\limsup x \\ \limsup_y x \\\limsup\limits_y x\end{matrix}\)lim supxlim supyxlim supyx\begin{matrix}\limsup x \\ \limsup_y x \\\limsup\limits_y x\end{matrix}limsup\limsup
    \ll\(\ll\)\ll\ll
    \llangleANot supportedNot supportedA\llangle A\rrangle\llangle A\rrangle
    \llap=//\({=}\llap{/\,}\)=/{=}\llap{/\,}Not supported{=}\llap{/\,}
    \llbracketNot supported\llbracketNot supported
    \llcornera\(\llcorner a \lrcorner\)a\llcorner a \lrcornerNot supported
    \Lleftarrow\(\Lleftarrow\)\Lleftarrow\Lleftarrow
    \lll\(\lll\)\lll\lll
    \llless\(\llless\)\lllessNot supported
    \llparenthesisNot supportedNot supportedNot supported
    \lmoustache\(\lmoustache\)\lmoustache\lmoustache
    \lnlnx\(\ln x\)lnx\ln xlnx\ln x
    \lnapprox\(\lnapprox\)\lnapprox\lnapprox
    \lneq\(\lneq\)\lneq\lneq
    \lneqq\(\lneqq\)\lneqq\lneqq
    \lnot¬\(\lnot\)¬\lnotNot supported
    \lnsim\(\lnsim\)\lnsim\lnsim
    \loglogxlogyxlogyx\(\begin{matrix}\log x \\ \log_y x \\ \log\limits_y x\end{matrix}\)logxlogyxlogyx\begin{matrix}\log x \\ \log_y x \\ \log\limits_y x\end{matrix}logxlogyxloglimitsyx\begin{matrix}\log x \\ \log_y x \\ \log\limits_y x\end{matrix}\log x
    \log_y x
    \log\limits_y x
    \Longleftarrow\(\Longleftarrow\)\Longleftarrow\Longleftarrow
    \longleftarrow\(\longleftarrow\)\longleftarrow\longleftarrow
    \Longleftrightarrow\(\Longleftrightarrow\)\Longleftrightarrow\Longleftrightarrow
    \longleftrightarrow\(\longleftrightarrow\)\longleftrightarrow\longleftrightarrow
    \longmapsto\(\longmapsto\)\longmapsto\longmapsto
    \Longrightarrow\(\Longrightarrow\)\Longrightarrow\Longrightarrow
    \longrightarrow\(\longrightarrow\)\longrightarrow\longrightarrow
    \looparrowleft\(\looparrowleft\)\looparrowleft\looparrowleft
    \looparrowright\(\looparrowright\)\looparrowright\looparrowright
    \lor\(\lor\)\lorNot supported
    \lowerlower\(l\lower 2pt{owe}r\)Not supportedNot supportedl\lower 2pt{owe}r
    \lozenge\(\lozenge\)\lozenge\lozenge
    \lozengeminusNot supportedNot supportedNot supported
    \lparen(Not supported(\lparenNot supported
    \Lrarr\(\Lrarr\)\LrarrNot supported
    \lrArr\(\lrArr\)\lrArrNot supported
    \lrarr\(\lrarr\)\lrarrNot supported
    \lrcorner\(\lrcorner\)\lrcornerNot supported
    \lqNot supported\lqNot supported
    \Lsh\(\Lsh\)\Lsh\Lsh
    \lt<\(\lt\)<\lt<\lt
    \ltimes\(\ltimes\)\ltimes\ltimes
    \lVert\(\lVert\)\lVertNot supported
    \lvert|\(\lvert\)\lvertNot supported
    \lvertneqq≨︀\(\lvertneqq\)\lvertneqq≨︀\lvertneqq
    - -

    M

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
    \maleNot supportedNot supportedNot supported\male
    \maltese\(\maltese\)\malteseNot supported
    \mapsfromNot supportedNot supportedNot supported
    \mapsto\(\mapsto\)\mapsto\mapsto
    \mathbb𝔸𝔹\(\mathbb{AB}\)AB\mathbb{AB}𝔸𝔹\mathbb{AB}\mathbb{AB}
    \mathbf𝐀𝐚𝐁𝐛𝟏𝟐𝟑\(\mathbf{AaBb123}\)AaBb123\mathbf{AaBb123}𝐀𝐚𝐁𝐛𝟏𝟐𝟑\mathbf{AaBb123}\mathbf{AaBb123}
    \mathbina!b\(a\mathbin{!}b\)a!ba\mathbin{!}ba!ba\mathbin{!}ba\mathbin{!}b
    \mathcal𝒜𝒶𝒷123\(\mathcal{AaBb123}\)AaBb123\mathcal{AaBb123}𝒜𝒶𝒷123\mathcal{AaBb123}\mathcal{AaBb123}
    \mathchoiceab\(a\mathchoice{\,}{\,\,}{\,\,\,}{\,\,\,\,}b\)aba\mathchoice{\,}{\,\,}{\,\,\,}{\,\,\,\,}bNot supporteda\mathchoice{\,}{\,\,}{\,\,\,}{\,\,\,\,}b
    \mathclap1inxiNot supported1inxi\displaystyle\sum_{\mathclap{1\le i\le n}} x_{i}1inxi\displaystyle\sum_{\mathclap{1\le i\le n}} x_{i}\sum_{\mathclap{1\le i\le n}} x_{i}
    \mathclosea+(b>+c\(a + (b\mathclose\gt + c\)a+(b>+ca + (b\mathclose\gt + cNot supporteda + (b\mathclose\gt + c
    \mathellipsisNot supported\mathellipsisNot supported
    \mathfrak𝔄𝔞𝔅𝔟\(\mathfrak{AaBb}\)AaBb\mathfrak{AaBb}𝔄𝔞𝔅𝔟\mathfrak{AaBb}\mathfrak{AaBb}
    \mathinnerabinsidecd\(ab\mathinner{\text{inside}}cd\)abinsidecdab\mathinner{\text{inside}}cdNot supportedab\mathinner{\text{inside}}cd
    \mathitAaBb\(\mathit{AaBb}\)AaBb\mathit{AaBb}𝐴𝑎𝐵𝑏\mathit{AaBb}\mathit{AaBb}
    \mathllap/=Not supported/={\mathrlap{\,/}{=}}/={\mathrlap{\,/}{=}}\mathrlap{\,/}{=}
    \mathnormalAaBbθNot supportedAaBbθ\mathnormal{AaBb\theta}Not supported\mathnormal{AaBb\theta}
    \mathopaxb\(a \mathop{x} b\)axba \mathop{x} baxba \mathop{x} ba \mathop{x} b
    \mathopena+<b)+c\(a + \mathopen\lt b) + c\)a+<b)+ca + \mathopen\lt b) + cNot supporteda + \mathopen\lt b) + c
    \mathord1,234,567\(1\mathord{,}234{,}567\)1,234,5671\mathord{,}234{,}567Not supported1\mathord{,}234{,}567
    \mathpunctAB\(A\mathpunct{-}B\)ABA\mathpunct{-}BNot supportedA\mathpunct{-}B
    \mathraiseboxNot supportedNot supportedNot supportedhigherh\mathraisebox{2pt}{ighe}r
    \mathrela#b\(a \mathrel{\#} b\)a#ba \mathrel{\#} ba#ba \mathrel{#} ba \mathrel{\#} b
    \mathrlap02πxdxNot supported02πxdx{\displaystyle \int_0^{\mathrlap{2\pi}} x \,\mathrm{d} x}02πxdx{\displaystyle \int_0^{\mathrlap{2\pi}} x \,\mathrm{d} x}\int_0^{\mathrlap{2\pi}} x\,\mathrm{d} x
    \mathringa˚\(\mathring{a}\)a˚\mathring{a}Not supported\mathring{a}
    \mathrmAaBb12θ\(\mathrm{AaBb12\theta}\)AaBb12θ\mathrm{AaBb12\theta}AaBb12θ\mathrm{AaBb12\theta}\mathrm{AaBb12\theta}
    \mathscr𝒜\(\mathscr{AB}\)AB\mathscr{AB}𝒜\mathscr{AB}\mathscr{AaBb123}
    \mathsf𝖠𝖺𝖡𝖻𝟣𝟤𝟥\(\mathsf{AaBb123}\)AaBb123\mathsf{AaBb123}𝖠𝖺𝖡𝖻𝟣𝟤𝟥\mathsf{AaBb123}\mathsf{AaBb123}
    \mathsterling£Not supported£\mathsterlingNot supported
    \mathstrut(α\(\sqrt{\mathstrut\alpha}\)(α\sqrt{\mathstrut\alpha}Not supported\sqrt{\mathstrut\alpha}
    \mathtipNot supportedNot supportedNot supportedNot supported\mathtip{a=b}{tip}s
    \mathtt𝙰𝚊𝙱𝚋𝟷𝟸𝟹\(\mathtt{AaBb123}\)AaBb123\mathtt{AaBb123}𝙰𝚊𝙱𝚋𝟷𝟸𝟹\mathtt{AaBb123}\mathtt{AaBb123}
    \matrixNot supported\(\matrix{a & b \\ c & d}\)Not supportedNot supported\matrix{a & b \\ c & d}
    {matrix}ABbABd\(\begin{matrix}\frac A B&b\\\frac A B&d\end{matrix}\)ABbABd\begin{matrix}\frac A B&b\\\frac A B&d\end{matrix}ABbABd\begin{matrix}\frac A B&b\\\frac A B&d\end{matrix}\begin{matrix}
       \frac A B & b \\
       \frac A B & d
    \end{matrix}
    \maxmaxxmaxyxmaxyx\(\begin{matrix}\max x \\ \max_y x \\\max\limits_y x\end{matrix}\)maxxmaxyxmaxyx\begin{matrix}\max x \\ \max_y x \\\max\limits_y x\end{matrix}max\max
    \mboxNot supported\(\mbox{in a box}\)Not supportedNot supported\mbox{in a box}
    \measuredangle\(\measuredangle\)\measuredangle\measuredangle
    \medspaceabNot supportedaba\medspace baba\medspace ba\medspace b
    \mho\(\mho\)\mho\mho
    \mid{x|x>0}\(\{x∈ℝ\mid x>0\}\){xRx>0}\{x∈ℝ\mid x > 0\}{xx>0}\{x∈ℝ\mid x>0\}\{x∈ℝ\mid x>0\}
    \middleP(A|B)\(P\left(A\middle\vert B\right)\)P(A|B)P\left(A\middle\vert B\right)Not supportedP\left(A\middle\vert B\right)
    \minminxminyxminyx\(\begin{matrix}\min x \\ \min_y x \\\min\limits_y x\end{matrix}\)minxminyxminyx\begin{matrix}\min x \\ \min_y x \\\min\limits_y x\end{matrix}min\min
    \minusdotNot supportedNot supportedNot supported
    \minusoNot supported
    See \standardstate
    Not supported\minusoNot supported
    \minusfdotsNot supportedNot supportedNot supported
    \minusrdotsNot supportedNot supportedNot supported
    \mitNot supported\(\mit{\Gamma\Theta}\)Not supportedNot supported\mit{\Gamma\Theta}
    \mkernab\(a\mkern18mu b\)aba\mkern18mu bNot supporteda\mkern18mu b
    \mmlToken?Not supportedNot supportedNot supported
    \mod35mod2\(3\equiv 5 \mod 2\)35mod23\equiv 5 \mod 2Not supported3\equiv 5 \mod 2
    \models\(\models\)\models\models
    \moveleftNot supported\(O\moveleft3pt O\)Not supportedNot supportedO\moveleft3pt O
    \moverightNot supported\(O\moveright3pt O\)Not supportedNot supportedO\moveright3pt O
    \mp\(\mp\)\mp\mp
    \mskipab\(a\mskip{10mu}b\)aba\mskip{10mu}bNot supporteda\mskip{10mu}b
    \mspaceNot supported\(a\mspace18mu b\)Not supportedNot supporteda\mspace18mu b
    \MuΜ\(\Mu\)M\MuΜ\Mu
    \muμ\(\mu\)μ\muμ\mu
    \multicolumnNot supportedNot supportedNot supportedNot supported
    {multline}first linesecond linethird line\[\begin{multline} - \rm first\ line \\ - \rm second\ line \\ - \rm third\ line - \end{multline}\]Not supportedNot supported
    {multline*}first linesecond linethird line\[\begin{multline*} - \rm first\ line \\ - \rm second\ line \\ - \rm third\ line - \end{multline*}\]Not supportedNot supported
    \multimap\(\multimap\)\multimap\multimap
    \multimapbothNot supportedNot supportedNot supported
    \multimapinvNot supportedNot supportedNot supported
    - -

    N

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
    \N\(\N\)N\NNot supported
    \nabla\(\nabla\)\nabla\nabla
    \NandNot supportedNot supportedNot supported
    \natnums\(\natnums\)N\natnumsNot supported
    \natural\(\natural\)\natural\natural
    \negmedspaceab\(a\negmedspace b\)a ⁣ba\negmedspace baba\negmedspace ba\negmedspace b
    \ncong\(\ncong\)\ncong\ncong
    \ne\(\ne\)\ne\ne
    \nearrow\(\nearrow\)\nearrow\nearrow
    \neg¬\(\neg\)¬\neg¬\neg
    \negthickspaceab\(a\negthickspace b\)a ⁣ba\negthickspace bNot supporteda\negthickspace b
    \negthinspaceab\(a\negthinspace b\)a ⁣ba\negthinspace bNot supporteda\negthinspace b
    \neq\(\neq\)\neq\neq
    \newcommand\(\newcommand\chk{\checkmark} \chk\)\newcommand\chk{\checkmark} \chkNot supported\newcommand\chk{\checkmark} \chk
    \newenvironmentNot supported\(\newenvironment{tinyit}{\tiny\it}{\normalsize\rm}\begin{tinyit}Really small.\end{tinyit}\)Not supportedNot supported\newenvironment{tinyit}{\tiny\it}{\normalsize\rm}
    \begin{tinyit}Really small.\end{tinyit}
    \NewextarrowNot supported\(\Newextarrow{\xrightharpoonup}{5,10}{0x21C0} A \xrightharpoonup{\text{note}} B\)Not supportedNot supported\Newextarrow{\xrightharpoonup}{5,10}{0x21C0}
    A \xrightharpoonup{\text{note}} B
    \newextarrowNot supported<Not supportedNot supportedNot supportedSpelling per LaTeX.
    \newlineabNot supportedaba\newline bNot supporteda\newline b
    \nexists\(\nexists\)\nexists\nexists
    \ngeq\(\ngeq\)\ngeq\ngeq
    \ngeqq\(\ngeqq\)\ngeqq⩾̸\ngeqq
    \ngeqslant\(\ngeqslant\)\ngeqslant⩾̸\ngeqslant
    \ngtr\(\ngtr\)\ngtr\ngtr
    \ni\(\ni\)\ni\ni
    \nleftarrow\(\nleftarrow\)\nleftarrow\nleftarrow
    \nLeftarrow\(\nLeftarrow\)\nLeftarrow\nLeftarrow
    \nLeftrightarrow\(\nLeftrightarrow\)\nLeftrightarrow\nLeftrightarrow
    \nleftrightarrow\(\nleftrightarrow\)\nleftrightarrow\nleftrightarrow
    \nleq\(\nleq\)\nleq\nleq
    \nleqq\(\nleqq\)\nleqq⩽̸\nleqq
    \nleqslant\(\nleqslant\)\nleqslant⩽̸\nleqslant
    \nless\(\nless\)\nless\nless
    \nmid\(\nmid\)\nmid\nmid
    \nobreakNot supportedNot supportedNot supportedNot supported
    \nobreakspacea b\(a\nobreakspace b\)a ba\nobreakspace bNot supporteda\nobreakspace b
    \nolimitslimx\(\lim\nolimits_x\)limx\lim\nolimits_xNot supported\lim\nolimits_x
    \NorNot supportedNot supportedNot supported
    \normalsizenormalsize\(\normalsize normalsize\)normalsize\normalsize normalsizeNot supported\normalsize normalsize
    \not\(\not =\)\not =¬=\not =\not =
    \notagNot supportedNot supportedNot supported
    \notin\(\notin\)\notin\notin
    \notniNot supported\notni\notni
    \nparallel\(\nparallel\)\nparallel\nparallel
    \nprec\(\nprec\)\nprec\nprec
    \npreceq\(\npreceq\)\npreceq⪯̸\npreceq
    \nRightarrow\(\nRightarrow\)\nRightarrow\nRightarrow
    \nrightarrow\(\nrightarrow\)\nrightarrow\nrightarrow
    \nshortmid\(\nshortmid\)\nshortmid\nshortmid
    \nshortparallel\(\nshortparallel\)\nshortparallel\nshortparallel
    \nsim\(\nsim\)\nsim\nsim
    \nsubsetNot supportedNot supported\nsubset
    \nsubseteq\(\nsubseteq\)\nsubseteq\nsubseteq
    \nsubseteqq\(\nsubseteqq\)\nsubseteqq\nsubseteqq
    \nsucc\(\nsucc\)\nsucc\nsucc
    \nsucceq\(\nsucceq\)\nsucceq⪰̸\nsucceq
    \nsupsetNot supportedNot supported\nsupset
    \nsupseteq\(\nsupseteq\)\nsupseteq\nsupseteq
    \nsupseteqq\(\nsupseteqq\)\nsupseteqqNot supported
    \ntriangleleft\(\ntriangleleft\)\ntriangleleft\ntriangleleft
    \ntrianglelefteq\(\ntrianglelefteq\)\ntrianglelefteq\ntrianglelefteq
    \ntriangleright\(\ntriangleright\)\ntriangleright\ntriangleright
    \ntrianglerighteq\(\ntrianglerighteq\)\ntrianglerighteq\ntrianglerighteq
    \NuΝ\(\Nu\)N\NuΝ\Nu
    \nuν\(\nu\)ν\nuν\nu
    \nVDash\(\nVDash\)\nVDash\nVDash
    \nVdash\(\nVdash\)\nVdash\nVdash
    \nvDash\(\nvDash\)\nvDash\nvDash
    \nvdash\(\nvdash\)\nvdash\nvdash
    \nwarrow\(\nwarrow\)\nwarrow\nwarrow
    - -

    O

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
    \OØNot supportedØ\text{\O}Not supported\text{\O}
    \oøNot supportedø\text{\o}Not supported\text{\o}
    \obarNot supportedNot supportedNot supported
    \obslashNot supportedNot supportedNot supported
    \oc!Not supportedNot supportedNot supported
    \odivNot supportedNot supportedNot supported
    \odvdfdxNot supportedNot supportedNot supported\odv{f}{x}
    \odv*`ddxfNot supportedNot supportedNot supported\odv*{f}{x}
    \odot\(\odot\)\odot\odot
    \OEŒNot supportedŒ\text{\OE}Not supported\text{\OE}
    \oeœNot supportedœ\text{\oe}Not supported\text{\oe}
    \officialeuroNot supported
    See \euro
    \(\officialeuro\)Not supportedNot supported
    \ogreaterthanNot supportedNot supportedNot supported
    \oiiint0nx0nx\(\oiiint_0^n x \; \displaystyle \oiiint_0^n x\)0nx  0nx\oiiint_0^n x \; \displaystyle \oiiint_0^n x\oiiint
    \oiint0nx0nx\(\oiint_0^n x \; \displaystyle \oiint_0^n x\)0nx  0nx\oiint_0^n x \; \displaystyle \oiint_0^n x\oiint
    \oint0nx0nx\(\oint_0^n x \; \displaystyle \oint_0^n x\)0nx  0nx\oint_0^n x \; \displaystyle \oint_0^n x\oint
    \oldstyleNot supported\(\oldstyle 0123456\)Not supportedNot supported\oldstyle 0123456
    \oldstylenumsNot supportedNot supportedNot supportedNot supported
    \olessthanNot supportedNot supportedNot supported
    \omegaω\(\omega\)ω\omegaω\omega
    \OmegaΩ\(\Omega\)Ω\OmegaΩ\Omega
    \OmicronΟ\(\Omicron\)O\OmicronNot supported
    \omicronο\(\omicron\)ο\omicron\omicron
    \ominus\(\ominus\)\ominus\ominus
    \operatornameasinx\(\operatorname{asin} x\)asinx\operatorname{asin} xasinx\operatorname{asin} x\operatorname{asin} x
    \operatorname*asinxasinyxasinyx\(\begin{matrix}\operatorname*{asin} x \\ \operatorname*{asin}_y x \\ \operatorname*{asin}\limits_y x\end{matrix}\)asinxasinyxasinyx\begin{matrix}\operatorname*{asin} x \\ \operatorname*{asin}_y x \\ \operatorname*{asin}\limits_y x\end{matrix}Not supported\operatorname*{asin} x
    \operatorname*{asin}_y x
    \operatorname*{asin}\limits_y x\end
    \operpNot supportedNot supportedNot supported
    \oplus⊕︎\(\oplus\)\oplus\oplus
    \orNot supportedNot supportedNot supportedNot supported
    \origofNot supported\origofNot supported
    \oslash\(\oslash\)\oslash\oslash
    \otimes\(\otimes\)\otimes\otimes
    \OtimesNot supportedNot supportedNot supported
    \otimeshatNot supportedNot supportedNot supported
    \overa+1b+2+c\({a+1 \over b+2}+c\)a+1b+2+c{a+1 \over b+2}+ca+1b+2+c{a+1 \over b+2}+c{a+1 \over b+2}+c
    \overbracex++xn times\(\overbrace{x+⋯+x}^{n\text{ times}}\)x++xn times\overbrace{x+⋯+x}^{n\text{ times}}x++xn times\overbrace{x+⋯+x}^{n\text{ times}}\overbrace{x+⋯+x}^{n\text{ times}}
    \overbracketNot supportedNot supportedNot supportedNot supported
    \overgroupABNot supportedAB\overgroup{AB}Not supported\overgroup{AB}
    \overleftarrowAB\(\overleftarrow{AB}\)AB\overleftarrow{AB}Not supported\overleftarrow{AB}
    \overleftharpoonABNot supportedAB\overleftharpoon{AB}Not supported\overleftharpoon{AB}
    \overleftrightarrowAB\(\overleftrightarrow{AB}\)AB\overleftrightarrow{AB}Not supported\overleftrightarrow{AB}
    \overlinea long argument\(\overline{\text{a long argument}}\)a long argument\overline{\text{a long argument}}a long argument¯\overline{\text{a long argument}}\overline{\text{a long argument}}
    \overlinesegmentNot supportedNot supportedNot supportedNot supported
    \overparenAB\(\overparen{AB}\)Not supportedNot supportedSee \overgroup
    \OverrightarrowABNot supportedAB\Overrightarrow{AB}Not supported\Overrightarrow{AB}
    \overrightarrowAB\(\overrightarrow{AB}\)AB\overrightarrow{AB}Not supported\overrightarrow{AB}
    \overrightharpoonacNot supportedac\overrightharpoon{ac}Not supported\overrightharpoon{ac}
    \overset=!\(\overset{!}{=}\)=!\overset{!}{=}=!\overset{!}{=}\overset{!}{=}
    \overwithdelimsNot supported\(a \overwithdelims [ ] b\)Not supportedNot supported
    \owns\(\owns\)\ownsNot supported
    - -

    P

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
    \PNot supported\text{\P}Not supported\text{\P}
    \pagecolor?Not supportedNot supportedNot supportedDeprecated
    \parallel\(\parallel\)\parallel\parallel
    \parrNot supportedNot supportedNot supported
    \part??Not supportedNot supportedNot supportedDeprecated
    \partial\(\partial\)\partial\partial
    \permilNot supportedNot supportedNot supported
    \pdv2fxyNot supportedNot supportedNot supported\pdv{f}{x,y}
    \pdv*2xyfNot supportedNot supportedNot supported\pdv*{f}{x,y}
    \perp\(\perp\)\perp\perp
    \phantomΓijkij\(\Gamma^{\phantom{i}j}_{i\phantom{j}k}\)Γijkij\Gamma^{\phantom{i}j}_{i\phantom{j}k}Γijkij\Gamma^{\phantom{i}j}_{i\phantom{j}k}\Gamma^{\phantom{i}j}_{i\phantom{j}k}
    \phaseNot supportedNot supported
    See \enclose
    120V78.2°120\text{V}\phase{78.2\degree}Not supported120\text{V}\phase{78.2\degree}
    \PhiΦ\(\Phi\)Φ\PhiΦ\Phi
    \phiϕ\(\phi\)ϕ\phiϕ\phi
    \PiΠ\(\Pi\)Π\PiΠ\Pi
    \piπ\(\pi\)π\piπ\pi
    {picture}Not supportedNot supportedNot supportedNot supported
    \pitchfork\(\pitchfork\)\pitchfork\pitchfork
    \plimplimNot supportedplim\plimNot supported
    \plusmn±\(\plusmn\)±\plusmnNot supported
    \pm±\(\pm\)±\pm±\pm
    \pmatrixNot supported\(\pmatrix{a&b\\c&d}\)Not supportedNot supportedSee {pmatrix}
    {pmatrix}(abcd)\(\begin{pmatrix}a&b\\c&d\end{pmatrix}\)(abcd)\begin{pmatrix}a&b\\c&d\end{pmatrix}(abcd)\begin{pmatrix}a&b\\c&d\end{pmatrix}\begin{pmatrix}
       a & b \\
       c & d
    \end{pmatrix}
    \pmbμ\(\pmb{\mu}\)μ\pmb{\mu}Not supported\pmb{\mu}
    \pmodx(moda)\(x\pmod a\)x(moda)x\pmod aNot supportedx\pmod a
    \podx(a)\(x \pod a\)x(a)x \pod aNot supportedx \pod a
    \pounds£Not supported£\poundsNot supported
    \PrPrxPryxPryx\(\begin{matrix}\Pr x \\ \Pr_y x \\\Pr\limits_y x\end{matrix}\)PrxPryxPryx\begin{matrix}\Pr x \\ \Pr_y x \\\Pr\limits_y x\end{matrix}Pr\Pr
    \prec\(\prec\)\prec\prec
    \precapprox\(\precapprox\)\precapprox\precapprox
    \preccurlyeq\(\preccurlyeq\)\preccurlyeq\preccurlyeq
    \preceq\(\preceq\)\preceq\preceq
    \precnapprox\(\precnapprox\)\precnapprox\precnapprox
    \precneqq\(\precneqq\)\precneqq\precneqq
    \precnsim\(\precnsim\)\precnsim\precnsim
    \precsim\(\precsim\)\precsim\precsim
    \prescript𝐂25+a2Not supportedNot supportedNot supported\prescript{a}{2}{\mathbf{C}}^{5+}_{2}
    \prime\(\prime\)\primeNot supported
    \prod0nx0nx\(\prod_0^n x \; \displaystyle \prod_0^n x\)0nx  0nx\prod_0^n x \; \displaystyle \prod_0^n x\prod
    \projlimproj limnx\(\projlim_n x\)proj limnx\projlim_n xNot supported\projlim_n x
    \propto\(\propto\)\propto\propto
    \providecommandHelloNot supportedHello\providecommand\greet{\text{Hello}} \greetNot supported\providecommand\greet{\text{Hello}} \greet
    \psiψ\(\psi\)ψ\psiψ\psi
    \PsiΨ\(\Psi\)Ψ\PsiΨ\Psi
    \pu123 kJmol\({123~\mathchoice{\textstyle\frac{\mathrm{kJ}}{\mathrm{mol}}}{\frac{\mathrm{kJ}}{\mathrm{mol}}}{\frac{\mathrm{kJ}}{\mathrm{mol}}}{\frac{\mathrm{kJ}}{\mathrm{mol}}}}\)123 kJmol{123~\mathchoice{\textstyle\frac{\mathrm{kJ}}{\mathrm{mol}}}{\frac{\mathrm{kJ}}{\mathrm{mol}}}{\frac{\mathrm{kJ}}{\mathrm{mol}}}{\frac{\mathrm{kJ}}{\mathrm{mol}}}}Not supported\pu{123 kJ//mol}
    - -

    QR

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
    \QNot supported\(\Q\)Not supportedNot supportedSee \Bbb{Q}
    \QEDNot supportedNot supportedNot supported
    \qprimeNot supportedNot supportedNot supported
    \qquadab\(a\qquad\qquad{b}\)aba\qquad\qquad{b}aba\qquad\qquad{b}a\qquad\qquad{b}
    \quadab\(a\quad\quad{b}\)aba\quad\quad{b}aba\quad\quad{b}a\quad\quad{b}
    \R\(\R\)R\RNot supported
    \ra˚\(\text{\r{a}}\)a˚\text{\r{a}}Not supported\text{\r{a}}
    \raisehigher\(h\raise{2pt}{ighe}r\)Not supportedNot supportedh\raise{2pt}{ighe}r
    \raiseboxhigherNot supportedhigherh\raisebox{2pt}{ighe}rNot supportedh\raisebox{2pt}{ighe}r
    \rangA\(\langle A\rang\)A\langle A\rangA\langle A\rang\langle A\rang
    \rAngleANot supportedNot supportedNot supported\lAngle A\rAngle
    \rangleA\(\langle A\rangle\)A\langle A\rangleA\langle A\rangle\langle A\rangle
    \Rarr\(\Rarr\)\RarrNot supported
    \rArr\(\rArr\)\rArrNot supported
    \rarr\(\rarr\)\rarrNot supported
    \rBraceNot supported\rBraceNot supported
    \rbrace}\(\rbrace\)}\rbrace}\rbrace
    \rbrack]\(\rbrack\)]\rbrack]\rbrack
    {rcases}aif bcif d}Not supportedaif bcif d}\begin{rcases}a&\text{if }b\\c&\text{if }d\end{rcases}Not supported\begin{rcases}
       a&\text{if }b\\
       c&\text{if }d
    \end{rcases}
    \rceil\(\rceil\)\rceil\rceil
    \Re\(\Re\)\Re\Re
    \real\(\real\)\realNot supported
    \Reals\(\Reals\)R\RealsNot supported
    \reals\(\reals\)R\realsNot supported
    \refSupportedNot supportedNot supported\ref{maxwell}
    \reflectboxSNot supportedNot supportedNot supported\reflectbox{S}
    \relaxNot supportedNot supported
    \renewcommandAhoy!\(\def\hail{Hi!}\renewcommand\hail{\text{Ahoy!}} \hail\)Ahoy!\def\hail{Hi!}\renewcommand\hail{\text{Ahoy!}} \hailNot supported\def\hail{Hi!}
    \renewcommand\hail{\text{Ahoy!}}
    \hail
    \renewenvironmentNot supportedNot supportedNot supported
    \requireNot supportedNot supportedNot supported
    \restriction\(\restriction\)\restrictionNot supported
    \rfloor\(\rfloor\)\rfloor\rfloor
    \rgroup\(\rgroup\)\rgroupNot supported
    \rhd\(\rhd\)\rhd\rhd
    \RhoΡ\(\Rho\)P\RhoΡ\Rho
    \rhoρ\(\rho\)ρ\rhoρ\rho
    \rightab)\(\left.\frac a b\right)\)ab)\left.\frac a b\right)ab)\left.\frac a b\right)\left.\frac a b\right)
    \Rightarrow\(\Rightarrow\)\Rightarrow\Rightarrow
    \rightarrow\(\rightarrow\)\rightarrow\rightarrow
    \rightarrowtail\(\rightarrowtail\)\rightarrowtail\rightarrowtail
    \rightharpoondown\(\rightharpoondown\)\rightharpoondown\rightharpoondown
    \rightharpoonup\(\rightharpoonup\)\rightharpoonup\rightharpoonup
    \rightleftarrows\(\rightleftarrows\)\rightleftarrows\rightleftarrows
    \rightleftharpoons\(\rightleftharpoons\)\rightleftharpoons\rightleftharpoons
    \rightmoonNot supportedNot supportedNot supported
    \rightouterjoinNot supportedNot supportedNot supported
    \rightrightarrows\(\rightrightarrows\)\rightrightarrows\rightrightarrows
    \rightsquigarrow\(\rightsquigarrow\)\rightsquigarrow\rightsquigarrow
    \rightthreetimes\(\rightthreetimes\)\rightthreetimes\rightthreetimes
    \risingdotseq\(\risingdotseq\)\risingdotseq\risingdotseq
    \rlap/=\(\rlap{\,/}{=}\)/=\rlap{\,/}{=}Not supported\rlap{\,/}{=}
    \rmAaBb12θ\(\rm AaBb12\theta\)AaBb12θ\rm AaBb12\thetaNot supported\rm AaBb12\theta
    \rmoustache\(\rmoustache\)\rmoustache\rmoustache
    \rootNot supported\(\root 3 \of x\)Not supportedx3\root{3}{x}MathJax and TeXZilla differ in syntax:
    \root 3 \of x vs. \root{3}{x}
    \rotateboxNot supportedNot supportedNot supportedNot supported
    \rparen)Not supported)\rparenNot supported
    \rqNot supported\rqNot supported
    \Rrightarrow\(\Rrightarrow\)\Rrightarrow\Rrightarrow
    \rrangleANot supportedNot supportedA\llangle A\rrangle\llangle A\rrangle
    \rrbracketNot supported\rrbracketNot supported
    \rrparenthesisNot supportedNot supportedNot supported
    \Rsh\(\Rsh\)\Rsh\Rsh
    \rtimes\(\rtimes\)\rtimes\rtimes
    \RuleNot supported\(x\Rule{3px}{0.5ex}{2ex}x\)Not supportedNot supportedNon-standard
    \rulexx\(x\color{blue}\rule[6pt]{2ex}{1ex}x\)xxx\color{blue}\rule[6pt]{2ex}{1ex}xNot supportedx\color{blue}\rule[6pt]{2ex}{1ex}x
    \rVert\(\rVert\)\rVertNot supported
    \rvert|\(\rvert\)\rvertNot supported
    - -

    S

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
    \S§Not supported§\text{\S}Not supported\text{\S}
    \SampiϠNot supportedNot supportedNot supported
    \sampiϡNot supportedNot supportedNot supported
    \scaleboxNot supportedNot supportedNot supportedNot supported
    \scohNot supportedNot supportedNot supported
    \scrNot supported\(\scr M\)Not supportedNot supported\scr M
    \scriptscriptstylecd\(\scriptscriptstyle \frac cd\)cd\scriptscriptstyle \frac cdNot supported\scriptscriptstyle \frac cd
    \scriptsizescriptsize\(\scriptsize scriptsize\)scriptsize\scriptsize scriptsizescriptsize\scriptsize scriptsize\scriptsize scriptsize
    \scriptstyleab+cd\(\frac ab + {\scriptstyle \frac cd}\)ab+cd\frac ab + {\scriptstyle \frac cd}Not supported\frac ab + {\scriptstyle \frac cd}
    \sdot\(\sdot\)\sdotNot supported
    \searrow\(\searrow\)\searrow\searrow
    \secsec\(\sec\)sec\secsec\sec
    \sect§Not supported§\text{\sect}Not supported\text{\sect}
    \set{x|x<5}Requires extensionNot supportedNot supported\Set{x|x<5}
    \Set{x|x<12}Requires extensionNot supportedNot supported\Set{ x | x<\frac 1 2 }
    \setlengthNot supportedNot supportedNot supportedNot supported
    \setminus\(\setminus\)\setminus\setminus
    \sf𝖠𝖺𝖡𝖻𝟣𝟤𝟥\(\sf AaBb123\)AaBb123\sf AaBb123Not supported\sf AaBb123
    \sgnsgnNot supportedNot supportedNot supported
    \sharp\(\sharp\)\sharp\sharp
    \shiftNot supportedNot supportedNot supported
    \shnegNot supportedNot supportedNot supported
    \shortmid\(\shortmid\)\shortmid\shortmid
    \shortparallel\(\shortparallel\)\shortparallel\shortparallel
    \shoveleftNot supported\(\begin{multline*} -\rm first\ line \\ -\shoveleft{\rm 2nd} \\ -\rm third\ line -\end{multline*}\)Not supportedNot supported
    \shoverightNot supported\(\begin{multline*} -\rm first\ line \\ -\shoveright{\rm 2nd} \\ -\rm third\ line -\end{multline*}\)Not supportedNot supported
    \shposNot supportedNot supportedNot supported
    \shuffleNot supportedNot supportedNot supported
    \sideset3412Not supportedNot supportedNot supported
    \SigmaΣ\(\Sigma\)Σ\SigmaΣ\Sigma
    \sigmaσ\(\sigma\)σ\sigmaσ\sigma
    \sim\(\sim\)\sim\sim
    \simeq\(\simeq\)\simeq\simeq
    \sinsinx\(\sin x\)sinx\sin xsinx\sin x
    \sincohNot supportedNot supportedNot supported
    \sinhsinhx\(\sinh x\)sinhx\sinh xsinhx\sinh x
    \sixptsizesixptsizeNot supportedsixptsize\sixptsize sixptsizeNot supported\sixptsize sixptsize
    \shshNot supportedsh\shNot supported
    \skewNot supported\(\hat A\skew9\hat A\)Not supportedNot supported\hat A\skew9\hat A
    \skipNot supportedNot supportedNot supportedNot supported
    \smallsmall\(\small small\)small\small smallNot supported\small small
    \smallfrown\(\smallfrown\)\smallfrown\smallfrown
    \smallint0nx0nx0nx\(\smallint_0^n x \; \smallint\limits_0^n x \; \displaystyle \smallint_0^n x\)0nx  0nx  0nx\smallint_0^n x \; \smallint\limits_0^n x \; \displaystyle \smallint_0^n xNot supported - \smallint_0^n x
    \smallint\limits_0^n x
    \displaystyle \smallint_0^n x -
    {smallmatrix}abcd\(\begin{smallmatrix}a & b\\c & d\end{smallmatrix}\)abcd\begin{smallmatrix}a & b\\c & d\end{smallmatrix}abcd\begin{smallmatrix}a & b\\c & d\end{smallmatrix}\begin{smallmatrix}a & b\\
    c & d\end{smallmatrix}
    \smallsetminus\(\smallsetminus\)\smallsetminus\smallsetminus
    \smallsmile\(\smallsmile\)\smallsmile\smallsmile
    \smash(x2)\(\left(x^{\smash{2}}\right)\)(x2)\left(x^{\smash{2}}\right)Not supported\left(x^{\smash{2}}\right)
    \smashtimesNot supportedNot supportedNot supported
    \smile\(\smile\)\smile\smile
    \smileyNot supportedNot supportedNot supportedwasysym
    \soutabcNot supportedabc\sout{abc}Not supported\sout{abc}
    \SpaceNot supported\(a\Space{5px}{4ex}{2ex}^b_c d\)Not supportedNot supporteda\Space{5px}{4ex}{2ex}^b_c d
    \spacea b\(a\space{b}\)a ba\space{b}Not supporteda\space{b}
    \spades\(\spades\)\spadesNot supported
    \spadesuit\(\spadesuit\)\spadesuit\spadesuit
    \sphericalangle\(\sphericalangle\)\sphericalangle\sphericalangle
    {split}·𝐃=ρv·𝐁=0\[\begin{equation}\begin{split}∇·𝐃&=ρ_v \\∇·𝐁&=0\end{split}\end{equation}\]𝐃=ρv𝐁=0\begin{equation}\begin{split}∇·𝐃&=ρ_v \\∇·𝐁&=0\end{split}\end{equation}Not supported\begin{equation}
    \begin{split}
       ∇·𝐃&=ρ_v \\
       ∇·𝐁&=0
    \end{split}
    \end{equation}
    \sqcap\(\sqcap\)\sqcap\sqcap
    \SqcapNot supportedNot supportedNot supported
    \sqcup\(\sqcup\)\sqcup\sqcup
    \SqcupNot supportedNot supportedNot supported
    \square\(\square\)\square\square
    \sqrtx3\(\sqrt[3]{x}\)x3\sqrt[3]{x}x3\sqrt[3]{x}\sqrt[3]{x}
    \sqsubset\(\sqsubset\)\sqsubset\sqsubset
    \sqsubseteq\(\sqsubseteq\)\sqsubseteq\sqsubseteq
    \sqsupset\(\sqsupset\)\sqsupset\sqsupset
    \sqsupseteq\(\sqsupseteq\)\sqsupseteq\sqsupseteq
    \ssßNot supportedß\text{\ss}Not supported\text{\ss}
    \sslashNot supportedNot supported\sslash
    \stackrel=!\(\stackrel{!}{=}\)=!\stackrel{!}{=}=!\stackrel{!}{=}\stackrel{!}{=}
    \star\(\star\)\star\star
    \StigmaϚNot supportedNot supportedNot supported
    \stigmaϛNot supportedNot supportedNot supported
    \strictifNot supportedNot supportedNot supported
    \strictfiNot supportedNot supportedNot supported
    \strutNot supported\(\boxed{ab\strut}\)Not supportedNot supported\boxed{ab\strut}
    \styleNot supported\(\frac{\style{color:red}{x+1}}{y+2}\)Not supportedNot supported\frac{\style{color:red}{x+1}}{y+2}
    Non standard
    \sub\(\sub\)\subNot supported
    {subarray}ac\(\begin{subarray}{c} a \\ c \end{subarray}\)ac\begin{subarray}{c} a \\ c \end{subarray}Not supported\sum_{\begin{subarray}
       {c} a \\
       c
    \end{subarray}}
    \sube\(\sube\)\subeNot supported
    \Subset\(\Subset\)\Subset\Subset
    \subset\(\subset\)\subset\subset
    \subseteq\(\subseteq\)\subseteq\subseteq
    \subseteqq\(\subseteqq\)\subseteqq\subseteqq
    \subsetneq\(\subsetneq\)\subsetneq\subsetneq
    \subsetneqq\(\subsetneqq\)\subsetneqq\subsetneqq
    \substack1<i<31j<5aij\(\displaystyle\sum_{\substack{1\lt i\lt 3 \\ 1\le j\lt 5}}a_{ij}\)1<i<31j<5aij\displaystyle\sum_{\substack{1\lt i\lt 3 \\ 1\le j\lt 5}}a_{ij}1<i<31j<5aij\displaystyle\sum_{\substack{1\lt i\lt 3 \\ 1\le j\lt 5}}a_{ij}\sum_{\substack{1\lt i\lt 3 \\
    1\le j\lt 5}}a_{ij}
    \succ\(\succ\)\succ\succ
    \succapprox\(\succapprox\)\succapprox\succapprox
    \succcurlyeq\(\succcurlyeq\)\succcurlyeq\succcurlyeq
    \succeq\(\succeq\)\succeq\succeq
    \succnapprox\(\succnapprox\)\succnapprox\succnapprox
    \succneqq\(\succneqq\)\succneqq\succneqq
    \succnsim\(\succnsim\)\succnsim\succnsim
    \succsim\(\succsim\)\succsim\succsim
    \sum0nx0nx\(\sum_0^n x \; \displaystyle \sum_0^n x\)0nx  0nx\sum_0^n x \; \displaystyle \sum_0^n x0nx\sum_0^n x
    \sunNot supportedNot supportedNot supported
    \supsupxsupyxsupyx\(\begin{matrix}\sup x \\ \sup_y x \\\sup\limits_y x\end{matrix}\)supxsupyxsupyx\begin{matrix}\sup x \\ \sup_y x \\\sup\limits_y x\end{matrix}supxsupyxsuplimitsyx\begin{matrix}\sup x \\ \sup_y x \\\sup\limits_y x\end{matrix}
    \supe\(\supe\)\supesupe\supe
    \Supset\(\Supset\)\Supset\Supset
    \supset\(\supset\)\supset\supset
    \supseteq\(\supseteq\)\supseteq\supseteq
    \supseteqq\(\supseteqq\)\supseteqq\supseteqq
    \supsetneq\(\supsetneq\)\supsetneq\supsetneq
    \supsetneqq\(\supsetneqq\)\supsetneqq\supsetneqq
    \surd|\(\surd\)\surd\surd
    \swarrow\(\swarrow\)\swarrow\swarrow
    - -

    T

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
    \taga2+b2=c2(3.1c)\(\tag{3.1c} a^2+b^2=c^2\)a2+b2=c2(3.1c)\tag{3.1c} a^2+b^2=c^2Not supported\tag{3.1c} a^2+b^2=c^2
    \tag*a2+b2=c23.1c\(\tag*{3.1c} a^2+b^2=c^2\)a2+b2=c23.1c\tag*{3.1c} a^2+b^2=c^2Not supported\tag*{3.1c} a^2+b^2=c^2
    \tantanx\(\tan x\)tanx\tan xtanx\tan x
    \tanhtanhx\(\tanh x\)tanhx\tanh xtanhx\tanh x
    \TauΤ\(\Tau\)T\TauΤ\Tau
    \tauτ\(\tau\)τ\tauτ\tau
    \tbinom(nk)\(\tbinom n k\)(nk)\tbinom n k(nk)\tbinom n k\tbinom n k
    \TeXTEX\(\TeX\)TeX\TeXNot supported
    \text yes & no \(\text{ yes }\&\text{ no }\) yes & no \text{ yes }\&\text{ no } yes & no \text{ yes }\&\text{ no }\text{ yes }\&\text{ no }
    \textMMMMMM\(\text{MMM$M\mkern2mu M$M}\)MMMMMM\text{MMM$M\mkern2mu M$M}Not supported\text{MMM$M\mkern2mu M$M}
    \textasciitilde~Not supported~\text{\textasciitilde}Not supported\text{\textasciitilde}
    \textasciicircum^Not supported^\text{\textasciicircum}Not supported\text{\textasciicircum}
    \textbackslash\Not supported\\text{\textbackslash}Not supported\text{\textbackslash}
    \textbar|Not supported|\text{\textbar}Not supported\text{\textbar}
    \textbardblNot supported\text{\textbardbl}Not supported\text{\textbardbl}
    \textbf𝐀𝐚𝐁𝐛𝟏𝟐𝟑\(\textbf{AaBb123}\)AaBb123\textbf{AaBb123}Not supported\textbf{AaBb123}
    \textbraceleft{Not supported{\text{\textbraceleft}Not supported\text{\textbraceleft}
    \textbraceright}Not supported}\text{\textbraceright}Not supported\text{\textbraceright}
    \textcircledNot supportedNot supportedNot supportedNot supported\text{\textcircled a}
    \textcolorF=ma\(\textcolor{blue}{F=ma}\)F=ma\textcolor{blue}{F=ma}Not supported\textcolor{blue}{F=ma}
    \textdaggerNot supported\text{\textdagger}Not supported\text{\textdagger}
    \textdaggerdblNot supported\text{\textdaggerdbl}Not supported\text{\textdaggerdbl}
    \textdegree°Not supported°\text{\textdegree}Not supported\text{\textdegree}
    \textdollar$Not supported$\text{\textdollar}Not supported\text{\textdollar}
    \textellipsisNot supported\text{\textellipsis}Not supported\text{\textellipsis}
    \textemdashNot supported\text{\textemdash}Not supported\text{\textemdash}
    \textendashNot supported\text{\textendash}Not supported\text{\textendash}
    \textgreater>Not supported>\text{\textgreater}Not supported\text{\textgreater}
    \textit𝐴𝑎𝐵𝑏\(\textit{AaBb}\)AaBb\textit{AaBb}Not supported\textit{AaBb}
    \textless<Not supported<\text{\textless}Not supported\text{\textless}
    \textnormalABNot supportedAB\textnormal{AB}Not supported\textnormal{AB}
    \textquotedblleftNot supported\text{\textquotedblleft}Not supported\text{\textquotedblleft}
    \textquotedblrightNot supported\text{\textquotedblright}Not supported\text{\textquotedblright}
    \textquoteleftNot supported\text{\textquoteleft}Not supported\text{\textquoteleft}
    \textquoterightNot supported\text{\textquoteright}Not supported\text{\textquoteright}
    \textregistered®Not supported®\text{\textregistered}Not supported\text{\textregistered}
    \textrmAaBb123\(\textrm{AaBb123}\)AaBb123\textrm{AaBb123}Not supported\textrm{AaBb123}
    \textscNot supportedNot supportedNot supportedNot supported
    \textsf𝖠𝖺𝖡𝖻𝟣𝟤𝟥\(\textsf{AaBb123}\)AaBb123\textsf{AaBb123}Not supported\textsf{AaBb123}
    \textsterling£Not supported£\text{\textsterling}Not supported\text{\textsterling}
    \textstyle0n\(\textstyle\sum_0^n\)0n\textstyle\sum_0^n0n\textstyle\sum_0^n\textstyle\sum_0^n
    \texttipNot supportedNot supportedNot supportedNot supported\texttip{\text{hover here}}{tip}
    \texttt𝙰𝚊𝙱𝚋𝟷𝟸𝟹\(\texttt{AaBb123}\)AaBb123\texttt{AaBb123}Not supported\texttt{AaBb123}
    \textunderscore_Not supported_\text{\textunderscore}Not supported\text{\textunderscore}
    \textvisiblespaceNot supported\(a\textvisiblespace b\)Not supportedNot supported
    \tfracab\(\displaystyle \tfrac a b\)ab\displaystyle \tfrac a bab\displaystyle \tfrac a b\displaystyle \tfrac a b
    \tgtgNot supportedtg\tgNot supported
    \ththNot supportedth\thNot supported
    \therefore\(\therefore\)\therefore\therefore
    \ThetaΘ\(\Theta\)Θ\ThetaΘ\Theta
    \thetaθ\(\theta\)θ\thetaθ\theta
    \thetasymϑ\(\thetasym\)ϑ\thetasymθsym\thetasym
    \thickapprox\(\thickapprox\)\thickapprox\thickapprox
    \thicksim\(\thicksim\)\thicksim\thicksim
    \thickspaceabNot supporteda  ba\thickspace baba\thickspace ba\thickspace b
    \thinspaceab\(a\thinspace b\)aba\thinspace baba\thinspace ba\thinspace b
    \threedotcolonNot supportedNot supportedNot supported
    \tildeM~\(\tilde M\)M~\tilde MM˜\tilde M\tilde M
    \times×\(\times\)×\times×\times
    \TinyABNot supportedNot supportedNot supportedNon standard
    \tinytiny\(\tiny tiny\)tiny\tiny tinyNot supported\tiny tiny
    \to\(\to\)\to\to
    \toggleNot supportedNot supportedNot supportedHey!Click Here\toggle{\text{Hey!}}{\text{Click Here}}
    \top\(\top\)\top\top
    \triangle\(\triangle\)\triangle\triangle
    \triangledown\(\triangledown\)\triangledown\triangledown
    \triangleleft\(\triangleleft\)\triangleleft\triangleleft
    \trianglelefteq\(\trianglelefteq\)\trianglelefteq\trianglelefteq
    \triangleq\(\triangleq\)\triangleq\triangleq
    \triangleminusNot supportedNot supportedNot supported
    \triangleplusNot supportedNot supportedNot supported
    \triangleright\(\triangleright\)\triangleright\triangleright
    \trianglerighteq\(\trianglerighteq\)\trianglerighteq\trianglerighteq
    \triangletimesNot supportedNot supportedNot supported
    \trprimeNot supportedNot supportedNot supported
    \tt𝙰𝚊𝙱𝚋𝟷𝟸𝟹\({\tt AaBb123}\)AaBb123{\tt AaBb123}Not supported{\tt AaBb123}
    \twocapsNot supportedNot supportedNot supported
    \twocupsNot supportedNot supportedNot supported
    \twoheadleftarrow\(\twoheadleftarrow\)\twoheadleftarrow\twoheadleftarrow
    \twoheadrightarrow\(\twoheadrightarrow\)\twoheadrightarrow\twoheadrightarrow
    \typecolonNot supportedNot supportedNot supported
    - -

    U

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
    \ua˘Not supporteda˘\text{\u{a}}Not supported\text{\u{a}}
    \Uarr\(\Uarr\)\UarrNot supported
    \uArr\(\uArr\)\uArrNot supported
    \uarr\(\uarr\)\uarrNot supported
    \ulcorner\(\ulcorner\)\ulcornerNot supported
    \underbracex++xn times\(\underbrace{x+⋯+x}_{n\text{ times}}\)x++xn times\underbrace{x+⋯+x}_{n\text{ times}}x++xn times\underbrace{x+⋯+x}_{n\text{ times}}\underbrace{x+⋯+x}_{n\text{ times}}
    \underbracketNot supportedNot supportedNot supportedNot supported
    \undergroupABNot supportedAB\undergroup{AB}Not supported\undergroup{AB}
    \underleftarrowAB\(\underleftarrow{AB}\)AB\underleftarrow{AB}Not supported\underleftarrow{AB}
    \underleftrightarrowAB\(\underleftrightarrow{AB}\)AB\underleftrightarrow{AB}Not supported\underleftrightarrow{AB}
    \underrightarrowAB\(\underrightarrow{AB}\)AB\underrightarrow{AB}Not supported\underrightarrow{AB}
    \underlinea long argument\(\underline{\text{a long argument}}\)a long argument\underline{\text{a long argument}}a long argument_\underline{\text{a long argument}}\underline{\text{a long argument}}
    \underlinesegmentNot supportedNot supportedNot supportedNot supported
    \underparenabcNot supportedNot supportedNot supported\underparen{abc}
    \underrightarrowAB\(\underrightarrow{AB}\)AB\underrightarrow{AB}Not supported\underrightarrow{AB}
    \underset=!\(\underset{!}{=}\)=!\underset{!}{=}=!\underset{!}{=}\underset{!}{=}
    \unicodeNot supported
    See \char
    \(\unicode{x263a}\)Not supportedNot supported\unicode{x263a}
    See \char for alternate.
    \unlhd\(\unlhd\)\unlhd\unlhd
    \unrhd\(\unrhd\)\unrhd\unrhd
    \upalphaαNot supportedNot supportedNot supported
    \Uparrow\(\Uparrow\)\Uparrow\Uparrow
    \uparrow\(\uparrow\)\uparrow\uparrow
    \upbetaβNot supportedNot supportedNot supported
    \upchiχNot supportedNot supportedNot supported
    \updeltaδNot supportedNot supportedNot supported
    \Updownarrow\(\Updownarrow\)\Updownarrow\Updownarrow
    \updownarrow\(\updownarrow\)\updownarrow\updownarrow
    \upetaηNot supportedNot supportedNot supported
    \upepsilonϵNot supportedNot supportedNot supported
    \upgammaγNot supportedNot supportedNot supported
    \upharpoonleft\(\upharpoonleft\)\upharpoonleft\upharpoonleft
    \upharpoonright\(\upharpoonright\)\upharpoonright\upharpoonright
    \upiotaιNot supportedNot supportedNot supported
    \upkappaκNot supportedNot supportedNot supported
    \uplambdaλNot supportedNot supportedNot supported
    \uplus\(\uplus\)\uplus\uplus
    \upmuμNot supportedNot supportedNot supported
    \upnuνNot supportedNot supportedNot supported
    \upomegaωNot supportedNot supportedNot supported
    \upomicronοNot supportedNot supportedNot supported
    \upphiϕNot supportedNot supportedNot supported
    \uppiπNot supportedNot supportedNot supported
    \uppsiψNot supportedNot supportedNot supported
    \uprhoρNot supportedNot supportedNot supported
    \uprootNot supported\(\sqrt[3\uproot2]{x}\)Not supportedNot supported\sqrt[3\uproot2]{x}
    \upsigmaσNot supportedNot supportedNot supported
    \UpsilonΥ\(\Upsilon\)Υ\Upsilonϒ\Upsilon
    \upsilonυ\(\upsilon\)υ\upsilonυ\upsilon
    \uptauτNot supportedNot supportedNot supported
    \upthetaθNot supportedNot supportedNot supported
    \upuparrows\(\upuparrows\)\upuparrows\upuparrows
    \upupsilonυNot supportedNot supportedNot supported
    \upxiξNot supportedNot supportedNot supported
    \upzetaζNot supportedNot supportedNot supported
    \urcorner\(\urcorner\)\urcornerNot supported
    \url𝚑𝚝𝚝𝚙𝚜://𝚝𝚎𝚖𝚖𝚕.𝚘𝚛𝚐/Not supportedhttps://temml.org/\url{https://temml.org/}Not supported\url{https://temml.org/}
    \utildeAB~Not supportedAB~\utilde{AB}Not supported\utilde{AB}
    - -

    V

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
    \vaˇNot supportedaˇ\text{\v{a}}Not supported\text{\v{a}}
    \varcoppaϙNot supportedNot supportedNot supported
    \varDelta𝛥\(\varDelta\)Δ\varDeltaNot supported
    \varepsilonε\(\varepsilon\)ε\varepsilonε\varepsilon
    \varGamma𝛤\(\varGamma\)Γ\varGammaNot supported
    \varinjlimlimnx\(\varinjlim\limits_n x\)limnx\varinjlim\limits_n xNot supported\varinjlim\limits_n x
    \varkappaϰ\(\varkappa\)ϰ\varkappaϰ\varkappa
    \varLambda𝛬\(\varLambda\)Λ\varLambdaNot supported
    \varliminflimnx\(\varliminf\limits_n x\)limnx\varliminf\limits_n xNot supported\varliminf\limits_n x
    \varlimsuplimnx\(\varlimsup\limits_n x\)limnx\varlimsup\limits_n xNot supported\varlimsup\limits_n x
    \varnothing\(\varnothing\)\varnothing\varnothing
    \varOmega𝛺\(\varOmega\)Ω\varOmegaNot supported
    \varPhi𝛷\(\varPhi\)Φ\varPhiNot supported
    \varphiφ\(\varphi\)φ\varphiφ\varphi
    \varPi𝛱\(\varPi\)Π\varPiNot supported
    \varpiϖ\(\varpi\)ϖ\varpiϖ\varpi
    \varprojlimlimnx\(\varprojlim\limits_n x\)limnx\varprojlim\limits_n xNot supported\varprojlim\limits_n x
    \varpropto\(\varpropto\)\varpropto\varpropto
    \varPsi𝛹\(\varPsi\)Ψ\varPsiNot supported
    \varrhoϱ\(\varrho\)ϱ\varrhoϱ\varrho
    \varSigma𝛴\(\varSigma\)Σ\varSigmaNot supported
    \varsigmaς\(\varsigma\)ς\varsigmaς\varsigma
    \varstigmaNot supported\(\varstigma\)Not supportedNot supported
    \varsubsetneq⊊︀\(\varsubsetneq\)\varsubsetneq⊊︀\varsubsetneq
    \varsubsetneqq⫋︀\(\varsubsetneqq\)\varsubsetneqq⫋︀\varsubsetneqq
    \varsupsetneq\(\varsupsetneq\)\varsupsetneq⊋︀\varsupsetneq
    \varsupsetneqq⫌︀\(\varsupsetneqq\)\varsupsetneqq⫌︀\varsupsetneqq
    \varTheta𝛩\(\varTheta\)Θ\varThetaNot supported
    \varthetaϑ\(\vartheta\)ϑ\varthetaϑ\vartheta
    \vartriangle\(\vartriangle\)\vartriangle\vartriangle
    \vartriangleleft\(\vartriangleleft\)\vartriangleleft\vartriangleleft
    \vartriangleright\(\vartriangleright\)\vartriangleright\vartriangleright
    \varUpsilon𝛶\(\varUpsilon\)Υ\varUpsilonNot supported
    \varXi𝛯\(\varXi\)Ξ\varXiNot supported
    \vcentcolon:=Not supported:=\mathrel{\vcentcolon =}Not supported\mathrel{\vcentcolon =}
    \vcenterNot supportedNot supportedNot supportedNot supported
    \Vdash\(\Vdash\)\Vdash\Vdash
    \VDashNot supportedNot supported\VDash
    \vDash\(\vDash\)\vDash\vDash
    \vdash\(\vdash\)\vdash\vdash
    \vdots\(\vdots\)\vdots\vdots
    \vecF\(\vec{F}\)F\vec{F}F\vec{F}\vec{F}
    \vee\(\vee\)\vee\vee
    \Vee Not supportedNot supported\Vee
    \veebar\(\veebar\)\veebar\veebar
    \veedotNot supportedNot supportedNot supported
    \veedoublebarNot supportedNot supportedNot supported
    \veeeqNot supportedNot supportedNot supported
    \veeonveeNot supportedNot supportedNot supported
    \verb\frac a b\(\verb!\frac a b!\)\frac a b\verb!\frac a b!Not supported\verb!\frac a b!
    \Vert\(\Vert\)\Vert\Vert
    \vert|\(\vert\)\vert|\vert
    \vfilNot supportedNot supportedNot supportedNot supported
    \vfillNot supportedNot supportedNot supportedNot supported
    \vlineNot supportedNot supportedNot supportedNot supported
    {Vmatrix}abcd\(\begin{Vmatrix}a&b\\c&d\end{Vmatrix}\)abcd\begin{Vmatrix}a&b\\c&d\end{Vmatrix}abcd\begin{Vmatrix}a&b\\c&d\end{Vmatrix}\begin{Vmatrix}
       a & b \\
       c & d
    \end{Vmatrix}
    {vmatrix}|abcd|\(\begin{vmatrix}a&b\\c&d\end{vmatrix}\)abcd\begin{vmatrix}a&b\\c&d\end{vmatrix}|abcd|\begin{vmatrix}a&b\\c&d\end{vmatrix}\begin{vmatrix}
       a & b \\
       c & d
    \end{vmatrix}
    \vphantomMa\(\overline{\vphantom{M}a}\)Ma\overline{\vphantom{M}a}Not supported\overline{\vphantom{M}a}
    \Vvdash\(\Vvdash\)\Vvdash\Vvdash
    - -

    W

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
    \wedge\(\wedge\)\wedge\wedge
    \WedgeNot supportedNot supported\wedge
    \wedgebarNot supportedNot supportedNot supported
    \wedgedotNot supportedNot supportedNot supported
    \wedgedoublebarNot supportedNot supportedNot supported
    \wedgeqNot supportedNot supportedNot supported
    \wedgeonwedgeNot supportedNot supportedNot supported
    \weierp\(\weierp\)\weierpNot supported
    \whitesquaretickleftNot supportedNot supportedNot supported
    \whitesquaretickrightNot supportedNot supportedNot supported
    \widecheckABˇNot supportedABˇ\widecheck{AB}ABˇ\widecheck{AB}\widecheck{AB}
    \widehatAB^\(\widehat{AB}\)AB^\widehat{AB}AB^\widehat{AB}\widehat{AB}
    \wideparenABNot supportedNot supportedNot supported -
    \widetildeAB~\(\widetilde{AB}\)AB~\widetilde{AB}AB˜\widetilde{AB}\widetilde{AB}
    \with&Not supportedNot supportedNot supported -
    \wn?Not supportedNot supportedNot supported
    \wp\(\wp\)\wp\wp
    \wr\(\wr\)\wr\wr
    - -

    X

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
    \xcancelABC\(\xcancel{ABC}\)ABC\xcancel{ABC}Not supported\xcancel{ABC}
    \XiΞ\(\Xi\)Ξ\XiΞ\Xi
    \xiξ\(\xi\)ξ\xiξ\xi
    \xhookleftarrowabcNot supportedabc\xhookleftarrow{abc}abc\xhookleftarrow{abc}\xhookleftarrow{abc}
    \xhookrightarrowabcNot supportedabc\xhookrightarrow{abc}abc\xhookrightarrow{abc}\xhookrightarrow{abc}
    \xLeftarrowabcNot supportedabc\xLeftarrow{abc}abc\xLeftarrow{abc}\xLeftarrow{abc}
    \xleftarrowabc\(\xleftarrow{abc}\)abc\xleftarrow{abc}abc\xleftarrow{abc}\xleftarrow{abc}
    \xleftharpoondownabcNot supportedabc\xleftharpoondown{abc}Not supported\xleftharpoondown{abc}
    \xleftharpoonupabcNot supportedabc\xleftharpoonup{abc}Not supported\xleftharpoonup{abc}
    \xLeftrightarrowabcNot supportedabc\xLeftrightarrow{abc}abc\xLeftrightarrow{abc}\xLeftrightarrow{abc}
    \xleftrightarrowabc\(\xleftrightarrow{abc}\)abc\xleftrightarrow{abc}abc\xleftrightarrow{abc}\xleftrightarrow{abc}
    \xleftrightharpoonsabcabcNot supportedabc\xleftrightharpoons{abc}abc\xleftrightharpoons{abc}\xleftrightharpoons{abc}
    \xlongequal=abc\(\xlongequal{abc}\)=abc\xlongequal{abc}Not supported\xlongequal{abc}
    \xmapstoabc\(\xmapsto{abc}\)abc\xmapsto{abc}abc\xmapsto{abc}\xmapsto{abc}
    \XorNot supportedNot supportedNot supported
    \xRightarrowabcNot supportedabc\xRightarrow{abc}abc\xRightarrow{abc}\xRightarrow{abc}
    \xrightarrowAabcBAghiabcdefB\(\begin{matrix}A \xrightarrow{abc} B\\ A \xrightarrow[ghi]{abcdef} B \end{matrix}\)AabcBAghiabcdefB\begin{matrix}A \xrightarrow{abc} B\\ A \xrightarrow[ghi]{abcdef} B \end{matrix}AabcBAghiabcdefB\begin{matrix}A \xrightarrow{abc} B\\ A \xrightarrow[ghi]{abcdef} B \end{matrix}A \xrightarrow{abc} B
    A \xrightarrow[ghi]{abcdef} B
    \xrightharpoondownabcNot supportedabc\xrightharpoondown{abc}Not supported\xrightharpoondown{abc}
    \xrightharpoonupabcNot supportedabc\xrightharpoonup{abc}Not supported\xrightharpoonup{abc}
    \xrightleftharpoonsabcabc\(\xrightleftharpoons{abc}\)abc\xrightleftharpoons{abc}abc\xrightleftharpoons{abc}\xrightleftharpoons{abc}
    \xtofromabcabc\(\xtofrom{abc}\)abc\xtofrom{abc}Not supported\xtofrom{abc}
    \xtwoheadleftarrowabc\(\xtwoheadleftarrow{abc}\)abc\xtwoheadleftarrow{abc}Not supported\xtwoheadleftarrow{abc}
    \xtwoheadrightarrowabc\(\xtwoheadrightarrow{abc}\)abc\xtwoheadrightarrow{abc}Not supported\xtwoheadrightarrow{abc}
    - -

    YZ

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionTemmlMathJaxKaTeXTeXZillaSource or Comment
    \yen¥\(\yen\)¥\yenNot supported
    \Z\(\Z\)Z\ZNot supported
    \ZetaΖ\(\Zeta\)Z\ZetaΖ\Zeta
    \zetaζ\(\zeta\)ζ\zetaζ\zeta
    - -
    - -

    Copyright © 2021-2024 Ron Kok. Released under the MIT License

    - -
    - -
    - - - - - - - - - \ No newline at end of file diff --git a/site/docs/en/support_table.html b/site/docs/en/support_table.html deleted file mode 100644 index 8e1652c1..00000000 --- a/site/docs/en/support_table.html +++ /dev/null @@ -1,1630 +0,0 @@ - - - - - - Temml Support Table - - - - - - -
    -

    Support Table

    -

    Temml is a JavaScript library that converts TeX math-mode functions to MathML. This page provides an alphabetically sorted list of TeX functions that Temml supports and some functions that it does not support. There is a similar page, with functions sorted by type.

    -

    Some functions are provided by an extension and are listed as such. They will be available only in pages that include the extension.

    -

    If you know the shape of a character, but not its name, Detexify can help.

    -

    Symbols

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionRenderedSource or CommentPackage
    !n!n!
    \!aba\!b
    #y2\def\bar#1{#1^2} \bar{y}
    \##
    %%this is a comment
    \%%
    &abcd\begin{matrix}
       a & b \\
       c & d
    \end{matrix}
    \&&
    '
    \'aˊ\text{\'{a}}
    ((
    ))
    \a ba\ b
    \"a¨\text{\"{a}}
    \$$
    \,aba\,\,{b}
    \.a˙\text{\.{a}}
    \:aba\:\:{b}
    \;aba\;\;{b}
    _xix_i
    \__
    \`aˋ\text{\'{a}}
    <<
    \=aˉ\text{\={a}}
    >>
    \>aba\>\>{b}
    [[
    ]]
    {a{a}
    }a{a}
    \{{
    \}}
    ||
    \|
    ~no no no breaks\text{no~no~no~breaks}
    \~a˜\text{\~{a}}
    \\abcd\begin{matrix}
       a & b \\
       c & d
    \end{matrix}
    ^xix^i
    \^aˆ\text{\^{a}}
    -

    A

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionRenderedSource or Comment
    \AA\text{\AA}
    \aaa˚\text{\aa}
    \aboveab+1{a \above{2pt} b+1}
    \abovewithdelimsNot supported
    \abs|x|\abs{x}physics extension
    \absolutevalue|x|\absolutevalue{x}physics extension
    \acomm{A,B}\acomm{A}{B}physics extension
    \acuteeˊ\acute e
    \AEÆ\text{\AE}
    \aeæ\text{\ae}
    \aleftexvc extension
    \alefsymtexvc extension
    \aleph
    {align}

    a=b+cd+e=f

    \begin{align}
       a&=b+c \\
       d+e&=f
    \end{align}
    ams
    {align*}

    a=b+cd+e=f

    \begin{align*}
       a&=b+c \\
       d+e&=f
    \end{align*}
    ams
    {aligned}

    a=b+cd+e=f

    \begin{aligned}
       a&=b+c \\
       d+e&=f
    \end{aligned}
    ams
    {alignat}

    10x+3y=23x+13y=4

    \begin{alignat}{2}
       10&x+ &3&y = 2 \\
       3&x+&13&y = 4
    \end{alignat}
    ams
    {alignat*}

    10x+3y=23x+13y=4

    \begin{alignat*}{2}
       10&x+ &3&y = 2 \\
       3&x+&13&y = 4
    \end{alignat*}
    ams
    {alignedat}

    10x+3y=23x+13y=4

    \begin{alignedat}{2}
       10&x+ &3&y = 2 \\
       3&x+&13&y = 4
    \end{alignedat}
    ams
    \allowbreak
    \AlphaΑ
    \alphaα
    \amalg⨿
    \And&
    \andNot supportedDeprecatedtexvc
    \angNot supportedDeprecatedtexvc
    \anglana_{\angl n}actuarialangle
    \anglnana_\anglnactuarialangle
    \angle
    \Angstromstix
    \anticommutator{A,B}\anticommutator{A}{B}physics extension
    \approx
    \approxeq
    \arccosarccos
    \arcctgarcctg
    \arceqstix
    \arcsinarcsin
    \arctanarctan
    \arctgarctg
    \argarg
    \argmaxarg maxstatmath
    \argminarg minstatmath
    {array}abcd\begin{array}{cc}
       a & b \\
       c & d
    \end{array}
    LaTeX2ε
    \arrayNot supportedSee{array}
    \arraystretchNot supported
    \ArrowvertNot supportedsee\Vert
    \arrowvertNot supportedsee\vert
    \ast
    \astrosunstix
    \asymp
    \atopab{a \atop b}
    \atopwithdelimsNot supported
    -

    B

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionRenderedSource or CommentPackage
    \backcong

    MnSymbol
    \backepsilon

    ams
    \backprimeσ\sigma^\backprimeams
    \backdprimeσ\sigma^\backdprimestix
    \backsim

    ams
    \backsimeq

    ams
    \backslash\

    \backtrprimeσ\sigma^\backtrprimestix
    \bary\bar{y}

    \barcap

    stix
    \barcup

    stix
    \barvee

    stix
    \barwedge

    ams
    \ballotx

    arev
    \Bbb𝔸𝔹\Bbb{ABC}

    \Bbbk𝕜

    \bboxNot supported

    \bcancel5\bcancel{5}cancel
    \because

    ams
    \beginabcd\begin{matrix}
    a & b \\
    c & d
    \end{matrix}
    ams
    \begingroupa\begingroup a\endgroup

    \BetaΒ

    \betaβ

    \beth

    ams
    \between

    ams
    \bf𝐀𝐚𝐁𝐛𝟏𝟐{\bf AaBb12}

    \bfseriesNot supported

    \big()\big(\big)

    \Big()\Big(\Big)

    \bigcap

    \bigcirc

    \bigcup

    \bigg()\bigg(\bigg)

    \Bigg()\Bigg(\Bigg)

    \biggl(\biggl(

    \Biggl(\Biggl(

    \biggm|\biggm\vert

    \Biggm|\Biggm\vert

    \biggr)\biggr)

    \Biggr)\Biggr)

    \bigl(\bigl(

    \Bigl(\Bigl(

    \bigm|\bigm\vert

    \Bigm|\Bigm\vert

    \bigodot

    \bigominusNot supported

    \bigoplus

    \bigoslashNot supported

    \bigotimes

    \bigr)\bigr)

    \Bigr)\Bigr)

    \bigtimes

    stix
    \bigsqcap

    \bigsqcup

    \bigstar

    ams
    \bigtriangledown

    \bigtriangleup

    \biguplus

    \bigvee

    \bigwedge

    \binom(nk)\binom n kams
    \blackhourglass

    stix
    \blacklozenge

    ams
    \blacksquare

    ams
    \blacktriangle

    ams
    \blacktriangledown

    ams
    \blacktriangleleft

    ams
    \blacktriangleright

    ams
    \bm𝑨𝒂𝑩𝒃\bm{AaBb}bm
    {Bmatrix}{abcd}\begin{Bmatrix}
    a & b \\
    c & d
    \end{Bmatrix}
    ams
    {Bmatrix*}{1324}\begin{Bmatrix*}[r]
    -1 & 3 \\
    2 & -4
    \end{Bmatrix*}
    mathtools
    {bmatrix}[abcd]\begin{bmatrix}
    a & b \\
    c & d
    \end{bmatrix}
    ams
    {bmatrix*}[1324]\begin{bmatrix*}[r]
    -1 & 3 \\
    2 & -4
    \end{bmatrix*}
    mathtools
    \bmodamodba \bmod b

    \bold𝐀𝐚𝐁𝐛𝟏𝟐𝟑\bold{AaBb123}

    \boldsymbol𝑨𝒂𝑩𝒃\boldsymbol{AaBb}ams
    \bot

    \Bot

    cmll
    \bowtie

    \Box

    ams
    \boxast

    stix
    \boxbox

    stix
    \boxcircle

    stix
    \boxdot

    ams
    \boxedab\boxed{ab}ams
    \boxminus

    ams
    \boxplus

    ams
    \boxtimes

    ams
    \Bqty{5mm}\Bqty{5 \text{mm}}physics extension
    \bqty[5mm]\bqty{5 \text{mm}}physics extension
    \Braψ|\Bra{\psi}braket
    \braψ|\bra{\psi}braket
    \braketϕ|ψ\braket{\phi|\psi}braket
    \Braketϕ|2t2|ψ\Braket{ϕ|\frac{∂^2}{∂ - t^2}|ψ}braket
    \brace{nk}{n\brace k}

    \bracevertNot supported

    \brack[nk]{n\brack k}

    \breveeu˘\breve{eu}

    \buildrelNot supported

    \bull

    texvc extension
    \bullet

    \Bumpeq

    ams
    \bumpeq

    ams
    -

    C

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionRenderedSource or Comment
    \CNot supportedDeprecatedtexvc
    \cc¸\text{\c{c}}
    \cal𝒜𝒶𝒷{\cal AaBb}
    \cancel5\cancel{5}cancel
    \Capams
    \cap
    \capbarcupstix
    \capdotstix
    \capovercupstix
    {cases}

    {aif bcif d

    \begin{cases}
       a &\text{if } b \\
       c &\text{if } d
    \end{cases}
    ams
    \casesNot supportedsee{cases}
    {CD}

    AaBbcC=D

    \begin{CD}
       A @>a>> B \\
    @VbVV @AAcA \\
       C @= D
    \end{CD}
    ams
    \cdot
    \cdotp·
    \cdots
    \ceCX6HX5CHO\ce{C6H5-CHO}mhchem extension
    \ceeNot supportedDeprecated
    Use\ce instead.
    mhchem
    \cent¢wasysym
    \centerdotams
    \cfNot supportedDeprecated
    Use\ce instead.
    mhchem
    \cfrac21+21\cfrac{2}{1+\cfrac{2}{1}}ams
    \checkoeˇ\check{oe}
    \chch
    \checkmarkams
    \ChiΧ
    \chiχ
    \choose(n+1k+2){n+1 \choose k+2}
    \circ
    \circeqams
    \circlearrowleftams
    \circlearrowrightams
    \circledastams
    \circledcircams
    \circledequalstix
    \circleddashams
    \circledparallelstix
    \circledR®ams
    \circledSams
    \circledvertstix
    \circlehbarstix
    \classNot supported
    \clineNot supported
    \closedvarcapstix
    \closedvarcupstix
    \clubstexvc extension
    \clubsuit
    \cnumstexvc extension
    \cohcmll
    \colon:
    \Colonapprox∷≈mathtools
    \colonapprox:mathtools
    \coloncoloncolonequals
    \coloncolonapprox∷≈colonequals
    \coloncolonequalscolonequals
    \coloncolonminus∷−colonequals
    \coloncolonsim:colonequals
    \colonminus:colonequals
    \Coloneq∷−mathtools
    \coloneq:mathtools
    \Coloneqqmathtools
    \coloneqqmathtools
    \Colonsim:mathtools
    \colonsim:mathtools
    \colorAaBb123\color{#0000FF} AaBb123color
    \colorboxBlack on red\colorbox{red}{Black on red}color
    \comm[A,B]\comm{A}{B}physics extension
    \commutator[A,B]\commutator{A}{B}physics extension
    \complementams
    \Complextexvc extension
    \concavediamondstix
    \concavediamondtickleftstix
    \concavediamondtickrightstix
    \cong
    \CoppaϘ
    \coppaϙ
    \coprod
    \copyright©
    \coscos
    \coseccosec
    \coshcosh
    \cotcot
    \cotgcotg
    \cothcoth
    \cp×physics extension
    \crabcd\begin{matrix}
       a & b \cr
       c & d
    \end{matrix}
    \cross×physics extension
    \crossproduct×physics extension
    \csccsc
    \cssIdNot supportedSee\id.
    \ctgctg
    \cthcth
    \Cupams
    \cup
    \cupovercapstix
    \curl×physics extension
    \curlyeqprecams
    \curlyeqsuccams
    \curlyveeams
    \curlywedgeams
    \curvearrowleftams
    \curvearrowrightams
    -

    D

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionRenderedSource or CommentPackage
    \dag
    \Daggertexvc extension
    \dagger
    \dalethams
    \Darrtexvc extension
    \dArrtexvc extension
    \darrtexvc extension
    {darray}

    abcd

    \begin{darray}{cc}
       a & b \\
       c & d
    \end{darray}
    \dashleftarrowams
    \dashrightarrowams
    \dashv
    \dbinom(nk)\dbinom n kams
    \dblcolonmathtools
    {dcases}

    {aif bcif d

    \begin{dcases}
       a &\text{if } b \\
       c &\text{if } d
    \end{dcases}
    mathtools
    \ddd\ddphysics extension
    \ddag
    \ddagger
    \ddddotx….\ddddot xams
    \dddotx\dddot xams
    \ddotx¨\ddot x
    \ddots
    \DeclareMathOperatorNot supported
    \defx2+x2\def\foo{x^2} \foo + \foo
    \definecolorF=ma\definecolor{sortaGreen}{RGB}{128,128,0}
    \color{sortaGreen} F=ma
    xcolor
    \degdeg
    \degree°
    \deltaδ
    \DeltaΔ
    \derivativedxdy\derivative{x}{y}physics extension
    \detdet
    \dfraca1b1\dfrac{a-1}{b-1}ams
    \diameterstix
    \differentiald\differentialphysics extension
    \diagdownams
    \diagonalmatrixNot supportedphysics
    \diagupams
    \Diamond
    \diamond
    \diamondstexvc extension
    \diamondsuit
    \DigammaNot supported
    \digammaϝams
    \dimdim
    \displaylinesNot supported
    \displaystyle0n\displaystyle\sum_0^n
    \div÷
    \divergence\divergencephysics extension
    \divideontimesams
    \dotx˙\dot x
    \Doteqams
    \doteq
    \doteqdotams
    \dotminusstix
    \dotplusams
    \dotproduct\dotproductphysics extension
    \dotsx1++xnx_1 + \dots + x_n
    \dotsbx1++xnx_1 +\dotsb + x_nams
    \dotscx,,yx,\dotsc,yams
    \dotsi

    A1A2

    \int_{A_1}\int_{A_2}\dotsiams
    \dotsmx1x2xn$x_1 x_2 \dotsm x_nams
    \dotsoams
    \doublebarveestix
    \doublebarwedgestix
    \doublecapams
    \doublecupams
    \Downarrow
    \downarrow
    \downdownarrowsams
    \downharpoonleftams
    \downharpoonrightams
    \dprimeff^\dprimestix
    {drcases}aif bcif d}\begin{drcases}
       a &\text{if } b \\
       c &\text{if } d
    \end{drcases}
    mathtools
    \dvdxdy\dv{x}{y}physics extension
    \dyad|ab|\dyad{a}{b}physics extension
    -

    E

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionRenderedSource or CommentPackage
    \Earthstix
    \edefa\def\foo{a}\edef\bar{\foo}\def\foo{}\bar
    \ell
    \elseNot supported
    \emNot supported
    \emphNot supported
    \emptytexvc extension
    \emptyset
    \encloseNot supportedNon standard.
    See\boxed,\cancel,\bcancel,
    \xcancel,\sout,\angl
    \endabcd\begin{matrix}
       a & b \\
       c & d
    \end{matrix}
    \endgroupa\begingroup a\endgroup
    \enspaceaba\enspace b
    \EpsilonΕ
    \epsilonϵ
    \eqalignNot supportedSee {align*}
    \eqalignnoNot supportedSee {align}
    \eqcircams
    \Eqcolon−∷mathtools
    \eqcolonmathtools
    \eqequnicodemath
    \eqeqequnicodemath
    \equalscoloncolonequals
    \equalscoloncolon=∷colonequals
    {equation}

    a=b+c

    \begin{equation}
       a = b + c
    \end{equation}
    ams
    {equation*}

    a=b+c

    \begin{equation*}
       a = b + c
    \end{equation*}
    ams
    {eqnarray}Not supported
    \Eqqcolon=∷mathtools
    \eqqcolonmathtools
    \eqdefstix
    \eqref\eqref{tag1}
    Some sites do not support\eqref.
    ams
    \eqsimams
    \eqslantgtrams
    \eqslantlessams
    \equiv
    \erferf(x)\erf(x)physics extension
    \EtaΗ
    \etaη
    \ethðams
    \euro
    \evx\ev{x}physics extension
    \eval12x|0n\eval{\tfrac 1 2 x}_0^nphysics extension
    \evaluated12x|0n\evaluated{\tfrac 1 2 x}_0^nphysics extension
    \existtexvc extension
    \exists
    \expexp
    \expandafter
    \expectationvaluex\expectationvalue{x}physics extension
    \expvalx\expval{x}physics extension
    -

    F

    - - - - - - - - - - - - - - - - - - - -
    FunctionRenderedSource or CommentPackage
    \fallingdotseqams
    \fboxHi there!\fbox{Hi there!}
    \fcolorboxA\fcolorbox{red}{aqua}{A}xcolor
    \fdvδxδy\fdv{x}{y}physics extension
    \femalestix
    \fiNot supported
    \Finvams
    \flat
    \footnotesizefootnotesize\footnotesize footnotesize
    \forall
    \fracab\frac a bams
    \frak𝔄𝔞𝔅𝔟\frak{AaBb}
    \frown
    \fullouterjoinstix
    \functionalderivativeδxδy\functionalderivative{x}{y}physics extension
    \futurelet
    -

    G

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionRenderedSource or CommentPackage
    \Gameams
    \GammaΓ
    \gammaγ
    {gather}

    a=be=b+c

    \begin{gather}
       a=b \\
       e=b+c
    \end{gather}
    ams
    {gather*}

    a=be=b+c

    \begin{gather*}
       a=b \\
       e=b+c
    \end{gather*}
    ams
    {gathered}a=be=b+c\begin{gathered}
       a=b \\
       e=b+c
    \end{gathered}
    ams
    \gcdgcd
    \gdefNot supported
    \ge
    \geneuroNot supportedSee\euro
    \geneuronarrowNot supportedSee\euro
    \geneurowideNot supportedSee\euro
    \genfrac(aa+1]\genfrac ( ] {2pt}{0}a{a+1}ams
    \geq
    \geqqams
    \geqslantams
    \gets
    \gg
    \gggams
    \gggtrams
    \gimelams
    \globalNot supported
    \gnapproxams
    \gneqams
    \gneqqams
    \gnsimams
    \gradphysics extension
    \gradientphysics extension
    \graveeu`\grave{eu}
    \gta>ba \gt bMathJax
    \gtrapproxams
    \gtrdotams
    \gtreqlessams
    \gtreqqlessams
    \gtrlessams
    \gtrsimams
    \gvertneqq≩︀ams
    -

    H

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionRenderedSource or CommentPackage
    \Ha˝\text{\H{a}}
    \Harrtexvc extension
    \hArrtexvc extension
    \harrtexvc extension
    \hatθ^\hat{\theta}
    \hbar
    \hbox x2\hbox{$x^2$}
    \hbox toNot supported
    \hdashlineabcd\begin{matrix}
       a & b \\
       \hdashline
       c & d
    \end{matrix}
    arydshln
    \heartstexvc extension
    \heartsuit
    \hfilNot supported
    \hfillNot supported
    \hlineabcd\begin{matrix}
       a & b \\ \hline
       c & d
    \end{matrix}
    \homhom
    \hookleftarrow
    \hookrightarrow
    \hourglassstix
    \hphantomabcda\hphantom{bc}d
    \hrefTEMML\href{https://temml.org/}{\Temml}
    Requirestrustoption
    href
    \hskipwidw\hskip1em i\hskip2em d
    \hslashams
    \hspacesks\hspace{7ex} k
    \classx\class{foo}{x}
    Must enabletrust and disablestrictoption
    \datax\data{foo=a, bar=b}{x}
    Must enabletrust and disablestrictoption
    \idx\id{bar}{x}
    Must enabletrust and disablestrictoption
    \stylex\style{color: red;}{x}
    Must enabletrust and disablestrictoption
    \hugehuge\huge huge
    \HugeHuge\Huge Huge
    -

    I

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionRenderedSource or CommentPackage
    \iı\text{\i}
    \idotsint\int\idotsint\intams
    \iddots
    \ifNot supported
    \iffABA\iff B
    \ifmodeNot supported
    \ifxNot supported
    \iiiintams
    \iiintams
    \iintams
    \Im
    \imagetexvc extension
    \imageofstix
    \imathı
    \impliedbyPQP\impliedby Qams
    \impliesPQP\implies Qams
    \in
    \includegraphicssphere\includegraphics[height=1em,
    totalheight=1.2em, width=1.2em,
    alt=sphere]{../sphere.jpg}
    graphicx
    \incohcmll
    \infinf
    \infintexvc extension
    \infty
    \injliminj lim\injlimams
    \innerproducta|b\innerproduct{a}{b}physics extension
    \int
    \intbar
    \intBar
    \intcap
    \intclockwise
    \intcup
    \intercalams
    \interleavestix
    \intlarhk
    \intop
    \intx
    \invampcmll
    \invlazysstix
    \IotaΙ
    \iotaι
    \isintexvc extension
    \itAaBb{\it AaBb}
    \itshapeNot supported
    -

    JK

    - - - - - - - - - - - - - - - -
    FunctionRenderedSource or CommentPackage
    \jȷ\text{\j}
    \jmathȷ
    \Joinams
    \KappaΚ
    \kappaκ
    \kerker
    \kernIRI\kern-2.5pt R
    \Ket|ψ\Ket{\psi}braket
    \ket|ψ\ket{\psi}braket
    \ketbra|ab|\ketbra{a}{b}physics extension
    \KoppaϞ
    \koppaϟ
    -

    L

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionRenderedSource or CommentPackage
    \LNot supported
    \lNot supported
    \LambdaΛ
    \lambdaλ
    \label\label{idName}
    Creates an HTML id.
    Characters limited to:A-Za-z0-9_-
    \land
    \langA\lang A\rangletexvc extension
    \lAngleA\lAngle A\rAngleunicode-math
    \langleA\langle A\rangle
    \laplacian2physics extension
    \Larrtexvc extension
    \lArrtexvc extension
    \larrtexvc extension
    \largelarge\large large
    \LargeLarge\Large Large
    \LARGELARGE\LARGE LARGE
    \LaTeXLATEX
    \lBracestix
    \lbrace{
    \lbrack[
    \lceil
    \ldotp.
    \ldots
    \le
    \leadstoams
    \left{ab\left\lbrace \dfrac ab \right.
    \leftarrow
    \Leftarrow
    \LeftArrowNot supportedNon standard
    \leftarrowtailams
    \leftharpoondown
    \leftharpoonup
    \leftleftarrowsams
    \leftmodelsMnSymbol
    \leftmoonstix
    \leftouterjoinstix
    \Leftrightarrow
    \leftrightarrow
    \leftrightarrowsams
    \leftrightharpoonsams
    \leftrightsquigarrowams
    \leftrootNot supported
    \leftthreetimesams
    \leq
    \leqalignnoNot supported
    \leqqams
    \leqslantams
    \lessapproxams
    \lessdotams
    \lesseqgtrams
    \lesseqqgtrams
    \lessgtrams
    \lesssimams
    \let
    \lfloor
    \lglg
    \lgroup
    \lhdams
    \lightning
    \limlim
    \liminflim inf
    \limitslimx\lim\limits_x
    \limsuplim sup
    \ll
    \llangleA\llangle A\rrangleunicode-math
    \llap=//{=}\llap{/\,}
    \llbracketstmaryrd
    \llcornerams
    \Lleftarrowams
    \lllams
    \lllessams
    \lmoustache
    \lnln
    \lnapproxams
    \lneqams
    \lneqqams
    \lnot¬
    \lnsimams
    \loglog
    \long
    \Longleftarrow
    \longleftarrow
    \Longleftrightarrow
    \longleftrightarrow
    \longmapsto
    \Longrightarrow
    \longrightarrow
    \looparrowleftams
    \looparrowrightams
    \lor
    \lowerMM2MM\lower5pt{M^2}M  or
    M\lower5pt\hbox{$M^2$}M
    \lozengeams
    \lozengeminusstix
    \lparen(mathtools
    \Lrarrtexvc extension
    \lrArrtexvc extension
    \lrarrtexvc extension
    \lrcornerams
    \lq
    \Lshams
    \lt<MathJax
    \ltimesams
    \lVertams
    \lvert|ams
    \lvertneqq≨︀ams
    -

    M

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionRenderedSource or CommentPackage
    \malestix
    \malteseams
    \mapsfromstmaryrd
    \mapsto
    \mathbb𝔸𝔹\mathbb{AB}ams
    \mathbf𝐀𝐚𝐁𝐛𝟏𝟐𝟑\mathbf{AaBb123}
    \mathbina!ba\mathbin{!}b
    \mathcal𝒜𝒶𝒷\mathcal{AaBb}
    \mathchoiceaba\mathchoice{\,}{\,\,}{\,\,\,}{\,\,\,\,}b
    \mathclap1inxi\sum_{\mathclap{1\le i\le n}} x_{i}mathtools
    \mathclosea+(b>+ca + (b\mathclose\gt + c
    \mathellipsis
    \mathfrak𝔄𝔞𝔅𝔟\mathfrak{AaBb}ams
    \mathinnerabinsidecdab\mathinner{\text{inside}}cd
    \mathitAaBb\mathit{AaBb}
    \mathllap=//{=}\mathllap{/\,}mathtools
    \mathnormalAaBb\mathnormal{AaBb}
    \mathopab\mathop{\star}_a^b
    \mathopena+<b)+ca + \mathopen\lt b) + c
    \mathord1,234,5671\mathord{,}234{,}567
    \mathpunctABA\mathpunct{-}B
    \mathrela#ba \mathrel{\#} b
    \mathrlap/=\mathrlap{\,/}{=}mathtools
    \mathringa˚\mathring{a}ams
    \mathrmAaBb12\mathrm{AaBb12}
    \mathscr𝒜\mathscr{AB}
    \mathsf𝖠𝖺𝖡𝖻𝟣𝟤𝟥\mathsf{AaBb123}
    \mathsterling£
    \mathstrut(a\sqrt{\mathstrut a}
    \mathtipNot supportedSee\texttip
    \mathtt𝙰𝚊𝙱𝚋𝟷𝟸𝟹\mathtt{AaBb123}
    \matrixNot supportedSee{matrix}
    {matrix}abcd\begin{matrix}
       a & b \\
       c & d
    \end{matrix}
    ams
    {matrix*}1324\begin{matrix*}[r]
       -1 & 3 \\
       2 & -4
    \end{matrix*}
    mathtools
    \matrixeln|A|m\matrixel{n}{A}{m}physics extension
    \matrixelementn|A|m\matrixelement{n}{A}{m}physics extension
    \meln|A|m\mel{n}{A}{m}physics extension
    \maxmax
    \mboxNot supported
    \mdNot supported
    \mdseriesNot supported
    \measeqstix
    \measuredangleams
    \medspaceaba\medspace bams
    \mho
    \mid{x|x>0}\{x∈ℝ\mid x>0\}
    \middleP(A|B)P\left(A\middle\vert B\right)ε-TeX
    \minmin
    \minuscoloncolonequals
    \minuscoloncolon−∷colonequals
    \minusdotstix
    \minusfdotsstix
    \minusrdotsstix
    \minusoNot supportedSee\standardstate
    \mitNot supportedSee\mathit
    \mkernaba\mkern18mu b
    \mmlTokenNot supported
    \mod35mod23\equiv 5 \mod 2ams
    \models
    \moveleftNot supported
    \moverightNot supported
    \mp
    \mskipaba\mskip{10mu}b
    \mspaceNot supported
    \MuΜ
    \muμ
    \multicolumnNot supported
    \multimapams
    \multimapbothcmll
    \multimapinvcmll
    {multline}

    unodostres

    \begin{multline}
      \rm uno \\
      \rm dos \\
      \rm tres
    \end{multline}
    ams
    {multline*}

    unodostres

    \begin{multline*}
      \rm uno \\
      \rm dos \\
      \rm tres
    \end{multline*}
    ams
    -

    N

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionRenderedSource or CommentPackage
    \Ntexvc extension
    \nabla
    \Nandstix
    \natnumstexvc extension
    \natural
    \negmedspaceaba\negmedspace bams
    \ncongams
    \ne
    \nearrow
    \neg¬
    \negthickspaceaba\negthickspace bams
    \negthinspaceaba\negthinspace bams
    \neq
    \newcommand\newcommand\chk{\checkmark} \chknewcommand
    \newenvironmentNot supported
    \newextarrowNot supportedextpfeil
    \newlineaba\newline b
    \nexistsams
    \ngeqams
    \ngeqqams
    \ngeqslantams
    \ngtrams
    \ni
    \nleftarrowams
    \nLeftarrowams
    \nLeftrightarrowams
    \nleftrightarrowams
    \nleqams
    \nleqqams
    \nleqslantams
    \nlessams
    \nmidams
    \nobreak
    \nobreakspacea ba\nobreakspace bams
    \noexpand
    \nolimitslimx\lim\nolimits_x
    \Norstix
    \normx\norm{x}physics extension
    \normalfontNot supported
    \normalsizenormalsize\normalsize normalsize
    \not\not =
    \notag

    a=bd+e=f

    \begin{align}
      a&=b \\
      \notag d+e&=f
    \end{align}
    ams
    \notin
    \notnitxfonts/pxfonts
    \nparallelams
    \nprecams
    \npreceqams
    \nRightarrowams
    \nrightarrowams
    \nshortmidams
    \nshortparallelams
    \nsimams
    \nsubsetmathabx
    \nsubseteqams
    \nsubseteqqams
    \nsuccams
    \nsucceqams
    \nsupsetmathabx
    \nsupseteqams
    \nsupseteqqams
    \ntriangleleftams
    \ntrianglelefteqams
    \ntrianglerightams
    \ntrianglerighteqams
    \NuΝ
    \nuν
    \nVDashams
    \nVdashams
    \nvDashams
    \nvdashams
    \nwarrow
    -

    O

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionRenderedSource or CommentPackage
    \OØ\text{\O}
    \oø\text{\o}
    \obarstix
    \obslashstix
    \oc!cmll
    \odivstix
    \odot
    \odvdfdx\odv{f}{x}derivative
    \odv*ddxf\odv*{f}{x}derivative
    \OEŒ\text{\OE}
    \oeœ\text{\oe}
    \officialeuroNot supportedSee\euro
    \ogreaterthanstix
    \oiiint
    \oiint
    \oint
    \oldstyleNot supported
    \oldstylenumsNot supported
    \olessthanstix
    \omegaω
    \OmegaΩ
    \OmicronΟ
    \omicronο
    \ominus
    \op|ab|\op{a}{b}physics extension
    \operatornameasinx\operatorname{asin} xams
    \operatorname*asinyx\operatorname*{asin}\limits_y xams
    \operatornamewithlimitsasinyx\operatornamewithlimits{asin}\limits_y x
    \operpstix
    \oplus⊕︎
    \orNot supported
    \order𝒪(x2)\order{x^2}physics extension
    \origofstix
    \oslash
    \otimes
    \Otimesstix
    \otimeshatstix
    \outerproduct|ab|\outerproduct{a}{b}physics extension
    \overa+1b+2+c{a+1 \over b+2}+c
    \overbracex++xn times\overbrace{x+⋯+x}^{n\text{ times}}
    \overbracketNot supported
    \overgroupAB\overgroup{AB}MnSymbol
    \overleftarrowAB\overleftarrow{AB}ams
    \overleftharpoonAB\overleftharpoon{AB}MnSymbol
    \overleftrightarrowAB\overleftrightarrow{AB}ams
    \overlinea long argument\overline{\text{a long argument}}
    \overlinesegmentNot supported
    \overparenabc\overparen{abc}
    \OverrightarrowAB\Overrightarrow{AB}overrightarrow
    \overrightarrowAB\overrightarrow{AB}ams
    \overrightharpoonac\overrightharpoon{ac}
    \overset=!\overset{!}{=}ams
    \overwithdelimsNot supported
    \owns
    -

    P

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionRenderedSource or CommentPackage
    \P\text{\P} or\P
    \pagecolorNot supportedDeprecatedtexvc
    \parallel
    \parrcmll
    \partNot supportedDeprecatedtexvc
    \partial
    \partialderivativexy\partialderivative{x}{y}physics extension
    \pb{x,y}\pb{x}{y}physics extension
    \pdv2fxy\pdv{f}{x,y}derivative
    \pdv*2xyf\pdv*{f}{x,y}derivative
    \permilwasysym
    \perp
    \Perpcmll
    \phantomΓijkij\Gamma^{\phantom{i}j}_{i\phantom{j}k}
    \phaseNot supported
    \PhiΦ
    \phiϕ
    \PiΠ
    \piπ
    {picture}Not supported
    \pitchforkams
    \plimplimstatmath
    \plusmn±texvc extension
    \pm±
    \pmatrixNot supportedSee{pmatrix}
    {pmatrix}(abcd)\begin{pmatrix}
       a & b \\
       c & d
    \end{pmatrix}
    ams
    {pmatrix*}(1324)\begin{pmatrix*}[r]
       -1 & 3 \\
       2 & -4
    \end{pmatrix*}
    mathtools
    \pmbμ\pmb{\mu}ams
    \pmodx(moda)x\pmod a
    \podx(a)x \pod aams
    \pointint
    \poissonbracket{A,B}\poissonbracket{A}{B}physics extension
    \pounds£
    \pqty(5)\pqty{5}physics extension
    \PrPr
    \prec
    \precapproxams
    \preccurlyeqams
    \preceqams
    \precnapproxams
    \precneqqams
    \precnsimams
    \precsimams
    \prescript𝐂25+a2\prescript{a}{2}{\mathbf{C}}^{5+}_{2}mathtools
    \prime
    \principalvalue𝒫physics extension
    \pv𝒫physics extension
    \PVP.V.(x)\PV(x)physics extension
    \prod
    \projlimproj lim\projlimams
    \propto
    \providecommandHello\providecommand\greet{\text{Hello}}
    \greet
    \psiψ
    \PsiΨ
    \pu123 kJmol\pu{123 kJ//mol}mhchem extension
    -

    Q

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionRenderedSource or CommentPackage
    \QNot supportedSee\Bbb{Q}
    \qallallphysics extension
    \qandandphysics extension
    \qasasphysics extension
    \qassumeassumephysics extension
    \qc,physics extension
    \qccc.c.physics extension
    \qcomma,physics extension
    \QEDstix
    \qelseelsephysics extension
    \qevenevenphysics extension
    \qforforphysics extension
    \qgivengivenphysics extension
    \qififphysics extension
    \qininphysics extension
    \qintegerintegerphysics extension
    \qletletphysics extension
    \qoddoddphysics extension
    \qororphysics extension
    \qotherwiseotherwisephysics extension
    \qprimeff^\qprimestix
    \qq text \qq{text}physics extension
    \qqtext text \qqtext{text}physics extension
    \qquadaba\qquad\qquad{b}
    \qsincesincephysics extension
    \qthenthenphysics extension
    \qty{5m}\qty{5 \text{m}}physics extension
    \quadaba\quad\quad{b}
    \quantity{5m}\quantity{5 \text{m}}physics extension
    \qunlessunlessphysics extension
    \qusingusingphysics extension
    \questeqstix
    -

    R

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionRenderedSource or CommentPackage
    \Rtexvc extension
    \ra˚\text{\r{a}}
    \raiseMM2MM\raise3pt{M^2}M  or
    M\raise3pt\hbox{$M^2$}M
    \raiseboxhigherh\raisebox{2pt}{ighe}r
    \rangA\langle A\rangtexvc extension
    \rAngleA\lAngle A\rAngleunicode-math
    \rangleA\langle A\rangle
    \rankrankM\rank Mphysics extension
    \Rarrtexvc extension
    \rArrtexvc extension
    \rarrtexvc extension
    \ratio:colonequals
    \rBracestix
    \rbrace}
    \rbrack]
    {rcases}aif bcif d}\begin{rcases}
       a &\text{if } b \\
       c &\text{if } d
    \end{rcases}
    mathtools
    \rceil
    \Re
    \realtexvc extension
    \Realstexvc extension
    \realstexvc extension
    \ref\ref{tag1}
    Some sites do not support\ref.
    \reflectboxS\reflectbox{S}graphicx
    \relax
    \renewcommandAhoy!\def\hail{Hi!}
    \renewcommand\hail{\text{Ahoy!}}
    \hail
    newcommand
    \renewenvironmentNot supportednewcommand
    \requireNot supported
    \ResRes[f(z)]\Res[f(z)]physics extension
    \restrictionams
    \rfloor
    \rgroup
    \rhdams
    \RhoΡ
    \rhoρ
    \rightab)\left.\dfrac a b\right)
    \Rightarrow
    \rightarrow
    \rightarrowtailams
    \rightharpoondown
    \rightharpoonup
    \rightleftarrowsams
    \rightleftharpoonsams
    \rightmoonstix
    \rightouterjoinstix
    \rightrightarrowsams
    \rightsquigarrowams
    \rightthreetimesams
    \risingdotseqams
    \rlap/=\rlap{\,/}{=}
    \rmAaBb12{\rm AaBb12}
    \rmoustache
    \rootNot supported
    \rotateboxNot supported
    \rparen)mathtools
    \rppolint
    \rq
    \rrangleA\llangle A\rrangleunicode-math
    \rrbracketstmaryrd
    \Rrightarrowams
    \Rshams
    \rtimesams
    \RuleNot supportedsee\rule
    \rulexxx\rule[6pt]{2ex}{1ex}x
    \rVertams
    \rvert|ams
    -

    S

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionRenderedSource or CommentPackage
    \S§\text{\S} or\S

    \SampiϠ

    \sampiϡ

    \scNot supportedSee\textsc

    \scoh

    cmll
    \scaleboxNot supported

    \scpolint

    \scrNot supportedSee\mathscr

    \scriptscriptstylecd\scriptscriptstyle \frac -cd

    \scriptsizescriptsize\scriptsize scriptsize

    \scriptstyleABA{\scriptstyle B}

    \sdot

    texvc extension
    \searrow

    \secsec

    \sect§\text{\sect}texvc extension
    \set{x|x<5}\set{x | x<5}braket
    \Set{x|x<12}\Set{ x | x < \tfrac 1 2 }braket
    \setlengthNot supported

    \setminus

    \sf𝖠𝖺𝖡𝖻𝟣𝟤𝟥{\sf AaBb123}

    \sgnsgn

    mismath
    \sharp

    \shift

    cmll
    \shneg

    cmll
    \shortmid

    ams
    \shortparallel

    ams
    \shoveleftNot supported

    ams
    \shoverightNot supported

    ams
    \shpos

    cmll
    \shuffle

    stix
    \sidesetcdab\sideset{_a^b}{_c^d}\sumams
    \SigmaΣ

    \sigmaσ

    \sim

    \simeq

    \sinsin

    \sincoh

    cmll
    \sinhsinh

    \sixptsizesixptsize\sixptsize sixptsize

    \shsh

    \skewNot supported

    \skipNot supported

    \slNot supported

    \smallsmall\small small

    \smallfrown

    ams
    \smallint

    {smallmatrix}abcd\begin{smallmatrix}
       a & b \\
       c & d
    \end{smallmatrix}

    \smallsetminus

    ams
    \smallsmile

    ams
    \smash(x2)\left(x^{\smash{2}}\right)

    \smashtimes

    stix
    \smile

    \smiley

    wasysym
    \soutabc\sout{abc}ulem
    \SpaceNot supportedsee\space

    \spacea ba\space b

    \spades

    texvc extension
    \spadesuit

    \sphericalangle

    ams
    {split}

    a=b+c=e+f

    \begin{equation}
    \begin{split}
       a &=b+c\\
          &=e+f
    \end{split}
    \end{equation}
    ams
    \sqcap

    \Sqcap

    stix
    \sqcup

    \Sqcup

    stix
    \sqint

    \square

    \sqrtx3\sqrt[3]{x}

    \sqsubset

    ams
    \sqsubseteq

    \sqsupset

    ams
    \sqsupseteq

    ams
    \ssß\text{\ss}

    \sslash

    stmaryrd
    \stackrel=!\stackrel{!}{=}

    \standardstate

    chemstyle
    \star

    \stareq

    stix
    \StigmaϚ

    \stigmaϛ

    \strictif

    txfonts/pxfonts
    \strictfi

    txfonts/pxfonts
    \strutNot supported

    \styleNot supportedNon standard

    \sub

    texvc extension
    {subarray}

    iΛ0<j<nP(i,j)

    \sum_{\begin{subarray}{l}
     i\in\Lambda\\
      0<j<n
    \end{subarray}}P(i,j)
    ams
    \sube

    texvc extension
    \Subset

    ams
    \subset

    \subseteq

    \subseteqq

    ams
    \subsetneq

    ams
    \subsetneqq

    ams
    \substack

    0<i<m0<j<n

    \sum_{\substack{0<i<m\\0<j<n}}ams
    \succ

    \succapprox

    ams
    \succcurlyeq

    ams
    \succeq

    \succnapprox

    ams
    \succneqq

    ams
    \succnsim

    ams
    \succsim

    ams
    \sum

    \sun

    stix
    \supsup

    \supe

    texvc extension
    \Supset

    ams
    \supset

    ams
    \supseteq

    \supseteqq

    ams
    \supsetneq

    ams
    \supsetneqq

    ams
    \surd|

    \swarrow

    -

    T

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionRenderedSource or CommentPackage
    \tag

    e=mc2(hi)

    \tag{hi} e=mc^2 \label{tag1}ams
    \tag*

    e=mc2hey

    \tag*{hey} e=mc^2ams
    \tantan
    \tanhtanh
    \TauΤ
    \tauτ
    \tbinom(nk)\tbinom n kams
    \TeXTEX
    \text yes & no \text{ yes }\&\text{ no }
    \textasciitilde~\text{\textasciitilde}
    \textasciicircum^\text{\textasciicircum}
    \textbackslash\\text{\textbackslash}
    \textbar|\text{\textbar}
    \textbardbl\text{\textbardbl}
    \textbf𝐀𝐚𝐁𝐛𝟏𝟐𝟑\textbf{AaBb123}
    \textbraceleft{\text{\textbraceleft}
    \textbraceright}\text{\textbraceright}
    \textbullet\text{\textbullet}
    \textcircledNot supported
    \textcolorF=ma\textcolor{blue}{F=ma}color
    \textdagger\text{\textdagger}
    \textdaggerdbl\text{\textdaggerdbl}
    \textdegree°\text{\textdegree}
    \textdollar$\text{\textdollar}
    \textellipsis\text{\textellipsis}
    \textemdash\text{\textemdash}
    \textendash\text{\textendash}
    \texteuro\text{\texteuro}
    \textgreater>\text{\textgreater}
    \textit𝐴𝑎𝐵𝑏\textit{AaBb}
    \textless<\text{\textless}
    \textmdAaBb123\textmd{AaBb123}
    \textnormalAB\textnormal{AB}
    \textquotedblleft\text{\textquotedblleft}
    \textquotedblright\text{\textquotedblright}
    \textquoteleft\text{\textquoteleft}
    \textquoteright\text{\textquoteright}
    \textregistered®\text{\textregistered}
    \textrmAaBb123\textrm{AaBb123}
    \textscʜᴇʏ\textsc{hey}
    \textsf𝖠𝖺𝖡𝖻𝟣𝟤𝟥\textsf{AaBb123}
    \textslNot supported
    \textsterling£\text{\textsterling}
    \textstyle0n\textstyle\sum_0^n
    \texttt𝙰𝚊𝙱𝚋𝟷𝟸𝟹\texttt{AaBb123}
    \textunderscore_\text{\textunderscore}
    \textupAaBb123\textup{AaBb123}
    \textvisiblespace\text{\textvisiblespace}
    \tfracab\tfrac abams
    \tgtg
    \thth
    \thereforeams
    \ThetaΘ
    \thetaθ
    \thetasymϑtexvc extension
    \thickapproxams
    \thicksimams
    \thickspaceaba\thickspace bams
    \thinspaceaba\thinspace bams
    \threedotcolonstix
    \tildeM~\tilde M
    \times×
    \TinyTiny\Tiny Tiny
    \tinytiny\tiny tiny
    \to
    \top
    \TrTrρ\Tr\rhophysics extension
    \trtrρ\tr\rhophysics extension
    \triangle
    \triangledownams
    \triangleleft
    \trianglelefteqams
    \triangleqams
    \triangleminusstix
    \triangleplusstix
    \triangleright
    \trianglerighteqams
    \triangletimesstix
    \trprimeff^\trprimestix
    \tt𝙰𝚊𝙱𝚋𝟷𝟸𝟹{\tt AaBb123}
    \twocapsstix
    \twocupsstix
    \twoheadleftarrowams
    \twoheadrightarrowams
    \typecolonstix
    -

    U

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionRenderedSource or CommentPackage
    \ua˘\text{\u{a}}
    \Uarrtexvc extension
    \uArrtexvc extension
    \uarrtexvc extension
    \ulcornerams
    \underbarX\underbar{X}
    \underbracex++xn times\underbrace{x+⋯+x}_{n\text{ times}}
    \underbracketNot supported
    \undergroupAB\undergroup{AB}MnSymbol
    \underleftarrowAB\underleftarrow{AB}ams
    \underleftrightarrowAB\underleftrightarrow{AB}ams
    \underrightarrowAB\underrightarrow{AB}ams
    \underlinea long argument\underline{\text{a long argument}}
    \underlinesegmentNot supported
    \underparenabc\underparen{abc}
    \underrightarrowAB\underrightarrow{AB}
    \underset=!\underset{!}{=}AMS
    \unicodeNot supportedSee\char
    \unlhdams
    \unrhdams
    \upNot supported
    \upalphaαupgreek
    \Uparrow
    \uparrow
    \upbetaβupgreek
    \updeltaδupgreek
    \upchiχupgreek
    \Updownarrow
    \updownarrow
    \upetaηupgreek
    \upepsilonϵupgreek
    \upgammaγupgreek
    \upharpoonleftams
    \upharpoonrightams
    \upiotaιupgreek
    \upkappaκupgreek
    \uplambdaλupgreek
    \upmuμupgreek
    \upnuνupgreek
    \upomegaωupgreek
    \upomicronοupgreek
    \uplusupgreek
    \upphiϕupgreek
    \uppiπupgreek
    \uppsiψupgreek
    \uprhoρupgreek
    \uprootNot supported
    \upshapeNot supported
    \upsigmaσupgreek
    \UpsilonΥ
    \upsilonυ
    \uptauτupgreek
    \upthetaθupgreek
    \upuparrowsams
    \upupsilonυupgreek
    \upxiξupgreek
    \upzetaζupgreek
    \urcornerams
    \url𝚑𝚝𝚝𝚙𝚜://𝚝𝚎𝚖𝚖𝚕.𝚘𝚛𝚐/\url{https://temml.org/}
    Requirestrustoption
    \utildeAB~\utilde{AB}undertilde
    -

    V

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionRenderedSource or CommentPackage
    \vaˇ\text{\v{a}}
    \va𝒂\va{a}physics extension
    \varδphysics extension
    \varcoppaϙ
    \varclubsuittxfonts
    \varDelta𝛥ams
    \vardiamondsuittxfonts
    \varepsilonε
    \varGamma𝛤ams
    \varheartsuittxfonts
    \variationδphysics extension
    \varinjlimlim\varinjlimams
    \varkappaϰams
    \varLambda𝛬ams
    \varliminflim\varliminfams
    \varlimsuplim\varlimsupams
    \varnothingams
    \varointclockwise
    \varOmega𝛺ams
    \varPhi𝛷ams
    \varphiφ
    \varPi𝛱ams
    \varpiϖ
    \varprojlimlim\varprojlimams
    \varproptoams
    \varPsi𝛹ams
    \varrhoϱ
    \varSigma𝛴ams
    \varsigmaς
    \varspadesuittxfonts
    \varstigmaNot supported
    \varsubsetneq⊊︀ams
    \varsubsetneqq⫋︀ams
    \varsupsetneqams
    \varsupsetneqq⫌︀ams
    \varTheta𝛩ams
    \varthetaϑ
    \vartriangleams
    \vartriangleleftams
    \vartrianglerightams
    \varUpsilon𝛶ams
    \varXi𝛯ams
    \vb𝒂\vb{a}physics extension
    \vcentcolon:
    \vcenterNot supported
    \Vdashams
    \VDashMnSymbol
    \vDashams
    \vdash
    \vdotphysics extension
    \vdots
    \vecF\vec{F}
    \vectorarrow𝒂\vectorarrow{a}physics extension
    \vectorbold𝒂\vectorbold{a}physics extension
    \vectorunit𝒂^\vectorunit{a}physics extension
    \vee
    \Veestix
    \veebarams
    \veedotstix
    \veedoublebarstix
    \veeeqstix
    \veeonveestix
    \verb\frac a b\verb!\frac a b!
    \Vert
    \vert|
    \vfilNot supported
    \vfillNot supported
    \vlineNot supported
    {Vmatrix}abcd\begin{Vmatrix}
       a & b \\
       c & d
    \end{Vmatrix}
    ams
    {Vmatrix*}1324\begin{Vmatrix*}[r]
       -1 & 3 \\
       2 & -4
    \end{Vmatrix*}
    mathtools
    {vmatrix}|abcd|\begin{vmatrix}
       a & b \\
       c & d
    \end{vmatrix}
    ams
    {vmatrix*}|1324|\begin{vmatrix*}[r]
       -1 & 3 \\
       2 & -4
    \end{vmatrix*}
    mathtools
    \vphantomMa\overline{\vphantom{M}a}
    \vqty|x|\vqty{x}physics extension
    \vu𝒂^\vu{a}physics extension
    \Vvdashams
    -

    W

    - - - - - - - - - - - - - - - - - - - - - -
    FunctionRenderedSource or CommentPackage
    \wedge
    \Wedgestix
    \wedgebarstix
    \wedgedotstix
    \wedgedoublebarstix
    \wedgeqstix
    \wedgeonwedgestix
    \weierptexvc extension
    \whitesquaretickleftstix
    \whitesquaretickrightstix
    \widecheckABˇ\widecheck{AB}mathabx
    \widehatAB^\widehat{AB}
    \wideparenabc\wideparen{abc}MnSymbol
    \widetildeAB~\widetilde{AB}
    \with&cmll
    \wn?cmll
    \wp
    \wr
    -

    X

    - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    FunctionRenderedSource or CommentPackage
    \xcancelABC\xcancel{ABC}cancel
    \xdefNot supported
    \XiΞ
    \xiξ
    \xhookleftarrowabc\xhookleftarrow{abc}mathtools
    \xhookrightarrowabc\xhookrightarrow{abc}mathtools
    \xLeftarrowabc\xLeftarrow{abc}mathtools
    \xleftarrowabc\xleftarrow{abc}ams
    \xleftharpoondownabc\xleftharpoondown{abc}mathtools
    \xleftharpoonupabc\xleftharpoonup{abc}mathtools
    \xLeftrightarrowabc\xLeftrightarrow{abc}mathtools
    \xleftrightarrowabc\xleftrightarrow{abc}mathtools
    \xleftrightharpoonsabcabc\xleftrightharpoons{abc}mathtools
    \xlongequal=abc\xlongequal{abc}extpfeil
    \xmapstoabc\xmapsto{abc}mathtools
    \Xorstix
    \xRightarrowabc\xRightarrow{abc}mathtools
    \xrightarrowabc\xrightarrow{abc}ams
    \xrightharpoondownabc\xrightharpoondown{abc}mathtools
    \xrightharpoonupabc\xrightharpoonup{abc}mathtools
    \xrightleftharpoonsabcabc\xrightleftharpoons{abc}mathtools
    \xtofromabcabc\xtofrom{abc}extpfeil
    \xtwoheadleftarrowabc\xtwoheadleftarrow{abc}extpfeil
    \xtwoheadrightarrowabc\xtwoheadrightarrow{abc}extpfeil
    -

    YZ

    - - - - - - - -
    FunctionRenderedSource or CommentPackage
    \yen¥ams
    \Ztexvc extension
    \ZetaΖ
    \zetaζ
    -
    -

    Copyright © 2021-2024 Ron Kok. Released under the MIT License

    -
    -
    - -
    - - - -
    - - - diff --git a/site/docs/en/supported.html b/site/docs/en/supported.html deleted file mode 100644 index d7d596b9..00000000 --- a/site/docs/en/supported.html +++ /dev/null @@ -1,768 +0,0 @@ - - - - - - Temml Functions - - - - - - -
    -

    Supported Functions

    -

    Temml is a JavaScript library that converts TeX math-mode functions to MathML. This page lists the TeX functions it supports, sorted into logical groups.

    -

    There is a similar Support Table, sorted alphabetically, that lists both supported and some un-supported functions.

    -

    Accents

    - - - - - - - - - - - - - - -
    f f'a~ \tilde{a}ac~ \widetilde{ac}
    f f''F \vec{F}AB~ \utilde{AB}
    f f^{\prime}AB \overleftarrow{AB}ABC \overrightarrow{ABC}
    aˊ \acute{a}AB \underleftarrow{AB}AB \underrightarrow{AB}
    y \bar{y}AB \overline{AB}AB \Overrightarrow{AB}
    a˘ \breve{a}AB \underline{AB}AB \overleftrightarrow{AB}
    aˇ \check{a}acˇ \widecheck{ac}AB \underleftrightarrow{AB}
    a˙ \dot{a}ac \overleftharpoon{ac}ac \overrightharpoon{ac}
    a¨ \ddot{a}AB \overgroup{AB}AB \wideparen{AB}
    a \dddot{a}AB \undergroup{AB}AB \overparen{AB}
    a…. \ddddot{a}X \underbar{X}AB \underparen{AB}
    a` \grave{a}g˚ \mathring{g}AB \overbrace{AB}
    θ^ \hat{\theta}ac^ \widehat{ac}AB \underbrace{AB}
    f f^{\dprime}f f^{\trprime}f f^{\qprime}
    σ \sigma^{\backprime}σ \sigma^{\backdprime}σ \sigma^{\backtrprime}
    -

    Accent functions inside \text{…}

    - - -
    aˊ \'{a}a˜ \~{a}a˙ \.{a}a˝ \H{a}
    aˋ \`{a}aˉ \={a}a¨ \"{a}aˇ \v{a}
    aˆ \^{a}a˘ \u{a}a˚ \r{a}c¸ \c{c}
    -

    See also letters

    -

    Annotation

    - - - - - - -
    5 \cancel{5}a+b+cnote \overbrace{a+b+c}^{\text{note}}
    5 \bcancel{5}a+b+cnote \underbrace{a+b+c}_{\text{note}}
    ABC \xcancel{ABC}π=cd \boxed{\pi=\frac c d}
    abc \sout{abc}

    \ref{tag1}

    x+y2x(hi)

    \tag{hi} x+y^{2x} \label{tag1}

    x+y2xbye

    \tag*{bye} x+y^{2x}
    -

    Also some environments have automatic equation numbering.

    -

    A \label{…} may be placed anywhere and will create an HTML id matching the \label{…} argument. That argument may contain only the characters A-Za-z0-9_-.

    -

    On sites where Temml fields are updated dynamically, \ref{…} may not be supported. Other Temml functions update only the local field. \ref{…} must make two passes through the entire document. Some sites may choose not to do this.

    -

    Color

    - - - - - - -
    F=ma {\color{blue} F=ma}F=ma {\color[RGB]{255,0,255} F=ma}
    F=ma \textcolor{blue}{F=ma}F=ma {\color[rgb]{1,0,1} F=ma}
    F=ma \textcolor{#228B22}{F=ma}F=ma {\color[HTML]{ff00ff} F=ma}
    A \colorbox{aqua}{A}\definecolor{sortaGreen}{RGB}{128,128,0}
    F=ma {\color{sortaGreen} F=ma}
    A \fcolorbox{red}{aqua}{A}
    -

    \definecolor functions can be included in a preamble. If so, their color definitions will have document-wide scope.

    -

    Color functions can all take an optional argument to set the color model, as in the xcolor package. (Exception: \definecolor’s model argument is required.) Temml supports color models HTML, RGB, and rgb.

    -

    If the color model is omitted, Temml color functions will accept:

    -
    • #rrggbb, #rgb, or rrggbb.

    • -
    • A color name previously created by \definecolor.

    • -
    • Any of the standard HTML predefined color names.

    • -
    • Any color from the following xcolor table.

    -
    - - - - - - - - - - - - - - - - - - - - -
      Apricot   ForestGreen   olive   RoyalPurple
      Aquamarine   Fuchsia   OliveGreen   RubineRed
      Bittersweet   Goldenrod   orange   Salmon
      blue   gray   Orange   SeaGreen
      Blue   Gray   OrangeRed   Sepia
      BlueGreen   green   Orchid   SkyBlue
      BlueViolet   Green   Peach   SpringGreen
      BrickRed   GreenYellow   Periwinkle   Tan
      brown   JungleGreen   PineGreen   teal
      Brown   Lavender   pink   TealBlue
      BurntOrange   lightgray   Plum   Thistle
      CadetBlue   lime   ProcessBlue   Turquoise
      CarnationPink   LimeGreen   purple   violet
      Cerulean   magenta   Purple   Violet
      CornflowerBlue   Magenta   RawSienna   VioletRed
      cyan   Mahogany   red   WildStrawberry
      Cyan   Maroon   Red   yellow
      Dandelion   Melon   RedOrange   Yellow
      darkgray   MidnightBlue   RedViolet   YellowGreen
      DarkOrchid   Mulberry   Rhodamine   YellowOrange
      Emerald   NavyBlue   RoyalBlue

    -

    Delimiters

    - - - - - - - - -
    ( ) ( )( ) \lparen
         \rparen
      ⌈ ⌉  \lceil
          \rceil
    \uparrow
    [ ] [ ][ ] \lbrack
         \rbrack
      ⌊ ⌋  \lfloor
          \rfloor
    \downarrow
    {} \{ \}{} \lbrace
         \rbrace
    ⎰⎱ \lmoustache
         \rmoustache
    \updownarrow
      ⟨ ⟩  \langle
         \rangle
      ⟮ ⟯  \lgroup
          \rgroup
    \Uparrow
    <> \lt
            \gt
      \lAngle
         \rAngle
    ┌ ┐ \ulcorner
         \urcorner
    \Downarrow
    | || \vert └ ┘ \llcorner
         \lrcorner
    \Updownarrow
    \| \Vert\left.\right.\ \backslash
    | | \lvert
         \rvert
      \lVert
         \rVert
      ⟦ ⟧  \llbracket
         \rrbracket
      \lBrace \rBrace

         

      \llparenthesis
           \rrparenthesis
      \llangle \rrangle
    -

    The texvc extension includes \lang and \rang.

    -

    Delimiter Sizing

    -

    (AB) \left(\LARGE{AB}\right)

    -

    ((((( ( \big( \Big( \bigg( \Bigg(

    - - - -
    \left\big\bigl\bigm\bigr
    \middle\Big\Bigl\Bigm\Bigr
    \right\bigg\biggl\biggm\biggr

    \Bigg\Biggl\Biggm\Biggr
    -

    Environments

    - - - - - -
    abcd\begin{matrix}
       a & b \\
       c & d
    \end{matrix}
    abcd\begin{array}{cc}
       a & b \\
       c & d
    \end{array}
    (abcd)\begin{pmatrix}
       a & b \\
       c & d
    \end{pmatrix}
    [abcd]\begin{bmatrix}
       a & b \\
       c & d
    \end{bmatrix}
    |abcd|\begin{vmatrix}
       a & b \\
       c & d
    \end{vmatrix}
    abcd\begin{Vmatrix}
       a & b \\
       c & d
    \end{Vmatrix}
    {abcd}\begin{Bmatrix}
       a & b \\
       c & d
    \end{Bmatrix}
    abcdefghi\begin{array}{c|c:c}
      a & b & c \\ \hline
       d & e & f \\
       \hdashline
       g & h & i
    \end{array} 
    x={aif bcif dx = \begin{cases}
       a &\text{if } b \\
       c &\text{if } d
    \end{cases}
    aif bcif d}\begin{rcases}
       a &\text{if } b \\
      c &\text{if } d
    \end{rcases}⇒
    abcd\begin{smallmatrix}
       a & b \\
       c & d
    \end{smallmatrix}

    iΛ0<j<n

    \sum_{\begin{subarray}{l}
       i\in\Lambda\\
       0<j<n
    \end{subarray}}
    -

    AMS Environments

    -

    The auto-render extension will render the following environments even if they are not inside math delimiters such as $$…$$. They are display-mode only.

    -
    - - -

    a=b+c=e+f

    \begin{equation}
    \begin{split}
       a &=b+c\\
       &=e+f
    \end{split}
    \end{equation}

    a=b+cd+e=f

    \begin{align}
       a&=b+c \\
       d+e&=f
    \end{align}

    a=be=b+c

    \begin{gather}
       a=b \\
       e=b+c
    \end{gather}

    10x+3y=23x+13y=4

    \begin{alignat}{2}
       10&x+ &3&y = 2 \\
       3&x+&13&y = 4
    \end{alignat}

    AaBbcC=D

    \begin{CD}
    A @>a>> B \\
    @VbVV @AAcA \\
    C @= D
    \end{CD}

    unodostres

    \begin{multline}
       \rm uno \\
       \rm dos \\
       \rm tres
    \end{multline}
    -

    Other Temml Environments

    - - - - - -
    EnvironmentsHow they differ from those shown above
    darray, dcases, drcases… apply displaystyle
    matrix*, pmatrix*, bmatrix*
    Bmatrix*, vmatrix*, Vmatrix*
    … take an optional argument that sets column
    alignment, as in \begin{matrix*}[r]
    equation*, gather*
    align*, alignat*
    … have no automatic numbering.
    gathered, aligned, alignedat… do not need to be in display mode.
    … have no automatic numbering.
    … must be inside math delimiters in
    order to be rendered by the auto-render
    extension.
    -

    Acceptable horizontal line separators are: \\ and \cr.

    -

    Temml supports \tag{…}, \notag, and \nonumber to modify equation numbering.

    -

    The {array} environment does not yet support \cline or \multicolumn.

    -

    HTML

    -

    The following "raw HTML" features are potentially dangerous for untrusted inputs, so they are disabled by default, and attempting to use them produces the command names in red (which you can configure via the errorColor option). To fully trust your LaTeX input, you need to pass an option of trust: true; you can also enable just some of the commands or for just some URLs via the trust option.

    - - - - - - -
    TEMML\href{https://temml.org/}{\Temml}
    𝚑𝚝𝚝𝚙𝚜://𝚝𝚎𝚖𝚖𝚕.𝚘𝚛𝚐/\url{https://temml.org/}
    sphere\includegraphics[height=1em,
    totalheight=1.2em,width=1.2em, alt=sphere]
    {../sphere.jpg}
    x\id{idName}{x}
    x\class{class-name}{x}
    x\style{color: red;}{x}
    x\data{datum1=a, datum2=b}{x}
    -

    Letters

    -

    Greek Letters

    - - - - - - - - - - - - - - - - - - - - -
    Α \AlphaΒ \BetaΓ \GammaΔ \DeltaΕ \Epsilon
    Ζ \ZetaΗ \EtaΘ \ThetaΙ \IotaΚ \Kappa
    Λ \LambdaΜ \MuΝ \NuΞ \XiΟ \Omicron
    Π \PiΡ \RhoΣ \SigmaΤ \TauΥ \Upsilon
    Φ \PhiΧ \ChiΨ \PsiΩ \Omega𝛤 \varGamma
    𝛥 \varDelta𝛩 \varTheta𝛬 \varLambda𝛯 \varXi𝛱 \varPi
    𝛴 \varSigma𝛶 \varUpsilon𝛷 \varPhi𝛹 \varPsi𝛺 \varOmega
    α \alphaβ \betaγ \gammaδ \deltaϵ \epsilon
    ζ \zetaη \etaθ \thetaι \iotaκ \kappa
    λ \lambdaμ \muν \nuξ \xiο \omicron
    π \piρ \rhoσ \sigmaτ \tauυ \upsilon
    ϕ \phiχ \chiψ \psiω \omega

    α \upalphaβ \upbetaγ \upgammaδ \updeltaϵ \upepsilon
    ζ \upzetaη \upetaθ \upthetaι \upiotaκ \upkappa
    λ \uplambdaμ \upmuν \upnuξ \upxiο \upomicron
    π \uppiρ \uprhoσ \upsigmaτ \uptauυ \upupsilon
    ϕ \upphiχ \upchiψ \uppsiω \upomega

    ε \varepsilonϰ \varkappaϑ \varthetaϖ \varpiϱ \varrho
    ς \varsigmaφ \varphiϘ \Coppaϙ \coppaϞ \Koppa
    ϟ \koppaϠ \Sampiϡ \sampiϚ \Stigmaϛ \stigma
    ϝ \digammaϙ \varcoppa

    -

    Direct Input: Α Β Γ Δ Ε Ζ Η Θ Ι Κ Λ Μ Ν Ξ Ο Π Ρ Σ Τ Υ Φ Χ Ψ Ω - α β γ δ ϵ ζ η θ ι κ λ μ ν ξ o π ρ σ τ υ ϕ χ ψ ω ε ϑ ϖ ϱ ς φ ϝ

    -

    Other Letters

    - - - - - -
    \aleph \nablaı \imatha˚ \text{\aa}Œ \text{\OE}
    \beth \partialȷ \jmath \text{\AA}ø \text{\o}
    \gimel \Game \Im \AngstromØ \text{\O}
    \daleth \Finv𝕜 \Bbbkæ \text{\ae}ß \text{\ss}
    ð \eth \hbar \ReÆ \text{\AE}ı \text{\i}
    \ell \hslash \wpœ \text{\oe}ȷ \text{\j}
    -

    Letters in the texvc extension

    - - -
    \alef \Complex \natnums \real \weierp
    \alefsym \image \R \realsϑ \thetasym
    \cnums \N \Reals

    \Z
    -

    Direct Input: ∂ ∇ ℑ Ⅎ ℵ ℶ ℷ ℸ ⅁ ℏ ð À Á Â Ã Ä Å Æ Ç È É Ê Ë -Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö Ù Ú Û Ü Ý Þ ß à á â ã ä å ç è é ê ë ì í î ï ð ñ ò ó ô ö ù ú û ü ý þ ÿ - ₊ ₋ ₌ ₍ ₎ ₀ ₁ ₂ ₃ ₄ ₅ ₆ ₇ ₈ ₉ ₐ ₑ ₕ ᵢ ⱼ ₖ ₗ ₘ ₙ ₒ ₚ ᵣ ₛ ₜ ᵤ ᵥ ₓ ᵦ ᵧ ᵨ ᵩ ᵪ ⁺ ⁻ ⁼ ⁽ ⁾ ⁰ ¹ ² ³ ⁴ ⁵ ⁶ ⁷ ⁸ ⁹ ᵃ ᵇ ᶜ ᵈ ᵉ ᵍ ʰ ⁱ ʲ ᵏ ˡ ᵐ ⁿ ᵒ ᵖ ʳ ˢ ᵗ ᵘ ʷ ˣ ʸ ᶻ ᵛ ᵝ ᵞ ᵟ ᵠ ᵡ

    -

    Math-mode Unicode (sub|super)script characters will render as if you had written regular characters in a subscript or superscript. For instance, A²⁺³ will render the same as A^{2+3}.

    -

    Unicode Mathematical Alphanumeric Symbols

    - - - - - - - - - -
    ItemRangeItemRange
    Bold𝐀-𝐙 𝐚-𝐳 𝟎-𝟗Double-struck𝔸-ℤ 𝕒-𝕫 𝟘-𝟡
    Italic𝐴-𝑍 𝑎-𝑧Sans serif𝖠-𝖹 𝖺-𝗓 𝟢-𝟫
    Bold Italic𝑨-𝒁 𝒂-𝒛Sans serif bold𝗔-𝗭 𝗮-𝘇 𝟬-𝟵
    Monospace𝙰-𝚉 𝚊-𝚣 𝟶-𝟿Sans serif italic𝘈-𝘡 𝘢-𝘻
    Script𝒜-𝒵 𝒶-𝓏Sans serif bold italic𝘼-𝙕 𝙖-𝙯
    Fraktur𝔄-ℨ𝔞-𝔷Bold Fraktur𝕬-𝖅𝖆-𝖟
    -

    There are two methods that will render any Unicode charater:

    -
    1. Use the \char function and the Unicode code in hex. For example \char"263a will render as .

    2. -
    3. Write the character inside \text{…}. For example, \text{☺} will render as .

    -
    -
    More about Unicode script… -

    The Unicode range U+1D49C - U+1D4B5, Mathematical Script, has been ambiguous. Some fonts put chancery glyphs (𝒜𝒞) at those code points and some fonts use roundhand glyphs (𝒜𝒞). Temml’s default for code points in this range is chancery, which matches the fonts Cambria Math and STIX TWO. It also matches the TeX function \mathcal{…}.

    -

    Per Unicode 14+, Temml will return a roundhand glyph if you append a \ufe01 to a character in the range 𝒜-𝒵.

    -
    -
    -

    Layout

    -

    Line Breaks

    -

    Hard line breaks are \\ and \newline.

    -

    Temml inserts soft line breaks per TeXbook p. 173 if not in display mode and no hard line breaks are employed. They work in Chromium and Firefox, but not in Safari.

    -

    Reflect

    -
     ab\reflectbox{$\frac a b$}
    -

    Vertical Layout

    - - - -
    xn x_n=! \stackrel{!}{=}abc a\raisebox{0.25em}{b}c
    ex e^x=! \overset{!}{=}MM2M M\raise3pt{M^2}M
    uo _u^o=! \underset{!}{=}MM2M M\lower3pt{M^2}M

    ab a \atop b

    -

    0<i<m0<j<n

    \sum_{\substack{0<i<m\\0<j<n}}
    -

    LaTeX puts the second argument of \raisebox into text mode, but it can contain math if the math is nested within $…$ delimiters, as in \raisebox{0.25em}{$\frac a b$}

    -

    Overlap and Spacing

    - -
    =// {=}\mathllap{/\,}(x2) \left(x^{\smash{2}}\right)
    /= \mathrlap{\,/}{=}y \sqrt{\smash[b]{y}}
    -

    1ijnxij

    \sum_{\mathclap{1\le i\le j\le n}} x_{ij}
    -

    Temml also supports \llap, \rlap, and \clap. They work only in text mode if the rendering options include strict: true.

    -

    Spacing

    - - - - - - - - - - - - - - - - - -
    FunctionProducesFunctionProduces
    \,³∕₁₈ em space\kern{distance}space, width = distance
    \thinspace³∕₁₈ em space\mkern{distance}space, width = distance
    \>⁴∕₁₈ em space\mskip{distance}space, width = distance
    \:⁴∕₁₈ em space\hskip{distance}space, width = distance
    \medspace⁴∕₁₈ em space\hspace{distance}space, width = distance
    \;⁵∕₁₈ em space\hspace*{distance}space, width = distance
    \thickspace⁵∕₁₈ em space\phantom{content}space the width and height of content
    \enspace½ em space\hphantom{content}space the width of content
    \quad1 em space\vphantom{content}a strut the height of content
    \qquad2 em space\!– ³∕₁₈ em space
    ~non-breaking space\negthinspace– ³∕₁₈ em space
    \<space>space\negmedspace– ⁴∕₁₈ em space
    \nobreakspacenon-breaking space\negthickspace– ⁵∕₁₈ em space
    \spacespace
    -

    Notes:

    -

    distance will accept any of the Temml units.

    -

    \kern\mkern, \mskip, and \hskip accept unbraced distances, as in: \kern1em.

    -

    \mkern and \mskip will not work in text mode and both will write a console warning for any unit except mu.

    -

    \rule{}{distance} is valuable as a vertical strut.

    -

    Logic and Set Theory

    - - - - - - - -
    \forall \complement \therefore \emptyset
    \exists \subset \because \varnothing
    \nexists \supset \mapsto \implies
    \in| \mid \to \impliedby
    \ni \land \gets \iff
    \notin \lor \QED \lightning
    \notni¬ \neg or \lnot{x|x<12}
    \Set{ x | x<\frac 1 2 }
    {x|x<5}
    \set{x|x<5}
    \strictif \strictfi
    -

    Linear Logic (from the cmll package):

    - - - -
    Operators! \oc? \wn& \with \parr
    \shpos \shneg \shift \invamp
    Relations \coh \scoh \Perp \multimapboth
    \incoh \sincoh

    \multimapinv
    -

    Equivalents in the texvc extension

    -
    \exist \isin \empty \sub
    -

    Direct Input: ∀ ∴ ∁ ∵ ∃ ∣ ∈ ∉ ∋ ⊂ ⊃ ∧ ∨ ↦ → ← ↔ ∅ ⟹ ⟺ ¬ ↯ ⥼ ⥽
    ℂ ℍ ℕ ℙ ℚ ℝ

    -

    Macros

    - - - - - - - - - - - - -
    \def\def\macroname<arg list>{definition to be expanded}
    a2b3+c2d3\def\foo#1#2{#1^2 #2^3} - \foo a b + \foo c d
    \xdef\xdef\macroname#1#2…{definition to be expanded}
    \edef\edef\macroname#1#2…{definition}
    \let\let\foo=\bar
    \futurelet\futurelet\foo\bar x
    \global\def\global\def\macroname#1#2…{definition}
    \newcommand\newcommand\macroname[numargs]{definition}
    a2b3+c2d3\newcommand\foo[2]{#1^2 #2^3} - \foo a b + \foo c d
    \renewcommand\renewcommand\macroname[numargs]{definition}
    \providecommand\providecommand\macroname[numargs]{definition}
    -

    To create macros with document-wide scope, use \gdef, \global\let, or define a preamble in one of the Temml rendering options. (Global macros may be disabled for security reasons.)

    -

    Macros accept up to nine arguments: #1, #2, etc.

    -

    Available functions include:
    \char \mathchoice \TextOrMath \@ifstar \@ifnextchar \@firstoftwo \@secondoftwo \relax \expandafter \noexpand

    -

    @ is a valid character for commands, as if \makeatletter were in effect.

    -

    Temml has no \par, so \long is ignored.

    -

    Operators

    -

    Big Operators

    - - - - - - - - -
    \sum \prod \bigotimes \bigvee
    \int \coprod \bigoplus \bigwedge
    \iint \intop \bigodot \bigcap
    \iiint \smallint \biguplus \bigcup
    \iiiint \intcap \intcup \bigsqcup
    \oint \varointclockwise \intclockwise \bigsqcap
    \oiint \pointint \rppolint \scpolint
    \oiiint \intlarhk \sqint \intx
    \intbar \intBar \fint \bigtimes
    -

    cdab \sideset{_a^b}{_c^d}\sum

    -

    Direct Input: ∫ ∬ ∭ ⨌ ∮ ∯ ∰ ⨖ ∲ ∏ ∐ ∑ ⋀ ⋁ ⋂ ⋃ ⨀ ⨁ ⨂ ⨄ ⨆ ⨅

    -

    Binary Operators

    - - - - - - - - - - - - - - - - - - - - - - -
    + + \closedvarcap \lhd \sslash
    - \closedvarcup \ltimes \threedotcolon
    / / \Cup or \doublecup \minusdot× \times
    * * \cup \minusfdots \twocaps
    ⨿ \amalg \cupovercap \minusrdots \twocups
    & \And or \with \curlyveexmoda x\mod a \typecolon
    \ast \curlywedge \mp \unlhd
    \barcap÷ \div \parr or \upand \unrhd
    \barcup \divideontimes± \pm \uplus
    \barvee or \Nor  \dotminus x(moda) x \pmod a \Vee
    \barwedge or \Nand \dotplusx(a) x \pod a \vee or \lor
    mod \bmod \doublebarvee \rhd \veebar or \Xor
    \bowtie or
    \Join
    \doublebarwedge \rightouterjoin \veedot
    \bullet \fullouterjoin \rightthreetimes \veedoublebar
    \Cap or \doublecap \gtrdot \rtimes \veeonvee
    \cap \intercal \setminus \Wedge
    \capbarcup \interleave \shuffle \wedge or \land
    \capdot \invlazys \smallsetminus \wedgebar
    \capovercup \leftthreetimes \smashtimes \wedgedot
    \cdot \leftouterjoin \sqcap \wedgedoublebar
    · \cdotp \leftmodels \Sqcap \wedgeonwedge
    \centerdot. \ldotp \sqcup \wr
    \circ \lessdot \Sqcup
    -

    The texvc extension provides ± \plusmn.

    -

    Direct Input: + - / ∖ * ⋅ ∘ ± × ÷ ∓ ∔ ∧ ∨ ∩ ∪ ≀ ⊎ ⊓ ⊔ ⋈ ⟕ ⟖ ⟗

    -

    Geometric Binary Operators

    - - - - - - - - - - - - - -
    \bigcirc \circledvert \ominus
    \blackhourglass \circlehbar \operp
    \boxast \concavediamond⊕︎ \oplus
    \boxbox \concavediamondtickleft \oslash
    \boxcircle \concavediamondtickright \otimes
    \boxdot \diamond \Otimes
    \boxminus \hourglass \otimeshat
    \boxplus \lozengeminus \star
    \boxtimes \obar \triangle
    \circledast \obslash \triangleminus
    \circledcirc \odiv \triangleplus
    \circleddash \odot \triangletimes
    \circledequal \ogreaterthan \whitesquaretickleft
    \circledparallel \olessthan \whitesquaretickright
    -

    Direct Input: ◯ ⧗ ⧆ ⧈ ⧇ ⊡ ⊟ ⊞ ⊠ ⊛ ⊚ ⊖ ⊜ ⦷ ⦶ ⦵ ⟡ ⟢ ⟣ ⋄ ⧖ ⟠ ⌽ ⦸ ⨸ ⊙ ⧁ ⧀ ⊝ ⦹ ⊕ ⊘ ⊗ ⨷ ⨶ ⋆ △ ⨺ ⨻ ⟤ ⟥

    -

    Fractions and Binomials

    - - -
    ab \frac{a}{b}ab \tfrac{a}{b}(aa+1] \genfrac ( ] {2pt}{1}a{a+1}
    ab {a \over b}ab \dfrac{a}{b}ab+1 {a \above{2pt} b+1}
    a/b   a/b

    a1+1b \cfrac{a}{1 + \cfrac{1}{b}}
    - -
    (nk) \binom{n}{k}(nk) \dbinom{n}{k}{nk} {n\brace k}
    (nk) {n \choose k}(nk) \tbinom{n}{k}[nk] {n\brack k}
    -

    Math Operators

    - - - - - - - - - - - - - - -
    f \operatorname{f}cosec \cosecdim \dim2xyf \pdv*{f}{x,y}
    arcsin \arcsincosh \coshexp \expsec \sec
    arccos \arccoscot \cothom \homsgn \sgn
    arctan \arctancotg \cotgker \kersin \sin
    arctg \arctgcoth \cothlg \lgsinh \sinh
    arcctg \arcctgcsc \cscln \lnsh \sh
    arg \argctg \ctg log \logtan \tan
    ch \chcth \cthdfdx \odv{f}{x}tanh \tanh
    cos \cos \nabladdxf \odv*{f}{x}tg \tg
    \partialdeg \deg2fxy `\pdv{f}{x,y}th \th
    f \operatorname*{f} or
    \operatornamewithlimits
    inf \infmax \maxsup \sup
    arg max \argmaxinj lim \injlimmin \minlim \varinjlim
    arg min \argminlim \limplim \plimlim \varliminf
    det \detlim inf \liminfPr \Prlim \varlimsup
    gcd \gcdlim sup \limsupproj lim \projlimlim \varprojlim
    -

    Functions in the bottom five rows of this table can take \limits.

    -

    Enclosing Operators

    - -
    x \sqrt{x}an   a_{\angl n}
    x3 \sqrt[3]{x}an   a_\angln
    -

    Physics and Chemistry

    - - - -
    ϕ| \bra{\phi}𝐂25+a2 \prescript{a}{2}{\mathbf{C}}^{5+}_{2}
    |ψ \ket{\psi}ϕ|ψ \braket{\phi\vert\psi}
    ϕ| \Bra{\phi}ϕ|2t2|ψ
    \Braket{ \phi | \frac{\partial^2}{\partial t^2} | \psi }
    |ψ \Ket{\psi}
    -

    From the mhchem extension:

    - -
    SO42+Ba2+BaSO4\ce{SO4^2- + Ba^2+ -> BaSO4 v}
    75.3 JmolK\pu{75.3 J // mol K}
    -

    There is much more mhchem information in the -mhchem docs.

    -
    -
    Click to see the physics extension. - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    |x| \abs{x}a|b \innerproduct{a}{b}if \qif
    |x| \absolutevalue{x}|ab| \ketbra{a}{b}in \qin
    {A,B} \acomm{A}{B}2 \laplacianinteger \qinteger
    {A,B} \anticommutator{A}{B}n|A|m \matrixel{n}{A}{m}let \qlet
    {5mm} \Bqty{5 \text{mm}}n|A|m \matrixelement{n}{A}{m}odd \qodd
    [5mm] \bqty{5 \text{mm}}n|A|m \mel{n}{A}{m}or \qor
    [A,B] \comm{A}{B}x \norm{x}otherwise \qotherwise
    [A,B] \commutator{A}{B}|ab| \op{a}{b} text  \qq{text}
    × \cp𝒪(x2) \order{x^2} text  \qqtext{text}
    × \cross|ab| \outerproduct{a}{b}since \qsince
    × \crossproductxy \partialderivative{x}{y}then \qthen
    × \curl{x,y} \pb{x}{y}{5m} \qty{5 \text{m}}
    d \dd

    {5m} \quantity{5 \text{m}}
    dxdy \derivative{x}{y}{A,B} \poissonbracket{A}{B}unless \qunless
    d \differential(5) \pqty{5}using \qusing
    \divergence𝒫 \principalvaluerankM \rank M
    \dotproduct𝒫 \pvRes[f(z)] \Res\[f(z)\]
    dxdy \dv{x}{y}P.V.(x) \PV(x)Trρ \Tr\rho
    |ab| \dyad{a}{b}all \qalltrρ \tr\rho
    erf(x) \erf(x)and \qand𝒂 \va{a}
    x \ev{x}as \qasδ \var
    12x|0n \eval{\tfrac 1 2 x}_0^nassume \qassumeδ \variation
    12x|0n \evaluated{\tfrac 1 2 x}_0^n, \qc𝒂 \vb{a}
    x \expectationvalue{x}c.c. \qcc \vdot
    x \expval{x}, \qcomma𝒂 \vectorarrow{a}
    δxδy \fdv{x}{y}else \qelse𝒂 \vectorbold{a}
    δxδy \functionalderivative{x}{y}even \qeven𝒂^ \vectorunit{a}
    \gradfor \qfor|x| \vqty{x}
    \gradientgiven \qgiven𝒂^ \vu{a}
    -
    -

    Relations

    -

    =!ab \stackrel{!}{=}

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    = = \eqcirc \lessgtr \smile
    < < \eqcolon or
      \minuscolon
    \lesssim \sqsubset
    > >−∷ \Eqcolon or
    \minuscoloncolon
    \ll \sqsubseteq
    : : \eqqcolon \lll \sqsupset
    := :==∷ \Eqqcolon \llless \sqsupseteq
    \approx \eqdef< \lt \stareq
    \approxeq \eqsim \measeq \Subset
    \arceq \eqslantgtr| \mid \subset
    \asymp \eqslantless \models \subseteq
    \backcong \equiv \multimap \subseteqq
    \backepsilon \fallingdotseq \multimapboth \succ
    \backsim \frown \multimapinv \succapprox
    \backsimeq \ge \origof \succcurlyeq
    \between \geq \owns \succeq
    \bumpeq \geqq \parallel \succsim
    \Bumpeq \geqslant \perp \Supset
    \circeq \gg \Perp \supset
    \coh \ggg \pitchfork \supseteq
    : \colonapprox \gggtr \prec \supseteqq
    ∷≈ \Colonapprox or
    \coloncolonapprox
    > \gt \precapprox \thickapprox
    : \coloneq or
     \colonminus
    \gtrapprox \preccurlyeq \thicksim
    ∷− \Coloneq or
     \coloncolonminus
    \gtreqless \preceq \trianglelefteq
    \coloneqq or
     \colonequals
    \gtreqqless \precsim \triangleq
    \Coloneqq or
     \coloncolonequals
    \gtrless \propto \trianglerighteq
    : \colonsim \gtrsim \questeq \varpropto
    : \Colonsim or
     \coloncolonsim
    \imageof:\ratio or
      \vcentcolon
    \vartriangle
    \cong \in or \isin \risingdotseq \vartriangleleft
    \curlyeqprec \incoh \scoh \vartriangleright
    \curlyeqsucc \le \shortmid \vdash
    \dashv \leq \shortparallel \vDash
    \dblcolon or
       \coloncolon
    \leqq \sim \Vdash
    \doteq \leqslant \simeq VDash
    \Doteq \lessapprox \sincoh \Vvdash
    \doteqdot \lesseqgtr \smallfrown \veeeq
    \eqeq \lesseqqgtr \smallsmile \wedgeq
    -

    The texvc extension provides \sub, \sube, and \supe.

    -

    Direct Input: = < > : ∈ ∋ ∝ ∼ ∽ ≂ ≃ ≅ ≈ ≊ ≍ ≎ ≏ ≐ ≑ ≒ ≓ ⩵ ≖ -≗ ≜ ≡ ≤ ≥ ≦ ≧ ≫ ≬ ≳ ≷ ≺ ≻ ≼ ≽ ≾ ≿ ⊂ ⊃ ⊆ ⊇ ⊏ ⊐ ⊑ ⊒ ⊢ ⊣ ⊩ ⊪ ⊸ ⋍ ⋐ ⋑ ⋔ ⋙ -⋛ ⋞ ⋟ ⌢ ⌣ ⩾ ⪆ ⪌ ⪕ ⪖ ⪯ ⪰ ⪷ ⪸ ⫅ ⫆ ≲ ⩽ ⪅ ≶ ⋚ ⪋ ⟂ ⊨ ≔ ≕ ⩴ ⊷ ⊶

    -

    Negated Relations

    -

    \not =

    - - - - - - - - - - - - - - -
    \gnapprox \ngeqslant \nsubset \nVdash
    \gneq \ngtr \nsubseteq \precnapprox
    \gneqq \nleq \nsubseteqq \precneqq
    \gnsim \nleqq \nsucc \precnsim
    ≩︀ \gvertneqq \nleqslant \nsucceq \subsetneq
    \lnapprox \nless \nsupset \subsetneqq
    \lneq \nmid \nsupseteq \succnapprox
    \lneqq \notin \nsupseteqq \succneqq
    \lnsim \notni \ntriangleleft \succnsim
    ≨︀ \lvertneqq \nparallel \ntrianglelefteq \supsetneq
    \ncong \nprec \ntriangleright \supsetneqq
    \ne \npreceq \ntrianglerighteq⊊︀ \varsubsetneq
    \neq \nshortmid \nvdash⫋︀ \varsubsetneqq
    \ngeq \nshortparallel \nvDash \varsupsetneq
    \ngeqq \nsim \nVDash⫌︀ \varsupsetneqq
    -

    Direct Input: ∉ ∌ ∤ ∦ ≁ ≆ ≠ ≨ ≩ ≮ ≯ ≰ ≱ ⊀ ⊁ ⊄ ⊅ ⊈ ⊉ ⊊ ⊋ ⊬ ⊭ -⊮ ⊯ ⋠ ⋡ ⋦ ⋧ ⋨ ⋩ ⋬ ⋭ ⪇ ⪈ ⪉ ⪊ ⪵ ⪶ ⪹ ⪺ ⫋ ⫌

    -

    Arrows

    - - - - - - - - - - - - - - - - - - - - - - - - -
    \circlearrowleft \Leftrightarrow \restriction
    \circlearrowright \leftrightarrows \rightarrow
    \curvearrowleft \leftrightharpoons \Rightarrow
    \curvearrowright \leftrightsquigarrow \rightarrowtail
    \dashleftarrow \Lleftarrow \rightharpoondown
    \dashrightarrow \longleftarrow \rightharpoonup
    \downarrow \Longleftarrow \rightleftarrows
    \Downarrow \longleftrightarrow \rightleftharpoons
    \downdownarrows \Longleftrightarrow \rightrightarrows
    \downharpoonleft \longmapsto \rightsquigarrow
    \downharpoonright \longrightarrow \Rrightarrow
    \gets \Longrightarrow \Rsh
    \hookleftarrow \looparrowleft \searrow
    \hookrightarrow \looparrowright \swarrow
    \iff \Lsh \to
    \impliedby \mapsfrom \twoheadleftarrow
    \implies \mapsto \twoheadrightarrow
    \leadsto \nearrow \uparrow
    \leftarrow \nleftarrow \Uparrow
    \Leftarrow \nLeftarrow \updownarrow
    \leftarrowtail \nleftrightarrow \Updownarrow
    \leftharpoondown \nLeftrightarrow \upharpoonleft
    \leftharpoonup \nrightarrow \upharpoonright
    \leftleftarrows \nRightarrow \upuparrows
    \leftrightarrow \nwarrow

    -

    Arrows in the texvc extension

    - - -
    \Darr \Harr \Larr \Lrarr \Rarr \Uarr
    \dArr \hArr \lArr \lrArr \rArr \uArr
    \darr \harr \larr \lrarr \rarr \uarr
    -

    Direct Input: ← ↑ → ↓ ↔ ↕ ↖︎ ↗︎ ↘︎ ↙︎ ↚ ↛ ↞ ↠ ↢ ↣ ↦ ↩︎ ↪︎ ↫ ↬ ↭ ↮ ↰ ↱↶ ↷ ↺ ↻ ↼ ↽ ↾ ↾ ↿ ⇀ ⇁ ⇂ ⇃ ⇄ ⇆ ⇇ ⇈ ⇉ ⇊ ⇋ ⇌⇍ ⇎ ⇏ ⇐ ⇑ ⇒ ⇓ ⇔ ⇕ ⇚ ⇛ ⇝ ⇠ ⇢ ⟵ ⟶ ⟷ ⟸ ⟹ ⟺ ⟼ ↽

    -

    Extensible Arrows

    - - - - - - - - - -
    abc \xleftarrow{abc}underover \xrightarrow[under]{over}
    abc \xLeftarrow{abc}abc \xRightarrow{abc}
    abc \xleftrightarrow{abc}abc \xLeftrightarrow{abc}
    abc \xhookleftarrow{abc}abc \xhookrightarrow{abc}
    abc \xtwoheadleftarrow{abc}abc \xtwoheadrightarrow{abc}
    abc \xleftharpoonup{abc}abc \xrightharpoonup{abc}
    abc \xleftharpoondown{abc}abc \xrightharpoondown{abc}
    abcabc \xleftrightharpoons{abc}abcabc \xrightleftharpoons{abc}
    abcabc \xtofrom{abc}abc \xmapsto{abc}
    =abc \xlongequal{abc}

    -

    All extensible arrows can take an optional argument in the same manner as \xrightarrow[under]{over}.

    -

    Style, Size, and Font

    -

    Class Assignment

    -

    Override the usual spacing and semantic meaning of a character or fragment.

    -
    a=b   a = b
    a=b   a \mathord{=} b
    a=b   a \mathopen{=} b
    a=b   a \mathclose{=} b
    a|b   a | b
    a|b   a \mathpunct{|} b
    a|b   a \mathop{|} b
    a|b   a \mathbin{|} b
    a|b   a \mathrel{|} b
    -

    See also \operatorname.

    -

    Font

    - - - - - - - - - - -
    Ab0 \mathrm{Ab0}𝐀𝐛𝟎𝛉 \mathbf{Ab0θ}Ab0θ \mathit{Ab0θ}
    Ab0 \mathnormal{Ab0}𝐀𝐛𝟎𝛉 \textbf{Ab0θ}𝐴𝑏0𝜃 \textit{Ab0θ}
    Ab0θ \textrm{Ab0θ}𝐀𝐛𝟎𝛉 {\bf Ab0θ}Ab0θ {\it Ab0θ}
    Ab0 {\rm Ab0}𝐀𝐛𝟎𝛉 \bold{Ab0θ}Ab0θ \textup{Ab0θ}
    Ab0θ \textnormal{Ab0θ}𝑨𝒃0𝜽 \boldsymbol{Ab0θ}𝔸𝕓𝟘 \Bbb{Ab0}
    Ab0θ \text{Ab0θ}𝑨𝒃0𝜽 \bm{Ab0θ}𝔸𝕓𝟘 \mathbb{Ab0}
    𝖠𝖻𝟢 \mathsf{Ab0}Ab0θ \textmd{Ab0θ}𝔄𝔟 \frak{Ab}
    𝖠𝖻𝟢 \textsf{Ab0}𝙰𝚋𝟶 \mathtt{Ab0}𝔄𝔟 \mathfrak{Ab}
    𝖠𝖻𝟢 {\sf Ab0}𝙰𝚋𝟶 \texttt{Ab0}𝒜 \mathcal{AB}
    ʜᴇʏ \textsc{hey}𝙰𝚋𝟶 {\tt Ab0 }𝒜 {\cal AB}

    𝒜 \mathscr{AB}
    -

    The \textXX versions can stack font family, font weight, and font shape. So \textsf{\textbf{H}} will produce 𝗛. The other versions do not stack, e.g., \mathsf{\mathbf{H}} will produce 𝐇.

    -

    In cases where math fonts do not have a bold glyph, \pmb can simulate one. For example, \pmb{\vartheta} renders as : ϑ

    -

    Font Size

    - - - - - -
    AB \Huge ABAB \normalsize AB
    AB \huge ABAB \small AB
    AB \LARGE ABAB \footnotesize AB
    AB \Large ABAB \scriptsize AB
    AB \large ABAB \Tiny AB

    AB \tiny AB
    -

    Style

    - - - - - - - -
    i=1n\displaystyle\sum_{i=1}^n
    i=1n\textstyle\sum_{i=1}^n
    x\scriptstyle x     (The size of a first sub/superscript)
    x\scriptscriptstyle x (The size of subsequent sub/superscripts)
    limyx\lim\limits_y x
    limyx\lim\nolimits_y x
    x^2\verb!x^2!
    ABcd ABcd\text{ABcd $ABcd$}
    -

    \text{…} shifts its contents into text mode, but you can shift back into math mode by nesting $…$.

    -

    Symbols and Punctuation

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    % comment \dotsTEX \TeX
    % \% \cdotsLATEX \LaTeX
    # \# \ddotsTEMML \Temml
    & \& \ldots \rule[6pt]{2ex}{1ex}
    _ \_ \vdots| \surd
    _ \text{\textunderscore} \iddots \infty
    \text{--} \dotsb \checkmark
    \text{\textendash} \dotsc \ballotx
    \text{---} \dotsi \dagger or \dag
    \text{\textemdash} \dotsm \text{\textdagger}
    ~ \text{\textasciitilde} \dotso \ddagger or \ddag
    ^ \text{\textasciicircum} \idotsin \text{\textdaggerdbl}
    $ $ `` `` \mathellipsis \angle
    text{\textquoteleft} \text{\textellipsis} \measuredangle
    \lq \Box \sphericalangle
    \text{\textquoteright} \square \top
    \rq \blacksquare \bot
    \text{\textquotedblleft} \triangledown \Bot
    " " \triangleleft$ \$ or \text{\textdollar}
    \text{\textquotedblright} \triangleright¢ \cent
    : \colon \bigtriangledown£ \pounds
    \backprime \bigtriangleup£ \mathsterling
    \prime \blacktriangle£ \text{\textsterling}
    < \text{\textless} \blacktriangledown¥ \yen
    > \text{\textgreater} \blacktriangleleft \euro
    | \text{\textbar} \blacktriangleright \text{\texteuro}
    \text{\textbardbl} \Diamond° \degree
    { \text{\textbraceleft} \lozenge° \text{\textdegree}
    } \text{\textbraceright} \blacklozenge \mho
    \ \text{\textbackslash} \bigstar \diagdown
    \text{\textvisiblespace} \maltese \diagup
    \text{\P} or \P \clubsuit \varclubsuit
    § \text{\S} or \S \diamondsuit \vardiamondsuit
    © \copyright \heartsuit \varheartsuit
    ® \circledR \spadesuit \varspadesuit
    \circledS \female \male
    ® \text{\textregistered} \astrosun \sun
    \text{\textbullet} \leftmoon \rightmoon
    \smiley \Earth \flat
    \standardstate \natural \sharp
    \permil \QED \lightning
    \diameter

    -

    Symbols in the texvc extension

    - - -
    \clubs \hearts \sdot
    \diamonds \spades \infin
    \bull§ \text{\sect} \Dagger
    -

    Direct Input: § ¶ £ ¥ € ∇ ∞ · ∠ ∡ ∢ ⌀ ♠ ♡ ♢ ♣ ♭ ♮ ♯ © ® ☺ ✓ ↯ ∎ … ⋮ ⋯ ⋱ ! ‼ ☉

    -

    Units

    - - - - - - - - - - -
    UnitValueUnitValue
    emCSS embp1/72​ inch
    exCSS expc12 pt
    mu1/18 emdd1238/1157​ pt
    pt1/72.27 inchcc14856/1157 pt
    mm1 mmnd685/642 pt
    cm1 cmnc1370/107​ pt
    in1 inchsp1/65536 pt
    -

    The effect of script level and font size:

    - - - - - - -
    Unittextstyle
    normal size
    scriptscripthuge
    em or ex
    mu
    others
    -

    em and ex are affected by font size changes such as \Large, but they are not affected by script level, so they will not change size in a fraction numerator or an exponent.

    -

    mu is affected by both script level and font size.

    -

    The other units are absolute and are not affected by either script level or font size.

    -
    -

    Copyright © 2021-2024 Ron Kok. -Released under the MIT License

    -
    -
    - - - - - diff --git a/site/docs/katex.css b/site/docs/katex.css deleted file mode 100644 index 73bb33e6..00000000 --- a/site/docs/katex.css +++ /dev/null @@ -1,11 +0,0 @@ -.katex .eqn-num::before { - counter-increment: katexEqnNo; - content: "(" counter(katexEqnNo) ")"; -} -.katex .mml-eqn-num::before { - counter-increment: mmlEqnNo; - content: "(" counter(mmlEqnNo) ")"; -} -body { - counter-reset: katexEqnNo mmlEqnNo tmlEqnNo; -} diff --git a/site/docs/sphere.jpg b/site/docs/sphere.jpg deleted file mode 100644 index d5f063a4f69e8f7d9903c7d01529a6e0b6a4c881..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12278 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 diff --git a/site/index.html b/site/index.html deleted file mode 100644 index 46dd4380..00000000 --- a/site/index.html +++ /dev/null @@ -1,231 +0,0 @@ - - - - - - -Temml - Convert TeX to MathML - - - - - - - - - - - - -
    - - -

    - - TEMML -

    - -
    -
    -

    A TeX-to-MathML conversion library in JavaScript.

    - -

    - -
    -
    -
    Input:
    - -
    -
    -
    -
    Output:
    -
    -
    - CBdl=μ0(Ienc+ε0ddtSEn^da) -
    -
    - -
    -
    -
    -
    - -     - -   -
    -
    - -  
    - -  
    - -   -
    -
    -
    -    -    - -
    -
    -
    -
    - -
    - -
    -
    - -
    - - - - -
    - - diff --git a/site/indexStyles.css b/site/indexStyles.css deleted file mode 100644 index e7d6dbed..00000000 --- a/site/indexStyles.css +++ /dev/null @@ -1,206 +0,0 @@ -* { margin:0; } /* reset */ - -body { - margin: 0 0 5px; - line-height: 1.45; - background: white; - font-family: Calibri, 'Helvetica Neue', Arial, Cambria, sans-serif; - font-size: 18px; - position: relative; -} - -nav { - max-width: 800px; - margin: 0 auto; - background: #fff; - font-size: 16px; - height: 66px -} - -nav * { - font-family: Arial, sans-serif; -} - -nav ul { - list-style: none; - margin: 0; - padding: 0; - float: right; -} - -nav ul li { - display: block; - float: right; - padding-top: 27px; - text-decoration: none -} - -nav a { - padding: 33px 0 0 18px; - text-decoration: none; - color: inherit; -} - -article, #title { - max-width: 800px; - margin: 0 auto; -} - -#demo { - margin: 0px 2.5px 0px 2.5px; - overflow: fixed; -} - -h1 { - font-family: Verdana, sans-serif; - font-variant: small-caps; - letter-spacing: 0.05em; - margin-top: 3em; - font-size: 140%; - margin-top: 1em; -} - -p { - margin-top: 1em; - line-height: 1.35; - text-align: justify; -} - -#why { - width: 70%; - margin-top: 2em; - margin-left: auto; - margin-right: auto; -} - -#why ul li { - list-style-type: disc; - line-height: 1.35; - margin-top: 0.5em; - position: relative; - left: 1.8em; -} - -a { - text-decoration: underline; - color: black; -} - -#demo-parent { - width: 100%; -} - -#demo { - width: 100%; - display: flex; - flex-direction: row; - flex-wrap: wrap; -} - -.wide #demo { - flex-direction: column; -} - -#input, -#output { - width: 395px; - flex-basis: auto; -} - -.wide #input, -.wide #output { - width: 100%; -} - -#spacer { - width: 10px; -} - -.ioArea { - font-size: 0.9em; - width: 360px; - height: 10em; - border-radius: 4px; - border: 1px solid rgb(200, 200, 200); - display: inline-block; - padding: 1em 1em; - vertical-align: top; - resize: none; - overflow: auto; -} - -.wide .ioArea { - width: 760px; -} - -math { - font-size: 115%; -} - -#demoSource { - font-family: Consolas, Menlo, Monaco, monospace; -} - -#notice { - margin-top: 2em; - color:rgb(182, 32, 32); -} - -.active-button { - background: #888; -} - -@media (max-width: 799px){ - nav { - width: 90%; - } - article, #input, #output, #title, #copyright { - width: 100%; - } - .ioArea { - width: 93% - } - #why ul { padding-inline-start: 0; } - #wide + label, - #wide { visibility: hidden; } -} - -#copyright { - max-width: 800px; - margin: 0 auto; - font-family: Arial, sans-serif; - font-size: 10px; - text-align: center; -} - -#copyright a { - color: inherit; -} - -.dropdown { - position: relative; - display: inline-block; -} - -.dropbtn { - background-color: #d3d3d3; - padding: 4px; - border: none; - cursor: pointer; -} - -.dropdown-content { - display: none; - position: absolute; - background-color: #f9f9f9; - min-width: 160px; - box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2); - padding: 12px 16px; - z-index: 1; -} - -.dropdown a { text-decoration: none; } - -.dropdown:hover .dropdown-content { - display: block; -} \ No newline at end of file diff --git a/site/tests/Arrow note height table.html b/site/tests/Arrow note height table.html deleted file mode 100644 index b66a0115..00000000 --- a/site/tests/Arrow note height table.html +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - Rename OverShift and UnderShift - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    MethodLatin
    Modern
    Cambria
    Math
    STIX
    TWO
    LibertinusAsana
    1Current Chromium <mover>AnoteBAnoteBAnoteBAnoteBAnoteB
    2Ink height + StretchStackTopShiftUp - AB - - note - - - AB - - note - - - AB - - note - - - AB - - note - - - AB - - note - -
    3Baseline + StretchStackTopShiftUp - AB - - note - - - AB - - note - - - AB - - note - - - AB - - note - - - AB - - note - -
    4Ink height + StretchStackGapAboveMin - AB - - note - - - AB - - note - - - AB - - note - - - AB - - note - - - AB - - note - -
    5Ink height + 0.111em (as per LaTeX) - AB - - note - - - AB - - note - - - AB - - note - - - AB - - note - - - AB - - note - -
    \ No newline at end of file diff --git a/site/tests/LaTeXML-tests.html b/site/tests/LaTeXML-tests.html deleted file mode 100644 index 692a76d8..00000000 --- a/site/tests/LaTeXML-tests.html +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - Temml LaTeXML Tests - - - - - - -

    LaTeXML Test

    -

    This LaTeXML test reproduces math examples from https://latexml.mathweb.org/editor
    The equations in the first table came originally from http://www.mathjax.org/demos/tex-samples/, which no longer exists.

    -

    Equations

    - - - - - - - - - - - - - - - - -

    SourceTemml
      The Lorenz Equations
    1\begin{aligned}
    \dot{x} & = \sigma(y-x) \\
    \dot{y} & = \rho x - y - xz \\
    \dot{z} & = -\beta z + xy
    \end{aligned}

    x˙=σ(yx)y˙=ρxyxzz˙=βz+xy

      The Cauchy-Schwarz Inequality
    2\left( \sum_{k=1}^n ak bk \right)^2
    \leq \left( \sum_{k=1}^n ak^2 \right)
    \left( \sum_{k=1}^n bk^2 \right) \

    (k=1nakbk)2(k=1nak2)(k=1nbk2)

      A Cross Product Formula
    3\mathbf{V}_1 \times \mathbf{V}_2 =
    \begin{vmatrix}
    \mathbf{i} & \mathbf{j} & \mathbf{k} \\
    \frac{\partial X}{\partial u} &
    \frac{\partial Y}{\partial u} & 0 \\
    \frac{\partial X}{\partial v} &
    \frac{\partial Y}{\partial v} & 0
    \end{vmatrix}

    𝐕1×𝐕2=|𝐢𝐣𝐤XuYu0XvYv0|

    The probability of getting k heads when flipping n coins is:
    4P(E) = {n \choose k} p^k (1-p)^{ n-k} \

    P(E)=(nk)pk(1p)nk

      An Identity of Ramanujan
    5\frac{1}{\Bigl(\sqrt{\phi \sqrt{5}}-
    \phi\Bigr) e^{\frac25 \pi}} =
    1+\frac{e^{-2\pi}} {1+\frac{e^{-4\pi}}
    {1+\frac{e^{-6\pi}}
    {1+\frac{e^{-8\pi}} {1+\ldots} } } }

    1(ϕ5ϕ)e25π=1+e2π1+e4π1+e6π1+e8π1+

      A Rogers-Ramanujan Identity
    61 + \frac{q^2}{(1-q)}+
    \frac{q^6}{(1-q)(1-q^2)}+\cdots =
    \prod_{j=0}^{\infty}\frac{1}
    {(1-q^{5j+2})(1-q^{5j+3})},
    \quad\quad \text{for} |q|<1.

    1+q2(1q)+q6(1q)(1q2)+=j=01(1q5j+2)(1q5j+3),for|q|<1.

      Maxwell's Equations
    7\begin{aligned}
    \nabla \times \vec{\mathbf{B}} -\\,
    \frac1c\, \frac{\partial\vec{
    \mathbf{E}}}{\partial t} &
    = \frac{4\pi}{c}\vec{\mathbf{j}} \\
    \nabla \cdot \vec{\mathbf{E}} &
    = 4 \pi \rho \\
    \nabla \times \vec{\mathbf{E}}\, +\,
    \frac1c\, \frac{\partial\vec{
    \mathbf{B}}}{\partial t} &
    = \vec{\mathbf{0}} \\
    \nabla \cdot \vec{\mathbf{B}} &
    = 0
    \end{aligned} \

    ×𝐁1c𝐄t=4πc𝐣𝐄=4πρ×𝐄+1c𝐁t=𝟎𝐁=0

    -

    Boxes

    - - -
    SourceTemml
    \raisebox{0pt}[0pt][0pt]{\Large%
    \textbf{Aaaa\raisebox{-0.3ex}{a}%
    \raisebox{-0.7ex}{aa}\raisebox{-1.2ex}{r}%
    \raisebox{-2.2ex}{g}\raisebox{-4.5ex}{h}}}
    𝐀𝐚𝐚𝐚𝐚𝐚𝐚𝐫𝐠𝐡
    -

    Unicode

    -

    The tests below come from https://latexml.mathweb.org/editor
    They got them from https://trac.edgewall.org/wiki/TracUnicode
    I have no idea what these lines say.

    -

    All the Unicode characters are written inside \text{}.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    LanguageTemml
    Arabicتراك يقوم بحفظ كل الكلمات باستخدام صيغة2
    BulgarianБългарският език работи ли?2
    ČeskyCˇesˇtina v koˊdovaˊnıˊ UTF-8, zˇaˊdnyˊ probleˊm.2
    Chinese (Traditional)繁體中文, 漢字測試2
    Chinese (Simplified)简体中文,汉字测试2
    Croatian(Ako podrzˇava srpski i slovenski mora podrzˇavati i Hrvatski - cˇcˊzˇsˇđ CˇCˊZˇSˇĐ)
    EnglishYes indeed, Trac supports English. Fully.2
    FrançaisIl est possible deˊcrire en Français : aˋ, ç, uˆ, 2
    German(Trac-Wiki muß auch deutsche Umlaute richtig anzeigen:o¨, a¨, u¨, A¨, O¨, U¨; und das scharfe ß)
    GreekΤα Ελληνικαˊ υποστηριˊζονται επαρκωˊς επιˊσης.2
    Hebrewאני יכול לאכול זכוכית וזה לא מזיק לי2
    Hindiअब हिन्दी में।2
    HungarianAˊrvıˊztu˝ro˝ tu¨ko¨rfuˊroˊgeˊp2
    IcelandicÆvar sagði við o¨mmu sıˊna: Sjaˊðu hvað eˊg er stoˊr!2
    Japanese漢字 ひらがな カタカナ ハンカクカナ 日本語試験2
    Korean이번에는 한글로 써보겠습니다. 잘 보이나요? 한글2
    LatvianLatviesˇu valoda arıˉ straˉdaˉ!2
    Lithuanian(Sudalyvaukime ir mes. Ar veikia lietuvisˇkos raide˙s?ącˇęe˙įsˇųuˉzˇ ĄCˇĘE˙ĮSˇŲUˉZˇ Zˇinoma, kad veikia :) Kas tie mes?)
    Persian (Farsi)(ولی امکان نوشتن مستقیم فارسی نیست چون حالت متن از راست به چپ و جوداین یک متن فارسی است ندارد برای فارسی نوشتن باید از HTML استفاده کنید.)
    Polish(Pchnącˊ w tę łoˊdzˊ jez˙a lub osiem skrzynˊ fig;Nocna gz˙egz˙oˊłka zawsze dzienną przekuka.)
    Portuguese(Eˊ possıˊvel guardar caracteres especias da lıˊngua portuguesa, incluindo o sıˊmbolo da moeda europeˊia , trema u¨, crase aˋ, agudos aˊeˊıˊoˊuˊ,circunflexos aˆeˆoˆ, til a˜o˜, cedilha ç, ordinais ªº, grau °¹²³.)
    Russian(Проверка русского языка: кажется работает... И буква "ё" есть...2
    Serbian(Podrzˇan, uprkos cˇinjenici da se za njegovopisanje koriste чак два алфабета.)
    SlovenianTa suhi sˇkafec pusˇcˇa vodo zˇe od nekdaj!2
    Spanish(Esto es un pequen˜o texto en Espan˜ol,donde el veloz murcieˊlago hinduˊ comıˊa cardlllo y kiwi)
    SwedishRa¨ven raskar o¨ver isen med luva pa˚.2
    ThaiTrac แสดงภาษาไทยได้อย่างถูกต้อง!2
    UkrainianПеревірка української мови...2
    Urduٹریک اردو بھی سپورٹ کرتا ہے۔2
    VietnameseVieˆˊt tieˆˊng Vit cu˜ng đưc.2
    -
    - - diff --git a/site/tests/environment-tests.html b/site/tests/environment-tests.html deleted file mode 100644 index 95e24a97..00000000 --- a/site/tests/environment-tests.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - Environment Tests - - - - - - -

    Environments

    - - - - - - - - - - -
    abcd\begin{matrix}
       a & b \\
       c & d
    \end{matrix}
    abcd\begin{array}{cc}
       a & b \\
       c & d
    \end{array}
    ab1.23.5\begin{matrix*}
       a & b \\
       1.2 & 3.5
    \end{matrix*}
    abcd\begin{darray}{cc}
       a & b \\
       c & d
    \end{darray}
    (abcd)\begin{pmatrix}
       a & b \\
       c & d
    \end{pmatrix}
    [abcd]\begin{bmatrix}
       a & b \\
       c & d
    \end{bmatrix}
    (ab1.23.5)\begin{pmatrix*}[r]
       a & b \\
       1.2 & 3.5
    \end{pmatrix*}
    [ab1.23.5]\begin{bmatrix*}[r]
       a & b \\
       1.2 & 3.5
    \end{bmatrix*}
    |abcd|\begin{vmatrix}
       a & b \\
       c & d
    \end{vmatrix}
    abcd\begin{Vmatrix}
       a & b \\
       c & d
    \end{Vmatrix}
    |ab1.23.5|\begin{vmatrix}
       a & b \\
       1.2 & 3.5
    \end{vmatrix*}
    ab1.23.5\begin{Vmatrix}
       a & b \\
       1.2 & 3.5
    \end{Vmatrix*}
    {ab1.23.5}\begin{Bmatrix}
       a & b \\
       1.2 & 3.5
    \end{Bmatrix*}
    abcdefghi\begin{array}{c|c:c}
      a & b & c \\ \hline
       d & e & f \\
       \hdashline
       g & h & i
    \end{array} 
    {ab1.23.5}\begin{Bmatrix*}[r]
       a & b \\
       1.2 & 3.5
    \end{Bmatrix*}
    abcdefghi\begin{array}{c|c:c}
      a & b & c \\ \hline
       d & e & f \\
       \hdashline
       g & h & i
    \end{array} 
    x={aif bcif dx = \begin{cases}
       a &\text{if } b \\
       c &\text{if } d
    \end{cases}
    aif bcif d}\begin{rcases}
       a &\text{if } b \\
      c &\text{if } d
    \end{rcases}⇒
    x={aif bcif dx = \begin{dcases}
       a &\text{if } b \\
       c &\text{if } d
    \end{dcases}
    aif bcif d}\begin{drcases}
       a &\text{if } b \\
      c &\text{if } d
    \end{drcases}⇒
    abcd\begin{smallmatrix}
       a & b \\
       c & d
    \end{smallmatrix}

    iΛ0<j<n

    \sum_{\begin{subarray}{l}
       i\in\Lambda\\
       0<j<n
    \end{subarray}}
    -

    - - - - - - -

    a=b+c=e+f

    \begin{equation}
    \begin{split}
       a &=b+c\\
       &=e+f
    \end{split}
    \end{equation}

    10x+3y=23x+13y=4

    \begin{align}
       10&x+ &3&y = 2 \\
       3&x+&13&y = 4
    \end{align}

    a=b+c=e+f

    \begin{equation*}
    \begin{split}
       a &=b+c\\
       &=e+f
    \end{split}
    \end{equation*}

    10x+3y=23x+13y=4

    \begin{align*}
       10&x+ &3&y = 2 \\
       3&x+&13&y = 4
    \end{align*}
    a=be=b+c\begin{gathered}
    a=b \\
    e=b+c
    \end{gathered}\
    10x+3y=23x+13y=4\begin{aligned}
       10&x+ &3&y = 2 \\
       3&x+&13&y = 4
    \end{aligned}

    a=be=b+c

    \begin{gather}
       a=b \\
       e=b+c
    \end{gather}

    10x+3y=23x+13y=4

    \begin{alignat}{2}
       10&x+ &3&y = 2 \\
       3&x+&13&y = 4
    \end{alignat}

    a=be=b+c

    \begin{gather*}
       a=b \\
       e=b+c
    \end{gather*}

    10x+3y=23x+13y=4

    \begin{alignat*}{2}
       10&x+ &3&y = 2 \\
       3&x+&13&y = 4
    \end{alignat*}

    AaBbcC=D

    \begin{CD}
    A @>a>> B \\
    @VbVV @AAcA \\
    C @= D
    \end{CD}
    10x+3y=23x+13y=4\begin{alignedat}{2}
       \10&x+ &3&y = 2\\
       3&x+&13&y = 4 \\
    \end{alignedat}\

    AaBbcC=D

    \begin{CD}
    A @>a>> B \\
    @VbVV @AAcA \\
    C @= D
    \end{CD}

    unodostres

    \begin{multline}
       \rm uno \\
       \rm dos \\
       \rm tres
    \end{multline}
    - - diff --git a/site/tests/images/AccentsText.svg b/site/tests/images/AccentsText.svg deleted file mode 100644 index 8020e45e..00000000 --- a/site/tests/images/AccentsText.svg +++ /dev/null @@ -1,207 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/ArrayMode.svg b/site/tests/images/ArrayMode.svg deleted file mode 100644 index 683d1aa9..00000000 --- a/site/tests/images/ArrayMode.svg +++ /dev/null @@ -1,330 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/ArrayType.svg b/site/tests/images/ArrayType.svg deleted file mode 100644 index ca29097d..00000000 --- a/site/tests/images/ArrayType.svg +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/Arrays.svg b/site/tests/images/Arrays.svg deleted file mode 100644 index 075bfb7b..00000000 --- a/site/tests/images/Arrays.svg +++ /dev/null @@ -1,238 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/BinCancellation.svg b/site/tests/images/BinCancellation.svg deleted file mode 100644 index 43585d72..00000000 --- a/site/tests/images/BinCancellation.svg +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/BoldSymbol.svg b/site/tests/images/BoldSymbol.svg deleted file mode 100644 index 5a65f027..00000000 --- a/site/tests/images/BoldSymbol.svg +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/CD.svg b/site/tests/images/CD.svg deleted file mode 100644 index fdc49725..00000000 --- a/site/tests/images/CD.svg +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/site/tests/images/ColorBox.svg b/site/tests/images/ColorBox.svg deleted file mode 100644 index 4796accc..00000000 --- a/site/tests/images/ColorBox.svg +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/ColorImplicit.svg b/site/tests/images/ColorImplicit.svg deleted file mode 100644 index b51c9868..00000000 --- a/site/tests/images/ColorImplicit.svg +++ /dev/null @@ -1,183 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/ColorSpacing.svg b/site/tests/images/ColorSpacing.svg deleted file mode 100644 index 0e4eec2c..00000000 --- a/site/tests/images/ColorSpacing.svg +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/DashesAndQuotes.svg b/site/tests/images/DashesAndQuotes.svg deleted file mode 100644 index d1478411..00000000 --- a/site/tests/images/DashesAndQuotes.svg +++ /dev/null @@ -1,276 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/DelimiterSizing1.svg b/site/tests/images/DelimiterSizing1.svg deleted file mode 100644 index 5eef3f3c..00000000 --- a/site/tests/images/DelimiterSizing1.svg +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/DelimiterSizing2.svg b/site/tests/images/DelimiterSizing2.svg deleted file mode 100644 index d56576cf..00000000 --- a/site/tests/images/DelimiterSizing2.svg +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/DisplayMode.svg b/site/tests/images/DisplayMode.svg deleted file mode 100644 index 40c7d930..00000000 --- a/site/tests/images/DisplayMode.svg +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/ExtensibleArrows.svg b/site/tests/images/ExtensibleArrows.svg deleted file mode 100644 index 5fac9045..00000000 --- a/site/tests/images/ExtensibleArrows.svg +++ /dev/null @@ -1,326 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/Fractions1.svg b/site/tests/images/Fractions1.svg deleted file mode 100644 index 07a80f1c..00000000 --- a/site/tests/images/Fractions1.svg +++ /dev/null @@ -1,119 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/Fractions2.svg b/site/tests/images/Fractions2.svg deleted file mode 100644 index cd42d03a..00000000 --- a/site/tests/images/Fractions2.svg +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/HorizontalBraces.svg b/site/tests/images/HorizontalBraces.svg deleted file mode 100644 index a304a034..00000000 --- a/site/tests/images/HorizontalBraces.svg +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/Integrands.svg b/site/tests/images/Integrands.svg deleted file mode 100644 index 77ccc388..00000000 --- a/site/tests/images/Integrands.svg +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/LargeRuleNumerator.svg b/site/tests/images/LargeRuleNumerator.svg deleted file mode 100644 index 6dc12522..00000000 --- a/site/tests/images/LargeRuleNumerator.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/LeftRight.svg b/site/tests/images/LeftRight.svg deleted file mode 100644 index 55f59eec..00000000 --- a/site/tests/images/LeftRight.svg +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/LeftRightListStyling.svg b/site/tests/images/LeftRightListStyling.svg deleted file mode 100644 index 505f0e76..00000000 --- a/site/tests/images/LeftRightListStyling.svg +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/LeftRightMiddle.svg b/site/tests/images/LeftRightMiddle.svg deleted file mode 100644 index 8ae04751..00000000 --- a/site/tests/images/LeftRightMiddle.svg +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/LeftRightStyleSizing.svg b/site/tests/images/LeftRightStyleSizing.svg deleted file mode 100644 index 10caa36b..00000000 --- a/site/tests/images/LeftRightStyleSizing.svg +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/LimitControls.svg b/site/tests/images/LimitControls.svg deleted file mode 100644 index 6c2bbf40..00000000 --- a/site/tests/images/LimitControls.svg +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/MathChoice.svg b/site/tests/images/MathChoice.svg deleted file mode 100644 index 1e7a205c..00000000 --- a/site/tests/images/MathChoice.svg +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/MathtoolsMatrix.svg b/site/tests/images/MathtoolsMatrix.svg deleted file mode 100644 index 4304daf3..00000000 --- a/site/tests/images/MathtoolsMatrix.svg +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/NegativeSpace.svg b/site/tests/images/NegativeSpace.svg deleted file mode 100644 index a7fa46c8..00000000 --- a/site/tests/images/NegativeSpace.svg +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/NestedFractions.svg b/site/tests/images/NestedFractions.svg deleted file mode 100644 index 3c82194b..00000000 --- a/site/tests/images/NestedFractions.svg +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/NullDelimiterInteraction.svg b/site/tests/images/NullDelimiterInteraction.svg deleted file mode 100644 index db3d62eb..00000000 --- a/site/tests/images/NullDelimiterInteraction.svg +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/OpLimits.svg b/site/tests/images/OpLimits.svg deleted file mode 100644 index 585914c8..00000000 --- a/site/tests/images/OpLimits.svg +++ /dev/null @@ -1,301 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/OperatorName.svg b/site/tests/images/OperatorName.svg deleted file mode 100644 index 1b6fd3be..00000000 --- a/site/tests/images/OperatorName.svg +++ /dev/null @@ -1,231 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/OverUnderline.svg b/site/tests/images/OverUnderline.svg deleted file mode 100644 index 3865b737..00000000 --- a/site/tests/images/OverUnderline.svg +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/OverUnderset.svg b/site/tests/images/OverUnderset.svg deleted file mode 100644 index 16b105fa..00000000 --- a/site/tests/images/OverUnderset.svg +++ /dev/null @@ -1,229 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/PrimeSpacing.svg b/site/tests/images/PrimeSpacing.svg deleted file mode 100644 index 1575dfa6..00000000 --- a/site/tests/images/PrimeSpacing.svg +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/PrimeSuper.svg b/site/tests/images/PrimeSuper.svg deleted file mode 100644 index 009ce817..00000000 --- a/site/tests/images/PrimeSuper.svg +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/RelativeUnits.svg b/site/tests/images/RelativeUnits.svg deleted file mode 100644 index 68f44547..00000000 --- a/site/tests/images/RelativeUnits.svg +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/SizingBaseline.svg b/site/tests/images/SizingBaseline.svg deleted file mode 100644 index a5a2207c..00000000 --- a/site/tests/images/SizingBaseline.svg +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/SqrtRoot.svg b/site/tests/images/SqrtRoot.svg deleted file mode 100644 index 636858dd..00000000 --- a/site/tests/images/SqrtRoot.svg +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/StretchyAccent.svg b/site/tests/images/StretchyAccent.svg deleted file mode 100644 index a44f996f..00000000 --- a/site/tests/images/StretchyAccent.svg +++ /dev/null @@ -1,385 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/StrikeThrough.svg b/site/tests/images/StrikeThrough.svg deleted file mode 100644 index 721dce43..00000000 --- a/site/tests/images/StrikeThrough.svg +++ /dev/null @@ -1,337 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/StrikeThroughColor.svg b/site/tests/images/StrikeThroughColor.svg deleted file mode 100644 index df033b99..00000000 --- a/site/tests/images/StrikeThroughColor.svg +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/StyleSpacing.svg b/site/tests/images/StyleSpacing.svg deleted file mode 100644 index 45c03462..00000000 --- a/site/tests/images/StyleSpacing.svg +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/StyleSwitching.svg b/site/tests/images/StyleSwitching.svg deleted file mode 100644 index fd2de68c..00000000 --- a/site/tests/images/StyleSwitching.svg +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/SupSubCharacterBox.svg b/site/tests/images/SupSubCharacterBox.svg deleted file mode 100644 index 755711fc..00000000 --- a/site/tests/images/SupSubCharacterBox.svg +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/SupSubHorizSpacing.svg b/site/tests/images/SupSubHorizSpacing.svg deleted file mode 100644 index 7cbcc203..00000000 --- a/site/tests/images/SupSubHorizSpacing.svg +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/SupSubLeftAlignReset.svg b/site/tests/images/SupSubLeftAlignReset.svg deleted file mode 100644 index 65be9280..00000000 --- a/site/tests/images/SupSubLeftAlignReset.svg +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/SupSubOffsets.svg b/site/tests/images/SupSubOffsets.svg deleted file mode 100644 index 6b2edf53..00000000 --- a/site/tests/images/SupSubOffsets.svg +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/TextSpace.svg b/site/tests/images/TextSpace.svg deleted file mode 100644 index 01d15c69..00000000 --- a/site/tests/images/TextSpace.svg +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/TextStacked.svg b/site/tests/images/TextStacked.svg deleted file mode 100644 index 734253f0..00000000 --- a/site/tests/images/TextStacked.svg +++ /dev/null @@ -1,405 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/TextWithMath.svg b/site/tests/images/TextWithMath.svg deleted file mode 100644 index a01d94f0..00000000 --- a/site/tests/images/TextWithMath.svg +++ /dev/null @@ -1,226 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/accents.svg b/site/tests/images/accents.svg deleted file mode 100644 index 20942f66..00000000 --- a/site/tests/images/accents.svg +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/align.svg b/site/tests/images/align.svg deleted file mode 100644 index 8df18980..00000000 --- a/site/tests/images/align.svg +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/aligned.svg b/site/tests/images/aligned.svg deleted file mode 100644 index 89dd2bbb..00000000 --- a/site/tests/images/aligned.svg +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/alignedat.svg b/site/tests/images/alignedat.svg deleted file mode 100644 index 2dd5edc9..00000000 --- a/site/tests/images/alignedat.svg +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/angl.svg b/site/tests/images/angl.svg deleted file mode 100644 index b54829e7..00000000 --- a/site/tests/images/angl.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/site/tests/images/baseline.svg b/site/tests/images/baseline.svg deleted file mode 100644 index 92c16ffa..00000000 --- a/site/tests/images/baseline.svg +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/binom.svg b/site/tests/images/binom.svg deleted file mode 100644 index 52ba9ac6..00000000 --- a/site/tests/images/binom.svg +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/boxed.svg b/site/tests/images/boxed.svg deleted file mode 100644 index f7c5d50e..00000000 --- a/site/tests/images/boxed.svg +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/cases.svg b/site/tests/images/cases.svg deleted file mode 100644 index 0517a9a1..00000000 --- a/site/tests/images/cases.svg +++ /dev/null @@ -1,207 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/colors.svg b/site/tests/images/colors.svg deleted file mode 100644 index 7b0dc958..00000000 --- a/site/tests/images/colors.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/displaystyle.svg b/site/tests/images/displaystyle.svg deleted file mode 100644 index d88829f6..00000000 --- a/site/tests/images/displaystyle.svg +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/dots.svg b/site/tests/images/dots.svg deleted file mode 100644 index b8b82d35..00000000 --- a/site/tests/images/dots.svg +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/equation.svg b/site/tests/images/equation.svg deleted file mode 100644 index afd21ac0..00000000 --- a/site/tests/images/equation.svg +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/ex1.gif b/site/tests/images/ex1.gif deleted file mode 100644 index 7d39a37dfa150dd37eec1de012cf859b7e550358..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202 zcmZ?wbhEHbRAUfhIK%(~2M!!)XlVHV|G$HS16Tk=DE?$&WME)q&;fBkY8{ySEq1L@ z4A^pV5l0DI(&r}vh73p4c$aVIcqG8EQj7oTogCgA<6W2Dn@w88wnQLG`8Ibm(;KEU zNpDyR^iqWygBKpnYm9xjUBh)!yY4ih1AlHFI;wSJPqO_?!#7FNPL5$>ff_R0`g&qQ v0d_*}#*y)PA_dk3lX-jXD<$i@|IX*lc6yZ_)oKtgDKK*>BzaGjtFHvtgLc{<5 z8(#v7PIgq9KpQB94;y)b;ks<#;`RI!eS%N&&JU{#a$#`56;VWpB*E1 zrXddy#g7VrpnR$@f7Wa48TMwOlcD%S^lbewgwpY(hA@2bJQ$quZ_S=z0;@b^Fp=E3 zSy>`9yvF{qqel?3mQ4Dnrcxzhgt7#wXl{v@3ooaUT*1T_4OUjn5W@M+feINLX9^t} z!<$SEDv82-^QFeW5*3{ia%Co{(lFsH(PQag+#W9?m6p^ewwOkA>C}~l2jOCeBWv4a zJ9>{-*eO;s{Bb+zle+~h7h;;jRbira15f6qf@CkRPa_J2>QeX~PoGHUp8Dp^8aql> zMcNApqTH!*PV}MXFpl(FZJJznO|288KG_;BFC}qwazF9d>{rCcNwj=8x zl5-XQW(WpELTi~spDlsOfnZH~eD_ful}Y7OLlVXT7!zPQh~I{q{4oJv9!kI+hlXfK zVo(0j@tYAVo`?lgsaZoAQmw&+5_+7#L6sQotm4)UWe`Z79z8UaP=!JK1QUK;OmicO SNKK@Riy&QaAC(v+0027&xGISN diff --git a/site/tests/images/ex11.gif b/site/tests/images/ex11.gif deleted file mode 100644 index cc6596a08ea93dc3021a04fd9f98fa75deb522bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 156 zcmZ?wbhEHblx7fOIK%(~2M!!)XlVHV|G$HS16Tk=DE?$&WME)q&;fBkY8{vpEq1L@ z4A|lssSv0o#HPr6Ah9cK?u#Q+7c%QL%;dXpre;Gg+ughCr5F+f7`|vV-J75o@oFBo z%v;u_CbCScil@cem~55oUs_M)jwA<^WrVJ5>$U+PqXH0Ige;WKWW}?T z?L{ntasZzZI5ZBBN|!2dBM}~&7i8zUIv26(*W0~CPTXx{paSm*Tt)S?ki;9ljly10 zKLHtmf`LdfNf$A2gNtW|GGY`tjEsdcQD2xX5+qb0ndFX%FAqqn1;hr&deNS)YXSyK#)Z_z#(A^)*{y9 z7P|`O!r)Dy9_k^{VC^IF9a*jRwGCqWVEq*ET^mTy*bZ8%R_XHhMocV2vpU#nHz}aM zf*AWK%E`A`fw*@Mm6W+>vLL5MUUE zB6Mv538~!V8EA{uTxzBVt7>RjD2RS=-hRcA#@#5n&SzwL9n7dHcrpAMm#aTOf5|6h zwVJZ2C`dqAl0I#AtOKjt2Dx;JD06T~nw449{ diff --git a/site/tests/images/ex13.gif b/site/tests/images/ex13.gif deleted file mode 100644 index fa8405b71cf1f214fdda2e0a3800a52dc2c5b784..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1763 zcmV<91|0cENk%w1VU+=70KxzO0002Mz`%fjfdBvhKtMnM0000000000A^8LW00031 zEC2ui0F?n`06+u&IJ!ImFv>}*y*TU5yZ>M)j$~<`XvzsqE3j=W&vb3yc&_h!@BhG{ za7Zi~Yp-Jwplmvy(5Q4utqzjb95ai9Qx>s(W!V9`E5DoyYeydm5K+Dj7&&t|11jfVR zKi|8i=w0T&p4`Da$=OQq*XuX-sITo=!1z#V>8rGsn#PYHLyFw-aHPqTC{xzE_(h`1moQ@*De1&z6q+(~>O6u|iA^XyZ?fD; zl+sXtjgE%-3599Vj6sb!g{YKE)Fps4JuPyT$kdgAz8>)T zwDFCjD06U;4AmNgY>T;axrWPot7@|~Y7M)nb~kM?6E9$jwve(6*(@MTDt_L=~@}a=P&{l*Cc#)2yEIuTALkG3b<(9PXc)C-FuvI z9}k8TSYv0aYb@%V!!(;CwUA+18^0GfEkG{S8PwHznBJiTV{rmXy>)+46 zzyAOK00t=FfCLt3;DHDx7|Ct}gQ+_+1b|<0_7(cqpLdx`->0N5(5RzhzKWl$gl>w=eW$)a9Up_n{+4K| z^%YADu+Us#X*-t&d)lnI(ovPDbGl*Zwb1lat!szsnkOmWYJnQ9+IA)lyJFG+z#jAs zv)HO)BSJ?6(6dx z0;P1Ug~&__(b~u8?i&X}0sot7$xPycGP)$I3-is7JW%hGHRJ5FN*Dhu^w3tdO!U!6 zYnt@ZO!H)P(@_6BbJSFSH#GwkfvNS@TzBpD*I=U%uftWBeb&{=nyq$(PXp2O+HeEa zc7sXDX!qTC=dJhNdwd=Y_BR80tfB zrSb7BFT7Ffqt|})9i7{K{x{#hGW>wTUs>cQz{S-sIr4HJ>;5Ob!3cmNVBo|HAozql z4Z>A+QNjZpcozy5tpykiniRS;!MAy#gbWl`@G1qb!mLIcmwD6;l%ub-iGnjY@F2Fl zB}3w;NvKi12Ps2 z>H+4fW38HHJ7ayKkXrm9vnJTcXVHLLef*0#FlZlGm9dCxoa6&5`7%t#uvho-WF%@B z%0*K0KB?kX7l&mlSQb$^SEQC0p%}?!nNc)y)MO8Nskj>|@do;uMHY8hMaEF^jN>a; zCO39W8AK*y3g81_0{Ot=yzH5ff|CTh>Bz>ptC+fa!Mt>VkBZQ)gyl4%F~JE!b>0e( z#B5VxC=yRJdJHe*w4^-CVaR?epoT%w$6U;!kG4bwAFgc~jy?W?q8{)K zcnT6xos?sXW5LH-!M&Cc^=R{$noOls4VLne3OjRN5FVCOAwHF5hFGRnRl0?%UGqy_ zwc%K05*f6GEJ(OAvv!@<3t#W+|Sj%G9yuu9vc%?;O{i?PN685mw5h!98dy)hI F06Py|UV#7r diff --git a/site/tests/images/ex14.gif b/site/tests/images/ex14.gif deleted file mode 100644 index 2c927bcd36c3be793d95401c2d884de2cf3cf6c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1131 zcmV-x1eE(nNk%w1VGsc_0IC20|NsAhfPer10KmY&KtMnM0000000000A^8LW00093 zEC2ui01yE(06+u(2)Y~mFoHnCkT~lttJTBBjbv$_XsSkpW41~txGhDj_yPkmUEL*t zC`T+BkEwz1GyqbN$EMItV0Blo&Q(kHegn@q}R*EBehb4R)l9M1y6Nr6=kPk{AS2>lASDIm?n2C{|cCL#G zv8)fVjfD-aBLS+kzQ4dyz`+%Ik-fvo%22|lpKi#*j|;BNqRZIXTDp6%oZ5j{-zmJ{ z<{Y=Iv*!)t?CabbrR45JuJdPU6zlAp{o)Y}QHe7u9Se*4K$WJ?JoDAa2KtO=S zix@2$YcLA`MmY{UdW7K>f`T!IMw*D&$1#pT5~0eh*vO9Ns&g?T2;(EiLX(M!2wadu zvqnV}AO9)sClscQA(w#C>e)1gCaG1IYSlJPg+8rcOI+GY)>qP9stlSt8!kuAve>4v z4T|#BgRJZf;?04o7F;N$=BiQqH!rt%8utF`ns}o=4>ogDmBKG?U2O0`>7mnCmmHxz zBQuaXWk+e3qa$86vWW9)vmSWWDAq4CpctETVW@n_gO%7eB?=P0a9C>rj4eH-M4LHM z8zdmNqIs_(@^PL*|6ENPKnr6=@2O5EtSaw4uX#jEgcyRg4E(%VTK}u(2T;hm)9M?6 zZ9-iCW6egNJ;t!%hahYS2vR-m6=s5dv zP-5U=Bqn+1#g*WMX60>TpcUnp0W~?}XlB?4As2Yj;eeUxJqcz?9$=VWEI5Kg=YS;e z_+|+u0z+6gpfs3_K~s7akDzbPqnH|chGEEiI6aD|3GvOeRb-XCVHTq9ovBPuWcf=V^2mOt{smo65w*q`RPa%on!KWQY)rE(5DCwo%$euIP*h%yGRc^Xq>9 z*x6y^J}Xsoftub;O4@;dBqWe0t6G;)Mm8bK5NF?(Ywo$+#3mbXWuWUWx(o%|wsxf^jldNV3maMTdN)H2$hASH z9K+R$4jw~%q=c~#83)OqI+c7`jAHup;4?Y8Sfr={$zw6VILsy9r&ZcZ;*yl^+#*z? z4pJA+cHp_FaX=`hSi!8Vrlp%3BsuJwqiPM2tfNH|^Pn9VT?ES%ZpOwI)G~(U8P+sW z2ez)h4Jg=q_F;ArSl7Y{j%u+vSazNHyJl=0c%8R{l@Y2-vPjS=@Nh|gz4(_fFTQ0B x9Uv#X7$SR_4EdIqgV}csR7ZH<9<(x9`ksYi9`)E0wEp^tkluc(?n5R306TB_3mE_a diff --git a/site/tests/images/ex15.gif b/site/tests/images/ex15.gif deleted file mode 100644 index 63c99884e1e21f3b16780ead3d1599a4f79dd26d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 175 zcmZ?wbhEHblxGlQIK%(~2M!!)XlVHV|G$HS16Tk=DE?$&WME)q&;fBkY8{wMEOy03j7yT|r<04!3??P4u(+o6){{$>ZE5Z8gR-;qZ&qao1OOX_XjPPp&!GkSf3|(n9cZ&y3d;&4%>a591{pv8>_jX?dZV z5amHEFAqWxV;BKKax)@T89!%P1Avon9WRbe0bmh|3Lu#-TX;-7mZU@|p{OmGtWbwV zBCm-N8?iVhuaYOLU2sED7PYz#cdvgENE~%_D~V=Ab-W+Am&b!Frw|02lhzl}UA|<; zO(2`t=7{2d$Kvf6duP$vRO_hzNk%w1VOsz%0KxzO0002Mz`%fjfdBvhKtMnM0000000000A^8LW00031 zEC2ui09ybr06+u&IJ(S1BDD76yg2L4Zvevfg-?LiV3SbfieLQn~l4)0$;yO zP|;fyi;dPsDQmg{0+KMM88VOqtaB>^NS0r&nETmf%H#A_CB?9tkimm0mw+T@3PA#s zhK_U#Fo6?;PEcPK3W#!wFCI0%@A@@D;Tv z6F0{C=}c+OTgDp3iJAw&B&mQwSoONKkGHq~2EwhmWR`tcd}}1S3fGR}BK6vC8l`q4 M}*4Z`ZpyZ>M)jt~H7!U+kPgR$fQw8|{mO9};e*8+qA z0T6%?2t`nD5lF_K9+M~#gj%myD{Vm#@SH+01(|(F%jmRvto4GG0OwRAd}gb~PqMfq)!*Y-fTjnuvK3FECS^1D~9GqF5M3scED%mTYL4 zu(PzawzIM&TaUGxal0^Jz6zgBnnlBh11w^r%sDWn&eFHlB#f`NjHNgN+fLtc;DkMo zmKZsDOjYP@f7Z4h)cY>2$8~Ch_G}8qyO)f#|7%-aC<6s9rgzf=Dp^sRR zBTO_b8c6=IU>S!RIeHvfP!6bvYd|)@Lu7@kZ7r>I1C%6%NO~1XY^ zCgo2F3s(|q2WbREMO%8Ni-@q2zzUnZ&7ey1gVYJxx_W4p_2h`MWp64H8{+GzDoIJ^ zbjp>j-AX`i>^iDuP}V#&hL~vK_tdDC84&+Um#537nhAkqReN_0m6#8-f}O-^XoxTO zf&gq_DegZuhCGd~9Ab41ES$0hX~xTdgb)n?NaLtlB+EE6ZWA2y$WZMlW;VY~!kY8AU2!Qu_t8zei(kC zKmM-m^aWT=ZorXe-3anr;9XG+yl@~`)V(F!4$laP6@<;0)D&oQa3xqIAV#7VhuYDQ zTUfM3NJ2#^9=O{TJ6(Xmc69uKo-$>SsF8|cye7g^=Rx-(Sb&WpQj8k}a-(PV_<)^G zc~KzE7GXi+M3ilfha6^D2I<@hIPh1@bPN)ErBhB?=ntQ@CWRZ+%V`3oP?DFTLh*Dvqa)}-`2V_mO#KWb9!Z^f0X0@rt zrX5jv0;wx>^PY)%09xszovuNR3&D|A;S>={Y93IrK3Hdh^!SA4OPF3U6N5E){%|OM zWbRRfpmh!rq$2aQXlz|f`iUmAARx&Tp>cjXEpndhDqe?r-6JHoYR+&GwFL%8&YbkY zhhDtG(uFQ^d*K8wF-4xa4!#qx>!!VYEyy08*X`TUaZ<8-BOnC7@$bR(=1ZD+CR}N* z20-qh4vz?ZiKD>qS|^;Zthtre9I7SLtth12tbt!}aX3|57;bzz;hjc?G~tS(4i!Q7;QQ6p718cY$(ucFQpt7$S(2ah~LD!HHh5mc`)=`5uICTrn5w`Y5zS88|kO;De{R z5FVxtmIwQq*YG6`2xDhR=A&qIy!px_-1r(WK&JqR2O*k>3&2Ca`r&8?3>02+kf0uC z?5AzIi3|`hs1RQj(126W9@)C`uLI%kM-5C?r0_^y;zYMU1Rfx)<0|kkKf#@xKXvkI_qXI^vEDwL=fMh;alDtvgBL|f9z|9Ks e0w&OG8e(WAtunGZUpNgK;4us?Ng09!0029VJD^+u diff --git a/site/tests/images/ex19.gif b/site/tests/images/ex19.gif deleted file mode 100644 index 27b81934ec0c6cd8261c21ab33f198e4238d604a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 467 zcmV;^0WAJUNk%w1VPya;0KxzO0002Mz`%fjfdBvhKtMnM0000000000A^8LW00031 zEC2ui0A&Cy06+u&IJ(@qPIh+CExU6U2_~Yh$6##%; zZ%FJ3fEc2xNUSLV5tgvBWcHjN=y5SshGMc=P%?;>juC+jbYXzVWy0G^uiNkU2m!hH z0pv+|f`f!MTN!U}1agUi42usxjuv4Mi6CQ%8i#mTGlifYL6Z$mRZ=u5jB|@{p&Kp% zq+A$j6LYpLu^_c+ufM>-I6r8@h(O56%FE2n%3UeW($msAkjB^**F#m=o;|W8K?B=} z(7@jg;YT6m4C999zv&e4cHP+Y!fhFjv)OcFX!rpT*acZ?>NPlpA)$x`mB>gb*hh}L zQVUb1(1@9D;~$C^FhH3lBV3CWTr`#`5e`ZmkT7G)oJq502X;1p#c=t9A51mWf(rE~ zw5T*W6#M|W#I&i?r>^=zol5mhvRWT=hT0QBYcP3UZFUrV!Z diff --git a/site/tests/images/ex2.gif b/site/tests/images/ex2.gif deleted file mode 100644 index c0c54b45b196ba9859b0cd51ff6618a847f2e25a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163 zcmZ?wbhEHblw%NNIK%(~2M!!)XlVHV|G$HS16Tk=DE?$&WME)q&;fBkY8{v}EOza2 zYUudckddq<^kD;^a_$iZ#urc5N*>)Pv0{a+G{Zce*-zg+;GN2^yurt9+pS)XJGM^E zw+y%@EL!HesASg#$DQ_V1)>+$lsta1q-?2?WOQWMo#YC`RHxc)XWdz%)5V=K{X)6C HIT@@03~oB` diff --git a/site/tests/images/ex20.gif b/site/tests/images/ex20.gif deleted file mode 100644 index b6a137509c40601d26ed847a70a3e465ddcec0da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144 zcmZ?wbhEHblw{y#IK%(~2M!!)XlVHV|G$HS16Tk=DE?$&WME)q&;fBkY8{wEEu4(x z4xIE}*y|@t}vj1QxI$UX<=sB)zI}m^?&$I^vL_Gmr$HW+* zE+XI!7sWv!z~GRC3a2F*d>DVN0DyTMP#fQ$&kG$~y9(_VeHMeuNVs_%PW#~XIRqe= zXvY`;m#4Tkw%k=(dqsNaR39V730LV8b=17G+;*A@JeS%VwSr>{)5t=YJKw8POr_Y}=uH^$t zwCJvmMn9?p2~Km;MGD^O|rEM{LK7Ll6*&hFU-p@eVFFK7~Y* z4w_O#j3e;C3>G997f5j2C{ziB7QAy~Xe2;+kSQ)s6B$CnO!oqnQR2p*2*xb(2n-rx z$-qJjX{nr$LvVnDDufEk9+>bgF;q8^Kp_^Mqqte5m;h;3#u9NgXj_phmXHAqaDqS? zU&p*QhLc`k)5AGv1qWydprVoK8*Iv1TPA7Nke6|d%u1_1iul?d9&qexoTLSD_&Jaq z)a1k7Z(?-{%&U&k1Ii$?MK;Dgm83*$tJsi&tOlWKCs48GQ1l?KBeuX9N#rjoaI@cw)U-#=f-u2VFsdRU3Kg-`A_y&!ymE4PI#d1RnW$k& q5`!hZJqIFg>uAzRW5qYO-Rt6aS>7^!{4wE(gVQe3i8t;+0suSublkN7 diff --git a/site/tests/images/ex22.gif b/site/tests/images/ex22.gif deleted file mode 100644 index 207568a2ca86a199eea5e05f0fd36aef725b115a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1039 zcmV+q1n~PuNk%w1VV?j|0KxzO0002Mz`%fjfdBvhKtMnM0000000000A^8LW00031 zEC2ui0G|L+06+u&IJ(^a0=(Hspg3zSaBKmwjby1vgP=Y^HxO$hT&Zi`7z)v%(+@hF za0mj>h{)t1U{oTR7N>L)YO(;)>9l&B0BqVY@gp9R9p@#?@m-|LqjWoSe#1RFJK?7g z@Hb#(fpI1QU1Eb9Ya2`ejw+Cml9QB`mY0xmn46rPla7vuccY}GrY0y6qCgZe6Oczi zuzf}nWv^f#K*`R5{7eV7tJ&w3V+GQ4Q(yH3sKq0-rwM3o{SR?T5l;v{rLplv z?WZdgLa(`Tv4ZJ>lr3|T@CgoT4KzDdexdp^B|5IfTG_DHXkgZ}Xw#})o8;FEvuxFf z*h7<86;OEd>c#sK4Z6L6^}@9nxNthK?+gbX%%N!7zAM%C&1WTUi53~{VHS0gK|;$T zK8F*%tH^`Oq>)9ob9!vuQ_U)$IFvAU2e75;NI>edu{;d&=zTG(*t$@qPk)h4^idZh z&;Ho`lIYh5Q()`?o?3>uLBU44n3UOin+@1Ogb>!((-IbTvjk>pp{Id{^~~qNAdbO= z6juu!VMBzY<&Z)yOC=apeLiKu&q}X_^~!(OL}Q{ttHfYoK197&22}omM9Yjs(FBYz zXh2e8ZV{ko%LKqMX5N-ucIoApVETYXdF4#WTopf*nIlYSYNVxIe|h%^1ak7VWWG=U^s*Nri__2mBa?4^*9>lq&rf&RtruV3Egwm>`4u$=CRgK zO2SzRgr=mBRw@WTIKomERdQfOd%4XjLmrdKf$EVqh(W?5Zl!$v2|KTJn_Yg1sYzW(E!@; zTIe+U@yH~XZ1Tx%nMqZ^3m&5}T7Lc%B`UOwiYkEuhvqbR%Qd*|^X|Qd}a7 J@&X9}06UEU<+%U= diff --git a/site/tests/images/ex23.gif b/site/tests/images/ex23.gif deleted file mode 100644 index da8f92e6f1229d139d4a4afea8ec960cb7302afd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1600 zcmV-G2EX}7Nk%w1VbuU^0IC20|Ns90004l1fWW}OKtMnM0000000000A^8LW00093 zEC2ui0M!6&06+u(2)f+3nPWMW82S|DhH@U5kDwx6ZOoDk$L?z99| zuX4K#0=0<_cG0mUKvxpi0uY$Zoo`aScof6!qPuZ!0@}qAL>9ZxShx92hqJXhR4!e| zwI6eJe|;B&7J)2i0BCU>NETNNjUrt)lM9iAl6p#Mh9O-i0GF7gHfW4)Uz#PWtQI7% zBCbBDsj|4ay1Q?-pS-}b0-V7cN42)5#mi!dki@;pYJ850Xj99Gzs!Kt+#$}8T}RN_ z0@B|P+YRd?;S}u(h^aCnl5+W~)i|<}2*6w|*3s0k zQCHBPGk@k;G;~x?3~2^jRt?TVj1<{Zh}JK=zI|v8)qzJbH^7U?2J|YI^E7Xk z9d|Cw;D*##K0JTjBMqy_K?4|5E%(ZF zqXfmzeq=d$2VYx+WDj{j={15$mw8!2k@}TsW(;JWspgttVacXww0sk%A2q%yQ+wqR z;-V5Vwt0)4n|a6#kZA%s*H1i(#GzX%B#M$r;2pXL08$N>U{i{O*x_UP0lD4|bM^?1 zVlQnEg{;4hiH=17 zH6ZI?f5RsG>TqT_A*&^cKx<5&($Zn2KzL%nZMXM8_t&_;}vaIthEBTJJ0xAFI2p+r+6pYY({PyB29bEn}U%nAbtig$UuJ=W|hT*dB z7syUiMxRn2r282qy_AbjG52|Y_SOiSJKFf0=Pvb(lqRcW}b>l6@CF6RBv2! zw|b+*wtIW*aCuDvm7KRGlDASXex*s=vJw=#7xgCARKEKdno|6+1X`$C$ygUU5X+FyIUi7?{^+xDbd&i9a38HnWr$_0noogqw71(nm zGFd*~=jJTRkRY=U8ALHP7sp2r38lirpZBC-JT%qG1nt8G_r$=x?>*#m@Hk-H637a5 z$s$yLb6FiMSdIDNz-esh9~CI5ClNBmgQ*F~{+O}C%$cx3C?uB*^CH0++K@RlyrB*w zm%|$9wxG*jAjHyae{U%>GTD9aoj?Du*JDt(Wp`Bb3-hQNTHux zA&Z;K35YUPw_?z(ObaALrT8PpylJ74z|aQdSV6}R&Okn+a@;0I^)%6R@>Q!U0@`d+ zO2?cs82kwhCL=eSK7Vs3eKL*a_4t8w*BV!ixf zCD|trWJNNP#S0Q5pBO*g&5nZ8yq>PWg3Bw;D+pjj-*%{|AzPY}Z60yL3q^sOe0j!= y$+Q@9P;d-cUEzy3W5YIu7)iE}ESmYG-at*X(1dPqn8I;rnP6oF4|gsg0RTJDUG~@j diff --git a/site/tests/images/ex24.gif b/site/tests/images/ex24.gif deleted file mode 100644 index 4f165bd4fefb321bd0b43cc792def8281fc3c390..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2003 zcmV;^2Q2tUNk%w1VORlz0KxzO0002Mz`%fjfdBvhKtMnM0000000000A^8LW00031 zEC2ui09XNn06+u&IJ(^a55P&Qy*TU5yZ>O=34&;v5+$S!xwzp0t zi4f?)dPrPy$!t2GP|z`&q*1Tftab~Taz$3h4HEv083901_{*LbfnV;soqx&-Z>voQ z;roDrf=z!GdV?8-h>MJkO@~o-hDsD^YiMc;nIV>9ERtEB5CH^yjy(iHcMqv~s$!-l zX$)$h19oq;I-vD4=d883<9rJ$lKiAX42h?-s9xk z!Qg$2$-s$Y|@>lNR^Y{2$_1y6J{{K?I@l(-HL@o`%3K9(HK-4})wiL9|gybQ> zMi%u6yvY8shqz8@vhe^3KqMfNCOcl3NMMtbjE)pCc$Ly4vL72&UeiHJ2oIQzWa=Dx z5h%n9af%qtkdzIhrb|1*5NadmsdT_1{5)j!(Ubs}4qgG@pi zZ`D<>HV)}td49Of0T;*wi_|WF5?f<*;M?SarRhu>FcaIjgPY@x2)OX$j0yuXj=Xt0 z;&h!$m#4fB^Xb^JRHyS1+V)Z2p)-Lh9^lj{-?@m(I&+O;gI*ZFHcgxL*-UU|z^Aj*9d73k76v(T|2VrzVO z*F@T3Xq^R>rS<}bEz$x=jI>yW#b?umh9d~2@r0UFTir8SQ(pZih+8V=ql}FV&2wFL zQ1+GN7f(iMWfBc)QRS6f){tcukKu&L4%Pse8iZMt>C>5N-WK8j2r@W9o3IF}Aq{a} z_a>ZYy%!3eVPP}n2XS6QAP8-i0MMF+3be zBCC=S@($rbSu(*IbFA{d9z)U3$-j+Uo6PaR%tW~^udFjdEk8l?&R62>Gtfk<(6bXi z7oDBZNLQfd!%uIpDQVY5t-;jBFuBc}0=k9e(E(4eCt1sEV%*qDiGoK$C!j5a+R;>E zF;h13GPMSYI#8L}O$Mi!1O@-S<{lH!EO@iAP&#)xq}T`ND}Xzfw9?c5F&(ys;fSP*wbns8S;0Z3A`A9xx1}6|e<`xQ?+J z!-XAIDmbBW7B-;u8c$uYfh^L@S)N3rdUu^qebW0&*{FmM!w?-NUla0X>S6V>PIQgu=KZUy! z8v10$NZwv;w(S}oP6D$u7tn-0vPVDKr! zfEogn3e_J(4dYP-mef@&m8soC!Be5?#|FqS30Dq){n6uHJu9&e>92ka^$y{d$->8t8mm-f}74)#=S-9TQW09Y)F)`r?iQ1ZO~Gi zR@qt!witj%>%6L22wJIvodl!UI#|uU68BcepUu@yDVi`pVv2)w<;tFT#9Zw)#B9CA zf(#i|Tvz##c0~9^cXLF;@D8DvCp`gp!E)YMI&>Y!ya6fL8&Z~4HAWR=4t|e7gZ{ws zdm-4b9Ck7UN|~a%imhSw`B_TU_!vZ2GtilfVq8&xY7Q}sXaQRqQ@)ATG l&W3oP<3X`|3H&JpWmv;#h~qz=;T{#+7QM-#ZL1Oh06Tb_#uESl diff --git a/site/tests/images/ex25.gif b/site/tests/images/ex25.gif deleted file mode 100644 index 18d1498066aa88ca029043f12031e6e21810d130..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 145 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 X<(JXImQ}=`e-T4HGi;^K&FKFDMIlZx diff --git a/site/tests/images/ex3.gif b/site/tests/images/ex3.gif deleted file mode 100644 index bf10c18c1417f854d9a130b59182c9d0d468442f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 349 zcmV-j0iym#Nk%w1VLAXW0KxzO0002Mz`%fjfdBvhKtMnM0000000000A^8LW00031 zEC2ui06G9K06+u&IJ(^aFfu_!c$ADP7wsM)ECHa1S;L_hxQ*_B5@u}QI1a!$7*IQ% z2+)F5Dg;!e_z3o%&_O_hsYQ+%C51V$3artv;&kko9^szZ(qJ@Zi`^gfIXm!5z#Kj2_Zh5yqKENm#=JZ`=;2 zH`QI(#RO9@yqPfqR3-0G=onPQAbBU@`u_kKL>ox3puvL(6DlMauwg@Uq3$)Q=YgU) vi+{kxvq&Ru)`$@_5^==%g%=iiS}aKDxa*n?iIyyyyS4EK%QG-zBme+Ad@qXk diff --git a/site/tests/images/ex30.png b/site/tests/images/ex30.png deleted file mode 100644 index e8f75cfbe178ef9cc4abdca0694f13692ca10b6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3392 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 Mv7Ch2QcebI0LoHiC;$Ke diff --git a/site/tests/images/ex5.gif b/site/tests/images/ex5.gif deleted file mode 100644 index 4c3a7b9ba7da59054b113958102c6206c74c3d7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 235 zcmZ?wbhEHblw;6hSjE8b|Nnmm28M=)h64u>N*{Xe|_?xQz`+2rUE=irJaku1w)$>z5uY+&4T|cIos;9#Kd~Jn=o@K3F z9z(NZ4mV45UH^oMlRAQ?PMbb`vO`r!tGaEHpi(23AA^vWXOu#CPFXW!su{1b97{o7 gySHl9hB@=3y$prBox~)P%H%fpFY7-b&&gm70Da?Do&W#< diff --git a/site/tests/images/ex6.gif b/site/tests/images/ex6.gif deleted file mode 100644 index 679f278f378a2ee372f712146c55c913a2f710e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 906 zcmV;519kjINk%w1VcY}*y>t-FyZ>M)j${=GWvZ@E5U_A8&#CY#Cxb3K<h$sHv8#u2H0` z8a%BSs;{^yo23@Fxxc`tvBAW}WCL@QrF#;-#?KSZ5pd89v(?xt!`a;3$9)T$3&?)p z4krTX>g(wci!Si-^7Hid_V@Vle%=%B@VW1l@f%n{Ai-a?4tg?UP=PrL2^C75NO8oI z99wQktC(W{8%KT~KXwZ#vgE;yCId0ta!pbTd79+yYrw9i&6_xL>fFh*r_Y~2gYGni zOp8Muy_ls06>q7C00bgBeMWLBv8q;qVa+;iCf7isG)VQK^y?W)q)?tKYxYFYZO!{>FWAaZ#`rwC|aW^EBlz=fb@>YA1HAohMYG|aMeH@twVHH}8cHv?gZfHb!9?}3}h%$^w zA`B*;m|lP?wwRuaA}oT(Q|iI!fNuiq0$+_bhO$Tk&3$f2+2ey*Zkd8V{BcB{m*aIvrZ#4tSwf0xa=>PrZlnq4j#0Tc=bhT% zIfR@x26x+Vy6JhNX$-I!Xa=w)s_3HmSg2PrESX~;pDkXbhXdCfDrliMFeeuWl)|YX zRBk*1<)$70imDu1uKGu-u0jNBtP-e7YX`R8s_U*)gz6$xZ~2B8t)z0oDUZIAxRPN{ z#$n3ZJg+f&s%Dnn#_3@bBuip@FId@vj(f?j`zZq>0UtF368dl=|kci gC#<~2rq;(y8%*n}Bzag{8(g!t>o30RNRR*kJD<xc~qF diff --git a/site/tests/images/ex7.gif b/site/tests/images/ex7.gif deleted file mode 100644 index 981d6a3221b44d18e99fb8d1d02496f9eddddcb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 739 zcmV<90v!EENk%w1VaNbg0KxzO0002Mz`%fjfdBvhKtMnM0000000000A^8LW00031 zEC2ui0LTDU06+u&IJ(^aFv>}*y($pQyZ>M)j-3FIXsQl^u)c6CQ-G_O%(>`PJO99- za7Zlnc*dl1$!x-E3tYn&X;}pX!c`D}1h(L?cuX#v&uDPh$%X~iL27$0k}9AXz*;Wh zx8HPuf&)BAR&ZZdHHQpoT!WC27#kV{a4txann#nX6B;|2B{rg|O&bfWJ*cWl zp|P}@v$ZQ4Ediz+ez?FPT3otQu&=?O$H{+|EO;Nk%+nTBUk=NC*)P3S+tk!wU5^8R zEZN=Q>X88L>w&lL@-Xr9_9*rD`uj@K{K=u9ks9Fa0hlaX;52B*u%W|;5F<*QNU@^D zix@L%1fc#Uj|&?}(i!^~q6GnwgRYPyl5eF;2rXaAJa=-}%pd-4rqZ+Hn7L}-bb5jY z1y)XjLBaj}cNAMvYE6Z*iJF3{)Jdp9T~VmbLLx_C({R;k2gkC3$lyJ_N?{lluVY7P z>1Y9EBZO=vQL%D2E}^{p5>@Hb1#KR{GZn2x4D=-9#C9Lciz#_>K+t#k&a^;JWn`m%htmEMdVd=1OL zzpDTKqP>=tDYKae-w1T^B3u;d8K??<@0HhJgta(W3w>GyD3gT;b|nOdnE9~ODM4UJ z&Uw5<0b4W_b_fD5aAdInjCaIk(Kh@2r{jrI*#V=CYk~Lz7A?NyObaJ0v*H9oRxqJ@ zSvgrG2CFqGRE{y|w&VoXxtJv@hJiHW6^q!!AQ~Ea*;YBjI8e|+YC@vho5X1&UYx+) VAX}Gs4nYhm&hXi16DTDB06W*5SX=-A diff --git a/site/tests/images/ex8.gif b/site/tests/images/ex8.gif deleted file mode 100644 index 016ddab00a2bc7a2c067cfe0746575ff2e990dff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 416 zcmV;R0bl+{Nk%w1VKx9V0KxzO0002Mz`%fjfdBvhKtMnM0000000000A^8LW00031 zEC2ui05$+J06+u&IJz3dFv__cT|iu^1qq4(Y*My}WU5}MxxVlKWFzUaS_lE)gkrsj ziSXd$B%cf6I7yN$G3RC(s{$jxST?|`{%+Q=aK;pyWuxrG6lfQB8!$tCWwa}0nNPs) z2NhHoTxTgBaess&G^yhw<4k|kw>ST!icZx8~1d4?23FRn3M!L-Yy4cQdK+7OKq#@{~N zA?AX;tsd8cv*Rlo0B?||+1~M~yGlpUF}J^9jN3;6o`X*|I^ZJ5VuUn?E4YY22(bj2 zij^*6%%o;M)j(|{^!lVc$BmiS9&vf+G_)_Bc)pI+M zgCiIYiXl~Q$!wBZwVw_42@XmuXfu%QdM{kBcuX#vk&Cl>%_dVV+AHN^odF&LrIQ(; z)b|-EZ-5wo0CN_46#;{UjyZohQh|+2kspc{Mvt7Go}VKGaT_V1rksk$5r4is0VFp6BUP}jx{zwR_(Hw9g+gn$SfD+y}Yvy+qxaa*+$L(d3Gl=v$M zA>GKMB5>v`s%(c$4T93Z$b_`2Bc(pw;rwCKs#hmn8%Wd%mL*b(r_cgoH0Px{I#z6k z{c7hYDw=@YDv-u@7hOVFndvZL)Gr^BD;5lmV9|!HWqSWM30w$9kir?4ykKz+#8ZxD zC5s-tk^@!JsOd&#hBq}KW34-dp^Tw%6}7JKYP35ow6#9}fb!1WWbP^2i^7?R8+tYI zN5)MdkKi2f;N;J1#{M+@Rp{$0zULXP_+@n*pF?_!4yrr&6NiEuezGB%F%j$?!DfNm z)BfyYG<061l-Xd0}p!e5fBo5U=(=`9>?KQ22K#h9E*7e z#XkIf=*5H`_Trv(^c(?0UxCPY-F7WX_M(mAOmhv6BP1vW7;O|;r*t zosj~?jya07<0KQeBj2u&p zdf{nsngo|-m(rZ9wmRodG(xq|3$E5mOraG33V|NWkXoq*RLVoagZ*_%ggh^yEvZ0- v4b(acv%h8#>;y$TFb{}4z@v<^rD4KtwBW{YDum&d%Lz?=nyYRF2><{)Ky83) diff --git a/site/tests/images/exponents.svg b/site/tests/images/exponents.svg deleted file mode 100644 index f1bc8c0f..00000000 --- a/site/tests/images/exponents.svg +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/functions.svg b/site/tests/images/functions.svg deleted file mode 100644 index eb73cbb9..00000000 --- a/site/tests/images/functions.svg +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/gather.svg b/site/tests/images/gather.svg deleted file mode 100644 index b9da20e4..00000000 --- a/site/tests/images/gather.svg +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/greek.svg b/site/tests/images/greek.svg deleted file mode 100644 index dcecf702..00000000 --- a/site/tests/images/greek.svg +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/kern.svg b/site/tests/images/kern.svg deleted file mode 100644 index 663bc3bc..00000000 --- a/site/tests/images/kern.svg +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/lap.svg b/site/tests/images/lap.svg deleted file mode 100644 index 96c9fdf2..00000000 --- a/site/tests/images/lap.svg +++ /dev/null @@ -1,220 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/latex.svg b/site/tests/images/latex.svg deleted file mode 100644 index 3cab59a1..00000000 --- a/site/tests/images/latex.svg +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/mathop.svg b/site/tests/images/mathop.svg deleted file mode 100644 index 5cd5fec6..00000000 --- a/site/tests/images/mathop.svg +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/mod.svg b/site/tests/images/mod.svg deleted file mode 100644 index 50fde308..00000000 --- a/site/tests/images/mod.svg +++ /dev/null @@ -1,183 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/newline.svg b/site/tests/images/newline.svg deleted file mode 100644 index 5cf3127a..00000000 --- a/site/tests/images/newline.svg +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/not.svg b/site/tests/images/not.svg deleted file mode 100644 index f6282dab..00000000 --- a/site/tests/images/not.svg +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/oldfont.svg b/site/tests/images/oldfont.svg deleted file mode 100644 index fa3aefc7..00000000 --- a/site/tests/images/oldfont.svg +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/phantom.svg b/site/tests/images/phantom.svg deleted file mode 100644 index 174f72f4..00000000 --- a/site/tests/images/phantom.svg +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/pmb.svg b/site/tests/images/pmb.svg deleted file mode 100644 index 56f21738..00000000 --- a/site/tests/images/pmb.svg +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/raisebox.svg b/site/tests/images/raisebox.svg deleted file mode 100644 index 1fb62705..00000000 --- a/site/tests/images/raisebox.svg +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/rcases.svg b/site/tests/images/rcases.svg deleted file mode 100644 index b7fcc413..00000000 --- a/site/tests/images/rcases.svg +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/rlapbug.svg b/site/tests/images/rlapbug.svg deleted file mode 100644 index 7bc1588f..00000000 --- a/site/tests/images/rlapbug.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/rule.svg b/site/tests/images/rule.svg deleted file mode 100644 index 0e987fd9..00000000 --- a/site/tests/images/rule.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/site/tests/images/sizing.svg b/site/tests/images/sizing.svg deleted file mode 100644 index fe4dcb37..00000000 --- a/site/tests/images/sizing.svg +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/smash.svg b/site/tests/images/smash.svg deleted file mode 100644 index d0083e45..00000000 --- a/site/tests/images/smash.svg +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/spacing.svg b/site/tests/images/spacing.svg deleted file mode 100644 index ddb3fd6a..00000000 --- a/site/tests/images/spacing.svg +++ /dev/null @@ -1,330 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/sqrt.svg b/site/tests/images/sqrt.svg deleted file mode 100644 index 240c63fa..00000000 --- a/site/tests/images/sqrt.svg +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/stackrel.svg b/site/tests/images/stackrel.svg deleted file mode 100644 index 2409d798..00000000 --- a/site/tests/images/stackrel.svg +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/subarray.svg b/site/tests/images/subarray.svg deleted file mode 100644 index b874f36b..00000000 --- a/site/tests/images/subarray.svg +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/text.svg b/site/tests/images/text.svg deleted file mode 100644 index 8f83ceed..00000000 --- a/site/tests/images/text.svg +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/units.svg b/site/tests/images/units.svg deleted file mode 100644 index db485204..00000000 --- a/site/tests/images/units.svg +++ /dev/null @@ -1,351 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/images/verb.svg b/site/tests/images/verb.svg deleted file mode 100644 index fb31aae7..00000000 --- a/site/tests/images/verb.svg +++ /dev/null @@ -1,271 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/site/tests/katex-tests.html b/site/tests/katex-tests.html deleted file mode 100644 index 67ff8a90..00000000 --- a/site/tests/katex-tests.html +++ /dev/null @@ -1,609 +0,0 @@ - - - - - - Temml Screen Tests - - - - - - -

    Tests from KaTeX

    -

    This file renders examples from KaTeX’s screenshotter tests.
    Images from LaTeX are also provided for comparison.
    (Images come from LaTeX Previewer, thanks.)

    -

    Accents

    - - - -
    SourceTemmlLaTeX
    \vec{A}\vec{x}\vec x^2
    \vec{x}_2^2 \vec{A}^2
    \vec{xA}^2; \underbar{X}
    Axx2x22A2xA2Xaccents
    -

    AccentsText

    -

    ıˊı˙ıˋı¨ı˝ı˚ȷˊȷ˙ȷˋȷ¨ȷ˝ȷ˚aˊa˙aˋa¨a˝a˚AˊA˙AˋA¨A˝A˚I˙ I˙e˝ e˝ııAccentsText
    -

    Actuarial Angle

    -
    a_{\angl n}\; a_\anglnananangl
    -

    Align

    - - -
    \begin{align}
    a &= 1 & b &= 2 \\
    3a &= 3 & 17b &= 34
    \end{align}

    a=1b=23a=317b=34

    -

    Alignat

    - - -
    \begin{alignat}{3}
    a &= 1\quad & b &= 2 &\quad c &= 3\\
    3a &= 3 &\quad 17b &= 34 &\quad 400c &= 1200
    \end{alignat}

    a=1b=2c=33a=317b=34400c=1200

    -

    Aligned

    -
    \begin{aligned}
    a &= 1 & b &= 2 \\
    3a &= 3 & 17b &= 34
    \end{aligned}
    a=1b=23a=317b=34aligned
    -

    Alignedat

    -
    \begin{alignedat}{3}
    a &= 1\quad & b &= 2 &\quad c &= 3\\
    3a &= 3 &\quad 17b &= 34 &\quad 400c &= 1200
    \end{alignedat}

    a=1b=2c=33a=317b=34400c=1200

    alignedat
    -

    Arrays

    -

    This LaTeX image does include dashed lines.
    LaTeX Previewer does not include the arydshln package.

    - -
    \left(\begin{array}{|rl:c|} 1&2&3\\ \hline
    1+1&2+1&3+1\cr1\over2&\scriptstyle 1/2&\frac 1 2\\
    \hdashline
    \begin{pmatrix}x\\y\end{pmatrix}&0&
    \begin{vmatrix}a&b\\c&d\end{vmatrix}
    \end{array}\right]
    (1231+12+13+1121/212(xy)0|abcd|]Arrays
    \begin{smallmatrix} a & b \\ c & d \end{smallmatrix}
    \begin{subarray}{c}a \\ b\end{subarray}
    abcd absubarray
    -

    ArrayMode

    -

    2fx122fx1x22fx1xn2fx2x12fx222fx2xn2fxnx12fxnx22fxn2

    ArrayMode
    -

    ArrayType

    -
    1\begin{array}{c}2\\3\end{array}41234ArrayType
    -

    ArrayRemoveEmptyLine

    -

    A \\ at the end of a matrix should not create another line.

    -
    \begin{pmatrix} 1 \\ 2 \\ \end{pmatrix}(12)
    -

    Baseline

    -
    a+b-c\cdot d/ea+bcd/eBaseline
    -

    BasicTest

    -

    $a

    -

    BinCancellation

    -
    \begin{array}{cccc}
    +1 & 1+ & 1+1 & (,) \\
    1++1 & 3\times) & 1+, & \left(,\right)
    \end{array}
    +11+1+1(,)1++13×)1+,(,)BinCancellation
    -

    Binom

    -
    \dbinom{a}{b}\tbinom{a}{b}^{\binom{a}{b}+17}(ab)(ab)(ab)+17binom
    -

    BoldSpacing

    -
    \mathbf{A}^2+\mathbf{B}_3*\mathscr{C}'𝐀2+𝐁3*𝒞
    -

    BoldSymbol

    -
    \sum_{\boldsymbol{\alpha}}^{\boldsymbol{\beta}}
    \boldsymbol{\omega}+
    \boldsymbol{\int_\alpha^\beta}
    \boldsymbol{\Omega + {}} \\
    \boldsymbol{\lim_{x \to \infty}
    \log Ax2k\omega\Omega\imath+} \\
    x \boldsymbol{+} y \boldsymbol{=} z
    𝜶𝜷𝝎+𝜶𝜷𝛀+lim𝒙log𝑨𝒙2𝒌𝝎𝛀ı+x+y=zBoldSymbol
    -

    Boxed

    -
    \boxed{F=ma} \quad \boxed{ac}
    \color{magenta}{\boxed{F}}\boxed{F=mg}
    F=maacFF=mgboxed
    -

    Cases

    - -
    f(a,b)=
    \begin{cases}
    a+1&\text{if }b\text{ is odd} \\
    a&\text{if }b=0 \\
    a-1&\text{otherwise}
    \end{cases}
    f(a,b)={a+1if b is oddaif b=0a1otherwisecases
    \begin{rcases}
    a &\text{if } b \\
    c &\text{if } d
    \end{rcases}\Rightarrow\ldots
    aif bcif d}rcases
    -

    CD

    -
    \begin{CD}
    A @<a<< B @>>b> C \\
    @| @AcAA @VVdV \\
    D @= E @>>> F
    \end{CD}

    AaBbCcdD=EF

    CD
    -

    Colors

    -
    \textcolor{#0f0}{b}
    \textcolor{red}{c}
    bccolors
    -

    ColorImplicit

    -
    bl{ack\color{red}red
    \textcolor{green}{green}
    red\color{blue}blue}black \\
    black\left(black
    \color{red}red\right)black
    blackredgreenredblueblackblack(blackred)blackColorImplicit
    -

    ColorSpacing

    -
    \textcolor{red}{x} + 1
    {\color{green}+ 2 +} 3 + 4
    x+1+2+3+4ColorSpacing
    -

    Colorbox

    -
    a \colorbox{teal} B
    \fcolorbox{blue}{red}{C}
    e+\colorbox{teal}x
    aBCe+xColorbox
    -

    DashesAndQuotes

    -
    \begin{array}{l}
    \text{``a'' b---c -- d----`e'-{-}-f} -- \\
    \text{\it ``a'' b---c -- d----`e'-{-}-f} ``x'' \\
    \text{\tt ``a''---} \texttt{``a''---} \mathtt{--}
    \end{array}
    “a” b—c – d—-‘e’---f“𝑎” 𝑏—𝑐 – 𝑑—-‘𝑒’---𝑓x``𝚊''---``𝚊''---DashesAndQuotes
    -

    DelimiterSizing

    - -
    \bigl\uparrow\Bigl\downarrow
    \biggl\updownarrow
    \Biggl\Uparrow\Biggr\Downarrow
    \biggr\langle\Bigr\}\bigr\rfloor
    }DelimiterSizing1
    \begin{pmatrix}
    a & b & c\\
    a & b & c\\
    a & b & c
    \end{pmatrix}
    (abcabcabc)DelimiterSizing2
    -

    DisplayMode

    -
    \sum_{i=0}^\infty \frac{1}{i}

    i=01i

    DisplayMode
    -

    DisplayStyle

    -
    {\displaystyle\sqrt{x}}{\sqrt{x}}
    {\displaystyle \frac 1 2}{\frac 1 2}
    {\displaystyle x^1_2}{x^1_2}
    xx1212x21x21displaystyle
    -

    Dots

    -
    \begin{array}{l}
    \cdots;\dots+\dots\int\dots,\dots \\
    \cdots{};\ldots+\ldots\int\ldots,\ldots
    \end{array}
    ;+,;+,dots
    -

    Equation

    - - -
    \begin{equation}
    \begin{split}
    a& =b+c-d \\
    & \quad +e-f \\
    & =g+h \\
    & =i
    \end{split}
    \end{equation}

    a=b+cd+ef=g+h=i

    equation
    -

    Exponents

    -
    a^{a^a_a}_{a^a_a}aaaaaaaexponents
    -

    ExtensibleArrows

    -
    \begin{array}{l}
    \xrightarrow[ab]{ABC} +
    \xRightarrow{ABC} \\
    \xleftrightharpoons[ab]{ABC} +
    \xhookrightarrow[ab]{ABC} \\
    \xmapsto{ABC} +
    \frac{\xrightarrow[ab]{ABC}}
    {\xrightarrow[ab]{ABC}} +
    \left\lvert\xrightarrow[ab]{ABC}
    \right\rvert
    \end{array}
    abABC+ABCabABCabABC+abABCABC+abABCabABC+|abABC|ExtensibleArrows
    -

    Fractions

    - -
    \dfrac{a}{b}\frac{a}{b}
    \tfrac{a}{b}\;-
    \dfrac 1 2\;1\tfrac 1 2\;{1 \atop 2}\;
    {a \brace b} \; {a \brack b}
    ababab1211212{ab}[ab]Fractions1
    \genfrac \{ ]{0.8pt}{0}{a}{b}\;
    {a \above1.0pt b} \;
    \cfrac{1}{1+\cfrac{1}{x}}
    \xrightarrow[\dfrac g h]{\displaystyle\frac g h}
    \; \xrightarrow [2.\, \dfrac c d]
    {1.\, \displaystyle\frac c d}
    {ab]ab11+1xghgh2.cd1.cdFractions2
    -

    Functions

    -
    \sin\cos\tan\ln\logsincostanlnlogfunctions
    -

    Gather

    - - -
    \begin{gather}
    a=\frac 1 2 \\
    e=b+c
    \end{gather}

    a=12e=b+c

    gather
    -

    GreekLetters

    -
    \alpha\beta\gamma\omegaαβγωgreek
    -

    GreekUnicode

    -
    \frac{αβγδεϵζηθϑικλμνξοπϖρϱςστυφϕχψω}
    {ΓΔΘΞΠΣΦΨΩϝ\mathbf{Ω}\mathbf{\Omega}}
    αβγδεϵζηθϑικλμνξοπϖρϱςστυφϕχψωΓΔΘΞΠΣΦΨΩϝ𝛀𝛀
    -

    HorizontalBraces

    -
    \overbrace{\displaystyle{
    \oint_S{\vec E\cdot\hat n\,\mathrm d a}}}^
    \text{emf} =
    \underbrace{\frac{q_{
    \text{enc}}}{\varepsilon_0}}_{\text{charge}}
    SEn^daemf=qencε0chargeHorizontalBraces
    -

    HTML

    -
    \id{a}{a+}b\style{color:red;}{+c}a+b+cN/A
    -

    Includegraphics

    -

    Asphere+sphere+AspheresphereAsphere+xsphere+Aspheresphere

    -

    Integrands

    -
    \begin{array}{l}
    \displaystyle \int + \oint +
    \iint + \oiint_i^n \\
    \displaystyle \iiint + \oiiint +
    \textstyle \int + \oint_i^n \\
    \iint + \oiint +
    \iiint + \oiiint \end{array}
    +++in+++in+++Integrands
    -

    Kern

    -
    \frac{a\kern{1em}b}{c}a
    \kern{1em}b
    \kern{1ex}c\kern{-0.25em}d
    abcabcdkern
    -

    Lap

    -
    \begin{array}{l}
    ab\mathllap{f}cd\mathrlap{g}hij\mathclap{k}lm ;
    ab\llap{f}cd\rlap{g}hij\clap{k}lm \\
    \mathrlap{\frac a b}\frac a b \\
    \mathrlap{\overbrace{
    \phantom{a_0+a_1+a_2}}^m}a_0+a_1+a_2
    \end{array}
    abffcdghijklmabffcdghijklmababa0+a1+a2ma0+a1+a2lap
    -

    LargeRuleNumerator

    -
    \frac{\textcolor{blue}
    {\rule{1em}{2em}}}{x}
    xLargeRuleNumerator
    -

    LaTeX

    -
    \text{\LaTeX}, \text{\TeX}LATEX,TEXlatex
    -

    LeftRight

    -
    \left( x^2 \right)
    \left\{ x^{x^{x^{x^x}}} \right.
    (x2){xxxxxLeftRight
    -

    LeftRightListStyling

    -
    a+\left(x+y\right)-xa+(x+y)xLeftRightListStyling
    -

    LeftRightMiddle

    -
    \left( x^2 \middle/ \right)
    \left\{ x^{x^{x^{x^x}}}
    \middle/ y \right.
    \left(x\middle|y\,\middle|\,z\right)
    (x2/){xxxxx/y(x|y|z)LeftRightMiddle
    -

    LeftRightStyleSizing

    -
    +\left\{\rule{0.1em}{1em}\right.
    x^{+\left\{\rule{0.1em}{1em}\right.
    x^{+\left\{\rule{0.1em}{1em}\right.}}
    +{x+{x+{LeftRightStyleSizing
    -

    LimitControls

    -
    \displaystyle\int\limits_2^3 3x^2\,dx
    + \sum\nolimits^n_{i=1}i +
    \textstyle\int\limits_x^y z
    233x2dx+i=1ni+xyzLimitControls
    -

    LowerAccent

    -
    \begin{array}{l}
    \underleftarrow{AB} \quad \underrightarrow{AB} \quad
    \underleftrightarrow{AB} \quad \undergroup{AB} \\
    \text{\underline{text}} \quad \utilde{AB}
    \quad \underrightarrow{AB} \\
    \underrightarrow{F} + \underrightarrow{AB} +
    \underrightarrow{AB}^2 + \underrightarrow{AB}_2 \\
    \frac{\underrightarrow{AB}}{\underrightarrow{AB}} +
    \sqrt{\underrightarrow{AB}} +
    \left\lvert\underrightarrow{AB}\right\rvert
    \end{array}
    ABABABABtextAB~ABF+AB+AB2+AB2ABAB+AB+|AB|
    -

    MathChoice

    -
    {\displaystyle\mathchoice{D}{T}{S}{SS}}\;
    {\textstyle\mathchoice{D}{T}{S}{SS}}\;
    {\scriptstyle \mathchoice{D}{T}{S}{SS}}\;
    {\scriptscriptstyle\mathchoice{D}{T}{S}{SS}}\;
    \displaystyle X_{\mathchoice{D}{T}{S}{SS}_
    {\mathchoice{D}{T}{S}{SS}}}
    DTSSSXSSSMathChoice
    -

    MathDefaultFonts

    -
    Ax2k\breve{a}\omega\Omega\imathAx2ka˘ωΩı
    -

    MathBb

    -
    \mathbb{Ax2k\breve{a}\omega\Omega\imath}𝔸𝕩𝟚𝕜𝕒˘ωΩı
    -

    MathBf

    -
    \mathbf{Ax2k\breve{a}\omega\Omega\imath}𝐀𝐱𝟐𝐤𝐚˘𝛚𝛀ı
    -

    MathCal

    -
    \mathcal{Ax2k\breve{a}\omega\Omega\imath}𝒜𝓍2𝓀𝒶˘ωΩı
    -

    MathFrak

    -
    \mathfrak{Ax2k\breve{a}\omega\Omega\imath}𝔄𝔵2𝔨𝔞˘ωΩı
    -

    MathIt

    -
    \mathit{Ax2k\breve{a}\omega\Omega\imath}Ax2ka˘ωΩı
    -

    MathNormal

    -
    \mathnormal{Ax2k\breve{a}\omega\Omega\imath}Ax2ka˘ωΩı
    -

    MathOp

    -
    a\mathop+b\mathop:c\mathop{\delta}
    e\mathop{\textrm{and}}f
    \mathrel{\mathop{:}}=g\sin h
    a+b:cδeandf:=gsinhmathop
    -

    MathRm

    -
    \mathrm{Ax2k\breve{a}\omega\Omega\imath}Ax2ka˘ωΩı
    -

    MathSf

    -
    \mathsf{Ax2k\breve{a}\omega\Omega\imath}𝖠𝗑𝟤𝗄𝖺˘𝞈𝝮ı
    -

    MathScr

    -
    \mathscr{Ax2k\breve{a}\omega\Omega\imath}𝒜𝓍2𝓀𝒶˘ωΩı
    -

    MathtoolsMatrix

    -
    \begin{matrix}[l]
    a & -1 \\
    -1 & d
    \end{matrix} \;
    \begin{pmatrix}[r]
    a & -1 \\
    -1 & d
    \end{pmatrix}
    a11d(a11d)MathtoolsMatrix
    -

    MathTt

    -
    \mathtt{Ax2k\breve{a}\omega\Omega\imath}𝙰𝚡𝟸𝚔𝚊˘ωΩı
    -

    Mod

    -
    \begin{array}{cc} a \bmod 2 & b \pod 3 \\
    c \pmod{4} & d \mod{56} \\
    \displaystyle a\bmod 2 & b \pod 3 \\
    \displaystyle c\pmod{4} & d \mod{56}
    \end{array}
    amod2b(3)c(mod4)dmod56amod2b(3)c(mod4)dmod56mod
    -

    NegativeSpace

    -
    \boxed{$1,!000,!000}$1,000,000NegativeSpace
    -

    NestedFractions

    -
    \dfrac{\frac{a}{b}}{\frac{c}{d}}
    \dfrac{\dfrac{a}{b}}{\dfrac{c}{d}}
    \frac{\frac{a}{b}}{\frac{c}{d}}
    abcdabcdabcdNestedFractions
    -

    NewLine

    -
    \frac{a^2+b^2}{c^2} \newline
    \frac{a^2+b^2}{c^2} \\
    \begin{pmatrix} a & b \\
    c & d \cr \end{pmatrix} \\
    a+b+c+{d+\\e}+f+g
    a2+b2c2a2+b2c2(abcd)a+b+c+d+e+f+gnewline
    -

    Not

    -
    \not = \begin{array}{l}
    \not=\not>\not\geq\not\in\not<\not\leq\not{abc} \\
    \not xy + ab \not xy \\
    a \neq b \notin c \end{array}
    ≱∉≰̸abcy+abyabcnot
    -

    NullDelimiterInteraction

    -
    a \bigl. + 2 \quad \left. + a \right)a+2+a)NullDelimiterInteraction
    -

    OldFont

    -
    \begin{matrix}
    \rm rm & it & \it it &
    \bf bf & \sf sf & \tt tt \\
    \text{\rm rm} & \text{rm} & \text{\it it} &
    \text{\bf bf} & \text{\sf sf} & \text{\tt tt} \\
    i\rm r\it i & \text{r\it i\rm r}
    \end{matrix}
    rmitit𝐛𝐟𝗌𝖿𝚝𝚝rmrm𝑖𝑡𝐛𝐟𝗌𝖿𝚝𝚝irir𝑖roldfont
    -

    OperatorName

    -

    \begin{matrix} \operatorname g (z) + 5\operatorname{g}z

    -
    • \operatorname{Gam-ma}(z) \\
      \operatorname{Gam ma}(z) \

    • -
    • \operatorname{\Gamma}(z) \

    • -
    • \operatorname{}x \\
      \operatorname{asin} x +
      \operatorname{asin}_y x +
      \operatorname{asin}\limits_y x \\
      {\displaystyle \operatorname{asin}_y x}
      \end{matrix}

    g(z)+5gz+Gam-ma(z)Gamma(z)+Γ(z)+xasinx+asinyx+asinyxasinyxOperatorName
    -

    OpLimits

    -
    \begin{matrix}
    {\sin_2^2 \lim_2^2 \int_2^2 \sum_2^2}
    {\displaystyle \lim_2^2 \int_2^2 \intop_2^2 \sum_2^2} \\
    \limsup_{x \rightarrow \infty} x \stackrel{?}=
    \liminf_{x \rightarrow \infty} x \\
    {\displaystyle \limsup_{x \rightarrow \infty}
    x\:\: \sum_{\substack{0<i<m\\0<j<n}}} \end{matrix}
    sin22lim222222lim22222222lim supxx=?lim infxxlim supxx0<i<m0<j<nOpLimits
    -

    OverUnderline

    -
    x\underline{x}\underline{\underline{x}}
    \underline{x{x{x_x}}}\underline{x^{x^{x^x}}}
    \overline{x}\overline{x}\overline{x^{x^{x^x}}}
    \textcolor{blue}{\overline{\underline{x}}
    \underline{\overline{x}}}
    xxxxxxxxxxxxxxxxxxxOverUnderline
    -

    OverUnderset

    -
    \begin{array}{l}
    x\overset?=1 \quad \underset{*}{x}^2 \quad
    \overset{a}{b}b\underset{a}{b}b \\
    {\displaystyle\lim_{t\underset{>0}\to0}}\\
    a+b+c+d\overset{b+c=0}
    \longrightarrow a+d\\
    \overset { x = y } { \sqrt { a b } }
    \end{array}
    x=?1x*2babbablimt>00a+b+c+db+c=0a+dabx=yOverUnderset
    -

    Phantom

    -
    \begin{array}{l} \dfrac{1+\phantom{x^{\textcolor{blue}{2}}} = x}
    {1+x^{\textcolor{blue}{2}} = x}
    \left(\vphantom{\int_t} zzz \right)
    \left( X \hphantom{\frac{\frac X X}{X}} \right)\\
    \text{a \phantom{123}} b \hphantom{\frac{1}{2}}=c
    \vphantom{101112} d \\
    \sqrt{\mathstrut a} + \sqrt{\mathstrut d}
    \end{array}
    1+x2=x1+x2=x(tzzz)(XXXX)a 123b12=c101112d(a+(dphantom
    -

    Pmb

    -
    \mu\pmb{\mu}\pmb{=}\mu\pmb{+}\muμμ=μ+μpmb
    -

    PrimeSpacing

    -
    f'+f_2'+f^{f'}f+f2+ffPrimeSpacing
    -

    PrimeSuper

    -
    x'^2+x'''^2+x'^2_3+x_3'^2x2+x2+x32+x32PrimeSuper
    -

    Raisebox

    -
    \frac{a}{a\raisebox{0.5em}{b}} \cdot
    \frac{a\raisebox{-0.5em}{b}}{a} \cdot
    \sqrt{a\raisebox{0.5em}{b}} \cdot
    \sqrt{a\raisebox{-0.5em}{b}} \cdot
    \sqrt{a\raisebox{0.5em}{b}\raisebox{-0.5em}{b}}
    aababaabababbraisebox
    -

    RelativeUnits

    -
    \begin{array}{ll}
    a\kern1emb^{a\kern1emb^{a\kern1emb}} &
    {\footnotesize a\kern1emb^
    {a\kern1emb^{a\kern1emb}}} \\
    a\mkern18mub^{a\mkern18mub^{a\mkern18mub}} &
    {\footnotesize a\mkern18mub^
    {a\mkern18mub^{a\mkern18mub}}} \\
    \end{array}
    ababababababababababababRelativeUnits
    -

    RlapBug

    -
    \frac{\mathrlap{x}}{2}x2rlapbug
    -

    Rule

    -
    \rule{1em}{0.5em}\rule{1ex}{2ex}
    \rule{1em}{1ex}\rule{1em}{0.431ex}
    rule
    -

    SizingBaseline

    -
    \text{{\tiny a+b}a+b{\Huge a+b}}a+ba+ba+bSizingBaseline
    -

    Sizing

    -
    \text{{\Huge x}{\LARGE y}
    {\normalsize z}{\scriptsize w}}
    \sqrt[\text{\small 3}]{x+1}
    xy zwx+13sizing
    -

    Smash

    -
    \left( X^{\smash 2} \right)
    \sqrt{\smash[b]{y=}}
    (X2)y=smash
    -

    Spacing

    -
    \begin{matrix}
    ^3+[-1][1-1]1=1(=1)\lvert a\rvert~b \\
    \scriptstyle{^3+[-1][1-1]
    1=1(=1)\lvert a\rvertb} \\
    \scriptscriptstyle{^3+[-1][1-1]
    1=1(=1)\lvert a\rvertb} \\
    a : a \colon a \\
    \end{matrix}
    3+[1][11]1=1(=1)|a| b3+[1][11]1=1(=1)|a| b3+[1][11]1=1(=1)|a| ba:a:aspacing
    -

    Sqrt

    -
    \sqrt{\sqrt{\sqrt{x}}}_
    {\sqrt{\sqrt{x}}}^
    {\sqrt{\sqrt{\sqrt{x}}}
    ^{\sqrt{\sqrt{\sqrt{x}}}}} \\
    \sqrt{\frac{\frac{A}{B}}{\frac{A}{B}}} \;
    \sqrt{\frac{\frac{\frac{A}{B}}{\frac{A}{B}}}
    {\frac{\frac{A}{B}}{\frac{A}{B}}}}
    xxxxABABABABABABsqrt
    -

    SqrtRoot

    -
    \begin{array}{l}
    1+\sqrt[3]{2}+\sqrt[1923^234]
    {2^{2^{2^{2^{2^{2^{2^{2^{2^{2^{2^2}}}}}}}}}}} \\
    \Huge \sqrt[3]{M} + x^{\sqrt[3] a}
    \end{array}
    1+23+2222222222221923234M3+xa3SqrtRoot
    -

    StackRel

    -
    a \stackrel{?}{=} b
    \stackrel{\text{def}}{=} c
    a=?b=defcStackRel
    -

    StretchyAccent

    -
    \begin{array}{l}
    \overrightarrow{AB} \quad \overleftarrow{AB} \quad
    \overleftrightarrow{AB} \quad
    \left(\underleftarrow{\frac{value}{j}}\right) \\
    \widehat{ABC} \quad
    \widetilde{AB} \quad \widetilde{ABC} \\
    \overrightarrow{F} + \overrightarrow{AB} +
    \overrightarrow{F}^2 + \overrightarrow{F}_2 +
    \overrightarrow{F}_1^2 \\
    \overrightarrow{AB}^2+
    \frac{\overrightarrow{AB}}{\overrightarrow{AB}} +
    \sqrt{\overrightarrow{AB}} +
    \left\lvert\overrightarrow{AB}\right\rvert \end{array}
    ABABAB(valuej)ABC^AB~ABC~F+AB+F2+F2+F12AB2+ABAB+AB+|AB|StretchyAccent
    -

    StrikeThrough

    -

    \begin{array}{l}
    \cancel x \quad \cancel{2B} +
    \bcancel 5 +\bcancel{5ay} \\
    \sout{5ab} + \sout{5ABC} +
    \xcancel{\oint_S{\vec E\cdot\hat n
    \,\mathrm d a}} \\[0.3em]
    \frac{x+\cancel B}{x+\cancel x} +
    \frac{x+\cancel y}{x} + \cancel{B}_1^2

    -
    • \cancel{B^2} \\[0.2em]
      \left\lvert\cancel{ac}\right\rvert
      \end{array}

    x2B+5+5ay5ab+5ABC+SEn^dax+Bx+x+x+yx+B12+B2|ac|StrikeThrough
    -

    StrikeThroughColor

    -
    \begin{array}{l} \textcolor{red}{\cancel x \quad \cancel{2B}} \\
    \textcolor{red}{\bcancel{\textcolor{black}{5}}} +
    \textcolor{red}{\bcancel{\textcolor{black}{5ay}}} \\
    \color{green}{\sout{5ABC}}
    \end{array}
    x2B5+5ay5ABCStrikeThroughColor
    -

    StyleSpacing

    -
    \scriptstyle ab\;cdabcdStyleSpacing
    -

    StyleSwitching

    -
    a\cdot b\scriptstyle a\cdot ba
    \textstyle\cdot ba\scriptstyle\cdot b
    ababababStyleSwitching
    -

    SupSubCharacterBox

    -
    a_2f_2{f}_2{aa}_2{af}_2\mathbf{y}_Ay_Aa2f2f2aa2af2𝐲AyASupSubCharacterBox
    -

    SupSubHorizSpacing

    -
    x^{x^{x}}\Big|
    x_{x_{x_{x_{x}}}}\bigg|
    x^{x^{x_{x_{x_{x_{x}}}}}}\bigg|
    xxx|xxxxx|xxxxxxx|SupSubHorizSpacing
    -

    SupSubLeftAlignReset

    -
    \omega^8_{888} \quad
    \frac{1}{\hat{\omega}^{8}_{888}} \quad
    \displaystyle\sum_{\omega^{8}_{888}}
    ω88881ω^8888ω8888SupSubLeftAlignReset
    -

    SupSubOffsets

    -
    \displaystyle \int_{2+3}x f^{2+3}
    +3\lim_{2+3+4+5}f
    2+3xf2+3+3lim2+3+4+5fSupSubOffsets
    -

    SurrogatePairs

    - - - - - - -
    SourceTemml
    𝐀𝐚𝟎𝐴𝑎𝑨𝒂𝔅𝔞𝔸𝒜𝐀𝐚𝟎𝐴𝑎𝑨𝒂𝔅𝔞𝔸𝒜
    𝖠𝖺𝟢𝗔𝗮𝟬𝘈𝘢𝙰𝚊𝟶𝖠𝖺𝟢𝗔𝗮𝟬𝘈𝘢𝙰𝚊𝟶
    \text{𝐀𝐚𝟎𝐴𝑎𝑨𝒂𝔅𝔞𝔸𝒜}𝐀𝐚𝟎𝐴𝑎𝑨𝒂𝔅𝔞𝔸𝒜
    \text{𝖠𝖺𝟢𝗔𝗮𝟬𝘈𝘢𝙰𝚊𝟶}𝖠𝖺𝟢𝗔𝗮𝟬𝘈𝘢𝙰𝚊𝟶
    \mathrm{𝐀𝐚𝑨𝒂𝔅𝔞𝔸𝒜}𝐀𝐚𝑨𝒂𝔅𝔞𝔸𝒜
    -

    Symbols1

    -
    \maltese\degree\standardstate\pounds\$
    \text{\maltese\degree\pounds\textdollar}
    °£$✠°£$
    -

    Tag

    - - -
    \tag{+hi} \frac{x^2}{y}+x^{2^y}

    x2y+x2y(+hi)

    -

    Text

    -
    \frac{a}{b}\text{c~ {ab} \ e}+fgabc  ab  e+fgtext
    -

    TextSpace

    -
    \begin{array}{l}
    \texttt{12345678901234} \\
    \texttt{A test 1~~2 \ \ 3} \\
    \verb|A test 1 2 3|
    \end{array}
    𝟷𝟸𝟹𝟺𝟻𝟼𝟽𝟾𝟿𝟶𝟷𝟸𝟹𝟺𝙰 𝚝𝚎𝚜𝚝 𝟷  𝟸  𝟹A test 1  2  3TextSpace
    -

    TextStacked

    -
    \begin{matrix}
    \textsf{abc123 \textbf{abc123}
    \textit{abc123}}\\
    \text{abc123 \textbf{abc123}
    \textit{abc123}}\\
    \textrm{abc123 \textbf{abc123}
    \textit{abc123}}\\
    \textsf{\textrm{\textbf{abc123}}
    \textbf{abc123}
    \textit{abc123}}\\
    \textit{abc123 \textbf{abc123}
    \textsf{abc123}}\\
    \end{matrix}
    𝖺𝖻𝖼𝟣𝟤𝟥 𝗮𝗯𝗰𝟭𝟮𝟯 𝘢𝘣𝘤123abc123 𝐚𝐛𝐜𝟏𝟐𝟑 𝑎𝑏𝑐123abc123 𝐚𝐛𝐜𝟏𝟐𝟑 𝑎𝑏𝑐123𝐚𝐛𝐜𝟏𝟐𝟑 𝗮𝗯𝗰𝟭𝟮𝟯 𝘢𝘣𝘤123𝑎𝑏𝑐123 𝒂𝒃𝒄123 𝘢𝘣𝘤123TextStacked
    -

    TextWithMath

    -
    \begin{matrix}
    \text{for $a < b $ and $ c < d $}. \\
    \textsf{for $a < b $ and $ c < d $}. \\
    \textsf{for $a < b \textbf{ and } c < d $} \\
    \text{\sf for $a < b $ and $c < d $.}
    \end{matrix}
    for a<b and c<d.𝖿𝗈𝗋 𝖺<𝖻 𝖺𝗇𝖽 𝖼<𝖽.𝖿𝗈𝗋 𝖺<𝖻 𝗮𝗻𝗱 𝖼<𝖽𝖿𝗈𝗋 𝖺<𝖻 𝖺𝗇𝖽 𝖼<𝖽.TextWithMath
    -

    Unicode

    - - - - - -
    SourceTemml
    \text{ÀàÇçÉéÏïÖöÛû}AˋaˋÇçEˊeˊI¨ı¨O¨o¨Uˆuˆ
    \text{БГДЖЗЙЛФЦШЫЮЯ}БГДЖЗЙЛФЦШЫЮЯ
    \text{여보세요}여보세요
    \text{私はバナナです}私はバナナです
    -

    Units

    -
    \begin{array}{ll}
    \mathrm H\kern 1em\mathrm H
    \text{\tiny (1em)} &
    \mathrm H\kern 1ex\mathrm H
    \text{\tiny (1ex)} \\
    \mathrm H{\scriptstyle \kern 1em}\mathrm H
    \text{\tiny (ss 1em)} &
    \mathrm H{\scriptstyle \kern 1ex}\mathrm H
    \text{\tiny (ss 1ex)} \\
    \mathrm H{\small \kern 1em}\mathrm H
    \text{\tiny (sm 1em)} &
    \mathrm H{\small \kern 1ex}\mathrm H
    \text{\tiny (sm 1ex)} \\
    \mathrm H\mkern 18mu\mathrm H
    \text{\tiny (18mu)} &
    \mathrm H\kern 1cm\mathrm H
    \text{\tiny (1cm)} \\
    \mathrm H{\scriptstyle \mkern 18mu}\mathrm H
    \text{\tiny (ss 18mu)} &
    \mathrm H{\scriptstyle \kern 1cm}\mathrm H
    \text{\tiny (ss 1cm)} \\
    \mathrm H{\small \mkern 18mu}\mathrm H
    \text{\tiny (sm 18mu)} &
    \mathrm H{\small \kern 1cm}\mathrm H
    \text{\tiny (sm 1cm)}
    \end{array}
    HH(1em)HH(1ex)HH(ss 1em)HH(ss 1ex)HH(sm 1em)HH(sm 1ex)HH(18mu)HH(1cm)HH(ss 18mu)HH(ss 1cm)HH(sm 18mu)HH(sm 1cm)units
    -

    UnsupportedCmds

    -

    \err\fracerr32\suberr\superr\sqrterr

    -

    deliberately does not compile

    -

    Verb

    -
    \begin{array}{ll}
    \verb \verb , & \verb|\verb |, \\
    \verb* \verb* , & \verb|\verb |, \\
    \verb!<x> & </y>! & \scriptstyle\verb|ss verb| \\
    \verb*!<x> & </y>! & \small\verb|sm verb| \\
    \verb|``---''~|
    \end{array}
    \verb,\verb  ,\verb*,\verb*␣,<x> & </y>ss verb<x>␣&␣</y>sm verb``---''~verb
    - - diff --git a/site/tests/mhchem-tests.html b/site/tests/mhchem-tests.html deleted file mode 100644 index 9ca695ba..00000000 --- a/site/tests/mhchem-tests.html +++ /dev/null @@ -1,204 +0,0 @@ - - - - - - Temml mhchem Tests - - - - - - -

    mhchem

    -

    This file contains all the examples in the mhchem manual.
    Ref: https://mhchem.github.io/MathJax-mhchem/

    -

    Chemical Equations (ce)

    - - - - -
    SourceTemml
    \ce{CO2 + C -> 2 CO}CO2+C2CO
    \ce{Hg^2+ ->[I-] HgI2 ->[I-] [Hg^{II}I4]^2-}Hg2+IHgI2I[HgXIII4]2
    C_p[\ce{H2O(l)}] = \pu{75.3 J // mol K}Cp[H2O(l)]=75.3 JmolK
    -

    Chemical Formulae

    - - - -
    SourceTemml
    \ce{H2O}H2O
    \ce{Sb2O3}Sb2O3
    -

    Charges

    - - - - - - -
    SourceTemml
    \ce{H+}H+
    \ce{CrO4^2-}CrO42
    \ce{[AgCl2]-}[AgCl2]
    \ce{Y^99+}Y99+
    \ce{Y^{99+}}Y99+
    -

    Stoichiometric Numbers

    - - - - - - - -
    SourceTemml
    \ce{2 H2O}2H2O
    \ce{2H2O}2H2O
    \ce{0.5 H2O}0.5H2O
    \ce{1/2 H2O}12H2O
    \ce{(1/2) H2O}(1/2)H2O
    \ce{$n$ H2O}n H2O
    -

    Isotopes

    - - - - - -
    \ce{^{227}_{90}Th+}X90227X290902227227Th+
    \ce{^227_90Th+}X90227X290902227227Th+
    \ce{^{0}_{-1}n^{-}}X10X211200n
    \ce{^0_-1n-}X10X211200n
    \ce{H{}^3HO}HX3X2233HO
    \ce{H^3HO}HX3X2233HO
    -

    Reaction Arrows

    - - - - - - - - - - - -
    SourceTemml
    \ce{A -> B}AB
    \ce{A <- B}AB
    \ce{A <-> B}AB
    \ce{A <--> B}AB
    \ce{A <=> B}AB
    \ce{A <=>> B}AB
    \ce{A <<=> B}AB
    \ce{A ->[H2O] B}AH2OB
    \ce{A ->[{text above}][{text below}] B}Atext belowtext aboveB
    \ce{A ->[$x$][$x_i$] B}AxixB
    -

    Parentheses, Brackets, Braces

    - - - - -
    SourceTemml
    \ce{(NH4)2S}(NH4)2S
    \ce{[\{(X2)3\}2]^3+}[{(X2)3}2]3+
    \ce{CH4 + 2 $\left( \ce{O2 + 79/21 N2} \right)$}CH4+2 (O2+7921N2)
    -

    States of Aggregation

    - - - - -
    SourceTemml
    \ce{H2(aq)}H2(aq)
    \ce{CO3^2-_{(aq)}}CO32(aq)
    \ce{NaOH(aq,$\infty$)}NaOH(aq,)
    -

    Crystal Systems

    - - - -
    SourceTemml
    \ce{ZnS($c$)}ZnS( c)
    \ce{ZnS(\ca$c$)}ZnS(c)
    -

    Variables

    - - - - -
    Source Temml
    \ce{NO_x}NOx
    \ce{Fe^n+}Fen+
    \ce{x Na(NH4)HPO4 ->[\Delta]
    (NaPO3)_x + x NH3 ^ + x H2O}
    xNa(NH4)HPO4Δ(NaPO3)x+xNH3+xH2O
    -

    Greek Characters

    - - - - - -
    SourceTemml
    \ce{\mu-Cl}μ-Cl
    \ce{[Pt(\eta^2-C2H4)Cl3]-}[Pt(η2-C2H4)Cl3]
    \ce{\beta +}β+
    \ce{^40_18Ar + \gamma{} + \nu_e}X1840X2181824040Ar+γ+νe
    -

    (Italic) Math

    - - - - - -
    SourceTemml
    \ce{NaOH(aq,$\infty$)}NaOH(aq,)
    \ce{Fe(CN)_{$\frac{6}{2}$}}Fe(CN)62 
    \ce{X_{$i$}^{$x$}}Xix
    \ce{X_$i$^$x$}Xix
    -

    Italic Text

    - - - -
    SourceTemml
    \ce{$cis${-}[PtCl2(NH3)2]}cis-[PtCl2(NH3)2]
    \ce{CuS($hP12$)}CuS( hP12)
    -

    Upright Text, Escape Parsing

    - - - - -
    SourceTemml
    \ce{{Gluconic Acid} + H2O2}Gluconic Acid+H2O2
    \ce{X_{{red}}}Xred
    \ce{{(+)}_589{-}[Co(en)3]Cl3}(+)589-[Co(en)3]Cl3
    -

    Bonds

    - - - - - - - - - -
    SourceTemml
    \ce{C6H5-CHO}C6H5CHO
    \ce{A-B=C#D}AB=CD
    \ce{A\bond{-}B\bond{=}C\bond{#}D}AB=CD
    \ce{A\bond{1}B\bond{2}C\bond{3}D}AB=CD
    \ce{A\bond{~}B\bond{~-}C}ABC
    \ce{A\bond{~--}B\bond{~=}C\bond{-~-}D}ABCD
    \ce{A\bond{...}B\bond{....}C}ABC
    \ce{A\bond{->}B\bond{<-}C}ABC
    -

    Addition Compounds

    - - - - -
    SourceTemml
    \ce{KCr(SO4)2*12H2O}KCr(SO4)212H2O
    \ce{KCr(SO4)2.12H2O}KCr(SO4)212H2O
    \ce{KCr(SO4)2 * 12 H2O}KCr(SO4)212H2O
    -

    Oxidation States

    - - -
    SourceTemml
    \ce{Fe^{II}Fe^{III}2O4}FeXIIFeXIII2O4
    -

    Unpaired Electrons, Radical Dots

    - - - -
    SourceTemml
    \ce{OCO^{.-}}OCO
    \ce{NO^{(2.)-}}NO(2)
    -

    Kröger-Vink Notation

    - - - - - - -
    Source Temml
    \ce{Li^x_{Li,1-2x}Mg^._{Li,x}
    $V$'_{Li,x}Cl^x_{Cl}}
    LiXLi,12x×MgXLi,x VXLi,xClXCl×
    \ce{O''_{i,x}}OXi,x
    \ce{M^{..}_i}MXi
    \ce{$V$^{4'}_{Ti}}VXTi4
    \ce{V_{V,1}C_{C,0.8}$V$_{C,0.2}}VV,1CC,0.8 VC,0.2
    -

    Equation Operators

    - - - - - -
    SourceTemml
    \ce{A + B}A+B
    \ce{A - B}AB
    \ce{A = B}A=B
    \ce{A \pm B}A±B
    -

    Precipitate and Gas

    - - - -
    SourceTemml
    \ce{SO4^2- + Ba^2+ -> BaSO4 v}SO42+Ba2+BaSO4
    \ce{A v B (v) -> B ^ B (^)}A BB B
    -

    Other Symbols and Shortcuts

    - - - - - - - - -
    SourceTemml
    \ce{NO^*}NO*
    \ce{1s^2-N}1s2-N
    \ce{n-Pr}n-Pr
    \ce{iPr}iPr
    \ce{\ca Fe}Fe
    \ce{A, B, C; F}A,B,C;F
    \ce{{and others}}and others
    -

    Complex Examples

    - - - - - -
    Source Temml
    \ce{Zn^2+ <=>[+ 2OH-][+ 2H+]
    $\underset{\text{amphoteres Hydroxid}}
    {\ce{Zn(OH)2 v}}$ <=>[+ 2OH-][+ 2H+]
    $\underset{\text{Hydroxozikat}}
    {\ce{[Zn(OH)4]^2-}}$}
    Zn2++2H++2OH+2H++2OHZn(OH)2amphoteres Hydroxid+2H++2OH+2H++2OH[Zn(OH)4]2Hydroxozikat 
    \ce{$K = \frac{[\ce{Hg^2+}][\ce{Hg}]}
    {[\ce{Hg2^2+}]}$}
    K=[Hg2+][Hg][Hg22+]
    \ce{$K =
    \ce{\frac{[Hg^2+][Hg]}{[Hg2^2+]}}$}
    K=[Hg2+][Hg][Hg22+]
    \ce{Hg^2+ ->[I-]
    $\underset{\mathrm{red}}{\ce{HgI2}}$
    ->[I-] $\underset{\mathrm{red}}
    {\ce{[Hg^{II}I4]^2-}}$}
    Hg2+IHgI2redI[HgXIII4]2red
    -

    Physical Units

    - - - - - - - - - - - - - -
    SourceTemml
    \pu{123 kJ}123 kJ
    \pu{123 mm2}123 mm2
    \pu{123 J s}123 Js
    \pu{123 J*s}123 Js
    \pu{123 kJ/mol}123 kJ/mol
    \pu{123 kJ//mol}123 kJmol
    \pu{123 kJ mol-1}123 kJmol1
    \pu{123 kJ*mol-1}123 kJmol1
    \pu{1.2e3 kJ}1.2103 kJ
    \pu{1,2e3 kJ}1,2103 kJ
    \pu{1.2E3 kJ}1.2×103 kJ
    \pu{1,2E3 kJ}1,2×103 kJ
    - - diff --git a/site/tests/mozilla-tests.html b/site/tests/mozilla-tests.html deleted file mode 100644 index 1974f64e..00000000 --- a/site/tests/mozilla-tests.html +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - Temml Mozilla Tests - - - - - - -

    Mozilla Torture Test

    -

    This page reproduces the tests from
    https://www-archive.mozilla.org/projects/mathml/demo/texvsmml.xhtml and
    https://fred-wang.github.io/MathFonts/mozilla_mathml_test/

    -

    Images from LaTeX are also included for comparison.

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    SourceTemmlLaTeXComment
    1x^2y^2

    x2y2

    ex1TeXbook p128
    2_2F_3

    2F3

    ex2TeXbook p128
    3x+y^2\over k+1

    x+y2k+1

    ex3TeXbook p139
    4x+y^{2\over k+1}

    x+y2k+1

    ex4TeXbook p139
    5a\over{b/2}

    ab/2

    ex5TeXbook p139
    6a_0 + \cfrac{1}{a_1 +
    \cfrac{1}{a_2 +
    \cfrac{1}{a_3 +
    \cfrac{1}{a_4}}}}

    a0+1a1+1a2+1a3+1a4

    ex6TeXbook p142
    7a_0+{1\over a_1+{1\over
    a_2+{1\over a_3+
    {1\over a_4}}}}

    a0+1a1+1a2+1a3+1a4

    ex7TeXbook p142
    8n\choose {k / 2}

    (nk/2)

    ex8TeXbook p143
    9

    {p \choose 2} x^2 y^{p-2}

    -
    • {1\over{1-x}}
      {1\over{1-x^2}}

    (p2)x2yp211x11x2

    ex9TeXbook p143
    10\sum_{\scriptstyle 0 \le
    i \le m \atop \scriptstyle
    0 < j < n} P(i, j)

    0im0<j<nP(i,j)

    ex10TeXbook p145
    11x^{2y}

    x2y

    ex11TeXbook p128
    12\sum_{i=1}^p
    \sum_{j=1}^q
    \sum_{k=1}^r
    a_{ij}b_{jk}c_{ki}

    i=1pj=1qk=1raijbjkcki

    ex12TeXbook p145
    13\sqrt{1+\sqrt{1+\sqrt{1+
    \sqrt{1+\sqrt{1+\sqrt{1+
    \sqrt{1+x}}}}}}}

    1+1+1+1+1+1+1+x

    ex13TeXbook p145
    14\bigg(\frac{\partial^2}
    {\partial x^2} + \frac
    {\partial^2}{\partial y^2}
    \bigg){\big\lvert\varphi
    (x+iy)\big\rvert}^2

    (2x2+2y2)|φ(x+iy)|2

    ex14TeXbook p147
    152^{2^{2^x}}

    222x

    ex15TeXbook p128
    16\int_1^x {dt\over t}

    1xdtt

    ex16TeXbook p168
    17\int\!\!\!\int_D dx,dy

    Ddxdy

    ex17TeXbook p169
    18f(x) = \begin{cases}1/3 &
    \text{if }0 \le x \le 1;
    \\
    2/3 & \text{if }3\le x \le
    4;\\ 0 &\text{elsewhere.}
    \end{cases}

    f(x)={1/3if 0x1;2/3if 3x4;0elsewhere.

    ex18TeXbook p175
    19\overbrace{x +\cdots + x}
    ^{k \text{ times}}

    x++xk times

    ex19TeXbook p176
    20y_{x^2}

    yx2

    ex20TeXbook p128
    21\sum_{p\text{ prime}}
    f(p)=\int_{t>1} f(t)d\pi(t)

    p primef(p)=t>1f(t)dπ(t)

    ex21TeXbook p181
    22{\underbrace{\overbrace{
    \mathstrut a,\dots,a}^{k
    ,a\rq\text{s}},\overbrace{
    \mathstrut b,\dots,b}^{l,
    b\rq\text{s}}}_{k+l
    \text{ elements}}}

    {(a,,akas,(b,,blbsk+l elements}

    ex22TeXbook p181
    23\begin{pmatrix}
    \begin{pmatrix}a&b\\c&d
    \end{pmatrix} &
    \begin{pmatrix}e&f\\g&h
    \end{pmatrix} \\ 0 &
    \begin{pmatrix}i&j\\k&l
    \end{pmatrix}
    \end{pmatrix}

    ((abcd)(efgh)0(ijkl))

    ex23TeXbook p181
    24\det\begin{vmatrix}
    c_0&c_1&c_2&\dots& c_n\\
    c_1 & c_2 & c_3 & \dots &
    c_{n+1}\\ c_2 & c_3 & c_4
    &\dots & c_{n+2}\\ \vdots
    &\vdots&\vdots & &\vdots
    \\c_n & c_{n+1} & c_{n+2}
    &\dots&c_{2n}
    \end{vmatrix} > 0

    det|c0c1c2cnc1c2c3cn+1c2c3c4cn+2cncn+1cn+2c2n|>0

    ex24TeXbook p181
    25y_{x_2}

    yx2

    ex25TeXbook p128
    26x_{92}^{31415} + \pi

    x9231415+π

    ex26TeXbook p129
    27x_{y^a_b}^{z^c_d}

    xybazdc

    ex27TeXbook p129
    28y_3'''

    y3

    ex28TeXbook p130
    29\lim_{n\rightarrow+\infty}
    {\sqrt{2\pi n}\over n!}
    \genfrac (){}{}n{e}^n = 1

    limn+2πnn!(ne)n=1

    ex29

    30\det(A) = \sum_{\sigma
    \in S_n} \epsilon(\sigma)
    \prod_{i=1}^n
    a_{i, \sigma_i}

    det(A)=σSnϵ(σ)i=1nai,σi

    ex30

    - - diff --git a/site/tests/wiki-tests.html b/site/tests/wiki-tests.html deleted file mode 100644 index 7837d5dc..00000000 --- a/site/tests/wiki-tests.html +++ /dev/null @@ -1,590 +0,0 @@ - - - - - - Temml Wiki Tests - - - - - - -

    Wiki Test

    -

    Rows 1 thru 261 on this page reproduce the math examples from
    https://en.wikipedia.org/wiki/Help:Displaying_a_formula

    -

    A few of the functions on this page require Temml’s texvc extension.

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    SourceTemml
    1\alphaα
    2f(x) = x^2f(x)=x2
    3\{1,e,\pi\}{1,e,π}
    4|z + 1| \leq 2|z+1|2
    5\# \$ \% \wedge \& \_ \{ \} \sim
    \backslash
    #$%&_{}\
    Accents
    6\dot{a}, \ddot{a}, \acute{a}, \grave{a}a˙,a¨,aˊ,a`
    7\dot{a}, \ddot{a}, \acute{a}, \grave{a}a˙,a¨,aˊ,a`
    8\check{a}, \breve{a}, \tilde{a}, \bar{a}aˇ,a˘,a~,a
    9\hat{a}, \widehat{a}, \vec{a}a^,a^,a
    Functions
    10\exp_a b = a^b, \exp b = e^b, 10^mexpab=ab,expb=eb,10m
    11\ln c, \lg d = \log e, \log_{10} flnc,lgd=loge,log10f
    12\sin a, \cos b, \tan c, \cot d, \sec e,
    \csc f
    sina,cosb,tanc,cotd,sece,cscf
    13\arcsin h, \arccos i, \arctan jarcsinh,arccosi,arctanj
    14\sinh k, \cosh l, \tanh m, \coth nsinhk,coshl,tanhm,cothn
    15\operatorname{sh}k, \operatorname{ch}l,
    \operatorname{th}m, \operatorname{coth}n
    shk,chl,thm,cothn
    16\sgn r, \left\vert s \right\vertsgnr,|s|
    17\min(x,y), \max(x,y)min(x,y),max(x,y)
    Bounds
    18\min x, \max y, \inf s, \sup tminx,maxy,infs,supt
    19\lim u, \liminf v, \limsup wlimu,lim infv,lim supw
    20\dim p, \deg q, \det m, \ker\phidimp,degq,detm,kerϕ
    Projections
    21\Pr j, \hom l, \lVert z \rVert, \arg zPrj,homl,z,argz
    Differentials and derivatives
    22dt, \mathrm{d}t, \partial t, \nabla\psidt,dt,t,ψ
    23dy/dx, \mathrm{d}y/\mathrm{d}x,
    \frac{dy}{dx},
    \frac{\mathrm{d}y}{\mathrm{d}x},
    \frac{\partial^2}
    {\partial x_1\partial x_2}y
    dy/dx,dy/dx,dydx,dydx,2x1x2y
    24\prime, \backprime, f^\prime, f', f'',
    f^{(3)}, \dot y, \ddot y
    ,,f,f,f,f(3),y˙,y¨
    Letter-like symbols or constants
    25\infty, \aleph, \complement,\backepsilon,
    \eth, \Finv, \hbar
    ,,,,ð,,
    26\Im, \imath, \jmath, \Bbbk, \ell, \mho,
    \wp, \Re, \circledS, \S, \P, \AA
    ,ı,ȷ,𝕜,,,,,,§,,A˚
    Modular arithmetic
    27s_k \equiv 0 \pmod{m}sk0(modm)
    28a \bmod bamodb
    29\gcd(m, n), \operatorname{lcm}(m, n)gcd(m,n),lcm(m,n)
    30\mid, \nmid, \shortmid, \nshortmid|,,,
    Radicals
    31\surd, \sqrt{2}, \sqrt[n]{2},
    \sqrt[3]{\frac{x^3+y^3}{2}}
    |,2,2n,x3+y323
    Operators
    32+, -, \pm, \mp, \dotplus+,,±,,
    33\times, \div, \divideontimes, /,\backslash×,÷,,/,\
    34\cdot, * \ast, \star, \circ, \bullet,*,,,
    35\boxplus, \boxminus, \boxtimes, \boxdot,,,
    36\oplus, \ominus, \otimes, \oslash, \odot⊕︎,,,,
    37\circleddash, \circledcirc, \circledast,,
    38\bigoplus, \bigotimes, \bigodot,,
    Sets
    39{ }, \O \empty \emptyset, \varnothing{},Ø,
    40\in, \notin \not\in, \ni, \not\ni,∉,,∌
    41\cap, \Cap, \sqcap, \bigcap,,,
    42\cup, \Cup, \sqcup, \bigcup, \bigsqcup,
    \uplus, \biguplus
    ,,,,,,
    43\setminus, \smallsetminus, \times,,×
    44\subset, \Subset, \sqsubset,,
    45\supset, \Supset, \sqsupset,,
    46\subseteq, \nsubseteq, \subsetneq,
    \varsubsetneq, \sqsubseteq
    ,,,⊊︀,
    47\supseteq, \nsupseteq, \supsetneq,
    \varsupsetneq, \sqsupseteq
    ,,,,
    48\subseteqq, \nsubseteqq, \subsetneqq,
    \varsubsetneqq
    ,,,⫋︀
    49\supseteqq, \nsupseteqq, \supsetneqq,
    \varsupsetneqq
    ,,,⫌︀
    Relations
    50=, \ne, \neq, \equiv, \not\equiv=,,,,≢
    51\doteq, \doteqdot,
    \overset{\underset{\mathrm{def}}{}}{=}, :=
    ,,=def,:=
    52\sim, \nsim, \backsim, \thicksim, \simeq,
    \backsimeq, \eqsim, \cong, \ncong
    ,,,,,,,,
    53\approx, \thickapprox, \approxeq, \asymp,
    \propto, \varpropto
    ,,,,,
    54<, \nless, \ll, \not\ll, \lll, \not\lll,
    \lessdot
    <,,,≪̸,,⋘̸,
    55\le, \leq, \lneq, \leqq, \nleq, \nleqq,
    \lneqq, \lvertneqq
    ,,,,,,,≨︀
    56\ge, \geq, \gneq, \geqq, \ngeq, \ngeqq,
    \gneqq, \gvertneqq
    ,,,,,,,≩︀
    57\lessgtr, \lesseqgtr, \lesseqqgtr,
    \gtrless, \gtreqless, \gtreqqless
    ,,,,,
    58\leqslant, \nleqslant, \eqslantless,,
    59\geqslant, \ngeqslant, \eqslantgtr,,
    60\lesssim, \lnsim, \lessapprox, \lnapprox,,,
    61\gtrsim, \gnsim, \gtrapprox, \gnapprox,,,
    62\prec, \nprec, \preceq, \npreceq,\precneqq,,,,
    63\succ, \nsucc, \succeq, \nsucceq,\succneqq,,,,
    64\preccurlyeq, \curlyeqprec,
    65\succcurlyeq, \curlyeqsucc,
    66\precsim, \precnsim, \precapprox,
    \precnapprox
    ,,,
    67\succsim, \succnsim, \succapprox,
    \succnapprox
    ,,,
    Geometric
    68\parallel, \nparallel, \shortparallel,
    \nshortparallel
    ,,,
    69\perp, \angle, \sphericalangle,
    \measuredangle, 45^\circ
    ,,,,45
    70\Box, \square, \blacksquare, \diamond,
    \Diamond, \lozenge, \blacklozenge,\bigstar
    ,,,,,,,
    71\bigcirc, \triangle, \bigtriangleup,
    \bigtriangledown
    ,,,
    72\vartriangle, \triangledown,
    73\blacktriangle, \blacktriangledown,
    \blacktriangleleft, \blacktriangleright
    ,,,
    Logic
    74\forall, \exists, \nexists,,
    75\therefore, \because, \And,,&
    76\lor \vee, \curlyvee, \bigvee,,
    77\land \wedge, \curlywedge, \bigwedge,,
    78\bar{q}, \bar{abc}, \overline{q},
    \overline{abc},\\
    \lnot \neg, \not\operatorname{R},\bot,\top
    q,abc,q,abc,¬¬,̸R,,
    79\vdash \dashv, \vDash, \Vdash, \models,,,
    80\Vvdash \nvdash \nVdash \nvDash \nVDash
    81\ulcorner \urcorner \llcorner \lrcorner
    Arrows
    82\Rrightarrow, \Lleftarrow,
    83\Rightarrow, \nRightarrow,
    \Longrightarrow, \implies
    ,,,
    84\Leftarrow, \nLeftarrow, \Longleftarrow,,
    85\Leftrightarrow, \nLeftrightarrow,
    \Longleftrightarrow, \iff
    ,,,
    86\Uparrow, \Downarrow, \Updownarrow,,
    87\rightarrow \to, \nrightarrow,
    \longrightarrow
    ,,
    88\leftarrow \gets, \nleftarrow,
    \longleftarrow
    ,,
    89\leftrightarrow, \nleftrightarrow,
    \longleftrightarrow
    ,,
    90\uparrow, \downarrow, \updownarrow,,
    91\nearrow, \swarrow, \nwarrow, \searrow,,,
    92\mapsto, \longmapsto,
    93\rightharpoonup \rightharpoondown
    \leftharpoonup \leftharpoondown
    \upharpoonleft \upharpoonright
    \downharpoonleft \downharpoonright
    \rightleftharpoons \leftrightharpoons
    94\curvearrowleft \circlearrowleft \Lsh
    \upuparrows \rightrightarrows
    \rightleftarrows \rightarrowtail
    \looparrowright
    95\curvearrowright \circlearrowright \Rsh
    \downdownarrows \leftleftarrows
    \leftrightarrows \leftarrowtail
    \looparrowleft
    96\hookrightarrow \hookleftarrow \multimap
    \leftrightsquigarrow \rightsquigarrow
    \twoheadrightarrow \twoheadleftarrow
    Special
    97\amalg \P \S %\dagger\ddagger\ldots\cdots⨿§%
    98\smile \frown \wr \triangleleft
    \triangleright
    99\diamondsuit, \heartsuit, \clubsuit,
    \spadesuit, \Game, \flat, \natural, \sharp
    ,,,,,,,
    Unsorted
    100\diagup \diagdown \centerdot \ltimes
    \rtimes \leftthreetimes \rightthreetimes
    101\eqcirc \circeq \triangleq \bumpeq\Bumpeq
    \doteqdot \risingdotseq \fallingdotseq
    102\intercal \barwedge \veebar
    \doublebarwedge \between \pitchfork
    103\vartriangleleft \ntriangleleft
    \vartriangleright \ntriangleright
    104\trianglelefteq \ntrianglelefteq
    \trianglerighteq \ntrianglerighteq
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Larger expressions

    SourceTemml
    105a^2, a^{x+3}a2,ax+3
    106a_2a2
    10710^{30} a^{2+2}
    a_{i,j} b_{f'}
    1030a2+2ai,jbf
    108x_2^3
    {x_2}^3
    x23x23
    10910^{10^{8}}10108
    110\sideset{_1^2}{_3^4}\prod_a^b
    {}_1^2\!\Omega_3^4

    3412ab

    12Ω34

    111\overset{\alpha}{\omega}
    \underset{\alpha}{\omega}
    \overset{\alpha}{\underset{\gamma}{\omega}}
    \stackrel{\alpha}{\omega}
    ωαωαωγαωα
    112x', y'', f', f''
    x^\prime, y^{\prime\prime}
    x,y,f,fx,y
    113\dot{x}, \ddot{x}x˙,x¨
    114\hat a \ \bar b \ \vec c
    \overrightarrow{a b} \ \overleftarrow{c d}
    \widehat{d e f}
    \overline{g h i} \ \underline{j k l}
    a^ b cab cddef^ghi jkl
    115\overset{\frown} {AB}A
    116A \xleftarrow{n+\mu-1} B
    \xrightarrow[T]{n\pm i-1} C
    An+μ1BTn±i1C
    117\overbrace{ 1+2+\cdots+100 }^{5050}1+2++1005050
    118\underbrace{ a+b+\cdots+z }_{26}a+b++z26
    119\sum_{k=1}^N k^2

    k=1Nk2

    120\textstyle \sum_{k=1}^N k^2

    k=1Nk2

    121\frac{\sum_{k=1}^N k^2}{a}

    k=1Nk2a

    122\frac{\sum\limits^{^N}_{k=1} k^2}{a}

    k=1Nk2a

    123\prod_{i=1}^N x_i

    i=1Nxi

    124\textstyle \prod_{i=1}^N x_i

    i=1Nxi

    125\coprod_{i=1}^N x_i

    i=1Nxi

    126\textstyle \coprod_{i=1}^N x_i

    i=1Nxi

    127\lim_{n \to \infty}x_n

    limnxn

    128\textstyle \lim_{n \to \infty}x_n

    limnxn

    129\int\limits_{1}^{3}\frac{e^3/x}{x^2}\, dx

    13e3/xx2dx

    130\int_{1}^{3}\frac{e^3/x}{x^2}\, dx

    13e3/xx2dx

    131\textstyle \int\limits_{-N}^{N} e^x dx

    NNexdx

    132\textstyle \int_{-N}^{N} e^x dx

    NNexdx

    133\iint\limits_D dx\,dy

    Ddxdy

    134\iiint\limits_E dx\,dy\,dz

    Edxdydz

    135\iiiint\limits_F dx\,dy\,dz\,dt

    Fdxdydzdt

    136\int_{(x,y)\in C} x^3\, dx + 4y^2\, dy

    (x,y)Cx3dx+4y2dy

    137\oint_{(x,y)\in C} x^3\, dx + 4y^2\, dy

    (x,y)Cx3dx+4y2dy

    138\bigcap_{i=1}^n E_i

    i=1nEi

    139\bigcup_{i=1}^n E_i

    i=1nEi

    Fractions, matrices, multiline
    140\frac{2}{4}=0.5 or {2 \over 4}=0.524=0.5 or 24=0.5
    141\tfrac{2}{4} = 0.5

    24=0.5

    142\dfrac{2}{4} = 0.5 \qquad \dfrac{2}{c +
    \dfrac{2}{d + \dfrac{2}{4}}} = a
    24=0.52c+2d+24=a
    143\cfrac{2}{c +\cfrac{2}{d +\cfrac{2}{4}}} = a

    2c+2d+24=a

    144\cfrac{x}{1 + \cfrac{\cancel{y}}
    {\cancel{y}}} = \cfrac{x}{2}
    x1+yy=x2
    145\binom{n}{k}(nk)
    146\tbinom{n}{k}

    (nk)

    147\dbinom{n}{k}(nk)
    148\begin{matrix}
    x & y \\
    z & v
    \end{matrix}
    xyzv
    149\begin{vmatrix}
    x & y \\
    z & v
    \end{vmatrix}
    |xyzv|
    150\begin{Vmatrix}
    x & y \\
    z & v
    \end{Vmatrix}
    xyzv
    151\begin{bmatrix}
    0 & \cdots & 0 \\
    \vdots & \ddots & \vdots \\
    0 & \cdots & 0
    \end{bmatrix}
    [0000]
    152\begin{Bmatrix}
    x & y \\
    z & v
    \end{Bmatrix}
    {xyzv}
    153\begin{pmatrix}
    x & y \\
    z & v
    \end{pmatrix}
    (xyzv)
    154\bigl( \begin{smallmatrix}
    a&b\\ c&d
    \end{smallmatrix} \bigr)
    (abcd)
    155f(n) = \begin{cases}
    n/2, & \text{if }n\text{ is even} \\
    3n+1, & \text{if }n\text{ is odd} \end{cases}
    f(n)={n/2,if n is even3n+1,if n is odd
    156\begin{cases}
    3x + 5y + z \\
    7x - 2y + 4z \\
    -6x + 3y + 2z \end{cases}
    {3x+5y+z7x2y+4z6x+3y+2z
    157\begin{align}
    f(x) & = (a+b)^2 \\
    & = a^2+2ab+b^2 \\
    \end{align}

    f(x)=(a+b)2=a2+2ab+b2

    158\begin{alignat}{2}
    f(x) & = (a+b)^2 \\
    & = a^2+2ab+b^2 \\
    \end{alignat}

    f(x)=(a+b)2=a2+2ab+b2

    159\begin{align}
    f(a,b) & = (a+b)^2 && = (a+b)(a+b) \\
    & = a^2+ab+ba+b^2 && = a^2+2ab+b^2 \\
    \end{align}

    f(a,b)=(a+b)2=(a+b)(a+b)=a2+ab+ba+b2=a2+2ab+b2

    159\begin{alignat}{3}
    f(a,b) & = (a+b)^2 && = (a+b)(a+b) \\
    & = a^2+ab+ba+b^2 && = a^2+2ab+b^2 \\
    \end{alignat}

    f(a,b)=(a+b)2=(a+b)(a+b)=a2+ab+ba+b2=a2+2ab+b2

    160\begin{array}{lcl}
    z & = & a \\
    f(x,y,z) & = & x + y + z \end{array}

    z=af(x,y,z)=x+y+z

    161\begin{array}{lcr}
    z & = & a \\
    f(x,y,z) & = & x + y + z \end{array}

    z=af(x,y,z)=x+y+z

    162\begin{alignat}{4}
    F:\; && C(X) && \;\to\; & C(X) \\
    && g && \;\mapsto\; & g^2 \end{alignat}

    F:C(X)C(X)gg2

    163\begin{alignat}{4}
    F:\; && C(X) && \;\to\; && C(X) \\
    && g && \;\mapsto\; && g^2 \end{alignat}

    F:C(X)C(X)gg2

    164f(x) \,\! =\sum_{n=0}^\infty a_n x^n
    = a_0+a_1x+a_2x^2+\cdots
    f(x) =n=0anxn =a0+a1x+a2x2+
    165\begin{array}{|c|c|c|}
    a & b & S \\
    \hline
    0 & 0 & 1 \\
    0 & 1 & 1 \\
    1 & 0 & 1 \\
    1 & 1 & 0 \\
    \end{array}
    abS001011101110
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Delimiters
    166( \frac{1}{2} )^n(12)n
    167\left ( \frac{1}{2} \right )^n(12)n
    168\left ( \frac{a}{b} \right )(ab)
    169\left [ \frac{a}{b} \right ] \quad
    \left \lbrack \frac{a}{b} \right \rbrack
    [ab][ab]
    170\left { \frac{a}{b} \right } \quad
    \left \lbrace \frac{a}{b} \right \rbrace
    {ab}{ab}
    171\left \langle \frac{a}{b} \right \rangleab
    172\left | \frac{a}{b} \right \vert \quad
    \left \Vert \frac{c}{d} \right |
    |ab|cd
    173\left \lfloor \frac{a}{b} \right \rfloor
    \quad \left \lceil \frac{c}{d} \right \rceil
    abcd
    174\left / \frac{a}{b} \right \backslashab
    175\left\uparrow\frac{a}{b}\right\downarrow\;
    \left\Uparrow\frac{a}{b}\right\Downarrow\;
    \left \updownarrow \frac{a}{b} \right
    \Updownarrow
    ababab
    176\left [ 0,1 \right )
    \left \langle \psi \right |
    [0,1)ψ|
    177\left . \frac{A}{B} \right } \to XAB}X
    178( \bigl( \Bigl( \biggl( \Biggl( \dots
    \Biggr] \biggr] \Bigr] \bigr] ]
    (((((]]]]]
    179{ \bigl{ \Bigl{ \biggl{ \Biggl{ \dots
    \Biggr\rangle \biggr\rangle \Bigr\rangle
    \bigr\rangle \rangle
    {{{{{
    180| \big| \Big| \bigg| \Bigg| \dots
    \Bigg| \bigg| \Big| \big| |
    |||||
    181\lfloor \bigl\lfloor \Bigl\lfloor
    \biggl\lfloor \Biggl\lfloor \dots
    \Biggr\rceil \biggr\rceil \Bigr\rceil
    \bigr\rceil \rceil
    182\uparrow \big\uparrow \Big\uparrow
    \bigg\uparrow \Bigg\uparrow \dots
    \Bigg\Downarrow \bigg\Downarrow
    \Big\Downarrow \big\Downarrow \Downarrow
    183\updownarrow\big\updownarrow\Big\updownarrow
    \bigg\updownarrow \Bigg\updownarrow \dots
    \Bigg\Updownarrow \bigg\Updownarrow \Big
    \Updownarrow \big\Updownarrow \Updownarrow
    184/ \big/ \Big/ \bigg/ \Bigg/ \dots
    \Bigg\backslash \bigg\backslash \Big
    \backslash \big\backslash \backslash
    /\
    Greek Alphabet
    185\Alpha \Beta \Gamma \Delta \Epsilon \Zeta
    \Eta \Theta
    ΑΒΓΔΕΖΗΘ
    186\Iota \Kappa \Lambda \Mu \Nu \Xi \Omicron \PiΙΚΛΜΝΞΟΠ
    187\Rho \Sigma \Tau \Upsilon \Phi \Chi \Psi
    \Omega
    ΡΣΤΥΦΧΨΩ
    188\alpha \beta \gamma \delta \epsilon \zeta
    \eta \theta
    αβγδϵζηθ
    189\iota \kappa \lambda \mu \nu \xi \omicron \piικλμνξοπ
    190\rho \sigma \tau \upsilon \phi \chi \psi
    \omega
    ρστυϕχψω
    191\varGamma \varDelta \varTheta \varLambda
    \varXi \varPi \varSigma \varPhi \varUpsilon
    \varOmega
    𝛤𝛥𝛩𝛬𝛯𝛱𝛴𝛷𝛶𝛺
    192\varepsilon \digamma \varkappa \varpi
    \varrho \varsigma \vartheta \varphi
    εϝϰϖϱςϑφ
    Hebrew symbols
    193\aleph \beth \gimel \daleth
    Blackboard bold
    194\mathbb{ABCDEFGHI}
    \mathbb{JKLMNOPQR}
    \mathbb{STUVWXYZ}
    𝔸𝔹𝔻𝔼𝔽𝔾𝕀𝕁𝕂𝕃𝕄𝕆𝕊𝕋𝕌𝕍𝕎𝕏𝕐
    Boldface
    195\mathbf{ABCDEFGHI}
    \mathbf{JKLMNOPQR}
    \mathbf{STUVWXYZ}
    \mathbf{abcdefghijklm}
    \mathbf{nopqrstuvwxyz}
    \mathbf{0123456789}
    𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙𝐚𝐛𝐜𝐝𝐞𝐟𝐠𝐡𝐢𝐣𝐤𝐥𝐦𝐧𝐨𝐩𝐪𝐫𝐬𝐭𝐮𝐯𝐰𝐱𝐲𝐳𝟎𝟏𝟐𝟑𝟒𝟓𝟔𝟕𝟖𝟗
    Boldface Greek
    196\boldsymbol{\Alpha \Beta \Gamma \Delta
    \Epsilon \Zeta \Eta \Theta}
    𝚨𝚩𝚪𝚫𝚬𝚭𝚮𝚯
    197\boldsymbol{\Iota \Kappa \Lambda \Mu \Nu \Xi
    \Omicron \Pi}
    𝚰𝚱𝚲𝚳𝚴𝚵𝚶𝚷
    198\boldsymbol{\Rho \Sigma \Tau \Upsilon \Phi
    \Chi \Psi \Omega}
    𝚸𝚺𝚻𝚼𝚽𝚾𝚿𝛀
    199\boldsymbol{\alpha \beta \gamma \delta
    \epsilon \zeta \eta \theta}
    𝜶𝜷𝜸𝜹𝝐𝜻𝜼𝜽
    200\boldsymbol{\iota \kappa \lambda \mu \nu \xi
    \omicron \pi}
    𝜾𝜿𝝀𝝁𝝂𝝃𝝄𝝅
    201\boldsymbol{\rho \sigma \tau \upsilon \phi
    \chi \psi \omega}
    𝝆𝝈𝝉𝝊𝝓𝝌𝝍𝝎
    202\boldsymbol{\varepsilon\digamma\varkappa
    \varpi}
    𝜺ϝ𝝒𝝕
    203\boldsymbol{\varrho\varsigma\vartheta\varphi}𝝔𝝇𝝑𝝋
    Italics
    204\mathit{0123456789}0123456789
    Greek Italics
    205\mathit{\Alpha \Beta \Gamma \Delta \Epsilon
    \Zeta \Eta \Theta}
    ΑΒΓΔΕΖΗΘ
    206\mathit{\Iota \Kappa \Lambda \Mu \Nu \Xi
    \Omicron \Pi}
    ΙΚΛΜΝΞΟΠ
    207\mathit{\Rho \Sigma \Tau \Upsilon \Phi \Chi
    \Psi \Omega}
    ΡΣΤΥΦΧΨΩ
    Greek uppercase boldface italics
    208\boldsymbol{\varGamma \varDelta \varTheta
    \varLambda}
    𝜞𝜟𝜣𝜦
    209\boldsymbol{\varXi \varPi \varSigma
    \varUpsilon \varOmega}
    𝜩𝜫𝜮𝜰𝜴
    Roman typeface
    210\mathrm{ABCDEFGHI}
    \mathrm{JKLMNOPQR}
    \mathrm{STUVWXYZ}
    \mathrm{abcdefghijklm}
    \mathrm{nopqrstuvwxyz}
    \mathrm{0123456789}
    ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
    Sans serif
    211\mathsf{ABCDEFGHI}
    \mathsf{JKLMNOPQR}
    \mathsf{STUVWXYZ}
    \mathsf{abcdefghijklm}
    \mathsf{nopqrstuvwxyz}
    \mathsf{0123456789}
    𝖠𝖡𝖢𝖣𝖤𝖥𝖦𝖧𝖨𝖩𝖪𝖫𝖬𝖭𝖮𝖯𝖰𝖱𝖲𝖳𝖴𝖵𝖶𝖷𝖸𝖹𝖺𝖻𝖼𝖽𝖾𝖿𝗀𝗁𝗂𝗃𝗄𝗅𝗆𝗇𝗈𝗉𝗊𝗋𝗌𝗍𝗎𝗏𝗐𝗑𝗒𝗓𝟢𝟣𝟤𝟥𝟦𝟧𝟨𝟩𝟪𝟫
    Sans serif Greek
    212\mathsf{\Alpha \Beta \Gamma \Delta \Epsilon
    \Zeta \Eta \Theta}
    𝝖𝝗𝝘𝝙𝝚𝝛𝝜𝝝
    213\mathsf{\Iota \Kappa \Lambda \Mu \Nu \Xi
    \Omicron \Pi}
    𝝞𝝟𝝠𝝡𝝢𝝣𝝤𝝥
    214\mathsf{\Rho \Sigma \Tau \Upsilon \Phi \Chi
    \Psi \Omega}
    𝝦𝝨𝝩𝝪𝝫𝝬𝝭𝝮
    -

    Unicode has special code points for bold Greek sans-serif, but no code points for
    regular-weight Greek sans-serif. I know of no servable math font that has glyphs
    for regular-weight Greek sans-serif. Consequently, these bold Greek sans-serif
    glyphs are the best approximation I can make to sans-serif Greek.

    -
    - - - - - - - - - - - - - - - - - - -
    Calligraphy
    215\mathcal{ABCDEFGHI}
    \mathcal{JKLMNOPQR}
    \mathcal{STUVWXYZ}
    \mathcal{abcdefghi}
    \mathcal{jklmnopqr}
    \mathcal{stuvwxyz}
    𝒜𝒞𝒟𝒢𝒥𝒦𝒩𝒪𝒫𝒬𝒮𝒯𝒰𝒱𝒲𝒳𝒴𝒵𝒶𝒷𝒸𝒹𝒻𝒽𝒾𝒿𝓀𝓁𝓂𝓃𝓅𝓆𝓇𝓈𝓉𝓊𝓋𝓌𝓍𝓎𝓏
    Fraktur
    216\mathfrak{ABCDEFGHI}
    \mathfrak{JKLMNOPQR}
    \mathfrak{STUVWXYZ}
    \mathfrak{abcdefghi}
    \mathfrak{jklmnopqr}
    \mathfrak{stuvwxyz}
    𝔄𝔅𝔇𝔈𝔉𝔊𝔍𝔎𝔏𝔐𝔑𝔒𝔓𝔔𝔖𝔗𝔘𝔙𝔚𝔛𝔜𝔞𝔟𝔠𝔡𝔢𝔣𝔤𝔥𝔦𝔧𝔨𝔩𝔪𝔫𝔬𝔭𝔮𝔯𝔰𝔱𝔲𝔳𝔴𝔵𝔶𝔷
    Scriptstyle text
    217{\scriptstyle\text{abcdefghijklm}}abcdefghijklm
    Mixed text faces
    218x y zxyz
    219\text{x y z}x y z
    220\text{if} n \text{is even}ifnis even
    221\text{if }n\text{ is even}if n is even
    222\text{if}~n\ \text{is even}if n is even
    Color
    223{\color{Blue}x^2}+{\color{Orange}2x}-
    {\color{LimeGreen}1}
    x2+2x1
    224x_{1,2}=\frac{{\color{Blue}-b}\pm
    \sqrt{\color{Red}b^2-4ac}}{\color{Green}2a }
    x1,2=b±b24ac2a
    225{\color{Blue}x^2}+{\color{Orange}2x}-
    {\color{LimeGreen}1}
    x2+2x1
    226\color{Blue}x^2\color{Black}+\color{Orange}
    2x\color{Black}-\color{LimeGreen}1
    x2+2x1
    227\color{Blue}{x^2}+\color{Orange}{2x}-
    \color{LimeGreen}{1}
    x2+2x1
    228\definecolor{myorange}{rgb}{1,0.65,0.4}
    \color{myorange}e^{i \pi}\color{Black} + 1= 0
    eiπ+1=0
    -

    For color names, see the color section in the Temml function support page.

    -
    - - - - - - - - - - - - - - -
    Spacing
    229a \qquad b
    a \quad b
    a\ b
    a \text{ } b
    a\;b
    a\,b
    ab
    a b
    \mathit{ab}
    a\!b
    ababa ba babababababab
    230| \uparrow \rangle|
    231\left| \uparrow \right\rangle|
    232| {\uparrow} \rangle|
    233| \mathord\uparrow \rangle|
    Temml replacements for wiki workarounds
    234\oiint\limits_D dx\,dy
    \oiiint\limits_E dx\,dy\,dz

    Ddxdy

    Edxdydz

    234\wideparen{AB}AB
    235\dddot{x}x
    236\operatorname*{median}_
    {j\,\ne\,i} X_{i,j}

    medianjiXi,j

    237\sout{q}q
    238\mathrlap{\,/}{=}/=
    239\text{\textsf{textual description}}𝗍𝖾𝗑𝗍𝗎𝖺𝗅 𝖽𝖾𝗌𝖼𝗋𝗂𝗉𝗍𝗂𝗈𝗇
    240α παπ
    -

    mhchem examples are displayed on their own test page.

    -
    - - - - - - - - - - - - - - - - - - - - -
    Examples of implemented TeX formulas
    241ax^2 + bx + c = 0ax2+bx+c=0
    242x=\frac{-b\pm\sqrt{b^2-4ac}}{2a}x=b±b24ac2a
    243\left( \frac{\left(3-x\right)
    \times 2}{3-x} \right)
    ((3x)×23x)
    244S_{\text{new}} = S_{\text{old}} -
    \frac{ \left( 5-T \right) ^2} {2}

    Snew=Sold(5T)22

    245\int_a^x \int_a^s f(y)\,dy\,ds =
    \int_a^x f(y)(x-y)\,dy

    axasf(y)dyds=axf(y)(xy)dy

    246\int_e^{\infty}\frac {1}{t(\ln t)^2}dt =
    \left. \frac{-1}{\ln t}\right\vert_e^\infty
    = 1

    e1t(lnt)2dt=1lnt|e=1

    247\det(\mathsf{A}-\lambda\mathsf{I}) = 0det(𝖠λ𝖨)=0
    248\sum_{i=0}^{n-1} i

    i=0n1i

    249\sum_{m=1}^\infty\sum_{n=1}^\infty
    \frac{m^2 n}{3^m\left(m 3^n + n 3^m\right)}

    m=1n=1m2n3m(m3n+n3m)

    250u'' + p(x)u' + q(x)u=f(x),\quad x>au+p(x)u+q(x)u=f(x),x>a
    251|\bar{z}| = |z|, |(\bar{z})^n| = |z|^n,
    \arg(z^n) = n \arg(z)
    |z|=|z|,|(z)n|=|z|n,arg(zn)=narg(z)
    252\lim_{z\to z_0} f(z)=f(z_0)

    limzz0f(z)=f(z0)

    253\phi_n(\kappa) =
    \frac{1}{4\pi^2\kappa^2} \int_0^\infty
    \frac{\sin(\kappa R)}{\kappa R}
    \frac{\partial}{\partial R}
    \left [ R^2\frac{\partial D_n(R)}
    {\partial R} \right ] \,dR

    ϕn(κ)=14π2κ20sin(κR)κRR[R2Dn(R)R]dR

    254\phi_n(\kappa) = 0.033C_n^2\kappa^{-11/3},
    \quad\frac{1}{L_0}\ll\kappa\ll\frac{1}{l_0}
    ϕn(κ)=0.033Cn2κ11/3,1L0κ1l0
    255f(x) = \begin{cases}
    1 & -1 \le x < 0 \\
    \frac{1}{2} & x = 0 \\
    1 - x^2 & \text{otherwise}
    \end{cases}
    f(x)={11x<012x=01x2otherwise
    256{}_pF_q(a_1,\dots,a_p;c_1,\dots,c_q;z)
    = \sum_{n=0}^\infty
    \frac{(a1)_n\cdots(ap)_n}
    {(c_1)_n\cdots(c_q)_n}\frac{z^n}{n!}
    pFq(a1,,ap;c1,,cq;z)=n=0(a1)n(ap)n(c1)n(cq)nznn!
    258\frac{a}{b}\ \tfrac{a}{b}

    ab ab

    259S=dD\sin\alphaS=dDsinα
    260V = \frac{1}{6} \pi h \left [ 3 \left
    ( r1^2 + r2^2 \right ) + h^2 \right ]
    V=16πh[3(r12+r22)+h2]
    261\begin{align}
    u & = \tfrac{1}{\sqrt{2}}(x+y) \qquad &
    x &= \tfrac{1}{\sqrt{2}}(u+v) \\[0.6ex]
    v & = \tfrac{1}{\sqrt{2}}(x-y) \qquad &
    y &= \tfrac{1}{\sqrt{2}}(u-v)
    \end{align}

    u=12(x+y)x=12(u+v)v=12(xy)y=12(uv)

    -

    That concludes the tests from Wikipedia. Now a few more tests.

    -
    - - - -
    Linear Logic
    262A \with B \parr CA&BC
    263a \coh \oc b \incoh \wn c \scoh d \sincoh ea!b?cde
    264a \Perp \shpos b \multimapinv \shneg cabc
    - -
    Nested font size
    265\mathrm{f{\large f{\normalsize f{\tiny f}}}}ffff
    -

    The next line tests the length of an extensible arrow. Since Firefox does not
    support the minsize attribute, Temml has a workaround. The middle arrow
    should be as long at the bar between C & D.

    -
    266A \rightarrow B \xrightarrow{i} C
    \rule[0.3em]{1.75em}{0.05em} D
    ABiCD
    -

    The next line tests the fix for Temml issue #21. Firefox would ordinarily omit
    the dot on the i below. It's fixed by a Temml CSS rule, so it renders properly.

    -
    267\widetilde{U_i}Ui~
    -
    - - diff --git a/site/xml-formatter.js b/site/xml-formatter.js deleted file mode 100644 index c06fbf84..00000000 --- a/site/xml-formatter.js +++ /dev/null @@ -1,432 +0,0 @@ -require=(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i true); - - function nextChild() { - return tag() || content() || comment() || cdata(); - } - - function nextRootChild() { - match(/\s*/); - return tag(true) || comment() || doctype() || processingInstruction(false); - } - - function document() { - const decl = declaration(); - const children = []; - let documentRootNode; - let child = nextRootChild(); - - while (child) { - if (child.node.type === 'Element') { - if (documentRootNode) { - throw new Error('Found multiple root nodes'); - } - documentRootNode = child.node; - } - - if (!child.excluded) { - children.push(child.node); - } - - child = nextRootChild(); - } - - if (!documentRootNode) { - throw new Error('Failed to parse XML'); - } - - return { - declaration: decl ? decl.node : null, - root: documentRootNode, - children - }; - } - - function declaration() { - return processingInstruction(true); - } - - function processingInstruction(matchDeclaration) { - const m = matchDeclaration ? match(/^<\?(xml)\s*/) : match(/^<\?([\w-:.]+)\s*/); - if (!m) return; - - // tag - const node = { - name: m[1], - type: 'ProcessingInstruction', - attributes: {} - }; - - // attributes - while (!(eos() || is('?>'))) { - const attr = attribute(); - if (!attr) return node; - node.attributes[attr.name] = attr.value; - } - - match(/\?>/); - - return { - excluded: matchDeclaration ? false : options.filter(node) === false, - node - }; - } - - function tag(matchRoot) { - const m = match(/^<([\w-:.]+)\s*/); - if (!m) return; - - // name - const node = { - type: 'Element', - name: m[1], - attributes: {}, - children: [] - }; - - // attributes - while (!(eos() || is('>') || is('?>') || is('/>'))) { - const attr = attribute(); - if (!attr) return node; - node.attributes[attr.name] = attr.value; - } - - const excluded = matchRoot ? false : options.filter(node) === false; - - // self closing tag - if (match(/^\s*\/>/)) { - node.children = null; - return { - excluded, - node - }; - } - - match(/\??>/); - - if (!excluded) { - // children - let child = nextChild(); - while (child) { - if (!child.excluded) { - node.children.push(child.node); - } - child = nextChild(); - } - } - - // closing - match(/^<\/[\w-:.]+>/); - - return { - excluded, - node - }; - } - - function doctype() { - const m = match(/^]*>/); - if (m) { - const node = { - type: 'DocumentType', - content: m[0] - }; - return { - excluded: options.filter(node) === false, - node - }; - } - } - - function cdata() { - if (xml.startsWith(''); - if (endPositionStart > -1) { - const endPositionFinish = endPositionStart + 3; - const node = { - type: 'CDATA', - content: xml.substring(0, endPositionFinish) - }; - xml = xml.slice(endPositionFinish); - return { - excluded: options.filter(node) === false, - node - }; - } - } - } - - function comment() { - const m = match(/^/); - if (m) { - const node = { - type: 'Comment', - content: m[0] - }; - return { - excluded: options.filter(node) === false, - node - }; - } - } - - function content() { - const m = match(/^([^<]+)/); - if (m) { - const node = { - type: 'Text', - content: m[1] - }; - return { - excluded: options.filter(node) === false, - node - }; - } - } - - function attribute() { - const m = match(/([\w:-]+)\s*=\s*("[^"]*"|'[^']*'|\w+)\s*/); - if (!m) return; - return {name: m[1], value: strip(m[2])} - } - - /** - * Strip quotes from `val`. - */ - function strip(val) { - return val.replace(/^['"]|['"]$/g, ''); - } - - /** - * Match `re` and advance the string. - */ - function match(re) { - const m = xml.match(re); - if (!m) return; - xml = xml.slice(m[0].length); - return m; - } - - /** - * End-of-source. - */ - function eos() { - return 0 === xml.length; - } - - /** - * Check for `prefix`. - */ - function is(prefix) { - return 0 === xml.indexOf(prefix); - } - - xml = xml.trim(); - - return document(); -} - -module.exports = parse; - -},{}],"xml-formatter":[function(require,module,exports){ -/** - * @typedef {Object} XMLFormatterOptions - * @property {String} [indentation=' '] The value used for indentation - * @property {function(node): boolean} [filter] Return false to exclude the node. - * @property {Boolean} [collapseContent=false] True to keep content in the same line as the element. Only works if element contains at least one text node - * @property {String} [lineSeparator='\r\n'] The line separator to use - * @property {String} [whiteSpaceAtEndOfSelfclosingTag=false] to either end ad self closing tag with `` or `` - */ - -/** - * @typedef {Object} XMLFormatterState - * @param {String} content - * @param {Number} level - * @param {XMLFormatterOptions} options - */ - -/** - * @param {XMLFormatterState} state - * @return {void} - */ -function newLine(state) { - if (!state.options.indentation && !state.options.lineSeparator) return; - state.content += state.options.lineSeparator; - let i; - for (i = 0; i < state.level; i++) { - state.content += state.options.indentation; - } -} - -/** - * @param {XMLFormatterState} state - * @param {String} content - * @return {void} - */ -function appendContent(state, content) { - state.content += content; -} - -/** - * @param {Object} node - * @param {XMLFormatterState} state - * @param {Boolean} preserveSpace - * @return {void} - */ -function processNode(node, state, preserveSpace) { - if (typeof node.content === 'string') { - processContentNode(node, state, preserveSpace); - } else if (node.type === 'Element') { - processElementNode(node, state, preserveSpace); - } else if (node.type === 'ProcessingInstruction') { - processProcessingIntruction(node, state, preserveSpace); - } else { - throw new Error('Unknown node type: ' + node.type); - } -} - -/** - * @param {Object} node - * @param {XMLFormatterState} state - * @param {Boolean} preserveSpace - * @return {void} - */ -function processContentNode(node, state, preserveSpace) { - if (!preserveSpace) { - node.content = node.content.trim(); - } - if (node.content.length > 0) { - if (!preserveSpace && state.content.length > 0) { - newLine(state); - } - appendContent(state, node.content); - } -} - -/** - * @param {Object} node - * @param {XMLFormatterState} state - * @param {Boolean} preserveSpace - * @return {void} - */ -function processElementNode(node, state, preserveSpace) { - if (!preserveSpace && state.content.length > 0) { - newLine(state); - } - - appendContent(state, '<' + node.name); - processAttributes(state, node.attributes); - - if (node.children === null) { - const selfClosingNodeClosingTag = state.options.whiteSpaceAtEndOfSelfclosingTag ? ' />' : '/>' - // self-closing node - appendContent(state, selfClosingNodeClosingTag); - } else if (node.children.length === 0) { - // empty node - appendContent(state, '>'); - } else { - - appendContent(state, '>'); - - state.level++; - - let nodePreserveSpace = node.attributes['xml:space'] === 'preserve'; - - if (!nodePreserveSpace && state.options.collapseContent) { - - const containsTextNodes = node.children.some(function(child) { - return child.type === 'Text' && child.content.trim() !== ''; - }); - - if (containsTextNodes) { - nodePreserveSpace = true; - } - } - - node.children.forEach(function(child) { - processNode(child, state, preserveSpace || nodePreserveSpace, state.options); - }); - - state.level--; - - if (!preserveSpace && !nodePreserveSpace) { - newLine(state); - } - appendContent(state, ''); - } -} - -/** - * @param {XMLFormatterState} state - * @param {Record} attributes - * @return {void} - */ -function processAttributes(state, attributes) { - Object.keys(attributes).forEach(function(attr) { - const escaped = attributes[attr].replace(/"/g, '"'); - appendContent(state, ' ' + attr + '="' + escaped + '"'); - }); -} - -/** - * @param {Object} node - * @param {XMLFormatterState} state - * @return {void} - */ -function processProcessingIntruction(node, state) { - if (state.content.length > 0) { - newLine(state); - } - appendContent(state, ''); -} - - -/** - * Converts the given XML into human readable format. - * - * @param {String} xml - * @param {XMLFormatterOptions} options - * @returns {string} - */ -function format(xml, options = {}) { - options.indentation = 'indentation' in options ? options.indentation : ' '; - options.collapseContent = options.collapseContent === true; - options.lineSeparator = 'lineSeparator' in options ? options.lineSeparator : '\r\n'; - options.whiteSpaceAtEndOfSelfclosingTag = !!options.whiteSpaceAtEndOfSelfclosingTag; - - const parser = require('xml-parser-xo'); - const parsedXml = parser(xml, {filter: options.filter}); - const state = {content: '', level: 0, options: options}; - - if (parsedXml.declaration) { - processProcessingIntruction(parsedXml.declaration, state); - } - - parsedXml.children.forEach(function(child) { - processNode(child, state, false); - }); - - return state.content; -} - - -module.exports = format; - -},{"xml-parser-xo":1}]},{},[]); diff --git a/src/Lexer.js b/src/Lexer.js deleted file mode 100644 index 379c5c99..00000000 --- a/src/Lexer.js +++ /dev/null @@ -1,115 +0,0 @@ -/** - * The Lexer class handles tokenizing the input in various ways. Since our - * parser expects us to be able to backtrack, the lexer allows lexing from any - * given starting point. - * - * Its main exposed function is the `lex` function, which takes a position to - * lex from and a type of token to lex. It defers to the appropriate `_innerLex` - * function. - * - * The various `_innerLex` functions perform the actual lexing of different - * kinds. - */ - -import ParseError from "./ParseError"; -import SourceLocation from "./SourceLocation"; -import { Token } from "./Token"; - -/* The following tokenRegex - * - matches typical whitespace (but not NBSP etc.) using its first two groups - * - does not match any control character \x00-\x1f except whitespace - * - does not match a bare backslash - * - matches any ASCII character except those just mentioned - * - does not match the BMP private use area \uE000-\uF8FF - * - does not match bare surrogate code units - * - matches any BMP character except for those just described - * - matches any valid Unicode surrogate pair - * - mathches numerals - * - matches a backslash followed by one or more whitespace characters - * - matches a backslash followed by one or more letters then whitespace - * - matches a backslash followed by any BMP character - * Capturing groups: - * [1] regular whitespace - * [2] backslash followed by whitespace - * [3] anything else, which may include: - * [4] left character of \verb* - * [5] left character of \verb - * [6] backslash followed by word, excluding any trailing whitespace - * Just because the Lexer matches something doesn't mean it's valid input: - * If there is no matching function or symbol definition, the Parser will - * still reject the input. - */ -const spaceRegexString = "[ \r\n\t]"; -const controlWordRegexString = "\\\\[a-zA-Z@]+"; -const controlSymbolRegexString = "\\\\[^\uD800-\uDFFF]"; -const controlWordWhitespaceRegexString = `(${controlWordRegexString})${spaceRegexString}*` -const controlSpaceRegexString = "\\\\(\n|[ \r\t]+\n?)[ \r\t]*"; -const combiningDiacriticalMarkString = "[\u0300-\u036f]"; -export const combiningDiacriticalMarksEndRegex = new RegExp(`${combiningDiacriticalMarkString}+$`); -const tokenRegexString = - `(${spaceRegexString}+)|` + // whitespace - `${controlSpaceRegexString}|` + // whitespace - "([!-\\[\\]-\u2027\u202A-\uD7FF\uF900-\uFFFF]" + // single codepoint - `${combiningDiacriticalMarkString}*` + // ...plus accents - "|[\uD800-\uDBFF][\uDC00-\uDFFF]" + // surrogate pair - `${combiningDiacriticalMarkString}*` + // ...plus accents - "|\\\\verb\\*([^]).*?\\4" + // \verb* - "|\\\\verb([^*a-zA-Z]).*?\\5" + // \verb unstarred - `|${controlWordWhitespaceRegexString}` + // \macroName + spaces - `|${controlSymbolRegexString})`; // \\, \', etc. - -/** Main Lexer class */ -export default class Lexer { - constructor(input, settings) { - // Separate accents from characters - this.input = input; - this.settings = settings; - this.tokenRegex = new RegExp(tokenRegexString, 'g'); - // Category codes. The lexer only supports comment characters (14) for now. - // MacroExpander additionally distinguishes active (13). - this.catcodes = { - "%": 14, // comment character - "~": 13 // active character - }; - } - - setCatcode(char, code) { - this.catcodes[char] = code; - } - - /** - * This function lexes a single token. - */ - lex() { - const input = this.input; - const pos = this.tokenRegex.lastIndex; - if (pos === input.length) { - return new Token("EOF", new SourceLocation(this, pos, pos)); - } - const match = this.tokenRegex.exec(input); - if (match === null || match.index !== pos) { - throw new ParseError( - `Unexpected character: '${input[pos]}'`, - new Token(input[pos], new SourceLocation(this, pos, pos + 1)) - ); - } - const text = match[6] || match[3] || (match[2] ? "\\ " : " ") - - if (this.catcodes[text] === 14) { - // comment character - const nlIndex = input.indexOf("\n", this.tokenRegex.lastIndex); - if (nlIndex === -1) { - this.tokenRegex.lastIndex = input.length; // EOF - if (this.settings.strict) { - throw new ParseError("% comment has no terminating newline; LaTeX would " + - "fail because of commenting the end of math mode") - } - } else { - this.tokenRegex.lastIndex = nlIndex + 1; - } - return this.lex(); - } - - return new Token(text, new SourceLocation(this, pos, this.tokenRegex.lastIndex)); - } -} diff --git a/src/MacroExpander.js b/src/MacroExpander.js deleted file mode 100644 index 6b6cae00..00000000 --- a/src/MacroExpander.js +++ /dev/null @@ -1,436 +0,0 @@ -/** - * This file contains the “gullet” where macros are expanded - * until only non-macro tokens remain. - */ - -import functions from "./functions"; -import symbols from "./symbols"; -import Lexer from "./Lexer"; -import { Token } from "./Token"; - -import ParseError from "./ParseError"; -import Namespace from "./Namespace"; -import macros from "./macros"; - -// List of commands that act like macros but aren't defined as a macro, -// function, or symbol. Used in `isDefined`. -export const implicitCommands = { - "^": true, // Parser.js - _: true, // Parser.js - "\\limits": true, // Parser.js - "\\nolimits": true // Parser.js -}; - -export default class MacroExpander { - constructor(input, settings, mode) { - this.settings = settings; - this.expansionCount = 0; - this.feed(input); - // Make new global namespace - this.macros = new Namespace(macros, settings.macros); - this.mode = mode; - this.stack = []; // contains tokens in REVERSE order - } - - /** - * Feed a new input string to the same MacroExpander - * (with existing macros etc.). - */ - feed(input) { - this.lexer = new Lexer(input, this.settings); - } - - /** - * Switches between "text" and "math" modes. - */ - switchMode(newMode) { - this.mode = newMode; - } - - /** - * Start a new group nesting within all namespaces. - */ - beginGroup() { - this.macros.beginGroup(); - } - - /** - * End current group nesting within all namespaces. - */ - endGroup() { - this.macros.endGroup(); - } - - /** - * Returns the topmost token on the stack, without expanding it. - * Similar in behavior to TeX's `\futurelet`. - */ - future() { - if (this.stack.length === 0) { - this.pushToken(this.lexer.lex()) - } - return this.stack[this.stack.length - 1] - } - - /** - * Remove and return the next unexpanded token. - */ - popToken() { - this.future(); // ensure non-empty stack - return this.stack.pop(); - } - - /** - * Add a given token to the token stack. In particular, this get be used - * to put back a token returned from one of the other methods. - */ - pushToken(token) { - this.stack.push(token); - } - - /** - * Append an array of tokens to the token stack. - */ - pushTokens(tokens) { - this.stack.push(...tokens); - } - - /** - * Find an macro argument without expanding tokens and append the array of - * tokens to the token stack. Uses Token as a container for the result. - */ - scanArgument(isOptional) { - let start; - let end; - let tokens; - if (isOptional) { - this.consumeSpaces(); // \@ifnextchar gobbles any space following it - if (this.future().text !== "[") { - return null; - } - start = this.popToken(); // don't include [ in tokens - ({ tokens, end } = this.consumeArg(["]"])); - } else { - ({ tokens, start, end } = this.consumeArg()); - } - - // indicate the end of an argument - this.pushToken(new Token("EOF", end.loc)); - - this.pushTokens(tokens); - return start.range(end, ""); - } - - /** - * Consume all following space tokens, without expansion. - */ - consumeSpaces() { - for (;;) { - const token = this.future(); - if (token.text === " ") { - this.stack.pop(); - } else { - break; - } - } - } - - /** - * Consume an argument from the token stream, and return the resulting array - * of tokens and start/end token. - */ - consumeArg(delims) { - // The argument for a delimited parameter is the shortest (possibly - // empty) sequence of tokens with properly nested {...} groups that is - // followed ... by this particular list of non-parameter tokens. - // The argument for an undelimited parameter is the next nonblank - // token, unless that token is ‘{’, when the argument will be the - // entire {...} group that follows. - const tokens = []; - const isDelimited = delims && delims.length > 0; - if (!isDelimited) { - // Ignore spaces between arguments. As the TeXbook says: - // "After you have said ‘\def\row#1#2{...}’, you are allowed to - // put spaces between the arguments (e.g., ‘\row x n’), because - // TeX doesn’t use single spaces as undelimited arguments." - this.consumeSpaces(); - } - const start = this.future(); - let tok; - let depth = 0; - let match = 0; - do { - tok = this.popToken(); - tokens.push(tok); - if (tok.text === "{") { - ++depth; - } else if (tok.text === "}") { - --depth; - if (depth === -1) { - throw new ParseError("Extra }", tok); - } - } else if (tok.text === "EOF") { - throw new ParseError( - "Unexpected end of input in a macro argument" + - ", expected '" + - (delims && isDelimited ? delims[match] : "}") + - "'", - tok - ); - } - if (delims && isDelimited) { - if ((depth === 0 || (depth === 1 && delims[match] === "{")) && tok.text === delims[match]) { - ++match; - if (match === delims.length) { - // don't include delims in tokens - tokens.splice(-match, match); - break; - } - } else { - match = 0; - } - } - } while (depth !== 0 || isDelimited); - // If the argument found ... has the form ‘{}’, - // ... the outermost braces enclosing the argument are removed - if (start.text === "{" && tokens[tokens.length - 1].text === "}") { - tokens.pop(); - tokens.shift(); - } - tokens.reverse(); // to fit in with stack order - return { tokens, start, end: tok }; - } - - /** - * Consume the specified number of (delimited) arguments from the token - * stream and return the resulting array of arguments. - */ - consumeArgs(numArgs, delimiters) { - if (delimiters) { - if (delimiters.length !== numArgs + 1) { - throw new ParseError("The length of delimiters doesn't match the number of args!"); - } - const delims = delimiters[0]; - for (let i = 0; i < delims.length; i++) { - const tok = this.popToken(); - if (delims[i] !== tok.text) { - throw new ParseError("Use of the macro doesn't match its definition", tok); - } - } - } - - const args = []; - for (let i = 0; i < numArgs; i++) { - args.push(this.consumeArg(delimiters && delimiters[i + 1]).tokens); - } - return args; - } - - /** - * Expand the next token only once if possible. - * - * If the token is expanded, the resulting tokens will be pushed onto - * the stack in reverse order, and the number of such tokens will be - * returned. This number might be zero or positive. - * - * If not, the return value is `false`, and the next token remains at the - * top of the stack. - * - * In either case, the next token will be on the top of the stack, - * or the stack will be empty (in case of empty expansion - * and no other tokens). - * - * Used to implement `expandAfterFuture` and `expandNextToken`. - * - * If expandableOnly, only expandable tokens are expanded and - * an undefined control sequence results in an error. - */ - expandOnce(expandableOnly) { - const topToken = this.popToken(); - const name = topToken.text; - const expansion = !topToken.noexpand ? this._getExpansion(name) : null; - if (expansion == null || (expandableOnly && expansion.unexpandable)) { - if (expandableOnly && expansion == null && name[0] === "\\" && !this.isDefined(name)) { - throw new ParseError("Undefined control sequence: " + name); - } - this.pushToken(topToken); - return false; - } - this.expansionCount++; - if (this.expansionCount > this.settings.maxExpand) { - throw new ParseError( - "Too many expansions: infinite loop or " + "need to increase maxExpand setting" - ); - } - let tokens = expansion.tokens; - const args = this.consumeArgs(expansion.numArgs, expansion.delimiters); - if (expansion.numArgs) { - // paste arguments in place of the placeholders - tokens = tokens.slice(); // make a shallow copy - for (let i = tokens.length - 1; i >= 0; --i) { - let tok = tokens[i]; - if (tok.text === "#") { - if (i === 0) { - throw new ParseError("Incomplete placeholder at end of macro body", tok); - } - tok = tokens[--i]; // next token on stack - if (tok.text === "#") { - // ## → # - tokens.splice(i + 1, 1); // drop first # - } else if (/^[1-9]$/.test(tok.text)) { - // replace the placeholder with the indicated argument - tokens.splice(i, 2, ...args[+tok.text - 1]); - } else { - throw new ParseError("Not a valid argument number", tok); - } - } - } - } - // Concatenate expansion onto top of stack. - this.pushTokens(tokens); - return tokens.length; - } - - /** - * Expand the next token only once (if possible), and return the resulting - * top token on the stack (without removing anything from the stack). - * Similar in behavior to TeX's `\expandafter\futurelet`. - * Equivalent to expandOnce() followed by future(). - */ - expandAfterFuture() { - this.expandOnce(); - return this.future(); - } - - /** - * Recursively expand first token, then return first non-expandable token. - */ - expandNextToken() { - for (;;) { - if (this.expandOnce() === false) { // fully expanded - const token = this.stack.pop(); - // The token after \noexpand is interpreted as if its meaning were ‘\relax’ - if (token.treatAsRelax) { - token.text = "\\relax" - } - return token - } - } - - // This pathway is impossible. - throw new Error(); // eslint-disable-line no-unreachable - } - - /** - * Fully expand the given macro name and return the resulting list of - * tokens, or return `undefined` if no such macro is defined. - */ - expandMacro(name) { - return this.macros.has(name) ? this.expandTokens([new Token(name)]) : undefined; - } - - /** - * Fully expand the given token stream and return the resulting list of - * tokens. Note that the input tokens are in reverse order, but the - * output tokens are in forward order. - */ - expandTokens(tokens) { - const output = []; - const oldStackLength = this.stack.length; - this.pushTokens(tokens); - while (this.stack.length > oldStackLength) { - // Expand only expandable tokens - if (this.expandOnce(true) === false) { // fully expanded - const token = this.stack.pop(); - if (token.treatAsRelax) { - // the expansion of \noexpand is the token itself - token.noexpand = false; - token.treatAsRelax = false; - } - output.push(token); - } - } - return output; - } - - /** - * Fully expand the given macro name and return the result as a string, - * or return `undefined` if no such macro is defined. - */ - expandMacroAsText(name) { - const tokens = this.expandMacro(name); - if (tokens) { - return tokens.map((token) => token.text).join(""); - } else { - return tokens; - } - } - - /** - * Returns the expanded macro as a reversed array of tokens and a macro - * argument count. Or returns `null` if no such macro. - */ - _getExpansion(name) { - const definition = this.macros.get(name); - if (definition == null) { - // mainly checking for undefined here - return definition; - } - // If a single character has an associated catcode other than 13 - // (active character), then don't expand it. - if (name.length === 1) { - const catcode = this.lexer.catcodes[name] - if (catcode != null && catcode !== 13) { - return - } - } - const expansion = typeof definition === "function" ? definition(this) : definition; - if (typeof expansion === "string") { - let numArgs = 0; - if (expansion.indexOf("#") !== -1) { - const stripped = expansion.replace(/##/g, ""); - while (stripped.indexOf("#" + (numArgs + 1)) !== -1) { - ++numArgs; - } - } - const bodyLexer = new Lexer(expansion, this.settings); - const tokens = []; - let tok = bodyLexer.lex(); - while (tok.text !== "EOF") { - tokens.push(tok); - tok = bodyLexer.lex(); - } - tokens.reverse(); // to fit in with stack using push and pop - const expanded = { tokens, numArgs }; - return expanded; - } - - return expansion; - } - - /** - * Determine whether a command is currently "defined" (has some - * functionality), meaning that it's a macro (in the current group), - * a function, a symbol, or one of the special commands listed in - * `implicitCommands`. - */ - isDefined(name) { - return ( - this.macros.has(name) || - Object.prototype.hasOwnProperty.call(functions, name ) || - Object.prototype.hasOwnProperty.call(symbols.math, name ) || - Object.prototype.hasOwnProperty.call(symbols.text, name ) || - Object.prototype.hasOwnProperty.call(implicitCommands, name ) - ); - } - - /** - * Determine whether a command is expandable. - */ - isExpandable(name) { - const macro = this.macros.get(name); - return macro != null - ? typeof macro === "string" || typeof macro === "function" || !macro.unexpandable - : Object.prototype.hasOwnProperty.call(functions, name ) && !functions[name].primitive; - } -} diff --git a/src/Namespace.js b/src/Namespace.js deleted file mode 100644 index 1d4aeaa1..00000000 --- a/src/Namespace.js +++ /dev/null @@ -1,107 +0,0 @@ -/** - * A `Namespace` refers to a space of nameable things like macros or lengths, - * which can be `set` either globally or local to a nested group, using an - * undo stack similar to how TeX implements this functionality. - * Performance-wise, `get` and local `set` take constant time, while global - * `set` takes time proportional to the depth of group nesting. - */ - -import ParseError from "./ParseError"; - -export default class Namespace { - /** - * Both arguments are optional. The first argument is an object of - * built-in mappings which never change. The second argument is an object - * of initial (global-level) mappings, which will constantly change - * according to any global/top-level `set`s done. - */ - constructor(builtins = {}, globalMacros = {}) { - this.current = globalMacros; - this.builtins = builtins; - this.undefStack = []; - } - - /** - * Start a new nested group, affecting future local `set`s. - */ - beginGroup() { - this.undefStack.push({}); - } - - /** - * End current nested group, restoring values before the group began. - */ - endGroup() { - if (this.undefStack.length === 0) { - throw new ParseError( - "Unbalanced namespace destruction: attempt " + - "to pop global namespace; please report this as a bug" - ); - } - const undefs = this.undefStack.pop(); - for (const undef in undefs) { - if (Object.prototype.hasOwnProperty.call(undefs, undef )) { - if (undefs[undef] === undefined) { - delete this.current[undef]; - } else { - this.current[undef] = undefs[undef]; - } - } - } - } - - /** - * Detect whether `name` has a definition. Equivalent to - * `get(name) != null`. - */ - has(name) { - return Object.prototype.hasOwnProperty.call(this.current, name ) || - Object.prototype.hasOwnProperty.call(this.builtins, name ); - } - - /** - * Get the current value of a name, or `undefined` if there is no value. - * - * Note: Do not use `if (namespace.get(...))` to detect whether a macro - * is defined, as the definition may be the empty string which evaluates - * to `false` in JavaScript. Use `if (namespace.get(...) != null)` or - * `if (namespace.has(...))`. - */ - get(name) { - if (Object.prototype.hasOwnProperty.call(this.current, name )) { - return this.current[name]; - } else { - return this.builtins[name]; - } - } - - /** - * Set the current value of a name, and optionally set it globally too. - * Local set() sets the current value and (when appropriate) adds an undo - * operation to the undo stack. Global set() may change the undo - * operation at every level, so takes time linear in their number. - */ - set(name, value, global = false) { - if (global) { - // Global set is equivalent to setting in all groups. Simulate this - // by destroying any undos currently scheduled for this name, - // and adding an undo with the *new* value (in case it later gets - // locally reset within this environment). - for (let i = 0; i < this.undefStack.length; i++) { - delete this.undefStack[i][name]; - } - if (this.undefStack.length > 0) { - this.undefStack[this.undefStack.length - 1][name] = value; - } - } else { - // Undo this set at end of this group (possibly to `undefined`), - // unless an undo is already in place, in which case that older - // value is the correct one. - const top = this.undefStack[this.undefStack.length - 1]; - if (top && !Object.prototype.hasOwnProperty.call(top, name )) { - top[name] = this.current[name]; - } - } - this.current[name] = value; - } -} diff --git a/src/ParseError.js b/src/ParseError.js deleted file mode 100644 index ea31ca09..00000000 --- a/src/ParseError.js +++ /dev/null @@ -1,64 +0,0 @@ -/** - * This is the ParseError class, which is the main error thrown by Temml - * functions when something has gone wrong. This is used to distinguish internal - * errors from errors in the expression that the user provided. - * - * If possible, a caller should provide a Token or ParseNode with information - * about where in the source string the problem occurred. - */ -class ParseError { - constructor( - message, // The error message - token // An object providing position information - ) { - let error = " " + message; - let start; - - const loc = token && token.loc; - if (loc && loc.start <= loc.end) { - // If we have the input and a position, make the error a bit fancier - - // Get the input - const input = loc.lexer.input; - - // Prepend some information - start = loc.start; - const end = loc.end; - if (start === input.length) { - error += " at end of input: "; - } else { - error += " at position " + (start + 1) + ": "; - } - - // Underline token in question using combining underscores - const underlined = input.slice(start, end).replace(/[^]/g, "$&\u0332"); - - // Extract some context from the input and add it to the error - let left; - if (start > 15) { - left = "…" + input.slice(start - 15, start); - } else { - left = input.slice(0, start); - } - let right; - if (end + 15 < input.length) { - right = input.slice(end, end + 15) + "…"; - } else { - right = input.slice(end); - } - error += left + underlined + right; - } - - // Some hackery to make ParseError a prototype of Error - // See http://stackoverflow.com/a/8460753 - const self = new Error(error); - self.name = "ParseError"; - self.__proto__ = ParseError.prototype; - self.position = start; - return self; - } -} - -ParseError.prototype.__proto__ = Error.prototype; - -export default ParseError; diff --git a/src/Parser.js b/src/Parser.js deleted file mode 100644 index a0f76736..00000000 --- a/src/Parser.js +++ /dev/null @@ -1,993 +0,0 @@ -/* eslint no-constant-condition:0 */ -import functions from "./functions"; -import MacroExpander, { implicitCommands } from "./MacroExpander"; -import symbols, { ATOMS } from "./symbols"; -import { validUnit } from "./units"; -import ParseError from "./ParseError"; -import { combiningDiacriticalMarksEndRegex } from "./Lexer"; -import { uSubsAndSups, unicodeSubRegEx } from "./unicodeSupOrSub" -import { asciiFromScript } from "./asciiFromScript" -import SourceLocation from "./SourceLocation"; -import { Token } from "./Token"; -import { isDelimiter } from "./functions/delimsizing" - -// Pre-evaluate both modules as unicodeSymbols require String.normalize() -import unicodeAccents from /*preval*/ "./unicodeAccents"; -import unicodeSymbols from /*preval*/ "./unicodeSymbols"; - -const binLeftCancellers = ["bin", "op", "open", "punct", "rel"]; - -/** - * This file contains the parser used to parse out a TeX expression from the - * input. Since TeX isn't context-free, standard parsers don't work particularly - * well. - * - * The strategy of this parser is as such: - * - * The main functions (the `.parse...` ones) take a position in the current - * parse string to parse tokens from. The lexer (found in Lexer.js, stored at - * this.gullet.lexer) also supports pulling out tokens at arbitrary places. When - * individual tokens are needed at a position, the lexer is called to pull out a - * token, which is then used. - * - * The parser has a property called "mode" indicating the mode that - * the parser is currently in. Currently it has to be one of "math" or - * "text", which denotes whether the current environment is a math-y - * one or a text-y one (e.g. inside \text). Currently, this serves to - * limit the functions which can be used in text mode. - * - * The main functions then return an object which contains the useful data that - * was parsed at its given point, and a new position at the end of the parsed - * data. The main functions can call each other and continue the parsing by - * using the returned position as a new starting point. - * - * There are also extra `.handle...` functions, which pull out some reused - * functionality into self-contained functions. - * - * The functions return ParseNodes. - */ - -export default class Parser { - constructor(input, settings, isPreamble = false) { - // Start in math mode - this.mode = "math"; - // Create a new macro expander (gullet) and (indirectly via that) also a - // new lexer (mouth) for this parser (stomach, in the language of TeX) - this.gullet = new MacroExpander(input, settings, this.mode); - // Store the settings for use in parsing - this.settings = settings; - // Are we defining a preamble? - this.isPreamble = isPreamble; - // Count leftright depth (for \middle errors) - this.leftrightDepth = 0; - this.prevAtomType = ""; - } - - /** - * Checks a result to make sure it has the right type, and throws an - * appropriate error otherwise. - */ - expect(text, consume = true) { - if (this.fetch().text !== text) { - throw new ParseError(`Expected '${text}', got '${this.fetch().text}'`, this.fetch()); - } - if (consume) { - this.consume(); - } - } - - /** - * Discards the current lookahead token, considering it consumed. - */ - consume() { - this.nextToken = null; - } - - /** - * Return the current lookahead token, or if there isn't one (at the - * beginning, or if the previous lookahead token was consume()d), - * fetch the next token as the new lookahead token and return it. - */ - fetch() { - if (this.nextToken == null) { - this.nextToken = this.gullet.expandNextToken(); - } - return this.nextToken; - } - - /** - * Switches between "text" and "math" modes. - */ - switchMode(newMode) { - this.mode = newMode; - this.gullet.switchMode(newMode); - } - - /** - * Main parsing function, which parses an entire input. - */ - parse() { - // Create a group namespace for every $...$, $$...$$, \[...\].) - // A \def is then valid only within that pair of delimiters. - this.gullet.beginGroup(); - - if (this.settings.colorIsTextColor) { - // Use old \color behavior (same as LaTeX's \textcolor) if requested. - // We do this within the group for the math expression, so it doesn't - // pollute settings.macros. - this.gullet.macros.set("\\color", "\\textcolor"); - } - - // Try to parse the input - const parse = this.parseExpression(false); - - // If we succeeded, make sure there's an EOF at the end - this.expect("EOF"); - - if (this.isPreamble) { - const macros = Object.create(null) - Object.entries(this.gullet.macros.current).forEach(([key, value]) => { - macros[key] = value - }) - this.gullet.endGroup(); - return macros - } - - // The only local macro that we want to save is from \tag. - const tag = this.gullet.macros.get("\\df@tag") - - // End the group namespace for the expression - this.gullet.endGroup(); - - if (tag) { this.gullet.macros.current["\\df@tag"] = tag } - - return parse; - } - - static get endOfExpression() { - return ["}", "\\endgroup", "\\end", "\\right", "\\endtoggle", "&"]; - } - - /** - * Fully parse a separate sequence of tokens as a separate job. - * Tokens should be specified in reverse order, as in a MacroDefinition. - */ - subparse(tokens) { - // Save the next token from the current job. - const oldToken = this.nextToken; - this.consume(); - - // Run the new job, terminating it with an excess '}' - this.gullet.pushToken(new Token("}")); - this.gullet.pushTokens(tokens); - const parse = this.parseExpression(false); - this.expect("}"); - - // Restore the next token from the current job. - this.nextToken = oldToken; - - return parse; - } - -/** - * Parses an "expression", which is a list of atoms. - * - * `breakOnInfix`: Should the parsing stop when we hit infix nodes? This - * happens when functions have higher precedence han infix - * nodes in implicit parses. - * - * `breakOnTokenText`: The text of the token that the expression should end - * with, or `null` if something else should end the - * expression. - * - * `breakOnMiddle`: \color, \over, and old styling functions work on an implicit group. - * These groups end just before the usual tokens, but they also - * end just before `\middle`. - */ - parseExpression(breakOnInfix, breakOnTokenText, breakOnMiddle) { - const body = []; - // Keep adding atoms to the body until we can't parse any more atoms (either - // we reached the end, a }, or a \right) - while (true) { - // Ignore spaces in math mode - if (this.mode === "math") { - this.consumeSpaces(); - } - const lex = this.fetch(); - if (Parser.endOfExpression.indexOf(lex.text) !== -1) { - break; - } - if (breakOnTokenText && lex.text === breakOnTokenText) { - break; - } - if (breakOnMiddle && lex.text === "\\middle") { - break - } - if (breakOnInfix && functions[lex.text] && functions[lex.text].infix) { - break; - } - const atom = this.parseAtom(breakOnTokenText); - if (!atom) { - break; - } else if (atom.type === "internal") { - continue; - } - body.push(atom); - // Keep a record of the atom type, so that op.js can set correct spacing. - this.prevAtomType = atom.type === "atom" ? atom.family : atom.type; - } - if (this.mode === "text") { - this.formLigatures(body); - } - return this.handleInfixNodes(body); - } - - /** - * Rewrites infix operators such as \over with corresponding commands such - * as \frac. - * - * There can only be one infix operator per group. If there's more than one - * then the expression is ambiguous. This can be resolved by adding {}. - */ - handleInfixNodes(body) { - let overIndex = -1; - let funcName; - - for (let i = 0; i < body.length; i++) { - if (body[i].type === "infix") { - if (overIndex !== -1) { - throw new ParseError("only one infix operator per group", body[i].token); - } - overIndex = i; - funcName = body[i].replaceWith; - } - } - - if (overIndex !== -1 && funcName) { - let numerNode; - let denomNode; - - const numerBody = body.slice(0, overIndex); - const denomBody = body.slice(overIndex + 1); - - if (numerBody.length === 1 && numerBody[0].type === "ordgroup") { - numerNode = numerBody[0]; - } else { - numerNode = { type: "ordgroup", mode: this.mode, body: numerBody }; - } - - if (denomBody.length === 1 && denomBody[0].type === "ordgroup") { - denomNode = denomBody[0]; - } else { - denomNode = { type: "ordgroup", mode: this.mode, body: denomBody }; - } - - let node; - if (funcName === "\\\\abovefrac") { - node = this.callFunction(funcName, [numerNode, body[overIndex], denomNode], []); - } else { - node = this.callFunction(funcName, [numerNode, denomNode], []); - } - return [node]; - } else { - return body; - } - } - - /** - * Handle a subscript or superscript with nice errors. - */ - handleSupSubscript( - name // For error reporting. - ) { - const symbolToken = this.fetch(); - const symbol = symbolToken.text; - this.consume(); - this.consumeSpaces(); // ignore spaces before sup/subscript argument - const group = this.parseGroup(name); - - if (!group) { - throw new ParseError("Expected group after '" + symbol + "'", symbolToken); - } - - return group; - } - - /** - * Converts the textual input of an unsupported command into a text node - * contained within a color node whose color is determined by errorColor - */ - formatUnsupportedCmd(text) { - const textordArray = []; - - for (let i = 0; i < text.length; i++) { - textordArray.push({ type: "textord", mode: "text", text: text[i] }); - } - - const textNode = { - type: "text", - mode: this.mode, - body: textordArray - }; - - const colorNode = { - type: "color", - mode: this.mode, - color: this.settings.errorColor, - body: [textNode] - }; - - return colorNode; - } - - /** - * Parses a group with optional super/subscripts. - */ - parseAtom(breakOnTokenText) { - // The body of an atom is an implicit group, so that things like - // \left(x\right)^2 work correctly. - const base = this.parseGroup("atom", breakOnTokenText); - - // In text mode, we don't have superscripts or subscripts - if (this.mode === "text") { - return base; - } - - // Note that base may be empty (i.e. null) at this point. - - let superscript; - let subscript; - while (true) { - // Guaranteed in math mode, so eat any spaces first. - this.consumeSpaces(); - - // Lex the first token - const lex = this.fetch(); - - if (lex.text === "\\limits" || lex.text === "\\nolimits") { - // We got a limit control - if (base && base.type === "op") { - const limits = lex.text === "\\limits"; - base.limits = limits; - base.alwaysHandleSupSub = true; - } else if (base && base.type === "operatorname") { - if (base.alwaysHandleSupSub) { - base.limits = lex.text === "\\limits" - } - } else { - throw new ParseError("Limit controls must follow a math operator", lex); - } - this.consume(); - } else if (lex.text === "^") { - // We got a superscript start - if (superscript) { - throw new ParseError("Double superscript", lex); - } - superscript = this.handleSupSubscript("superscript"); - } else if (lex.text === "_") { - // We got a subscript start - if (subscript) { - throw new ParseError("Double subscript", lex); - } - subscript = this.handleSupSubscript("subscript"); - } else if (lex.text === "'") { - // We got a prime - if (superscript) { - throw new ParseError("Double superscript", lex); - } - const prime = { type: "textord", mode: this.mode, text: "\\prime" }; - - // Many primes can be grouped together, so we handle this here - const primes = [prime]; - this.consume(); - // Keep lexing tokens until we get something that's not a prime - while (this.fetch().text === "'") { - // For each one, add another prime to the list - primes.push(prime); - this.consume(); - } - // If there's a superscript following the primes, combine that - // superscript in with the primes. - if (this.fetch().text === "^") { - primes.push(this.handleSupSubscript("superscript")); - } - // Put everything into an ordgroup as the superscript - superscript = { type: "ordgroup", mode: this.mode, body: primes }; - } else if (uSubsAndSups[lex.text]) { - // A Unicode subscript or superscript character. - // We treat these similarly to the unicode-math package. - // So we render a string of Unicode (sub|super)scripts the - // same as a (sub|super)script of regular characters. - const isSub = unicodeSubRegEx.test(lex.text) - const subsupTokens = []; - subsupTokens.push(new Token(uSubsAndSups[lex.text])) - this.consume() - // Continue fetching tokens to fill out the group. - while (true) { - const token = this.fetch().text - if (!(uSubsAndSups[token])) { break } - if (unicodeSubRegEx.test(token) !== isSub) { break } - subsupTokens.unshift(new Token(uSubsAndSups[token])) - this.consume() - } - // Now create a (sub|super)script. - const body = this.subparse(subsupTokens) - if (isSub) { - subscript = { type: "ordgroup", mode: "math", body } - } else { - superscript = { type: "ordgroup", mode: "math", body } - } - } else { - // If it wasn't ^, _, a Unicode (sub|super)script, or ', stop parsing super/subscripts - break; - } - } - - if (superscript || subscript) { - if (base && base.type === "multiscript" && !base.postscripts) { - // base is the result of a \prescript function. - // Write the sub- & superscripts into the multiscript element. - base.postscripts = { sup: superscript, sub: subscript } - return base - } else { - // We got either a superscript or subscript, create a supsub - const isFollowedByDelimiter = (!base || base.type !== "op" && base.type !== "operatorname") - ? undefined - : isDelimiter(this.nextToken.text); - return { - type: "supsub", - mode: this.mode, - base: base, - sup: superscript, - sub: subscript, - isFollowedByDelimiter - } - } - } else { - // Otherwise return the original body - return base; - } - } - - /** - * Parses an entire function, including its base and all of its arguments. - */ - parseFunction( - breakOnTokenText, - name // For determining its context - ) { - const token = this.fetch(); - const func = token.text; - const funcData = functions[func]; - if (!funcData) { - return null; - } - this.consume(); // consume command token - - if (name && name !== "atom" && !funcData.allowedInArgument) { - throw new ParseError( - "Got function '" + func + "' with no arguments" + (name ? " as " + name : ""), - token - ); - } else if (this.mode === "text" && !funcData.allowedInText) { - throw new ParseError("Can't use function '" + func + "' in text mode", token); - } else if (this.mode === "math" && funcData.allowedInMath === false) { - throw new ParseError("Can't use function '" + func + "' in math mode", token); - } - - const prevAtomType = this.prevAtomType; - const { args, optArgs } = this.parseArguments(func, funcData); - this.prevAtomType = prevAtomType; - return this.callFunction(func, args, optArgs, token, breakOnTokenText); - } - - /** - * Call a function handler with a suitable context and arguments. - */ - callFunction(name, args, optArgs, token, breakOnTokenText) { - const context = { - funcName: name, - parser: this, - token, - breakOnTokenText - }; - const func = functions[name]; - if (func && func.handler) { - return func.handler(context, args, optArgs); - } else { - throw new ParseError(`No function handler for ${name}`); - } - } - - /** - * Parses the arguments of a function or environment - */ - parseArguments( - func, // Should look like "\name" or "\begin{name}". - funcData - ) { - const totalArgs = funcData.numArgs + funcData.numOptionalArgs; - if (totalArgs === 0) { - return { args: [], optArgs: [] }; - } - - const args = []; - const optArgs = []; - - for (let i = 0; i < totalArgs; i++) { - let argType = funcData.argTypes && funcData.argTypes[i]; - const isOptional = i < funcData.numOptionalArgs; - - if ( - (funcData.primitive && argType == null) || - // \sqrt expands into primitive if optional argument doesn't exist - (funcData.type === "sqrt" && i === 1 && optArgs[0] == null) - ) { - argType = "primitive"; - } - - const arg = this.parseGroupOfType(`argument to '${func}'`, argType, isOptional); - if (isOptional) { - optArgs.push(arg); - } else if (arg != null) { - args.push(arg); - } else { - // should be unreachable - throw new ParseError("Null argument, please report this as a bug"); - } - } - - return { args, optArgs }; - } - - /** - * Parses a group when the mode is changing. - */ - parseGroupOfType(name, type, optional) { - switch (type) { - case "size": - return this.parseSizeGroup(optional); - case "url": - return this.parseUrlGroup(optional); - case "math": - case "text": - return this.parseArgumentGroup(optional, type); - case "hbox": { - // hbox argument type wraps the argument in the equivalent of - // \hbox, which is like \text but switching to \textstyle size. - const group = this.parseArgumentGroup(optional, "text"); - return group != null - ? { - type: "styling", - mode: group.mode, - body: [group], - scriptLevel: "text" // simulate \textstyle - } - : null; - } - case "raw": { - const token = this.parseStringGroup("raw", optional); - return token != null - ? { - type: "raw", - mode: "text", - string: token.text - } - : null; - } - case "primitive": { - if (optional) { - throw new ParseError("A primitive argument cannot be optional"); - } - const group = this.parseGroup(name); - if (group == null) { - throw new ParseError("Expected group as " + name, this.fetch()); - } - return group; - } - case "original": - case null: - case undefined: - return this.parseArgumentGroup(optional); - default: - throw new ParseError("Unknown group type as " + name, this.fetch()); - } - } - - /** - * Discard any space tokens, fetching the next non-space token. - */ - consumeSpaces() { - while (true) { - const ch = this.fetch().text - // \ufe0e is the Unicode variation selector to supress emoji. Ignore it. - if (ch === " " || ch === "\u00a0" || ch === "\ufe0e") { - this.consume() - } else { - break - } - } - } - - /** - * Parses a group, essentially returning the string formed by the - * brace-enclosed tokens plus some position information. - */ - parseStringGroup( - modeName, // Used to describe the mode in error messages. - optional - ) { - const argToken = this.gullet.scanArgument(optional); - if (argToken == null) { - return null; - } - let str = ""; - let nextToken; - while ((nextToken = this.fetch()).text !== "EOF") { - str += nextToken.text; - this.consume(); - } - this.consume(); // consume the end of the argument - argToken.text = str; - return argToken; - } - - /** - * Parses a regex-delimited group: the largest sequence of tokens - * whose concatenated strings match `regex`. Returns the string - * formed by the tokens plus some position information. - */ - parseRegexGroup( - regex, - modeName // Used to describe the mode in error messages. - ) { - const firstToken = this.fetch(); - let lastToken = firstToken; - let str = ""; - let nextToken; - while ((nextToken = this.fetch()).text !== "EOF" && regex.test(str + nextToken.text)) { - lastToken = nextToken; - str += lastToken.text; - this.consume(); - } - if (str === "") { - throw new ParseError("Invalid " + modeName + ": '" + firstToken.text + "'", firstToken); - } - return firstToken.range(lastToken, str); - } - - /** - * Parses a size specification, consisting of magnitude and unit. - */ - parseSizeGroup(optional) { - let res; - let isBlank = false; - // don't expand before parseStringGroup - this.gullet.consumeSpaces(); - if (!optional && this.gullet.future().text !== "{") { - res = this.parseRegexGroup(/^[-+]? *(?:$|\d+|\d+\.\d*|\.\d*) *[a-z]{0,2} *$/, "size"); - } else { - res = this.parseStringGroup("size", optional); - } - if (!res) { - return null; - } - if (!optional && res.text.length === 0) { - // Because we've tested for what is !optional, this block won't - // affect \kern, \hspace, etc. It will capture the mandatory arguments - // to \genfrac and \above. - res.text = "0pt"; // Enable \above{} - isBlank = true; // This is here specifically for \genfrac - } - const match = /([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(res.text); - if (!match) { - throw new ParseError("Invalid size: '" + res.text + "'", res); - } - const data = { - number: +(match[1] + match[2]), // sign + magnitude, cast to number - unit: match[3] - }; - if (!validUnit(data)) { - throw new ParseError("Invalid unit: '" + data.unit + "'", res); - } - return { - type: "size", - mode: this.mode, - value: data, - isBlank - }; - } - - /** - * Parses an URL, checking escaped letters and allowed protocols, - * and setting the catcode of % as an active character (as in \hyperref). - */ - parseUrlGroup(optional) { - this.gullet.lexer.setCatcode("%", 13); // active character - this.gullet.lexer.setCatcode("~", 12); // other character - const res = this.parseStringGroup("url", optional); - this.gullet.lexer.setCatcode("%", 14); // comment character - this.gullet.lexer.setCatcode("~", 13); // active character - if (res == null) { - return null; - } - // hyperref package allows backslashes alone in href, but doesn't - // generate valid links in such cases; we interpret this as - // "undefined" behaviour, and keep them as-is. Some browser will - // replace backslashes with forward slashes. - let url = res.text.replace(/\\([#$%&~_^{}])/g, "$1"); - url = res.text.replace(/{\u2044}/g, "/"); - return { - type: "url", - mode: this.mode, - url - }; - } - - /** - * Parses an argument with the mode specified. - */ - parseArgumentGroup(optional, mode) { - const argToken = this.gullet.scanArgument(optional); - if (argToken == null) { - return null; - } - const outerMode = this.mode; - if (mode) { - // Switch to specified mode - this.switchMode(mode); - } - - this.gullet.beginGroup(); - const expression = this.parseExpression(false, "EOF"); - // TODO: find an alternative way to denote the end - this.expect("EOF"); // expect the end of the argument - this.gullet.endGroup(); - const result = { - type: "ordgroup", - mode: this.mode, - loc: argToken.loc, - body: expression - }; - - if (mode) { - // Switch mode back - this.switchMode(outerMode); - } - return result; - } - - /** - * Parses an ordinary group, which is either a single nucleus (like "x") - * or an expression in braces (like "{x+y}") or an implicit group, a group - * that starts at the current position, and ends right before a higher explicit - * group ends, or at EOF. - */ - parseGroup( - name, // For error reporting. - breakOnTokenText - ) { - const firstToken = this.fetch(); - const text = firstToken.text; - - let result; - // Try to parse an open brace or \begingroup - if (text === "{" || text === "\\begingroup" || text === "\\toggle") { - this.consume(); - const groupEnd = text === "{" - ? "}" - : text === "\\begingroup" - ? "\\endgroup" - : "\\endtoggle" - - this.gullet.beginGroup(); - // If we get a brace, parse an expression - const expression = this.parseExpression(false, groupEnd); - const lastToken = this.fetch(); - this.expect(groupEnd); // Check that we got a matching closing brace - this.gullet.endGroup(); - result = { - type: (lastToken.text === "\\endtoggle" ? "toggle" : "ordgroup"), - mode: this.mode, - loc: SourceLocation.range(firstToken, lastToken), - body: expression, - // A group formed by \begingroup...\endgroup is a semi-simple group - // which doesn't affect spacing in math mode, i.e., is transparent. - // https://tex.stackexchange.com/questions/1930/ - semisimple: text === "\\begingroup" || undefined - }; - } else { - // If there exists a function with this name, parse the function. - // Otherwise, just return a nucleus - result = this.parseFunction(breakOnTokenText, name) || this.parseSymbol(); - if (result == null && text[0] === "\\" && - !Object.prototype.hasOwnProperty.call(implicitCommands, text )) { - result = this.formatUnsupportedCmd(text); - this.consume(); - } - } - return result; - } - - /** - * Form ligature-like combinations of characters for text mode. - * This includes inputs like "--", "---", "``" and "''". - * The result will simply replace multiple textord nodes with a single - * character in each value by a single textord node having multiple - * characters in its value. The representation is still ASCII source. - * The group will be modified in place. - */ - formLigatures(group) { - let n = group.length - 1; - for (let i = 0; i < n; ++i) { - const a = group[i]; - const v = a.text; - if (v === "-" && group[i + 1].text === "-") { - if (i + 1 < n && group[i + 2].text === "-") { - group.splice(i, 3, { - type: "textord", - mode: "text", - loc: SourceLocation.range(a, group[i + 2]), - text: "---" - }); - n -= 2; - } else { - group.splice(i, 2, { - type: "textord", - mode: "text", - loc: SourceLocation.range(a, group[i + 1]), - text: "--" - }); - n -= 1; - } - } - if ((v === "'" || v === "`") && group[i + 1].text === v) { - group.splice(i, 2, { - type: "textord", - mode: "text", - loc: SourceLocation.range(a, group[i + 1]), - text: v + v - }); - n -= 1; - } - } - } - - /** - * Parse a single symbol out of the string. Here, we handle single character - * symbols and special functions like \verb. - */ - parseSymbol() { - const nucleus = this.fetch(); - let text = nucleus.text; - - if (/^\\verb[^a-zA-Z]/.test(text)) { - this.consume(); - let arg = text.slice(5); - const star = arg.charAt(0) === "*"; - if (star) { - arg = arg.slice(1); - } - // Lexer's tokenRegex is constructed to always have matching - // first/last characters. - if (arg.length < 2 || arg.charAt(0) !== arg.slice(-1)) { - throw new ParseError(`\\verb assertion failed -- - please report what input caused this bug`); - } - arg = arg.slice(1, -1); // remove first and last char - return { - type: "verb", - mode: "text", - body: arg, - star - }; - } - // At this point, we should have a symbol, possibly with accents. - // First expand any accented base symbol according to unicodeSymbols. - if (Object.prototype.hasOwnProperty.call(unicodeSymbols, text[0]) && - !symbols[this.mode][text[0]]) { - // This behavior is not strict (XeTeX-compatible) in math mode. - if (this.settings.strict && this.mode === "math") { - throw new ParseError(`Accented Unicode text character "${text[0]}" used in ` + `math mode`, - nucleus - ); - } - text = unicodeSymbols[text[0]] + text.slice(1); - } - // Strip off any combining characters - const match = combiningDiacriticalMarksEndRegex.exec(text); - if (match) { - text = text.substring(0, match.index); - if (text === "i") { - text = "\u0131"; // dotless i, in math and text mode - } else if (text === "j") { - text = "\u0237"; // dotless j, in math and text mode - } - } - // Recognize base symbol - let symbol; - if (symbols[this.mode][text]) { - let group = symbols[this.mode][text].group; - if (group === "bin" && binLeftCancellers.includes(this.prevAtomType)) { - // Change from a binary operator to a unary (prefix) operator - group = "open" - } - const loc = SourceLocation.range(nucleus); - let s; - if (Object.prototype.hasOwnProperty.call(ATOMS, group )) { - const family = group; - s = { - type: "atom", - mode: this.mode, - family, - loc, - text - }; - } else { - if (asciiFromScript[text]) { - // Unicode 14 disambiguates chancery from roundhand. - // See https://www.unicode.org/charts/PDF/U1D400.pdf - this.consume() - const nextCode = this.fetch().text.charCodeAt(0) - // mathcal is Temml default. Use mathscript if called for. - const font = nextCode === 0xfe01 ? "mathscr" : "mathcal"; - if (nextCode === 0xfe00 || nextCode === 0xfe01) { this.consume() } - return { - type: "font", - mode: "math", - font, - body: { type: "mathord", mode: "math", loc, text: asciiFromScript[text] } - } - } - // Default ord character. No disambiguation necessary. - s = { - type: group, - mode: this.mode, - loc, - text - }; - } - symbol = s; - } else if (text.charCodeAt(0) >= 0x80) { - // no symbol for e.g. ^ - if (this.settings.strict && this.mode === "math") { - throw new ParseError(`Unicode text character "${text[0]}" used in math mode`, nucleus) - } - // All nonmathematical Unicode characters are rendered as if they - // are in text mode (wrapped in \text) because that's what it - // takes to render them in LaTeX. - symbol = { - type: "textord", - mode: "text", - loc: SourceLocation.range(nucleus), - text - }; - } else { - return null; // EOF, ^, _, {, }, etc. - } - this.consume(); - // Transform combining characters into accents - if (match) { - for (let i = 0; i < match[0].length; i++) { - const accent = match[0][i]; - if (!unicodeAccents[accent]) { - throw new ParseError(`Unknown accent ' ${accent}'`, nucleus); - } - const command = unicodeAccents[accent][this.mode] || - unicodeAccents[accent].text; - if (!command) { - throw new ParseError(`Accent ${accent} unsupported in ${this.mode} mode`, nucleus); - } - symbol = { - type: "accent", - mode: this.mode, - loc: SourceLocation.range(nucleus), - label: command, - isStretchy: false, - base: symbol - }; - } - } - return symbol; - } -} diff --git a/src/Settings.js b/src/Settings.js deleted file mode 100644 index 6cb51fda..00000000 --- a/src/Settings.js +++ /dev/null @@ -1,54 +0,0 @@ -/** - * This is a module for storing settings passed into Temml. It correctly handles - * default settings. - */ - -import utils from "./utils"; - -/** - * The main Settings object - */ -export default class Settings { - constructor(options) { - // allow null options - options = options || {}; - this.displayMode = utils.deflt(options.displayMode, false); // boolean - this.annotate = utils.deflt(options.annotate, false) // boolean - this.leqno = utils.deflt(options.leqno, false); // boolean - this.throwOnError = utils.deflt(options.throwOnError, false); // boolean - this.errorColor = utils.deflt(options.errorColor, "#b22222"); // string - this.macros = options.macros || {}; - this.wrap = utils.deflt(options.wrap, "tex") // "tex" | "=" - this.xml = utils.deflt(options.xml, false); // boolean - this.colorIsTextColor = utils.deflt(options.colorIsTextColor, false); // booelean - this.strict = utils.deflt(options.strict, false); // boolean - this.trust = utils.deflt(options.trust, false); // trust context. See html.js. - this.maxSize = (options.maxSize === undefined - ? [Infinity, Infinity] - : Array.isArray(options.maxSize) - ? options.maxSize - : [Infinity, Infinity] - ) - this.maxExpand = Math.max(0, utils.deflt(options.maxExpand, 1000)); // number - } - - /** - * Check whether to test potentially dangerous input, and return - * `true` (trusted) or `false` (untrusted). The sole argument `context` - * should be an object with `command` field specifying the relevant LaTeX - * command (as a string starting with `\`), and any other arguments, etc. - * If `context` has a `url` field, a `protocol` field will automatically - * get added by this function (changing the specified object). - */ - isTrusted(context) { - if (context.url && !context.protocol) { - const protocol = utils.protocolFromUrl(context.url); - if (protocol == null) { - return false - } - context.protocol = protocol - } - const trust = typeof this.trust === "function" ? this.trust(context) : this.trust; - return Boolean(trust); - } -} diff --git a/src/SourceLocation.js b/src/SourceLocation.js deleted file mode 100644 index ad0f8031..00000000 --- a/src/SourceLocation.js +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Lexing or parsing positional information for error reporting. - * This object is immutable. - */ -export default class SourceLocation { - constructor(lexer, start, end) { - this.lexer = lexer; // Lexer holding the input string. - this.start = start; // Start offset, zero-based inclusive. - this.end = end; // End offset, zero-based exclusive. - } - - /** - * Merges two `SourceLocation`s from location providers, given they are - * provided in order of appearance. - * - Returns the first one's location if only the first is provided. - * - Returns a merged range of the first and the last if both are provided - * and their lexers match. - * - Otherwise, returns null. - */ - static range(first, second) { - if (!second) { - return first && first.loc; - } else if (!first || !first.loc || !second.loc || first.loc.lexer !== second.loc.lexer) { - return null; - } else { - return new SourceLocation(first.loc.lexer, first.loc.start, second.loc.end); - } - } -} diff --git a/src/Style.js b/src/Style.js deleted file mode 100644 index c98fd9de..00000000 --- a/src/Style.js +++ /dev/null @@ -1,144 +0,0 @@ -/** - * This file contains information about the style that the mathmlBuilder carries - * around with it. Data is held in an `Style` object, and when - * recursing, a new `Style` object can be created with the `.with*` functions. - */ - -const subOrSupLevel = [2, 2, 3, 3]; - -/** - * This is the main Style class. It contains the current style.level, color, and font. - * - * Style objects should not be modified. To create a new Style with - * different properties, call a `.with*` method. - */ -class Style { - constructor(data) { - // Style.level can be 0 | 1 | 2 | 3, which correspond to - // displaystyle, textstyle, scriptstyle, and scriptscriptstyle. - // style.level does not directly set MathML's script level. MathML does that itself. - // We use style.level to track, not set, math style so that we can get the - // correct scriptlevel when needed in supsub.js, mathchoice.js, or for dimensions in em. - this.level = data.level; - this.color = data.color; // string | void - // A font family applies to a group of fonts (i.e. SansSerif), while a font - // represents a specific font (i.e. SansSerif Bold). - // See: https://tex.stackexchange.com/questions/22350/difference-between-textrm-and-mathrm - this.font = data.font || ""; // string - this.fontFamily = data.fontFamily || ""; // string - this.fontSize = data.fontSize || 1.0; // number - this.fontWeight = data.fontWeight || ""; - this.fontShape = data.fontShape || ""; - this.maxSize = data.maxSize; // [number, number] - } - - /** - * Returns a new style object with the same properties as "this". Properties - * from "extension" will be copied to the new style object. - */ - extend(extension) { - const data = { - level: this.level, - color: this.color, - font: this.font, - fontFamily: this.fontFamily, - fontSize: this.fontSize, - fontWeight: this.fontWeight, - fontShape: this.fontShape, - maxSize: this.maxSize - }; - - for (const key in extension) { - if (Object.prototype.hasOwnProperty.call(extension, key)) { - data[key] = extension[key]; - } - } - - return new Style(data); - } - - withLevel(n) { - return this.extend({ - level: n - }); - } - - incrementLevel() { - return this.extend({ - level: Math.min(this.level + 1, 3) - }); - } - - inSubOrSup() { - return this.extend({ - level: subOrSupLevel[this.level] - }) - } - - /** - * Create a new style object with the given color. - */ - withColor(color) { - return this.extend({ - color: color - }); - } - - /** - * Creates a new style object with the given math font or old text font. - * @type {[type]} - */ - withFont(font) { - return this.extend({ - font - }); - } - - /** - * Create a new style objects with the given fontFamily. - */ - withTextFontFamily(fontFamily) { - return this.extend({ - fontFamily, - font: "" - }); - } - - /** - * Creates a new style object with the given font size - */ - withFontSize(num) { - return this.extend({ - fontSize: num - }); - } - - /** - * Creates a new style object with the given font weight - */ - withTextFontWeight(fontWeight) { - return this.extend({ - fontWeight, - font: "" - }); - } - - /** - * Creates a new style object with the given font weight - */ - withTextFontShape(fontShape) { - return this.extend({ - fontShape, - font: "" - }); - } - - /** - * Gets the CSS color of the current style object - */ - getColor() { - return this.color; - } -} - -export default Style; diff --git a/src/Token.js b/src/Token.js deleted file mode 100644 index fce73082..00000000 --- a/src/Token.js +++ /dev/null @@ -1,40 +0,0 @@ -import SourceLocation from "./SourceLocation"; - -/** - * Interface required to break circular dependency between Token, Lexer, and - * ParseError. - */ - -/** - * The resulting token returned from `lex`. - * - * It consists of the token text plus some position information. - * The position information is essentially a range in an input string, - * but instead of referencing the bare input string, we refer to the lexer. - * That way it is possible to attach extra metadata to the input string, - * like for example a file name or similar. - * - * The position information is optional, so it is OK to construct synthetic - * tokens if appropriate. Not providing available position information may - * lead to degraded error reporting, though. - */ -export class Token { - constructor( - text, // the text of this token - loc - ) { - this.text = text; - this.loc = loc; - } - - /** - * Given a pair of tokens (this and endToken), compute a `Token` encompassing - * the whole input range enclosed by these two. - */ - range( - endToken, // last token of the range, inclusive - text // the text of the newly constructed token - ) { - return new Token(text, SourceLocation.range(this, endToken)); - } -} diff --git a/src/asciiFromScript.js b/src/asciiFromScript.js deleted file mode 100644 index 8a5e2616..00000000 --- a/src/asciiFromScript.js +++ /dev/null @@ -1,29 +0,0 @@ -// Used for Unicode input of calligraphic and script letters -export const asciiFromScript = Object.freeze({ - "\ud835\udc9c": "A", - "\u212c": "B", - "\ud835\udc9e": "C", - "\ud835\udc9f": "D", - "\u2130": "E", - "\u2131": "F", - "\ud835\udca2": "G", - "\u210B": "H", - "\u2110": "I", - "\ud835\udca5": "J", - "\ud835\udca6": "K", - "\u2112": "L", - "\u2133": "M", - "\ud835\udca9": "N", - "\ud835\udcaa": "O", - "\ud835\udcab": "P", - "\ud835\udcac": "Q", - "\u211B": "R", - "\ud835\udcae": "S", - "\ud835\udcaf": "T", - "\ud835\udcb0": "U", - "\ud835\udcb1": "V", - "\ud835\udcb2": "W", - "\ud835\udcb3": "X", - "\ud835\udcb4": "Y", - "\ud835\udcb5": "Z" -}) diff --git a/src/buildMathML.js b/src/buildMathML.js deleted file mode 100644 index 6f1590e8..00000000 --- a/src/buildMathML.js +++ /dev/null @@ -1,290 +0,0 @@ -/** - * This file converts a parse tree into a corresponding MathML tree. The main - * entry point is the `buildMathML` function, which takes a parse tree from the - * parser. - */ - -import mathMLTree from "./mathMLTree" -import ParseError from "./ParseError" -import symbols, { ligatures } from "./symbols" -import { _mathmlGroupBuilders as groupBuilders } from "./defineFunction" -import { MathNode } from "./mathMLTree" -import { DocumentFragment } from "./tree" -import setLineBreaks from "./linebreaking" - -/** - * Takes a symbol and converts it into a MathML text node after performing - * optional replacement from symbols.js. - */ -export const makeText = function(text, mode, style) { - if ( - symbols[mode][text] && - symbols[mode][text].replace && - text.charCodeAt(0) !== 0xd835 && - !( - Object.prototype.hasOwnProperty.call(ligatures, text) && - style && - ((style.fontFamily && style.fontFamily.slice(4, 6) === "tt") || - (style.font && style.font.slice(4, 6) === "tt")) - ) - ) { - text = symbols[mode][text].replace; - } - - return new mathMLTree.TextNode(text); -}; - -export const consolidateText = mrow => { - // If possible, consolidate adjacent elements into a single element. - if (mrow.type !== "mrow" && mrow.type !== "mstyle") { return mrow } - if (mrow.children.length === 0) { return mrow } // empty group, e.g., \text{} - if (!mrow.children[0].attributes || mrow.children[0].type !== "mtext") { return mrow } - const variant = mrow.children[0].attributes.mathvariant || "" - const mtext = new mathMLTree.MathNode( - "mtext", - [new mathMLTree.TextNode(mrow.children[0].children[0].text)] - ) - for (let i = 1; i < mrow.children.length; i++) { - // Check each child and, if possible, copy the character into child[0]. - const localVariant = mrow.children[i].attributes.mathvariant || "" - if (mrow.children[i].type === "mrow") { - const childRow = mrow.children[i] - for (let j = 0; j < childRow.children.length; j++) { - // We'll also check the children of a mrow. One level only. No recursion. - const childVariant = childRow.children[j].attributes.mathvariant || "" - if (childVariant !== variant || childRow.children[j].type !== "mtext") { - return mrow // At least one element cannot be consolidated. Get out. - } else { - mtext.children[0].text += childRow.children[j].children[0].text - } - } - } else if (localVariant !== variant || mrow.children[i].type !== "mtext") { - return mrow - } else { - mtext.children[0].text += mrow.children[i].children[0].text - } - } - // Firefox does not render a space at either end of an string. - // To get proper rendering, we replace leading or trailing spaces with no-break spaces. - if (mtext.children[0].text.charAt(0) === " ") { - mtext.children[0].text = "\u00a0" + mtext.children[0].text.slice(1) - } - const L = mtext.children[0].text.length - if (L > 0 && mtext.children[0].text.charAt(L - 1) === " ") { - mtext.children[0].text = mtext.children[0].text.slice(0, -1) + "\u00a0" - } - for (const [key, value] of Object.entries(mrow.attributes)) { - mtext.attributes[key] = value - } - return mtext -} - -const numberRegEx = /^[0-9]$/ -const isDotOrComma = (node, followingNode) => { - return ((node.type === "textord" && node.text === ".") || - (node.type === "atom" && node.text === ",")) && - // Don't consolidate if there is a space after the comma. - node.loc && followingNode.loc && node.loc.end === followingNode.loc.start -} -const consolidateNumbers = expression => { - // Consolidate adjacent numbers. We want to return 1,506.3, - // not 1,506.3 - if (expression.length < 2) { return } - const nums = []; - let inNum = false - // Find adjacent numerals - for (let i = 0; i < expression.length; i++) { - const node = expression[i]; - if (node.type === "textord" && numberRegEx.test(node.text)) { - if (!inNum) { nums.push({ start: i }) } - inNum = true - } else { - if (inNum) { nums[nums.length - 1].end = i - 1 } - inNum = false - } - } - if (inNum) { nums[nums.length - 1].end = expression.length - 1 } - - // Determine if numeral groups are separated by a comma or dot. - for (let i = nums.length - 1; i > 0; i--) { - if (nums[i - 1].end === nums[i].start - 2 && - isDotOrComma(expression[nums[i].start - 1], expression[nums[i].start])) { - // Merge the two groups. - nums[i - 1].end = nums[i].end - nums.splice(i, 1) - } - } - - // Consolidate the number nodes - for (let i = nums.length - 1; i >= 0; i--) { - for (let j = nums[i].start + 1; j <= nums[i].end; j++) { - expression[nums[i].start].text += expression[j].text - } - expression.splice(nums[i].start + 1, nums[i].end - nums[i].start) - // Check if the is followed by a numeric base in a supsub, e.g. the "3" in 123^4 - // If so, merge the first into the base. - if (expression.length > nums[i].start + 1) { - const nextTerm = expression[nums[i].start + 1]; - if (nextTerm.type === "supsub" && nextTerm.base && nextTerm.base.type === "textord" && - numberRegEx.test(nextTerm.base.text)) { - nextTerm.base.text = expression[nums[i].start].text + nextTerm.base.text - expression.splice(nums[i].start, 1) - } - } - } -} - -/** - * Wrap the given array of nodes in an node if needed, i.e., - * unless the array has length 1. Always returns a single node. - */ -export const makeRow = function(body, semisimple = false) { - if (body.length === 1 && !(body[0] instanceof DocumentFragment)) { - return body[0]; - } else if (!semisimple) { - // Suppress spacing on nodes at both ends of the row. - if (body[0] instanceof MathNode && body[0].type === "mo" && !body[0].attributes.fence) { - body[0].attributes.lspace = "0em" - body[0].attributes.rspace = "0em" - } - const end = body.length - 1 - if (body[end] instanceof MathNode && body[end].type === "mo" && !body[end].attributes.fence) { - body[end].attributes.lspace = "0em" - body[end].attributes.rspace = "0em" - } - } - return new mathMLTree.MathNode("mrow", body); -}; - -const isRel = item => { - return (item.type === "atom" && item.family === "rel") || - (item.type === "mclass" && item.mclass === "mrel") -} - -/** - * Takes a list of nodes, builds them, and returns a list of the generated - * MathML nodes. Also do a couple chores along the way: - * (1) Suppress spacing when an author wraps an operator w/braces, as in {=}. - * (2) Suppress spacing between two adjacent relations. - */ -export const buildExpression = function(expression, style, semisimple = false) { - if (!semisimple && expression.length === 1) { - const group = buildGroup(expression[0], style); - if (group instanceof MathNode && group.type === "mo") { - // When TeX writers want to suppress spacing on an operator, - // they often put the operator by itself inside braces. - group.setAttribute("lspace", "0em"); - group.setAttribute("rspace", "0em"); - } - return [group]; - } - - consolidateNumbers(expression) - - const groups = []; - for (let i = 0; i < expression.length; i++) { - const group = buildGroup(expression[i], style); - // Suppress spacing between adjacent relations - if (i < expression.length - 1 && isRel(expression[i]) && isRel(expression[i + 1])) { - group.setAttribute("rspace", "0em") - } - if (i > 0 && isRel(expression[i]) && isRel(expression[i - 1])) { - group.setAttribute("lspace", "0em") - } - groups.push(group); - } - return groups; -}; - -/** - * Equivalent to buildExpression, but wraps the elements in an - * if there's more than one. Returns a single node instead of an array. - */ -export const buildExpressionRow = function(expression, style, semisimple = false) { - return makeRow(buildExpression(expression, style, semisimple), semisimple); -}; - -/** - * Takes a group from the parser and calls the appropriate groupBuilders function - * on it to produce a MathML node. - */ -export const buildGroup = function(group, style) { - if (!group) { - return new mathMLTree.MathNode("mrow"); - } - - if (groupBuilders[group.type]) { - // Call the groupBuilders function - const result = groupBuilders[group.type](group, style); - return result; - } else { - throw new ParseError("Got group of unknown type: '" + group.type + "'"); - } -}; - -const glue = _ => { - return new mathMLTree.MathNode("mtd", [], [], { padding: "0", width: "50%" }) -} - -const taggedExpression = (expression, tag, style, leqno) => { - tag = buildExpressionRow(tag[0].body, style) - tag = consolidateText(tag) - tag.classes.push("tml-tag") - - expression = new mathMLTree.MathNode("mtd", [expression]) - const rowArray = [glue(), expression, glue()] - rowArray[leqno ? 0 : 2].classes.push(leqno ? "tml-left" : "tml-right") - rowArray[leqno ? 0 : 2].children.push(tag) - const mtr = new mathMLTree.MathNode("mtr", rowArray, ["tml-tageqn"]) - const table = new mathMLTree.MathNode("mtable", [mtr]) - table.style.width = "100%" - table.setAttribute("displaystyle", "true") - return table -} - -/** - * Takes a full parse tree and settings and builds a MathML representation of - * it. - */ -export default function buildMathML(tree, texExpression, style, settings) { - // Strip off outer tag wrapper for processing below. - let tag = null - if (tree.length === 1 && tree[0].type === "tag") { - tag = tree[0].tag - tree = tree[0].body - } - - const expression = buildExpression(tree, style); - const wrap = (settings.displayMode || settings.annotate) ? "none" : settings.wrap - - const n1 = expression.length === 0 ? null : expression[0] - let wrapper = expression.length === 1 && tag === null && (n1 instanceof MathNode) - ? expression[0] - : setLineBreaks(expression, wrap, settings.displayMode) - - if (tag) { - wrapper = taggedExpression(wrapper, tag, style, settings.leqno) - } - - if (settings.annotate) { - // Build a TeX annotation of the source - const annotation = new mathMLTree.MathNode( - "annotation", [new mathMLTree.TextNode(texExpression)]); - annotation.setAttribute("encoding", "application/x-tex"); - wrapper = new mathMLTree.MathNode("semantics", [wrapper, annotation]); - } - - const math = new mathMLTree.MathNode("math", [wrapper]) - - if (settings.xml) { - math.setAttribute("xmlns", "http://www.w3.org/1998/Math/MathML") - } - if (settings.displayMode) { - math.setAttribute("display", "block"); - math.style.display = "block math" // necessary in Chromium. - // Firefox and Safari do not recognize display: "block math". - // Set a class so that the CSS file can set display: block. - math.classes = ["tml-display"] - } - return math; -} diff --git a/src/constants.js b/src/constants.js deleted file mode 100644 index d568fd3a..00000000 --- a/src/constants.js +++ /dev/null @@ -1,25 +0,0 @@ -// In TeX, there are actually three sets of dimensions, one for each of -// textstyle, scriptstyle, and scriptscriptstyle. These are -// provided in the the arrays below, in that order. -// -export const metrics = { - quad: [1.0, 1.171, 1.472], // Extracted from TeX - - // The TeX default rule thickness, 0.04 em, often disappears from a browser screen. - // So we use a thicker rule. - defaultRuleThickness: [0.06, 0.074, 0.074], - - // The space between adjacent `|` columns in an array definition. - doubleRuleSep: [0.3, 0.3, 0.3], - - // The width of separator lines in {array} environments. - arrayRuleWidth: [0.06, 0.06, 0.04] -}; - -// Math style is not quite the same thing as script level. -export const StyleLevel = { - DISPLAY: 0, - TEXT: 1, - SCRIPT: 2, - SCRIPTSCRIPT: 3 -}; diff --git a/src/defineEnvironment.js b/src/defineEnvironment.js deleted file mode 100644 index a85b419f..00000000 --- a/src/defineEnvironment.js +++ /dev/null @@ -1,25 +0,0 @@ -import { _mathmlGroupBuilders } from "./defineFunction"; - -/** - * All registered environments. - * `environments.js` exports this same dictionary again and makes it public. - * `Parser.js` requires this dictionary via `environments.js`. - */ -export const _environments = {}; - -export default function defineEnvironment({ type, names, props, handler, mathmlBuilder }) { - // Set default values of environments. - const data = { - type, - numArgs: props.numArgs || 0, - allowedInText: false, - numOptionalArgs: 0, - handler - }; - for (let i = 0; i < names.length; ++i) { - _environments[names[i]] = data; - } - if (mathmlBuilder) { - _mathmlGroupBuilders[type] = mathmlBuilder; - } -} diff --git a/src/defineFunction.js b/src/defineFunction.js deleted file mode 100644 index 6733612a..00000000 --- a/src/defineFunction.js +++ /dev/null @@ -1,69 +0,0 @@ -/** - * All registered functions. - * `functions.js` just exports this same dictionary again and makes it public. - * `Parser.js` requires this dictionary. - */ -export const _functions = {} - -/** - * All MathML builders. Should be only used in the `define*` and the `build*ML` - * functions. - */ -export const _mathmlGroupBuilders = {} - -export default function defineFunction({ - type, - names, - props, - handler, - mathmlBuilder -}) { - // Set default values of functions - const data = { - type, - numArgs: props.numArgs, - argTypes: props.argTypes, - allowedInArgument: !!props.allowedInArgument, - allowedInText: !!props.allowedInText, - allowedInMath: props.allowedInMath === undefined ? true : props.allowedInMath, - numOptionalArgs: props.numOptionalArgs || 0, - infix: !!props.infix, - primitive: !!props.primitive, - handler: handler - } - for (let i = 0; i < names.length; ++i) { - _functions[names[i]] = data - } - if (type) { - if (mathmlBuilder) { - _mathmlGroupBuilders[type] = mathmlBuilder - } - } -} - -/** - * Use this to register only the MathML builder for a function(e.g. - * if the function's ParseNode is generated in Parser.js rather than via a - * stand-alone handler provided to `defineFunction`). - */ -export function defineFunctionBuilders({ type, mathmlBuilder }) { - defineFunction({ - type, - names: [], - props: { numArgs: 0 }, - handler() { - throw new Error("Should never be called.") - }, - mathmlBuilder - }) -} - -export const normalizeArgument = function(arg) { - return arg.type === "ordgroup" && arg.body.length === 1 ? arg.body[0] : arg -} - -// Since the corresponding buildMathML function expects a -// list of elements, we normalize for different kinds of arguments -export const ordargument = function(arg) { - return arg.type === "ordgroup" ? arg.body : [arg] -} diff --git a/src/defineMacro.js b/src/defineMacro.js deleted file mode 100644 index 130371cc..00000000 --- a/src/defineMacro.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * All registered global/built-in macros. - * `macros.js` exports this same dictionary again and makes it public. - * `Parser.js` requires this dictionary via `macros.js`. - */ -export const _macros = {}; - -// This function might one day accept an additional argument and do more things. -export default function defineMacro(name, body) { - _macros[name] = body; -} diff --git a/src/domTree.js b/src/domTree.js deleted file mode 100644 index 54523ec5..00000000 --- a/src/domTree.js +++ /dev/null @@ -1,185 +0,0 @@ -/** - * These objects store the data about the DOM nodes we create, as well as some - * extra data. They can then be transformed into real DOM nodes with the - * `toNode` function or HTML markup using `toMarkup`. They are useful for both - * storing extra properties on the nodes, as well as providing a way to easily - * work with the DOM. - * - * Similar functions for working with MathML nodes exist in mathMLTree.js. - * - */ -import utils from "./utils"; - -/** - * Create an HTML className based on a list of classes. In addition to joining - * with spaces, we also remove empty classes. - */ -export const createClass = function(classes) { - return classes.filter((cls) => cls).join(" "); -}; - -const initNode = function(classes, style) { - this.classes = classes || []; - this.attributes = {}; - this.style = style || {}; -}; - -/** - * Convert into an HTML node - */ -const toNode = function(tagName) { - const node = document.createElement(tagName); - - // Apply the class - node.className = createClass(this.classes); - - // Apply inline styles - for (const style in this.style) { - if (Object.prototype.hasOwnProperty.call(this.style, style )) { - node.style[style] = this.style[style]; - } - } - - // Apply attributes - for (const attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr )) { - node.setAttribute(attr, this.attributes[attr]); - } - } - - // Append the children, also as HTML nodes - for (let i = 0; i < this.children.length; i++) { - node.appendChild(this.children[i].toNode()); - } - - return node; -}; - -/** - * Convert into an HTML markup string - */ -const toMarkup = function(tagName) { - let markup = `<${tagName}`; - - // Add the class - if (this.classes.length) { - markup += ` class="${utils.escape(createClass(this.classes))}"`; - } - - let styles = ""; - - // Add the styles, after hyphenation - for (const style in this.style) { - if (Object.prototype.hasOwnProperty.call(this.style, style )) { - styles += `${utils.hyphenate(style)}:${this.style[style]};`; - } - } - - if (styles) { - markup += ` style="${styles}"`; - } - - // Add the attributes - for (const attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr )) { - markup += ` ${attr}="${utils.escape(this.attributes[attr])}"`; - } - } - - markup += ">"; - - // Add the markup of the children, also as markup - for (let i = 0; i < this.children.length; i++) { - markup += this.children[i].toMarkup(); - } - - markup += ``; - - return markup; -}; - -/** - * This node represents a span node, with a className, a list of children, and - * an inline style. - * - */ -export class Span { - constructor(classes, children, style) { - initNode.call(this, classes, style); - this.children = children || []; - } - - setAttribute(attribute, value) { - this.attributes[attribute] = value; - } - - toNode() { - return toNode.call(this, "span"); - } - - toMarkup() { - return toMarkup.call(this, "span"); - } -} - -export class TextNode { - constructor(text) { - this.text = text; - } - toNode() { - return document.createTextNode(this.text); - } - toMarkup() { - return utils.escape(this.text); - } -} - -/* - * This node represents an image embed () element. - */ -export class Img { - constructor(src, alt, style) { - this.alt = alt; - this.src = src; - this.classes = ["mord"]; - this.style = style; - } - - hasClass(className) { - return this.classes.includes(className); - } - - toNode() { - const node = document.createElement("img"); - node.src = this.src; - node.alt = this.alt; - node.className = "mord"; - - // Apply inline styles - for (const style in this.style) { - if (Object.prototype.hasOwnProperty.call(this.style, style )) { - node.style[style] = this.style[style]; - } - } - - return node; - } - - toMarkup() { - let markup = `${this.alt} { - const settings = context.parser.settings; - if (!settings.displayMode) { - throw new ParseError(`{${context.envName}} can be used only in display mode.`); - } -} - -const getTag = (group, style, rowNum) => { - let tag - const tagContents = group.tags.shift() - if (tagContents) { - // The author has written a \tag or a \notag in this row. - if (tagContents.body) { - tag = mml.buildExpressionRow(tagContents.body, style, true) - tag.classes = ["tml-tag"] - } else { - // \notag. Return an empty span. - tag = new mathMLTree.MathNode("mtext", [], []) - return tag - } - } else if (group.envClasses.includes("multline") && - ((group.leqno && rowNum !== 0) || (!group.leqno && rowNum !== group.body.length - 1))) { - // A multiline that does not receive a tag. Return an empty cell. - tag = new mathMLTree.MathNode("mtext", [], []) - return tag - } else { - // AMS automatcally numbered equaton. - // Insert a class so the element can be populated by a CSS counter. - // WebKit will display the CSS counter only inside a span. - tag = new mathMLTree.MathNode("mtext", [new Span(["tml-eqn"])]) - } - return tag -} - -/** - * Parse the body of the environment, with rows delimited by \\ and - * columns delimited by &, and create a nested list in row-major order - * with one group per cell. If given an optional argument scriptLevel - * ("text", "display", etc.), then each cell is cast into that scriptLevel. - */ -function parseArray( - parser, - { - cols, // [{ type: string , align: l|c|r|null }] - envClasses, // align(ed|at|edat) | array | cases | cd | small | multline - addEqnNum, // boolean - singleRow, // boolean - emptySingleRow, // boolean - maxNumCols, // number - leqno // boolean - }, - scriptLevel -) { - parser.gullet.beginGroup(); - if (!singleRow) { - // \cr is equivalent to \\ without the optional size argument (see below) - // TODO: provide helpful error when \cr is used outside array environment - parser.gullet.macros.set("\\cr", "\\\\\\relax"); - } - if (addEqnNum) { - parser.gullet.macros.set("\\tag", "\\@ifstar\\envtag@literal\\envtag@paren") - parser.gullet.macros.set("\\envtag@paren", "\\env@tag{{(\\text{#1})}}"); - parser.gullet.macros.set("\\envtag@literal", "\\env@tag{\\text{#1}}") - parser.gullet.macros.set("\\notag", "\\env@notag"); - parser.gullet.macros.set("\\nonumber", "\\env@notag") - } - - // Start group for first cell - parser.gullet.beginGroup(); - - let row = []; - const body = [row]; - const rowGaps = []; - const tags = []; - let rowTag; - const hLinesBeforeRow = []; - - // Test for \hline at the top of the array. - hLinesBeforeRow.push(getHLines(parser)); - - // eslint-disable-next-line no-constant-condition - while (true) { - // Parse each cell in its own group (namespace) - let cell = parser.parseExpression(false, singleRow ? "\\end" : "\\\\"); - - if (addEqnNum && !rowTag) { - // Check if the author wrote a \tag{} inside this cell. - for (let i = 0; i < cell.length; i++) { - if (cell[i].type === "envTag" || cell[i].type === "noTag") { - // Get the contents of the \text{} nested inside the \env@Tag{} - rowTag = cell[i].type === "envTag" - ? cell.splice(i, 1)[0].body.body[0] - : { body: null }; - break - } - } - } - parser.gullet.endGroup(); - parser.gullet.beginGroup(); - - cell = { - type: "ordgroup", - mode: parser.mode, - body: cell, - semisimple: true - }; - row.push(cell); - const next = parser.fetch().text; - if (next === "&") { - if (maxNumCols && row.length === maxNumCols) { - if (envClasses.includes("array")) { - if (parser.settings.strict) { - throw new ParseError("Too few columns " + "specified in the {array} column argument.", - parser.nextToken) - } - } else if (maxNumCols === 2) { - throw new ParseError("The split environment accepts no more than two columns", - parser.nextToken); - } else { - throw new ParseError("The equation environment accepts only one column", - parser.nextToken) - } - } - parser.consume(); - } else if (next === "\\end") { - // Arrays terminate newlines with `\crcr` which consumes a `\cr` if - // the last line is empty. However, AMS environments keep the - // empty row if it's the only one. - // NOTE: Currently, `cell` is the last item added into `row`. - if (row.length === 1 && cell.body.length === 0 && (body.length > 1 || !emptySingleRow)) { - body.pop(); - } - if (hLinesBeforeRow.length < body.length + 1) { - hLinesBeforeRow.push([]); - } - break; - } else if (next === "\\\\") { - parser.consume(); - let size; - // \def\Let@{\let\\\math@cr} - // \def\math@cr{...\math@cr@} - // \def\math@cr@{\new@ifnextchar[\math@cr@@{\math@cr@@[\z@]}} - // \def\math@cr@@[#1]{...\math@cr@@@...} - // \def\math@cr@@@{\cr} - if (parser.gullet.future().text !== " ") { - size = parser.parseSizeGroup(true); - } - rowGaps.push(size ? size.value : null); - - tags.push(rowTag) - - // check for \hline(s) following the row separator - hLinesBeforeRow.push(getHLines(parser)); - - row = []; - rowTag = null; - body.push(row); - } else { - throw new ParseError("Expected & or \\\\ or \\cr or \\end", parser.nextToken); - } - } - - // End cell group - parser.gullet.endGroup(); - // End array group defining \cr - parser.gullet.endGroup(); - - tags.push(rowTag) - - return { - type: "array", - mode: parser.mode, - body, - cols, - rowGaps, - hLinesBeforeRow, - envClasses, - addEqnNum, - scriptLevel, - tags, - leqno - }; -} - -// Decides on a scriptLevel for cells in an array according to whether the given -// environment name starts with the letter 'd'. -function dCellStyle(envName) { - return envName.slice(0, 1) === "d" ? "display" : "text" -} - -const alignMap = { - c: "center ", - l: "left ", - r: "right " -}; - -const glue = group => { - const glueNode = new mathMLTree.MathNode("mtd", []) - glueNode.style = { padding: "0", width: "50%" } - if (group.envClasses.includes("multline")) { - glueNode.style.width = "7.5%" - } - return glueNode -} - -const mathmlBuilder = function(group, style) { - const tbl = []; - const numRows = group.body.length - const hlines = group.hLinesBeforeRow; - - for (let i = 0; i < numRows; i++) { - const rw = group.body[i]; - const row = []; - const cellLevel = group.scriptLevel === "text" - ? StyleLevel.TEXT - : group.scriptLevel === "script" - ? StyleLevel.SCRIPT - : StyleLevel.DISPLAY - - for (let j = 0; j < rw.length; j++) { - const mtd = new mathMLTree.MathNode( - "mtd", - [mml.buildGroup(rw[j], style.withLevel(cellLevel))] - ) - - if (group.envClasses.includes("multline")) { - const align = i === 0 ? "left" : i === numRows - 1 ? "right" : "center" - mtd.setAttribute("columnalign", align) - if (align !== "center") { - mtd.classes.push("tml-" + align) - } - } - row.push(mtd) - } - if (group.addEqnNum) { - row.unshift(glue(group)); - row.push(glue(group)); - const tag = getTag(group, style.withLevel(cellLevel), i) - if (group.leqno) { - row[0].children.push(tag) - row[0].classes.push("tml-left") - } else { - row[row.length - 1].children.push(tag) - row[row.length - 1].classes.push("tml-right") - } - } - const mtr = new mathMLTree.MathNode("mtr", row, []) - // Write horizontal rules - if (i === 0 && hlines[0].length > 0) { - if (hlines[0].length === 2) { - mtr.children.forEach(cell => { cell.style.borderTop = "0.15em double" }) - } else { - mtr.children.forEach(cell => { - cell.style.borderTop = hlines[0][0] ? "0.06em dashed" : "0.06em solid" - }) - } - } - if (hlines[i + 1].length > 0) { - if (hlines[i + 1].length === 2) { - mtr.children.forEach(cell => { cell.style.borderBottom = "0.15em double" }) - } else { - mtr.children.forEach(cell => { - cell.style.borderBottom = hlines[i + 1][0] ? "0.06em dashed" : "0.06em solid" - }) - } - } - tbl.push(mtr); - } - - if (group.envClasses.length > 0) { - const pad = group.envClasses.includes("jot") - ? "0.7" // 0.5ex + 0.09em top & bot padding - : group.envClasses.includes("small") - ? "0.35" - : "0.5" // 0.5ex default top & bot padding - const sidePadding = group.envClasses.includes("abut") - ? "0" - : group.envClasses.includes("cases") - ? "0" - : group.envClasses.includes("small") - ? "0.1389" - : group.envClasses.includes("cd") - ? "0.25" - : "0.4" // default side padding - - const numCols = tbl.length === 0 ? 0 : tbl[0].children.length - - const sidePad = (j, hand) => { - if (j === 0 && hand === 0) { return "0" } - if (j === numCols - 1 && hand === 1) { return "0" } - if (group.envClasses[0] !== "align") { return sidePadding } - if (hand === 1) { return "0" } - if (group.addEqnNum) { - return (j % 2) ? "1" : "0" - } else { - return (j % 2) ? "0" : "1" - } - } - - // Padding - for (let i = 0; i < tbl.length; i++) { - for (let j = 0; j < tbl[i].children.length; j++) { - tbl[i].children[j].style.padding = `${pad}ex ${sidePad(j, 1)}em ${pad}ex ${sidePad(j, 0)}em` - } - } - - // Justification - const align = group.envClasses.includes("align") || group.envClasses.includes("alignat") - for (let i = 0; i < tbl.length; i++) { - const row = tbl[i]; - if (align) { - for (let j = 0; j < row.children.length; j++) { - // Chromium does not recognize text-align: left. Use -webkit- - // TODO: Remove -webkit- when Chromium no longer needs it. - row.children[j].classes = ["tml-" + (j % 2 ? "left" : "right")] - } - if (group.addEqnNum) { - const k = group.leqno ? 0 : row.children.length - 1 - row.children[k].classes = ["tml-" + (group.leqno ? "left" : "right")] - } - } - if (row.children.length > 1 && group.envClasses.includes("cases")) { - row.children[1].style.padding = row.children[1].style.padding.replace(/0em$/, "1em") - } - - if (group.envClasses.includes("cases") || group.envClasses.includes("subarray")) { - for (const cell of row.children) { - cell.classes.push("tml-left") - } - } - } - } else { - // Set zero padding on side of the matrix - for (let i = 0; i < tbl.length; i++) { - tbl[i].children[0].style.paddingLeft = "0em" - if (tbl[i].children.length === tbl[0].children.length) { - tbl[i].children[tbl[i].children.length - 1].style.paddingRight = "0em" - } - } - } - - let table = new mathMLTree.MathNode("mtable", tbl) - if (group.scriptLevel === "display") { table.setAttribute("displaystyle", "true") } - - if (group.addEqnNum || group.envClasses.includes("multline")) { - table.style.width = "100%" - } - - // Column separator lines and column alignment - let align = ""; - - if (group.cols && group.cols.length > 0) { - const cols = group.cols; - let prevTypeWasAlign = false; - let iStart = 0; - let iEnd = cols.length; - - while (cols[iStart].type === "separator") { - iStart += 1 - } - while (cols[iEnd - 1].type === "separator") { - iEnd -= 1 - } - - if (cols[0].type === "separator") { - const sep = cols[1].type === "separator" - ? "0.15em double" - : cols[0].separator === "|" - ? "0.06em solid " - : "0.06em dashed " - for (const row of table.children) { - row.children[0].style.borderLeft = sep - } - } - let iCol = group.addEqnNum ? 0 : -1 - for (let i = iStart; i < iEnd; i++) { - if (cols[i].type === "align") { - const colAlign = alignMap[cols[i].align]; - align += colAlign - iCol += 1 - for (const row of table.children) { - if (colAlign.trim() !== "center" && iCol < row.children.length) { - row.children[iCol].classes = ["tml-" + colAlign.trim()] - } - } - prevTypeWasAlign = true; - } else if (cols[i].type === "separator") { - // MathML accepts only single lines between cells. - // So we read only the first of consecutive separators. - if (prevTypeWasAlign) { - const sep = cols[i + 1].type === "separator" - ? "0.15em double" - : cols[i].separator === "|" - ? "0.06em solid" - : "0.06em dashed" - for (const row of table.children) { - if (iCol < row.children.length) { - row.children[iCol].style.borderRight = sep - } - } - } - prevTypeWasAlign = false - } - } - if (cols[cols.length - 1].type === "separator") { - const sep = cols[cols.length - 2].type === "separator" - ? "0.15em double" - : cols[cols.length - 1].separator === "|" - ? "0.06em solid" - : "0.06em dashed" - for (const row of table.children) { - row.children[row.children.length - 1].style.borderRight = sep - row.children[row.children.length - 1].style.paddingRight = "0.4em" - } - } - } - if (group.addEqnNum) { - // allow for glue cells on each side - align = "left " + (align.length > 0 ? align : "center ") + "right " - } - if (align) { - // Firefox reads this attribute, not the -webkit-left|right written above. - // TODO: When Chrome no longer needs "-webkit-", use CSS and delete the next line. - table.setAttribute("columnalign", align.trim()) - } - - if (group.envClasses.includes("small")) { - // A small array. Wrap in scriptstyle. - table = new mathMLTree.MathNode("mstyle", [table]) - table.setAttribute("scriptlevel", "1") - } - - return table -}; - -// Convenience function for align, align*, aligned, alignat, alignat*, alignedat, split. -const alignedHandler = function(context, args) { - if (context.envName.indexOf("ed") === -1) { - validateAmsEnvironmentContext(context); - } - const cols = []; - const res = parseArray( - context.parser, - { - cols, - addEqnNum: context.envName === "align" || context.envName === "alignat", - emptySingleRow: true, - envClasses: ["abut", "jot"], // set row spacing & provisional column spacing - maxNumCols: context.envName === "split" ? 2 : undefined, - leqno: context.parser.settings.leqno - }, - "display" - ); - - // Determining number of columns. - // 1. If the first argument is given, we use it as a number of columns, - // and makes sure that each row doesn't exceed that number. - // 2. Otherwise, just count number of columns = maximum number - // of cells in each row ("aligned" mode -- isAligned will be true). - // - // At the same time, prepend empty group {} at beginning of every second - // cell in each row (starting with second cell) so that operators become - // binary. This behavior is implemented in amsmath's \start@aligned. - let numMaths; - let numCols = 0; - const isAlignedAt = context.envName.indexOf("at") > -1 - if (args[0] && isAlignedAt) { - // alignat environment takes an argument w/ number of columns - let arg0 = "" - for (let i = 0; i < args[0].body.length; i++) { - const textord = assertNodeType(args[0].body[i], "textord") - arg0 += textord.text - } - if (isNaN(arg0)) { - throw new ParseError("The alignat enviroment requires a numeric first argument.") - } - numMaths = Number(arg0) - numCols = numMaths * 2 - } - res.body.forEach(function(row) { - if (isAlignedAt) { - // Case 1 - const curMaths = row.length / 2; - if (numMaths < curMaths) { - throw new ParseError( - "Too many math in a row: " + `expected ${numMaths}, but got ${curMaths}`, - row[0] - ); - } - } else if (numCols < row.length) { - // Case 2 - numCols = row.length; - } - }); - - // Adjusting alignment. - // In aligned mode, we add one \qquad between columns; - // otherwise we add nothing. - for (let i = 0; i < numCols; ++i) { - let align = "r"; - if (i % 2 === 1) { - align = "l"; - } - cols[i] = { - type: "align", - align: align - }; - } - if (context.envName === "split") { - // Append no more classes - } else if (isAlignedAt) { - res.envClasses.push("alignat") // Sets justification - } else { - res.envClasses[0] = "align" // Sets column spacing & justification - } - return res; -}; - -// Arrays are part of LaTeX, defined in lttab.dtx so its documentation -// is part of the source2e.pdf file of LaTeX2e source documentation. -// {darray} is an {array} environment where cells are set in \displaystyle, -// as defined in nccmath.sty. -defineEnvironment({ - type: "array", - names: ["array", "darray"], - props: { - numArgs: 1 - }, - handler(context, args) { - // Since no types are specified above, the two possibilities are - // - The argument is wrapped in {} or [], in which case Parser's - // parseGroup() returns an "ordgroup" wrapping some symbol node. - // - The argument is a bare symbol node. - const symNode = checkSymbolNodeType(args[0]); - const colalign = symNode ? [args[0]] : assertNodeType(args[0], "ordgroup").body; - const cols = colalign.map(function(nde) { - const node = assertSymbolNodeType(nde); - const ca = node.text; - if ("lcr".indexOf(ca) !== -1) { - return { - type: "align", - align: ca - }; - } else if (ca === "|") { - return { - type: "separator", - separator: "|" - }; - } else if (ca === ":") { - return { - type: "separator", - separator: ":" - }; - } - throw new ParseError("Unknown column alignment: " + ca, nde); - }); - const res = { - cols, - envClasses: ["array"], - maxNumCols: cols.length - }; - return parseArray(context.parser, res, dCellStyle(context.envName)); - }, - mathmlBuilder -}); - -// The matrix environments of amsmath builds on the array environment -// of LaTeX, which is discussed above. -// The mathtools package adds starred versions of the same environments. -// These have an optional argument to choose left|center|right justification. -defineEnvironment({ - type: "array", - names: [ - "matrix", - "pmatrix", - "bmatrix", - "Bmatrix", - "vmatrix", - "Vmatrix", - "matrix*", - "pmatrix*", - "bmatrix*", - "Bmatrix*", - "vmatrix*", - "Vmatrix*" - ], - props: { - numArgs: 0 - }, - handler(context) { - const delimiters = { - matrix: null, - pmatrix: ["(", ")"], - bmatrix: ["[", "]"], - Bmatrix: ["\\{", "\\}"], - vmatrix: ["|", "|"], - Vmatrix: ["\\Vert", "\\Vert"] - }[context.envName.replace("*", "")]; - // \hskip -\arraycolsep in amsmath - let colAlign = "c"; - const payload = { - envClasses: [], - cols: [] - }; - if (context.envName.charAt(context.envName.length - 1) === "*") { - // It's one of the mathtools starred functions. - // Parse the optional alignment argument. - const parser = context.parser; - parser.consumeSpaces(); - if (parser.fetch().text === "[") { - parser.consume(); - parser.consumeSpaces(); - colAlign = parser.fetch().text; - if ("lcr".indexOf(colAlign) === -1) { - throw new ParseError("Expected l or c or r", parser.nextToken); - } - parser.consume(); - parser.consumeSpaces(); - parser.expect("]"); - parser.consume(); - payload.cols = []; - } - } - const res = parseArray(context.parser, payload, "text") - res.cols = new Array(res.body[0].length).fill({ type: "align", align: colAlign }) - return delimiters - ? { - type: "leftright", - mode: context.mode, - body: [res], - left: delimiters[0], - right: delimiters[1], - rightColor: undefined // \right uninfluenced by \color in array - } - : res; - }, - mathmlBuilder -}); - -defineEnvironment({ - type: "array", - names: ["smallmatrix"], - props: { - numArgs: 0 - }, - handler(context) { - const payload = { type: "small" }; - const res = parseArray(context.parser, payload, "script"); - res.envClasses = ["small"]; - return res; - }, - mathmlBuilder -}); - -defineEnvironment({ - type: "array", - names: ["subarray"], - props: { - numArgs: 1 - }, - handler(context, args) { - // Parsing of {subarray} is similar to {array} - const symNode = checkSymbolNodeType(args[0]); - const colalign = symNode ? [args[0]] : assertNodeType(args[0], "ordgroup").body; - const cols = colalign.map(function(nde) { - const node = assertSymbolNodeType(nde); - const ca = node.text; - // {subarray} only recognizes "l" & "c" - if ("lc".indexOf(ca) !== -1) { - return { - type: "align", - align: ca - }; - } - throw new ParseError("Unknown column alignment: " + ca, nde); - }); - if (cols.length > 1) { - throw new ParseError("{subarray} can contain only one column"); - } - let res = { - cols, - envClasses: ["small"] - }; - res = parseArray(context.parser, res, "script"); - if (res.body.length > 0 && res.body[0].length > 1) { - throw new ParseError("{subarray} can contain only one column"); - } - return res; - }, - mathmlBuilder -}); - -// A cases environment (in amsmath.sty) is almost equivalent to -// \def -// \left\{\begin{array}{@{}l@{\quad}l@{}} … \end{array}\right. -// {dcases} is a {cases} environment where cells are set in \displaystyle, -// as defined in mathtools.sty. -// {rcases} is another mathtools environment. It's brace is on the right side. -defineEnvironment({ - type: "array", - names: ["cases", "dcases", "rcases", "drcases"], - props: { - numArgs: 0 - }, - handler(context) { - const payload = { - cols: [], - envClasses: ["cases"] - }; - const res = parseArray(context.parser, payload, dCellStyle(context.envName)); - return { - type: "leftright", - mode: context.mode, - body: [res], - left: context.envName.indexOf("r") > -1 ? "." : "\\{", - right: context.envName.indexOf("r") > -1 ? "\\}" : ".", - rightColor: undefined - }; - }, - mathmlBuilder -}); - -// In the align environment, one uses ampersands, &, to specify number of -// columns in each row, and to locate spacing between each column. -// align gets automatic numbering. align* and aligned do not. -// The alignedat environment can be used in math mode. -defineEnvironment({ - type: "array", - names: ["align", "align*", "aligned", "split"], - props: { - numArgs: 0 - }, - handler: alignedHandler, - mathmlBuilder -}); - -// alignat environment is like an align environment, but one must explicitly -// specify maximum number of columns in each row, and can adjust where spacing occurs. -defineEnvironment({ - type: "array", - names: ["alignat", "alignat*", "alignedat"], - props: { - numArgs: 1 - }, - handler: alignedHandler, - mathmlBuilder -}); - -// A gathered environment is like an array environment with one centered -// column, but where rows are considered lines so get \jot line spacing -// and contents are set in \displaystyle. -defineEnvironment({ - type: "array", - names: ["gathered", "gather", "gather*"], - props: { - numArgs: 0 - }, - handler(context) { - if (context.envName !== "gathered") { - validateAmsEnvironmentContext(context); - } - const res = { - cols: [], - envClasses: ["abut", "jot"], - addEqnNum: context.envName === "gather", - emptySingleRow: true, - leqno: context.parser.settings.leqno - }; - return parseArray(context.parser, res, "display"); - }, - mathmlBuilder -}); - -defineEnvironment({ - type: "array", - names: ["equation", "equation*"], - props: { - numArgs: 0 - }, - handler(context) { - validateAmsEnvironmentContext(context); - const res = { - addEqnNum: context.envName === "equation", - emptySingleRow: true, - singleRow: true, - maxNumCols: 1, - envClasses: ["align"], - leqno: context.parser.settings.leqno - }; - return parseArray(context.parser, res, "display"); - }, - mathmlBuilder -}); - -defineEnvironment({ - type: "array", - names: ["multline", "multline*"], - props: { - numArgs: 0 - }, - handler(context) { - validateAmsEnvironmentContext(context); - const res = { - addEqnNum: context.envName === "multline", - maxNumCols: 1, - envClasses: ["jot", "multline"], - leqno: context.parser.settings.leqno - }; - return parseArray(context.parser, res, "display"); - }, - mathmlBuilder -}); - -defineEnvironment({ - type: "array", - names: ["CD"], - props: { - numArgs: 0 - }, - handler(context) { - validateAmsEnvironmentContext(context); - return parseCD(context.parser); - }, - mathmlBuilder -}); - -// Catch \hline outside array environment -defineFunction({ - type: "text", // Doesn't matter what this is. - names: ["\\hline", "\\hdashline"], - props: { - numArgs: 0, - allowedInText: true, - allowedInMath: true - }, - handler(context, args) { - throw new ParseError(`${context.funcName} valid only within array environment`); - } -}); diff --git a/src/environments/cd.js b/src/environments/cd.js deleted file mode 100644 index 7bc50d9c..00000000 --- a/src/environments/cd.js +++ /dev/null @@ -1,253 +0,0 @@ -import defineFunction from "../defineFunction"; -import mathMLTree from "../mathMLTree"; -import * as mml from "../buildMathML"; -import { assertSymbolNodeType } from "../parseNode"; -import ParseError from "../ParseError"; - -const cdArrowFunctionName = { - ">": "\\\\cdrightarrow", - "<": "\\\\cdleftarrow", - "=": "\\\\cdlongequal", - A: "\\uparrow", - V: "\\downarrow", - "|": "\\Vert", - ".": "no arrow" -}; - -const newCell = () => { - // Create an empty cell, to be filled below with parse nodes. - return { type: "styling", body: [], mode: "math", scriptLevel: "display" }; -}; - -const isStartOfArrow = (node) => { - return node.type === "textord" && node.text === "@"; -}; - -const isLabelEnd = (node, endChar) => { - return (node.type === "mathord" || node.type === "atom") && node.text === endChar; -}; - -function cdArrow(arrowChar, labels, parser) { - // Return a parse tree of an arrow and its labels. - // This acts in a way similar to a macro expansion. - const funcName = cdArrowFunctionName[arrowChar]; - switch (funcName) { - case "\\\\cdrightarrow": - case "\\\\cdleftarrow": - return parser.callFunction(funcName, [labels[0]], [labels[1]]); - case "\\uparrow": - case "\\downarrow": { - const leftLabel = parser.callFunction("\\\\cdleft", [labels[0]], []); - const bareArrow = { - type: "atom", - text: funcName, - mode: "math", - family: "rel" - }; - const sizedArrow = parser.callFunction("\\Big", [bareArrow], []); - const rightLabel = parser.callFunction("\\\\cdright", [labels[1]], []); - const arrowGroup = { - type: "ordgroup", - mode: "math", - body: [leftLabel, sizedArrow, rightLabel], - semisimple: true - }; - return parser.callFunction("\\\\cdparent", [arrowGroup], []); - } - case "\\\\cdlongequal": - return parser.callFunction("\\\\cdlongequal", [], []); - case "\\Vert": { - const arrow = { type: "textord", text: "\\Vert", mode: "math" }; - return parser.callFunction("\\Big", [arrow], []); - } - default: - return { type: "textord", text: " ", mode: "math" }; - } -} - -export function parseCD(parser) { - // Get the array's parse nodes with \\ temporarily mapped to \cr. - const parsedRows = []; - parser.gullet.beginGroup(); - parser.gullet.macros.set("\\cr", "\\\\\\relax"); - parser.gullet.beginGroup(); - while (true) { // eslint-disable-line no-constant-condition - // Get the parse nodes for the next row. - parsedRows.push(parser.parseExpression(false, "\\\\")); - parser.gullet.endGroup(); - parser.gullet.beginGroup(); - const next = parser.fetch().text; - if (next === "&" || next === "\\\\") { - parser.consume(); - } else if (next === "\\end") { - if (parsedRows[parsedRows.length - 1].length === 0) { - parsedRows.pop(); // final row ended in \\ - } - break; - } else { - throw new ParseError("Expected \\\\ or \\cr or \\end", parser.nextToken); - } - } - - let row = []; - const body = [row]; - - // Loop thru the parse nodes. Collect them into cells and arrows. - for (let i = 0; i < parsedRows.length; i++) { - // Start a new row. - const rowNodes = parsedRows[i]; - // Create the first cell. - let cell = newCell(); - - for (let j = 0; j < rowNodes.length; j++) { - if (!isStartOfArrow(rowNodes[j])) { - // If a parseNode is not an arrow, it goes into a cell. - cell.body.push(rowNodes[j]); - } else { - // Parse node j is an "@", the start of an arrow. - // Before starting on the arrow, push the cell into `row`. - row.push(cell); - - // Now collect parseNodes into an arrow. - // The character after "@" defines the arrow type. - j += 1; - const arrowChar = assertSymbolNodeType(rowNodes[j]).text; - - // Create two empty label nodes. We may or may not use them. - const labels = new Array(2); - labels[0] = { type: "ordgroup", mode: "math", body: [] }; - labels[1] = { type: "ordgroup", mode: "math", body: [] }; - - // Process the arrow. - if ("=|.".indexOf(arrowChar) > -1) { - // Three "arrows", ``@=`, `@|`, and `@.`, do not take labels. - // Do nothing here. - } else if ("<>AV".indexOf(arrowChar) > -1) { - // Four arrows, `@>>>`, `@<<<`, `@AAA`, and `@VVV`, each take - // two optional labels. E.g. the right-point arrow syntax is - // really: @>{optional label}>{optional label}> - // Collect parseNodes into labels. - for (let labelNum = 0; labelNum < 2; labelNum++) { - let inLabel = true; - for (let k = j + 1; k < rowNodes.length; k++) { - if (isLabelEnd(rowNodes[k], arrowChar)) { - inLabel = false; - j = k; - break; - } - if (isStartOfArrow(rowNodes[k])) { - throw new ParseError( - "Missing a " + arrowChar + " character to complete a CD arrow.", - rowNodes[k] - ); - } - - labels[labelNum].body.push(rowNodes[k]); - } - if (inLabel) { - // isLabelEnd never returned a true. - throw new ParseError( - "Missing a " + arrowChar + " character to complete a CD arrow.", - rowNodes[j] - ); - } - } - } else { - throw new ParseError(`Expected one of "<>AV=|." after @.`); - } - - // Now join the arrow to its labels. - const arrow = cdArrow(arrowChar, labels, parser); - - // Wrap the arrow in a styling node - row.push(arrow); - // In CD's syntax, cells are implicit. That is, everything that - // is not an arrow gets collected into a cell. So create an empty - // cell now. It will collect upcoming parseNodes. - cell = newCell(); - } - } - if (i % 2 === 0) { - // Even-numbered rows consist of: cell, arrow, cell, arrow, ... cell - // The last cell is not yet pushed into `row`, so: - row.push(cell); - } else { - // Odd-numbered rows consist of: vert arrow, empty cell, ... vert arrow - // Remove the empty cell that was placed at the beginning of `row`. - row.shift(); - } - row = []; - body.push(row); - } - body.pop() - - // End row group - parser.gullet.endGroup(); - // End array group defining \\ - parser.gullet.endGroup(); - - return { - type: "array", - mode: "math", - body, - envClasses: ["jot", "cd"], - cols: [], - hLinesBeforeRow: new Array(body.length + 1).fill([]) - }; -} - -// The functions below are not available for general use. -// They are here only for internal use by the {CD} environment in placing labels -// next to vertical arrows. - -// We don't need any such functions for horizontal arrows because we can reuse -// the functionality that already exists for extensible arrows. - -defineFunction({ - type: "cdlabel", - names: ["\\\\cdleft", "\\\\cdright"], - props: { - numArgs: 1 - }, - handler({ parser, funcName }, args) { - return { - type: "cdlabel", - mode: parser.mode, - side: funcName.slice(4), - label: args[0] - }; - }, - mathmlBuilder(group, style) { - let label = new mathMLTree.MathNode("mrow", [mml.buildGroup(group.label, style)]); - label = new mathMLTree.MathNode("mpadded", [label]); - label.setAttribute("width", "0"); - if (group.side === "left") { - label.setAttribute("lspace", "-1width"); - } - // We have to guess at vertical alignment. We know the arrow is 1.8em tall, - // But we don't know the height or depth of the label. - label.setAttribute("voffset", "0.7em"); - label = new mathMLTree.MathNode("mstyle", [label]); - label.setAttribute("displaystyle", "false"); - label.setAttribute("scriptlevel", "1"); - return label; - } -}); - -defineFunction({ - type: "cdlabelparent", - names: ["\\\\cdparent"], - props: { - numArgs: 1 - }, - handler({ parser }, args) { - return { - type: "cdlabelparent", - mode: parser.mode, - fragment: args[0] - }; - }, - mathmlBuilder(group, style) { - return new mathMLTree.MathNode("mrow", [mml.buildGroup(group.fragment, style)]); - } -}); diff --git a/src/functions.js b/src/functions.js deleted file mode 100644 index 90c76d2f..00000000 --- a/src/functions.js +++ /dev/null @@ -1,59 +0,0 @@ -/** Include this to ensure that all functions are defined. */ -import { _functions } from "./defineFunction"; - -const functions = _functions; -export default functions; - -// TODO(kevinb): have functions return an object and call defineFunction with -// that object in this file instead of relying on side-effects. -import "./functions/accent"; -import "./functions/accentunder"; -import "./functions/arrow"; -//import "./functions/cancelto"; -import "./environments/cd"; -import "./functions/char"; -import "./functions/color"; -import "./functions/cr"; -import "./functions/def"; -import "./functions/delimsizing"; -import "./functions/enclose"; -import "./functions/environment"; -import "./functions/envTag"; -import "./functions/font"; -import "./functions/genfrac"; -import "./functions/hbox"; -import "./functions/horizBrace"; -import "./functions/href"; -import "./functions/html"; -import "./functions/includegraphics"; -import "./functions/kern"; -import "./functions/label"; -import "./functions/lap"; -import "./functions/math"; -import "./functions/mathchoice"; -import "./functions/mclass"; -import "./functions/multiscript"; -import "./functions/not"; -import "./functions/op"; -import "./functions/operatorname"; -import "./functions/ordgroup"; -import "./functions/phantom"; -import "./functions/pmb"; -import "./functions/raise"; -import "./functions/ref"; -import "./functions/reflect"; -import "./functions/relax"; -import "./functions/rule"; -import "./functions/sizing"; -import "./functions/smash"; -import "./functions/sqrt"; -import "./functions/styling"; -import "./functions/supsub"; -import "./functions/symbolsOp"; -import "./functions/symbolsOrd"; -import "./functions/symbolsSpacing"; -import "./functions/tag"; -import "./functions/text"; -// import "./functions/tip"; -// import "./functions/toggle"; -import "./functions/verb"; diff --git a/src/functions/accent.js b/src/functions/accent.js deleted file mode 100644 index f883083a..00000000 --- a/src/functions/accent.js +++ /dev/null @@ -1,152 +0,0 @@ -import defineFunction, { normalizeArgument } from "../defineFunction" -import mathMLTree from "../mathMLTree" -import stretchy from "../stretchy" -import * as mml from "../buildMathML" -import utils from "../utils" - -const smalls = "acegıȷmnopqrsuvwxyzαγεηικμνοπρςστυχωϕ𝐚𝐜𝐞𝐠𝐦𝐧𝐨𝐩𝐪𝐫𝐬𝐮𝐯𝐰𝐱𝐲𝐳" -const talls = "ABCDEFGHIJKLMNOPQRSTUVWXYZbdfhkltΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩβδλζφθψ" - + "𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙𝐛𝐝𝐟𝐡𝐤𝐥𝐭" -const longSmalls = new Set(["\\alpha", "\\gamma", "\\delta", "\\epsilon", "\\eta", "\\iota", - "\\kappa", "\\mu", "\\nu", "\\pi", "\\rho", "\\sigma", "\\tau", "\\upsilon", "\\chi", "\\psi", - "\\omega", "\\imath", "\\jmath"]) -const longTalls = new Set(["\\Gamma", "\\Delta", "\\Sigma", "\\Omega", "\\beta", "\\delta", - "\\lambda", "\\theta", "\\psi"]) - -const mathmlBuilder = (group, style) => { - const accentNode = group.isStretchy - ? stretchy.accentNode(group) - : new mathMLTree.MathNode("mo", [mml.makeText(group.label, group.mode)]); - - if (group.label === "\\vec") { - accentNode.style.transform = "scale(0.75) translate(10%, 30%)" - } else { - accentNode.style.mathStyle = "normal" - accentNode.style.mathDepth = "0" - if (needWebkitShift.has(group.label) && utils.isCharacterBox(group.base)) { - let shift = "" - const ch = group.base.text - if (smalls.indexOf(ch) > -1 || longSmalls.has(ch)) { shift = "tml-xshift" } - if (talls.indexOf(ch) > -1 || longTalls.has(ch)) { shift = "tml-capshift" } - if (shift) { accentNode.classes.push(shift) } - } - } - if (!group.isStretchy) { - accentNode.setAttribute("stretchy", "false") - } - - const node = new mathMLTree.MathNode((group.label === "\\c" ? "munder" : "mover"), - [mml.buildGroup(group.base, style), accentNode] - ); - - return node; -}; - -const nonStretchyAccents = new Set([ - "\\acute", - "\\grave", - "\\ddot", - "\\dddot", - "\\ddddot", - "\\tilde", - "\\bar", - "\\breve", - "\\check", - "\\hat", - "\\vec", - "\\dot", - "\\mathring" -]) - -const needWebkitShift = new Set([ - "\\acute", - "\\bar", - "\\breve", - "\\check", - "\\dot", - "\\ddot", - "\\grave", - "\\hat", - "\\mathring", - "\\'", "\\^", "\\~", "\\=", "\\u", "\\.", '\\"', "\\r", "\\H", "\\v" -]) - -// Accents -defineFunction({ - type: "accent", - names: [ - "\\acute", - "\\grave", - "\\ddot", - "\\dddot", - "\\ddddot", - "\\tilde", - "\\bar", - "\\breve", - "\\check", - "\\hat", - "\\vec", - "\\dot", - "\\mathring", - "\\overparen", - "\\widecheck", - "\\widehat", - "\\wideparen", - "\\widetilde", - "\\overrightarrow", - "\\overleftarrow", - "\\Overrightarrow", - "\\overleftrightarrow", - "\\overgroup", - "\\overleftharpoon", - "\\overrightharpoon" - ], - props: { - numArgs: 1 - }, - handler: (context, args) => { - const base = normalizeArgument(args[0]); - - const isStretchy = !nonStretchyAccents.has(context.funcName); - - return { - type: "accent", - mode: context.parser.mode, - label: context.funcName, - isStretchy: isStretchy, - base: base - }; - }, - mathmlBuilder -}); - -// Text-mode accents -defineFunction({ - type: "accent", - names: ["\\'", "\\`", "\\^", "\\~", "\\=", "\\c", "\\u", "\\.", '\\"', "\\r", "\\H", "\\v"], - props: { - numArgs: 1, - allowedInText: true, - allowedInMath: true, - argTypes: ["primitive"] - }, - handler: (context, args) => { - const base = normalizeArgument(args[0]); - const mode = context.parser.mode; - - if (mode === "math" && context.parser.settings.strict) { - // LaTeX only writes a warning. It doesn't stop. We'll issue the same warning. - // eslint-disable-next-line no-console - console.log(`Temml parse error: Command ${context.funcName} is invalid in math mode.`) - } - - return { - type: "accent", - mode: mode, - label: context.funcName, - isStretchy: false, - base: base - }; - }, - mathmlBuilder -}); diff --git a/src/functions/accentunder.js b/src/functions/accentunder.js deleted file mode 100644 index 6519cd40..00000000 --- a/src/functions/accentunder.js +++ /dev/null @@ -1,38 +0,0 @@ -import defineFunction from "../defineFunction"; -import mathMLTree from "../mathMLTree"; -import stretchy from "../stretchy"; - -import * as mml from "../buildMathML"; - -defineFunction({ - type: "accentUnder", - names: [ - "\\underleftarrow", - "\\underrightarrow", - "\\underleftrightarrow", - "\\undergroup", - "\\underparen", - "\\utilde" - ], - props: { - numArgs: 1 - }, - handler: ({ parser, funcName }, args) => { - const base = args[0]; - return { - type: "accentUnder", - mode: parser.mode, - label: funcName, - base: base - }; - }, - mathmlBuilder: (group, style) => { - const accentNode = stretchy.accentNode(group); - accentNode.style["math-depth"] = 0 - const node = new mathMLTree.MathNode("munder", [ - mml.buildGroup(group.base, style), - accentNode - ]); - return node; - } -}); diff --git a/src/functions/arrow.js b/src/functions/arrow.js deleted file mode 100644 index e7866f39..00000000 --- a/src/functions/arrow.js +++ /dev/null @@ -1,230 +0,0 @@ -import defineFunction from "../defineFunction"; -import mathMLTree from "../mathMLTree"; -import stretchy from "../stretchy"; -import { emScale } from "../units"; -import * as mml from "../buildMathML"; - -// Helper functions - -const padding = width => { - const node = new mathMLTree.MathNode("mspace") - node.setAttribute("width", width + "em") - return node -} - -const paddedNode = (group, lspace = 0.3, rspace = 0) => { - if (group == null && rspace === 0) { return padding(lspace) } - const row = group ? [group] : []; - if (lspace !== 0) { row.unshift(padding(lspace)) } - if (rspace > 0) { row.push(padding(rspace)) } - return new mathMLTree.MathNode("mrow", row) -} - -const labelSize = (size, scriptLevel) => Number(size) / emScale(scriptLevel); - -const munderoverNode = (fName, body, below, style) => { - const arrowNode = stretchy.mathMLnode(fName); - // Is this the short part of a mhchem equilibrium arrow? - const isEq = fName.slice(1, 3) === "eq" - const minWidth = fName.charAt(1) === "x" - ? "1.75" // mathtools extensible arrows are ≥ 1.75em long - : fName.slice(2, 4) === "cd" - ? "3.0" // cd package arrows - : isEq - ? "1.0" // The shorter harpoon of a mhchem equilibrium arrow - : "2.0"; // other mhchem arrows - // TODO: When Firefox supports minsize, use the next line. - //arrowNode.setAttribute("minsize", String(minWidth) + "em") - arrowNode.setAttribute("lspace", "0") - arrowNode.setAttribute("rspace", (isEq ? "0.5em" : "0")) - - // upper and lower labels are set to scriptlevel by MathML - // So we have to adjust our label dimensions accordingly. - const labelStyle = style.withLevel(style.level < 2 ? 2 : 3) - const minArrowWidth = labelSize(minWidth, labelStyle.level) - // The dummyNode will be inside a inside a - // So it will be at scriptlevel 3 - const dummyWidth = labelSize(minWidth, 3) - const emptyLabel = paddedNode(null, minArrowWidth.toFixed(4), 0) - const dummyNode = paddedNode(null, dummyWidth.toFixed(4), 0) - // The arrow is a little longer than the label. Set a spacer length. - const space = labelSize((isEq ? 0 : 0.3), labelStyle.level).toFixed(4) - let upperNode - let lowerNode - - const gotUpper = (body && body.body && - // \hphantom visible content - (body.body.body || body.body.length > 0)) - if (gotUpper) { - let label = mml.buildGroup(body, labelStyle) - label = paddedNode(label, space, space) - // Since Firefox does not support minsize, stack a invisible node - // on top of the label. Its width will serve as a min-width. - // TODO: Refactor this after Firefox supports minsize. - upperNode = new mathMLTree.MathNode("mover", [label, dummyNode]) - } - const gotLower = (below && below.body && - (below.body.body || below.body.length > 0)) - if (gotLower) { - let label = mml.buildGroup(below, labelStyle) - label = paddedNode(label, space, space) - lowerNode = new mathMLTree.MathNode("munder", [label, dummyNode]) - } - - let node - if (!gotUpper && !gotLower) { - node = new mathMLTree.MathNode("mover", [arrowNode, emptyLabel]) - } else if (gotUpper && gotLower) { - node = new mathMLTree.MathNode("munderover", [arrowNode, lowerNode, upperNode]) - } else if (gotUpper) { - node = new mathMLTree.MathNode("mover", [arrowNode, upperNode]) - } else { - node = new mathMLTree.MathNode("munder", [arrowNode, lowerNode]) - } - if (minWidth === "3.0") { node.style.height = "1em" } // CD environment - node.setAttribute("accent", "false") // Necessary for MS Word - return node -} - -// Stretchy arrows with an optional argument -defineFunction({ - type: "xArrow", - names: [ - "\\xleftarrow", - "\\xrightarrow", - "\\xLeftarrow", - "\\xRightarrow", - "\\xleftrightarrow", - "\\xLeftrightarrow", - "\\xhookleftarrow", - "\\xhookrightarrow", - "\\xmapsto", - "\\xrightharpoondown", - "\\xrightharpoonup", - "\\xleftharpoondown", - "\\xleftharpoonup", - "\\xlongequal", - "\\xtwoheadrightarrow", - "\\xtwoheadleftarrow", - // The next 5 functions are here only to support mhchem - "\\yields", - "\\yieldsLeft", - "\\mesomerism", - "\\longrightharpoonup", - "\\longleftharpoondown", - // The next 3 functions are here only to support the {CD} environment. - "\\\\cdrightarrow", - "\\\\cdleftarrow", - "\\\\cdlongequal" - ], - props: { - numArgs: 1, - numOptionalArgs: 1 - }, - handler({ parser, funcName }, args, optArgs) { - return { - type: "xArrow", - mode: parser.mode, - name: funcName, - body: args[0], - below: optArgs[0] - }; - }, - mathmlBuilder(group, style) { - // Build the arrow and its labels. - const node = munderoverNode(group.name, group.body, group.below, style) - // Create operator spacing for a relation. - const row = [node] - row.unshift(padding(0.2778)) - row.push(padding(0.2778)) - return new mathMLTree.MathNode("mrow", row) - } -}); - -const arrowComponent = { - "\\xtofrom": ["\\xrightarrow", "\\xleftarrow"], - "\\xleftrightharpoons": ["\\xleftharpoonup", "\\xrightharpoondown"], - "\\xrightleftharpoons": ["\\xrightharpoonup", "\\xleftharpoondown"], - "\\yieldsLeftRight": ["\\yields", "\\yieldsLeft"], - // The next three all get the same harpoon glyphs. Only the lengths and paddings differ. - "\\equilibrium": ["\\longrightharpoonup", "\\longleftharpoondown"], - "\\equilibriumRight": ["\\longrightharpoonup", "\\eqleftharpoondown"], - "\\equilibriumLeft": ["\\eqrightharpoonup", "\\longleftharpoondown"] -} - -// Browsers are not good at stretching a glyph that contains a pair of stacked arrows such as ⇄. -// So we stack a pair of single arrows. -defineFunction({ - type: "stackedArrow", - names: [ - "\\xtofrom", // expfeil - "\\xleftrightharpoons", // mathtools - "\\xrightleftharpoons", // mathtools - "\\yieldsLeftRight", // mhchem - "\\equilibrium", // mhchem - "\\equilibriumRight", - "\\equilibriumLeft" - ], - props: { - numArgs: 1, - numOptionalArgs: 1 - }, - handler({ parser, funcName }, args, optArgs) { - const lowerArrowBody = args[0] - ? { - type: "hphantom", - mode: parser.mode, - body: args[0] - } - : null; - const upperArrowBelow = optArgs[0] - ? { - type: "hphantom", - mode: parser.mode, - body: optArgs[0] - } - : null; - return { - type: "stackedArrow", - mode: parser.mode, - name: funcName, - body: args[0], - upperArrowBelow, - lowerArrowBody, - below: optArgs[0] - }; - }, - mathmlBuilder(group, style) { - const topLabel = arrowComponent[group.name][0] - const botLabel = arrowComponent[group.name][1] - const topArrow = munderoverNode(topLabel, group.body, group.upperArrowBelow, style) - const botArrow = munderoverNode(botLabel, group.lowerArrowBody, group.below, style) - let wrapper - - const raiseNode = new mathMLTree.MathNode("mpadded", [topArrow]) - raiseNode.setAttribute("voffset", "0.3em") - raiseNode.setAttribute("height", "+0.3em") - raiseNode.setAttribute("depth", "-0.3em") - // One of the arrows is given ~zero width. so the other has the same horzontal alignment. - if (group.name === "\\equilibriumLeft") { - const botNode = new mathMLTree.MathNode("mpadded", [botArrow]) - botNode.setAttribute("width", "0.5em") - wrapper = new mathMLTree.MathNode( - "mpadded", - [padding(0.2778), botNode, raiseNode, padding(0.2778)] - ) - } else { - raiseNode.setAttribute("width", (group.name === "\\equilibriumRight" ? "0.5em" : "0")) - wrapper = new mathMLTree.MathNode( - "mpadded", - [padding(0.2778), raiseNode, botArrow, padding(0.2778)] - ) - } - - wrapper.setAttribute("voffset", "-0.18em") - wrapper.setAttribute("height", "-0.18em") - wrapper.setAttribute("depth", "+0.18em") - return wrapper - } -}); - diff --git a/src/functions/cancelto.js b/src/functions/cancelto.js deleted file mode 100644 index 1b418a24..00000000 --- a/src/functions/cancelto.js +++ /dev/null @@ -1,36 +0,0 @@ -import defineFunction from "../defineFunction"; -import mathMLTree from "../mathMLTree"; -import * as mml from "../buildMathML"; - -defineFunction({ - type: "cancelto", - names: ["\\cancelto"], - props: { - numArgs: 2 - }, - handler({ parser }, args) { - return { - type: "cancelto", - mode: parser.mode, - value: args[0], - expression: args[1] - }; - }, - mathmlBuilder(group, style) { - const value = new mathMLTree.MathNode( - "mpadded", - [mml.buildGroup(group.value, style)] - ) - value.setAttribute("depth", `-0.1em`) - value.setAttribute("height", `+0.1em`) - value.setAttribute("voffset", `0.1em`) - - const expression = new mathMLTree.MathNode( - "menclose", - [mml.buildGroup(group.expression, style)] - ) - expression.setAttribute("notation", `updiagonalarrow`) - - return new mathMLTree.MathNode("msup", [expression, value]) - } -}) diff --git a/src/functions/char.js b/src/functions/char.js deleted file mode 100644 index b2355c0b..00000000 --- a/src/functions/char.js +++ /dev/null @@ -1,33 +0,0 @@ -import defineFunction from "../defineFunction" -import ParseError from "../ParseError" -import { assertNodeType } from "../parseNode" - -// \@char is an internal function that takes a grouped decimal argument like -// {123} and converts into symbol with code 123. It is used by the *macro* -// \char defined in macros.js. -defineFunction({ - type: "textord", - names: ["\\@char"], - props: { - numArgs: 1, - allowedInText: true - }, - handler({ parser, token }, args) { - const arg = assertNodeType(args[0], "ordgroup") - const group = arg.body - let number = "" - for (let i = 0; i < group.length; i++) { - const node = assertNodeType(group[i], "textord") - number += node.text - } - const code = parseInt(number) - if (isNaN(code)) { - throw new ParseError(`\\@char has non-numeric argument ${number}`, token) - } - return { - type: "textord", - mode: parser.mode, - text: String.fromCodePoint(code) - } - } -}) diff --git a/src/functions/color.js b/src/functions/color.js deleted file mode 100644 index 245226b5..00000000 --- a/src/functions/color.js +++ /dev/null @@ -1,250 +0,0 @@ -import defineFunction, { ordargument } from "../defineFunction" -import mathMLTree from "../mathMLTree" -import { assertNodeType } from "../parseNode" -import ParseError from "../ParseError" -import * as mml from "../buildMathML" - -// Helpers -const htmlRegEx = /^(#[a-f0-9]{3}|#?[a-f0-9]{6})$/i -const htmlOrNameRegEx = /^(#[a-f0-9]{3}|#?[a-f0-9]{6}|[a-z]+)$/i -const RGBregEx = /^ *\d{1,3} *(?:, *\d{1,3} *){2}$/ -const rgbRegEx = /^ *[10](?:\.\d*)? *(?:, *[10](?:\.\d*)? *){2}$/ -const xcolorHtmlRegEx = /^[a-f0-9]{6}$/i -const toHex = num => { - let str = num.toString(16) - if (str.length === 1) { str = "0" + str } - return str -} - -// Colors from Tables 4.1 and 4.2 of the xcolor package. -// Table 4.1 (lower case) RGB values are taken from chroma and xcolor.dtx. -// Table 4.2 (Capitalizzed) values were sampled, because Chroma contains a unreliable -// conversion from cmyk to RGB. See https://tex.stackexchange.com/a/537274. -const xcolors = JSON.parse(`{ - "Apricot": "#ffb484", - "Aquamarine": "#08b4bc", - "Bittersweet": "#c84c14", - "blue": "#0000FF", - "Blue": "#303494", - "BlueGreen": "#08b4bc", - "BlueViolet": "#503c94", - "BrickRed": "#b8341c", - "brown": "#BF8040", - "Brown": "#802404", - "BurntOrange": "#f8941c", - "CadetBlue": "#78749c", - "CarnationPink": "#f884b4", - "Cerulean": "#08a4e4", - "CornflowerBlue": "#40ace4", - "cyan": "#00FFFF", - "Cyan": "#08acec", - "Dandelion": "#ffbc44", - "darkgray": "#404040", - "DarkOrchid": "#a8548c", - "Emerald": "#08ac9c", - "ForestGreen": "#089c54", - "Fuchsia": "#90348c", - "Goldenrod": "#ffdc44", - "gray": "#808080", - "Gray": "#98949c", - "green": "#00FF00", - "Green": "#08a44c", - "GreenYellow": "#e0e474", - "JungleGreen": "#08ac9c", - "Lavender": "#f89cc4", - "lightgray": "#c0c0c0", - "lime": "#BFFF00", - "LimeGreen": "#90c43c", - "magenta": "#FF00FF", - "Magenta": "#f0048c", - "Mahogany": "#b0341c", - "Maroon": "#b03434", - "Melon": "#f89c7c", - "MidnightBlue": "#086494", - "Mulberry": "#b03c94", - "NavyBlue": "#086cbc", - "olive": "#7F7F00", - "OliveGreen": "#407c34", - "orange": "#FF8000", - "Orange": "#f8843c", - "OrangeRed": "#f0145c", - "Orchid": "#b074ac", - "Peach": "#f8945c", - "Periwinkle": "#8074bc", - "PineGreen": "#088c74", - "pink": "#ff7f7f", - "Plum": "#98248c", - "ProcessBlue": "#08b4ec", - "purple": "#BF0040", - "Purple": "#a0449c", - "RawSienna": "#983c04", - "red": "#ff0000", - "Red": "#f01c24", - "RedOrange": "#f86434", - "RedViolet": "#a0246c", - "Rhodamine": "#f0549c", - "Royallue": "#0874bc", - "RoyalPurple": "#683c9c", - "RubineRed": "#f0047c", - "Salmon": "#f8948c", - "SeaGreen": "#30bc9c", - "Sepia": "#701404", - "SkyBlue": "#48c4dc", - "SpringGreen": "#c8dc64", - "Tan": "#e09c74", - "teal": "#007F7F", - "TealBlue": "#08acb4", - "Thistle": "#d884b4", - "Turquoise": "#08b4cc", - "violet": "#800080", - "Violet": "#60449c", - "VioletRed": "#f054a4", - "WildStrawberry": "#f0246c", - "yellow": "#FFFF00", - "Yellow": "#fff404", - "YellowGreen": "#98cc6c", - "YellowOrange": "#ffa41c" -}`) - -export const colorFromSpec = (model, spec) => { - let color = "" - if (model === "HTML") { - if (!htmlRegEx.test(spec)) { - throw new ParseError("Invalid HTML input.") - } - color = spec - } else if (model === "RGB") { - if (!RGBregEx.test(spec)) { - throw new ParseError("Invalid RGB input.") - } - spec.split(",").map(e => { color += toHex(Number(e.trim())) }) - } else { - if (!rgbRegEx.test(spec)) { - throw new ParseError("Invalid rbg input.") - } - spec.split(",").map(e => { - const num = Number(e.trim()) - if (num > 1) { throw new ParseError("Color rgb input must be < 1.") } - color += toHex(Number((num * 255).toFixed(0))) - }) - } - if (color.charAt(0) !== "#") { color = "#" + color } - return color -} - -export const validateColor = (color, macros, token) => { - const macroName = `\\\\color@${color}` // from \defineColor. - const match = htmlOrNameRegEx.exec(color); - if (!match) { throw new ParseError("Invalid color: '" + color + "'", token) } - // We allow a 6-digit HTML color spec without a leading "#". - // This follows the xcolor package's HTML color model. - // Predefined color names are all missed by this RegEx pattern. - if (xcolorHtmlRegEx.test(color)) { - return "#" + color - } else if (color.charAt(0) === "#") { - return color - } else if (macros.has(macroName)) { - color = macros.get(macroName).tokens[0].text - } else if (xcolors[color]) { - color = xcolors[color] - } - return color -} - -const mathmlBuilder = (group, style) => { - // In LaTeX, color is not supposed to change the spacing of any node. - // So instead of wrapping the group in an , we apply - // the color individually to each node and return a document fragment. - let expr = mml.buildExpression(group.body, style.withColor(group.color)) - expr = expr.map(e => { - e.style.color = group.color - return e - }) - return mathMLTree.newDocumentFragment(expr) -} - -defineFunction({ - type: "color", - names: ["\\textcolor"], - props: { - numArgs: 2, - numOptionalArgs: 1, - allowedInText: true, - argTypes: ["raw", "raw", "original"] - }, - handler({ parser, token }, args, optArgs) { - const model = optArgs[0] && assertNodeType(optArgs[0], "raw").string - let color = "" - if (model) { - const spec = assertNodeType(args[0], "raw").string - color = colorFromSpec(model, spec) - } else { - color = validateColor(assertNodeType(args[0], "raw").string, parser.gullet.macros, token) - } - const body = args[1]; - return { - type: "color", - mode: parser.mode, - color, - body: ordargument(body) - } - }, - mathmlBuilder -}) - -defineFunction({ - type: "color", - names: ["\\color"], - props: { - numArgs: 1, - numOptionalArgs: 1, - allowedInText: true, - argTypes: ["raw", "raw"] - }, - handler({ parser, breakOnTokenText, token }, args, optArgs) { - const model = optArgs[0] && assertNodeType(optArgs[0], "raw").string - let color = "" - if (model) { - const spec = assertNodeType(args[0], "raw").string - color = colorFromSpec(model, spec) - } else { - color = validateColor(assertNodeType(args[0], "raw").string, parser.gullet.macros, token) - } - - // Parse out the implicit body that should be colored. - const body = parser.parseExpression(true, breakOnTokenText, true) - - return { - type: "color", - mode: parser.mode, - color, - body - } - }, - mathmlBuilder -}) - -defineFunction({ - type: "color", - names: ["\\definecolor"], - props: { - numArgs: 3, - allowedInText: true, - argTypes: ["raw", "raw", "raw"] - }, - handler({ parser, funcName, token }, args) { - const name = assertNodeType(args[0], "raw").string - if (!/^[A-Za-z]+$/.test(name)) { - throw new ParseError("Color name must be latin letters.", token) - } - const model = assertNodeType(args[1], "raw").string - if (!["HTML", "RGB", "rgb"].includes(model)) { - throw new ParseError("Color model must be HTML, RGB, or rgb.", token) - } - const spec = assertNodeType(args[2], "raw").string - const color = colorFromSpec(model, spec) - parser.gullet.macros.set(`\\\\color@${name}`, { tokens: [{ text: color }], numArgs: 0 }) - return { type: "internal", mode: parser.mode } - } - // No mathmlBuilder. The point of \definecolor is to set a macro. -}) diff --git a/src/functions/cr.js b/src/functions/cr.js deleted file mode 100644 index 6b7e3029..00000000 --- a/src/functions/cr.js +++ /dev/null @@ -1,45 +0,0 @@ -// Row breaks within tabular environments, and line breaks at top level - -import defineFunction from "../defineFunction" -import mathMLTree from "../mathMLTree" -import { calculateSize } from "../units" -import { assertNodeType } from "../parseNode" - -// \DeclareRobustCommand\\{...\@xnewline} -defineFunction({ - type: "cr", - names: ["\\\\"], - props: { - numArgs: 0, - numOptionalArgs: 0, - allowedInText: true - }, - - handler({ parser }, args, optArgs) { - const size = parser.gullet.future().text === "[" ? parser.parseSizeGroup(true) : null; - const newLine = !parser.settings.displayMode; - return { - type: "cr", - mode: parser.mode, - newLine, - size: size && assertNodeType(size, "size").value - } - }, - - // The following builder is called only at the top level, - // not within tabular/array environments. - - mathmlBuilder(group, style) { - // MathML 3.0 calls for newline to occur in an or an . - // Ref: https://www.w3.org/TR/MathML3/chapter3.html#presm.linebreaking - const node = new mathMLTree.MathNode("mo") - if (group.newLine) { - node.setAttribute("linebreak", "newline") - if (group.size) { - const size = calculateSize(group.size, style) - node.setAttribute("height", size.number + size.unit) - } - } - return node - } -}) diff --git a/src/functions/def.js b/src/functions/def.js deleted file mode 100644 index 38e552e7..00000000 --- a/src/functions/def.js +++ /dev/null @@ -1,262 +0,0 @@ -import defineFunction from "../defineFunction"; -import ParseError from "../ParseError"; -import { assertNodeType } from "../parseNode"; - -const globalMap = { - "\\global": "\\global", - "\\long": "\\\\globallong", - "\\\\globallong": "\\\\globallong", - "\\def": "\\gdef", - "\\gdef": "\\gdef", - "\\edef": "\\xdef", - "\\xdef": "\\xdef", - "\\let": "\\\\globallet", - "\\futurelet": "\\\\globalfuture" -} - -const checkControlSequence = (tok) => { - const name = tok.text; - if (/^(?:[\\{}$&#^_]|EOF)$/.test(name)) { - throw new ParseError("Expected a control sequence", tok); - } - return name; -}; - -const getRHS = (parser) => { - let tok = parser.gullet.popToken(); - if (tok.text === "=") { - // consume optional equals - tok = parser.gullet.popToken(); - if (tok.text === " ") { - // consume one optional space - tok = parser.gullet.popToken(); - } - } - return tok; -}; - -const letCommand = (parser, name, tok, global) => { - let macro = parser.gullet.macros.get(tok.text); - if (macro == null) { - // don't expand it later even if a macro with the same name is defined - // e.g., \let\foo=\frac \def\frac{\relax} \frac12 - tok.noexpand = true; - macro = { - tokens: [tok], - numArgs: 0, - // reproduce the same behavior in expansion - unexpandable: !parser.gullet.isExpandable(tok.text) - }; - } - parser.gullet.macros.set(name, macro, global); -}; - -// -> | -// -> |\global -// -> | -// -> \global|\long|\outer -defineFunction({ - type: "internal", - names: [ - "\\global", - "\\long", - "\\\\globallong" // can’t be entered directly - ], - props: { - numArgs: 0, - allowedInText: true - }, - handler({ parser, funcName }) { - parser.consumeSpaces(); - const token = parser.fetch(); - if (globalMap[token.text]) { - // Temml doesn't have \par, so ignore \long - if (funcName === "\\global" || funcName === "\\\\globallong") { - token.text = globalMap[token.text]; - } - return assertNodeType(parser.parseFunction(), "internal"); - } - throw new ParseError(`Invalid token after macro prefix`, token); - } -}); - -// Basic support for macro definitions: \def, \gdef, \edef, \xdef -// -> -// -> \def|\gdef|\edef|\xdef -// -> -defineFunction({ - type: "internal", - names: ["\\def", "\\gdef", "\\edef", "\\xdef"], - props: { - numArgs: 0, - allowedInText: true, - primitive: true - }, - handler({ parser, funcName }) { - let tok = parser.gullet.popToken(); - const name = tok.text; - if (/^(?:[\\{}$&#^_]|EOF)$/.test(name)) { - throw new ParseError("Expected a control sequence", tok); - } - - let numArgs = 0; - let insert; - const delimiters = [[]]; - // contains no braces - while (parser.gullet.future().text !== "{") { - tok = parser.gullet.popToken(); - if (tok.text === "#") { - // If the very last character of the is #, so that - // this # is immediately followed by {, TeX will behave as if the { - // had been inserted at the right end of both the parameter text - // and the replacement text. - if (parser.gullet.future().text === "{") { - insert = parser.gullet.future(); - delimiters[numArgs].push("{"); - break; - } - - // A parameter, the first appearance of # must be followed by 1, - // the next by 2, and so on; up to nine #’s are allowed - tok = parser.gullet.popToken(); - if (!/^[1-9]$/.test(tok.text)) { - throw new ParseError(`Invalid argument number "${tok.text}"`); - } - if (parseInt(tok.text) !== numArgs + 1) { - throw new ParseError(`Argument number "${tok.text}" out of order`); - } - numArgs++; - delimiters.push([]); - } else if (tok.text === "EOF") { - throw new ParseError("Expected a macro definition"); - } else { - delimiters[numArgs].push(tok.text); - } - } - // replacement text, enclosed in '{' and '}' and properly nested - let { tokens } = parser.gullet.consumeArg(); - if (insert) { - tokens.unshift(insert); - } - - if (funcName === "\\edef" || funcName === "\\xdef") { - tokens = parser.gullet.expandTokens(tokens); - if (tokens.length > parser.gullet.settings.maxExpand) { - throw new ParseError("Too many expansions in an " + funcName); - } - tokens.reverse(); // to fit in with stack order - } - // Final arg is the expansion of the macro - parser.gullet.macros.set( - name, - { tokens, numArgs, delimiters }, - funcName === globalMap[funcName] - ); - return { type: "internal", mode: parser.mode }; - } -}); - -// -> -// -> \futurelet -// | \let -// -> |= -defineFunction({ - type: "internal", - names: [ - "\\let", - "\\\\globallet" // can’t be entered directly - ], - props: { - numArgs: 0, - allowedInText: true, - primitive: true - }, - handler({ parser, funcName }) { - const name = checkControlSequence(parser.gullet.popToken()); - parser.gullet.consumeSpaces(); - const tok = getRHS(parser); - letCommand(parser, name, tok, funcName === "\\\\globallet"); - return { type: "internal", mode: parser.mode }; - } -}); - -// ref: https://www.tug.org/TUGboat/tb09-3/tb22bechtolsheim.pdf -defineFunction({ - type: "internal", - names: [ - "\\futurelet", - "\\\\globalfuture" // can’t be entered directly - ], - props: { - numArgs: 0, - allowedInText: true, - primitive: true - }, - handler({ parser, funcName }) { - const name = checkControlSequence(parser.gullet.popToken()); - const middle = parser.gullet.popToken(); - const tok = parser.gullet.popToken(); - letCommand(parser, name, tok, funcName === "\\\\globalfuture"); - parser.gullet.pushToken(tok); - parser.gullet.pushToken(middle); - return { type: "internal", mode: parser.mode }; - } -}); - -defineFunction({ - type: "internal", - names: ["\\newcommand", "\\renewcommand", "\\providecommand"], - props: { - numArgs: 0, - allowedInText: true, - primitive: true - }, - handler({ parser, funcName }) { - let name = "" - const tok = parser.gullet.popToken() - if (tok.text === "{") { - name = checkControlSequence(parser.gullet.popToken()) - parser.gullet.popToken() - } else { - name = checkControlSequence(tok) - } - - const exists = parser.gullet.isDefined(name); - if (exists && funcName === "\\newcommand") { - throw new ParseError( - `\\newcommand{${name}} attempting to redefine ${name}; use \\renewcommand` - ); - } - if (!exists && funcName === "\\renewcommand") { - throw new ParseError( - `\\renewcommand{${name}} when command ${name} does not yet exist; use \\newcommand` - ); - } - - let numArgs = 0; - if (parser.gullet.future().text === "[") { - let tok = parser.gullet.popToken(); - tok = parser.gullet.popToken(); - if (!/^[0-9]$/.test(tok.text)) { - throw new ParseError(`Invalid number of arguments: "${tok.text}"`); - } - numArgs = parseInt(tok.text); - tok = parser.gullet.popToken(); - if (tok.text !== "]") { - throw new ParseError(`Invalid argument "${tok.text}"`); - } - } - - // replacement text, enclosed in '{' and '}' and properly nested - const { tokens } = parser.gullet.consumeArg(); - - parser.gullet.macros.set( - name, - { tokens, numArgs }, - !parser.settings.strict - ) - - return { type: "internal", mode: parser.mode }; - - } -}); diff --git a/src/functions/delimsizing.js b/src/functions/delimsizing.js deleted file mode 100644 index 773df8a4..00000000 --- a/src/functions/delimsizing.js +++ /dev/null @@ -1,325 +0,0 @@ -import defineFunction from "../defineFunction"; -import mathMLTree from "../mathMLTree"; -import ParseError from "../ParseError"; -import { assertNodeType, checkSymbolNodeType } from "../parseNode"; - -import * as mml from "../buildMathML"; -import symbols from "../symbols"; - -// Extra data needed for the delimiter handler down below -export const delimiterSizes = { - "\\bigl": { mclass: "mopen", size: 1 }, - "\\Bigl": { mclass: "mopen", size: 2 }, - "\\biggl": { mclass: "mopen", size: 3 }, - "\\Biggl": { mclass: "mopen", size: 4 }, - "\\bigr": { mclass: "mclose", size: 1 }, - "\\Bigr": { mclass: "mclose", size: 2 }, - "\\biggr": { mclass: "mclose", size: 3 }, - "\\Biggr": { mclass: "mclose", size: 4 }, - "\\bigm": { mclass: "mrel", size: 1 }, - "\\Bigm": { mclass: "mrel", size: 2 }, - "\\biggm": { mclass: "mrel", size: 3 }, - "\\Biggm": { mclass: "mrel", size: 4 }, - "\\big": { mclass: "mord", size: 1 }, - "\\Big": { mclass: "mord", size: 2 }, - "\\bigg": { mclass: "mord", size: 3 }, - "\\Bigg": { mclass: "mord", size: 4 } -}; - -export const delimiters = [ - "(", - "\\lparen", - ")", - "\\rparen", - "[", - "\\lbrack", - "]", - "\\rbrack", - "\\{", - "\\lbrace", - "\\}", - "\\rbrace", - "⦇", - "\\llparenthesis", - "⦈", - "\\rrparenthesis", - "\\lfloor", - "\\rfloor", - "\u230a", - "\u230b", - "\\lceil", - "\\rceil", - "\u2308", - "\u2309", - "<", - ">", - "\\langle", - "\u27e8", - "\\rangle", - "\u27e9", - "\\lAngle", - "\u27ea", - "\\rAngle", - "\u27eb", - "\\llangle", - "⦉", - "\\rrangle", - "⦊", - "\\lt", - "\\gt", - "\\lvert", - "\\rvert", - "\\lVert", - "\\rVert", - "\\lgroup", - "\\rgroup", - "\u27ee", - "\u27ef", - "\\lmoustache", - "\\rmoustache", - "\u23b0", - "\u23b1", - "\\llbracket", - "\\rrbracket", - "\u27e6", - "\u27e6", - "\\lBrace", - "\\rBrace", - "\u2983", - "\u2984", - "/", - "\\backslash", - "|", - "\\vert", - "\\|", - "\\Vert", - "\\uparrow", - "\\Uparrow", - "\\downarrow", - "\\Downarrow", - "\\updownarrow", - "\\Updownarrow", - "." -]; - -// Export isDelimiter for benefit of parser. -const dels = ["}", "\\left", "\\middle", "\\right"] -export const isDelimiter = str => str.length > 0 && - (delimiters.includes(str) || delimiterSizes[str] || dels.includes(str)) - -// Metrics of the different sizes. Found by looking at TeX's output of -// $\bigl| // \Bigl| \biggl| \Biggl| \showlists$ -// Used to create stacked delimiters of appropriate sizes in makeSizedDelim. -const sizeToMaxHeight = [0, 1.2, 1.8, 2.4, 3.0]; - -// Delimiter functions -function checkDelimiter(delim, context) { - const symDelim = checkSymbolNodeType(delim) - if (symDelim && delimiters.includes(symDelim.text)) { - // If a character is not in the MathML operator dictionary, it will not stretch. - // Replace such characters w/characters that will stretch. - if (["/", "\u2044"].includes(symDelim.text)) { symDelim.text = "\u2215" } - if (["<", "\\lt"].includes(symDelim.text)) { symDelim.text = "⟨" } - if ([">", "\\gt"].includes(symDelim.text)) { symDelim.text = "⟩" } - if (symDelim.text === "\\backslash") { symDelim.text = "\u2216" } - return symDelim; - } else if (symDelim) { - throw new ParseError(`Invalid delimiter '${symDelim.text}' after '${context.funcName}'`, delim); - } else { - throw new ParseError(`Invalid delimiter type '${delim.type}'`, delim); - } -} - -defineFunction({ - type: "delimsizing", - names: [ - "\\bigl", - "\\Bigl", - "\\biggl", - "\\Biggl", - "\\bigr", - "\\Bigr", - "\\biggr", - "\\Biggr", - "\\bigm", - "\\Bigm", - "\\biggm", - "\\Biggm", - "\\big", - "\\Big", - "\\bigg", - "\\Bigg" - ], - props: { - numArgs: 1, - argTypes: ["primitive"] - }, - handler: (context, args) => { - const delim = checkDelimiter(args[0], context); - - return { - type: "delimsizing", - mode: context.parser.mode, - size: delimiterSizes[context.funcName].size, - mclass: delimiterSizes[context.funcName].mclass, - delim: delim.text - }; - }, - mathmlBuilder: (group) => { - const children = []; - - if (group.delim === ".") { group.delim = "" } - children.push(mml.makeText(group.delim, group.mode)); - - const node = new mathMLTree.MathNode("mo", children); - - if (group.mclass === "mopen" || group.mclass === "mclose") { - // Only some of the delimsizing functions act as fences, and they - // return "mopen" or "mclose" mclass. - node.setAttribute("fence", "true"); - } else { - // Explicitly disable fencing if it's not a fence, to override the - // defaults. - node.setAttribute("fence", "false"); - } - if (group.delim === "\u2216" || group.delim === "\\vert" || - group.delim === "|" || group.delim.indexOf("arrow") > -1) { - // We have to explicitly set stretchy to true. - node.setAttribute("stretchy", "true") - } - node.setAttribute("symmetric", "true"); // Needed for tall arrows in Firefox. - node.setAttribute("minsize", sizeToMaxHeight[group.size] + "em") - node.setAttribute("maxsize", sizeToMaxHeight[group.size] + "em") - return node; - } -}); - -function assertParsed(group) { - if (!group.body) { - throw new Error("Bug: The leftright ParseNode wasn't fully parsed."); - } -} - -defineFunction({ - type: "leftright-right", - names: ["\\right"], - props: { - numArgs: 1, - argTypes: ["primitive"] - }, - handler: (context, args) => { - return { - type: "leftright-right", - mode: context.parser.mode, - delim: checkDelimiter(args[0], context).text - }; - } -}); - -defineFunction({ - type: "leftright", - names: ["\\left"], - props: { - numArgs: 1, - argTypes: ["primitive"] - }, - handler: (context, args) => { - const delim = checkDelimiter(args[0], context); - - const parser = context.parser; - // Parse out the implicit body - ++parser.leftrightDepth; - // parseExpression stops before '\\right' or `\\middle` - let body = parser.parseExpression(false, null, true) - let nextToken = parser.fetch() - while (nextToken.text === "\\middle") { - // `\middle`, from the ε-TeX package, ends one group and starts another group. - // We had to parse this expression with `breakOnMiddle` enabled in order - // to get TeX-compliant parsing of \over. - // But we do not want, at this point, to end on \middle, so continue - // to parse until we fetch a `\right`. - parser.consume() - const middle = parser.fetch().text - if (!symbols.math[middle]) { - throw new ParseError(`Invalid delimiter '${middle}' after '\\middle'`); - } - checkDelimiter({ type: "atom", mode: "math", text: middle }, { funcName: "\\middle" }) - body.push({ type: "middle", mode: "math", delim: middle }) - parser.consume() - body = body.concat(parser.parseExpression(false, null, true)) - nextToken = parser.fetch() - } - --parser.leftrightDepth; - // Check the next token - parser.expect("\\right", false); - const right = assertNodeType(parser.parseFunction(), "leftright-right"); - return { - type: "leftright", - mode: parser.mode, - body, - left: delim.text, - right: right.delim - }; - }, - mathmlBuilder: (group, style) => { - assertParsed(group); - const inner = mml.buildExpression(group.body, style); - - if (group.left === ".") { group.left = "" } - const leftNode = new mathMLTree.MathNode("mo", [mml.makeText(group.left, group.mode)]); - leftNode.setAttribute("fence", "true") - leftNode.setAttribute("form", "prefix") - if (group.left === "\u2216" || group.left.indexOf("arrow") > -1) { - leftNode.setAttribute("stretchy", "true") - } - inner.unshift(leftNode) - - if (group.right === ".") { group.right = "" } - const rightNode = new mathMLTree.MathNode("mo", [mml.makeText(group.right, group.mode)]); - rightNode.setAttribute("fence", "true") - rightNode.setAttribute("form", "postfix") - if (group.right === "\u2216" || group.right.indexOf("arrow") > -1) { - rightNode.setAttribute("stretchy", "true") - } - inner.push(rightNode) - - return mml.makeRow(inner); - } -}); - -defineFunction({ - type: "middle", - names: ["\\middle"], - props: { - numArgs: 1, - argTypes: ["primitive"] - }, - handler: (context, args) => { - const delim = checkDelimiter(args[0], context); - if (!context.parser.leftrightDepth) { - throw new ParseError("\\middle without preceding \\left", delim); - } - - return { - type: "middle", - mode: context.parser.mode, - delim: delim.text - }; - }, - mathmlBuilder: (group, style) => { - const textNode = mml.makeText(group.delim, group.mode); - const middleNode = new mathMLTree.MathNode("mo", [textNode]); - middleNode.setAttribute("fence", "true"); - if (group.delim.indexOf("arrow") > -1) { - middleNode.setAttribute("stretchy", "true") - } - // The next line is not semantically correct, but - // Chromium fails to stretch if it is not there. - middleNode.setAttribute("form", "prefix") - // MathML gives 5/18em spacing to each element. - // \middle should get delimiter spacing instead. - middleNode.setAttribute("lspace", "0.05em"); - middleNode.setAttribute("rspace", "0.05em"); - return middleNode; - } -}); diff --git a/src/functions/enclose.js b/src/functions/enclose.js deleted file mode 100644 index 7d30d7da..00000000 --- a/src/functions/enclose.js +++ /dev/null @@ -1,217 +0,0 @@ -import defineFunction from "../defineFunction"; -import mathMLTree from "../mathMLTree"; -import { assertNodeType } from "../parseNode"; -import { colorFromSpec, validateColor } from "./color" -import * as mml from "../buildMathML"; - -const padding = _ => { - const node = new mathMLTree.MathNode("mspace") - node.setAttribute("width", "3pt") - return node -} - -const mathmlBuilder = (group, style) => { - let node - if (group.label.indexOf("colorbox") > -1 || group.label === "\\boxed") { - // MathML core does not support +width attribute in . - // Firefox does not reliably add side padding. - // Insert - node = new mathMLTree.MathNode("mrow", [ - padding(), - mml.buildGroup(group.body, style), - padding() - ]) - } else { - node = new mathMLTree.MathNode("mrow", [mml.buildGroup(group.body, style)]) - } - switch (group.label) { - case "\\overline": - node.style.padding = "0.1em 0 0 0" - node.style.borderTop = "0.065em solid" - break - case "\\underline": - node.style.padding = "0 0 0.1em 0" - node.style.borderBottom = "0.065em solid" - break - case "\\cancel": - // We can't use an inline background-gradient. It does not work client-side. - // So set a class and put the rule in the external CSS file. - node.classes.push("tml-cancel") - break - case "\\bcancel": - node.classes.push("tml-bcancel") - break - /* - case "\\longdiv": - node.setAttribute("notation", "longdiv"); - break - case "\\phase": - node.setAttribute("notation", "phasorangle"); - break */ - case "\\angl": - node.style.padding = "0.03889em 0.03889em 0 0.03889em" - node.style.borderTop = "0.049em solid" - node.style.borderRight = "0.049em solid" - node.style.marginRight = "0.03889em" - break - case "\\sout": - node.style.backgroundImage = 'linear-gradient(black, black)' - node.style.backgroundRepeat = 'no-repeat' - node.style.backgroundSize = '100% 1.5px' - node.style.backgroundPosition = '0 center' - break - case "\\boxed": - // \newcommand{\boxed}[1]{\fbox{\m@th$\displaystyle#1$}} from amsmath.sty - node.style = { padding: "3pt 0 3pt 0", border: "1px solid" } - node.setAttribute("scriptlevel", "0") - node.setAttribute("displaystyle", "true") - break - case "\\fbox": - node.style = { padding: "3pt", border: "1px solid" } - break - case "\\fcolorbox": - case "\\colorbox": { - // doesn't have a good notation option for \colorbox. - // So use instead. Set some attributes that come - // included with . - //const fboxsep = 3; // 3 pt from LaTeX source2e - //node.setAttribute("height", `+${2 * fboxsep}pt`) - //node.setAttribute("voffset", `${fboxsep}pt`) - const style = { padding: "3pt 0 3pt 0" } - - if (group.label === "\\fcolorbox") { - style.border = "0.06em solid " + String(group.borderColor) - } - node.style = style - break - } - case "\\xcancel": - node.classes.push("tml-xcancel") - break - } - if (group.backgroundColor) { - node.setAttribute("mathbackground", group.backgroundColor); - } - return node; -}; - -defineFunction({ - type: "enclose", - names: ["\\colorbox"], - props: { - numArgs: 2, - numOptionalArgs: 1, - allowedInText: true, - argTypes: ["raw", "raw", "text"] - }, - handler({ parser, funcName }, args, optArgs) { - const model = optArgs[0] && assertNodeType(optArgs[0], "raw").string - let color = "" - if (model) { - const spec = assertNodeType(args[0], "raw").string - color = colorFromSpec(model, spec) - } else { - color = validateColor(assertNodeType(args[0], "raw").string, parser.gullet.macros) - } - const body = args[1]; - return { - type: "enclose", - mode: parser.mode, - label: funcName, - backgroundColor: color, - body - }; - }, - mathmlBuilder -}); - -defineFunction({ - type: "enclose", - names: ["\\fcolorbox"], - props: { - numArgs: 3, - numOptionalArgs: 1, - allowedInText: true, - argTypes: ["raw", "raw", "raw", "text"] - }, - handler({ parser, funcName }, args, optArgs) { - const model = optArgs[0] && assertNodeType(optArgs[0], "raw").string - let borderColor = "" - let backgroundColor - if (model) { - const borderSpec = assertNodeType(args[0], "raw").string - const backgroundSpec = assertNodeType(args[0], "raw").string - borderColor = colorFromSpec(model, borderSpec) - backgroundColor = colorFromSpec(model, backgroundSpec) - } else { - borderColor = validateColor(assertNodeType(args[0], "raw").string, parser.gullet.macros) - backgroundColor = validateColor(assertNodeType(args[1], "raw").string, parser.gullet.macros) - } - const body = args[2]; - return { - type: "enclose", - mode: parser.mode, - label: funcName, - backgroundColor, - borderColor, - body - }; - }, - mathmlBuilder -}); - -defineFunction({ - type: "enclose", - names: ["\\fbox"], - props: { - numArgs: 1, - argTypes: ["hbox"], - allowedInText: true - }, - handler({ parser }, args) { - return { - type: "enclose", - mode: parser.mode, - label: "\\fbox", - body: args[0] - }; - } -}); - -defineFunction({ - type: "enclose", - names: ["\\angl", "\\cancel", "\\bcancel", "\\xcancel", "\\sout", "\\overline", "\\boxed"], - // , "\\phase", "\\longdiv" - props: { - numArgs: 1 - }, - handler({ parser, funcName }, args) { - const body = args[0]; - return { - type: "enclose", - mode: parser.mode, - label: funcName, - body - }; - }, - mathmlBuilder -}); - -defineFunction({ - type: "enclose", - names: ["\\underline"], - props: { - numArgs: 1, - allowedInText: true - }, - handler({ parser, funcName }, args) { - const body = args[0]; - return { - type: "enclose", - mode: parser.mode, - label: funcName, - body - }; - }, - mathmlBuilder -}); diff --git a/src/functions/envTag.js b/src/functions/envTag.js deleted file mode 100644 index 6a035ad0..00000000 --- a/src/functions/envTag.js +++ /dev/null @@ -1,38 +0,0 @@ -import defineFunction from "../defineFunction"; -import mathMLTree from "../mathMLTree"; - -defineFunction({ - type: "envTag", - names: ["\\env@tag"], - props: { - numArgs: 1, - argTypes: ["math"] - }, - handler({ parser }, args) { - return { - type: "envTag", - mode: parser.mode, - body: args[0] - }; - }, - mathmlBuilder(group, style) { - return new mathMLTree.MathNode("mrow"); - } -}); - -defineFunction({ - type: "noTag", - names: ["\\env@notag"], - props: { - numArgs: 0 - }, - handler({ parser }) { - return { - type: "noTag", - mode: parser.mode - }; - }, - mathmlBuilder(group, style) { - return new mathMLTree.MathNode("mrow"); - } -}); diff --git a/src/functions/environment.js b/src/functions/environment.js deleted file mode 100644 index ced5acd0..00000000 --- a/src/functions/environment.js +++ /dev/null @@ -1,59 +0,0 @@ -import defineFunction from "../defineFunction"; -import ParseError from "../ParseError"; -import { assertNodeType } from "../parseNode"; -import environments from "../environments"; - -// Environment delimiters. HTML/MathML rendering is defined in the corresponding -// defineEnvironment definitions. -defineFunction({ - type: "environment", - names: ["\\begin", "\\end"], - props: { - numArgs: 1, - argTypes: ["text"] - }, - handler({ parser, funcName }, args) { - const nameGroup = args[0]; - if (nameGroup.type !== "ordgroup") { - throw new ParseError("Invalid environment name", nameGroup); - } - let envName = ""; - for (let i = 0; i < nameGroup.body.length; ++i) { - envName += assertNodeType(nameGroup.body[i], "textord").text; - } - - if (funcName === "\\begin") { - // begin...end is similar to left...right - if (!Object.prototype.hasOwnProperty.call(environments, envName )) { - throw new ParseError("No such environment: " + envName, nameGroup); - } - // Build the environment object. Arguments and other information will - // be made available to the begin and end methods using properties. - const env = environments[envName]; - const { args, optArgs } = parser.parseArguments("\\begin{" + envName + "}", env); - const context = { - mode: parser.mode, - envName, - parser - }; - const result = env.handler(context, args, optArgs); - parser.expect("\\end", false); - const endNameToken = parser.nextToken; - const end = assertNodeType(parser.parseFunction(), "environment"); - if (end.name !== envName) { - throw new ParseError( - `Mismatch: \\begin{${envName}} matched by \\end{${end.name}}`, - endNameToken - ); - } - return result; - } - - return { - type: "environment", - mode: parser.mode, - name: envName, - nameGroup - }; - } -}); diff --git a/src/functions/font.js b/src/functions/font.js deleted file mode 100644 index 01c72a95..00000000 --- a/src/functions/font.js +++ /dev/null @@ -1,150 +0,0 @@ -import defineFunction, { normalizeArgument } from "../defineFunction" -import * as mml from "../buildMathML" -import mathMLTree from "../mathMLTree" - -const isLongVariableName = (group, font) => { - if (font !== "mathrm" || group.body.type !== "ordgroup" || group.body.body.length === 1) { - return false - } - if (group.body.body[0].type !== "mathord") { return false } - for (let i = 1; i < group.body.body.length; i++) { - const parseNodeType = group.body.body[i].type - if (!(parseNodeType === "mathord" || - (parseNodeType === "textord" && !isNaN(group.body.body[i].text)))) { - return false - } - } - return true -} - -const mathmlBuilder = (group, style) => { - const font = group.font - const newStyle = style.withFont(font) - const mathGroup = mml.buildGroup(group.body, newStyle) - - if (mathGroup.children.length === 0) { return mathGroup } // empty group, e.g., \mathrm{} - if (font === "boldsymbol" && ["mo", "mpadded", "mrow"].includes(mathGroup.type)) { - mathGroup.style.fontWeight = "bold" - return mathGroup - } - // Check if it is possible to consolidate elements into a single element. - if (isLongVariableName(group, font)) { - // This is a \mathrm{…} group. It gets special treatment because symbolsOrd.js - // wraps elements with s to work around a Firefox bug. - const mi = mathGroup.children[0].children[0]; - delete mi.attributes.mathvariant - for (let i = 1; i < mathGroup.children.length; i++) { - mi.children[0].text += mathGroup.children[i].type === "mn" - ? mathGroup.children[i].children[0].text - : mathGroup.children[i].children[0].children[0].text - } - // Wrap in a to prevent the same Firefox bug. - const bogus = new mathMLTree.MathNode("mtext", new mathMLTree.TextNode("\u200b")) - return new mathMLTree.MathNode("mrow", [bogus, mi]) - } - let canConsolidate = mathGroup.children[0].type === "mo" - for (let i = 1; i < mathGroup.children.length; i++) { - if (mathGroup.children[i].type === "mo" && font === "boldsymbol") { - mathGroup.children[i].style.fontWeight = "bold" - } - if (mathGroup.children[i].type !== "mi") { canConsolidate = false } - const localVariant = mathGroup.children[i].attributes && - mathGroup.children[i].attributes.mathvariant || "" - if (localVariant !== "normal") { canConsolidate = false } - } - if (!canConsolidate) { return mathGroup } - // Consolidate the elements. - const mi = mathGroup.children[0]; - for (let i = 1; i < mathGroup.children.length; i++) { - mi.children.push(mathGroup.children[i].children[0]) - } - if (mi.attributes.mathvariant && mi.attributes.mathvariant === "normal") { - // Workaround for a Firefox bug that renders spurious space around - // a - // Ref: https://bugs.webkit.org/show_bug.cgi?id=129097 - // We insert a text node that contains a zero-width space and wrap in an mrow. - // TODO: Get rid of this workaround when the Firefox bug is fixed. - const bogus = new mathMLTree.MathNode("mtext", new mathMLTree.TextNode("\u200b")) - return new mathMLTree.MathNode("mrow", [bogus, mi]) - } - return mi -}; - -const fontAliases = { - "\\Bbb": "\\mathbb", - "\\bold": "\\mathbf", - "\\frak": "\\mathfrak", - "\\bm": "\\boldsymbol" -}; - -defineFunction({ - type: "font", - names: [ - // styles - "\\mathrm", - "\\mathit", - "\\mathbf", - "\\mathnormal", - "\\up@greek", - "\\boldsymbol", - - // families - "\\mathbb", - "\\mathcal", - "\\mathfrak", - "\\mathscr", - "\\mathsf", - "\\mathtt", - - // aliases - "\\Bbb", - "\\bm", - "\\bold", - "\\frak" - ], - props: { - numArgs: 1, - allowedInArgument: true - }, - handler: ({ parser, funcName }, args) => { - const body = normalizeArgument(args[0]); - let func = funcName; - if (func in fontAliases) { - func = fontAliases[func]; - } - return { - type: "font", - mode: parser.mode, - font: func.slice(1), - body - }; - }, - mathmlBuilder -}); - -// Old font changing functions -defineFunction({ - type: "font", - names: ["\\rm", "\\sf", "\\tt", "\\bf", "\\it", "\\cal"], - props: { - numArgs: 0, - allowedInText: true - }, - handler: ({ parser, funcName, breakOnTokenText }, args) => { - const { mode } = parser; - const body = parser.parseExpression(true, breakOnTokenText, true); - const fontStyle = `math${funcName.slice(1)}`; - - return { - type: "font", - mode: mode, - font: fontStyle, - body: { - type: "ordgroup", - mode: parser.mode, - body - } - }; - }, - mathmlBuilder -}); diff --git a/src/functions/genfrac.js b/src/functions/genfrac.js deleted file mode 100644 index 37dd41d3..00000000 --- a/src/functions/genfrac.js +++ /dev/null @@ -1,333 +0,0 @@ -import defineFunction, { normalizeArgument } from "../defineFunction"; -import mathMLTree from "../mathMLTree"; -import { StyleLevel } from "../constants" -import { assertNodeType } from "../parseNode"; -import { assert } from "../utils"; -import * as mml from "../buildMathML"; -import { calculateSize } from "../units"; - -const stylArray = ["display", "text", "script", "scriptscript"]; -const scriptLevel = { auto: -1, display: 0, text: 0, script: 1, scriptscript: 2 }; - -const mathmlBuilder = (group, style) => { - // Track the scriptLevel of the numerator and denominator. - // We may need that info for \mathchoice or for adjusting em dimensions. - const childOptions = group.scriptLevel === "auto" - ? style.incrementLevel() - : group.scriptLevel === "display" - ? style.withLevel(StyleLevel.TEXT) - : group.scriptLevel === "text" - ? style.withLevel(StyleLevel.SCRIPT) - : style.withLevel(StyleLevel.SCRIPTSCRIPT); - - let node = new mathMLTree.MathNode("mfrac", [ - mml.buildGroup(group.numer, childOptions), - mml.buildGroup(group.denom, childOptions) - ]); - - if (!group.hasBarLine) { - node.setAttribute("linethickness", "0px"); - } else if (group.barSize) { - const ruleWidth = calculateSize(group.barSize, style); - node.setAttribute("linethickness", ruleWidth.number + ruleWidth.unit); - } - - if (group.leftDelim != null || group.rightDelim != null) { - const withDelims = []; - - if (group.leftDelim != null) { - const leftOp = new mathMLTree.MathNode("mo", [ - new mathMLTree.TextNode(group.leftDelim.replace("\\", "")) - ]); - leftOp.setAttribute("fence", "true"); - withDelims.push(leftOp); - } - - withDelims.push(node); - - if (group.rightDelim != null) { - const rightOp = new mathMLTree.MathNode("mo", [ - new mathMLTree.TextNode(group.rightDelim.replace("\\", "")) - ]); - rightOp.setAttribute("fence", "true"); - withDelims.push(rightOp); - } - - node = mml.makeRow(withDelims); - } - - if (group.scriptLevel !== "auto") { - node = new mathMLTree.MathNode("mstyle", [node]); - node.setAttribute("displaystyle", String(group.scriptLevel === "display")); - node.setAttribute("scriptlevel", scriptLevel[group.scriptLevel]); - } - - return node; -}; - -defineFunction({ - type: "genfrac", - names: [ - "\\dfrac", - "\\frac", - "\\tfrac", - "\\dbinom", - "\\binom", - "\\tbinom", - "\\\\atopfrac", // can’t be entered directly - "\\\\bracefrac", - "\\\\brackfrac" // ditto - ], - props: { - numArgs: 2, - allowedInArgument: true - }, - handler: ({ parser, funcName }, args) => { - const numer = args[0]; - const denom = args[1]; - let hasBarLine = false; - let leftDelim = null; - let rightDelim = null; - let scriptLevel = "auto"; - - switch (funcName) { - case "\\dfrac": - case "\\frac": - case "\\tfrac": - hasBarLine = true; - break; - case "\\\\atopfrac": - hasBarLine = false; - break; - case "\\dbinom": - case "\\binom": - case "\\tbinom": - leftDelim = "("; - rightDelim = ")"; - break; - case "\\\\bracefrac": - leftDelim = "\\{"; - rightDelim = "\\}"; - break; - case "\\\\brackfrac": - leftDelim = "["; - rightDelim = "]"; - break; - default: - throw new Error("Unrecognized genfrac command"); - } - - switch (funcName) { - case "\\dfrac": - case "\\dbinom": - scriptLevel = "display"; - break; - case "\\tfrac": - case "\\tbinom": - scriptLevel = "text"; - break; - } - - return { - type: "genfrac", - mode: parser.mode, - continued: false, - numer, - denom, - hasBarLine, - leftDelim, - rightDelim, - scriptLevel, - barSize: null - }; - }, - mathmlBuilder -}); - -defineFunction({ - type: "genfrac", - names: ["\\cfrac"], - props: { - numArgs: 2 - }, - handler: ({ parser, funcName }, args) => { - const numer = args[0]; - const denom = args[1]; - - return { - type: "genfrac", - mode: parser.mode, - continued: true, - numer, - denom, - hasBarLine: true, - leftDelim: null, - rightDelim: null, - scriptLevel: "display", - barSize: null - }; - } -}); - -// Infix generalized fractions -- these are not rendered directly, but replaced -// immediately by one of the variants above. -defineFunction({ - type: "infix", - names: ["\\over", "\\choose", "\\atop", "\\brace", "\\brack"], - props: { - numArgs: 0, - infix: true - }, - handler({ parser, funcName, token }) { - let replaceWith; - switch (funcName) { - case "\\over": - replaceWith = "\\frac"; - break; - case "\\choose": - replaceWith = "\\binom"; - break; - case "\\atop": - replaceWith = "\\\\atopfrac"; - break; - case "\\brace": - replaceWith = "\\\\bracefrac"; - break; - case "\\brack": - replaceWith = "\\\\brackfrac"; - break; - default: - throw new Error("Unrecognized infix genfrac command"); - } - return { - type: "infix", - mode: parser.mode, - replaceWith, - token - }; - } -}); - -const delimFromValue = function(delimString) { - let delim = null; - if (delimString.length > 0) { - delim = delimString; - delim = delim === "." ? null : delim; - } - return delim; -}; - -defineFunction({ - type: "genfrac", - names: ["\\genfrac"], - props: { - numArgs: 6, - allowedInArgument: true, - argTypes: ["math", "math", "size", "text", "math", "math"] - }, - handler({ parser }, args) { - const numer = args[4]; - const denom = args[5]; - - // Look into the parse nodes to get the desired delimiters. - const leftNode = normalizeArgument(args[0]); - const leftDelim = leftNode.type === "atom" && leftNode.family === "open" - ? delimFromValue(leftNode.text) - : null; - const rightNode = normalizeArgument(args[1]); - const rightDelim = - rightNode.type === "atom" && rightNode.family === "close" - ? delimFromValue(rightNode.text) - : null; - - const barNode = assertNodeType(args[2], "size"); - let hasBarLine; - let barSize = null; - if (barNode.isBlank) { - // \genfrac acts differently than \above. - // \genfrac treats an empty size group as a signal to use a - // standard bar size. \above would see size = 0 and omit the bar. - hasBarLine = true; - } else { - barSize = barNode.value; - hasBarLine = barSize.number > 0; - } - - // Find out if we want displaystyle, textstyle, etc. - let scriptLevel = "auto"; - let styl = args[3]; - if (styl.type === "ordgroup") { - if (styl.body.length > 0) { - const textOrd = assertNodeType(styl.body[0], "textord"); - scriptLevel = stylArray[Number(textOrd.text)]; - } - } else { - styl = assertNodeType(styl, "textord"); - scriptLevel = stylArray[Number(styl.text)]; - } - - return { - type: "genfrac", - mode: parser.mode, - numer, - denom, - continued: false, - hasBarLine, - barSize, - leftDelim, - rightDelim, - scriptLevel - }; - }, - mathmlBuilder -}); - -// \above is an infix fraction that also defines a fraction bar size. -defineFunction({ - type: "infix", - names: ["\\above"], - props: { - numArgs: 1, - argTypes: ["size"], - infix: true - }, - handler({ parser, funcName, token }, args) { - return { - type: "infix", - mode: parser.mode, - replaceWith: "\\\\abovefrac", - barSize: assertNodeType(args[0], "size").value, - token - }; - } -}); - -defineFunction({ - type: "genfrac", - names: ["\\\\abovefrac"], - props: { - numArgs: 3, - argTypes: ["math", "size", "math"] - }, - handler: ({ parser, funcName }, args) => { - const numer = args[0]; - const barSize = assert(assertNodeType(args[1], "infix").barSize); - const denom = args[2]; - - const hasBarLine = barSize.number > 0; - return { - type: "genfrac", - mode: parser.mode, - numer, - denom, - continued: false, - hasBarLine, - barSize, - leftDelim: null, - rightDelim: null, - scriptLevel: "auto" - }; - }, - - mathmlBuilder -}); diff --git a/src/functions/hbox.js b/src/functions/hbox.js deleted file mode 100644 index e93133d4..00000000 --- a/src/functions/hbox.js +++ /dev/null @@ -1,30 +0,0 @@ -import defineFunction, { ordargument } from "../defineFunction"; -import { StyleLevel } from "../constants" -import * as mml from "../buildMathML"; - -// \hbox is provided for compatibility with LaTeX functions that act on a box. -// This function by itself doesn't do anything but set scriptlevel to \textstyle -// and prevent a soft line break. - -defineFunction({ - type: "hbox", - names: ["\\hbox"], - props: { - numArgs: 1, - argTypes: ["hbox"], - allowedInArgument: true, - allowedInText: false - }, - handler({ parser }, args) { - return { - type: "hbox", - mode: parser.mode, - body: ordargument(args[0]) - }; - }, - mathmlBuilder(group, style) { - const newStyle = style.withLevel(StyleLevel.TEXT) - const mrow = mml.buildExpressionRow(group.body, newStyle) - return mml.consolidateText(mrow) - } -}); diff --git a/src/functions/horizBrace.js b/src/functions/horizBrace.js deleted file mode 100644 index 095364f8..00000000 --- a/src/functions/horizBrace.js +++ /dev/null @@ -1,32 +0,0 @@ -import defineFunction from "../defineFunction"; -import mathMLTree from "../mathMLTree"; -import stretchy from "../stretchy"; -import * as mml from "../buildMathML"; - -const mathmlBuilder = (group, style) => { - const accentNode = stretchy.mathMLnode(group.label); - accentNode.style["math-depth"] = 0 - return new mathMLTree.MathNode(group.isOver ? "mover" : "munder", [ - mml.buildGroup(group.base, style), - accentNode - ]); -}; - -// Horizontal stretchy braces -defineFunction({ - type: "horizBrace", - names: ["\\overbrace", "\\underbrace"], - props: { - numArgs: 1 - }, - handler({ parser, funcName }, args) { - return { - type: "horizBrace", - mode: parser.mode, - label: funcName, - isOver: /^\\over/.test(funcName), - base: args[0] - }; - }, - mathmlBuilder -}); diff --git a/src/functions/href.js b/src/functions/href.js deleted file mode 100644 index 7c35d50c..00000000 --- a/src/functions/href.js +++ /dev/null @@ -1,90 +0,0 @@ -import defineFunction, { ordargument } from "../defineFunction"; -import { assertNodeType } from "../parseNode"; -import { MathNode } from "../mathMLTree"; -import * as mml from "../buildMathML"; -import ParseError from "../ParseError"; - -defineFunction({ - type: "href", - names: ["\\href"], - props: { - numArgs: 2, - argTypes: ["url", "original"], - allowedInText: true - }, - handler: ({ parser, token }, args) => { - const body = args[1]; - const href = assertNodeType(args[0], "url").url; - - if ( - !parser.settings.isTrusted({ - command: "\\href", - url: href - }) - ) { - throw new ParseError(`Function "\\href" is not trusted`, token) - } - - return { - type: "href", - mode: parser.mode, - href, - body: ordargument(body) - }; - }, - mathmlBuilder: (group, style) => { - let math = mml.buildExpressionRow(group.body, style); - if (!(math instanceof MathNode)) { - math = new MathNode("mrow", [math]); - } - math.setAttribute("href", group.href); - return math; - } -}); - -defineFunction({ - type: "href", - names: ["\\url"], - props: { - numArgs: 1, - argTypes: ["url"], - allowedInText: true - }, - handler: ({ parser, token }, args) => { - const href = assertNodeType(args[0], "url").url; - - if ( - !parser.settings.isTrusted({ - command: "\\url", - url: href - }) - ) { - throw new ParseError(`Function "\\url" is not trusted`, token) - } - - const chars = []; - for (let i = 0; i < href.length; i++) { - let c = href[i]; - if (c === "~") { - c = "\\textasciitilde"; - } - chars.push({ - type: "textord", - mode: "text", - text: c - }); - } - const body = { - type: "text", - mode: parser.mode, - font: "\\texttt", - body: chars - }; - return { - type: "href", - mode: parser.mode, - href, - body: ordargument(body) - }; - } -}); diff --git a/src/functions/html.js b/src/functions/html.js deleted file mode 100644 index 4b4124ba..00000000 --- a/src/functions/html.js +++ /dev/null @@ -1,95 +0,0 @@ -import defineFunction, { ordargument } from "../defineFunction"; -import { assertNodeType } from "../parseNode"; -import ParseError from "../ParseError"; - -import * as mml from "../buildMathML"; - -defineFunction({ - type: "html", - names: ["\\class", "\\id", "\\style", "\\data"], - props: { - numArgs: 2, - argTypes: ["raw", "original"], - allowedInText: true - }, - handler: ({ parser, funcName, token }, args) => { - const value = assertNodeType(args[0], "raw").string; - const body = args[1]; - - if (parser.settings.strict) { - throw new ParseError(`Function "${funcName}" is disabled in strict mode`, token) - } - - let trustContext; - const attributes = {}; - - switch (funcName) { - case "\\class": - attributes.class = value; - trustContext = { - command: "\\class", - class: value - }; - break; - case "\\id": - attributes.id = value; - trustContext = { - command: "\\id", - id: value - }; - break; - case "\\style": - attributes.style = value; - trustContext = { - command: "\\style", - style: value - }; - break; - case "\\data": { - const data = value.split(","); - for (let i = 0; i < data.length; i++) { - const keyVal = data[i].split("="); - if (keyVal.length !== 2) { - throw new ParseError("Error parsing key-value for \\data"); - } - attributes["data-" + keyVal[0].trim()] = keyVal[1].trim(); - } - - trustContext = { - command: "\\data", - attributes - }; - break; - } - default: - throw new Error("Unrecognized html command"); - } - - if (!parser.settings.isTrusted(trustContext)) { - throw new ParseError(`Function "${funcName}" is not trusted`, token) - } - return { - type: "html", - mode: parser.mode, - attributes, - body: ordargument(body) - }; - }, - mathmlBuilder: (group, style) => { - const element = mml.buildExpressionRow(group.body, style); - - const classes = []; - if (group.attributes.class) { - classes.push(...group.attributes.class.trim().split(/\s+/)); - } - element.classes = classes; - - for (const attr in group.attributes) { - if (attr !== "class" && Object.prototype.hasOwnProperty.call(group.attributes, attr)) { - element.setAttribute(attr, group.attributes[attr]); - } - } - - return element; - } -}); diff --git a/src/functions/includegraphics.js b/src/functions/includegraphics.js deleted file mode 100644 index 574b53e1..00000000 --- a/src/functions/includegraphics.js +++ /dev/null @@ -1,131 +0,0 @@ -import defineFunction from "../defineFunction" -import { calculateSize, validUnit } from "../units" -import ParseError from "../ParseError" -import { Img } from "../domTree" -import mathMLTree from "../mathMLTree" -import { assertNodeType } from "../parseNode" - -const sizeData = function(str) { - if (/^[-+]? *(\d+(\.\d*)?|\.\d+)$/.test(str)) { - // str is a number with no unit specified. - // default unit is bp, per graphix package. - return { number: +str, unit: "bp" } - } else { - const match = /([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(str); - if (!match) { - throw new ParseError("Invalid size: '" + str + "' in \\includegraphics"); - } - const data = { - number: +(match[1] + match[2]), // sign + magnitude, cast to number - unit: match[3] - } - if (!validUnit(data)) { - throw new ParseError("Invalid unit: '" + data.unit + "' in \\includegraphics."); - } - return data - } -} - -defineFunction({ - type: "includegraphics", - names: ["\\includegraphics"], - props: { - numArgs: 1, - numOptionalArgs: 1, - argTypes: ["raw", "url"], - allowedInText: false - }, - handler: ({ parser, token }, args, optArgs) => { - let width = { number: 0, unit: "em" } - let height = { number: 0.9, unit: "em" } // sorta character sized. - let totalheight = { number: 0, unit: "em" } - let alt = "" - - if (optArgs[0]) { - const attributeStr = assertNodeType(optArgs[0], "raw").string - - // Parser.js does not parse key/value pairs. We get a string. - const attributes = attributeStr.split(",") - for (let i = 0; i < attributes.length; i++) { - const keyVal = attributes[i].split("=") - if (keyVal.length === 2) { - const str = keyVal[1].trim() - switch (keyVal[0].trim()) { - case "alt": - alt = str - break - case "width": - width = sizeData(str) - break - case "height": - height = sizeData(str) - break - case "totalheight": - totalheight = sizeData(str) - break - default: - throw new ParseError("Invalid key: '" + keyVal[0] + "' in \\includegraphics.") - } - } - } - } - - const src = assertNodeType(args[0], "url").url - - if (alt === "") { - // No alt given. Use the file name. Strip away the path. - alt = src - alt = alt.replace(/^.*[\\/]/, "") - alt = alt.substring(0, alt.lastIndexOf(".")) - } - - if ( - !parser.settings.isTrusted({ - command: "\\includegraphics", - url: src - }) - ) { - throw new ParseError(`Function "\\includegraphics" is not trusted`, token) - } - - return { - type: "includegraphics", - mode: parser.mode, - alt: alt, - width: width, - height: height, - totalheight: totalheight, - src: src - } - }, - mathmlBuilder: (group, style) => { - const height = calculateSize(group.height, style) - const depth = { number: 0, unit: "em" } - - if (group.totalheight.number > 0) { - if (group.totalheight.unit === height.unit && - group.totalheight.number > height.number) { - depth.number = group.totalheight.number - height.number - depth.unit = height.unit - } - } - - let width = 0 - if (group.width.number > 0) { - width = calculateSize(group.width, style) - } - - const graphicStyle = { height: height.number + depth.number + "em" } - if (width.number > 0) { - graphicStyle.width = width.number + width.unit - } - if (depth.number > 0) { - graphicStyle.verticalAlign = -depth.number + depth.unit - } - - const node = new Img(group.src, group.alt, graphicStyle) - node.height = height - node.depth = depth - return new mathMLTree.MathNode("mtext", [node]) - } -}) diff --git a/src/functions/kern.js b/src/functions/kern.js deleted file mode 100644 index e3a369ef..00000000 --- a/src/functions/kern.js +++ /dev/null @@ -1,75 +0,0 @@ -// Horizontal spacing commands - -import defineFunction from "../defineFunction"; -import mathMLTree from "../mathMLTree"; -import { calculateSize } from "../units"; -import { assertNodeType } from "../parseNode"; -import ParseError from "../ParseError" - -// TODO: \hskip and \mskip should support plus and minus in lengths - -defineFunction({ - type: "kern", - names: ["\\kern", "\\mkern", "\\hskip", "\\mskip"], - props: { - numArgs: 1, - argTypes: ["size"], - primitive: true, - allowedInText: true - }, - handler({ parser, funcName, token }, args) { - const size = assertNodeType(args[0], "size"); - if (parser.settings.strict) { - const mathFunction = funcName[1] === "m"; // \mkern, \mskip - const muUnit = size.value.unit === "mu"; - if (mathFunction) { - if (!muUnit) { - throw new ParseError(`LaTeX's ${funcName} supports only mu units, ` + - `not ${size.value.unit} units`, token) - } - if (parser.mode !== "math") { - throw new ParseError(`LaTeX's ${funcName} works only in math mode`, token) - } - } else { - // !mathFunction - if (muUnit) { - throw new ParseError(`LaTeX's ${funcName} doesn't support mu units`, token) - } - } - } - return { - type: "kern", - mode: parser.mode, - dimension: size.value - }; - }, - mathmlBuilder(group, style) { - const dimension = calculateSize(group.dimension, style); - const ch = dimension.unit === "em" ? spaceCharacter(dimension.number) : ""; - if (group.mode === "text" && ch.length > 0) { - const character = new mathMLTree.TextNode(ch); - return new mathMLTree.MathNode("mtext", [character]); - } else { - const node = new mathMLTree.MathNode("mspace"); - node.setAttribute("width", dimension.number + dimension.unit); - if (dimension.number < 0) { - node.style.marginLeft = dimension.number + dimension.unit - } - return node; - } - } -}); - -export const spaceCharacter = function(width) { - if (width >= 0.05555 && width <= 0.05556) { - return "\u200a"; //   - } else if (width >= 0.1666 && width <= 0.1667) { - return "\u2009"; //   - } else if (width >= 0.2222 && width <= 0.2223) { - return "\u2005"; //   - } else if (width >= 0.2777 && width <= 0.2778) { - return "\u2005\u200a"; //    - } else { - return ""; - } -}; diff --git a/src/functions/label.js b/src/functions/label.js deleted file mode 100644 index 458cabee..00000000 --- a/src/functions/label.js +++ /dev/null @@ -1,29 +0,0 @@ -import defineFunction from "../defineFunction"; -import mathMLTree from "../mathMLTree"; - -// Limit valid characters to a small set, for safety. -export const invalidIdRegEx = /[^A-Za-z_0-9-]/g - -defineFunction({ - type: "label", - names: ["\\label"], - props: { - numArgs: 1, - argTypes: ["raw"] - }, - handler({ parser }, args) { - return { - type: "label", - mode: parser.mode, - string: args[0].string.replace(invalidIdRegEx, "") - }; - }, - mathmlBuilder(group, style) { - // Return a no-width, no-ink element with an HTML id. - const node = new mathMLTree.MathNode("mrow", [], ["tml-label"]) - if (group.string.length > 0) { - node.setAttribute("id", group.string) - } - return node - } -}); diff --git a/src/functions/lap.js b/src/functions/lap.js deleted file mode 100644 index f0c5500d..00000000 --- a/src/functions/lap.js +++ /dev/null @@ -1,75 +0,0 @@ -// Horizontal overlap functions -import defineFunction, { ordargument } from "../defineFunction"; -import mathMLTree from "../mathMLTree" -import * as mml from "../buildMathML" -import ParseError from "../ParseError"; - -const textModeLap = ["\\clap", "\\llap", "\\rlap"]; - -defineFunction({ - type: "lap", - names: ["\\mathllap", "\\mathrlap", "\\mathclap", "\\clap", "\\llap", "\\rlap"], - props: { - numArgs: 1, - allowedInText: true - }, - handler: ({ parser, funcName, token }, args) => { - if (textModeLap.includes(funcName)) { - if (parser.settings.strict && parser.mode !== "text") { - throw new ParseError(`{${funcName}} can be used only in text mode. - Try \\math${funcName.slice(1)}`, token) - } - funcName = funcName.slice(1) - } else { - funcName = funcName.slice(5) - } - const body = args[0] - return { - type: "lap", - mode: parser.mode, - alignment: funcName, - body - } - }, - mathmlBuilder: (group, style) => { - // mathllap, mathrlap, mathclap - let strut - if (group.alignment === "llap") { - // We need an invisible strut with the same depth as the group. - // We can't just read the depth, so we use \vphantom methods. - const phantomInner = mml.buildExpression(ordargument(group.body), style); - const phantom = new mathMLTree.MathNode("mphantom", phantomInner); - strut = new mathMLTree.MathNode("mpadded", [phantom]); - strut.setAttribute("width", "0px"); - } - - const inner = mml.buildGroup(group.body, style) - let node - if (group.alignment === "llap") { - inner.style.position = "absolute" - inner.style.right = "0" - inner.style.bottom = `0` // If we could have read the ink depth, it would go here. - node = new mathMLTree.MathNode("mpadded", [strut, inner]) - } else { - node = new mathMLTree.MathNode("mpadded", [inner]) - } - - if (group.alignment === "rlap") { - if (group.body.body.length > 0 && group.body.body[0].type === "genfrac") { - // In Firefox, a squashes the 3/18em padding of a child \frac. Put it back. - node.setAttribute("lspace", "0.16667em") - } - } else { - const offset = group.alignment === "llap" ? "-1" : "-0.5" - node.setAttribute("lspace", offset + "width") - if (group.alignment === "llap") { - node.style.position = "relative" - } else { - node.style.display = "flex" - node.style.justifyContent = "center" - } - } - node.setAttribute("width", "0px") - return node - } -}) diff --git a/src/functions/math.js b/src/functions/math.js deleted file mode 100644 index 0f036018..00000000 --- a/src/functions/math.js +++ /dev/null @@ -1,40 +0,0 @@ -import defineFunction from "../defineFunction"; -import ParseError from "../ParseError"; - -// Switching from text mode back to math mode -defineFunction({ - type: "ordgroup", - names: ["\\(", "$"], - props: { - numArgs: 0, - allowedInText: true, - allowedInMath: false - }, - handler({ funcName, parser }, args) { - const outerMode = parser.mode; - parser.switchMode("math"); - const close = funcName === "\\(" ? "\\)" : "$"; - const body = parser.parseExpression(false, close); - parser.expect(close); - parser.switchMode(outerMode); - return { - type: "ordgroup", - mode: parser.mode, - body - }; - } -}); - -// Check for extra closing math delimiters -defineFunction({ - type: "text", // Doesn't matter what this is. - names: ["\\)", "\\]"], - props: { - numArgs: 0, - allowedInText: true, - allowedInMath: false - }, - handler(context, token) { - throw new ParseError(`Mismatched ${context.funcName}`, token); - } -}); diff --git a/src/functions/mathchoice.js b/src/functions/mathchoice.js deleted file mode 100644 index 1bb2390b..00000000 --- a/src/functions/mathchoice.js +++ /dev/null @@ -1,41 +0,0 @@ -import defineFunction, { ordargument } from "../defineFunction"; -import { StyleLevel } from "../constants"; -import * as mml from "../buildMathML"; - -const chooseStyle = (group, style) => { - switch (style.level) { - case StyleLevel.DISPLAY: // 0 - return group.display; - case StyleLevel.TEXT: // 1 - return group.text; - case StyleLevel.SCRIPT: // 2 - return group.script; - case StyleLevel.SCRIPTSCRIPT: // 3 - return group.scriptscript; - default: - return group.text; - } -}; - -defineFunction({ - type: "mathchoice", - names: ["\\mathchoice"], - props: { - numArgs: 4, - primitive: true - }, - handler: ({ parser }, args) => { - return { - type: "mathchoice", - mode: parser.mode, - display: ordargument(args[0]), - text: ordargument(args[1]), - script: ordargument(args[2]), - scriptscript: ordargument(args[3]) - }; - }, - mathmlBuilder: (group, style) => { - const body = chooseStyle(group, style); - return mml.buildExpressionRow(body, style); - } -}); diff --git a/src/functions/mclass.js b/src/functions/mclass.js deleted file mode 100644 index 1e7dd332..00000000 --- a/src/functions/mclass.js +++ /dev/null @@ -1,207 +0,0 @@ -import defineFunction, { ordargument } from "../defineFunction"; -import symbols from "../symbols"; -import mathMLTree from "../mathMLTree"; -import utils from "../utils"; - -import * as mml from "../buildMathML"; - -const textAtomTypes = ["text", "textord", "mathord", "atom"] - -const padding = width => { - const node = new mathMLTree.MathNode("mspace") - node.setAttribute("width", width + "em") - return node -} - -function mathmlBuilder(group, style) { - let node; - const inner = mml.buildExpression(group.body, style); - - if (group.mclass === "minner") { - node = new mathMLTree.MathNode("mpadded", inner) - } else if (group.mclass === "mord") { - if (group.isCharacterBox || inner[0].type === "mathord") { - node = inner[0]; - node.type = "mi"; - if (node.children.length === 1 && node.children[0].text && node.children[0].text === "∇") { - node.setAttribute("mathvariant", "normal") - } - } else { - node = new mathMLTree.MathNode("mi", inner); - } - } else { - node = new mathMLTree.MathNode("mrow", inner) - if (group.mustPromote) { - node = inner[0]; - node.type = "mo"; - if (group.isCharacterBox && group.body[0].text && /[A-Za-z]/.test(group.body[0].text)) { - node.setAttribute("mathvariant", "italic") - } - } else { - node = new mathMLTree.MathNode("mrow", inner); - } - - // Set spacing based on what is the most likely adjacent atom type. - // See TeXbook p170. - const doSpacing = style.level < 2 // Operator spacing is zero inside a (sub|super)script. - if (node.type === "mrow") { - if (doSpacing ) { - if (group.mclass === "mbin") { - // medium space - node.children.unshift(padding(0.2222)) - node.children.push(padding(0.2222)) - } else if (group.mclass === "mrel") { - // thickspace - node.children.unshift(padding(0.2778)) - node.children.push(padding(0.2778)) - } else if (group.mclass === "mpunct") { - node.children.push(padding(0.1667)) - } else if (group.mclass === "minner") { - node.children.unshift(padding(0.0556)) // 1 mu is the most likely option - node.children.push(padding(0.0556)) - } - } - } else { - if (group.mclass === "mbin") { - // medium space - node.attributes.lspace = (doSpacing ? "0.2222em" : "0") - node.attributes.rspace = (doSpacing ? "0.2222em" : "0") - } else if (group.mclass === "mrel") { - // thickspace - node.attributes.lspace = (doSpacing ? "0.2778em" : "0") - node.attributes.rspace = (doSpacing ? "0.2778em" : "0") - } else if (group.mclass === "mpunct") { - node.attributes.lspace = "0em"; - node.attributes.rspace = (doSpacing ? "0.1667em" : "0") - } else if (group.mclass === "mopen" || group.mclass === "mclose") { - node.attributes.lspace = "0em" - node.attributes.rspace = "0em" - } else if (group.mclass === "minner" && doSpacing) { - node.attributes.lspace = "0.0556em" // 1 mu is the most likely option - node.attributes.width = "+0.1111em" - } - } - - if (!(group.mclass === "mopen" || group.mclass === "mclose")) { - delete node.attributes.stretchy - delete node.attributes.form - } - } - return node; -} - -// Math class commands except \mathop -defineFunction({ - type: "mclass", - names: [ - "\\mathord", - "\\mathbin", - "\\mathrel", - "\\mathopen", - "\\mathclose", - "\\mathpunct", - "\\mathinner" - ], - props: { - numArgs: 1, - primitive: true - }, - handler({ parser, funcName }, args) { - const body = args[0] - const isCharacterBox = utils.isCharacterBox(body) - // We should not wrap a around a or . That would be invalid MathML. - // In that case, we instead promote the text contents of the body to the parent. - let mustPromote = true - const mord = { type: "mathord", text: "", mode: parser.mode } - const arr = (body.body) ? body.body : [body]; - for (const arg of arr) { - if (textAtomTypes.includes(arg.type)) { - if (symbols[parser.mode][arg.text]) { - mord.text += symbols[parser.mode][arg.text].replace - } else if (arg.text) { - mord.text += arg.text - } else if (arg.body) { - arg.body.map(e => { mord.text += e.text }) - } - } else { - mustPromote = false - break - } - } - return { - type: "mclass", - mode: parser.mode, - mclass: "m" + funcName.slice(5), - body: ordargument(mustPromote ? mord : body), - isCharacterBox, - mustPromote - }; - }, - mathmlBuilder -}); - -export const binrelClass = (arg) => { - // \binrel@ spacing varies with (bin|rel|ord) of the atom in the argument. - // (by rendering separately and with {}s before and after, and measuring - // the change in spacing). We'll do roughly the same by detecting the - // atom type directly. - const atom = arg.type === "ordgroup" && arg.body.length ? arg.body[0] : arg; - if (atom.type === "atom" && (atom.family === "bin" || atom.family === "rel")) { - return "m" + atom.family; - } else { - return "mord"; - } -}; - -// \@binrel{x}{y} renders like y but as mbin/mrel/mord if x is mbin/mrel/mord. -// This is equivalent to \binrel@{x}\binrel@@{y} in AMSTeX. -defineFunction({ - type: "mclass", - names: ["\\@binrel"], - props: { - numArgs: 2 - }, - handler({ parser }, args) { - return { - type: "mclass", - mode: parser.mode, - mclass: binrelClass(args[0]), - body: ordargument(args[1]), - isCharacterBox: utils.isCharacterBox(args[1]) - }; - } -}); - -// Build a relation or stacked op by placing one symbol on top of another -defineFunction({ - type: "mclass", - names: ["\\stackrel", "\\overset", "\\underset"], - props: { - numArgs: 2 - }, - handler({ parser, funcName }, args) { - const baseArg = args[1]; - const shiftedArg = args[0]; - - const baseOp = { - type: "op", - mode: baseArg.mode, - limits: true, - alwaysHandleSupSub: true, - parentIsSupSub: false, - symbol: false, - stack: true, - suppressBaseShift: funcName !== "\\stackrel", - body: ordargument(baseArg) - }; - - return { - type: "supsub", - mode: shiftedArg.mode, - base: baseOp, - sup: funcName === "\\underset" ? null : shiftedArg, - sub: funcName === "\\underset" ? shiftedArg : null - }; - }, - mathmlBuilder -}); diff --git a/src/functions/multiscript.js b/src/functions/multiscript.js deleted file mode 100644 index ce3da76e..00000000 --- a/src/functions/multiscript.js +++ /dev/null @@ -1,91 +0,0 @@ -import defineFunction from "../defineFunction"; -import mathMLTree from "../mathMLTree"; -import * as mml from "../buildMathML" -import ParseError from "../ParseError"; - -// Helper function -export const buildGroup = (el, style, noneNode) => { - if (!el) { return noneNode } - const node = mml.buildGroup(el, style) - if (node.type === "mrow" && node.children.length === 0) { return noneNode } - return node -} - -defineFunction({ - type: "multiscript", - names: ["\\sideset", "\\pres@cript"], // See macros.js for \prescript - props: { - numArgs: 3 - }, - handler({ parser, funcName, token }, args) { - if (args[2].body.length === 0) { - throw new ParseError(funcName + `cannot parse an empty base.`) - } - const base = args[2].body[0] - if (parser.settings.strict && funcName === "\\sideset" && !base.symbol) { - throw new ParseError(`The base of \\sideset must be a big operator. Try \\prescript.`) - } - - if ((args[0].body.length > 0 && args[0].body[0].type !== "supsub") || - (args[1].body.length > 0 && args[1].body[0].type !== "supsub")) { - throw new ParseError("\\sideset can parse only subscripts and " + - "superscripts in its first two arguments", token) - } - - // The prescripts and postscripts come wrapped in a supsub. - const prescripts = args[0].body.length > 0 ? args[0].body[0] : null - const postscripts = args[1].body.length > 0 ? args[1].body[0] : null - - if (!prescripts && !postscripts) { - return base - } else if (!prescripts) { - // It's not a multi-script. Get a \textstyle supsub. - return { - type: "styling", - mode: parser.mode, - scriptLevel: "text", - body: [{ - type: "supsub", - mode: parser.mode, - base, - sup: postscripts.sup, - sub: postscripts.sub - }] - } - } else { - return { - type: "multiscript", - mode: parser.mode, - isSideset: funcName === "\\sideset", - prescripts, - postscripts, - base - } - } - }, - mathmlBuilder(group, style) { - const base = mml.buildGroup(group.base, style) - - const prescriptsNode = new mathMLTree.MathNode("mprescripts") - const noneNode = new mathMLTree.MathNode("none") - let children = [] - - const preSub = buildGroup(group.prescripts.sub, style, noneNode) - const preSup = buildGroup(group.prescripts.sup, style, noneNode) - if (group.isSideset) { - // This seems silly, but LaTeX does this. Firefox ignores it, which does not make me sad. - preSub.setAttribute("style", "text-align: left;") - preSup.setAttribute("style", "text-align: left;") - } - - if (group.postscripts) { - const postSub = buildGroup(group.postscripts.sub, style, noneNode) - const postSup = buildGroup(group.postscripts.sup, style, noneNode) - children = [base, postSub, postSup, prescriptsNode, preSub, preSup] - } else { - children = [base, prescriptsNode, preSub, preSup] - } - - return new mathMLTree.MathNode("mmultiscripts", children); - } -}); diff --git a/src/functions/not.js b/src/functions/not.js deleted file mode 100644 index d70662da..00000000 --- a/src/functions/not.js +++ /dev/null @@ -1,46 +0,0 @@ -import defineFunction, { ordargument } from "../defineFunction"; -import symbols from "../symbols"; -import * as mml from "../buildMathML"; -import utils from "../utils" - -defineFunction({ - type: "not", - names: ["\\not"], - props: { - numArgs: 1, - primitive: true, - allowedInText: false - }, - handler({ parser }, args) { - const isCharacterBox = utils.isCharacterBox(args[0]) - let body - if (isCharacterBox) { - body = ordargument(args[0]) - if (body[0].text.charAt(0) === "\\") { - body[0].text = symbols.math[body[0].text].replace - } - // \u0338 is the Unicode Combining Long Solidus Overlay - body[0].text = body[0].text.slice(0, 1) + "\u0338" + body[0].text.slice(1) - } else { - // When the argument is not a character box, TeX does an awkward, poorly placed overlay. - // We'll do the same. - const notNode = { type: "textord", mode: "math", text: "\u0338" } - const kernNode = { type: "kern", mode: "math", dimension: { number: -0.6, unit: "em" } } - body = [notNode, kernNode, args[0]] - } - return { - type: "not", - mode: parser.mode, - body, - isCharacterBox - }; - }, - mathmlBuilder(group, style) { - if (group.isCharacterBox) { - const inner = mml.buildExpression(group.body, style, true); - return inner[0] - } else { - return mml.buildExpressionRow(group.body, style) - } - } -}); diff --git a/src/functions/op.js b/src/functions/op.js deleted file mode 100644 index 772a0da4..00000000 --- a/src/functions/op.js +++ /dev/null @@ -1,346 +0,0 @@ -// Limits, symbols -import defineFunction, { ordargument } from "../defineFunction"; -import * as mathMLTree from "../mathMLTree"; -import * as mml from "../buildMathML"; -import { isDelimiter } from "./delimsizing" - -// Some helpers - -const ordAtomTypes = ["textord", "mathord", "atom"] - -// Most operators have a large successor symbol, but these don't. -const noSuccessor = ["\\smallint"]; - -// Math operators (e.g. \sin) need a space between these types and themselves: -export const ordTypes = ["textord", "mathord", "ordgroup", "close", "leftright"]; - -// NOTE: Unlike most `builders`s, this one handles not only "op", but also -// "supsub" since some of them (like \int) can affect super/subscripting. - -const setSpacing = node => { - // The user wrote a \mathop{…} function. Change spacing from default to OP spacing. - // The most likely spacing for an OP is a thin space per TeXbook p170. - node.attributes.lspace = "0.1667em" - node.attributes.rspace = "0.1667em" -} - -const mathmlBuilder = (group, style) => { - let node; - - if (group.symbol) { - // This is a symbol. Just add the symbol. - node = new mathMLTree.MathNode("mo", [mml.makeText(group.name, group.mode)]); - if (noSuccessor.includes(group.name)) { - node.setAttribute("largeop", "false") - } else { - node.setAttribute("movablelimits", "false") - } - if (group.fromMathOp) { setSpacing(node) } - } else if (group.body) { - // This is an operator with children. Add them. - node = new mathMLTree.MathNode("mo", mml.buildExpression(group.body, style)); - if (group.fromMathOp) { setSpacing(node) } - } else { - // This is a text operator. Add all of the characters from the operator's name. - node = new mathMLTree.MathNode("mi", [new mathMLTree.TextNode(group.name.slice(1))]); - - if (!group.parentIsSupSub) { - // Append an invisible . - // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4 - const operator = new mathMLTree.MathNode("mo", [mml.makeText("\u2061", "text")]); - const row = [node, operator] - // Set spacing - if (group.needsLeadingSpace) { - const lead = new mathMLTree.MathNode("mspace") - lead.setAttribute("width", "0.1667em") // thin space. - row.unshift(lead) - } - if (!group.isFollowedByDelimiter) { - const trail = new mathMLTree.MathNode("mspace") - trail.setAttribute("width", "0.1667em") // thin space. - row.push(trail) - } - node = new mathMLTree.MathNode("mrow", row) - } - } - - return node; -}; - -const singleCharBigOps = { - "\u220F": "\\prod", - "\u2210": "\\coprod", - "\u2211": "\\sum", - "\u22c0": "\\bigwedge", - "\u22c1": "\\bigvee", - "\u22c2": "\\bigcap", - "\u22c3": "\\bigcup", - "\u2a00": "\\bigodot", - "\u2a01": "\\bigoplus", - "\u2a02": "\\bigotimes", - "\u2a04": "\\biguplus", - "\u2a05": "\\bigsqcap", - "\u2a06": "\\bigsqcup", - "\u2a09": "\\bigtimes" -}; - -defineFunction({ - type: "op", - names: [ - "\\coprod", - "\\bigvee", - "\\bigwedge", - "\\biguplus", - "\\bigcap", - "\\bigcup", - "\\intop", - "\\prod", - "\\sum", - "\\bigotimes", - "\\bigoplus", - "\\bigodot", - "\\bigsqcap", - "\\bigsqcup", - "\\bigtimes", - "\\smallint", - "\u220F", - "\u2210", - "\u2211", - "\u22c0", - "\u22c1", - "\u22c2", - "\u22c3", - "\u2a00", - "\u2a01", - "\u2a02", - "\u2a04", - "\u2a06" - ], - props: { - numArgs: 0 - }, - handler: ({ parser, funcName }, args) => { - let fName = funcName; - if (fName.length === 1) { - fName = singleCharBigOps[fName]; - } - return { - type: "op", - mode: parser.mode, - limits: true, - parentIsSupSub: false, - symbol: true, - stack: false, // This is true for \stackrel{}, not here. - name: fName - }; - }, - mathmlBuilder -}); - -// Note: calling defineFunction with a type that's already been defined only -// works because the same mathmlBuilder is being used. -defineFunction({ - type: "op", - names: ["\\mathop"], - props: { - numArgs: 1, - primitive: true - }, - handler: ({ parser }, args) => { - const body = args[0]; - // It would be convienient to just wrap a around the argument. - // But if the argument is a or , that would be invalid MathML. - // In that case, we instead promote the text contents of the body to the parent. - const arr = (body.body) ? body.body : [body]; - const isSymbol = arr.length === 1 && ordAtomTypes.includes(arr[0].type) - return { - type: "op", - mode: parser.mode, - limits: true, - parentIsSupSub: false, - symbol: isSymbol, - fromMathOp: true, - stack: false, - name: isSymbol ? arr[0].text : null, - body: isSymbol ? null : ordargument(body) - }; - }, - mathmlBuilder -}); - -// There are 2 flags for operators; whether they produce limits in -// displaystyle, and whether they are symbols and should grow in -// displaystyle. These four groups cover the four possible choices. - -const singleCharIntegrals = { - "\u222b": "\\int", - "\u222c": "\\iint", - "\u222d": "\\iiint", - "\u222e": "\\oint", - "\u222f": "\\oiint", - "\u2230": "\\oiiint", - "\u2231": "\\intclockwise", - "\u2232": "\\varointclockwise", - "\u2a0c": "\\iiiint", - "\u2a0d": "\\intbar", - "\u2a0e": "\\intBar", - "\u2a0f": "\\fint", - "\u2a12": "\\rppolint", - "\u2a13": "\\scpolint", - "\u2a15": "\\pointint", - "\u2a16": "\\sqint", - "\u2a17": "\\intlarhk", - "\u2a18": "\\intx", - "\u2a19": "\\intcap", - "\u2a1a": "\\intcup" -}; - -// No limits, not symbols -defineFunction({ - type: "op", - names: [ - "\\arcsin", - "\\arccos", - "\\arctan", - "\\arctg", - "\\arcctg", - "\\arg", - "\\ch", - "\\cos", - "\\cosec", - "\\cosh", - "\\cot", - "\\cotg", - "\\coth", - "\\csc", - "\\ctg", - "\\cth", - "\\deg", - "\\dim", - "\\exp", - "\\hom", - "\\ker", - "\\lg", - "\\ln", - "\\log", - "\\sec", - "\\sin", - "\\sinh", - "\\sh", - "\\sgn", - "\\tan", - "\\tanh", - "\\tg", - "\\th" - ], - props: { - numArgs: 0 - }, - handler({ parser, funcName }) { - const prevAtomType = parser.prevAtomType - const next = parser.gullet.future().text - return { - type: "op", - mode: parser.mode, - limits: false, - parentIsSupSub: false, - symbol: false, - stack: false, - isFollowedByDelimiter: isDelimiter(next), - needsLeadingSpace: prevAtomType.length > 0 && ordTypes.includes(prevAtomType), - name: funcName - }; - }, - mathmlBuilder -}); - -// Limits, not symbols -defineFunction({ - type: "op", - names: ["\\det", "\\gcd", "\\inf", "\\lim", "\\max", "\\min", "\\Pr", "\\sup"], - props: { - numArgs: 0 - }, - handler({ parser, funcName }) { - const prevAtomType = parser.prevAtomType - const next = parser.gullet.future().text - return { - type: "op", - mode: parser.mode, - limits: true, - parentIsSupSub: false, - symbol: false, - stack: false, - isFollowedByDelimiter: isDelimiter(next), - needsLeadingSpace: prevAtomType.length > 0 && ordTypes.includes(prevAtomType), - name: funcName - }; - }, - mathmlBuilder -}); - -// No limits, symbols -defineFunction({ - type: "op", - names: [ - "\\int", - "\\iint", - "\\iiint", - "\\iiiint", - "\\oint", - "\\oiint", - "\\oiiint", - "\\intclockwise", - "\\varointclockwise", - "\\intbar", - "\\intBar", - "\\fint", - "\\rppolint", - "\\scpolint", - "\\pointint", - "\\sqint", - "\\intlarhk", - "\\intx", - "\\intcap", - "\\intcup", - "\u222b", - "\u222c", - "\u222d", - "\u222e", - "\u222f", - "\u2230", - "\u2231", - "\u2232", - "\u2a0c", - "\u2a0d", - "\u2a0e", - "\u2a0f", - "\u2a12", - "\u2a13", - "\u2a15", - "\u2a16", - "\u2a17", - "\u2a18", - "\u2a19", - "\u2a1a" - ], - props: { - numArgs: 0 - }, - handler({ parser, funcName }) { - let fName = funcName; - if (fName.length === 1) { - fName = singleCharIntegrals[fName]; - } - return { - type: "op", - mode: parser.mode, - limits: false, - parentIsSupSub: false, - symbol: true, - stack: false, - name: fName - }; - }, - mathmlBuilder -}); diff --git a/src/functions/operatorname.js b/src/functions/operatorname.js deleted file mode 100644 index fd67f24a..00000000 --- a/src/functions/operatorname.js +++ /dev/null @@ -1,141 +0,0 @@ -import defineFunction, { ordargument } from "../defineFunction" -import defineMacro from "../defineMacro"; -import mathMLTree from "../mathMLTree" -import { spaceCharacter } from "./kern" -import { ordTypes } from "./op" -import { isDelimiter } from "./delimsizing" - -import * as mml from "../buildMathML" - -// NOTE: Unlike most builders, this one handles not only -// "operatorname", but also "supsub" since \operatorname* can -// affect super/subscripting. - -const mathmlBuilder = (group, style) => { - let expression = mml.buildExpression(group.body, style.withFont("mathrm")) - - // Is expression a string or has it something like a fraction? - let isAllString = true; // default - for (let i = 0; i < expression.length; i++) { - let node = expression[i] - if (node instanceof mathMLTree.MathNode) { - if (node.type === "mrow" && node.children.length === 1 && - node.children[0] instanceof mathMLTree.MathNode) { - node = node.children[0] - } - switch (node.type) { - case "mi": - case "mn": - case "ms": - case "mtext": - break; // Do nothing yet. - case "mspace": - { - if (node.attributes.width) { - const width = node.attributes.width.replace("em", "") - const ch = spaceCharacter(Number(width)) - if (ch === "") { - isAllString = false - } else { - expression[i] = new mathMLTree.MathNode("mtext", [new mathMLTree.TextNode(ch)]) - } - } - } - break - case "mo": { - const child = node.children[0] - if (node.children.length === 1 && child instanceof mathMLTree.TextNode) { - child.text = child.text.replace(/\u2212/, "-").replace(/\u2217/, "*") - } else { - isAllString = false - } - break - } - default: - isAllString = false - } - } else { - isAllString = false - } - } - - if (isAllString) { - // Write a single TextNode instead of multiple nested tags. - const word = expression.map((node) => node.toText()).join("") - expression = [new mathMLTree.TextNode(word)] - } else if ( - expression.length === 1 - && ["mover", "munder"].includes(expression[0].type) && - (expression[0].children[0].type === "mi" || expression[0].children[0].type === "mtext") - ) { - expression[0].children[0].type = "mi" - if (group.parentIsSupSub) { - return new mathMLTree.MathNode("mrow", expression) - } else { - const operator = new mathMLTree.MathNode("mo", [mml.makeText("\u2061", "text")]) - return mathMLTree.newDocumentFragment([expression[0], operator]) - } - } - - let wrapper; - if (isAllString) { - wrapper = new mathMLTree.MathNode("mi", expression) - if (expression[0].text.length === 1) { - wrapper.setAttribute("mathvariant", "normal") - } - } else { - wrapper = new mathMLTree.MathNode("mrow", expression) - } - - if (!group.parentIsSupSub) { - // Append an . - // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4 - const operator = new mathMLTree.MathNode("mo", [mml.makeText("\u2061", "text")]) - const fragment = [wrapper, operator] - if (group.needsLeadingSpace) { - // LaTeX gives operator spacing, but a gets ord spacing. - // So add a leading space. - const space = new mathMLTree.MathNode("mspace") - space.setAttribute("width", "0.1667em") // thin space. - fragment.unshift(space) - } - if (!group.isFollowedByDelimiter) { - const trail = new mathMLTree.MathNode("mspace") - trail.setAttribute("width", "0.1667em") // thin space. - fragment.push(trail) - } - return mathMLTree.newDocumentFragment(fragment) - } - - return wrapper -}; - -// \operatorname -// amsopn.dtx: \mathop{#1\kern\z@\operator@font#3}\newmcodes@ -defineFunction({ - type: "operatorname", - names: ["\\operatorname@", "\\operatornamewithlimits"], - props: { - numArgs: 1, - allowedInArgument: true - }, - handler: ({ parser, funcName }, args) => { - const body = args[0] - const prevAtomType = parser.prevAtomType - const next = parser.gullet.future().text - return { - type: "operatorname", - mode: parser.mode, - body: ordargument(body), - alwaysHandleSupSub: (funcName === "\\operatornamewithlimits"), - limits: false, - parentIsSupSub: false, - isFollowedByDelimiter: isDelimiter(next), - needsLeadingSpace: prevAtomType.length > 0 && ordTypes.includes(prevAtomType) - }; - }, - mathmlBuilder -}); - -defineMacro("\\operatorname", - "\\@ifstar\\operatornamewithlimits\\operatorname@"); diff --git a/src/functions/ordgroup.js b/src/functions/ordgroup.js deleted file mode 100644 index 9cd85da4..00000000 --- a/src/functions/ordgroup.js +++ /dev/null @@ -1,9 +0,0 @@ -import { defineFunctionBuilders } from "../defineFunction"; -import * as mml from "../buildMathML"; - -defineFunctionBuilders({ - type: "ordgroup", - mathmlBuilder(group, style) { - return mml.buildExpressionRow(group.body, style, group.semisimple); - } -}); diff --git a/src/functions/phantom.js b/src/functions/phantom.js deleted file mode 100644 index 24ed1624..00000000 --- a/src/functions/phantom.js +++ /dev/null @@ -1,73 +0,0 @@ -import defineFunction, { ordargument } from "../defineFunction"; -import mathMLTree from "../mathMLTree"; -import * as mml from "../buildMathML"; - -defineFunction({ - type: "phantom", - names: ["\\phantom"], - props: { - numArgs: 1, - allowedInText: true - }, - handler: ({ parser }, args) => { - const body = args[0]; - return { - type: "phantom", - mode: parser.mode, - body: ordargument(body) - }; - }, - mathmlBuilder: (group, style) => { - const inner = mml.buildExpression(group.body, style); - return new mathMLTree.MathNode("mphantom", inner); - } -}); - -defineFunction({ - type: "hphantom", - names: ["\\hphantom"], - props: { - numArgs: 1, - allowedInText: true - }, - handler: ({ parser }, args) => { - const body = args[0]; - return { - type: "hphantom", - mode: parser.mode, - body - }; - }, - mathmlBuilder: (group, style) => { - const inner = mml.buildExpression(ordargument(group.body), style); - const phantom = new mathMLTree.MathNode("mphantom", inner); - const node = new mathMLTree.MathNode("mpadded", [phantom]); - node.setAttribute("height", "0px"); - node.setAttribute("depth", "0px"); - return node; - } -}); - -defineFunction({ - type: "vphantom", - names: ["\\vphantom"], - props: { - numArgs: 1, - allowedInText: true - }, - handler: ({ parser }, args) => { - const body = args[0]; - return { - type: "vphantom", - mode: parser.mode, - body - }; - }, - mathmlBuilder: (group, style) => { - const inner = mml.buildExpression(ordargument(group.body), style); - const phantom = new mathMLTree.MathNode("mphantom", inner); - const node = new mathMLTree.MathNode("mpadded", [phantom]); - node.setAttribute("width", "0px"); - return node; - } -}); diff --git a/src/functions/pmb.js b/src/functions/pmb.js deleted file mode 100644 index ab363165..00000000 --- a/src/functions/pmb.js +++ /dev/null @@ -1,30 +0,0 @@ -import defineFunction, { ordargument } from "../defineFunction" -import { wrapWithMstyle } from "../mathMLTree" -import * as mml from "../buildMathML" - -// In LaTeX, \pmb is a simulation of bold font. -// The version of \pmb in ambsy.sty works by typesetting three copies of the argument -// with small offsets. We use CSS font-weight:bold. - -defineFunction({ - type: "pmb", - names: ["\\pmb"], - props: { - numArgs: 1, - allowedInText: true - }, - handler({ parser }, args) { - return { - type: "pmb", - mode: parser.mode, - body: ordargument(args[0]) - } - }, - mathmlBuilder(group, style) { - const inner = mml.buildExpression(group.body, style) - // Wrap with an element. - const node = wrapWithMstyle(inner) - node.setAttribute("style", "font-weight:bold") - return node - } -}) diff --git a/src/functions/raise.js b/src/functions/raise.js deleted file mode 100644 index 761d61bc..00000000 --- a/src/functions/raise.js +++ /dev/null @@ -1,68 +0,0 @@ -import defineFunction from "../defineFunction" -import { StyleLevel } from "../constants" -import mathMLTree from "../mathMLTree" -import { assertNodeType } from "../parseNode" -import { calculateSize } from "../units" -import * as mml from "../buildMathML" - -// \raise, \lower, and \raisebox - -const mathmlBuilder = (group, style) => { - const newStyle = style.withLevel(StyleLevel.TEXT) - const node = new mathMLTree.MathNode("mpadded", [mml.buildGroup(group.body, newStyle)]) - const dy = calculateSize(group.dy, style) - node.setAttribute("voffset", dy.number + dy.unit) - // Add padding, which acts to increase height in Chromium. - // TODO: Figure out some way to change height in Firefox w/o breaking Chromium. - if (dy.number > 0) { - node.style.padding = dy.number + dy.unit + " 0 0 0" - } else { - node.style.padding = "0 0 " + Math.abs(dy.number) + dy.unit + " 0" - } - return node -} - -defineFunction({ - type: "raise", - names: ["\\raise", "\\lower"], - props: { - numArgs: 2, - argTypes: ["size", "primitive"], - primitive: true - }, - handler({ parser, funcName }, args) { - const amount = assertNodeType(args[0], "size").value; - if (funcName === "\\lower") { amount.number *= -1 } - const body = args[1] - return { - type: "raise", - mode: parser.mode, - dy: amount, - body - }; - }, - mathmlBuilder -}) - - -defineFunction({ - type: "raise", - names: ["\\raisebox"], - props: { - numArgs: 2, - argTypes: ["size", "hbox"], - allowedInText: true - }, - handler({ parser, funcName }, args) { - const amount = assertNodeType(args[0], "size").value - const body = args[1] - return { - type: "raise", - mode: parser.mode, - dy: amount, - body - }; - }, - mathmlBuilder -}) - diff --git a/src/functions/ref.js b/src/functions/ref.js deleted file mode 100644 index 12ef6024..00000000 --- a/src/functions/ref.js +++ /dev/null @@ -1,28 +0,0 @@ -import defineFunction from "../defineFunction"; -import mathMLTree from "../mathMLTree"; -import { invalidIdRegEx } from "./label"; - -defineFunction({ - type: "ref", - names: ["\\ref", "\\eqref"], - props: { - numArgs: 1, - argTypes: ["raw"] - }, - handler({ parser, funcName }, args) { - return { - type: "ref", - mode: parser.mode, - funcName, - string: args[0].string.replace(invalidIdRegEx, "") - }; - }, - mathmlBuilder(group, style) { - // Create an empty text node. Set a class and an href. - // The post-processor will populate with the target's tag or equation number. - const classes = group.funcName === "\\ref" ? ["tml-ref"] : ["tml-ref", "tml-eqref"] - const node = new mathMLTree.MathNode("mtext", [new mathMLTree.TextNode("")], classes) - node.setAttribute("href", "#" + group.string) - return node - } -}); diff --git a/src/functions/reflect.js b/src/functions/reflect.js deleted file mode 100644 index 54f28eac..00000000 --- a/src/functions/reflect.js +++ /dev/null @@ -1,24 +0,0 @@ -import defineFunction from "../defineFunction" -import * as mml from "../buildMathML" - -defineFunction({ - type: "reflect", - names: ["\\reflectbox"], - props: { - numArgs: 1, - argTypes: ["hbox"], - allowedInText: true - }, - handler({ parser }, args) { - return { - type: "reflect", - mode: parser.mode, - body: args[0] - }; - }, - mathmlBuilder(group, style) { - const node = mml.buildGroup(group.body, style) - node.style.transform = "scaleX(-1)" - return node - } -}) diff --git a/src/functions/relax.js b/src/functions/relax.js deleted file mode 100644 index 5527cfab..00000000 --- a/src/functions/relax.js +++ /dev/null @@ -1,16 +0,0 @@ -import defineFunction from "../defineFunction" - -defineFunction({ - type: "internal", - names: ["\\relax"], - props: { - numArgs: 0, - allowedInText: true - }, - handler({ parser }) { - return { - type: "internal", - mode: parser.mode - }; - } -}) diff --git a/src/functions/rule.js b/src/functions/rule.js deleted file mode 100644 index 96230e87..00000000 --- a/src/functions/rule.js +++ /dev/null @@ -1,52 +0,0 @@ -import defineFunction from "../defineFunction"; -import mathMLTree from "../mathMLTree"; -import { assertNodeType } from "../parseNode"; -import { calculateSize } from "../units"; - -defineFunction({ - type: "rule", - names: ["\\rule"], - props: { - numArgs: 2, - numOptionalArgs: 1, - argTypes: ["size", "size", "size"] - }, - handler({ parser }, args, optArgs) { - const shift = optArgs[0]; - const width = assertNodeType(args[0], "size"); - const height = assertNodeType(args[1], "size"); - return { - type: "rule", - mode: parser.mode, - shift: shift && assertNodeType(shift, "size").value, - width: width.value, - height: height.value - }; - }, - mathmlBuilder(group, style) { - const width = calculateSize(group.width, style); - const height = calculateSize(group.height, style); - const shift = group.shift - ? calculateSize(group.shift, style) - : { number: 0, unit: "em" }; - const color = (style.color && style.getColor()) || "black"; - - const rule = new mathMLTree.MathNode("mspace"); - if (width.number > 0 && height.number > 0) { - rule.setAttribute("mathbackground", color); - } - rule.setAttribute("width", width.number + width.unit); - rule.setAttribute("height", height.number + height.unit); - if (shift.number === 0) { return rule } - - const wrapper = new mathMLTree.MathNode("mpadded", [rule]); - if (shift.number >= 0) { - wrapper.setAttribute("height", "+" + shift.number + shift.unit); - } else { - wrapper.setAttribute("height", shift.number + shift.unit); - wrapper.setAttribute("depth", "+" + -shift.number + shift.unit); - } - wrapper.setAttribute("voffset", shift.number + shift.unit); - return wrapper; - } -}); diff --git a/src/functions/sizing.js b/src/functions/sizing.js deleted file mode 100644 index cae4c582..00000000 --- a/src/functions/sizing.js +++ /dev/null @@ -1,64 +0,0 @@ -import defineFunction from "../defineFunction"; -import { wrapWithMstyle } from "../mathMLTree" -import * as mml from "../buildMathML"; - -// The size mappings are taken from TeX with \normalsize=10pt. -// We don't have to track script level. MathML does that. -const sizeMap = { - "\\tiny": 0.5, - "\\sixptsize": 0.6, - "\\Tiny": 0.6, - "\\scriptsize": 0.7, - "\\footnotesize": 0.8, - "\\small": 0.9, - "\\normalsize": 1.0, - "\\large": 1.2, - "\\Large": 1.44, - "\\LARGE": 1.728, - "\\huge": 2.074, - "\\Huge": 2.488 -}; - -defineFunction({ - type: "sizing", - names: [ - "\\tiny", - "\\sixptsize", - "\\Tiny", - "\\scriptsize", - "\\footnotesize", - "\\small", - "\\normalsize", - "\\large", - "\\Large", - "\\LARGE", - "\\huge", - "\\Huge" - ], - props: { - numArgs: 0, - allowedInText: true - }, - handler: ({ breakOnTokenText, funcName, parser }, args) => { - if (parser.settings.strict && parser.mode === "math") { - // eslint-disable-next-line no-console - console.log(`Temml strict-mode warning: Command ${funcName} is invalid in math mode.`) - } - const body = parser.parseExpression(false, breakOnTokenText, true); - return { - type: "sizing", - mode: parser.mode, - funcName, - body - }; - }, - mathmlBuilder: (group, style) => { - const newStyle = style.withFontSize(sizeMap[group.funcName]); - const inner = mml.buildExpression(group.body, newStyle); - // Wrap with an element. - const node = wrapWithMstyle(inner) - const factor = (sizeMap[group.funcName] / style.fontSize).toFixed(4) - node.setAttribute("mathsize", factor + "em"); - return node; - } -}); diff --git a/src/functions/smash.js b/src/functions/smash.js deleted file mode 100644 index 71890a62..00000000 --- a/src/functions/smash.js +++ /dev/null @@ -1,66 +0,0 @@ -// smash, with optional [tb], as in AMS -import defineFunction from "../defineFunction"; -import mathMLTree from "../mathMLTree"; -import { assertNodeType } from "../parseNode"; - -import * as mml from "../buildMathML"; - -defineFunction({ - type: "smash", - names: ["\\smash"], - props: { - numArgs: 1, - numOptionalArgs: 1, - allowedInText: true - }, - handler: ({ parser }, args, optArgs) => { - let smashHeight = false; - let smashDepth = false; - const tbArg = optArgs[0] && assertNodeType(optArgs[0], "ordgroup"); - if (tbArg) { - // Optional [tb] argument is engaged. - // ref: amsmath: \renewcommand{\smash}[1][tb]{% - // def\mb@t{\ht}\def\mb@b{\dp}\def\mb@tb{\ht\z@\z@\dp}% - let letter = ""; - for (let i = 0; i < tbArg.body.length; ++i) { - const node = tbArg.body[i]; - // TODO: Write an AssertSymbolNode - letter = node.text; - if (letter === "t") { - smashHeight = true; - } else if (letter === "b") { - smashDepth = true; - } else { - smashHeight = false; - smashDepth = false; - break; - } - } - } else { - smashHeight = true; - smashDepth = true; - } - - const body = args[0]; - return { - type: "smash", - mode: parser.mode, - body, - smashHeight, - smashDepth - }; - }, - mathmlBuilder: (group, style) => { - const node = new mathMLTree.MathNode("mpadded", [mml.buildGroup(group.body, style)]); - - if (group.smashHeight) { - node.setAttribute("height", "0px"); - } - - if (group.smashDepth) { - node.setAttribute("depth", "0px"); - } - - return node; - } -}); diff --git a/src/functions/sqrt.js b/src/functions/sqrt.js deleted file mode 100644 index fd54ce52..00000000 --- a/src/functions/sqrt.js +++ /dev/null @@ -1,31 +0,0 @@ -import defineFunction from "../defineFunction"; -import mathMLTree from "../mathMLTree"; -import * as mml from "../buildMathML"; - -defineFunction({ - type: "sqrt", - names: ["\\sqrt"], - props: { - numArgs: 1, - numOptionalArgs: 1 - }, - handler({ parser }, args, optArgs) { - const index = optArgs[0]; - const body = args[0]; - return { - type: "sqrt", - mode: parser.mode, - body, - index - }; - }, - mathmlBuilder(group, style) { - const { body, index } = group; - return index - ? new mathMLTree.MathNode("mroot", [ - mml.buildGroup(body, style), - mml.buildGroup(index, style.incrementLevel()) - ]) - : new mathMLTree.MathNode("msqrt", [mml.buildGroup(body, style)]); - } -}); diff --git a/src/functions/styling.js b/src/functions/styling.js deleted file mode 100644 index 62f623ae..00000000 --- a/src/functions/styling.js +++ /dev/null @@ -1,58 +0,0 @@ -import defineFunction from "../defineFunction"; -import { wrapWithMstyle } from "../mathMLTree" -import * as mml from "../buildMathML"; - -const styleMap = { - display: 0, - text: 1, - script: 2, - scriptscript: 3 -}; - -const styleAttributes = { - display: ["0", "true"], - text: ["0", "false"], - script: ["1", "false"], - scriptscript: ["2", "false"] -}; - -defineFunction({ - type: "styling", - names: ["\\displaystyle", "\\textstyle", "\\scriptstyle", "\\scriptscriptstyle"], - props: { - numArgs: 0, - allowedInText: true, - primitive: true - }, - handler({ breakOnTokenText, funcName, parser }, args) { - // parse out the implicit body - const body = parser.parseExpression(true, breakOnTokenText, true); - - const scriptLevel = funcName.slice(1, funcName.length - 5); - return { - type: "styling", - mode: parser.mode, - // Figure out what scriptLevel to use by pulling out the scriptLevel from - // the function name - scriptLevel, - body - }; - }, - mathmlBuilder(group, style) { - // Figure out what scriptLevel we're changing to. - const newStyle = style.withLevel(styleMap[group.scriptLevel]); - // The style argument in the next line does NOT directly set a MathML script level. - // It just tracks the style level, in case we need to know it for supsub or mathchoice. - const inner = mml.buildExpression(group.body, newStyle); - // Wrap with an element. - const node = wrapWithMstyle(inner) - - const attr = styleAttributes[group.scriptLevel]; - - // Here is where we set the MathML script level. - node.setAttribute("scriptlevel", attr[0]); - node.setAttribute("displaystyle", attr[1]); - - return node; - } -}); diff --git a/src/functions/supsub.js b/src/functions/supsub.js deleted file mode 100644 index 5985c3a6..00000000 --- a/src/functions/supsub.js +++ /dev/null @@ -1,149 +0,0 @@ -import { defineFunctionBuilders } from "../defineFunction" -import { StyleLevel } from "../constants" -import mathMLTree from "../mathMLTree" -import * as mml from "../buildMathML" - -/** - * Sometimes, groups perform special rules when they have superscripts or - * subscripts attached to them. This function lets the `supsub` group know that - * Sometimes, groups perform special rules when they have superscripts or - * its inner element should handle the superscripts and subscripts instead of - * handling them itself. - */ - -// Helpers -const symbolRegEx = /^m(over|under|underover)$/ - -// Super scripts and subscripts, whose precise placement can depend on other -// functions that precede them. -defineFunctionBuilders({ - type: "supsub", - mathmlBuilder(group, style) { - // Is the inner group a relevant horizonal brace? - let isBrace = false - let isOver - let isSup - let appendApplyFunction = false - let appendSpace = false - let needsLeadingSpace = false - - if (group.base && group.base.type === "horizBrace") { - isSup = !!group.sup - if (isSup === group.base.isOver) { - isBrace = true - isOver = group.base.isOver - } - } - - if (group.base && !group.base.stack && - (group.base.type === "op" || group.base.type === "operatorname")) { - group.base.parentIsSupSub = true - appendApplyFunction = !group.base.symbol - appendSpace = appendApplyFunction && !group.isFollowedByDelimiter - needsLeadingSpace = group.base.needsLeadingSpace - } - - const children = group.base && group.base.stack - ? [mml.buildGroup(group.base.body[0], style)] - : [mml.buildGroup(group.base, style)] - - const childStyle = style.inSubOrSup() - if (group.sub) { - children.push(mml.buildGroup(group.sub, childStyle)) - } - - if (group.sup) { - const sup = mml.buildGroup(group.sup, childStyle) - const testNode = sup.type === "mrow" ? sup.children[0] : sup - if ((testNode.type === "mo" && testNode.classes.includes("tml-prime")) - && group.base && group.base.text && group.base.text === "f") { - // Chromium does not address italic correction on prime. Prevent f′ from overlapping. - testNode.classes.push("prime-pad") - } - children.push(sup) - } - - let nodeType; - if (isBrace) { - nodeType = isOver ? "mover" : "munder" - } else if (!group.sub) { - const base = group.base - if ( - base && - base.type === "op" && - base.limits && - (style.level === StyleLevel.DISPLAY || base.alwaysHandleSupSub) - ) { - nodeType = "mover" - } else if ( - base && - base.type === "operatorname" && - base.alwaysHandleSupSub && - (base.limits || style.level === StyleLevel.DISPLAY) - ) { - nodeType = "mover" - } else { - nodeType = "msup" - } - } else if (!group.sup) { - const base = group.base; - if ( - base && - base.type === "op" && - base.limits && - (style.level === StyleLevel.DISPLAY || base.alwaysHandleSupSub) - ) { - nodeType = "munder"; - } else if ( - base && - base.type === "operatorname" && - base.alwaysHandleSupSub && - (base.limits || style.level === StyleLevel.DISPLAY) - ) { - nodeType = "munder" - } else { - nodeType = "msub" - } - } else { - const base = group.base; - if (base && ((base.type === "op" && base.limits) || base.type === "multiscript") && - (style.level === StyleLevel.DISPLAY || base.alwaysHandleSupSub) - ) { - nodeType = "munderover" - } else if ( - base && - base.type === "operatorname" && - base.alwaysHandleSupSub && - (style.level === StyleLevel.DISPLAY || base.limits) - ) { - nodeType = "munderover" - } else { - nodeType = "msubsup" - } - } - - let node = new mathMLTree.MathNode(nodeType, children) - if (appendApplyFunction) { - // Append an . - // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4 - const operator = new mathMLTree.MathNode("mo", [mml.makeText("\u2061", "text")]) - if (needsLeadingSpace) { - const space = new mathMLTree.MathNode("mspace") - space.setAttribute("width", "0.1667em") // thin space. - node = mathMLTree.newDocumentFragment([space, node, operator]) - } else { - node = mathMLTree.newDocumentFragment([node, operator]) - } - if (appendSpace) { - const space = new mathMLTree.MathNode("mspace") - space.setAttribute("width", "0.1667em") // thin space. - node.children.push(space) - } - } else if (symbolRegEx.test(nodeType)) { - // Wrap in a . Otherwise Firefox stretchy parens will not stretch to include limits. - node = new mathMLTree.MathNode("mrow", [node]) - } - - return node - } -}); diff --git a/src/functions/symbolsOp.js b/src/functions/symbolsOp.js deleted file mode 100644 index 69ae4beb..00000000 --- a/src/functions/symbolsOp.js +++ /dev/null @@ -1,53 +0,0 @@ -import { defineFunctionBuilders } from "../defineFunction"; -import mathMLTree from "../mathMLTree"; -import * as mml from "../buildMathML"; - -// Operator ParseNodes created in Parser.js from symbol Groups in src/symbols.js. - -const short = ["\\shortmid", "\\nshortmid", "\\shortparallel", - "\\nshortparallel", "\\smallsetminus"] - -const arrows = ["\\Rsh", "\\Lsh", "\\restriction"] - -const isArrow = str => { - if (str.length === 1) { - const codePoint = str.codePointAt(0) - return (0x218f < codePoint && codePoint < 0x2200) - } - return str.indexOf("arrow") > -1 || str.indexOf("harpoon") > -1 || arrows.includes(str) -} - -defineFunctionBuilders({ - type: "atom", - mathmlBuilder(group, style) { - const node = new mathMLTree.MathNode("mo", [mml.makeText(group.text, group.mode)]); - if (group.family === "punct") { - node.setAttribute("separator", "true"); - } else if (group.family === "open" || group.family === "close") { - // Delims built here should not stretch vertically. - // See delimsizing.js for stretchy delims. - if (group.family === "open") { - node.setAttribute("form", "prefix") - // Set an explicit attribute for stretch. Otherwise Firefox may do it wrong. - node.setAttribute("stretchy", "false") - } else if (group.family === "close") { - node.setAttribute("form", "postfix"); - node.setAttribute("stretchy", "false") - } - } else if (group.text === "\\mid") { - // Firefox messes up this spacing if at the end of an . See it explicitly. - node.setAttribute("lspace", "0.22em") // medium space - node.setAttribute("rspace", "0.22em") - node.setAttribute("stretchy", "false") - } else if (group.family === "rel" && isArrow(group.text)) { - node.setAttribute("stretchy", "false") - } else if (short.includes(group.text)) { - node.setAttribute("mathsize", "70%") - } else if (group.text === ":") { - // ":" is not in the MathML operator dictionary. Give it BIN spacing. - node.attributes.lspace = "0.2222em" - node.attributes.rspace = "0.2222em" - } - return node; - } -}); diff --git a/src/functions/symbolsOrd.js b/src/functions/symbolsOrd.js deleted file mode 100644 index 04b0eb90..00000000 --- a/src/functions/symbolsOrd.js +++ /dev/null @@ -1,97 +0,0 @@ -import { defineFunctionBuilders } from "../defineFunction" -import { getVariant } from "../variant" -import { variantChar, smallCaps } from "../replace" -import mathMLTree from "../mathMLTree" -import * as mml from "../buildMathML" - -// "mathord" and "textord" ParseNodes created in Parser.js from symbol Groups in -// src/symbols.js. - -const numberRegEx = /^\d(?:[\d,.]*\d)?$/ -const latinRegEx = /[A-Ba-z]/ -const primes = new Set(["\\prime", "\\dprime", "\\trprime", "\\qprime", - "\\backprime", "\\backdprime", "\\backtrprime"]); - -const italicNumber = (text, variant, tag) => { - const mn = new mathMLTree.MathNode(tag, [text]) - const wrapper = new mathMLTree.MathNode("mstyle", [mn]) - wrapper.style["font-style"] = "italic" - wrapper.style["font-family"] = "Cambria, 'Times New Roman', serif" - if (variant === "bold-italic") { wrapper.style["font-weight"] = "bold" } - return wrapper -} - -defineFunctionBuilders({ - type: "mathord", - mathmlBuilder(group, style) { - const text = mml.makeText(group.text, group.mode, style) - const codePoint = text.text.codePointAt(0) - // Test for upper-case Greek - const defaultVariant = (0x0390 < codePoint && codePoint < 0x03aa) ? "normal" : "italic" - const variant = getVariant(group, style) || defaultVariant - if (variant === "script") { - text.text = variantChar(text.text, variant) - return new mathMLTree.MathNode("mi", [text], [style.font]) - } else if (variant !== "italic") { - text.text = variantChar(text.text, variant) - } - let node = new mathMLTree.MathNode("mi", [text]) - // TODO: Handle U+1D49C - U+1D4CF per https://www.unicode.org/charts/PDF/U1D400.pdf - if (variant === "normal") { - node.setAttribute("mathvariant", "normal") - if (text.text.length === 1) { - // A Firefox bug will apply spacing here, but there should be none. Fix it. - node = new mathMLTree.MathNode("mrow", [node]) - } - } - return node - } -}) - -defineFunctionBuilders({ - type: "textord", - mathmlBuilder(group, style) { - let ch = group.text - const codePoint = ch.codePointAt(0) - if (style.fontFamily === "textsc") { - // Convert small latin letters to small caps. - if (96 < codePoint && codePoint < 123) { - ch = smallCaps[ch] - } - } - const text = mml.makeText(ch, group.mode, style) - const variant = getVariant(group, style) || "normal" - - let node - if (numberRegEx.test(group.text)) { - const tag = group.mode === "text" ? "mtext" : "mn" - if (variant === "italic" || variant === "bold-italic") { - return italicNumber(text, variant, tag) - } else { - if (variant !== "normal") { - text.text = text.text.split("").map(c => variantChar(c, variant)).join("") - } - node = new mathMLTree.MathNode(tag, [text]) - } - } else if (group.mode === "text") { - if (variant !== "normal") { - text.text = variantChar(text.text, variant) - } - node = new mathMLTree.MathNode("mtext", [text]) - } else if (primes.has(group.text)) { - node = new mathMLTree.MathNode("mo", [text]) - // TODO: If/when Chromium uses ssty variant for prime, remove the next line. - node.classes.push("tml-prime") - } else { - const origText = text.text - if (variant !== "italic") { - text.text = variantChar(text.text, variant) - } - node = new mathMLTree.MathNode("mi", [text]) - if (text.text === origText && latinRegEx.test(origText)) { - node.setAttribute("mathvariant", "italic") - } - } - return node - } -}) diff --git a/src/functions/symbolsSpacing.js b/src/functions/symbolsSpacing.js deleted file mode 100644 index 85518b52..00000000 --- a/src/functions/symbolsSpacing.js +++ /dev/null @@ -1,53 +0,0 @@ -import { defineFunctionBuilders } from "../defineFunction" -import mathMLTree from "../mathMLTree" -import ParseError from "../ParseError" - -// A map of CSS-based spacing functions to their CSS class. -const cssSpace = { - "\\nobreak": "nobreak", - "\\allowbreak": "allowbreak" -} - -// A lookup table to determine whether a spacing function/symbol should be -// treated like a regular space character. If a symbol or command is a key -// in this table, then it should be a regular space character. Furthermore, -// the associated value may have a `className` specifying an extra CSS class -// to add to the created `span`. -const regularSpace = { - " ": {}, - "\\ ": {}, - "~": { - className: "nobreak" - }, - "\\space": {}, - "\\nobreakspace": { - className: "nobreak" - } -} - -// ParseNode<"spacing"> created in Parser.js from the "spacing" symbol Groups in -// src/symbols.js. -defineFunctionBuilders({ - type: "spacing", - mathmlBuilder(group, style) { - let node - - if (Object.prototype.hasOwnProperty.call(regularSpace, group.text)) { - // Firefox does not render a space in a . So write a no-break space. - // TODO: If Firefox fixes that bug, uncomment the next line and write ch into the node. - //const ch = (regularSpace[group.text].className === "nobreak") ? "\u00a0" : " " - node = new mathMLTree.MathNode("mtext", [new mathMLTree.TextNode("\u00a0")]) - } else if (Object.prototype.hasOwnProperty.call(cssSpace, group.text)) { - // MathML 3.0 calls for nobreak to occur in an , not an - // Ref: https://www.w3.org/Math/draft-spec/mathml.html#chapter3_presm.lbattrs - node = new mathMLTree.MathNode("mo") - if (group.text === "\\nobreak") { - node.setAttribute("linebreak", "nobreak") - } - } else { - throw new ParseError(`Unknown type of space "${group.text}"`) - } - - return node - } -}) diff --git a/src/functions/tag.js b/src/functions/tag.js deleted file mode 100644 index ddb86ec5..00000000 --- a/src/functions/tag.js +++ /dev/null @@ -1,8 +0,0 @@ -import { defineFunctionBuilders } from "../defineFunction"; - -defineFunctionBuilders({ - type: "tag" -}); - -// For a \tag, the work usually done in a mathmlBuilder is instead done in buildMathML.js. -// That way, a \tag can be pulled out of the parse tree and wrapped around the outer node. diff --git a/src/functions/text.js b/src/functions/text.js deleted file mode 100644 index 3da72b78..00000000 --- a/src/functions/text.js +++ /dev/null @@ -1,75 +0,0 @@ -import defineFunction, { ordargument } from "../defineFunction"; -import * as mml from "../buildMathML"; - -// Non-mathy text, possibly in a font -const textFontFamilies = { - "\\text": undefined, - "\\textrm": "textrm", - "\\textsf": "textsf", - "\\texttt": "texttt", - "\\textnormal": "textrm", - "\\textsc": "textsc" // small caps -}; - -const textFontWeights = { - "\\textbf": "textbf", - "\\textmd": "textmd" -}; - -const textFontShapes = { - "\\textit": "textit", - "\\textup": "textup" -}; - -const styleWithFont = (group, style) => { - const font = group.font; - // Checks if the argument is a font family or a font style. - if (!font) { - return style; - } else if (textFontFamilies[font]) { - return style.withTextFontFamily(textFontFamilies[font]); - } else if (textFontWeights[font]) { - return style.withTextFontWeight(textFontWeights[font]); - } else { - return style.withTextFontShape(textFontShapes[font]); - } -}; - -defineFunction({ - type: "text", - names: [ - // Font families - "\\text", - "\\textrm", - "\\textsf", - "\\texttt", - "\\textnormal", - "\\textsc", - // Font weights - "\\textbf", - "\\textmd", - // Font Shapes - "\\textit", - "\\textup" - ], - props: { - numArgs: 1, - argTypes: ["text"], - allowedInArgument: true, - allowedInText: true - }, - handler({ parser, funcName }, args) { - const body = args[0]; - return { - type: "text", - mode: parser.mode, - body: ordargument(body), - font: funcName - }; - }, - mathmlBuilder(group, style) { - const newStyle = styleWithFont(group, style) - const mrow = mml.buildExpressionRow(group.body, newStyle) - return mml.consolidateText(mrow) - } -}); diff --git a/src/functions/tip.js b/src/functions/tip.js deleted file mode 100644 index 714f7248..00000000 --- a/src/functions/tip.js +++ /dev/null @@ -1,63 +0,0 @@ -import defineFunction from "../defineFunction"; -import mathMLTree from "../mathMLTree"; -import * as mml from "../buildMathML"; - -// Two functions included to enable migration from Mathjax. - -defineFunction({ - type: "tip", - names: ["\\mathtip"], - props: { - numArgs: 2 - }, - handler({ parser }, args) { - return { - type: "tip", - mode: parser.mode, - body: args[0], - tip: args[1] - }; - }, - mathmlBuilder: (group, style) => { - const math = mml.buildGroup(group.body, style) - const tip = mml.buildGroup(group.tip, style) - // Browsers don't support the tooltip actiontype. - // TODO: Come back and fix \mathtip when it can be done via CSS w/o a JS event. - const node = new mathMLTree.MathNode("maction", [math, tip], ["tml-tip"]) - node.setAttribute("actiontype", "tooltip") - return node - } -}) - -defineFunction({ - type: "tip", - names: ["\\texttip"], - props: { - numArgs: 2, - argTypes: ["math", "text"] - }, - handler({ parser }, args) { - return { - type: "tip", - mode: parser.mode, - body: args[0], - tip: args[1] - }; - }, - mathmlBuilder: (group, style) => { - const math = mml.buildGroup(group.body, style) - const tip = mml.buildGroup(group.tip, style) - // args[1] only accepted text, so tip is a element or a of them. - let str = "" - if (tip.type === "mtext") { - str = tip.children[0].text - } else { - for (const child of tip.children) { - str += child.children[0].text - } - } - // Implement \texttip via a title attribute. - math.setAttribute("title", str) - return math - } -}) diff --git a/src/functions/toggle.js b/src/functions/toggle.js deleted file mode 100644 index 5f0179c7..00000000 --- a/src/functions/toggle.js +++ /dev/null @@ -1,13 +0,0 @@ -import { defineFunctionBuilders } from "../defineFunction"; -import mathMLTree from "../mathMLTree"; -import * as mml from "../buildMathML"; - -defineFunctionBuilders({ - type: "toggle", - mathmlBuilder(group, style) { - const expression = mml.buildExpression(group.body, style) - const node = new mathMLTree.MathNode("maction", expression, [], { cursor: "default" }) - node.setAttribute("actiontype", "toggle") - return node - } -}) diff --git a/src/functions/verb.js b/src/functions/verb.js deleted file mode 100644 index da6a67a6..00000000 --- a/src/functions/verb.js +++ /dev/null @@ -1,33 +0,0 @@ -import defineFunction from "../defineFunction"; -import mathMLTree from "../mathMLTree"; -import ParseError from "../ParseError"; - -defineFunction({ - type: "verb", - names: ["\\verb"], - props: { - numArgs: 0, - allowedInText: true - }, - handler(context, args, optArgs) { - // \verb and \verb* are dealt with directly in Parser.js. - // If we end up here, it's because of a failure to match the two delimiters - // in the regex in Lexer.js. LaTeX raises the following error when \verb is - // terminated by end of line (or file). - throw new ParseError("\\verb ended by end of line instead of matching delimiter"); - }, - mathmlBuilder(group, style) { - const text = new mathMLTree.TextNode(makeVerb(group)); - const node = new mathMLTree.MathNode("mtext", [text]); - node.setAttribute("mathvariant", "monospace"); - return node; - } -}); - -/** - * Converts verb group into body string. - * - * \verb* replaces each space with an open box \u2423 - * \verb replaces each space with a no-break space \xA0 - */ -const makeVerb = (group) => group.body.replace(/ /g, group.star ? "\u2423" : "\xA0"); diff --git a/src/linebreaking.js b/src/linebreaking.js deleted file mode 100644 index 3f71417f..00000000 --- a/src/linebreaking.js +++ /dev/null @@ -1,138 +0,0 @@ -import mathMLTree from "./mathMLTree" -import { DocumentFragment } from "./tree" - -/* - * Neither Firefox nor Chrome support hard line breaks or soft line breaks. - * (Despite https://www.w3.org/Math/draft-spec/mathml.html#chapter3_presm.lbattrs) - * So Temml has work-arounds for both hard and soft breaks. - * The work-arounds sadly do not work simultaneously. Any top-level hard - * break makes soft line breaks impossible. - * - * Hard breaks are simulated by creating a and putting each line in its own . - * - * To create soft line breaks, Temml avoids using the and tags. - * Then the top level of a element can be occupied by elements, and the browser - * will break after a if the expression extends beyond the container limit. - * - * The default is for soft line breaks after each top-level binary or - * relational operator, per TeXbook p. 173. So we gather the expression into s so that - * each ends in a binary or relational operator. - * - * An option is for soft line breaks before an "=" sign. That changes the s. - * - * Soft line breaks will not work in Chromium and Safari, only Firefox. - * - * Hopefully browsers will someday do their own linebreaking and we will be able to delete - * much of this module. - */ - -const openDelims = "([{⌊⌈⟨⟮⎰⟦⦃" -const closeDelims = ")]}⌋⌉⟩⟯⎱⟦⦄" - -export default function setLineBreaks(expression, wrapMode, isDisplayMode) { - const mtrs = []; - let mrows = []; - let block = []; - let numTopLevelEquals = 0 - let i = 0 - let level = 0 - while (i < expression.length) { - while (expression[i] instanceof DocumentFragment) { - expression.splice(i, 1, ...expression[i].children) // Expand the fragment. - } - const node = expression[i]; - if (node.attributes && node.attributes.linebreak && - node.attributes.linebreak === "newline") { - // A hard line break. Create a for the current block. - if (block.length > 0) { - mrows.push(new mathMLTree.MathNode("mrow", block)) - } - mrows.push(node) - block = []; - const mtd = new mathMLTree.MathNode("mtd", mrows) - mtd.style.textAlign = "left" - mtrs.push(new mathMLTree.MathNode("mtr", [mtd])) - mrows = []; - i += 1 - continue - } - block.push(node); - if (node.type && node.type === "mo" && node.children.length === 1 && - !Object.hasOwn(node.attributes, "movablelimits")) { - const ch = node.children[0].text - if (openDelims.indexOf(ch) > -1) { - level += 1 - } else if (closeDelims.indexOf(ch) > -1) { - level -= 1 - } else if (level === 0 && wrapMode === "=" && ch === "=") { - numTopLevelEquals += 1 - if (numTopLevelEquals > 1) { - block.pop() - // Start a new block. (Insert a soft linebreak.) - const element = new mathMLTree.MathNode("mrow", block) - mrows.push(element) - block = [node]; - } - } else if (level === 0 && wrapMode === "tex" && ch !== "∇") { - // Check if the following node is a \nobreak text node, e.g. "~"" - const next = i < expression.length - 1 ? expression[i + 1] : null; - let glueIsFreeOfNobreak = true; - if ( - !( - next && - next.type === "mtext" && - next.attributes.linebreak && - next.attributes.linebreak === "nobreak" - ) - ) { - // We may need to start a new block. - // First, put any post-operator glue on same line as operator. - for (let j = i + 1; j < expression.length; j++) { - const nd = expression[j]; - if ( - nd.type && - nd.type === "mspace" && - !(nd.attributes.linebreak && nd.attributes.linebreak === "newline") - ) { - block.push(nd); - i += 1; - if ( - nd.attributes && - nd.attributes.linebreak && - nd.attributes.linebreak === "nobreak" - ) { - glueIsFreeOfNobreak = false; - } - } else { - break; - } - } - } - if (glueIsFreeOfNobreak) { - // Start a new block. (Insert a soft linebreak.) - const element = new mathMLTree.MathNode("mrow", block) - mrows.push(element) - block = []; - } - } - } - i += 1 - } - if (block.length > 0) { - const element = new mathMLTree.MathNode("mrow", block) - mrows.push(element) - } - if (mtrs.length > 0) { - const mtd = new mathMLTree.MathNode("mtd", mrows) - mtd.style.textAlign = "left" - const mtr = new mathMLTree.MathNode("mtr", [mtd]) - mtrs.push(mtr) - const mtable = new mathMLTree.MathNode("mtable", mtrs) - if (!isDisplayMode) { - mtable.setAttribute("columnalign", "left") - mtable.setAttribute("rowspacing", "0em") - } - return mtable - } - return mathMLTree.newDocumentFragment(mrows); -} diff --git a/src/macros.js b/src/macros.js deleted file mode 100644 index 5e4cc61e..00000000 --- a/src/macros.js +++ /dev/null @@ -1,705 +0,0 @@ -/** - * Predefined macros for Temml. - * This can be used to define some commands in terms of others. - */ - -// Export global macros object from defineMacro -import defineMacro, { _macros } from "./defineMacro"; -const macros = _macros; -export default macros; - -import symbols from "./symbols"; -import ParseError from "./ParseError"; - -////////////////////////////////////////////////////////////////////// -// macro tools - -defineMacro("\\noexpand", function(context) { - // The expansion is the token itself; but that token is interpreted - // as if its meaning were ‘\relax’ if it is a control sequence that - // would ordinarily be expanded by TeX’s expansion rules. - const t = context.popToken(); - if (context.isExpandable(t.text)) { - t.noexpand = true; - t.treatAsRelax = true; - } - return { tokens: [t], numArgs: 0 }; -}); - -defineMacro("\\expandafter", function(context) { - // TeX first reads the token that comes immediately after \expandafter, - // without expanding it; let’s call this token t. Then TeX reads the - // token that comes after t (and possibly more tokens, if that token - // has an argument), replacing it by its expansion. Finally TeX puts - // t back in front of that expansion. - const t = context.popToken(); - context.expandOnce(true); // expand only an expandable token - return { tokens: [t], numArgs: 0 }; -}); - -// LaTeX's \@firstoftwo{#1}{#2} expands to #1, skipping #2 -// TeX source: \long\def\@firstoftwo#1#2{#1} -defineMacro("\\@firstoftwo", function(context) { - const args = context.consumeArgs(2); - return { tokens: args[0], numArgs: 0 }; -}); - -// LaTeX's \@secondoftwo{#1}{#2} expands to #2, skipping #1 -// TeX source: \long\def\@secondoftwo#1#2{#2} -defineMacro("\\@secondoftwo", function(context) { - const args = context.consumeArgs(2); - return { tokens: args[1], numArgs: 0 }; -}); - -// LaTeX's \@ifnextchar{#1}{#2}{#3} looks ahead to the next (unexpanded) -// symbol that isn't a space, consuming any spaces but not consuming the -// first nonspace character. If that nonspace character matches #1, then -// the macro expands to #2; otherwise, it expands to #3. -defineMacro("\\@ifnextchar", function(context) { - const args = context.consumeArgs(3); // symbol, if, else - context.consumeSpaces(); - const nextToken = context.future(); - if (args[0].length === 1 && args[0][0].text === nextToken.text) { - return { tokens: args[1], numArgs: 0 }; - } else { - return { tokens: args[2], numArgs: 0 }; - } -}); - -// LaTeX's \@ifstar{#1}{#2} looks ahead to the next (unexpanded) symbol. -// If it is `*`, then it consumes the symbol, and the macro expands to #1; -// otherwise, the macro expands to #2 (without consuming the symbol). -// TeX source: \def\@ifstar#1{\@ifnextchar *{\@firstoftwo{#1}}} -defineMacro("\\@ifstar", "\\@ifnextchar *{\\@firstoftwo{#1}}"); - -// LaTeX's \TextOrMath{#1}{#2} expands to #1 in text mode, #2 in math mode -defineMacro("\\TextOrMath", function(context) { - const args = context.consumeArgs(2); - if (context.mode === "text") { - return { tokens: args[0], numArgs: 0 }; - } else { - return { tokens: args[1], numArgs: 0 }; - } -}); - -const stringFromArg = arg => { - // Reverse the order of the arg and return a string. - let str = "" - for (let i = arg.length - 1; i > -1; i--) { - str += arg[i].text - } - return str -} - -// Lookup table for parsing numbers in base 8 through 16 -const digitToNumber = { - 0: 0, - 1: 1, - 2: 2, - 3: 3, - 4: 4, - 5: 5, - 6: 6, - 7: 7, - 8: 8, - 9: 9, - a: 10, - A: 10, - b: 11, - B: 11, - c: 12, - C: 12, - d: 13, - D: 13, - e: 14, - E: 14, - f: 15, - F: 15 -}; - -const nextCharNumber = context => { - const numStr = context.future().text - if (numStr === "EOF") { return [null, ""] } - return [digitToNumber[numStr.charAt(0)], numStr] -} - -const appendCharNumbers = (number, numStr, base) => { - for (let i = 1; i < numStr.length; i++) { - const digit = digitToNumber[numStr.charAt(i)] - number *= base; - number += digit; - } - return number -} - -// TeX \char makes a literal character (catcode 12) using the following forms: -// (see The TeXBook, p. 43) -// \char123 -- decimal -// \char'123 -- octal -// \char"123 -- hex -// \char`x -- character that can be written (i.e. isn't active) -// \char`\x -- character that cannot be written (e.g. %) -// These all refer to characters from the font, so we turn them into special -// calls to a function \@char dealt with in the Parser. -defineMacro("\\char", function(context) { - let token = context.popToken(); - let base; - let number = ""; - if (token.text === "'") { - base = 8; - token = context.popToken(); - } else if (token.text === '"') { - base = 16; - token = context.popToken(); - } else if (token.text === "`") { - token = context.popToken(); - if (token.text[0] === "\\") { - number = token.text.charCodeAt(1); - } else if (token.text === "EOF") { - throw new ParseError("\\char` missing argument"); - } else { - number = token.text.charCodeAt(0); - } - } else { - base = 10; - } - if (base) { - // Parse a number in the given base, starting with first `token`. - let numStr = token.text - number = digitToNumber[numStr.charAt(0)]; - if (number == null || number >= base) { - throw new ParseError(`Invalid base-${base} digit ${token.text}`); - } - number = appendCharNumbers(number, numStr, base) - let digit; - [digit, numStr] = nextCharNumber(context) - while (digit != null && digit < base) { - number *= base; - number += digit; - number = appendCharNumbers(number, numStr, base) - context.popToken(); - [digit, numStr] = nextCharNumber(context) - } - } - return `\\@char{${number}}`; -}); - -function recreateArgStr(context) { - // Recreate the macro's original argument string from the array of parse tokens. - const tokens = context.consumeArgs(1)[0]; - let str = "" - let expectedLoc = tokens[tokens.length - 1].loc.start - for (let i = tokens.length - 1; i >= 0; i--) { - const actualLoc = tokens[i].loc.start - if (actualLoc > expectedLoc) { - // context.consumeArgs has eaten a space. - str += " " - expectedLoc = actualLoc; - } - str += tokens[i].text - expectedLoc += tokens[i].text.length - } - return str -} - -// The Latin Modern font renders at the wrong vertical alignment. -// This macro provides a better rendering. -defineMacro("\\surd", '\\sqrt{\\vphantom{|}}') - -// See comment for \oplus in symbols.js. -defineMacro("\u2295", "\\oplus") - -// Since Temml has no \par, ignore \long. -defineMacro("\\long", "") - -////////////////////////////////////////////////////////////////////// -// Grouping -// \let\bgroup={ \let\egroup=} -defineMacro("\\bgroup", "{"); -defineMacro("\\egroup", "}"); - -// Symbols from latex.ltx: -// \def~{\nobreakspace{}} -// \def\lq{`} -// \def\rq{'} -// \def \aa {\r a} -defineMacro("~", "\\nobreakspace"); -defineMacro("\\lq", "`"); -defineMacro("\\rq", "'"); -defineMacro("\\aa", "\\r a"); - -defineMacro("\\Bbbk", "\\Bbb{k}"); - -// \mathstrut from the TeXbook, p 360 -defineMacro("\\mathstrut", "\\vphantom{(}"); - -// \underbar from TeXbook p 353 -defineMacro("\\underbar", "\\underline{\\text{#1}}"); - -////////////////////////////////////////////////////////////////////// -// LaTeX_2ε - -// \vdots{\vbox{\baselineskip4\p@ \lineskiplimit\z@ -// \kern6\p@\hbox{.}\hbox{.}\hbox{.}}} -// We'll call \varvdots, which gets a glyph from symbols.js. -// The zero-width rule gets us an equivalent to the vertical 6pt kern. -defineMacro("\\vdots", "{\\varvdots\\rule{0pt}{15pt}}"); -defineMacro("\u22ee", "\\vdots"); - -////////////////////////////////////////////////////////////////////// -// amsmath.sty -// http://mirrors.concertpass.com/tex-archive/macros/latex/required/amsmath/amsmath.pdf - -//\newcommand{\substack}[1]{\subarray{c}#1\endsubarray} -defineMacro("\\substack", "\\begin{subarray}{c}#1\\end{subarray}"); - -// \def\iff{\DOTSB\;\Longleftrightarrow\;} -// \def\implies{\DOTSB\;\Longrightarrow\;} -// \def\impliedby{\DOTSB\;\Longleftarrow\;} -defineMacro("\\iff", "\\DOTSB\\;\\Longleftrightarrow\\;"); -defineMacro("\\implies", "\\DOTSB\\;\\Longrightarrow\\;"); -defineMacro("\\impliedby", "\\DOTSB\\;\\Longleftarrow\\;"); - -// AMSMath's automatic \dots, based on \mdots@@ macro. -const dotsByToken = { - ",": "\\dotsc", - "\\not": "\\dotsb", - // \keybin@ checks for the following: - "+": "\\dotsb", - "=": "\\dotsb", - "<": "\\dotsb", - ">": "\\dotsb", - "-": "\\dotsb", - "*": "\\dotsb", - ":": "\\dotsb", - // Symbols whose definition starts with \DOTSB: - "\\DOTSB": "\\dotsb", - "\\coprod": "\\dotsb", - "\\bigvee": "\\dotsb", - "\\bigwedge": "\\dotsb", - "\\biguplus": "\\dotsb", - "\\bigcap": "\\dotsb", - "\\bigcup": "\\dotsb", - "\\prod": "\\dotsb", - "\\sum": "\\dotsb", - "\\bigotimes": "\\dotsb", - "\\bigoplus": "\\dotsb", - "\\bigodot": "\\dotsb", - "\\bigsqcap": "\\dotsb", - "\\bigsqcup": "\\dotsb", - "\\bigtimes": "\\dotsb", - "\\And": "\\dotsb", - "\\longrightarrow": "\\dotsb", - "\\Longrightarrow": "\\dotsb", - "\\longleftarrow": "\\dotsb", - "\\Longleftarrow": "\\dotsb", - "\\longleftrightarrow": "\\dotsb", - "\\Longleftrightarrow": "\\dotsb", - "\\mapsto": "\\dotsb", - "\\longmapsto": "\\dotsb", - "\\hookrightarrow": "\\dotsb", - "\\doteq": "\\dotsb", - // Symbols whose definition starts with \mathbin: - "\\mathbin": "\\dotsb", - // Symbols whose definition starts with \mathrel: - "\\mathrel": "\\dotsb", - "\\relbar": "\\dotsb", - "\\Relbar": "\\dotsb", - "\\xrightarrow": "\\dotsb", - "\\xleftarrow": "\\dotsb", - // Symbols whose definition starts with \DOTSI: - "\\DOTSI": "\\dotsi", - "\\int": "\\dotsi", - "\\oint": "\\dotsi", - "\\iint": "\\dotsi", - "\\iiint": "\\dotsi", - "\\iiiint": "\\dotsi", - "\\idotsint": "\\dotsi", - // Symbols whose definition starts with \DOTSX: - "\\DOTSX": "\\dotsx" -}; - -defineMacro("\\dots", function(context) { - // TODO: If used in text mode, should expand to \textellipsis. - // However, in Temml, \textellipsis and \ldots behave the same - // (in text mode), and it's unlikely we'd see any of the math commands - // that affect the behavior of \dots when in text mode. So fine for now - // (until we support \ifmmode ... \else ... \fi). - let thedots = "\\dotso"; - const next = context.expandAfterFuture().text; - if (next in dotsByToken) { - thedots = dotsByToken[next]; - } else if (next.slice(0, 4) === "\\not") { - thedots = "\\dotsb"; - } else if (next in symbols.math) { - if (["bin", "rel"].includes(symbols.math[next].group)) { - thedots = "\\dotsb"; - } - } - return thedots; -}); - -const spaceAfterDots = { - // \rightdelim@ checks for the following: - ")": true, - "]": true, - "\\rbrack": true, - "\\}": true, - "\\rbrace": true, - "\\rangle": true, - "\\rceil": true, - "\\rfloor": true, - "\\rgroup": true, - "\\rmoustache": true, - "\\right": true, - "\\bigr": true, - "\\biggr": true, - "\\Bigr": true, - "\\Biggr": true, - // \extra@ also tests for the following: - $: true, - // \extrap@ checks for the following: - ";": true, - ".": true, - ",": true -}; - -defineMacro("\\dotso", function(context) { - const next = context.future().text; - if (next in spaceAfterDots) { - return "\\ldots\\,"; - } else { - return "\\ldots"; - } -}); - -defineMacro("\\dotsc", function(context) { - const next = context.future().text; - // \dotsc uses \extra@ but not \extrap@, instead specially checking for - // ';' and '.', but doesn't check for ','. - if (next in spaceAfterDots && next !== ",") { - return "\\ldots\\,"; - } else { - return "\\ldots"; - } -}); - -defineMacro("\\cdots", function(context) { - const next = context.future().text; - if (next in spaceAfterDots) { - return "\\@cdots\\,"; - } else { - return "\\@cdots"; - } -}); - -defineMacro("\\dotsb", "\\cdots"); -defineMacro("\\dotsm", "\\cdots"); -defineMacro("\\dotsi", "\\!\\cdots"); -defineMacro("\\idotsint", "\\dotsi"); -// amsmath doesn't actually define \dotsx, but \dots followed by a macro -// starting with \DOTSX implies \dotso, and then \extra@ detects this case -// and forces the added `\,`. -defineMacro("\\dotsx", "\\ldots\\,"); - -// \let\DOTSI\relax -// \let\DOTSB\relax -// \let\DOTSX\relax -defineMacro("\\DOTSI", "\\relax"); -defineMacro("\\DOTSB", "\\relax"); -defineMacro("\\DOTSX", "\\relax"); - -// Spacing, based on amsmath.sty's override of LaTeX defaults -// \DeclareRobustCommand{\tmspace}[3]{% -// \ifmmode\mskip#1#2\else\kern#1#3\fi\relax} -defineMacro("\\tmspace", "\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax"); -// \renewcommand{\,}{\tmspace+\thinmuskip{.1667em}} -// TODO: math mode should use \thinmuskip -defineMacro("\\,", "{\\tmspace+{3mu}{.1667em}}"); -// \let\thinspace\, -defineMacro("\\thinspace", "\\,"); -// \def\>{\mskip\medmuskip} -// \renewcommand{\:}{\tmspace+\medmuskip{.2222em}} -// TODO: \> and math mode of \: should use \medmuskip = 4mu plus 2mu minus 4mu -defineMacro("\\>", "\\mskip{4mu}"); -defineMacro("\\:", "{\\tmspace+{4mu}{.2222em}}"); -// \let\medspace\: -defineMacro("\\medspace", "\\:"); -// \renewcommand{\;}{\tmspace+\thickmuskip{.2777em}} -// TODO: math mode should use \thickmuskip = 5mu plus 5mu -defineMacro("\\;", "{\\tmspace+{5mu}{.2777em}}"); -// \let\thickspace\; -defineMacro("\\thickspace", "\\;"); -// \renewcommand{\!}{\tmspace-\thinmuskip{.1667em}} -// TODO: math mode should use \thinmuskip -defineMacro("\\!", "{\\tmspace-{3mu}{.1667em}}"); -// \let\negthinspace\! -defineMacro("\\negthinspace", "\\!"); -// \newcommand{\negmedspace}{\tmspace-\medmuskip{.2222em}} -// TODO: math mode should use \medmuskip -defineMacro("\\negmedspace", "{\\tmspace-{4mu}{.2222em}}"); -// \newcommand{\negthickspace}{\tmspace-\thickmuskip{.2777em}} -// TODO: math mode should use \thickmuskip -defineMacro("\\negthickspace", "{\\tmspace-{5mu}{.277em}}"); -// \def\enspace{\kern.5em } -defineMacro("\\enspace", "\\kern.5em "); -// \def\enskip{\hskip.5em\relax} -defineMacro("\\enskip", "\\hskip.5em\\relax"); -// \def\quad{\hskip1em\relax} -defineMacro("\\quad", "\\hskip1em\\relax"); -// \def\qquad{\hskip2em\relax} -defineMacro("\\qquad", "\\hskip2em\\relax"); - -defineMacro("\\AA", "\\TextOrMath{\\Angstrom}{\\mathring{A}}\\relax") - -// \tag@in@display form of \tag -defineMacro("\\tag", "\\@ifstar\\tag@literal\\tag@paren"); -defineMacro("\\tag@paren", "\\tag@literal{({#1})}"); -defineMacro("\\tag@literal", (context) => { - if (context.macros.get("\\df@tag")) { - throw new ParseError("Multiple \\tag"); - } - return "\\def\\df@tag{\\text{#1}}"; -}); - -// \renewcommand{\bmod}{\nonscript\mskip-\medmuskip\mkern5mu\mathbin -// {\operator@font mod}\penalty900 -// \mkern5mu\nonscript\mskip-\medmuskip} -// \newcommand{\pod}[1]{\allowbreak -// \if@display\mkern18mu\else\mkern8mu\fi(#1)} -// \renewcommand{\pmod}[1]{\pod{{\operator@font mod}\mkern6mu#1}} -// \newcommand{\mod}[1]{\allowbreak\if@display\mkern18mu -// \else\mkern12mu\fi{\operator@font mod}\,\,#1} -// TODO: math mode should use \medmuskip = 4mu plus 2mu minus 4mu -defineMacro("\\bmod", "\\mathbin{\\text{mod}}"); -defineMacro( - "\\pod", - "\\allowbreak" + "\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)" -); -defineMacro("\\pmod", "\\pod{{\\rm mod}\\mkern6mu#1}"); -defineMacro( - "\\mod", - "\\allowbreak" + - "\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}" + - "{\\rm mod}\\,\\,#1" -); - -////////////////////////////////////////////////////////////////////// -// LaTeX source2e - -// \expandafter\let\expandafter\@normalcr -// \csname\expandafter\@gobble\string\\ \endcsname -// \DeclareRobustCommand\newline{\@normalcr\relax} -defineMacro("\\newline", "\\\\\\relax"); - -// \def\TeX{T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX\@} -// TODO: Doesn't normally work in math mode because \@ fails. -defineMacro("\\TeX", "\\textrm{T}\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125em\\textrm{X}"); - -defineMacro( - "\\LaTeX", - "\\textrm{L}\\kern-.35em\\raisebox{0.2em}{\\scriptstyle A}\\kern-.15em\\TeX" -); - -defineMacro( - "\\Temml", - // eslint-disable-next-line max-len - "\\textrm{T}\\kern-0.2em\\lower{0.2em}{\\textrm{E}}\\kern-0.08em{\\textrm{M}\\kern-0.08em\\raise{0.2em}\\textrm{M}\\kern-0.08em\\textrm{L}}" -); - -// \DeclareRobustCommand\hspace{\@ifstar\@hspacer\@hspace} -// \def\@hspace#1{\hskip #1\relax} -// \def\@hspacer#1{\vrule \@width\z@\nobreak -// \hskip #1\hskip \z@skip} -defineMacro("\\hspace", "\\@ifstar\\@hspacer\\@hspace"); -defineMacro("\\@hspace", "\\hskip #1\\relax"); -defineMacro("\\@hspacer", "\\rule{0pt}{0pt}\\hskip #1\\relax"); - -defineMacro("\\colon", `\\mathpunct{\\char"3a}`) - -////////////////////////////////////////////////////////////////////// -// mathtools.sty - -defineMacro("\\prescript", "\\pres@cript{_{#1}^{#2}}{}{#3}") - -//\providecommand\ordinarycolon{:} -defineMacro("\\ordinarycolon", `\\char"3a`); -// Raise to center on the math axis, as closely as possible. -defineMacro("\\vcentcolon", "\\mathrel{\\raisebox{0.035em}{\\ordinarycolon}}"); -// \providecommand*\coloneq{\vcentcolon\mathrel{\mkern-1.2mu}\mathrel{-}} -defineMacro("\\coloneq", '\\mathrel{\\raisebox{0.035em}{\\ordinarycolon}\\char"2212}'); -// \providecommand*\Coloneq{\dblcolon\mathrel{\mkern-1.2mu}\mathrel{-}} -defineMacro("\\Coloneq", '\\mathrel{\\char"2237\\char"2212}'); -// \providecommand*\Eqqcolon{=\mathrel{\mkern-1.2mu}\dblcolon} -defineMacro("\\Eqqcolon", '\\mathrel{\\char"3d\\char"2237}'); -// \providecommand*\Eqcolon{\mathrel{-}\mathrel{\mkern-1.2mu}\dblcolon} -defineMacro("\\Eqcolon", '\\mathrel{\\char"2212\\char"2237}'); -// \providecommand*\colonapprox{\vcentcolon\mathrel{\mkern-1.2mu}\approx} -defineMacro("\\colonapprox", '\\mathrel{\\raisebox{0.035em}{\\ordinarycolon}\\char"2248}'); -// \providecommand*\Colonapprox{\dblcolon\mathrel{\mkern-1.2mu}\approx} -defineMacro("\\Colonapprox", '\\mathrel{\\char"2237\\char"2248}'); -// \providecommand*\colonsim{\vcentcolon\mathrel{\mkern-1.2mu}\sim} -defineMacro("\\colonsim", '\\mathrel{\\raisebox{0.035em}{\\ordinarycolon}\\char"223c}'); -// \providecommand*\Colonsim{\dblcolon\mathrel{\mkern-1.2mu}\sim} -defineMacro("\\Colonsim", '\\mathrel{\\raisebox{0.035em}{\\ordinarycolon}\\char"223c}'); - -////////////////////////////////////////////////////////////////////// -// colonequals.sty - -// Alternate names for mathtools's macros: -defineMacro("\\ratio", "\\vcentcolon"); -defineMacro("\\coloncolon", "\\dblcolon"); -defineMacro("\\colonequals", "\\coloneqq"); -defineMacro("\\coloncolonequals", "\\Coloneqq"); -defineMacro("\\equalscolon", "\\eqqcolon"); -defineMacro("\\equalscoloncolon", "\\Eqqcolon"); -defineMacro("\\colonminus", "\\coloneq"); -defineMacro("\\coloncolonminus", "\\Coloneq"); -defineMacro("\\minuscolon", "\\eqcolon"); -defineMacro("\\minuscoloncolon", "\\Eqcolon"); -// \colonapprox name is same in mathtools and colonequals. -defineMacro("\\coloncolonapprox", "\\Colonapprox"); -// \colonsim name is same in mathtools and colonequals. -defineMacro("\\coloncolonsim", "\\Colonsim"); - -// Present in newtxmath, pxfonts and txfonts -defineMacro("\\notni", "\\mathrel{\\char`\u220C}"); -defineMacro("\\limsup", "\\DOTSB\\operatorname*{lim\\,sup}"); -defineMacro("\\liminf", "\\DOTSB\\operatorname*{lim\\,inf}"); - -////////////////////////////////////////////////////////////////////// -// From amsopn.sty -defineMacro("\\injlim", "\\DOTSB\\operatorname*{inj\\,lim}"); -defineMacro("\\projlim", "\\DOTSB\\operatorname*{proj\\,lim}"); -defineMacro("\\varlimsup", "\\DOTSB\\operatorname*{\\overline{\\text{lim}}}"); -defineMacro("\\varliminf", "\\DOTSB\\operatorname*{\\underline{\\text{lim}}}"); -defineMacro("\\varinjlim", "\\DOTSB\\operatorname*{\\underrightarrow{\\text{lim}}}"); -defineMacro("\\varprojlim", "\\DOTSB\\operatorname*{\\underleftarrow{\\text{lim}}}"); - -defineMacro("\\centerdot", "{\\medspace\\rule{0.167em}{0.189em}\\medspace}") - -////////////////////////////////////////////////////////////////////// -// statmath.sty -// https://ctan.math.illinois.edu/macros/latex/contrib/statmath/statmath.pdf - -defineMacro("\\argmin", "\\DOTSB\\operatorname*{arg\\,min}"); -defineMacro("\\argmax", "\\DOTSB\\operatorname*{arg\\,max}"); -defineMacro("\\plim", "\\DOTSB\\operatorname*{plim}"); - -////////////////////////////////////////////////////////////////////// -// MnSymbol.sty - -defineMacro("\\leftmodels", "\\mathop{\\reflectbox{$\\models$}}") - -////////////////////////////////////////////////////////////////////// -// braket.sty -// http://ctan.math.washington.edu/tex-archive/macros/latex/contrib/braket/braket.pdf - -defineMacro("\\bra", "\\mathinner{\\langle{#1}|}"); -defineMacro("\\ket", "\\mathinner{|{#1}\\rangle}"); -defineMacro("\\braket", "\\mathinner{\\langle{#1}\\rangle}"); -defineMacro("\\Bra", "\\left\\langle#1\\right|"); -defineMacro("\\Ket", "\\left|#1\\right\\rangle"); -// A helper for \Braket and \Set -const replaceVert = (argStr, match) => { - const ch = match[0] === "|" ? "\\vert" : "\\Vert" - const replaceStr = `}\\,\\middle${ch}\\,{` - return argStr.slice(0, match.index) + replaceStr + argStr.slice(match.index + match[0].length) -} -defineMacro("\\Braket", function(context) { - let argStr = recreateArgStr(context) - const regEx = /\|\||\||\\\|/g - let match - while ((match = regEx.exec(argStr)) !== null) { - argStr = replaceVert(argStr, match) - } - return "\\left\\langle{" + argStr + "}\\right\\rangle" -}); -defineMacro("\\Set", function(context) { - let argStr = recreateArgStr(context) - const match = /\|\||\||\\\|/.exec(argStr) - if (match) { - argStr = replaceVert(argStr, match) - } - return "\\left\\{\\:{" + argStr + "}\\:\\right\\}" -}); -defineMacro("\\set", function(context) { - const argStr = recreateArgStr(context) - return "\\{{" + argStr.replace(/\|/, "}\\mid{") + "}\\}" -}); - -////////////////////////////////////////////////////////////////////// -// actuarialangle.dtx -defineMacro("\\angln", "{\\angl n}"); - -////////////////////////////////////////////////////////////////////// -// derivative.sty -defineMacro("\\odv", "\\@ifstar\\odv@next\\odv@numerator"); -defineMacro("\\odv@numerator", "\\frac{\\mathrm{d}#1}{\\mathrm{d}#2}") -defineMacro("\\odv@next", "\\frac{\\mathrm{d}}{\\mathrm{d}#2}#1") -defineMacro("\\pdv", "\\@ifstar\\pdv@next\\pdv@numerator"); - -const pdvHelper = args => { - const numerator = args[0][0].text - const denoms = stringFromArg(args[1]).split(",") - const power = String(denoms.length) - const numOp = power === "1" ? "\\partial" : `\\partial^${power}` - let denominator = "" - denoms.map(e => { denominator += "\\partial " + e.trim() + "\\,"}) - return [numerator, numOp, denominator.replace(/\\,$/, "")] -} -defineMacro("\\pdv@numerator", function(context) { - const [numerator, numOp, denominator] = pdvHelper(context.consumeArgs(2)) - return `\\frac{${numOp} ${numerator}}{${denominator}}` -}) -defineMacro("\\pdv@next", function(context) { - const [numerator, numOp, denominator] = pdvHelper(context.consumeArgs(2)) - return `\\frac{${numOp}}{${denominator}} ${numerator}` -}) - -////////////////////////////////////////////////////////////////////// -// upgreek.dtx -defineMacro("\\upalpha", "\\up@greek{\\alpha}"); -defineMacro("\\upbeta", "\\up@greek{\\beta}"); -defineMacro("\\upgamma", "\\up@greek{\\gamma}"); -defineMacro("\\updelta", "\\up@greek{\\delta}"); -defineMacro("\\upepsilon", "\\up@greek{\\epsilon}"); -defineMacro("\\upzeta", "\\up@greek{\\zeta}"); -defineMacro("\\upeta", "\\up@greek{\\eta}"); -defineMacro("\\uptheta", "\\up@greek{\\theta}"); -defineMacro("\\upiota", "\\up@greek{\\iota}"); -defineMacro("\\upkappa", "\\up@greek{\\kappa}"); -defineMacro("\\uplambda", "\\up@greek{\\lambda}"); -defineMacro("\\upmu", "\\up@greek{\\mu}"); -defineMacro("\\upnu", "\\up@greek{\\nu}"); -defineMacro("\\upxi", "\\up@greek{\\xi}"); -defineMacro("\\upomicron", "\\up@greek{\\omicron}"); -defineMacro("\\uppi", "\\up@greek{\\pi}"); -defineMacro("\\upalpha", "\\up@greek{\\alpha}"); -defineMacro("\\uprho", "\\up@greek{\\rho}"); -defineMacro("\\upsigma", "\\up@greek{\\sigma}"); -defineMacro("\\uptau", "\\up@greek{\\tau}"); -defineMacro("\\upupsilon", "\\up@greek{\\upsilon}"); -defineMacro("\\upphi", "\\up@greek{\\phi}"); -defineMacro("\\upchi", "\\up@greek{\\chi}"); -defineMacro("\\uppsi", "\\up@greek{\\psi}"); -defineMacro("\\upomega", "\\up@greek{\\omega}"); - -////////////////////////////////////////////////////////////////////// -// cmll package -defineMacro("\\invamp", '\\mathbin{\\char"214b}') -defineMacro("\\parr", '\\mathbin{\\char"214b}') -defineMacro("\\with", '\\mathbin{\\char"26}') -defineMacro("\\multimapinv", '\\mathrel{\\char"27dc}') -defineMacro("\\multimapboth", '\\mathrel{\\char"29df}') -defineMacro("\\scoh", '{\\mkern5mu\\char"2322\\mkern5mu}') -defineMacro("\\sincoh", '{\\mkern5mu\\char"2323\\mkern5mu}') -defineMacro("\\coh", `{\\mkern5mu\\rule{}{0.7em}\\mathrlap{\\smash{\\raise2mu{\\char"2322}}} -{\\smash{\\lower4mu{\\char"2323}}}\\mkern5mu}`) -defineMacro("\\incoh", `{\\mkern5mu\\rule{}{0.7em}\\mathrlap{\\smash{\\raise2mu{\\char"2323}}} -{\\smash{\\lower4mu{\\char"2322}}}\\mkern5mu}`) - - -////////////////////////////////////////////////////////////////////// -// chemstyle package -defineMacro("\\standardstate", "\\text{\\tiny\\char`⦵}"); diff --git a/src/mathMLTree.js b/src/mathMLTree.js deleted file mode 100644 index d46460f2..00000000 --- a/src/mathMLTree.js +++ /dev/null @@ -1,175 +0,0 @@ -// -/** - * These objects store data about MathML nodes. - * The `toNode` and `toMarkup` functions create namespaced DOM nodes and - * HTML text markup respectively. - */ - -import utils from "./utils"; -import { DocumentFragment } from "./tree"; -import { createClass } from "./domTree"; - -export function newDocumentFragment(children) { - return new DocumentFragment(children); -} - -/** - * This node represents a general purpose MathML node of any type, - * for example, `"mo"` or `"mspace"`, corresponding to `` and - * `` tags). - */ -export class MathNode { - constructor(type, children, classes, style) { - this.type = type; - this.attributes = {}; - this.children = children || []; - this.classes = classes || []; - this.style = style || {}; // Used for elements - } - - /** - * Sets an attribute on a MathML node. MathML depends on attributes to convey a - * semantic content, so this is used heavily. - */ - setAttribute(name, value) { - this.attributes[name] = value; - } - - /** - * Gets an attribute on a MathML node. - */ - getAttribute(name) { - return this.attributes[name]; - } - - /** - * Converts the math node into a MathML-namespaced DOM element. - */ - toNode() { - const node = document.createElementNS("http://www.w3.org/1998/Math/MathML", this.type); - - for (const attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { - node.setAttribute(attr, this.attributes[attr]); - } - } - - if (this.classes.length > 0) { - node.className = createClass(this.classes); - } - - // Apply inline styles - for (const style in this.style) { - if (Object.prototype.hasOwnProperty.call(this.style, style )) { - node.style[style] = this.style[style]; - } - } - - for (let i = 0; i < this.children.length; i++) { - node.appendChild(this.children[i].toNode()); - } - - return node; - } - - /** - * Converts the math node into an HTML markup string. - */ - toMarkup() { - let markup = "<" + this.type; - - // Add the attributes - for (const attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { - markup += " " + attr + '="'; - markup += utils.escape(this.attributes[attr]); - markup += '"'; - } - } - - if (this.classes.length > 0) { - markup += ` class="${utils.escape(createClass(this.classes))}"`; - } - - let styles = ""; - - // Add the styles, after hyphenation - for (const style in this.style) { - if (Object.prototype.hasOwnProperty.call(this.style, style )) { - styles += `${utils.hyphenate(style)}:${this.style[style]};`; - } - } - - if (styles) { - markup += ` style="${styles}"`; - } - - markup += ">"; - - for (let i = 0; i < this.children.length; i++) { - markup += this.children[i].toMarkup(); - } - - markup += ""; - - return markup; - } - - /** - * Converts the math node into a string, similar to innerText, but escaped. - */ - toText() { - return this.children.map((child) => child.toText()).join(""); - } -} - -/** - * This node represents a piece of text. - */ -export class TextNode { - constructor(text) { - this.text = text; - } - - /** - * Converts the text node into a DOM text node. - */ - toNode() { - return document.createTextNode(this.text); - } - - /** - * Converts the text node into escaped HTML markup - * (representing the text itself). - */ - toMarkup() { - return utils.escape(this.toText()); - } - - /** - * Converts the text node into a string - * (representing the text itself). - */ - toText() { - return this.text; - } -} - -// Do not make an the only child of a . -// An acts as its own implicit . -export const wrapWithMstyle = expression => { - let node - if (expression.length === 1 && expression[0].type === "mrow") { - node = expression.pop() - node.type = "mstyle" - } else { - node = new MathNode("mstyle", expression); - } - return node -} - -export default { - MathNode, - TextNode, - newDocumentFragment -}; diff --git a/src/parseNode.js b/src/parseNode.js deleted file mode 100644 index 9c3da07e..00000000 --- a/src/parseNode.js +++ /dev/null @@ -1,42 +0,0 @@ -import { NON_ATOMS } from "./symbols"; - -/** - * Asserts that the node is of the given type and returns it with stricter - * typing. Throws if the node's type does not match. - */ -export function assertNodeType(node, type) { - if (!node || node.type !== type) { - throw new Error( - `Expected node of type ${type}, but got ` + - (node ? `node of type ${node.type}` : String(node)) - ); - } - return node; -} - -/** - * Returns the node more strictly typed iff it is of the given type. Otherwise, - * returns null. - */ -export function assertSymbolNodeType(node) { - const typedNode = checkSymbolNodeType(node); - if (!typedNode) { - throw new Error( - `Expected node of symbol group type, but got ` + - (node ? `node of type ${node.type}` : String(node)) - ); - } - return typedNode; -} - -/** - * Returns the node more strictly typed iff it is of the given type. Otherwise, - * returns null. - */ -export function checkSymbolNodeType(node) { - if (node && (node.type === "atom" || - Object.prototype.hasOwnProperty.call(NON_ATOMS, node.type))) { - return node; - } - return null; -} diff --git a/src/parseTree.js b/src/parseTree.js deleted file mode 100644 index f1399ad4..00000000 --- a/src/parseTree.js +++ /dev/null @@ -1,40 +0,0 @@ -import Parser from "./Parser" -import ParseError from "./ParseError" - -/** - * Parses an expression using a Parser, then returns the parsed result. - */ -const parseTree = function(toParse, settings) { - if (!(typeof toParse === "string" || toParse instanceof String)) { - throw new TypeError("Temml can only parse string typed expression") - } - const parser = new Parser(toParse, settings) - // Blank out any \df@tag to avoid spurious "Duplicate \tag" errors - delete parser.gullet.macros.current["\\df@tag"] - - let tree = parser.parse() - - // LaTeX ignores a \tag placed outside an AMS environment. - if (!(tree.length > 0 && tree[0].type && tree[0].type === "array" && tree[0].addEqnNum)) { - // If the input used \tag, it will set the \df@tag macro to the tag. - // In this case, we separately parse the tag and wrap the tree. - if (parser.gullet.macros.get("\\df@tag")) { - if (!settings.displayMode) { - throw new ParseError("\\tag works only in display mode") - } - parser.gullet.feed("\\df@tag") - tree = [ - { - type: "tag", - mode: "text", - body: tree, - tag: parser.parse() - } - ] - } - } - - return tree -} - -export default parseTree diff --git a/src/postProcess.js b/src/postProcess.js deleted file mode 100644 index b7808390..00000000 --- a/src/postProcess.js +++ /dev/null @@ -1,57 +0,0 @@ -/* Temml Post Process - * Perform two tasks not done by Temml when it created each individual Temml element. - * Given a block, - * 1. At each AMS auto-numbered environment, assign an id. - * 2. Populate the text contents of each \ref & \eqref - * - * As with other Temml code, this file is released under terms of the MIT license. - * https://mit-license.org/ - */ - -export const version = "0.10.24"; - -export function postProcess(block) { - const labelMap = {} - let i = 0 - - // Get a collection of the parents of each \tag & auto-numbered equation - const parents = block.getElementsByClassName("tml-tageqn"); - for (const parent of parents) { - const eqns = parent.getElementsByClassName("tml-eqn") - if (eqns. length > 0 ) { - // AMS automatically numbered equation. - // Assign an id. - i += 1; - eqns[0].id = "tml-eqn-" + i - // No need to write a number into the text content of the element. - // A CSS counter does that even if this postProcess() function is not used. - } - // If there is a \label, add it to labelMap - const labels = parent.getElementsByClassName("tml-label") - if (labels.length === 0) { continue } - if (eqns.length > 0) { - labelMap[labels[0].id] = String(i) - } else { - const tags = parent.getElementsByClassName("tml-tag") - if (tags.length > 0) { - labelMap[labels[0].id] = tags[0].textContent - } - } - } - - // Populate \ref & \eqref text content - const refs = block.getElementsByClassName("tml-ref"); - [...refs].forEach(ref => { - let str = labelMap[ref.getAttribute("href").slice(1)]; - if (ref.className.indexOf("tml-eqref") === -1) { - // \ref. Omit parens. - str = str.replace(/^\(/, "") - str = str.replace(/\($/, "") - } { - // \eqref. Include parens - if (str.charAt(0) !== "(") { str = "(" + str } - if (str.slice(-1) !== ")") { str = str + ")" } - } - ref.textContent = str - }) -} diff --git a/src/replace.js b/src/replace.js deleted file mode 100644 index 21c1cbef..00000000 --- a/src/replace.js +++ /dev/null @@ -1,225 +0,0 @@ -// Chromium does not support the MathML `mathvariant` attribute. -// Instead, we replace ASCII characters with Unicode characters that -// are defined in the font as bold, italic, double-struck, etc. -// This module identifies those Unicode code points. - -// First, a few helpers. -const script = Object.freeze({ - B: 0x20EA, // Offset from ASCII B to Unicode script B - E: 0x20EB, - F: 0x20EB, - H: 0x20C3, - I: 0x20C7, - L: 0x20C6, - M: 0x20E6, - R: 0x20C9, - e: 0x20CA, - g: 0x20A3, - o: 0x20C5 -}) - -const frak = Object.freeze({ - C: 0x20EA, - H: 0x20C4, - I: 0x20C8, - R: 0x20CA, - Z: 0x20CE -}) - -const bbb = Object.freeze({ - C: 0x20BF, // blackboard bold - H: 0x20C5, - N: 0x20C7, - P: 0x20C9, - Q: 0x20C9, - R: 0x20CB, - Z: 0x20CA -}) - -const bold = Object.freeze({ - "\u03f5": 0x1D2E7, // lunate epsilon - "\u03d1": 0x1D30C, // vartheta - "\u03f0": 0x1D2EE, // varkappa - "\u03c6": 0x1D319, // varphi - "\u03f1": 0x1D2EF, // varrho - "\u03d6": 0x1D30B // varpi -}) - -const boldItalic = Object.freeze({ - "\u03f5": 0x1D35B, // lunate epsilon - "\u03d1": 0x1D380, // vartheta - "\u03f0": 0x1D362, // varkappa - "\u03c6": 0x1D38D, // varphi - "\u03f1": 0x1D363, // varrho - "\u03d6": 0x1D37F // varpi -}) - -const boldsf = Object.freeze({ - "\u03f5": 0x1D395, // lunate epsilon - "\u03d1": 0x1D3BA, // vartheta - "\u03f0": 0x1D39C, // varkappa - "\u03c6": 0x1D3C7, // varphi - "\u03f1": 0x1D39D, // varrho - "\u03d6": 0x1D3B9 // varpi -}) - -const bisf = Object.freeze({ - "\u03f5": 0x1D3CF, // lunate epsilon - "\u03d1": 0x1D3F4, // vartheta - "\u03f0": 0x1D3D6, // varkappa - "\u03c6": 0x1D401, // varphi - "\u03f1": 0x1D3D7, // varrho - "\u03d6": 0x1D3F3 // varpi -}) - -// Code point offsets below are derived from https://www.unicode.org/charts/PDF/U1D400.pdf -const offset = Object.freeze({ - upperCaseLatin: { // A-Z - "normal": ch => { return 0 }, - "bold": ch => { return 0x1D3BF }, - "italic": ch => { return 0x1D3F3 }, - "bold-italic": ch => { return 0x1D427 }, - "script": ch => { return script[ch] || 0x1D45B }, - "script-bold": ch => { return 0x1D48F }, - "fraktur": ch => { return frak[ch] || 0x1D4C3 }, - "fraktur-bold": ch => { return 0x1D52B }, - "double-struck": ch => { return bbb[ch] || 0x1D4F7 }, - "sans-serif": ch => { return 0x1D55F }, - "sans-serif-bold": ch => { return 0x1D593 }, - "sans-serif-italic": ch => { return 0x1D5C7 }, - "sans-serif-bold-italic": ch => { return 0x1D63C }, - "monospace": ch => { return 0x1D62F } - }, - lowerCaseLatin: { // a-z - "normal": ch => { return 0 }, - "bold": ch => { return 0x1D3B9 }, - "italic": ch => { return ch === "h" ? 0x20A6 : 0x1D3ED }, - "bold-italic": ch => { return 0x1D421 }, - "script": ch => { return script[ch] || 0x1D455 }, - "script-bold": ch => { return 0x1D489 }, - "fraktur": ch => { return 0x1D4BD }, - "fraktur-bold": ch => { return 0x1D525 }, - "double-struck": ch => { return 0x1D4F1 }, - "sans-serif": ch => { return 0x1D559 }, - "sans-serif-bold": ch => { return 0x1D58D }, - "sans-serif-italic": ch => { return 0x1D5C1 }, - "sans-serif-bold-italic": ch => { return 0x1D5F5 }, - "monospace": ch => { return 0x1D629 } - }, - upperCaseGreek: { // A-Ω - "normal": ch => { return 0 }, - "bold": ch => { return 0x1D317 }, - "italic": ch => { return 0x1D351 }, - // \boldsymbol actually returns upright bold for upperCaseGreek - "bold-italic": ch => { return 0x1D317 }, - "script": ch => { return 0 }, - "script-bold": ch => { return 0 }, - "fraktur": ch => { return 0 }, - "fraktur-bold": ch => { return 0 }, - "double-struck": ch => { return 0 }, - // Unicode has no code points for regular-weight san-serif Greek. Use bold. - "sans-serif": ch => { return 0x1D3C5 }, - "sans-serif-bold": ch => { return 0x1D3C5 }, - "sans-serif-italic": ch => { return 0 }, - "sans-serif-bold-italic": ch => { return 0x1D3FF }, - "monospace": ch => { return 0 } - }, - lowerCaseGreek: { // α-ω - "normal": ch => { return 0 }, - "bold": ch => { return 0x1D311 }, - "italic": ch => { return 0x1D34B }, - "bold-italic": ch => { return ch === "\u03d5" ? 0x1D37E : 0x1D385 }, - "script": ch => { return 0 }, - "script-bold": ch => { return 0 }, - "fraktur": ch => { return 0 }, - "fraktur-bold": ch => { return 0 }, - "double-struck": ch => { return 0 }, - // Unicode has no code points for regular-weight san-serif Greek. Use bold. - "sans-serif": ch => { return 0x1D3BF }, - "sans-serif-bold": ch => { return 0x1D3BF }, - "sans-serif-italic": ch => { return 0 }, - "sans-serif-bold-italic": ch => { return 0x1D3F9 }, - "monospace": ch => { return 0 } - }, - varGreek: { // \varGamma, etc - "normal": ch => { return 0 }, - "bold": ch => { return bold[ch] || -51 }, - "italic": ch => { return 0 }, - "bold-italic": ch => { return boldItalic[ch] || 0x3A }, - "script": ch => { return 0 }, - "script-bold": ch => { return 0 }, - "fraktur": ch => { return 0 }, - "fraktur-bold": ch => { return 0 }, - "double-struck": ch => { return 0 }, - "sans-serif": ch => { return boldsf[ch] || 0x74 }, - "sans-serif-bold": ch => { return boldsf[ch] || 0x74 }, - "sans-serif-italic": ch => { return 0 }, - "sans-serif-bold-italic": ch => { return bisf[ch] || 0xAE }, - "monospace": ch => { return 0 } - }, - numeral: { // 0-9 - "normal": ch => { return 0 }, - "bold": ch => { return 0x1D79E }, - "italic": ch => { return 0 }, - "bold-italic": ch => { return 0 }, - "script": ch => { return 0 }, - "script-bold": ch => { return 0 }, - "fraktur": ch => { return 0 }, - "fraktur-bold": ch => { return 0 }, - "double-struck": ch => { return 0x1D7A8 }, - "sans-serif": ch => { return 0x1D7B2 }, - "sans-serif-bold": ch => { return 0x1D7BC }, - "sans-serif-italic": ch => { return 0 }, - "sans-serif-bold-italic": ch => { return 0 }, - "monospace": ch => { return 0x1D7C6 } - } -}) - -export const variantChar = (ch, variant) => { - const codePoint = ch.codePointAt(0) - const block = 0x40 < codePoint && codePoint < 0x5b - ? "upperCaseLatin" - : 0x60 < codePoint && codePoint < 0x7b - ? "lowerCaseLatin" - : (0x390 < codePoint && codePoint < 0x3AA) - ? "upperCaseGreek" - : 0x3B0 < codePoint && codePoint < 0x3CA || ch === "\u03d5" - ? "lowerCaseGreek" - : 0x1D6E1 < codePoint && codePoint < 0x1D6FC || bold[ch] - ? "varGreek" - : (0x2F < codePoint && codePoint < 0x3A) - ? "numeral" - : "other" - return block === "other" - ? ch - : String.fromCodePoint(codePoint + offset[block][variant](ch)) -} - -export const smallCaps = Object.freeze({ - a: "ᴀ", - b: "ʙ", - c: "ᴄ", - d: "ᴅ", - e: "ᴇ", - f: "ꜰ", - g: "ɢ", - h: "ʜ", - i: "ɪ", - j: "ᴊ", - k: "ᴋ", - l: "ʟ", - m: "ᴍ", - n: "ɴ", - o: "ᴏ", - p: "ᴘ", - q: "ǫ", - r: "ʀ", - s: "s", - t: "ᴛ", - u: "ᴜ", - v: "ᴠ", - w: "ᴡ", - x: "x", - y: "ʏ", - z: "ᴢ" -}) diff --git a/src/stretchy.js b/src/stretchy.js deleted file mode 100644 index 87251bf9..00000000 --- a/src/stretchy.js +++ /dev/null @@ -1,113 +0,0 @@ -/** - * This file provides support for building horizontal stretchy elements. - */ - -import mathMLTree from "./mathMLTree" - -// TODO: Remove when Chromium stretches \widetilde & \widehat -const estimatedWidth = node => { - let width = 0 - if (node.body) { - for (const item of node.body) { - width += estimatedWidth(item) - } - } else if (node.type === "supsub") { - width += estimatedWidth(node.base) - if (node.sub) { width += 0.7 * estimatedWidth(node.sub) } - if (node.sup) { width += 0.7 * estimatedWidth(node.sup) } - } else if (node.type === "mathord" || node.type === "textord") { - for (const ch of node.text.split('')) { - const codePoint = ch.codePointAt(0) - if ((0x60 < codePoint && codePoint < 0x7B) || (0x03B0 < codePoint && codePoint < 0x3CA)) { - width += 0.56 // lower case latin or greek. Use advance width of letter n - } else if (0x2F < codePoint && codePoint < 0x3A) { - width += 0.50 // numerals. - } else { - width += 0.92 // advance width of letter M - } - } - } else { - width += 1.0 - } - return width -} - -const stretchyCodePoint = { - widehat: "^", - widecheck: "ˇ", - widetilde: "~", - wideparen: "⏜", // \u23dc - utilde: "~", - overleftarrow: "\u2190", - underleftarrow: "\u2190", - xleftarrow: "\u2190", - overrightarrow: "\u2192", - underrightarrow: "\u2192", - xrightarrow: "\u2192", - underbrace: "\u23df", - overbrace: "\u23de", - overgroup: "\u23e0", - overparen: "⏜", - undergroup: "\u23e1", - underparen: "\u23dd", - overleftrightarrow: "\u2194", - underleftrightarrow: "\u2194", - xleftrightarrow: "\u2194", - Overrightarrow: "\u21d2", - xRightarrow: "\u21d2", - overleftharpoon: "\u21bc", - xleftharpoonup: "\u21bc", - overrightharpoon: "\u21c0", - xrightharpoonup: "\u21c0", - xLeftarrow: "\u21d0", - xLeftrightarrow: "\u21d4", - xhookleftarrow: "\u21a9", - xhookrightarrow: "\u21aa", - xmapsto: "\u21a6", - xrightharpoondown: "\u21c1", - xleftharpoondown: "\u21bd", - xtwoheadleftarrow: "\u219e", - xtwoheadrightarrow: "\u21a0", - xlongequal: "=", - xrightleftarrows: "\u21c4", - yields: "\u2192", - yieldsLeft: "\u2190", - mesomerism: "\u2194", - longrightharpoonup: "\u21c0", - longleftharpoondown: "\u21bd", - eqrightharpoonup: "\u21c0", - eqleftharpoondown: "\u21bd", - "\\cdrightarrow": "\u2192", - "\\cdleftarrow": "\u2190", - "\\cdlongequal": "=" -} - -const mathMLnode = function(label) { - const child = new mathMLTree.TextNode(stretchyCodePoint[label.slice(1)]) - const node = new mathMLTree.MathNode("mo", [child]) - node.setAttribute("stretchy", "true") - return node -} - -const crookedWides = ["\\widetilde", "\\widehat", "\\widecheck", "\\utilde"] - -// TODO: Remove when Chromium stretches \widetilde & \widehat -const accentNode = (group) => { - const mo = mathMLnode(group.label) - if (crookedWides.includes(group.label)) { - const width = estimatedWidth(group.base) - if (1 < width && width < 1.6) { - mo.classes.push("tml-crooked-2") - } else if (1.6 <= width && width < 2.5) { - mo.classes.push("tml-crooked-3") - } else if (2.5 <= width) { - mo.classes.push("tml-crooked-4") - } - } - return mo -} - -export default { - mathMLnode, - accentNode -} diff --git a/src/symbols.js b/src/symbols.js deleted file mode 100644 index b15a6012..00000000 --- a/src/symbols.js +++ /dev/null @@ -1,1071 +0,0 @@ -/** - * This file holds a list of all no-argument functions and single-character - * symbols (like 'a' or ';'). - * - * For each of the symbols, there are two properties they can have: - * - group (required): the ParseNode group type the symbol should have (i.e. - "textord", "mathord", etc). - * - replace: the character that this symbol or function should be - * replaced with (i.e. "\phi" has a replace value of "\u03d5", the phi - * character in the main font). - * - * The outermost map in the table indicates what mode the symbols should be - * accepted in (e.g. "math" or "text"). - */ - -// Some of these have a "-token" suffix since these are also used as `ParseNode` -// types for raw text tokens, and we want to avoid conflicts with higher-level -// `ParseNode` types. These `ParseNode`s are constructed within `Parser` by -// looking up the `symbols` map. -export const ATOMS = { - bin: 1, - close: 1, - inner: 1, - open: 1, - punct: 1, - rel: 1 -}; -export const NON_ATOMS = { - "accent-token": 1, - mathord: 1, - "op-token": 1, - spacing: 1, - textord: 1 -}; - -const symbols = { - math: {}, - text: {} -}; -export default symbols; - -/** `acceptUnicodeChar = true` is only applicable if `replace` is set. */ -export function defineSymbol(mode, group, replace, name, acceptUnicodeChar) { - symbols[mode][name] = { group, replace }; - - if (acceptUnicodeChar && replace) { - symbols[mode][replace] = symbols[mode][name]; - } -} - -// Some abbreviations for commonly used strings. -// This helps minify the code, and also spotting typos using jshint. - -// modes: -const math = "math"; -const text = "text"; - -// groups: -const accent = "accent-token"; -const bin = "bin"; -const close = "close"; -const inner = "inner"; -const mathord = "mathord"; -const op = "op-token"; -const open = "open"; -const punct = "punct"; -const rel = "rel"; -const spacing = "spacing"; -const textord = "textord"; - -// Now comes the symbol table - -// Relation Symbols -defineSymbol(math, rel, "\u2261", "\\equiv", true); -defineSymbol(math, rel, "\u227a", "\\prec", true); -defineSymbol(math, rel, "\u227b", "\\succ", true); -defineSymbol(math, rel, "\u223c", "\\sim", true); -defineSymbol(math, rel, "\u27c2", "\\perp", true); -defineSymbol(math, rel, "\u2aaf", "\\preceq", true); -defineSymbol(math, rel, "\u2ab0", "\\succeq", true); -defineSymbol(math, rel, "\u2243", "\\simeq", true); -defineSymbol(math, rel, "\u224c", "\\backcong", true); -defineSymbol(math, rel, "|", "\\mid", true); -defineSymbol(math, rel, "\u226a", "\\ll", true); -defineSymbol(math, rel, "\u226b", "\\gg", true); -defineSymbol(math, rel, "\u224d", "\\asymp", true); -defineSymbol(math, rel, "\u2225", "\\parallel"); -defineSymbol(math, rel, "\u2323", "\\smile", true); -defineSymbol(math, rel, "\u2291", "\\sqsubseteq", true); -defineSymbol(math, rel, "\u2292", "\\sqsupseteq", true); -defineSymbol(math, rel, "\u2250", "\\doteq", true); -defineSymbol(math, rel, "\u2322", "\\frown", true); -defineSymbol(math, rel, "\u220b", "\\ni", true); -defineSymbol(math, rel, "\u220c", "\\notni", true); -defineSymbol(math, rel, "\u221d", "\\propto", true); -defineSymbol(math, rel, "\u22a2", "\\vdash", true); -defineSymbol(math, rel, "\u22a3", "\\dashv", true); -defineSymbol(math, rel, "\u220b", "\\owns"); -defineSymbol(math, rel, "\u2258", "\\arceq", true); -defineSymbol(math, rel, "\u2259", "\\wedgeq", true); -defineSymbol(math, rel, "\u225a", "\\veeeq", true); -defineSymbol(math, rel, "\u225b", "\\stareq", true); -defineSymbol(math, rel, "\u225d", "\\eqdef", true); -defineSymbol(math, rel, "\u225e", "\\measeq", true); -defineSymbol(math, rel, "\u225f", "\\questeq", true); -defineSymbol(math, rel, "\u2260", "\\ne", true); -defineSymbol(math, rel, "\u2260", "\\neq"); -// unicodemath -defineSymbol(math, rel, "\u2a75", "\\eqeq", true); -defineSymbol(math, rel, "\u2a76", "\\eqeqeq", true); -// mathtools.sty -defineSymbol(math, rel, "\u2237", "\\dblcolon", true); -defineSymbol(math, rel, "\u2254", "\\coloneqq", true); -defineSymbol(math, rel, "\u2255", "\\eqqcolon", true); -defineSymbol(math, rel, "\u2239", "\\eqcolon", true); -defineSymbol(math, rel, "\u2A74", "\\Coloneqq", true); - -// Punctuation -defineSymbol(math, punct, "\u002e", "\\ldotp"); -defineSymbol(math, punct, "\u00b7", "\\cdotp"); - -// Misc Symbols -defineSymbol(math, textord, "\u0023", "\\#"); -defineSymbol(text, textord, "\u0023", "\\#"); -defineSymbol(math, textord, "\u0026", "\\&"); -defineSymbol(text, textord, "\u0026", "\\&"); -defineSymbol(math, textord, "\u2135", "\\aleph", true); -defineSymbol(math, textord, "\u2200", "\\forall", true); -defineSymbol(math, textord, "\u210f", "\\hbar", true); -defineSymbol(math, textord, "\u2203", "\\exists", true); -// ∇ is actually a unary operator, not binary. But this works. -defineSymbol(math, bin, "\u2207", "\\nabla", true); -defineSymbol(math, textord, "\u266d", "\\flat", true); -defineSymbol(math, textord, "\u2113", "\\ell", true); -defineSymbol(math, textord, "\u266e", "\\natural", true); -defineSymbol(math, textord, "Å", "\\Angstrom", true); -defineSymbol(text, textord, "Å", "\\Angstrom", true); -defineSymbol(math, textord, "\u2663", "\\clubsuit", true); -defineSymbol(math, textord, "\u2667", "\\varclubsuit", true); -defineSymbol(math, textord, "\u2118", "\\wp", true); -defineSymbol(math, textord, "\u266f", "\\sharp", true); -defineSymbol(math, textord, "\u2662", "\\diamondsuit", true); -defineSymbol(math, textord, "\u2666", "\\vardiamondsuit", true); -defineSymbol(math, textord, "\u211c", "\\Re", true); -defineSymbol(math, textord, "\u2661", "\\heartsuit", true); -defineSymbol(math, textord, "\u2665", "\\varheartsuit", true); -defineSymbol(math, textord, "\u2111", "\\Im", true); -defineSymbol(math, textord, "\u2660", "\\spadesuit", true); -defineSymbol(math, textord, "\u2664", "\\varspadesuit", true); -defineSymbol(math, textord, "\u2640", "\\female", true); -defineSymbol(math, textord, "\u2642", "\\male", true); -defineSymbol(math, textord, "\u00a7", "\\S", true); -defineSymbol(text, textord, "\u00a7", "\\S"); -defineSymbol(math, textord, "\u00b6", "\\P", true); -defineSymbol(text, textord, "\u00b6", "\\P"); -defineSymbol(text, textord, "\u263a", "\\smiley", true); -defineSymbol(math, textord, "\u263a", "\\smiley", true); - -// Math and Text -defineSymbol(math, textord, "\u2020", "\\dag"); -defineSymbol(text, textord, "\u2020", "\\dag"); -defineSymbol(text, textord, "\u2020", "\\textdagger"); -defineSymbol(math, textord, "\u2021", "\\ddag"); -defineSymbol(text, textord, "\u2021", "\\ddag"); -defineSymbol(text, textord, "\u2021", "\\textdaggerdbl"); - -// Large Delimiters -defineSymbol(math, close, "\u23b1", "\\rmoustache", true); -defineSymbol(math, open, "\u23b0", "\\lmoustache", true); -defineSymbol(math, close, "\u27ef", "\\rgroup", true); -defineSymbol(math, open, "\u27ee", "\\lgroup", true); - -// Binary Operators -defineSymbol(math, bin, "\u2213", "\\mp", true); -defineSymbol(math, bin, "\u2296", "\\ominus", true); -defineSymbol(math, bin, "\u228e", "\\uplus", true); -defineSymbol(math, bin, "\u2293", "\\sqcap", true); -defineSymbol(math, bin, "\u2217", "\\ast"); -defineSymbol(math, bin, "\u2294", "\\sqcup", true); -defineSymbol(math, bin, "\u25ef", "\\bigcirc", true); -defineSymbol(math, bin, "\u2219", "\\bullet", true); -defineSymbol(math, bin, "\u2021", "\\ddagger"); -defineSymbol(math, bin, "\u2240", "\\wr", true); -defineSymbol(math, bin, "\u2a3f", "\\amalg"); -defineSymbol(math, bin, "\u0026", "\\And"); // from amsmath -defineSymbol(math, bin, "\u2AFD", "\\sslash", true); // from stmaryrd - -// Arrow Symbols -defineSymbol(math, rel, "\u27f5", "\\longleftarrow", true); -defineSymbol(math, rel, "\u21d0", "\\Leftarrow", true); -defineSymbol(math, rel, "\u27f8", "\\Longleftarrow", true); -defineSymbol(math, rel, "\u27f6", "\\longrightarrow", true); -defineSymbol(math, rel, "\u21d2", "\\Rightarrow", true); -defineSymbol(math, rel, "\u27f9", "\\Longrightarrow", true); -defineSymbol(math, rel, "\u2194", "\\leftrightarrow", true); -defineSymbol(math, rel, "\u27f7", "\\longleftrightarrow", true); -defineSymbol(math, rel, "\u21d4", "\\Leftrightarrow", true); -defineSymbol(math, rel, "\u27fa", "\\Longleftrightarrow", true); -defineSymbol(math, rel, "\u21a4", "\\mapsfrom", true); -defineSymbol(math, rel, "\u21a6", "\\mapsto", true); -defineSymbol(math, rel, "\u27fc", "\\longmapsto", true); -defineSymbol(math, rel, "\u2197", "\\nearrow", true); -defineSymbol(math, rel, "\u21a9", "\\hookleftarrow", true); -defineSymbol(math, rel, "\u21aa", "\\hookrightarrow", true); -defineSymbol(math, rel, "\u2198", "\\searrow", true); -defineSymbol(math, rel, "\u21bc", "\\leftharpoonup", true); -defineSymbol(math, rel, "\u21c0", "\\rightharpoonup", true); -defineSymbol(math, rel, "\u2199", "\\swarrow", true); -defineSymbol(math, rel, "\u21bd", "\\leftharpoondown", true); -defineSymbol(math, rel, "\u21c1", "\\rightharpoondown", true); -defineSymbol(math, rel, "\u2196", "\\nwarrow", true); -defineSymbol(math, rel, "\u21cc", "\\rightleftharpoons", true); -defineSymbol(math, mathord, "\u21af", "\\lightning", true); -defineSymbol(math, mathord, "\u220E", "\\QED", true); -defineSymbol(math, mathord, "\u2030", "\\permil", true); -defineSymbol(text, textord, "\u2030", "\\permil"); -defineSymbol(math, mathord, "\u2609", "\\astrosun", true); -defineSymbol(math, mathord, "\u263c", "\\sun", true); -defineSymbol(math, mathord, "\u263e", "\\leftmoon", true); -defineSymbol(math, mathord, "\u263d", "\\rightmoon", true); -defineSymbol(math, mathord, "\u2295", "\\Earth"); - -// AMS Negated Binary Relations -defineSymbol(math, rel, "\u226e", "\\nless", true); -// Symbol names preceeded by "@" each have a corresponding macro. -defineSymbol(math, rel, "\u2a87", "\\lneq", true); -defineSymbol(math, rel, "\u2268", "\\lneqq", true); -defineSymbol(math, rel, "\u2268\ufe00", "\\lvertneqq"); -defineSymbol(math, rel, "\u22e6", "\\lnsim", true); -defineSymbol(math, rel, "\u2a89", "\\lnapprox", true); -defineSymbol(math, rel, "\u2280", "\\nprec", true); -// unicode-math maps \u22e0 to \npreccurlyeq. We'll use the AMS synonym. -defineSymbol(math, rel, "\u22e0", "\\npreceq", true); -defineSymbol(math, rel, "\u22e8", "\\precnsim", true); -defineSymbol(math, rel, "\u2ab9", "\\precnapprox", true); -defineSymbol(math, rel, "\u2241", "\\nsim", true); -defineSymbol(math, rel, "\u2224", "\\nmid", true); -defineSymbol(math, rel, "\u2224", "\\nshortmid"); -defineSymbol(math, rel, "\u22ac", "\\nvdash", true); -defineSymbol(math, rel, "\u22ad", "\\nvDash", true); -defineSymbol(math, rel, "\u22ea", "\\ntriangleleft"); -defineSymbol(math, rel, "\u22ec", "\\ntrianglelefteq", true); -defineSymbol(math, rel, "\u2284", "\\nsubset", true); -defineSymbol(math, rel, "\u2285", "\\nsupset", true); -defineSymbol(math, rel, "\u228a", "\\subsetneq", true); -defineSymbol(math, rel, "\u228a\ufe00", "\\varsubsetneq"); -defineSymbol(math, rel, "\u2acb", "\\subsetneqq", true); -defineSymbol(math, rel, "\u2acb\ufe00", "\\varsubsetneqq"); -defineSymbol(math, rel, "\u226f", "\\ngtr", true); -defineSymbol(math, rel, "\u2a88", "\\gneq", true); -defineSymbol(math, rel, "\u2269", "\\gneqq", true); -defineSymbol(math, rel, "\u2269\ufe00", "\\gvertneqq"); -defineSymbol(math, rel, "\u22e7", "\\gnsim", true); -defineSymbol(math, rel, "\u2a8a", "\\gnapprox", true); -defineSymbol(math, rel, "\u2281", "\\nsucc", true); -// unicode-math maps \u22e1 to \nsucccurlyeq. We'll use the AMS synonym. -defineSymbol(math, rel, "\u22e1", "\\nsucceq", true); -defineSymbol(math, rel, "\u22e9", "\\succnsim", true); -defineSymbol(math, rel, "\u2aba", "\\succnapprox", true); -// unicode-math maps \u2246 to \simneqq. We'll use the AMS synonym. -defineSymbol(math, rel, "\u2246", "\\ncong", true); -defineSymbol(math, rel, "\u2226", "\\nparallel", true); -defineSymbol(math, rel, "\u2226", "\\nshortparallel"); -defineSymbol(math, rel, "\u22af", "\\nVDash", true); -defineSymbol(math, rel, "\u22eb", "\\ntriangleright"); -defineSymbol(math, rel, "\u22ed", "\\ntrianglerighteq", true); -defineSymbol(math, rel, "\u228b", "\\supsetneq", true); -defineSymbol(math, rel, "\u228b", "\\varsupsetneq"); -defineSymbol(math, rel, "\u2acc", "\\supsetneqq", true); -defineSymbol(math, rel, "\u2acc\ufe00", "\\varsupsetneqq"); -defineSymbol(math, rel, "\u22ae", "\\nVdash", true); -defineSymbol(math, rel, "\u2ab5", "\\precneqq", true); -defineSymbol(math, rel, "\u2ab6", "\\succneqq", true); -defineSymbol(math, bin, "\u22b4", "\\unlhd"); -defineSymbol(math, bin, "\u22b5", "\\unrhd"); - -// AMS Negated Arrows -defineSymbol(math, rel, "\u219a", "\\nleftarrow", true); -defineSymbol(math, rel, "\u219b", "\\nrightarrow", true); -defineSymbol(math, rel, "\u21cd", "\\nLeftarrow", true); -defineSymbol(math, rel, "\u21cf", "\\nRightarrow", true); -defineSymbol(math, rel, "\u21ae", "\\nleftrightarrow", true); -defineSymbol(math, rel, "\u21ce", "\\nLeftrightarrow", true); - -// AMS Misc -defineSymbol(math, rel, "\u25b3", "\\vartriangle"); -defineSymbol(math, textord, "\u210f", "\\hslash"); -defineSymbol(math, textord, "\u25bd", "\\triangledown"); -defineSymbol(math, textord, "\u25ca", "\\lozenge"); -defineSymbol(math, textord, "\u24c8", "\\circledS"); -defineSymbol(math, textord, "\u00ae", "\\circledR", true); -defineSymbol(text, textord, "\u00ae", "\\circledR"); -defineSymbol(text, textord, "\u00ae", "\\textregistered"); -defineSymbol(math, textord, "\u2221", "\\measuredangle", true); -defineSymbol(math, textord, "\u2204", "\\nexists"); -defineSymbol(math, textord, "\u2127", "\\mho"); -defineSymbol(math, textord, "\u2132", "\\Finv", true); -defineSymbol(math, textord, "\u2141", "\\Game", true); -defineSymbol(math, textord, "\u2035", "\\backprime"); -defineSymbol(math, textord, "\u2036", "\\backdprime"); -defineSymbol(math, textord, "\u2037", "\\backtrprime"); -defineSymbol(math, textord, "\u25b2", "\\blacktriangle"); -defineSymbol(math, textord, "\u25bc", "\\blacktriangledown"); -defineSymbol(math, textord, "\u25a0", "\\blacksquare"); -defineSymbol(math, textord, "\u29eb", "\\blacklozenge"); -defineSymbol(math, textord, "\u2605", "\\bigstar"); -defineSymbol(math, textord, "\u2222", "\\sphericalangle", true); -defineSymbol(math, textord, "\u2201", "\\complement", true); -// unicode-math maps U+F0 to \matheth. We map to AMS function \eth -defineSymbol(math, textord, "\u00f0", "\\eth", true); -defineSymbol(text, textord, "\u00f0", "\u00f0"); -defineSymbol(math, textord, "\u2571", "\\diagup"); -defineSymbol(math, textord, "\u2572", "\\diagdown"); -defineSymbol(math, textord, "\u25a1", "\\square"); -defineSymbol(math, textord, "\u25a1", "\\Box"); -defineSymbol(math, textord, "\u25ca", "\\Diamond"); -// unicode-math maps U+A5 to \mathyen. We map to AMS function \yen -defineSymbol(math, textord, "\u00a5", "\\yen", true); -defineSymbol(text, textord, "\u00a5", "\\yen", true); -defineSymbol(math, textord, "\u2713", "\\checkmark", true); -defineSymbol(text, textord, "\u2713", "\\checkmark"); -defineSymbol(math, textord, "\u2717", "\\ballotx", true); -defineSymbol(text, textord, "\u2717", "\\ballotx"); -defineSymbol(text, textord, "\u2022", "\\textbullet"); - -// AMS Hebrew -defineSymbol(math, textord, "\u2136", "\\beth", true); -defineSymbol(math, textord, "\u2138", "\\daleth", true); -defineSymbol(math, textord, "\u2137", "\\gimel", true); - -// AMS Greek -defineSymbol(math, textord, "\u03dd", "\\digamma", true); -defineSymbol(math, textord, "\u03f0", "\\varkappa"); - -// AMS Delimiters -defineSymbol(math, open, "\u231C", "\\ulcorner", true); -defineSymbol(math, close, "\u231D", "\\urcorner", true); -defineSymbol(math, open, "\u231E", "\\llcorner", true); -defineSymbol(math, close, "\u231F", "\\lrcorner", true); - -// AMS Binary Relations -defineSymbol(math, rel, "\u2266", "\\leqq", true); -defineSymbol(math, rel, "\u2a7d", "\\leqslant", true); -defineSymbol(math, rel, "\u2a95", "\\eqslantless", true); -defineSymbol(math, rel, "\u2272", "\\lesssim", true); -defineSymbol(math, rel, "\u2a85", "\\lessapprox", true); -defineSymbol(math, rel, "\u224a", "\\approxeq", true); -defineSymbol(math, bin, "\u22d6", "\\lessdot"); -defineSymbol(math, rel, "\u22d8", "\\lll", true); -defineSymbol(math, rel, "\u2276", "\\lessgtr", true); -defineSymbol(math, rel, "\u22da", "\\lesseqgtr", true); -defineSymbol(math, rel, "\u2a8b", "\\lesseqqgtr", true); -defineSymbol(math, rel, "\u2251", "\\doteqdot"); -defineSymbol(math, rel, "\u2253", "\\risingdotseq", true); -defineSymbol(math, rel, "\u2252", "\\fallingdotseq", true); -defineSymbol(math, rel, "\u223d", "\\backsim", true); -defineSymbol(math, rel, "\u22cd", "\\backsimeq", true); -defineSymbol(math, rel, "\u2ac5", "\\subseteqq", true); -defineSymbol(math, rel, "\u22d0", "\\Subset", true); -defineSymbol(math, rel, "\u228f", "\\sqsubset", true); -defineSymbol(math, rel, "\u227c", "\\preccurlyeq", true); -defineSymbol(math, rel, "\u22de", "\\curlyeqprec", true); -defineSymbol(math, rel, "\u227e", "\\precsim", true); -defineSymbol(math, rel, "\u2ab7", "\\precapprox", true); -defineSymbol(math, rel, "\u22b2", "\\vartriangleleft"); -defineSymbol(math, rel, "\u22b4", "\\trianglelefteq"); -defineSymbol(math, rel, "\u22a8", "\\vDash", true); -defineSymbol(math, rel, "\u22ab", "\\VDash", true); -defineSymbol(math, rel, "\u22aa", "\\Vvdash", true); -defineSymbol(math, rel, "\u2323", "\\smallsmile"); -defineSymbol(math, rel, "\u2322", "\\smallfrown"); -defineSymbol(math, rel, "\u224f", "\\bumpeq", true); -defineSymbol(math, rel, "\u224e", "\\Bumpeq", true); -defineSymbol(math, rel, "\u2267", "\\geqq", true); -defineSymbol(math, rel, "\u2a7e", "\\geqslant", true); -defineSymbol(math, rel, "\u2a96", "\\eqslantgtr", true); -defineSymbol(math, rel, "\u2273", "\\gtrsim", true); -defineSymbol(math, rel, "\u2a86", "\\gtrapprox", true); -defineSymbol(math, bin, "\u22d7", "\\gtrdot"); -defineSymbol(math, rel, "\u22d9", "\\ggg", true); -defineSymbol(math, rel, "\u2277", "\\gtrless", true); -defineSymbol(math, rel, "\u22db", "\\gtreqless", true); -defineSymbol(math, rel, "\u2a8c", "\\gtreqqless", true); -defineSymbol(math, rel, "\u2256", "\\eqcirc", true); -defineSymbol(math, rel, "\u2257", "\\circeq", true); -defineSymbol(math, rel, "\u225c", "\\triangleq", true); -defineSymbol(math, rel, "\u223c", "\\thicksim"); -defineSymbol(math, rel, "\u2248", "\\thickapprox"); -defineSymbol(math, rel, "\u2ac6", "\\supseteqq", true); -defineSymbol(math, rel, "\u22d1", "\\Supset", true); -defineSymbol(math, rel, "\u2290", "\\sqsupset", true); -defineSymbol(math, rel, "\u227d", "\\succcurlyeq", true); -defineSymbol(math, rel, "\u22df", "\\curlyeqsucc", true); -defineSymbol(math, rel, "\u227f", "\\succsim", true); -defineSymbol(math, rel, "\u2ab8", "\\succapprox", true); -defineSymbol(math, rel, "\u22b3", "\\vartriangleright"); -defineSymbol(math, rel, "\u22b5", "\\trianglerighteq"); -defineSymbol(math, rel, "\u22a9", "\\Vdash", true); -defineSymbol(math, rel, "\u2223", "\\shortmid"); -defineSymbol(math, rel, "\u2225", "\\shortparallel"); -defineSymbol(math, rel, "\u226c", "\\between", true); -defineSymbol(math, rel, "\u22d4", "\\pitchfork", true); -defineSymbol(math, rel, "\u221d", "\\varpropto"); -defineSymbol(math, rel, "\u25c0", "\\blacktriangleleft"); -// unicode-math says that \therefore is a mathord atom. -// We kept the amssymb atom type, which is rel. -defineSymbol(math, rel, "\u2234", "\\therefore", true); -defineSymbol(math, rel, "\u220d", "\\backepsilon"); -defineSymbol(math, rel, "\u25b6", "\\blacktriangleright"); -// unicode-math says that \because is a mathord atom. -// We kept the amssymb atom type, which is rel. -defineSymbol(math, rel, "\u2235", "\\because", true); -defineSymbol(math, rel, "\u22d8", "\\llless"); -defineSymbol(math, rel, "\u22d9", "\\gggtr"); -defineSymbol(math, bin, "\u22b2", "\\lhd"); -defineSymbol(math, bin, "\u22b3", "\\rhd"); -defineSymbol(math, rel, "\u2242", "\\eqsim", true); -defineSymbol(math, rel, "\u2251", "\\Doteq", true); -defineSymbol(math, rel, "\u297d", "\\strictif", true); -defineSymbol(math, rel, "\u297c", "\\strictfi", true); - -// AMS Binary Operators -defineSymbol(math, bin, "\u2214", "\\dotplus", true); -defineSymbol(math, bin, "\u2216", "\\smallsetminus"); -defineSymbol(math, bin, "\u22d2", "\\Cap", true); -defineSymbol(math, bin, "\u22d3", "\\Cup", true); -defineSymbol(math, bin, "\u2a5e", "\\doublebarwedge", true); -defineSymbol(math, bin, "\u229f", "\\boxminus", true); -defineSymbol(math, bin, "\u229e", "\\boxplus", true); -defineSymbol(math, bin, "\u22c7", "\\divideontimes", true); -defineSymbol(math, bin, "\u22c9", "\\ltimes", true); -defineSymbol(math, bin, "\u22ca", "\\rtimes", true); -defineSymbol(math, bin, "\u22cb", "\\leftthreetimes", true); -defineSymbol(math, bin, "\u22cc", "\\rightthreetimes", true); -defineSymbol(math, bin, "\u22cf", "\\curlywedge", true); -defineSymbol(math, bin, "\u22ce", "\\curlyvee", true); -defineSymbol(math, bin, "\u229d", "\\circleddash", true); -defineSymbol(math, bin, "\u229b", "\\circledast", true); -defineSymbol(math, bin, "\u22ba", "\\intercal", true); -defineSymbol(math, bin, "\u22d2", "\\doublecap"); -defineSymbol(math, bin, "\u22d3", "\\doublecup"); -defineSymbol(math, bin, "\u22a0", "\\boxtimes", true); -defineSymbol(math, bin, "\u22c8", "\\bowtie", true); -defineSymbol(math, bin, "\u22c8", "\\Join"); -defineSymbol(math, bin, "\u27d5", "\\leftouterjoin", true); -defineSymbol(math, bin, "\u27d6", "\\rightouterjoin", true); -defineSymbol(math, bin, "\u27d7", "\\fullouterjoin", true); - -// stix Binary Operators -defineSymbol(math, bin, "\u2238", "\\dotminus", true); -defineSymbol(math, bin, "\u27D1", "\\wedgedot", true); -defineSymbol(math, bin, "\u27C7", "\\veedot", true); -defineSymbol(math, bin, "\u2A62", "\\doublebarvee", true); -defineSymbol(math, bin, "\u2A63", "\\veedoublebar", true) -defineSymbol(math, bin, "\u2A5F", "\\wedgebar", true) -defineSymbol(math, bin, "\u2A60", "\\wedgedoublebar", true) -defineSymbol(math, bin, "\u2A54", "\\Vee", true) -defineSymbol(math, bin, "\u2A53", "\\Wedge", true) -defineSymbol(math, bin, "\u2A43", "\\barcap", true) -defineSymbol(math, bin, "\u2A42", "\\barcup", true) -defineSymbol(math, bin, "\u2A48", "\\capbarcup", true) -defineSymbol(math, bin, "\u2A40", "\\capdot", true) -defineSymbol(math, bin, "\u2A47", "\\capovercup", true) -defineSymbol(math, bin, "\u2A46", "\\cupovercap", true) -defineSymbol(math, bin, "\u2A4D", "\\closedvarcap", true) -defineSymbol(math, bin, "\u2A4C", "\\closedvarcup", true) -defineSymbol(math, bin, "\u2A2A", "\\minusdot", true) -defineSymbol(math, bin, "\u2A2B", "\\minusfdots", true) -defineSymbol(math, bin, "\u2A2C", "\\minusrdots", true) -defineSymbol(math, bin, "\u22BB", "\\Xor", true) -defineSymbol(math, bin, "\u22BC", "\\Nand", true) -defineSymbol(math, bin, "\u22BD", "\\Nor", true) -defineSymbol(math, bin, "\u22BD", "\\barvee") -defineSymbol(math, bin, "\u2AF4", "\\interleave", true) -defineSymbol(math, bin, "\u29E2", "\\shuffle", true) -defineSymbol(math, bin, "\u2AF6", "\\threedotcolon", true) -defineSymbol(math, bin, "\u2982", "\\typecolon", true) -defineSymbol(math, bin, "\u223E", "\\invlazys", true) -defineSymbol(math, bin, "\u2A4B", "\\twocaps", true) -defineSymbol(math, bin, "\u2A4A", "\\twocups", true) -defineSymbol(math, bin, "\u2A4E", "\\Sqcap", true) -defineSymbol(math, bin, "\u2A4F", "\\Sqcup", true) -defineSymbol(math, bin, "\u2A56", "\\veeonvee", true) -defineSymbol(math, bin, "\u2A55", "\\wedgeonwedge", true) -defineSymbol(math, bin, "\u29D7", "\\blackhourglass", true) -defineSymbol(math, bin, "\u29C6", "\\boxast", true) -defineSymbol(math, bin, "\u29C8", "\\boxbox", true) -defineSymbol(math, bin, "\u29C7", "\\boxcircle", true) -defineSymbol(math, bin, "\u229C", "\\circledequal", true) -defineSymbol(math, bin, "\u29B7", "\\circledparallel", true) -defineSymbol(math, bin, "\u29B6", "\\circledvert", true) -defineSymbol(math, bin, "\u29B5", "\\circlehbar", true) -defineSymbol(math, bin, "\u27E1", "\\concavediamond", true) -defineSymbol(math, bin, "\u27E2", "\\concavediamondtickleft", true) -defineSymbol(math, bin, "\u27E3", "\\concavediamondtickright", true) -defineSymbol(math, bin, "\u22C4", "\\diamond", true) -defineSymbol(math, bin, "\u29D6", "\\hourglass", true) -defineSymbol(math, bin, "\u27E0", "\\lozengeminus", true) -defineSymbol(math, bin, "\u233D", "\\obar", true) -defineSymbol(math, bin, "\u29B8", "\\obslash", true) -defineSymbol(math, bin, "\u2A38", "\\odiv", true) -defineSymbol(math, bin, "\u29C1", "\\ogreaterthan", true) -defineSymbol(math, bin, "\u29C0", "\\olessthan", true) -defineSymbol(math, bin, "\u29B9", "\\operp", true) -defineSymbol(math, bin, "\u2A37", "\\Otimes", true) -defineSymbol(math, bin, "\u2A36", "\\otimeshat", true) -defineSymbol(math, bin, "\u22C6", "\\star", true) -defineSymbol(math, bin, "\u25B3", "\\triangle", true) -defineSymbol(math, bin, "\u2A3A", "\\triangleminus", true) -defineSymbol(math, bin, "\u2A39", "\\triangleplus", true) -defineSymbol(math, bin, "\u2A3B", "\\triangletimes", true) -defineSymbol(math, bin, "\u27E4", "\\whitesquaretickleft", true) -defineSymbol(math, bin, "\u27E5", "\\whitesquaretickright", true) -defineSymbol(math, bin, "\u2A33", "\\smashtimes", true) - -// AMS Arrows -// Note: unicode-math maps \u21e2 to their own function \rightdasharrow. -// We'll map it to AMS function \dashrightarrow. It produces the same atom. -defineSymbol(math, rel, "\u21e2", "\\dashrightarrow", true); -// unicode-math maps \u21e0 to \leftdasharrow. We'll use the AMS synonym. -defineSymbol(math, rel, "\u21e0", "\\dashleftarrow", true); -defineSymbol(math, rel, "\u21c7", "\\leftleftarrows", true); -defineSymbol(math, rel, "\u21c6", "\\leftrightarrows", true); -defineSymbol(math, rel, "\u21da", "\\Lleftarrow", true); -defineSymbol(math, rel, "\u219e", "\\twoheadleftarrow", true); -defineSymbol(math, rel, "\u21a2", "\\leftarrowtail", true); -defineSymbol(math, rel, "\u21ab", "\\looparrowleft", true); -defineSymbol(math, rel, "\u21cb", "\\leftrightharpoons", true); -defineSymbol(math, rel, "\u21b6", "\\curvearrowleft", true); -// unicode-math maps \u21ba to \acwopencirclearrow. We'll use the AMS synonym. -defineSymbol(math, rel, "\u21ba", "\\circlearrowleft", true); -defineSymbol(math, rel, "\u21b0", "\\Lsh", true); -defineSymbol(math, rel, "\u21c8", "\\upuparrows", true); -defineSymbol(math, rel, "\u21bf", "\\upharpoonleft", true); -defineSymbol(math, rel, "\u21c3", "\\downharpoonleft", true); -defineSymbol(math, rel, "\u22b6", "\\origof", true); -defineSymbol(math, rel, "\u22b7", "\\imageof", true); -defineSymbol(math, rel, "\u22b8", "\\multimap", true); -defineSymbol(math, rel, "\u21ad", "\\leftrightsquigarrow", true); -defineSymbol(math, rel, "\u21c9", "\\rightrightarrows", true); -defineSymbol(math, rel, "\u21c4", "\\rightleftarrows", true); -defineSymbol(math, rel, "\u21a0", "\\twoheadrightarrow", true); -defineSymbol(math, rel, "\u21a3", "\\rightarrowtail", true); -defineSymbol(math, rel, "\u21ac", "\\looparrowright", true); -defineSymbol(math, rel, "\u21b7", "\\curvearrowright", true); -// unicode-math maps \u21bb to \cwopencirclearrow. We'll use the AMS synonym. -defineSymbol(math, rel, "\u21bb", "\\circlearrowright", true); -defineSymbol(math, rel, "\u21b1", "\\Rsh", true); -defineSymbol(math, rel, "\u21ca", "\\downdownarrows", true); -defineSymbol(math, rel, "\u21be", "\\upharpoonright", true); -defineSymbol(math, rel, "\u21c2", "\\downharpoonright", true); -defineSymbol(math, rel, "\u21dd", "\\rightsquigarrow", true); -defineSymbol(math, rel, "\u21dd", "\\leadsto"); -defineSymbol(math, rel, "\u21db", "\\Rrightarrow", true); -defineSymbol(math, rel, "\u21be", "\\restriction"); - -defineSymbol(math, textord, "\u2018", "`"); -defineSymbol(math, textord, "$", "\\$"); -defineSymbol(text, textord, "$", "\\$"); -defineSymbol(text, textord, "$", "\\textdollar"); -defineSymbol(math, textord, "¢", "\\cent"); -defineSymbol(text, textord, "¢", "\\cent"); -defineSymbol(math, textord, "%", "\\%"); -defineSymbol(text, textord, "%", "\\%"); -defineSymbol(math, textord, "_", "\\_"); -defineSymbol(text, textord, "_", "\\_"); -defineSymbol(text, textord, "_", "\\textunderscore"); -defineSymbol(text, textord, "\u2423", "\\textvisiblespace", true); -defineSymbol(math, textord, "\u2220", "\\angle", true); -defineSymbol(math, textord, "\u221e", "\\infty", true); -defineSymbol(math, textord, "\u2032", "\\prime"); -defineSymbol(math, textord, "\u2033", "\\dprime"); -defineSymbol(math, textord, "\u2034", "\\trprime"); -defineSymbol(math, textord, "\u2057", "\\qprime"); -defineSymbol(math, textord, "\u25b3", "\\triangle"); -defineSymbol(text, textord, "\u0391", "\\Alpha", true); -defineSymbol(text, textord, "\u0392", "\\Beta", true); -defineSymbol(text, textord, "\u0393", "\\Gamma", true); -defineSymbol(text, textord, "\u0394", "\\Delta", true); -defineSymbol(text, textord, "\u0395", "\\Epsilon", true); -defineSymbol(text, textord, "\u0396", "\\Zeta", true); -defineSymbol(text, textord, "\u0397", "\\Eta", true); -defineSymbol(text, textord, "\u0398", "\\Theta", true); -defineSymbol(text, textord, "\u0399", "\\Iota", true); -defineSymbol(text, textord, "\u039a", "\\Kappa", true); -defineSymbol(text, textord, "\u039b", "\\Lambda", true); -defineSymbol(text, textord, "\u039c", "\\Mu", true); -defineSymbol(text, textord, "\u039d", "\\Nu", true); -defineSymbol(text, textord, "\u039e", "\\Xi", true); -defineSymbol(text, textord, "\u039f", "\\Omicron", true); -defineSymbol(text, textord, "\u03a0", "\\Pi", true); -defineSymbol(text, textord, "\u03a1", "\\Rho", true); -defineSymbol(text, textord, "\u03a3", "\\Sigma", true); -defineSymbol(text, textord, "\u03a4", "\\Tau", true); -defineSymbol(text, textord, "\u03a5", "\\Upsilon", true); -defineSymbol(text, textord, "\u03a6", "\\Phi", true); -defineSymbol(text, textord, "\u03a7", "\\Chi", true); -defineSymbol(text, textord, "\u03a8", "\\Psi", true); -defineSymbol(text, textord, "\u03a9", "\\Omega", true); -defineSymbol(math, mathord, "\u0391", "\\Alpha", true); -defineSymbol(math, mathord, "\u0392", "\\Beta", true); -defineSymbol(math, mathord, "\u0393", "\\Gamma", true); -defineSymbol(math, mathord, "\u0394", "\\Delta", true); -defineSymbol(math, mathord, "\u0395", "\\Epsilon", true); -defineSymbol(math, mathord, "\u0396", "\\Zeta", true); -defineSymbol(math, mathord, "\u0397", "\\Eta", true); -defineSymbol(math, mathord, "\u0398", "\\Theta", true); -defineSymbol(math, mathord, "\u0399", "\\Iota", true); -defineSymbol(math, mathord, "\u039a", "\\Kappa", true); -defineSymbol(math, mathord, "\u039b", "\\Lambda", true); -defineSymbol(math, mathord, "\u039c", "\\Mu", true); -defineSymbol(math, mathord, "\u039d", "\\Nu", true); -defineSymbol(math, mathord, "\u039e", "\\Xi", true); -defineSymbol(math, mathord, "\u039f", "\\Omicron", true); -defineSymbol(math, mathord, "\u03a0", "\\Pi", true); -defineSymbol(math, mathord, "\u03a1", "\\Rho", true); -defineSymbol(math, mathord, "\u03a3", "\\Sigma", true); -defineSymbol(math, mathord, "\u03a4", "\\Tau", true); -defineSymbol(math, mathord, "\u03a5", "\\Upsilon", true); -defineSymbol(math, mathord, "\u03a6", "\\Phi", true); -defineSymbol(math, mathord, "\u03a7", "\\Chi", true); -defineSymbol(math, mathord, "\u03a8", "\\Psi", true); -defineSymbol(math, mathord, "\u03a9", "\\Omega", true); -defineSymbol(math, open, "\u00ac", "\\neg", true); -defineSymbol(math, open, "\u00ac", "\\lnot"); -defineSymbol(math, textord, "\u22a4", "\\top"); -defineSymbol(math, textord, "\u22a5", "\\bot"); -defineSymbol(math, textord, "\u2205", "\\emptyset"); -defineSymbol(math, textord, "\u2300", "\\varnothing"); -defineSymbol(math, mathord, "\u03b1", "\\alpha", true); -defineSymbol(math, mathord, "\u03b2", "\\beta", true); -defineSymbol(math, mathord, "\u03b3", "\\gamma", true); -defineSymbol(math, mathord, "\u03b4", "\\delta", true); -defineSymbol(math, mathord, "\u03f5", "\\epsilon", true); -defineSymbol(math, mathord, "\u03b6", "\\zeta", true); -defineSymbol(math, mathord, "\u03b7", "\\eta", true); -defineSymbol(math, mathord, "\u03b8", "\\theta", true); -defineSymbol(math, mathord, "\u03b9", "\\iota", true); -defineSymbol(math, mathord, "\u03ba", "\\kappa", true); -defineSymbol(math, mathord, "\u03bb", "\\lambda", true); -defineSymbol(math, mathord, "\u03bc", "\\mu", true); -defineSymbol(math, mathord, "\u03bd", "\\nu", true); -defineSymbol(math, mathord, "\u03be", "\\xi", true); -defineSymbol(math, mathord, "\u03bf", "\\omicron", true); -defineSymbol(math, mathord, "\u03c0", "\\pi", true); -defineSymbol(math, mathord, "\u03c1", "\\rho", true); -defineSymbol(math, mathord, "\u03c3", "\\sigma", true); -defineSymbol(math, mathord, "\u03c4", "\\tau", true); -defineSymbol(math, mathord, "\u03c5", "\\upsilon", true); -defineSymbol(math, mathord, "\u03d5", "\\phi", true); -defineSymbol(math, mathord, "\u03c7", "\\chi", true); -defineSymbol(math, mathord, "\u03c8", "\\psi", true); -defineSymbol(math, mathord, "\u03c9", "\\omega", true); -defineSymbol(math, mathord, "\u03b5", "\\varepsilon", true); -defineSymbol(math, mathord, "\u03d1", "\\vartheta", true); -defineSymbol(math, mathord, "\u03d6", "\\varpi", true); -defineSymbol(math, mathord, "\u03f1", "\\varrho", true); -defineSymbol(math, mathord, "\u03c2", "\\varsigma", true); -defineSymbol(math, mathord, "\u03c6", "\\varphi", true); -defineSymbol(math, mathord, "\u03d8", "\\Coppa", true); -defineSymbol(math, mathord, "\u03d9", "\\coppa", true); -defineSymbol(math, mathord, "\u03d9", "\\varcoppa", true); -defineSymbol(math, mathord, "\u03de", "\\Koppa", true); -defineSymbol(math, mathord, "\u03df", "\\koppa", true); -defineSymbol(math, mathord, "\u03e0", "\\Sampi", true); -defineSymbol(math, mathord, "\u03e1", "\\sampi", true); -defineSymbol(math, mathord, "\u03da", "\\Stigma", true); -defineSymbol(math, mathord, "\u03db", "\\stigma", true); -defineSymbol(math, mathord, "\u2aeb", "\\Bot"); -defineSymbol(math, bin, "\u2217", "\u2217", true); -defineSymbol(math, bin, "+", "+"); -defineSymbol(math, bin, "*", "*"); -defineSymbol(math, bin, "\u2044", "/", true); -defineSymbol(math, bin, "\u2044", "\u2044"); -defineSymbol(math, bin, "\u2212", "-", true); -defineSymbol(math, bin, "\u22c5", "\\cdot", true); -defineSymbol(math, bin, "\u2218", "\\circ", true); -defineSymbol(math, bin, "\u00f7", "\\div", true); -defineSymbol(math, bin, "\u00b1", "\\pm", true); -defineSymbol(math, bin, "\u00d7", "\\times", true); -defineSymbol(math, bin, "\u2229", "\\cap", true); -defineSymbol(math, bin, "\u222a", "\\cup", true); -defineSymbol(math, bin, "\u2216", "\\setminus", true); -defineSymbol(math, bin, "\u2227", "\\land"); -defineSymbol(math, bin, "\u2228", "\\lor"); -defineSymbol(math, bin, "\u2227", "\\wedge", true); -defineSymbol(math, bin, "\u2228", "\\vee", true); -defineSymbol(math, open, "\u27e6", "\\llbracket", true); // stmaryrd/semantic packages -defineSymbol(math, close, "\u27e7", "\\rrbracket", true); -defineSymbol(math, open, "\u27e8", "\\langle", true); -defineSymbol(math, open, "\u27ea", "\\lAngle", true); -defineSymbol(math, open, "\u2989", "\\llangle", true); -defineSymbol(math, open, "|", "\\lvert"); -defineSymbol(math, open, "\u2016", "\\lVert"); -defineSymbol(math, textord, "!", "\\oc"); // cmll package -defineSymbol(math, textord, "?", "\\wn"); -defineSymbol(math, textord, "\u2193", "\\shpos"); -defineSymbol(math, textord, "\u2195", "\\shift"); -defineSymbol(math, textord, "\u2191", "\\shneg"); -defineSymbol(math, close, "?", "?"); -defineSymbol(math, close, "!", "!"); -defineSymbol(math, close, "‼", "‼"); -defineSymbol(math, close, "\u27e9", "\\rangle", true); -defineSymbol(math, close, "\u27eb", "\\rAngle", true); -defineSymbol(math, close, "\u298a", "\\rrangle", true); -defineSymbol(math, close, "|", "\\rvert"); -defineSymbol(math, close, "\u2016", "\\rVert"); -defineSymbol(math, open, "\u2983", "\\lBrace", true); // stmaryrd/semantic packages -defineSymbol(math, close, "\u2984", "\\rBrace", true); -defineSymbol(math, rel, "=", "\\equal", true); -defineSymbol(math, rel, ":", ":"); -defineSymbol(math, rel, "\u2248", "\\approx", true); -defineSymbol(math, rel, "\u2245", "\\cong", true); -defineSymbol(math, rel, "\u2265", "\\ge"); -defineSymbol(math, rel, "\u2265", "\\geq", true); -defineSymbol(math, rel, "\u2190", "\\gets"); -defineSymbol(math, rel, ">", "\\gt", true); -defineSymbol(math, rel, "\u2208", "\\in", true); -defineSymbol(math, rel, "\u2209", "\\notin", true); -defineSymbol(math, rel, "\ue020", "\\@not"); -defineSymbol(math, rel, "\u2282", "\\subset", true); -defineSymbol(math, rel, "\u2283", "\\supset", true); -defineSymbol(math, rel, "\u2286", "\\subseteq", true); -defineSymbol(math, rel, "\u2287", "\\supseteq", true); -defineSymbol(math, rel, "\u2288", "\\nsubseteq", true); -defineSymbol(math, rel, "\u2288", "\\nsubseteqq"); -defineSymbol(math, rel, "\u2289", "\\nsupseteq", true); -defineSymbol(math, rel, "\u2289", "\\nsupseteqq"); -defineSymbol(math, rel, "\u22a8", "\\models"); -defineSymbol(math, rel, "\u2190", "\\leftarrow", true); -defineSymbol(math, rel, "\u2264", "\\le"); -defineSymbol(math, rel, "\u2264", "\\leq", true); -defineSymbol(math, rel, "<", "\\lt", true); -defineSymbol(math, rel, "\u2192", "\\rightarrow", true); -defineSymbol(math, rel, "\u2192", "\\to"); -defineSymbol(math, rel, "\u2271", "\\ngeq", true); -defineSymbol(math, rel, "\u2271", "\\ngeqq"); -defineSymbol(math, rel, "\u2271", "\\ngeqslant"); -defineSymbol(math, rel, "\u2270", "\\nleq", true); -defineSymbol(math, rel, "\u2270", "\\nleqq"); -defineSymbol(math, rel, "\u2270", "\\nleqslant"); -defineSymbol(math, rel, "\u2aeb", "\\Perp", true); //cmll package -defineSymbol(math, spacing, "\u00a0", "\\ "); -defineSymbol(math, spacing, "\u00a0", "\\space"); -// Ref: LaTeX Source 2e: \DeclareRobustCommand{\nobreakspace}{% -defineSymbol(math, spacing, "\u00a0", "\\nobreakspace"); -defineSymbol(text, spacing, "\u00a0", "\\ "); -defineSymbol(text, spacing, "\u00a0", " "); -defineSymbol(text, spacing, "\u00a0", "\\space"); -defineSymbol(text, spacing, "\u00a0", "\\nobreakspace"); -defineSymbol(math, spacing, null, "\\nobreak"); -defineSymbol(math, spacing, null, "\\allowbreak"); -defineSymbol(math, punct, ",", ","); -defineSymbol(text, punct, ":", ":"); -defineSymbol(math, punct, ";", ";"); -defineSymbol(math, bin, "\u22bc", "\\barwedge"); -defineSymbol(math, bin, "\u22bb", "\\veebar"); -defineSymbol(math, bin, "\u2299", "\\odot", true); -// Firefox turns ⊕ into an emoji. So append \uFE0E. Define Unicode character in macros, not here. -defineSymbol(math, bin, "\u2295\uFE0E", "\\oplus"); -defineSymbol(math, bin, "\u2297", "\\otimes", true); -defineSymbol(math, textord, "\u2202", "\\partial", true); -defineSymbol(math, bin, "\u2298", "\\oslash", true); -defineSymbol(math, bin, "\u229a", "\\circledcirc", true); -defineSymbol(math, bin, "\u22a1", "\\boxdot", true); -defineSymbol(math, bin, "\u25b3", "\\bigtriangleup"); -defineSymbol(math, bin, "\u25bd", "\\bigtriangledown"); -defineSymbol(math, bin, "\u2020", "\\dagger"); -defineSymbol(math, bin, "\u22c4", "\\diamond"); -defineSymbol(math, bin, "\u25c3", "\\triangleleft"); -defineSymbol(math, bin, "\u25b9", "\\triangleright"); -defineSymbol(math, open, "{", "\\{"); -defineSymbol(text, textord, "{", "\\{"); -defineSymbol(text, textord, "{", "\\textbraceleft"); -defineSymbol(math, close, "}", "\\}"); -defineSymbol(text, textord, "}", "\\}"); -defineSymbol(text, textord, "}", "\\textbraceright"); -defineSymbol(math, open, "{", "\\lbrace"); -defineSymbol(math, close, "}", "\\rbrace"); -defineSymbol(math, open, "[", "\\lbrack", true); -defineSymbol(text, textord, "[", "\\lbrack", true); -defineSymbol(math, close, "]", "\\rbrack", true); -defineSymbol(text, textord, "]", "\\rbrack", true); -defineSymbol(math, open, "(", "\\lparen", true); -defineSymbol(math, close, ")", "\\rparen", true); -defineSymbol(math, open, "⦇", "\\llparenthesis", true); -defineSymbol(math, close, "⦈", "\\rrparenthesis", true); -defineSymbol(text, textord, "<", "\\textless", true); // in T1 fontenc -defineSymbol(text, textord, ">", "\\textgreater", true); // in T1 fontenc -defineSymbol(math, open, "\u230a", "\\lfloor", true); -defineSymbol(math, close, "\u230b", "\\rfloor", true); -defineSymbol(math, open, "\u2308", "\\lceil", true); -defineSymbol(math, close, "\u2309", "\\rceil", true); -defineSymbol(math, textord, "\\", "\\backslash"); -defineSymbol(math, textord, "|", "|"); -defineSymbol(math, textord, "|", "\\vert"); -defineSymbol(text, textord, "|", "\\textbar", true); // in T1 fontenc -defineSymbol(math, textord, "\u2016", "\\|"); -defineSymbol(math, textord, "\u2016", "\\Vert"); -defineSymbol(text, textord, "\u2016", "\\textbardbl"); -defineSymbol(text, textord, "~", "\\textasciitilde"); -defineSymbol(text, textord, "\\", "\\textbackslash"); -defineSymbol(text, textord, "^", "\\textasciicircum"); -defineSymbol(math, rel, "\u2191", "\\uparrow", true); -defineSymbol(math, rel, "\u21d1", "\\Uparrow", true); -defineSymbol(math, rel, "\u2193", "\\downarrow", true); -defineSymbol(math, rel, "\u21d3", "\\Downarrow", true); -defineSymbol(math, rel, "\u2195", "\\updownarrow", true); -defineSymbol(math, rel, "\u21d5", "\\Updownarrow", true); -defineSymbol(math, op, "\u2210", "\\coprod"); -defineSymbol(math, op, "\u22c1", "\\bigvee"); -defineSymbol(math, op, "\u22c0", "\\bigwedge"); -defineSymbol(math, op, "\u2a04", "\\biguplus"); -defineSymbol(math, op, "\u22c2", "\\bigcap"); -defineSymbol(math, op, "\u22c3", "\\bigcup"); -defineSymbol(math, op, "\u222b", "\\int"); -defineSymbol(math, op, "\u222b", "\\intop"); -defineSymbol(math, op, "\u222c", "\\iint"); -defineSymbol(math, op, "\u222d", "\\iiint"); -defineSymbol(math, op, "\u220f", "\\prod"); -defineSymbol(math, op, "\u2211", "\\sum"); -defineSymbol(math, op, "\u2a02", "\\bigotimes"); -defineSymbol(math, op, "\u2a01", "\\bigoplus"); -defineSymbol(math, op, "\u2a00", "\\bigodot"); -defineSymbol(math, op, "\u2a09", "\\bigtimes"); -defineSymbol(math, op, "\u222e", "\\oint"); -defineSymbol(math, op, "\u222f", "\\oiint"); -defineSymbol(math, op, "\u2230", "\\oiiint"); -defineSymbol(math, op, "\u2231", "\\intclockwise"); -defineSymbol(math, op, "\u2232", "\\varointclockwise"); -defineSymbol(math, op, "\u2a0c", "\\iiiint"); -defineSymbol(math, op, "\u2a0d", "\\intbar"); -defineSymbol(math, op, "\u2a0e", "\\intBar"); -defineSymbol(math, op, "\u2a0f", "\\fint"); -defineSymbol(math, op, "\u2a12", "\\rppolint"); -defineSymbol(math, op, "\u2a13", "\\scpolint"); -defineSymbol(math, op, "\u2a15", "\\pointint"); -defineSymbol(math, op, "\u2a16", "\\sqint"); -defineSymbol(math, op, "\u2a17", "\\intlarhk"); -defineSymbol(math, op, "\u2a18", "\\intx"); -defineSymbol(math, op, "\u2a19", "\\intcap"); -defineSymbol(math, op, "\u2a1a", "\\intcup"); -defineSymbol(math, op, "\u2a05", "\\bigsqcap"); -defineSymbol(math, op, "\u2a06", "\\bigsqcup"); -defineSymbol(math, op, "\u222b", "\\smallint"); -defineSymbol(text, inner, "\u2026", "\\textellipsis"); -defineSymbol(math, inner, "\u2026", "\\mathellipsis"); -defineSymbol(text, inner, "\u2026", "\\ldots", true); -defineSymbol(math, inner, "\u2026", "\\ldots", true); -defineSymbol(math, inner, "\u22f0", "\\iddots", true); -defineSymbol(math, inner, "\u22ef", "\\@cdots", true); -defineSymbol(math, inner, "\u22f1", "\\ddots", true); -defineSymbol(math, textord, "\u22ee", "\\varvdots"); // \vdots is a macro -defineSymbol(math, accent, "\u02ca", "\\acute"); -defineSymbol(math, accent, "\u0060", "\\grave"); -defineSymbol(math, accent, "\u00a8", "\\ddot"); -defineSymbol(math, accent, "\u2026", "\\dddot"); -defineSymbol(math, accent, "\u2026\u002e", "\\ddddot"); -defineSymbol(math, accent, "\u007e", "\\tilde"); -defineSymbol(math, accent, "\u203e", "\\bar"); -defineSymbol(math, accent, "\u02d8", "\\breve"); -defineSymbol(math, accent, "\u02c7", "\\check"); -defineSymbol(math, accent, "\u005e", "\\hat"); -defineSymbol(math, accent, "\u2192", "\\vec"); -defineSymbol(math, accent, "\u02d9", "\\dot"); -defineSymbol(math, accent, "\u02da", "\\mathring"); -defineSymbol(math, mathord, "\u0131", "\\imath", true); -defineSymbol(math, mathord, "\u0237", "\\jmath", true); -defineSymbol(math, textord, "\u0131", "\u0131"); -defineSymbol(math, textord, "\u0237", "\u0237"); -defineSymbol(text, textord, "\u0131", "\\i", true); -defineSymbol(text, textord, "\u0237", "\\j", true); -defineSymbol(text, textord, "\u00df", "\\ss", true); -defineSymbol(text, textord, "\u00e6", "\\ae", true); -defineSymbol(text, textord, "\u0153", "\\oe", true); -defineSymbol(text, textord, "\u00f8", "\\o", true); -defineSymbol(math, mathord, "\u00f8", "\\o", true); -defineSymbol(text, textord, "\u00c6", "\\AE", true); -defineSymbol(text, textord, "\u0152", "\\OE", true); -defineSymbol(text, textord, "\u00d8", "\\O", true); -defineSymbol(math, mathord, "\u00d8", "\\O", true); -defineSymbol(text, accent, "\u02ca", "\\'"); // acute -defineSymbol(text, accent, "\u02cb", "\\`"); // grave -defineSymbol(text, accent, "\u02c6", "\\^"); // circumflex -defineSymbol(text, accent, "\u02dc", "\\~"); // tilde -defineSymbol(text, accent, "\u02c9", "\\="); // macron -defineSymbol(text, accent, "\u02d8", "\\u"); // breve -defineSymbol(text, accent, "\u02d9", "\\."); // dot above -defineSymbol(text, accent, "\u00b8", "\\c"); // cedilla -defineSymbol(text, accent, "\u02da", "\\r"); // ring above -defineSymbol(text, accent, "\u02c7", "\\v"); // caron -defineSymbol(text, accent, "\u00a8", '\\"'); // diaresis -defineSymbol(text, accent, "\u02dd", "\\H"); // double acute -defineSymbol(math, accent, "\u02ca", "\\'"); // acute -defineSymbol(math, accent, "\u02cb", "\\`"); // grave -defineSymbol(math, accent, "\u02c6", "\\^"); // circumflex -defineSymbol(math, accent, "\u02dc", "\\~"); // tilde -defineSymbol(math, accent, "\u02c9", "\\="); // macron -defineSymbol(math, accent, "\u02d8", "\\u"); // breve -defineSymbol(math, accent, "\u02d9", "\\."); // dot above -defineSymbol(math, accent, "\u00b8", "\\c"); // cedilla -defineSymbol(math, accent, "\u02da", "\\r"); // ring above -defineSymbol(math, accent, "\u02c7", "\\v"); // caron -defineSymbol(math, accent, "\u00a8", '\\"'); // diaresis -defineSymbol(math, accent, "\u02dd", "\\H"); // double acute - -// These ligatures are detected and created in Parser.js's `formLigatures`. -export const ligatures = { - "--": true, - "---": true, - "``": true, - "''": true -}; - -defineSymbol(text, textord, "\u2013", "--", true); -defineSymbol(text, textord, "\u2013", "\\textendash"); -defineSymbol(text, textord, "\u2014", "---", true); -defineSymbol(text, textord, "\u2014", "\\textemdash"); -defineSymbol(text, textord, "\u2018", "`", true); -defineSymbol(text, textord, "\u2018", "\\textquoteleft"); -defineSymbol(text, textord, "\u2019", "'", true); -defineSymbol(text, textord, "\u2019", "\\textquoteright"); -defineSymbol(text, textord, "\u201c", "``", true); -defineSymbol(text, textord, "\u201c", "\\textquotedblleft"); -defineSymbol(text, textord, "\u201d", "''", true); -defineSymbol(text, textord, "\u201d", "\\textquotedblright"); -// \degree from gensymb package -defineSymbol(math, textord, "\u00b0", "\\degree", true); -defineSymbol(text, textord, "\u00b0", "\\degree"); -// \textdegree from inputenc package -defineSymbol(text, textord, "\u00b0", "\\textdegree", true); -// TODO: In LaTeX, \pounds can generate a different character in text and math -// mode, but among our fonts, only Main-Regular defines this character "163". -defineSymbol(math, textord, "\u00a3", "\\pounds"); -defineSymbol(math, textord, "\u00a3", "\\mathsterling", true); -defineSymbol(text, textord, "\u00a3", "\\pounds"); -defineSymbol(text, textord, "\u00a3", "\\textsterling", true); -defineSymbol(math, textord, "\u2720", "\\maltese"); -defineSymbol(text, textord, "\u2720", "\\maltese"); -defineSymbol(math, textord, "\u20ac", "\\euro", true); -defineSymbol(text, textord, "\u20ac", "\\euro", true); -defineSymbol(text, textord, "\u20ac", "\\texteuro"); -defineSymbol(math, textord, "\u00a9", "\\copyright", true); -defineSymbol(text, textord, "\u00a9", "\\textcopyright"); -defineSymbol(math, textord, "\u2300", "\\diameter", true); -defineSymbol(text, textord, "\u2300", "\\diameter"); - -// Italic Greek -defineSymbol(math, textord, "𝛤", "\\varGamma"); -defineSymbol(math, textord, "𝛥", "\\varDelta"); -defineSymbol(math, textord, "𝛩", "\\varTheta"); -defineSymbol(math, textord, "𝛬", "\\varLambda"); -defineSymbol(math, textord, "𝛯", "\\varXi"); -defineSymbol(math, textord, "𝛱", "\\varPi"); -defineSymbol(math, textord, "𝛴", "\\varSigma"); -defineSymbol(math, textord, "𝛶", "\\varUpsilon"); -defineSymbol(math, textord, "𝛷", "\\varPhi"); -defineSymbol(math, textord, "𝛹", "\\varPsi"); -defineSymbol(math, textord, "𝛺", "\\varOmega"); -defineSymbol(text, textord, "𝛤", "\\varGamma"); -defineSymbol(text, textord, "𝛥", "\\varDelta"); -defineSymbol(text, textord, "𝛩", "\\varTheta"); -defineSymbol(text, textord, "𝛬", "\\varLambda"); -defineSymbol(text, textord, "𝛯", "\\varXi"); -defineSymbol(text, textord, "𝛱", "\\varPi"); -defineSymbol(text, textord, "𝛴", "\\varSigma"); -defineSymbol(text, textord, "𝛶", "\\varUpsilon"); -defineSymbol(text, textord, "𝛷", "\\varPhi"); -defineSymbol(text, textord, "𝛹", "\\varPsi"); -defineSymbol(text, textord, "𝛺", "\\varOmega"); - - -// There are lots of symbols which are the same, so we add them in afterwards. -// All of these are textords in math mode -const mathTextSymbols = '0123456789/@."'; -for (let i = 0; i < mathTextSymbols.length; i++) { - const ch = mathTextSymbols.charAt(i); - defineSymbol(math, textord, ch, ch); -} - -// All of these are textords in text mode -const textSymbols = '0123456789!@*()-=+";:?/.,'; -for (let i = 0; i < textSymbols.length; i++) { - const ch = textSymbols.charAt(i); - defineSymbol(text, textord, ch, ch); -} - -// All of these are textords in text mode, and mathords in math mode -const letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; -for (let i = 0; i < letters.length; i++) { - const ch = letters.charAt(i); - defineSymbol(math, mathord, ch, ch); - defineSymbol(text, textord, ch, ch); -} - -// Some more letters in Unicode Basic Multilingual Plane. -const narrow = "ÇÐÞçþℂℍℕℙℚℝℤℎℏℊℋℌℐℑℒℓ℘ℛℜℬℰℱℳℭℨ"; -for (let i = 0; i < narrow.length; i++) { - const ch = narrow.charAt(i); - defineSymbol(math, mathord, ch, ch); - defineSymbol(text, textord, ch, ch); -} - -// The next loop loads wide (surrogate pair) characters. -// We support some letters in the Unicode range U+1D400 to U+1D7FF, -// Mathematical Alphanumeric Symbols. -let wideChar = ""; -for (let i = 0; i < letters.length; i++) { - // The hex numbers in the next line are a surrogate pair. - // 0xD835 is the high surrogate for all letters in the range we support. - // 0xDC00 is the low surrogate for bold A. - wideChar = String.fromCharCode(0xd835, 0xdc00 + i); // A-Z a-z bold - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xdc34 + i); // A-Z a-z italic - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xdc68 + i); // A-Z a-z bold italic - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xdd04 + i); // A-Z a-z Fractur - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xdda0 + i); // A-Z a-z sans-serif - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xddd4 + i); // A-Z a-z sans bold - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xde08 + i); // A-Z a-z sans italic - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xde70 + i); // A-Z a-z monospace - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xdd38 + i); // A-Z a-z double struck - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - const ch = letters.charAt(i); - wideChar = String.fromCharCode(0xd835, 0xdc9c + i); // A-Z a-z calligraphic - defineSymbol(math, mathord, ch, wideChar); - defineSymbol(text, textord, ch, wideChar); -} - -// Next, some wide character numerals -for (let i = 0; i < 10; i++) { - wideChar = String.fromCharCode(0xd835, 0xdfce + i); // 0-9 bold - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xdfe2 + i); // 0-9 sans serif - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xdfec + i); // 0-9 bold sans - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xdff6 + i); // 0-9 monospace - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); -} diff --git a/src/tree.js b/src/tree.js deleted file mode 100644 index ca1c82c6..00000000 --- a/src/tree.js +++ /dev/null @@ -1,50 +0,0 @@ -/** - * This node represents a document fragment, which contains elements, but when - * placed into the DOM doesn't have any representation itself. It only contains - * children and doesn't have any DOM node properties. - */ -export class DocumentFragment { - constructor(children) { - this.children = children; - this.classes = []; - this.style = {}; - } - - hasClass(className) { - return this.classes.includes(className); - } - - /** Convert the fragment into a node. */ - toNode() { - const frag = document.createDocumentFragment(); - - for (let i = 0; i < this.children.length; i++) { - frag.appendChild(this.children[i].toNode()); - } - - return frag; - } - - /** Convert the fragment into HTML markup. */ - toMarkup() { - let markup = ""; - - // Simply concatenate the markup for the children together. - for (let i = 0; i < this.children.length; i++) { - markup += this.children[i].toMarkup(); - } - - return markup; - } - - /** - * Converts the math node into a string, similar to innerText. Applies to - * MathDomNode's only. - */ - toText() { - // To avoid this, we would subclass documentFragment separately for - // MathML, but polyfills for subclassing is expensive per PR 1469. - const toText = (child) => child.toText(); - return this.children.map(toText).join(""); - } -} diff --git a/src/unicodeAccents.js b/src/unicodeAccents.js deleted file mode 100644 index 36844133..00000000 --- a/src/unicodeAccents.js +++ /dev/null @@ -1,16 +0,0 @@ -// Mapping of Unicode accent characters to their LaTeX equivalent in text and -// math mode (when they exist). -export default { - "\u0301": { text: "\\'", math: "\\acute" }, - "\u0300": { text: "\\`", math: "\\grave" }, - "\u0308": { text: '\\"', math: "\\ddot" }, - "\u0303": { text: "\\~", math: "\\tilde" }, - "\u0304": { text: "\\=", math: "\\bar" }, - "\u0306": { text: "\\u", math: "\\breve" }, - "\u030c": { text: "\\v", math: "\\check" }, - "\u0302": { text: "\\^", math: "\\hat" }, - "\u0307": { text: "\\.", math: "\\dot" }, - "\u030a": { text: "\\r", math: "\\mathring" }, - "\u030b": { text: "\\H" }, - '\u0327': { text: '\\c' } -}; diff --git a/src/unicodeSupOrSub.js b/src/unicodeSupOrSub.js deleted file mode 100644 index 7588582a..00000000 --- a/src/unicodeSupOrSub.js +++ /dev/null @@ -1,108 +0,0 @@ -// Helpers for Parser.js handling of Unicode (sub|super)script characters. - -export const unicodeSubRegEx = /^[₊₋₌₍₎₀₁₂₃₄₅₆₇₈₉ₐₑₕᵢⱼₖₗₘₙₒₚᵣₛₜᵤᵥₓᵦᵧᵨᵩᵪ]/ - -export const uSubsAndSups = Object.freeze({ - '₊': '+', - '₋': '-', - '₌': '=', - '₍': '(', - '₎': ')', - '₀': '0', - '₁': '1', - '₂': '2', - '₃': '3', - '₄': '4', - '₅': '5', - '₆': '6', - '₇': '7', - '₈': '8', - '₉': '9', - '\u2090': 'a', - '\u2091': 'e', - '\u2095': 'h', - '\u1D62': 'i', - '\u2C7C': 'j', - '\u2096': 'k', - '\u2097': 'l', - '\u2098': 'm', - '\u2099': 'n', - '\u2092': 'o', - '\u209A': 'p', - '\u1D63': 'r', - '\u209B': 's', - '\u209C': 't', - '\u1D64': 'u', - '\u1D65': 'v', - '\u2093': 'x', - '\u1D66': 'β', - '\u1D67': 'γ', - '\u1D68': 'ρ', - '\u1D69': '\u03d5', - '\u1D6A': 'χ', - '⁺': '+', - '⁻': '-', - '⁼': '=', - '⁽': '(', - '⁾': ')', - '⁰': '0', - '¹': '1', - '²': '2', - '³': '3', - '⁴': '4', - '⁵': '5', - '⁶': '6', - '⁷': '7', - '⁸': '8', - '⁹': '9', - '\u1D2C': 'A', - '\u1D2E': 'B', - '\u1D30': 'D', - '\u1D31': 'E', - '\u1D33': 'G', - '\u1D34': 'H', - '\u1D35': 'I', - '\u1D36': 'J', - '\u1D37': 'K', - '\u1D38': 'L', - '\u1D39': 'M', - '\u1D3A': 'N', - '\u1D3C': 'O', - '\u1D3E': 'P', - '\u1D3F': 'R', - '\u1D40': 'T', - '\u1D41': 'U', - '\u2C7D': 'V', - '\u1D42': 'W', - '\u1D43': 'a', - '\u1D47': 'b', - '\u1D9C': 'c', - '\u1D48': 'd', - '\u1D49': 'e', - '\u1DA0': 'f', - '\u1D4D': 'g', - '\u02B0': 'h', - '\u2071': 'i', - '\u02B2': 'j', - '\u1D4F': 'k', - '\u02E1': 'l', - '\u1D50': 'm', - '\u207F': 'n', - '\u1D52': 'o', - '\u1D56': 'p', - '\u02B3': 'r', - '\u02E2': 's', - '\u1D57': 't', - '\u1D58': 'u', - '\u1D5B': 'v', - '\u02B7': 'w', - '\u02E3': 'x', - '\u02B8': 'y', - '\u1DBB': 'z', - '\u1D5D': 'β', - '\u1D5E': 'γ', - '\u1D5F': 'δ', - '\u1D60': '\u03d5', - '\u1D61': 'χ', - '\u1DBF': 'θ' -}) diff --git a/src/unicodeSymbolBuilder.js b/src/unicodeSymbolBuilder.js deleted file mode 100644 index 3be3f5a0..00000000 --- a/src/unicodeSymbolBuilder.js +++ /dev/null @@ -1,31 +0,0 @@ -// This is an internal module, not part of the Temml distribution, -// whose purpose is to generate `unicodeSymbols` for Parser.js -// In this way, only this module, and not the distribution/browser, -// needs String's normalize function. -import * as accents from "./unicodeAccents"; - -const result = {}; -const letters = - "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + - "αβγδεϵζηθϑικλμνξοπϖρϱςστυφϕχψωΓΔΘΛΞΠΣΥΦΨΩ"; -for (const letter of letters) { - for (const accent of Object.getOwnPropertyNames(accents)) { - const combined = letter + accent; - const normalized = combined.normalize("NFC"); - if (normalized.length === 1) { - result[normalized] = combined; - } - for (const accent2 of Object.getOwnPropertyNames(accents)) { - if (accent === accent2) { - continue; - } - const combined2 = combined + accent2; - const normalized2 = combined2.normalize("NFC"); - if (normalized2.length === 1) { - result[normalized2] = combined2; - } - } - } -} - -export default result; diff --git a/src/unicodeSymbols.js b/src/unicodeSymbols.js deleted file mode 100644 index 56dbcc5d..00000000 --- a/src/unicodeSymbols.js +++ /dev/null @@ -1,320 +0,0 @@ -export default { - "á": "á", - "à": "à", - "ä": "ä", - "ǟ": "ǟ", - "ã": "ã", - "ā": "ā", - "ă": "ă", - "ắ": "ắ", - "ằ": "ằ", - "ẵ": "ẵ", - "ǎ": "ǎ", - "â": "â", - "ấ": "ấ", - "ầ": "ầ", - "ẫ": "ẫ", - "ȧ": "ȧ", - "ǡ": "ǡ", - "å": "å", - "ǻ": "ǻ", - "ḃ": "ḃ", - "ć": "ć", - "č": "č", - "ĉ": "ĉ", - "ċ": "ċ", - "ď": "ď", - "ḋ": "ḋ", - "é": "é", - "è": "è", - "ë": "ë", - "ẽ": "ẽ", - "ē": "ē", - "ḗ": "ḗ", - "ḕ": "ḕ", - "ĕ": "ĕ", - "ě": "ě", - "ê": "ê", - "ế": "ế", - "ề": "ề", - "ễ": "ễ", - "ė": "ė", - "ḟ": "ḟ", - "ǵ": "ǵ", - "ḡ": "ḡ", - "ğ": "ğ", - "ǧ": "ǧ", - "ĝ": "ĝ", - "ġ": "ġ", - "ḧ": "ḧ", - "ȟ": "ȟ", - "ĥ": "ĥ", - "ḣ": "ḣ", - "í": "í", - "ì": "ì", - "ï": "ï", - "ḯ": "ḯ", - "ĩ": "ĩ", - "ī": "ī", - "ĭ": "ĭ", - "ǐ": "ǐ", - "î": "î", - "ǰ": "ǰ", - "ĵ": "ĵ", - "ḱ": "ḱ", - "ǩ": "ǩ", - "ĺ": "ĺ", - "ľ": "ľ", - "ḿ": "ḿ", - "ṁ": "ṁ", - "ń": "ń", - "ǹ": "ǹ", - "ñ": "ñ", - "ň": "ň", - "ṅ": "ṅ", - "ó": "ó", - "ò": "ò", - "ö": "ö", - "ȫ": "ȫ", - "õ": "õ", - "ṍ": "ṍ", - "ṏ": "ṏ", - "ȭ": "ȭ", - "ō": "ō", - "ṓ": "ṓ", - "ṑ": "ṑ", - "ŏ": "ŏ", - "ǒ": "ǒ", - "ô": "ô", - "ố": "ố", - "ồ": "ồ", - "ỗ": "ỗ", - "ȯ": "ȯ", - "ȱ": "ȱ", - "ő": "ő", - "ṕ": "ṕ", - "ṗ": "ṗ", - "ŕ": "ŕ", - "ř": "ř", - "ṙ": "ṙ", - "ś": "ś", - "ṥ": "ṥ", - "š": "š", - "ṧ": "ṧ", - "ŝ": "ŝ", - "ṡ": "ṡ", - "ẗ": "ẗ", - "ť": "ť", - "ṫ": "ṫ", - "ú": "ú", - "ù": "ù", - "ü": "ü", - "ǘ": "ǘ", - "ǜ": "ǜ", - "ǖ": "ǖ", - "ǚ": "ǚ", - "ũ": "ũ", - "ṹ": "ṹ", - "ū": "ū", - "ṻ": "ṻ", - "ŭ": "ŭ", - "ǔ": "ǔ", - "û": "û", - "ů": "ů", - "ű": "ű", - "ṽ": "ṽ", - "ẃ": "ẃ", - "ẁ": "ẁ", - "ẅ": "ẅ", - "ŵ": "ŵ", - "ẇ": "ẇ", - "ẘ": "ẘ", - "ẍ": "ẍ", - "ẋ": "ẋ", - "ý": "ý", - "ỳ": "ỳ", - "ÿ": "ÿ", - "ỹ": "ỹ", - "ȳ": "ȳ", - "ŷ": "ŷ", - "ẏ": "ẏ", - "ẙ": "ẙ", - "ź": "ź", - "ž": "ž", - "ẑ": "ẑ", - "ż": "ż", - "Á": "Á", - "À": "À", - "Ä": "Ä", - "Ǟ": "Ǟ", - "Ã": "Ã", - "Ā": "Ā", - "Ă": "Ă", - "Ắ": "Ắ", - "Ằ": "Ằ", - "Ẵ": "Ẵ", - "Ǎ": "Ǎ", - "Â": "Â", - "Ấ": "Ấ", - "Ầ": "Ầ", - "Ẫ": "Ẫ", - "Ȧ": "Ȧ", - "Ǡ": "Ǡ", - "Å": "Å", - "Ǻ": "Ǻ", - "Ḃ": "Ḃ", - "Ć": "Ć", - "Č": "Č", - "Ĉ": "Ĉ", - "Ċ": "Ċ", - "Ď": "Ď", - "Ḋ": "Ḋ", - "É": "É", - "È": "È", - "Ë": "Ë", - "Ẽ": "Ẽ", - "Ē": "Ē", - "Ḗ": "Ḗ", - "Ḕ": "Ḕ", - "Ĕ": "Ĕ", - "Ě": "Ě", - "Ê": "Ê", - "Ế": "Ế", - "Ề": "Ề", - "Ễ": "Ễ", - "Ė": "Ė", - "Ḟ": "Ḟ", - "Ǵ": "Ǵ", - "Ḡ": "Ḡ", - "Ğ": "Ğ", - "Ǧ": "Ǧ", - "Ĝ": "Ĝ", - "Ġ": "Ġ", - "Ḧ": "Ḧ", - "Ȟ": "Ȟ", - "Ĥ": "Ĥ", - "Ḣ": "Ḣ", - "Í": "Í", - "Ì": "Ì", - "Ï": "Ï", - "Ḯ": "Ḯ", - "Ĩ": "Ĩ", - "Ī": "Ī", - "Ĭ": "Ĭ", - "Ǐ": "Ǐ", - "Î": "Î", - "İ": "İ", - "Ĵ": "Ĵ", - "Ḱ": "Ḱ", - "Ǩ": "Ǩ", - "Ĺ": "Ĺ", - "Ľ": "Ľ", - "Ḿ": "Ḿ", - "Ṁ": "Ṁ", - "Ń": "Ń", - "Ǹ": "Ǹ", - "Ñ": "Ñ", - "Ň": "Ň", - "Ṅ": "Ṅ", - "Ó": "Ó", - "Ò": "Ò", - "Ö": "Ö", - "Ȫ": "Ȫ", - "Õ": "Õ", - "Ṍ": "Ṍ", - "Ṏ": "Ṏ", - "Ȭ": "Ȭ", - "Ō": "Ō", - "Ṓ": "Ṓ", - "Ṑ": "Ṑ", - "Ŏ": "Ŏ", - "Ǒ": "Ǒ", - "Ô": "Ô", - "Ố": "Ố", - "Ồ": "Ồ", - "Ỗ": "Ỗ", - "Ȯ": "Ȯ", - "Ȱ": "Ȱ", - "Ő": "Ő", - "Ṕ": "Ṕ", - "Ṗ": "Ṗ", - "Ŕ": "Ŕ", - "Ř": "Ř", - "Ṙ": "Ṙ", - "Ś": "Ś", - "Ṥ": "Ṥ", - "Š": "Š", - "Ṧ": "Ṧ", - "Ŝ": "Ŝ", - "Ṡ": "Ṡ", - "Ť": "Ť", - "Ṫ": "Ṫ", - "Ú": "Ú", - "Ù": "Ù", - "Ü": "Ü", - "Ǘ": "Ǘ", - "Ǜ": "Ǜ", - "Ǖ": "Ǖ", - "Ǚ": "Ǚ", - "Ũ": "Ũ", - "Ṹ": "Ṹ", - "Ū": "Ū", - "Ṻ": "Ṻ", - "Ŭ": "Ŭ", - "Ǔ": "Ǔ", - "Û": "Û", - "Ů": "Ů", - "Ű": "Ű", - "Ṽ": "Ṽ", - "Ẃ": "Ẃ", - "Ẁ": "Ẁ", - "Ẅ": "Ẅ", - "Ŵ": "Ŵ", - "Ẇ": "Ẇ", - "Ẍ": "Ẍ", - "Ẋ": "Ẋ", - "Ý": "Ý", - "Ỳ": "Ỳ", - "Ÿ": "Ÿ", - "Ỹ": "Ỹ", - "Ȳ": "Ȳ", - "Ŷ": "Ŷ", - "Ẏ": "Ẏ", - "Ź": "Ź", - "Ž": "Ž", - "Ẑ": "Ẑ", - "Ż": "Ż", - "ά": "ά", - "ὰ": "ὰ", - "ᾱ": "ᾱ", - "ᾰ": "ᾰ", - "έ": "έ", - "ὲ": "ὲ", - "ή": "ή", - "ὴ": "ὴ", - "ί": "ί", - "ὶ": "ὶ", - "ϊ": "ϊ", - "ΐ": "ΐ", - "ῒ": "ῒ", - "ῑ": "ῑ", - "ῐ": "ῐ", - "ό": "ό", - "ὸ": "ὸ", - "ύ": "ύ", - "ὺ": "ὺ", - "ϋ": "ϋ", - "ΰ": "ΰ", - "ῢ": "ῢ", - "ῡ": "ῡ", - "ῠ": "ῠ", - "ώ": "ώ", - "ὼ": "ὼ", - "Ύ": "Ύ", - "Ὺ": "Ὺ", - "Ϋ": "Ϋ", - "Ῡ": "Ῡ", - "Ῠ": "Ῠ", - "Ώ": "Ώ", - "Ὼ": "Ὼ" -}; diff --git a/src/units.js b/src/units.js deleted file mode 100644 index 86ca71d0..00000000 --- a/src/units.js +++ /dev/null @@ -1,109 +0,0 @@ -/** - * This file does conversion between units. In particular, it provides - * calculateSize to convert other units into CSS units. - */ - -import ParseError from "./ParseError" -import utils from "./utils" - -const ptPerUnit = { - // Convert to CSS (Postscipt) points, not TeX points - // https://en.wikibooks.org/wiki/LaTeX/Lengths and - // https://tex.stackexchange.com/a/8263 - pt: 800 / 803, // convert TeX point to CSS (Postscript) point - pc: (12 * 800) / 803, // pica - dd: ((1238 / 1157) * 800) / 803, // didot - cc: ((14856 / 1157) * 800) / 803, // cicero (12 didot) - nd: ((685 / 642) * 800) / 803, // new didot - nc: ((1370 / 107) * 800) / 803, // new cicero (12 new didot) - sp: ((1 / 65536) * 800) / 803, // scaled point (TeX's internal smallest unit) - mm: (25.4 / 72), - cm: (2.54 / 72), - in: (1 / 72), - px: (96 / 72) -} - -/** - * Determine whether the specified unit (either a string defining the unit - * or a "size" parse node containing a unit field) is valid. - */ -const validUnits = [ - "em", - "ex", - "mu", - "pt", - "mm", - "cm", - "in", - "px", - "bp", - "pc", - "dd", - "cc", - "nd", - "nc", - "sp" -] - -export const validUnit = function(unit) { - if (typeof unit !== "string") { - unit = unit.unit - } - return validUnits.indexOf(unit) > -1 -} - -export const emScale = styleLevel => { - const scriptLevel = Math.max(styleLevel - 1, 0) - return [1, 0.7, 0.5][scriptLevel] -}; - -/* - * Convert a "size" parse node (with numeric "number" and string "unit" fields, - * as parsed by functions.js argType "size") into a CSS value. - */ -export const calculateSize = function(sizeValue, style) { - let number = sizeValue.number - if (style.maxSize[0] < 0 && number > 0) { - return { number: 0, unit: "em" } - } - const unit = sizeValue.unit - switch (unit) { - case "mm": - case "cm": - case "in": - case "px": { - const numInCssPts = number * ptPerUnit[unit]; - if (numInCssPts > style.maxSize[1]) { - return { number: style.maxSize[1], unit: "pt" } - } - return { number, unit }; // absolute CSS units. - } - case "em": - case "ex": { - // In TeX, em and ex do not change size in \scriptstyle. - if (unit === "ex") { number *= 0.431 } - number = Math.min(number / emScale(style.level), style.maxSize[0]) - return { number: utils.round(number), unit: "em" }; - } - case "bp": { - if (number > style.maxSize[1]) { number = style.maxSize[1] } - return { number, unit: "pt" }; // TeX bp is a CSS pt. (1/72 inch). - } - case "pt": - case "pc": - case "dd": - case "cc": - case "nd": - case "nc": - case "sp": { - number = Math.min(number * ptPerUnit[unit], style.maxSize[1]) - return { number: utils.round(number), unit: "pt" } - } - case "mu": { - number = Math.min(number / 18, style.maxSize[0]) - return { number: utils.round(number), unit: "em" } - } - default: - throw new ParseError("Invalid unit: '" + unit + "'") - } -} diff --git a/src/utils.js b/src/utils.js deleted file mode 100644 index e763c09f..00000000 --- a/src/utils.js +++ /dev/null @@ -1,127 +0,0 @@ -// -/** - * This file contains a list of utility functions which are useful in other - * files. - */ - -/** - * Provide a default value if a setting is undefined - */ -const deflt = function(setting, defaultIfUndefined) { - return setting === undefined ? defaultIfUndefined : setting; -}; - -// hyphenate and escape adapted from Facebook's React under Apache 2 license - -const uppercase = /([A-Z])/g; -const hyphenate = function(str) { - return str.replace(uppercase, "-$1").toLowerCase(); -}; - -const ESCAPE_LOOKUP = { - "&": "&", - ">": ">", - "<": "<", - '"': """, - "'": "'" -}; - -const ESCAPE_REGEX = /[&><"']/g; - -/** - * Escapes text to prevent scripting attacks. - */ -function escape(text) { - return String(text).replace(ESCAPE_REGEX, (match) => ESCAPE_LOOKUP[match]); -} - -/** - * Sometimes we want to pull out the innermost element of a group. In most - * cases, this will just be the group itself, but when ordgroups and colors have - * a single element, we want to pull that out. - */ -const getBaseElem = function(group) { - if (group.type === "ordgroup") { - if (group.body.length === 1) { - return getBaseElem(group.body[0]); - } else { - return group; - } - } else if (group.type === "color") { - if (group.body.length === 1) { - return getBaseElem(group.body[0]); - } else { - return group; - } - } else if (group.type === "font") { - return getBaseElem(group.body); - } else { - return group; - } -}; - -/** - * TeXbook algorithms often reference "character boxes", which are simply groups - * with a single character in them. To decide if something is a character box, - * we find its innermost group, and see if it is a single character. - */ -const isCharacterBox = function(group) { - const baseElem = getBaseElem(group); - - // These are all the types of groups which hold single characters - return baseElem.type === "mathord" || baseElem.type === "textord" || baseElem.type === "atom" -}; - -export const assert = function(value) { - if (!value) { - throw new Error("Expected non-null, but got " + String(value)); - } - return value; -}; - -/** - * Return the protocol of a URL, or "_relative" if the URL does not specify a - * protocol (and thus is relative), or `null` if URL has invalid protocol - * (so should be outright rejected). - */ -export const protocolFromUrl = function(url) { - // Check for possible leading protocol. - // https://url.spec.whatwg.org/#url-parsing strips leading whitespace - // (\x00) or C0 control (\x00-\x1F) characters. - // eslint-disable-next-line no-control-regex - const protocol = /^[\x00-\x20]*([^\\/#?]*?)(:|�*58|�*3a|&colon)/i.exec(url); - if (!protocol) { - return "_relative"; - } - // Reject weird colons - if (protocol[2] !== ":") { - return null; - } - // Reject invalid characters in scheme according to - // https://datatracker.ietf.org/doc/html/rfc3986#section-3.1 - if (!/^[a-zA-Z][a-zA-Z0-9+\-.]*$/.test(protocol[1])) { - return null; - } - // Lowercase the protocol - return protocol[1].toLowerCase(); -}; - -/** - * Round `n` to 4 decimal places, or to the nearest 1/10,000th em. The TeXbook - * gives an acceptable rounding error of 100sp (which would be the nearest - * 1/6551.6em with our ptPerEm = 10): - * http://www.ctex.org/documents/shredder/src/texbook.pdf#page=69 - */ -const round = function(n) { - return +n.toFixed(4); -}; - -export default { - deflt, - escape, - hyphenate, - getBaseElem, - isCharacterBox, - protocolFromUrl, - round -}; diff --git a/src/variant.js b/src/variant.js deleted file mode 100644 index 90225803..00000000 --- a/src/variant.js +++ /dev/null @@ -1,100 +0,0 @@ -import symbols from "./symbols"; - -/** - * Maps TeX font commands to "mathvariant" attribute in buildMathML.js - */ -const fontMap = { - // styles - mathbf: "bold", - mathrm: "normal", - textit: "italic", - mathit: "italic", - mathnormal: "italic", - - // families - mathbb: "double-struck", - mathcal: "script", - mathfrak: "fraktur", - mathscr: "script", - mathsf: "sans-serif", - mathtt: "monospace" -} - -/** - * Returns the math variant as a string or null if none is required. - */ -export const getVariant = function(group, style) { - // Handle font specifiers as best we can. - // Chromium does not support the MathML mathvariant attribute. - // So we'll use Unicode replacement characters instead. - // But first, determine the math variant. - - // Deal with the \textit, \textbf, etc., functions. - if (style.fontFamily === "texttt") { - return "monospace" - } else if (style.fontFamily === "textsc") { - return "normal"; // handled via character substitution in symbolsOrd.js. - } else if (style.fontFamily === "textsf") { - if (style.fontShape === "textit" && style.fontWeight === "textbf") { - return "sans-serif-bold-italic" - } else if (style.fontShape === "textit") { - return "sans-serif-italic" - } else if (style.fontWeight === "textbf") { - return "sans-serif-bold" - } else { - return "sans-serif" - } - } else if (style.fontShape === "textit" && style.fontWeight === "textbf") { - return "bold-italic" - } else if (style.fontShape === "textit") { - return "italic" - } else if (style.fontWeight === "textbf") { - return "bold" - } - - // Deal with the \mathit, mathbf, etc, functions. - const font = style.font - if (!font || font === "mathnormal") { - return null - } - - const mode = group.mode; - switch (font) { - case "mathit": - return "italic" - case "mathrm": { - const codePoint = group.text.codePointAt(0) - // LaTeX \mathrm returns italic for Greek characters. - return (0x03ab < codePoint && codePoint < 0x03cf) ? "italic" : "normal" - } - case "greekItalic": - return "italic" - case "up@greek": - return "normal" - case "boldsymbol": - case "mathboldsymbol": - return "bold-italic" - case "mathbf": - return "bold" - case "mathbb": - return "double-struck" - case "mathfrak": - return "fraktur" - case "mathscr": - case "mathcal": - return "script" - case "mathsf": - return "sans-serif" - case "mathtt": - return "monospace" - default: - break - } - - let text = group.text; - if (symbols[mode][text] && symbols[mode][text].replace) { - text = symbols[mode][text].replace - } - - return Object.prototype.hasOwnProperty.call(fontMap, font) ? fontMap[font] : null -}; diff --git a/temml.d.ts b/temml.d.ts deleted file mode 100644 index 9660db12..00000000 --- a/temml.d.ts +++ /dev/null @@ -1,60 +0,0 @@ -export interface Options { - displayMode?: boolean; - annotate?: boolean; - leqno?: boolean; - throwOnError?: boolean; - errorColor?: string; - macros?: Record; - wrap?: "tex" | "=" | "none"; - xml?: boolean; - colorIsTextColor?: boolean; - strict?: boolean; - trust?: boolean | ((context: any) => boolean); - maxSize?: [number, number]; - maxExpand?: number; -} - -export function render( - expression: string, - baseNode: HTMLElement, - options?: Options, -): void; - -export function renderToString(expression: string, options?: Options): string; - -export function generateParseTree(expression: string, options?: Options): any; - -export function definePreamble(expression: string, options?: Options): any; - -export function renderToMathMLTree(expression: string, options?: Options): any; - -declare function postProcess(block: any): void; -declare function defineMacro(name: string, body: any): void; -declare function defineSymbol( - mode: string, - group: string, - replace: string, - name: string, - acceptUnicodeChar: boolean, -): void; -declare class ParseError { - constructor( - message: string, // The error message - token: any, // An object providing position information - ); -} - -declare const Temml: { - version: string; - render: typeof render; - renderToString: typeof renderToString; - postProcess: typeof postProcess; - ParseError: typeof ParseError; - definePreamble: typeof definePreamble; - __parse: typeof generateParseTree; - __renderToMathMLTree: typeof renderToMathMLTree; - __defineSymbol: typeof defineSymbol; - __defineMacro: typeof defineMacro; -}; - -export default Temml; diff --git a/temml.js b/temml.js deleted file mode 100644 index 9e2c4b60..00000000 --- a/temml.js +++ /dev/null @@ -1,187 +0,0 @@ -/* eslint no-console:0 */ -/** - * This is the main entry point for Temml. Here, we expose functions for - * rendering expressions either to DOM nodes or to markup strings. - * - * We also expose the ParseError class to check if errors thrown from Temml are - * errors in the expression, or errors in javascript handling. - */ - -import ParseError from "./src/ParseError"; -import Settings from "./src/Settings"; - -import Parser from "./src/Parser"; -import parseTree from "./src/parseTree"; -import buildMathML from "./src/buildMathML"; -import { StyleLevel } from "./src/constants"; -import Style from "./src/Style"; -import { Span, TextNode } from "./src/domTree"; -import { defineSymbol } from "./src/symbols"; -import defineMacro from "./src/defineMacro"; -import { postProcess, version } from "./src/postProcess"; - -/** - * @type {import('./temml').render} - * Parse and build an expression, and place that expression in the DOM node - * given. - */ -let render = function(expression, baseNode, options = {}) { - baseNode.textContent = ""; - const alreadyInMathElement = baseNode.tagName.toLowerCase() === "math" - if (alreadyInMathElement) { options.wrap = "none" } - const math = renderToMathMLTree(expression, options) - if (alreadyInMathElement) { - // The element already exists. Populate it. - baseNode.textContent = "" - math.children.forEach(e => { baseNode.appendChild(e.toNode()) }) - } else if (math.children.length > 1) { - baseNode.textContent = "" - math.children.forEach(e => { baseNode.appendChild(e.toNode()) }) - } else { - baseNode.appendChild(math.toNode()) - } -}; - -// Temml's styles don't work properly in quirks mode. Print out an error, and -// disable rendering. -if (typeof document !== "undefined") { - if (document.compatMode !== "CSS1Compat") { - typeof console !== "undefined" && - console.warn( - "Warning: Temml doesn't work in quirks mode. Make sure your " + - "website has a suitable doctype." - ); - - render = function() { - throw new ParseError("Temml doesn't work in quirks mode."); - }; - } -} - -/** - * @type {import('./temml').renderToString} - * Parse and build an expression, and return the markup for that. - */ -const renderToString = function(expression, options) { - const markup = renderToMathMLTree(expression, options).toMarkup(); - return markup; -}; - -/** - * @type {import('./temml').generateParseTree} - * Parse an expression and return the parse tree. - */ -const generateParseTree = function(expression, options) { - const settings = new Settings(options); - return parseTree(expression, settings); -}; - -/** - * @type {import('./temml').definePreamble} - * Take an expression which contains a preamble. - * Parse it and return the macros. - */ -const definePreamble = function(expression, options) { - const settings = new Settings(options); - settings.macros = {}; - if (!(typeof expression === "string" || expression instanceof String)) { - throw new TypeError("Temml can only parse string typed expression") - } - const parser = new Parser(expression, settings, true) - // Blank out any \df@tag to avoid spurious "Duplicate \tag" errors - delete parser.gullet.macros.current["\\df@tag"] - const macros = parser.parse() - return macros -}; - -/** - * If the given error is a Temml ParseError, - * renders the invalid LaTeX as a span with hover title giving the Temml - * error message. Otherwise, simply throws the error. - */ -const renderError = function(error, expression, options) { - if (options.throwOnError || !(error instanceof ParseError)) { - throw error; - } - const node = new Span(["temml-error"], [new TextNode(expression + "\n" + error.toString())]); - node.style.color = options.errorColor - node.style.whiteSpace = "pre-line" - return node; -}; - -/** - * @type {import('./temml').renderToMathMLTree} - * Generates and returns the Temml build tree. This is used for advanced - * use cases (like rendering to custom output). - */ -const renderToMathMLTree = function(expression, options) { - const settings = new Settings(options); - try { - const tree = parseTree(expression, settings); - const style = new Style({ - level: settings.displayMode ? StyleLevel.DISPLAY : StyleLevel.TEXT, - maxSize: settings.maxSize - }); - return buildMathML(tree, expression, style, settings); - } catch (error) { - return renderError(error, expression, settings); - } -}; - -/** @type {import('./temml').default} */ -export default { - /** - * Current Temml version - */ - version: version, - /** - * Renders the given LaTeX into MathML, and adds - * it as a child to the specified DOM node. - */ - render, - /** - * Renders the given LaTeX into MathML string, - * for sending to the client. - */ - renderToString, - /** - * Post-process an entire HTML block. - * Writes AMS auto-numbers and implements \ref{}. - * Typcally called once, after a loop has rendered many individual spans. - */ - postProcess, - /** - * Temml error, usually during parsing. - */ - ParseError, - /** - * Creates a set of macros with document-wide scope. - */ - definePreamble, - /** - * Parses the given LaTeX into Temml's internal parse tree structure, - * without rendering to HTML or MathML. - * - * NOTE: This method is not currently recommended for public use. - * The internal tree representation is unstable and is very likely - * to change. Use at your own risk. - */ - __parse: generateParseTree, - /** - * Renders the given LaTeX into a MathML internal DOM tree - * representation, without flattening that representation to a string. - * - * NOTE: This method is not currently recommended for public use. - * The internal tree representation is unstable and is very likely - * to change. Use at your own risk. - */ - __renderToMathMLTree: renderToMathMLTree, - /** - * adds a new symbol to builtin symbols table - */ - __defineSymbol: defineSymbol, - /** - * adds a new macro to builtin macro list - */ - __defineMacro: defineMacro -} diff --git a/test/Investigate.html b/test/Investigate.html deleted file mode 100644 index 124d5456..00000000 --- a/test/Investigate.html +++ /dev/null @@ -1,195 +0,0 @@ - - - - - - Investigate - - - - - - -

    - -

    - -

    - - - M - M - MM - M - M - - -

    - -

    - - - - - - ⊕︎ - - - - - - - - - - - - - - -

    - -

    - - - θ - ^ - - -

    -

    - - - A - - B - - - - - - - - i - - - - - - - C - - - - D - - -

    - - - - -

    AaBbcC=D

    - - -

    unodostres

    - -

    -

    -
    - - - f - c - - - -
    -
    -

    - -

    -

    - - - x - - - -
    -

    - - -

    - - - - - M - - - c - - - - - - f - - - c - 2 - - - - - - - - M - g - - 2 - - - - - M - 2 - - - - - - - f - c - - - - - -

    - -

    - -

    - - - - - diff --git a/test/LaTeXML-tests.md b/test/LaTeXML-tests.md deleted file mode 100644 index c6dea4f5..00000000 --- a/test/LaTeXML-tests.md +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - Temml LaTeXML Tests - - - - - - - - -# LaTeXML Test - -This LaTeXML test reproduces math examples from https://latexml.mathweb.org/editor\ -The equations in the first table came originally from http://www.mathjax.org/demos/tex-samples/, which no longer exists. - -### Equations - -+-----+------------------------------------------------+------------------------------------------------+ -| | Source | Temml | -+=====+================================================+================================================+ -| The Lorenz Equations | -+-----+------------------------------------------------+------------------------------------------------+ -| 1 | \\begin{aligned} \ | $$\begin{aligned} | -| | \\dot{x} & = \\sigma(y-x) \\\\ \ | \dot{x} & = \sigma(y-x) \\ | -| | \\dot{y} & = \\rho x - y - xz \\\\ \ | \dot{y} & = \rho x - y - xz \\ | -| | \\dot{z} & = -\\beta z + xy \ | \dot{z} & = -\beta z + xy | -| | \\end{aligned} | \end{aligned}$$ | -+-----+------------------------------------------------+------------------------------------------------+ -| The Cauchy-Schwarz Inequality | -+-----+------------------------------------------------+------------------------------------------------+ -| 2 | \\left( \\sum\_{k=1}^n a_k b_k \\right)^2 \ | $$\left( \sum_{k=1}^n a_k b_k \right)^2 | -| | \\leq \\left( \\sum\_{k=1}^n a_k^2 \\right) \ | \leq \left( \sum_{k=1}^n a_k^2 \right) | -| | \left( \sum\_{k=1}^n b_k^2 \right) \ | \left( \sum_{k=1}^n b_k^2 \right)$$ | -+-----+------------------------------------------------+------------------------------------------------+ -| A Cross Product Formula | -+-----+------------------------------------------------+------------------------------------------------+ -| 3 | \\mathbf{V}\_1 \\times \\mathbf{V}\_2 = \ | $$\mathbf{V}_1 \times \mathbf{V}_2 = | -| | \\begin{vmatrix} \ | \begin{vmatrix} | -| | \\mathbf{i} & \\mathbf{j} & \\mathbf{k} \\\\ \ | \mathbf{i} & \mathbf{j} & \mathbf{k} \\ | -| | \\frac{\\partial X}{\\partial u} & \ | \frac{\partial X}{\partial u} & | -| | \\frac{\\partial Y}{\\partial u} & 0 \\\\ \ | \frac{\partial Y}{\partial u} & 0 \\ | -| | \\frac{\\partial X}{\\partial v} & \ | \frac{\partial X}{\partial v} & | -| | \\frac{\\partial Y}{\\partial v} & 0 \ | \frac{\partial Y}{\partial v} & 0 | -| | \\end{vmatrix} | \end{vmatrix}$$ | -+-----+------------------------------------------------+------------------------------------------------+ -| The probability of getting $k$ heads when flipping $n$ coins is: | -+-----+------------------------------------------------+------------------------------------------------+ -| 4 | P(E) = {n \\choose k} p^k (1-p)^{ n-k} \ | $$P(E) = {n \choose k} p^k (1-p)^{ n-k}$$ | -+-----+------------------------------------------------+------------------------------------------------+ -| An Identity of Ramanujan | -+-----+------------------------------------------------+------------------------------------------------+ -| 5 | \\frac{1}{\\Bigl(\\sqrt{\\phi \\sqrt{5}}- \ | $$\frac{1}{\Bigl(\sqrt{\phi \sqrt{5}}- | -| | \\phi\\Bigr) e^{\\frac25 \\pi}} = \ | \phi\Bigr) e^{\frac25 \pi}} = | -| | 1+\\frac{e^{-2\\pi}} {1+\\frac{e^{-4\\pi}} \ | 1+\frac{e^{-2\pi}} {1+\frac{e^{-4\pi}} | -| | {1+\\frac{e^{-6\\pi}} \ | {1+\frac{e^{-6\pi}} | -| | {1+\\frac{e^{-8\\pi}} {1+\\ldots} } } } | {1+\frac{e^{-8\pi}} {1+\ldots} } } }$$ | -+-----+------------------------------------------------+------------------------------------------------+ -| A Rogers-Ramanujan Identity | -+-----+------------------------------------------------+------------------------------------------------+ -| 6 | 1 + \\frac{q^2}{(1-q)}+ \ | $$1 + \frac{q^2}{(1-q)}+ | -| | \\frac{q^6}{(1-q)(1-q^2)}+\\cdots = \ | \frac{q^6}{(1-q)(1-q^2)}+\cdots = | -| | \\prod\_{j=0}^{\\infty}\frac{1} \ | \prod_{j=0}^{\infty}\frac{1} | -| | {(1-q^{5j+2})(1-q^{5j+3})}, \ | {(1-q^{5j+2})(1-q^{5j+3})}, | -| | \\quad\\quad \\text{for} |q|<1. | \quad\quad \text{for} |q|<1.$$ | -+-----+------------------------------------------------+------------------------------------------------+ -| Maxwell's Equations | -+-----+------------------------------------------------+------------------------------------------------+ -| 7 | \\begin{aligned} \ | $$\begin{aligned} | -| | \\nabla \\times \\vec{\mathbf{B}} -\\\\, \ | \nabla \times \vec{\mathbf{B}} -\, | -| | \\frac1c\\, \\frac{\\partial\\vec{ \ | \frac1c\, \frac{\partial\vec{ | -| | \\mathbf{E}}}{\\partial t} & \ | \mathbf{E}}}{\partial t} & | -| | = \\frac{4\\pi}{c}\\vec{\\mathbf{j}} \\\\ \ | = \frac{4\pi}{c}\vec{\mathbf{j}} \\ | -| | \\nabla \\cdot \\vec{\\mathbf{E}} & \ | \nabla \cdot \vec{\mathbf{E}} & | -| | = 4 \\pi \\rho \\\\ \ | = 4 \pi \rho \\ | -| | \\nabla \\times \\vec{\\mathbf{E}}\\, +\\, \ | \nabla \times \vec{\mathbf{E}}\, +\, | -| | \\frac1c\\, \\frac{\\partial\\vec{ \ | \frac1c\, \frac{\partial\vec{ | -| | \\mathbf{B}}}{\\partial t} & \ | \mathbf{B}}}{\partial t} & | -| | = \\vec{\mathbf{0}} \\\\ \ | = \vec{\mathbf{0}} \\ | -| | \\nabla \\cdot \\vec{\\mathbf{B}} & \ | \nabla \cdot \vec{\mathbf{B}} & | -| | = 0 \ | = 0 | -| | \\end{aligned} \ | \end{aligned}$$ | -+-----+------------------------------------------------+------------------------------------------------+ - -### Boxes - -| Source | Temml | -|:-------|:--------| -| `\raisebox{0pt}[0pt][0pt]{\Large%`
    `\textbf{Aaaa\raisebox{-0.3ex}{a}%`
    `\raisebox{-0.7ex}{aa}\raisebox{-1.2ex}{r}%`
    `\raisebox{-2.2ex}{g}\raisebox{-4.5ex}{h}}}` | $\raisebox{0pt}{\Large\textbf{Aaaa\raisebox{-0.3ex}{a}\raisebox{-0.7ex}{aa}\raisebox{-1.2ex}{r}\raisebox{-2.2ex}{g}\raisebox{-4.5ex}{h}}}$ | - -### Unicode - -The tests below come from https://latexml.mathweb.org/editor\ -They got them from https://trac.edgewall.org/wiki/TracUnicode\ -I have no idea what these lines say. - -All the Unicode characters are written inside `\text{}`. - -| Language | Temml | -|:----------------------|:-------------------------------------------------------------| -| Arabic | $\dfrac{\text{تراك يقوم بحفظ كل الكلمات باستخدام صيغة}} 2$ | -| Bulgarian | $\dfrac{\text{Българският език работи ли?}} 2$ | -| Česky | $\dfrac{\text{Čeština v kódování UTF-8, žádný problém.}} 2$ | -| Chinese (Traditional) | $\dfrac{\text{繁體中文, 漢字測試}} 2$ | -| Chinese (Simplified) | $\dfrac{\text{简体中文,汉字测试}} 2$ | -| Croatian | $\left(\begin{array}{l}\text{Ako podržava srpski i slovenski mora podržavati} \\ \text{ i Hrvatski - čćžšđ ČĆŽŠĐ}\end{array}\right)$ | -| English | $\dfrac{\text{Yes indeed, Trac supports English. Fully.}} 2$ | -| Français | $\dfrac{\text{Il est possible d'écrire en Français : à, ç, û, …}} 2$ | -| German | $\left(\begin{array}{l}\text{Trac-Wiki muß auch deutsche Umlaute richtig anzeigen:} \\ \text{ö, ä, ü, Ä, Ö, Ü; und das scharfe ß}\end{array}\right)$ | -| Greek | $\dfrac{\text{Τα Ελληνικά υποστηρίζονται επαρκώς επίσης.}} 2$ | -| Hebrew | $\dfrac{\text{אני יכול לאכול זכוכית וזה לא מזיק לי}} 2$ | -| Hindi | $\dfrac{\text{अब हिन्दी में।}} 2$ | -| Hungarian | $\dfrac{\text{Árvíztűrő tükörfúrógép}} 2$ | -| Icelandic | $\dfrac{\text{Ævar sagði við ömmu sína: Sjáðu hvað ég er stór!}} 2$ | -| Japanese | $\dfrac{\text{漢字 ひらがな カタカナ ハンカクカナ 日本語試験}} 2$ | -| Korean | $\dfrac{\text{이번에는 한글로 써보겠습니다. 잘 보이나요? 한글}} 2$ | -| Latvian | $\dfrac{\text{Latviešu valoda arī strādā!}} 2$ | -| Lithuanian | $\left(\begin{array}{l}\text{Sudalyvaukime ir mes. Ar veikia lietuviškos raidės?} \\ \text{ąčęėįšųūž ĄČĘĖĮŠŲŪŽ Žinoma, kad veikia :) Kas tie mes?}\end{array}\right)$ | -| Persian (Farsi) | $\left(\begin{array}{l}\text{ولی امکان نوشتن مستقیم فارسی نیست چون حالت متن از راست به چپ و جود} \\ \text{این یک متن فارسی است ندارد برای فارسی نوشتن باید از HTML استفاده کنید.}\end{array}\right)$ | -| Polish | $\left(\begin{array}{l}\text{Pchnąć w tę łódź jeża lub osiem skrzyń fig;} \\ \text{Nocna gżegżółka zawsze dzienną przekuka.}\end{array}\right)$ | -| Portuguese | $\left(\begin{array}{l}\text{É possível guardar caracteres especias da língua portuguesa, } \\ \text{incluindo o símbolo da moeda européia '€', trema 'ü', crase 'à', agudos 'áéíóú',} \\ \text{circunflexos 'âêô', til 'ãõ', cedilha 'ç', ordinais 'ªº', grau '°¹²³'.}\end{array}\right)$ | -| Russian | $\dfrac{(\text{Проверка русского языка: кажется работает... И буква "ё" есть...}} 2$ | -| Serbian | $\left(\begin{array}{l}\text{Podržan, uprkos činjenici da se za njegovo} \\ \text{pisanje koriste чак два алфабета.}\end{array}\right)$ | -| Slovenian | $\dfrac{\text{Ta suhi škafec pušča vodo že od nekdaj!}} 2$ | -| Spanish | $\left(\begin{array}{l}\text{Esto es un pequeño texto en Español,} \\ \text{donde el veloz murciélago hindú comía cardlllo y kiwi}\end{array}\right)$ | -| Swedish | $\dfrac{\text{Räven raskar över isen med luva på.}} 2$ | -| Thai | $\dfrac{\text{Trac แสดงภาษาไทยได้อย่างถูกต้อง!}} 2$ | -| Ukrainian | $\dfrac{\text{Перевірка української мови...}} 2$ | -| Urdu | $\dfrac{\text{ٹریک اردو بھی سپورٹ کرتا ہے۔}} 2$ | -| Vietnamese | $\dfrac{\text{Viết tiếng Việt cũng được.}} 2$ | - -
    - - diff --git a/test/auto-render.js b/test/auto-render.js deleted file mode 100644 index 0b0b00dc..00000000 --- a/test/auto-render.js +++ /dev/null @@ -1,212 +0,0 @@ -var autorender = (function () { - 'use strict'; - - /* eslint no-constant-condition:0 */ - const findEndOfMath = function(delimiter, text, startIndex) { - // Adapted from - // https://github.com/Khan/perseus/blob/master/src/perseus-markdown.jsx - let index = startIndex; - let braceLevel = 0; - - const delimLength = delimiter.length; - - while (index < text.length) { - const character = text[index]; - - if (braceLevel <= 0 && text.slice(index, index + delimLength) === delimiter) { - return index; - } else if (character === "\\") { - index++; - } else if (character === "{") { - braceLevel++; - } else if (character === "}") { - braceLevel--; - } - - index++; - } - - return -1; - }; - - const escapeRegex = function(string) { - return string.replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&"); - }; - - const amsRegex = /^\\begin{/; - - const splitAtDelimiters = function(text, delimiters) { - let index; - const data = []; - - const regexLeft = new RegExp( - "(" + delimiters.map((x) => escapeRegex(x.left)).join("|") + ")" - ); - - while (true) { - index = text.search(regexLeft); - if (index === -1) { - break; - } - if (index > 0) { - data.push({ - type: "text", - data: text.slice(0, index) - }); - text = text.slice(index); // now text starts with delimiter - } - // ... so this always succeeds: - const i = delimiters.findIndex((delim) => text.startsWith(delim.left)); - index = findEndOfMath(delimiters[i].right, text, delimiters[i].left.length); - if (index === -1) { - break; - } - const rawData = text.slice(0, index + delimiters[i].right.length); - const math = amsRegex.test(rawData) - ? rawData - : text.slice(delimiters[i].left.length, index); - data.push({ - type: "math", - data: math, - rawData, - display: delimiters[i].display - }); - text = text.slice(index + delimiters[i].right.length); - } - - if (text !== "") { - data.push({ - type: "text", - data: text - }); - } - - return data; - }; - - /* eslint no-console:0 */ - - /* Note: optionsCopy is mutated by this method. If it is ever exposed in the - * API, we should copy it before mutating. - */ - const renderMathInText = function(text, optionsCopy) { - const data = splitAtDelimiters(text, optionsCopy.delimiters); - if (data.length === 1 && data[0].type === "text") { - // There is no formula in the text. - // Let's return null which means there is no need to replace - // the current text node with a new one. - return null; - } - - const fragment = document.createDocumentFragment(); - - for (let i = 0; i < data.length; i++) { - if (data[i].type === "text") { - fragment.appendChild(document.createTextNode(data[i].data)); - } else { - const span = document.createElement("span"); - let math = data[i].data; - // Override any display mode defined in the settings with that - // defined by the text itself - optionsCopy.displayMode = data[i].display; - try { - if (optionsCopy.preProcess) { - math = optionsCopy.preProcess(math); - } - temml.render(math, span, optionsCopy); - } catch (e) { - if (!(e instanceof temml.ParseError)) { - throw e; - } - optionsCopy.errorCallback( - "temml auto-render: Failed to parse `" + data[i].data + "` with ", - e - ); - fragment.appendChild(document.createTextNode(data[i].rawData)); - continue; - } - fragment.appendChild(span); - } - } - - return fragment; - }; - - const renderElem = function(elem, optionsCopy) { - for (let i = 0; i < elem.childNodes.length; i++) { - const childNode = elem.childNodes[i]; - if (childNode.nodeType === 3) { - // Text node - const frag = renderMathInText(childNode.textContent, optionsCopy); - if (frag) { - i += frag.childNodes.length - 1; - elem.replaceChild(frag, childNode); - } - } else if (childNode.nodeType === 1) { - // Element node - const className = " " + childNode.className + " "; - const shouldRender = - optionsCopy.ignoredTags.indexOf(childNode.nodeName.toLowerCase()) === -1 && - optionsCopy.ignoredClasses.every((x) => className.indexOf(" " + x + " ") === -1); - - if (shouldRender) { - renderElem(childNode, optionsCopy); - } - } - // Otherwise, it's something else, and ignore it. - } - }; - - const renderMathInElement = function(elem, options) { - if (!elem) { - throw new Error("No element provided to render"); - } - - const optionsCopy = {}; - - // Object.assign(optionsCopy, option) - for (const option in options) { - if (options.hasOwnProperty(option)) { - optionsCopy[option] = options[option]; - } - } - - // default options - optionsCopy.delimiters = optionsCopy.delimiters || [ - { left: "$$", right: "$$", display: true }, - { left: "\\(", right: "\\)", display: false }, - // LaTeX uses $…$, but it ruins the display of normal `$` in text: - // {left: "$", right: "$", display: false}, - // $ must come after $$ - - // Render AMS environments even if outside $$…$$ delimiters. - { left: "\\begin{equation}", right: "\\end{equation}", display: true }, - { left: "\\begin{align}", right: "\\end{align}", display: true }, - { left: "\\begin{alignat}", right: "\\end{alignat}", display: true }, - { left: "\\begin{gather}", right: "\\end{gather}", display: true }, - { left: "\\begin{CD}", right: "\\end{CD}", display: true }, - - { left: "\\[", right: "\\]", display: true } - ]; - optionsCopy.ignoredTags = optionsCopy.ignoredTags || [ - "script", - "noscript", - "style", - "textarea", - "pre", - "code", - "option" - ]; - optionsCopy.ignoredClasses = optionsCopy.ignoredClasses || []; - optionsCopy.errorCallback = optionsCopy.errorCallback || console.error; - - // Enable sharing of global macros defined via `\gdef` between different - // math elements within a single call to `renderMathInElement`. - optionsCopy.macros = optionsCopy.macros || {}; - - renderElem(elem, optionsCopy); - }; - - return renderMathInElement; - -}()); diff --git a/test/environment-tests.md b/test/environment-tests.md deleted file mode 100644 index 5f1af7b1..00000000 --- a/test/environment-tests.md +++ /dev/null @@ -1,143 +0,0 @@ - - - - - - Environment Tests - - - - - - - - -## Environments - -+:=====================:+:===========================+:==========================:+:=============================+ -| $\begin{matrix} | `\begin{matrix}`\ | $\begin{array}{cc} | `\begin{array}{cc}`\ | -| a & b \\ |    `a & b \\`\ | a & b \\ |    `a & b \\`\ | -| c & d |    `c & d`\ | c & d |    `c & d`\ | -| \end{matrix}$ | `\end{matrix}` | \end{array}$ | `\end{array}` | -+-----------------------+----------------------------+----------------------------+------------------------------+ -| $\begin{matrix*}[r] | `\begin{matrix*}`\ | $\begin{array}{cc} | `\begin{darray}{cc}`\ | -| a & b \\ |    `a & b \\`\ | a & b \\ |    `a & b \\`\ | -| 1.2 & 3.5 |    `1.2 & 3.5`\ | c & d |    `c & d`\ | -| \end{matrix*}$ | `\end{matrix*}` | \end{array}$ | `\end{darray}` | -+-----------------------+----------------------------+----------------------------+------------------------------+ -| $\begin{pmatrix} | `\begin{pmatrix}`\ | $\begin{bmatrix} | `\begin{bmatrix}`\ | -| a & b \\ |    `a & b \\`\ | a & b \\ |    `a & b \\`\ | -| c & d |    `c & d`\ | c & d |    `c & d`\ | -| \end{pmatrix}$ | `\end{pmatrix}` | \end{bmatrix}$ | `\end{bmatrix}` | -+-----------------------+----------------------------+----------------------------+------------------------------+ -| $\begin{pmatrix*}[r] | `\begin{pmatrix*}[r]`\ | $\begin{bmatrix*}[r] | `\begin{bmatrix*}[r]`\ | -| a & b \\ |    `a & b \\`\ | a & b \\ |    `a & b \\`\ | -| 1.2 & 3.5 |    `1.2 & 3.5`\ | 1.2 & 3.5 |    `1.2 & 3.5`\ | -| \end{pmatrix*}$ | `\end{pmatrix*}` | \end{bmatrix*}$ | `\end{bmatrix*}` | -+-----------------------+----------------------------+----------------------------+------------------------------+ -| $\begin{vmatrix} | `\begin{vmatrix}`\ | $\begin{Vmatrix} | `\begin{Vmatrix}`\ | -| a & b \\ |    `a & b \\`\ | a & b \\ |    `a & b \\`\ | -| c & d |    `c & d`\ | c & d |    `c & d`\ | -| \end{vmatrix}$ | `\end{vmatrix}` | \end{Vmatrix}$ | `\end{Vmatrix}` | -+-----------------------+----------------------------+----------------------------+------------------------------+ -| $\begin{vmatrix*}[r] | `\begin{vmatrix}`\ | $\begin{Vmatrix*}[r] | `\begin{Vmatrix}`\ | -| a & b \\ |    `a & b \\`\ | a & b \\ |    `a & b \\`\ | -| 1.2 & 3.5 |    `1.2 & 3.5`\ | 1.2 & 3.5 |    `1.2 & 3.5`\ | -| \end{vmatrix*}$ | `\end{vmatrix*}` | \end{Vmatrix*}$ | `\end{Vmatrix*}` | -+-----------------------+----------------------------+----------------------------+------------------------------+ -| $\begin{Bmatrix} | `\begin{Bmatrix}`\ | $\begin{array}{c|c:c} | `\begin{array}{c|c:c}`\ | -| a & b \\ |    `a & b \\`\ | a & b & c \\ \hline |   `a & b & c \\ \hline`\ | -| 1.2 & 3.5 |    `1.2 & 3.5`\ | d & e & f \\ \hdashline |    `d & e & f \\`\ | -| \end{Bmatrix}$ | `\end{Bmatrix*}` | g & h & i |    `\hdashline`\ | -| | | \end{array}$ |    `g & h & i`\ | -| | | | `\end{array}`  | -+-----------------------+----------------------------+----------------------------+------------------------------+ -| $\begin{Bmatrix*}[r] | `\begin{Bmatrix*}[r]`\ | $\begin{array}{c|c:c} | `\begin{array}{c|c:c}`\ | -| a & b \\ |    `a & b \\`\ | a & b & c \\ \hline |   `a & b & c \\ \hline`\ | -| 1.2 & 3.5 |    `1.2 & 3.5`\ | d & e & f \\ \hdashline |    `d & e & f \\`\ | -| \end{Bmatrix*}$ | `\end{Bmatrix*}` | g & h & i |    `\hdashline`\ | -| | | \end{array}$ |    `g & h & i`\ | -| | | | `\end{array}`  | -+-----------------------+----------------------------+----------------------------+------------------------------+ -| $x = \begin{cases} | `x = \begin{cases}`\ | $\begin{rcases} | `\begin{rcases}`\ | -| a &\text{if } b \\ |    `a &\text{if } b \\`\ | a &\text{if } b \\ |    `a &\text{if } b \\`\ | -| c &\text{if } d |    `c &\text{if } d`\ | c &\text{if } d |   `c &\text{if } d`\ | -| \end{cases}$ | `\end{cases}` | \end{rcases}⇒$ | `\end{rcases}⇒` | -+-----------------------+----------------------------+----------------------------+------------------------------+ -| $x = \begin{dcases} | `x = \begin{dcases}`\ | $\begin{drcases} | `\begin{drcases}`\ | -| a &\text{if } b \\ |    `a &\text{if } b \\`\ | a &\text{if } b \\ |    `a &\text{if } b \\`\ | -| c &\text{if } d |    `c &\text{if } d`\ | c &\text{if } d |   `c &\text{if } d`\ | -| \end{dcases}$ | `\end{dcases}` | \end{drcases}⇒$ | `\end{drcases}⇒` | -+-----------------------+----------------------------+----------------------------+------------------------------+ -| $\begin{smallmatrix} | `\begin{smallmatrix}`\ | $$ | `\sum_{\begin{subarray}{l}`\ | -| a & b \\ |    `a & b \\`\ | \sum_{\begin{subarray}{l} |    `i\in\Lambda\\`\ | -| c & d |    `c & d`\ | i\in\Lambda\\ |    `0a>> B \\`\ | 10&x+ &3&y = 2 \\ |    `\10&x+ &3&y = 2\\`\ | -| A @>a>> B \\ | `@VbVV @AAcA \\`\ | 3&x+&13&y = 4 |    `3&x+&13&y = 4 \\`\ | -| @VbVV @AAcA\\ | `C @= D`\ | \end{alignedat}$ | `\end{alignedat}`\ | -| C @= D | `\end{CD}` | | | -| \end{CD} | | | | -| $$ | | | | -+-------------------+------------------------+------------------------+---------------------------+ -| $$ | `\begin{CD}`\ | $$ | `\begin{multline}`\ | -| \begin{CD} | `A @>a>> B \\`\ | \begin{multline} |    `\rm uno \\`\ | -| A @>a>> B \\ | `@VbVV @AAcA \\`\ | \rm uno \\ |    `\rm dos \\`\ | -| @VbVV @AAcA\\ | `C @= D`\ | \rm dos \\ |    `\rm tres`\ | -| C @= D | `\end{CD}` | \rm tres | `\end{multline}` | -| \end{CD} | | \end{multline} | | -| $$ | | $$ | | -+-------------------+------------------------+------------------------+---------------------------+ - - - - diff --git a/test/katex-tests.md b/test/katex-tests.md deleted file mode 100644 index 6e3ffd24..00000000 --- a/test/katex-tests.md +++ /dev/null @@ -1,1146 +0,0 @@ - - - - - - Temml Screen Tests - - - - - - - - -# Tests from KaTeX - -This file renders examples from KaTeX’s -[screenshotter tests](https://github.com/KaTeX/KaTeX/blob/main/test/screenshotter/ss_data.yaml).\ -Images from LaTeX are also provided for comparison.\ -(Images come from [LaTeX Previewer](http://www.tlhiv.org/ltxpreview/), thanks.) - -#### Accents - -+---------------------------+---------------------------------------+--------------------------------+ -| Source | Temml | LaTeX | -+===========================+=======================================+================================+ -| \vec{A}\vec{x}\vec x^2 \ | $\vec{A}\vec{x}\vec x^2\vec{x}_2^2 | ![accents](images/accents.svg) | -| \vec{x}_2^2 \vec{A}^2 \ | \vec{A}^2\vec{xA}^2\; \underbar{X}$ | | -| \vec{xA}^2\; \underbar{X} | | | -+---------------------------+---------------------------------------+--------------------------------+ - -#### AccentsText - -+---+---------------------------------------------------------------------------------------------------------------+------------------+ -| | $\begin{array}{lccccc} \text{\'\i} & \text{\.\i} & \text{\`\i} & \text{\"\i} & \text{\H\i} & \text{\r\i} \\ | ![AccentsText][] | -| | \text{\'\j} & \text{\.\j} & \text{\`\j} & \text{\"\j} & \text{\H\j} & \text{\r\j} \\ | | -| | \text{\'a} & \text{\.a} & \text{\`a} & \text{\"a} & \text{\H{a}} & \text{\r{a}} \\ | | -| | \text{\'A} & \text{\.A} & \text{\`A} & \text{\"A} & \text{\H{A}} & \text{\r{A}} \\ | | -| | \text{\.I İ} & \text{\H e e̋} & \text{\i ı} \end{array}$ | | -+---+---------------------------------------------------------------------------------------------------------------+------------------+ - -[AccentsText]: images/AccentsText.svg - -#### Actuarial Angle - -+--------------------------+---------------------------+--------------------------+ -| `a_{\angl n}\; a_\angln` | $a_{\angl n}\; a_\angln$ | ![angl](images/angl.svg) | -+--------------------------+---------------------------+--------------------------+ - -#### Align - -+---------------------------+------------------------------------+ -| \begin{align} \ | $$\begin{align}a &= 1 & b &= 2 \\ | -| a &= 1 & b &= 2 \\\\ \ | 3a &= 3 & 17b &= 34\end{align}$$ | -| 3a &= 3 & 17b &= 34 \ | | -| \end{align} | | -+---------------------------+------------------------------------+ -{colWidths="null 200"} - -#### Alignat - -+--------------------------------------------------+------------------------------------------------+ -| \begin{alignat}{3} \ | $$\begin{alignat}{3} | -| a &= 1\quad & b &= 2 &\quad c &= 3\\\\ \ | a &= 1\quad & b &= 2 &\quad c &= 3\\ | -| 3a &= 3 &\quad 17b &= 34 &\quad 400c &= 1200 \ | 3a &= 3 &\quad 17b &= 34 &\quad 400c &= 1200 | -| \end{alignat} | \end{alignat}$$ | -+--------------------------------------------------+------------------------------------------------+ -{colWidths="null 350"} - -#### Aligned - -+---------------------------+-------------------------------------+--------------------------------+ -| \begin{aligned} \ | $\begin{aligned}a &= 1 & b &= 2 \\ | ![aligned](images/aligned.svg) | -| a &= 1 & b &= 2 \\\\ \ | 3a &= 3 & 17b &= 34\end{aligned}$ | | -| 3a &= 3 & 17b &= 34 \ | | | -| \end{aligned} | | | -+---------------------------+-------------------------------------+--------------------------------+ - -#### Alignedat - -+--------------------------------------------------+------------------------------------------------+----------------+ -| \begin{alignedat}{3} \ | $$\begin{alignedat}{3} | ![alignedat][] | -| a &= 1\quad & b &= 2 &\quad c &= 3\\\\ \ | a &= 1\quad & b &= 2 &\quad c &= 3\\ | | -| 3a &= 3 &\quad 17b &= 34 &\quad 400c &= 1200 \ | 3a &= 3 &\quad 17b &= 34 &\quad 400c &= 1200 | | -| \end{alignedat} | \end{alignedat}$$ | | -+--------------------------------------------------+------------------------------------------------+----------------+ - -[alignedat]: images/alignedat.svg - -#### Arrays - -This LaTeX image does include dashed lines.\ -LaTeX Previewer does not include the `arydshln` package. - -+-------------------------------------------------------------+----------------------------------------------------------+---------------+ -| \left(\begin{array}{|rl:c|} | $\left(\begin{array}{|rl:c|} | ![Arrays][] | -| 1&2&3\\\\ \hline \ | 1&2&3\\ \hline | | -| 1+1&2+1&3+1\cr1\over2&\scriptstyle 1/2&\frac 1 2\\\\ \ | 1+1&2+1&3+1\cr1\over2&\scriptstyle 1/2&\frac 1 2\\ | | -| \hdashline \ | \hdashline | | -| \begin{pmatrix}x\\\\y\end{pmatrix}&0& \ | \begin{pmatrix}x\\y\end{pmatrix}&0& | | -| \begin{vmatrix}a&b\\\\c&d\end{vmatrix} \ | \begin{vmatrix}a&b\\c&d\end{vmatrix} | | -| \end{array}\right] | \end{array}\right]$ | | -+-------------------------------------------------------------+----------------------------------------------------------+---------------+ -| \begin{smallmatrix} a & b \\\\ c & d \end{smallmatrix} \ | $\begin{smallmatrix} a & b \\ c & d \end{smallmatrix}$ | ![subarray][] | -| \begin{subarray}{c}a \\\\ b\end{subarray} | $\begin{subarray}{c}a \\ b\end{subarray}$ | | -+-------------------------------------------------------------+----------------------------------------------------------+---------------+ - -[Arrays]: images/Arrays.svg -[subarray]: images/subarray.svg - -#### ArrayMode - -+---+---------------------------------------------------------------+------------------------------------+ -| | $$\begin{matrix} \frac{\partial^2 f}{\partial x_1^2} & | ![ArrayMode](images/ArrayMode.svg) | -| | \frac{\partial^2 f}{\partial x_1\,\partial x_2} & | | -| | \cdots & \frac{\partial^2 f}{\partial x_1\,\partial x_n} \\ | | -| | \frac{\partial^2 f}{\partial x_2\,\partial x_1} & | | -| | \frac{\partial^2 f}{\partial x_2^2} & | | -| | \cdots & \frac{\partial^2 f}{\partial x_2\,\partial x_n} \\ | | -| | \vdots & \vdots & \ddots & \vdots \\ | | -| | \frac{\partial^2 f}{\partial x_n\,\partial x_1} & | | -| | \frac{\partial^2 f}{\partial x_n\,\partial x_2} & | | -| | \cdots & \frac{\partial^2 f}{\partial x_n^2} | | -| | \end{matrix}$$ | | -+---+---------------------------------------------------------------+------------------------------------+ - -#### ArrayType - -+-------------------------------------+--------------------------------------+------------------------------------+ -| 1\begin{array}{c}2\\\\3\end{array}4 | $1\begin{array}{c}2\\3\end{array}4$ | ![ArrayType](images/ArrayType.svg) | -+-------------------------------------+--------------------------------------+------------------------------------+ - -#### ArrayRemoveEmptyLine - -A `\\` at the end of a matrix should not create another line. - -+---------------------------------------------+--------------------------------------------+ -| \begin{pmatrix} 1 \\\\ 2 \\\\ \end{pmatrix} | $\begin{pmatrix} 1 \\ 2 \\ \end{pmatrix}$ | -+---------------------------------------------+--------------------------------------------+ - -#### Baseline - -+----------------+-------------------+----------------------------------+ -| a+b-c\cdot d/e | $a+b-c\cdot d/e$ | ![Baseline](images/baseline.svg) | -+----------------+-------------------+----------------------------------+ - -#### BasicTest - -$`a` - -#### BinCancellation - -+--------------------------------------------+-------------------------------------------+----------------------+ -| \begin{array}{cccc} \ | $\begin{array}{cccc} | ![BinCancellation][] | -| +1 & 1+ & 1+1 & (,) \\\\ \ | +1 & 1+ & 1+1 & (,) \\ | | -| 1++1 & 3\times) & 1+, & \left(,\right) \ | 1++1 & 3\times) & 1+, & \left(,\right) | | -| \end{array} | \end{array}$ | | -+--------------------------------------------+-------------------------------------------+----------------------+ - -[BinCancellation]: images/BinCancellation.svg - -#### Binom - -+----------------------------------------------+-------------------------------------------------+------------+ -| \dbinom{a}{b}\tbinom{a}{b}^{\binom{a}{b}+17} | $\dbinom{a}{b}\tbinom{a}{b}^{\binom{a}{b}+17}$ | ![binom][] | -+----------------------------------------------+-------------------------------------------------+------------+ - -[binom]: images/binom.svg - -#### BoldSpacing - -+----------------------------------------+-------------------------------------------+ -| \mathbf{A}^2+\mathbf{B}_3*\mathscr{C}' | $\mathbf{A}^2+\mathbf{B}_3*\mathscr{C}'$ | -+----------------------------------------+-------------------------------------------+ - -#### BoldSymbol - -+-----------------------------------------------------+----------------------------------------------------+-----------------+ -| `\sum_{\boldsymbol{\alpha}}^{\boldsymbol{\beta}}` \ | $\sum_{\boldsymbol{\alpha}}^{\boldsymbol{\beta}} | ![BoldSymbol][] | -| \boldsymbol{\omega}+ \ | \boldsymbol{\omega}+ | | -| `\boldsymbol{\int_\alpha^\beta}` \ | \boldsymbol{\int_\alpha^\beta} | | -| \boldsymbol{\Omega + {}} \\\\ \ | \boldsymbol{\Omega + {}} \\ | | -| \boldsymbol{\lim_{x \to \infty} \ | \boldsymbol{\lim_{x \to \infty} | | -| \log Ax2k\omega\Omega\imath+} \\\\ \ | \log Ax2k\omega\Omega\imath+} \\ | | -| x \boldsymbol{+} y \boldsymbol{=} z | x \boldsymbol{+} y \boldsymbol{=} z$ | | -+-----------------------------------------------------+----------------------------------------------------+-----------------+ - -[BoldSymbol]: images/BoldSymbol.svg - -#### Boxed - -+----------------------------------------+-----------------------------------------+------------+ -| \boxed{F=ma} \quad \boxed{ac}\ | $\boxed{F=ma} \quad \boxed{ac} | ![boxed][] | -| \color{magenta}{\boxed{F}}\boxed{F=mg} | \color{magenta}{\boxed{F}}\boxed{F=mg}$ | | -+----------------------------------------+-----------------------------------------+------------+ - -[boxed]: images/boxed.svg - -#### Cases - -+----------------------------------------+------------------------------------+------------------------------+ -| f(a,b)= \ | $f(a,b)= | ![cases](images/cases.svg) | -| \begin{cases} \ | \begin{cases} | | -| a+1&\text{if }b\text{ is odd} \\\\ \ | a+1&\text{if }b\text{ is odd} \\ | | -| a&\text{if }b=0 \\\\ \ | a&\text{if }b=0 \\ | | -| a-1&\text{otherwise} \ | a-1&\text{otherwise} | | -| \end{cases} | \end{cases}$ | | -+----------------------------------------+------------------------------------+------------------------------+ -| \begin{rcases} \ | $\begin{rcases} | ![rcases](images/rcases.svg) | -| a &\text{if } b \\\\ \ | a &\text{if } b \\ | | -| c &\text{if } d \ | c &\text{if } d | | -| \end{rcases}\Rightarrow\ldots | \end{rcases}\Rightarrow\ldots$ | | -+----------------------------------------+------------------------------------+------------------------------+ - -#### CD - -+-----------------------------+-------------------------+----------------------+ -| \begin{CD} \ | $$\begin{CD} | ![CD](images/CD.svg) | -| A @>b> C \\\\ \ | A @>b> C \\ | | -| @| @AcAA @VVdV \\\\ \ | @| @AcAA @VVdV \\ | | -| D @= E @>>> F \ | D @= E @>>> F | | -| \end{CD} | \end{CD}$$ | | -+-----------------------------+-------------------------+----------------------+ - -#### Colors - -+-----------------------+-----------------------+------------------------------+ -| \textcolor{#0f0}{b} \ | $\textcolor{#0f0}{b} | ![colors](images/colors.svg) | -| \textcolor{red}{c} | \textcolor{red}{c}$ | | -+-----------------------+-----------------------+------------------------------+ - -#### ColorImplicit - -+----------------------------------+------------------------------+--------------------------------------------+ -| bl{ack\color{red}red \ | $bl{ack\color{red}red | ![ColorImplicit](images/ColorImplicit.svg) | -| \textcolor{green}{green} \ | \textcolor{green}{green} | | -| red\color{blue}blue}black \\\\ \ | red\color{blue}blue}black \\ | | -| black\left(black \ | black\left(black | | -| \color{red}red\right)black | \color{red}red\right)black$ | | -+----------------------------------+------------------------------+--------------------------------------------+ - -#### ColorSpacing - -+----------------------------+-----------------------------+------------------------------------------+ -| \textcolor{red}{x} + 1 \ | $\textcolor{red}{x} + 1 | ![ColorSpacing](images/ColorSpacing.svg) | -| {\color{green}+ 2 +} 3 + 4 | {\color{green}+ 2 +} 3 + 4$ | | -+----------------------------+-----------------------------+------------------------------------------+ - -#### Colorbox - -+----------------------------+----------------------------+----------------------------------+ -| a \colorbox{teal} B \ | $a \colorbox{teal} B | ![Colorbox](images/Colorbox.svg) | -| \fcolorbox{blue}{red}{C} \ | \fcolorbox{blue}{red}{C} | | -| e+\colorbox{teal}x | e+\colorbox{teal}x$ | | -+----------------------------+----------------------------+----------------------------------+ - -#### DashesAndQuotes - -+-----------------------------------------------------------+------------------------------------------------------+----------------------+ -| \begin{array}{l} \ | $\begin{array}{l} | ![DashesAndQuotes][] | -| ```\text{``a'' b---c -- d----`e'-{-}-f} -- \\``` \ | \text{``a'' b---c -- d----`e'-{-}-f} -- \\ | | -| ```\text{\it ``a'' b---c -- d----`e'-{-}-f} ``x'' \\``` \ | \text{\it ``a'' b---c -- d----`e'-{-}-f} ``x'' \\ | | -| ```\text{\tt ``a''---} \texttt{``a''---} \mathtt{--}``` \ | \text{\tt ``a''---} \texttt{``a''---} \mathtt{--} \\ | | -| \end{array} | \end{array}$ | | -+-----------------------------------------------------------+------------------------------------------------------+----------------------+ - -[DashesAndQuotes]: images/DashesAndQuotes.svg - -#### DelimiterSizing - -+-----------------------------------+-----------------------------------+-----------------------+ -| \bigl\uparrow\Bigl\downarrow \ | $\bigl\uparrow\Bigl\downarrow | ![DelimiterSizing1][] | -| \biggl\updownarrow \ | \biggl\updownarrow | | -| \Biggl\Uparrow\Biggr\Downarrow \ | \Biggl\Uparrow\Biggr\Downarrow | | -| \biggr\langle\Bigr\\}\bigr\rfloor | \biggr\langle\Bigr\}\bigr\rfloor$ | | -+-----------------------------------+-----------------------------------+-----------------------+ -| \begin{pmatrix} \ | $\begin{pmatrix} | ![DelimiterSizing2][] | -| a & b & c\\\\ \ | a & b & c\\ | | -| a & b & c\\\\ \ | a & b & c\\ | | -| a & b & c \ | a & b & c\\ | | -| \end{pmatrix} | \end{pmatrix}$ | | -+-----------------------------------+-----------------------------------+-----------------------+ - -[DelimiterSizing1]: images/DelimiterSizing1.svg -[DelimiterSizing2]: images/DelimiterSizing2.svg - -#### DisplayMode - -+-------------------------------+-----------------------------------+----------------------------------------+ -| \sum_{i=0}^\infty \frac{1}{i} | $$\sum_{i=0}^\infty \frac{1}{i}$$ | ![DisplayMode](images/DisplayMode.svg) | -+-------------------------------+-----------------------------------+----------------------------------------+ - -#### DisplayStyle - -+----------------------------------------+---------------------------------------+-------------------+ -| {\displaystyle\sqrt{x}}{\sqrt{x}} \ | ${\displaystyle\sqrt{x}}{\sqrt{x}} | ![displaystyle][] | -| {\displaystyle \frac 1 2}{\frac 1 2} \ | {\displaystyle \frac 1 2}{\frac 1 2} | | -| `{\displaystyle x^1_2}{x^1_2}` | {\displaystyle x^1_2}{x^1_2}$ | | -+----------------------------------------+---------------------------------------+-------------------+ - -[displaystyle]: images/displaystyle.svg - -#### Dots - -+---------------------------------------------+-----------------------------------------+--------------------------+ -| \begin{array}{l} \ | $\begin{array}{l} | ![dots](images/dots.svg) | -| \cdots;\dots+\dots\int\dots,\dots \\\\ \ | \cdots;\dots+\dots\int\dots,\dots \\ | | -| \cdots{};\ldots+\ldots\int\ldots,\ldots \ | \cdots{};\ldots+\ldots\int\ldots,\ldots | | -| \end{array} | \end{array}$ | | -+---------------------------------------------+-----------------------------------------+--------------------------+ - -#### Equation - -+---------------------+--------------------+----------------------------------+ -| \begin{equation} \ | $$\begin{equation} | ![equation](images/equation.svg) | -| \begin{split} \ | \begin{split} | | -| a& =b+c-d \\\\ \ | a& =b+c-d \\ | | -| & \quad +e-f \\\\ \ | & \quad +e-f \\ | | -| & =g+h \\\\ \ | & =g+h \\ | | -| & =i \ | & =i | | -| \end{split} \ | \end{split} | | -| \end{equation} | \end{equation}$$ | | -+---------------------+--------------------+----------------------------------+ -{colWidths="null 150"} - -#### Exponents - -+---------------------+----------------------+------------------------------------+ -| `a^{a^a_a}_{a^a_a}` | $a^{a^a_a}_{a^a_a}$ | ![exponents](images/exponents.svg) | -+---------------------+----------------------+------------------------------------+ - -#### ExtensibleArrows - -+------------------------------------+----------------------------------+-----------------------+ -| \begin{array}{l} \ | $\begin{array}{l} | ![ExtensibleArrows][] | -| \xrightarrow[ab]{ABC} + \ | \xrightarrow[ab]{ABC} + | | -| \xRightarrow{ABC} \\\\ \ | \xRightarrow{ABC} \\ | | -| \xleftrightharpoons[ab]{ABC} + \ | \xleftrightharpoons[ab]{ABC} + | | -| \xhookrightarrow[ab]{ABC} \\\\ \ | \xhookrightarrow[ab]{ABC} \\ | | -| \xmapsto{ABC} + \ | \xmapsto{ABC} + | | -| \frac{\xrightarrow[ab]{ABC}} \ | \frac{\xrightarrow[ab]{ABC}} | | -| {\xrightarrow[ab]{ABC}} + \ | {\xrightarrow[ab]{ABC}} + | | -| \left\lvert\xrightarrow[ab]{ABC} \ | \left\lvert\xrightarrow[ab]{ABC} | | -| \right\rvert \ | \right\rvert | | -| \end{array} | \end{array}$ | | -+------------------------------------+----------------------------------+-----------------------+ - -[ExtensibleArrows]: images/ExtensibleArrows.svg - -#### Fractions - -+----------------------------------------------------+--------------------------------------------------+-----------------+ -| \dfrac{a}{b}\frac{a}{b} \ | $\dfrac{a}{b}\frac{a}{b} | ![Fractions1][] | -| \tfrac{a}{b}\\;- \ | \tfrac{a}{b}\;- | | -| \dfrac 1 2\\;1\tfrac 1 2\\;{1 \atop 2}\\; \ | \dfrac 1 2\;1\tfrac 1 2\;{1 \atop 2}\; | | -| {a \brace b} \\; {a \brack b} | {a \brace b} \; {a \brack b}$ | | -+----------------------------------------------------+--------------------------------------------------+-----------------+ -| \genfrac \\{ ]{0.8pt}{0}{a}{b}\\; \ | $\genfrac \{ ]{0.8pt}{0}{a}{b}\; | ![Fractions2][] | -| {a \above1.0pt b} \\; \ | {a \above1.0pt b} \; | | -| \cfrac{1}{1+\cfrac{1}{x}} \ | \cfrac{1}{1+\cfrac{1}{x}} | | -| \xrightarrow[\dfrac g h]{\displaystyle\frac g h} \ | \xrightarrow[\dfrac g h]{\displaystyle\frac g h} | | -| \\; \xrightarrow [2.\\, \dfrac c d] \ | \; \xrightarrow [2.\, \dfrac c d] | | -| {1.\\, \displaystyle\frac c d} | {1.\, \displaystyle\frac c d}$ | | -+----------------------------------------------------+--------------------------------------------------+-----------------+ - -[Fractions1]: images/Fractions1.svg -[Fractions2]: images/Fractions2.svg - -#### Functions - -+---------------------+------------------------+------------------------------------+ -| \sin\cos\tan\ln\log | $\sin\cos\tan\ln\log$ | ![functions](images/functions.svg) | -+---------------------+------------------------+------------------------------------+ - -#### Gather - -+--------------------+------------------+------------------------------+ -| \begin{gather} \ | $$\begin{gather} | ![gather](images/gather.svg) | -| a=\frac 1 2 \\\\ \ | a=\frac 1 2 \\ | | -| e=b+c \ | e=b+c | | -| \end{gather} | \end{gather}$$ | | -+--------------------+------------------+------------------------------+ -{colWidths="null 150 null"} - -#### GreekLetters - -+-------------------------+----------------------------+----------------------------+ -| \alpha\beta\gamma\omega | $\alpha\beta\gamma\omega$ | ![greek](images/greek.svg) | -+-------------------------+----------------------------+----------------------------+ - -#### GreekUnicode - -+--------------------------------------------+-----------------------------------------------+ -| \frac{αβγδεϵζηθϑικλμνξοπϖρϱςστυφϕχψω} \ | $\frac{αβγδεϵζηθϑικλμνξοπϖρϱςστυφϕχψω} | -| {ΓΔΘΞΠΣΦΨΩϝ\mathbf{Ω}\mathbf{\Omega}} | {ΓΔΘΞΠΣΦΨΩϝ\mathbf{Ω}\mathbf{\Omega}}$ | -+--------------------------------------------+-----------------------------------------------+ - -#### HorizontalBraces - -+------------------------------------------------+-----------------------------------------------+-----------------------+ -| \overbrace{\displaystyle{ \ | $\overbrace{\displaystyle{ | ![HorizontalBraces][] | -| `\oint_S{\vec E\cdot\hat n\,\mathrm d a}}}^` \ | \oint_S{\vec E\cdot\hat n\,\mathrm d a}}}^ | | -| \text{emf} = \ | \text{emf} = | | -| `\underbrace{\frac{q_{` \ | \underbrace{\frac{q_{ | | -| `\text{enc}}}{\varepsilon_0}}_{\text{charge}}` | \text{enc}}}{\varepsilon_0}}_{\text{charge}}$ | | -+------------------------------------------------+-----------------------------------------------+-----------------------+ - -[HorizontalBraces]: images/HorizontalBraces.svg - -#### HTML - -+-----------------------------------+--------------------------------------+-----+ -| \id{a}{a+}b\style{color:red;}{+c} | $\id{a}{a+}b\style{color:red;}{+c}$ | N/A | -+-----------------------------------+--------------------------------------+-----+ - -#### Includegraphics - -$\def\logo{\includegraphics[height=0.8em, totalheight=0.9em, width=0.9em, alt=sphere]{../docs/sphere.jpg}} -\def\logoB{\includegraphics[height=0.4em, totalheight=0.9em, width=0.9em, alt=sphere]{../docs/sphere.jpg}} -\begin{array}{l} \underline{A\logo} + \sqrt{\logo} + \tfrac{A\logo}{\logo}\\[1em] \underline{A\logoB} + \sqrt{x\logoB} + \tfrac{A\logoB}{\logoB} \end{array}$ - -#### Integrands - -+------------------------------------+----------------------------------+--------------------------------------+ -| \begin{array}{l} \ | $\begin{array}{l} | ![Integrands](images/Integrands.svg) | -| \displaystyle \int + \oint + \ | \displaystyle \int + \oint + | | -| `\iint + \oiint_i^n \\` \ | \iint + \oiint_i^n \\ | | -| \displaystyle \iiint + \oiiint + \ | \displaystyle \iiint + \oiiint + | | -| `\textstyle \int + \oint_i^n \\` \ | \textstyle \int + \oint_i^n \\ | | -| \iint + \oiint + \ | \iint + \oiint + | | -| \iiint + \oiiint \end{array} | \iiint + \oiiint \end{array}$ | | -+------------------------------------+----------------------------------+--------------------------------------+ - -#### Kern - -+----------------------------+-----------------------------+--------------------------+ -| \frac{a\kern{1em}b}{c}a \ | $\frac{a\kern{1em}b}{c}a | ![kern](images/kern.svg) | -| \kern{1em}b \ | \kern{1em}b | | -| \kern{1ex}c\kern{-0.25em}d | \kern{1ex}c\kern{-0.25em}d$ | | -+----------------------------+-----------------------------+--------------------------+ - - -#### Lap - -+----------------------------------------------------+--------------------------------------------------+----------+ -| \begin{array}{l} \ | $\begin{array}{l} | ![lap][] | -| ab\mathllap{f}cd\mathrlap{g}hij\mathclap{k}lm \; \ | ab\mathllap{f}cd\mathrlap{g}hij\mathclap{k}lm \; | | -| ab\llap{f}cd\rlap{g}hij\clap{k}lm \\\\ \ | ab\llap{f}cd\rlap{g}hij\clap{k}lm \\ | | -| \mathrlap{\frac a b}\frac a b \\\\ \ | \mathrlap{\frac a b}{\frac a b} \\ | | -| \mathrlap{\overbrace{ \ | \mathrlap{\overbrace{ | | -| `\phantom{a_0+a_1+a_2}}^m}a_0+a_1+a_2` \ | \phantom{a_0+a_1+a_2}}^m}a_0+a_1+a_2 | | -| \end{array} | \end{array}$ | | -+----------------------------------------------------+--------------------------------------------------+----------+ - -[lap]: images/lap.svg - -#### LargeRuleNumerator - -+--------------------------+--------------------------+------------------------------------------------------+ -| \frac{\textcolor{blue} \ | $\frac{\textcolor{blue} | ![LargeRuleNumerator](images/LargeRuleNumerator.svg) | -| {\rule{1em}{2em}}}{x} | {\rule{1em}{2em}}}{x}$ | | -+--------------------------+--------------------------+------------------------------------------------------+ - -#### LaTeX - -+----------------------------+-------------------------------+----------------------------+ -| \text{\LaTeX}, \text{\TeX} | $\text{\LaTeX}, \text{\TeX}$ | ![latex](images/latex.svg) | -+----------------------------+-------------------------------+----------------------------+ - -#### LeftRight - -+----------------------------------+----------------------------------+------------------------------------+ -| \left( x^2 \right) \ | $\left( x^2 \right) | ![LeftRight](images/LeftRight.svg) | -| \left\\{ x^{x^{x^{x^x}}} \right. | \left\{ x^{x^{x^{x^x}}} \right.$ | | -+----------------------------------+----------------------------------+------------------------------------+ - -#### LeftRightListStyling - -+----------------------+-------------------------+----------------------------------------------------------+ -| a+\left(x+y\right)-x | $a+\left(x+y\right)-x$ | ![LeftRightListStyling](images/LeftRightListStyling.svg) | -+----------------------+-------------------------+----------------------------------------------------------+ - -#### LeftRightMiddle - -+----------------------------------------+----------------------------------------+----------------------+ -| \left( x^2 \middle/ \right) \ | $\left( x^2 \middle/ \right) | ![LeftRightMiddle][] | -| \left\\{ x^{x^{x^{x^x}}} \ | \left\{ x^{x^{x^{x^x}}} | | -| \middle/ y \right. \ | \middle/ y \right. | | -| \left(x\middle|y\\,\middle|\\,z\right) | \left(x\middle|y\,\middle|\,z\right)$ | | -+----------------------------------------+----------------------------------------+----------------------+ - -[LeftRightMiddle]: images/LeftRightMiddle.svg - -#### LeftRightStyleSizing - -+----------------------------------------+-----------------------------------------+---------------------------+ -| +\left\\{\rule{0.1em}{1em}\right. \ | $+\left\{\rule{0.1em}{1em}\right. | ![LeftRightStyleSizing][] | -| x^{+\left\\{\rule{0.1em}{1em}\right. \ | x^{+\left\{\rule{0.1em}{1em}\right. | | -| x^{+\left\\{\rule{0.1em}{1em}\right.}} | x^{+\left\{\rule{0.1em}{1em}\right.}}$ | | -+----------------------------------------+-----------------------------------------+---------------------------+ - -[LeftRightStyleSizing]: images/LeftRightStyleSizing.svg - -#### LimitControls - -+-------------------------------------------+------------------------------------------+--------------------+ -| `\displaystyle\int\limits_2^3 3x^2\,dx` \ | $\displaystyle\int\limits_2^3 3x^2\,dx | ![LimitControls][] | -| `+ \sum\nolimits^n_{i=1}i + ` \ | + \sum\nolimits^n_{i=1}i + | | -| `\textstyle\int\limits_x^y z ` | \textstyle\int\limits_x^y z$ | | -+-------------------------------------------+------------------------------------------+--------------------+ - -[LimitControls]: images/LimitControls.svg - -#### LowerAccent - -+--------------------------------------------------------+------------------------------------------------------+ -| \begin{array}{l} \ | $\begin{array}{l} | -| \underleftarrow{AB} \quad \underrightarrow{AB} \quad \ | \underleftarrow{AB} \quad \underrightarrow{AB} \quad | -| \underleftrightarrow{AB} \quad \undergroup{AB} \\\\ \ | \underleftrightarrow{AB} \quad \undergroup{AB} \\ | -| \text{\underline{text}} \quad \utilde{AB} \ | \text{\underline{text}} \quad \utilde{AB} | -| \quad \underrightarrow{AB} \\\\ \ | \quad \underrightarrow{AB} \\ | -| \underrightarrow{F} + \underrightarrow{AB} + \ | \underrightarrow{F} + \underrightarrow{AB} + | -| \underrightarrow{AB}^2 + \underrightarrow{AB}_2 \\\\ \ | \underrightarrow{AB}^2 + \underrightarrow{AB}_2 \\ | -| \frac{\underrightarrow{AB}}{\underrightarrow{AB}} + \ | \frac{\underrightarrow{AB}}{\underrightarrow{AB}} + | -| \sqrt{\underrightarrow{AB}} + \ | \sqrt{\underrightarrow{AB}} + | -| \left\lvert\underrightarrow{AB}\right\rvert \ | \left\lvert\underrightarrow{AB}\right\rvert | -| \end{array} | \end{array}$ | -+--------------------------------------------------------+------------------------------------------------------+ - -#### MathChoice - -+---------------------------------------------------+------------------------------------------------+-----------------+ -| {\displaystyle\mathchoice{D}{T}{S}{SS}}\\; \ | ${\displaystyle\mathchoice{D}{T}{S}{SS}}\; | ![MathChoice][] | -| {\textstyle\mathchoice{D}{T}{S}{SS}}\\; \ | {\textstyle\mathchoice{D}{T}{S}{SS}}\; | | -| {\scriptstyle \mathchoice{D}{T}{S}{SS}}\\; \ | {\scriptstyle \mathchoice{D}{T}{S}{SS}}\; | | -| {\scriptscriptstyle\mathchoice{D}{T}{S}{SS}}\\; \ | {\scriptscriptstyle\mathchoice{D}{T}{S}{SS}}\; | | -| \displaystyle X\_{\mathchoice{D}{T}{S}{SS}\_ \ | \displaystyle X_{\mathchoice{D}{T}{S}{SS}_ | | -| {\mathchoice{D}{T}{S}{SS}}} | {\mathchoice{D}{T}{S}{SS}}}$ | | -+---------------------------------------------------+------------------------------------------------+-----------------+ - -[MathChoice]: images/MathChoice.svg - -#### MathDefaultFonts - -+---------------------------------+------------------------------------+ -| Ax2k\breve{a}\omega\Omega\imath | $Ax2k\breve{a}\omega\Omega\imath$ | -+---------------------------------+------------------------------------+ - -#### MathBb - -+------------------------------------------+---------------------------------------------+ -| \mathbb{Ax2k\breve{a}\omega\Omega\imath} | $\mathbb{Ax2k\breve{a}\omega\Omega\imath}$ | -+------------------------------------------+---------------------------------------------+ - -#### MathBf - -+------------------------------------------+---------------------------------------------+ -| \mathbf{Ax2k\breve{a}\omega\Omega\imath} | $\mathbf{Ax2k\breve{a}\omega\Omega\imath}$ | -+------------------------------------------+---------------------------------------------+ - -#### MathCal - -+-------------------------------------------+----------------------------------------------+ -| \mathcal{Ax2k\breve{a}\omega\Omega\imath} | $\mathcal{Ax2k\breve{a}\omega\Omega\imath}$ | -+-------------------------------------------+----------------------------------------------+ - -#### MathFrak - -+--------------------------------------------+-----------------------------------------------+ -| \mathfrak{Ax2k\breve{a}\omega\Omega\imath} | $\mathfrak{Ax2k\breve{a}\omega\Omega\imath}$ | -+--------------------------------------------+-----------------------------------------------+ - -#### MathIt - -+------------------------------------------+---------------------------------------------+ -| \mathit{Ax2k\breve{a}\omega\Omega\imath} | $\mathit{Ax2k\breve{a}\omega\Omega\imath}$ | -+------------------------------------------+---------------------------------------------+ - -#### MathNormal - -+----------------------------------------------+-------------------------------------------------+ -| \mathnormal{Ax2k\breve{a}\omega\Omega\imath} | $\mathnormal{Ax2k\breve{a}\omega\Omega\imath}$ | -+----------------------------------------------+-------------------------------------------------+ - -#### MathOp - -+--------------------------------------+--------------------------------------+------------------------------+ -| a\mathop+b\mathop:c\mathop{\delta} \ | $a\mathop+b\mathop:c\mathop{\delta} | ![mathop](images/mathop.svg) | -| e\mathop{\textrm{and}}f \ | e\mathop{\textrm{and}}f | | -| \mathrel{\mathop{:}}=g\sin h | \mathrel{\mathop{:}}=g\sin h$ | | -+--------------------------------------+--------------------------------------+------------------------------+ - -#### MathRm - -+------------------------------------------+---------------------------------------------+ -| \mathrm{Ax2k\breve{a}\omega\Omega\imath} | $\mathrm{Ax2k\breve{a}\omega\Omega\imath}$ | -+------------------------------------------+---------------------------------------------+ - -#### MathSf - -+------------------------------------------+---------------------------------------------+ -| \mathsf{Ax2k\breve{a}\omega\Omega\imath} | $\mathsf{Ax2k\breve{a}\omega\Omega\imath}$ | -+------------------------------------------+---------------------------------------------+ - -#### MathScr - -+-------------------------------------------+----------------------------------------------+ -| \mathscr{Ax2k\breve{a}\omega\Omega\imath} | $\mathscr{Ax2k\breve{a}\omega\Omega\imath}$ | -+-------------------------------------------+----------------------------------------------+ - -#### MathtoolsMatrix - -+-----------------------+----------------------+------------------------------------------------+ -| \begin{matrix*}[l] \ | $\begin{matrix*}[l] | ![MathtoolsMatrix](images/MathtoolsMatrix.svg) | -| a & -1 \\\\ \ | a & -1 \\ | | -| -1 & d \ | -1 & d | | -| \end{matrix*} \\; \ | \end{matrix*} \; | | -| \begin{pmatrix*}[r] \ | \begin{pmatrix*}[r] | | -| a & -1 \\\\ \ | a & -1 \\ | | -| -1 & d \ | -1 & d | | -| \end{pmatrix*} | \end{pmatrix*}$ | | -+-----------------------+----------------------+------------------------------------------------+ - -#### MathTt - -+------------------------------------------+---------------------------------------------+ -| \mathtt{Ax2k\breve{a}\omega\Omega\imath} | $\mathtt{Ax2k\breve{a}\omega\Omega\imath}$ | -+------------------------------------------+---------------------------------------------+ - -#### Mod - -+-------------------------------------------+---------------------------------------+------------------------+ -| \begin{array}{cc} | $\begin{array}{cc} | ![mod](images/mod.svg) | -| a \bmod 2 & b \pod 3 \\\\ \ | a \bmod 2 & b \pod 3 \\ | | -| c \pmod{4} & d \mod{56} \\\\ \ | c \pmod{4} & d \mod{56} \\ | | -| \displaystyle a\bmod 2 & b \pod 3 \\\\ \ | \displaystyle a\bmod 2 & b \pod 3 \\ | | -| \displaystyle c\pmod{4} & d \mod{56} \ | \displaystyle c\pmod{4} & d \mod{56} | | -| \end{array} | \end{array}$ | | -+-------------------------------------------+---------------------------------------+------------------------+ - -#### NegativeSpace - -+-------------------------+----------------------------+--------------------------------------------+ -| \boxed{\$1,\!000,\!000} | $\boxed{\$1,\!000,\!000}$ | ![NegativeSpace](images/NegativeSpace.svg) | -+-------------------------+----------------------------+--------------------------------------------+ - -#### NestedFractions - -+--------------------------------------+-------------------------------------+----------------------+ -| \dfrac{\frac{a}{b}}{\frac{c}{d}} \ | $\dfrac{\frac{a}{b}}{\frac{c}{d}} | ![NestedFractions][] | -| \dfrac{\dfrac{a}{b}}{\dfrac{c}{d}} \ | \dfrac{\dfrac{a}{b}} {\dfrac{c}{d}} | | -| \frac{\frac{a}{b}}{\frac{c}{d}} | \frac{\frac{a}{b}}{\frac{c}{d}}$ | | -+--------------------------------------+-------------------------------------+----------------------+ - -[NestedFractions]: images/NestedFractions.svg - -#### NewLine - -+--------------------------------+--------------------------------+--------------------------------+ -| \frac{a^2+b^2}{c^2} \newline \ | $\frac{a^2+b^2}{c^2} \newline | ![newline](images/newline.svg) | -| \frac{a^2+b^2}{c^2} \\\\ \ | \frac{a^2+b^2}{c^2} \\ | | -| \begin{pmatrix} a & b \\\\ \ | \begin{pmatrix} a & b \\ | | -| c & d \cr \end{pmatrix} \\\\ \ | c & d \cr \end{pmatrix} \\ | | -| a+b+c+{d+\\\\e}+f+g | a+b+c+{d+\\e}+f+g$ | | -+--------------------------------+--------------------------------+--------------------------------+ - -#### Not - -+--------------------------------------------------------+----------------------------------------------------+----------+ -| \not = \begin{array}{l} \ | $\not = \begin{array}{l} | ![not][] | -| \not=\not>\not\geq\not\in\not<\not\leq\not{abc} \\\\ \ | \not=\not>\not\geq\not\in\not<\not\leq\not{abc} \\ | | -| \not xy + ab \not xy \\\\ \ | \not xy + ab \not xy \\ | | -| a \neq b \notin c \end{array} | a \neq b \notin c \end{array}$ | | -+--------------------------------------------------------+----------------------------------------------------+----------+ - -[not]: images/not.svg - -#### NullDelimiterInteraction - -+---------------------------------------+------------------------------------------+-------------------------------+ -| a \bigl. + 2 \quad \left. + a \right) | $a \bigl. + 2 \quad \left. + a \right)$ | ![NullDelimiterInteraction][] | -+---------------------------------------+------------------------------------------+-------------------------------+ - -[NullDelimiterInteraction]: images/NullDelimiterInteraction.svg - -#### OldFont - -+------------------------------------------------------+--------------------------------------------------+--------------+ -| \begin{matrix} \ | $\begin{matrix} | ![oldfont][] | -| \rm rm & it & \it it & \ | \rm rm & it & \it it & | | -| \bf bf & \sf sf & \tt tt \\\\ \ | \bf bf & \sf sf & \tt tt \\ | | -| \text{\rm rm} & \text{rm} & \text{\it it} & \ | \text{\rm rm} & \text{rm} & \text{\it it} & | | -| \text{\bf bf} & \text{\sf sf} & \text{\tt tt} \\\\ \ | \text{\bf bf} & \text{\sf sf} & \text{\tt tt} \\ | | -| i\rm r\it i & \text{r\it i\rm r} \ | i\rm r\it i & \text{r\it i\rm r} | | -| \end{matrix} | \end{matrix}$ | | -+------------------------------------------------------+--------------------------------------------------+--------------+ - -[oldfont]: images/oldfont.svg - -#### OperatorName - -+----------------------------------------------+------------------------------------------+-------------------+ -| \begin{matrix} | $\begin{matrix} | ![OperatorName][] | -| \operatorname g (z) + 5\operatorname{g}z \ | \operatorname g (z) + 5\operatorname{g}z | | -| + \operatorname{Gam-ma}(z) \\\\ \ | + \operatorname{Gam-ma}(z) \\ | | -| \operatorname{Gam ma}(z) \ | \operatorname{Gam ma}(z) | | -| + \operatorname{\Gamma}(z) \ | + \operatorname{\Gamma}(z) | | -| + \operatorname{}x \\\\ \ | + \operatorname{}x \\ | | -| \operatorname*{asin} x + \ | \operatorname*{asin} x + | | -| \operatorname*{asin}\_y x + \ | \operatorname*{asin}_y x + | | -| \operatorname*{asin}\limits\_y x \\\\ \ | \operatorname*{asin}\limits_y x \\ | | -| {\displaystyle \operatorname*{asin}\_y x} \ | {\displaystyle \operatorname*{asin}_y x} | | -| \end{matrix} | \end{matrix}$ | | -+----------------------------------------------+------------------------------------------+-------------------+ - -[OperatorName]: images/OperatorName.svg - -#### OpLimits - -+--------------------------------------------------------------+----------------------------------------------------------+---------------+ -| \begin{matrix} \ | $\begin{matrix} | | -| {\sin\_2^2 \lim\_2^2 \int\_2^2 \sum\_2^2} \ | {\sin_2^2 \lim_2^2 \int_2^2 \sum_2^2} | ![OpLimits][] | -| `{\displaystyle \lim_2^2 \int_2^2 \intop_2^2 \sum_2^2} \\` \ | {\displaystyle \lim_2^2 \int_2^2 \intop_2^2 \sum_2^2} \\ | | -| \limsup\_{x \rightarrow \infty} x \stackrel{?}= \ | \limsup_{x \rightarrow \infty} x \stackrel{?}= | | -| \liminf\_{x \rightarrow \infty} x \\\\ \ | \liminf_{x \rightarrow \infty} x \\ | | -| {\displaystyle \limsup\_{x \rightarrow \infty} \ | {\displaystyle \limsup_{x \rightarrow \infty} | | -| `x\:\: \sum_{\substack{00}\to0}}\\\\ \ | {\displaystyle\lim_{t\underset{>0}\to0}}\\ | | -| a+b+c+d\overset{b+c=0} \ | a+b+c+d\overset{b+c=0} | | -| \longrightarrow a+d\\\\ \ | \longrightarrow a+d\\ | | -| \overset { x = y } { \sqrt { a b } } \ | \overset { x = y } { \sqrt { a b } } | | -| \end{array} | \end{array}$ | | -+------------------------------------------------+--------------------------------------------+-------------------+ - -[OverUnderset]: images/OverUnderset.svg - -#### Phantom - -+-------------------------------------------------------+---------------------------------------------------+--------------+ -| \begin{array}{l} | $\begin{array}{l} | ![phantom][] | -| \dfrac{1+\phantom{x^{\textcolor{blue}{2}}} = x} \ | \dfrac{1+\phantom{x^{\textcolor{blue}{2}}} = x} | | -| {1+x^{\textcolor{blue}{2}} = x} \ | {1+x^{\textcolor{blue}{2}} = x} | | -| \left(\vphantom{\int_t} zzz \right) \ | \left(\vphantom{\int_t} zzz \right) | | -| \left( X \hphantom{\frac{\frac X X}{X}} \right)\\\\ \ | \left( X \hphantom{\frac{\frac X X}{X}} \right)\\ | | -| \text{a \phantom{123}} b \hphantom{\frac{1}{2}}=c \ | \text{a \phantom{123}} b \hphantom{\frac{1}{2}}=c | | -| \vphantom{101112} d \\\\ \ | \vphantom{101112} d \\ | | -| \sqrt{\mathstrut a} + \sqrt{\mathstrut d} \ | \sqrt{\mathstrut a} + \sqrt{\mathstrut d} | | -| \end{array} | \end{array}$ | | -+-------------------------------------------------------+---------------------------------------------------+--------------+ - -[phantom]: images/phantom.svg - -#### Pmb - -+----------------------------------+-------------------------------------+------------------------+ -| \mu\pmb{\mu}\pmb{=}\mu\pmb{+}\mu | $\mu\pmb{\mu}\pmb{=}\mu\pmb{+}\mu$ | ![pmb](images/pmb.svg) | -+----------------------------------+-------------------------------------+------------------------+ - -#### PrimeSpacing - -+------------------+-------------------+------------------------------------------+ -| `f'+f_2'+f^{f'}` | $f'+f_2'+f^{f'}$ | ![PrimeSpacing](images/PrimeSpacing.svg) | -+------------------+-------------------+------------------------------------------+ - -#### PrimeSuper - -+-----------------------------+------------------------------+--------------------------------------+ -| `x'^2+x'''^2+x'^2_3+x_3'^2` | $x'^2+x'''^2+x'^2_3+x_3'^2$ | ![PrimeSuper](images/PrimeSuper.svg) | -+-----------------------------+------------------------------+--------------------------------------+ - -#### Raisebox - -+-------------------------------------------------+--------------------------------------------------+---------------+ -| \frac{a}{a\raisebox{0.5em}{b}} \cdot \ | $\frac{a}{a\raisebox{0.5em}{b}} \cdot | ![raisebox][] | -| \frac{a\raisebox{-0.5em}{b}}{a} \cdot \ | \frac{a\raisebox{-0.5em}{b}}{a} \cdot | | -| \sqrt{a\raisebox{0.5em}{b}} \cdot \ | \sqrt{a\raisebox{0.5em}{b}} \cdot | | -| \sqrt{a\raisebox{-0.5em}{b}} \cdot \ | \sqrt{a\raisebox{-0.5em}{b}} \cdot | | -| \sqrt{a\raisebox{0.5em}{b}\raisebox{-0.5em}{b}} | \sqrt{a\raisebox{0.5em}{b}\raisebox{-0.5em}{b}}$ | | -+-------------------------------------------------+--------------------------------------------------+---------------+ - -[raisebox]: images/raisebox.svg - -#### RelativeUnits - -+------------------------------------------------+----------------------------------------------+--------------------+ -| \begin{array}{ll} \ | $\begin{array}{ll} | ![RelativeUnits][] | -| a\kern1emb^{a\kern1emb^{a\kern1emb}} & \ | a\kern1emb^{a\kern1emb^{a\kern1emb}} & | | -| {\footnotesize a\kern1emb^ \ | {\footnotesize a\kern1emb^ | | -| {a\kern1emb^{a\kern1emb}}} \\\\ \ | {a\kern1emb^{a\kern1emb}}} \\ | | -| a\mkern18mub^{a\mkern18mub^{a\mkern18mub}} & \ | a\mkern18mub^{a\mkern18mub^{a\mkern18mub}} & | | -| {\footnotesize a\mkern18mub^ \ | {\footnotesize a\mkern18mub^{a\mkern18mub^ | | -| {a\mkern18mub^{a\mkern18mub}}} \\\\ \ | {a\mkern18mub}}} \\ | | -| \end{array} | \end{array}$ | | -+------------------------------------------------+----------------------------------------------+--------------------+ - -[RelativeUnits]: images/RelativeUnits.svg - -#### RlapBug - -+-------------------------+---------------------------+--------------------------------+ -| \frac{\mathrlap{x}}{2} | $\frac{\mathrlap{x}}{2}$ | ![rlapbug](images/rlapbug.svg) | -+-------------------------+---------------------------+--------------------------------+ - -#### Rule - -+------------------------------------+-------------------------------------+--------------------------+ -| \rule{1em}{0.5em}\rule{1ex}{2ex} \ | $\rule{1em}{0.5em}\rule{1ex}{2ex} | ![rule](images/rule.svg) | -| \rule{1em}{1ex}\rule{1em}{0.431ex} | \rule{1em}{1ex}\rule{1em}{0.431ex}$ | | -+------------------------------------+-------------------------------------+--------------------------+ - -#### SizingBaseline - -+----------------------------------+-------------------------------------+----------------------------------------------+ -| \text{{\tiny a+b}a+b{\Huge a+b}} | $\text{{\tiny a+b}a+b{\Huge a+b}}$ | ![SizingBaseline](images/SizingBaseline.svg) | -+----------------------------------+-------------------------------------+----------------------------------------------+ - -#### Sizing - -+-----------------------------------+---------------------------------+------------------------------+ -| \text{{\Huge x}{\LARGE y} \ | $\text{{\Huge x}{\LARGE y} | ![sizing](images/sizing.svg) | -| {\normalsize z}{\scriptsize w}} \ | {\normalsize z}{\scriptsize w}} | | -| \sqrt[\text{\small 3}]{x+1} | \sqrt[\text{\small 3}]{x+1}$ | | -+-----------------------------------+---------------------------------+------------------------------+ - -#### Smash - -+-------------------------------+-------------------------------+----------------------------+ -| \left( X^{\smash 2} \right) \ | $\left( X^{\smash 2} \right) | ![smash](images/smash.svg) | -| \sqrt{\smash[b]{y=}} | \sqrt{\smash[b]{y=}}$ | | -+-------------------------------+-------------------------------+----------------------------+ - -#### Spacing - -+--------------------------------------------+----------------------------------------+--------------+ -| \begin{matrix} \ | $\begin{matrix} | ![spacing][] | -| `^3+[-1][1-1]1=1(=1)\lvert a\rvert~b \\` \ | ^3+[-1][1-1]1=1(=1)\lvert a\rvert~b \\ | | -| `\scriptstyle{^3+[-1][1-1]` \ | \scriptstyle{^3+[-1][1-1] | | -| 1=1(=1)\lvert a\rvert~b} \\\\ \ | 1=1(=1)\lvert a\rvert~b} \\ | | -| `\scriptscriptstyle{^3+[-1][1-1]` \ | \scriptscriptstyle{^3+[-1][1-1] | | -| 1=1(=1)\lvert a\rvert~b} \\\\ \ | 1=1(=1)\lvert a\rvert~b} \\ | | -| a : a \colon a \\\\ \ | a : a \colon a \\ | | -| \end{matrix} | \end{matrix}$ | | -+--------------------------------------------+----------------------------------------+--------------+ - -[spacing]: images/spacing.svg - -#### Sqrt - -+------------------------------------------------+----------------------------------------------+-----------+ -| \sqrt{\sqrt{\sqrt{x}}}\_ \ | $\sqrt{\sqrt{\sqrt{x}}}_ | ![sqrt][] | -| {\sqrt{\sqrt{x}}}^ \ | {\sqrt{\sqrt{x}}}^ | | -| {\sqrt{\sqrt{\sqrt{x}}} \ | {\sqrt{\sqrt{\sqrt{x}}} | | -| ^{\sqrt{\sqrt{\sqrt{x}}}}} \\\\ \ | ^{\sqrt{\sqrt{\sqrt{x}}}}} \\ | | -| \sqrt{\frac{\frac{A}{B}}{\frac{A}{B}}} \\; \ | \sqrt{\frac{\frac{A}{B}}{\frac{A}{B}}} \; | | -| \sqrt{\frac{\frac{\frac{A}{B}}{\frac{A}{B}}} \ | \sqrt{\frac{\frac{\frac{A}{B}}{\frac{A}{B}}} | | -| {\frac{\frac{A}{B}}{\frac{A}{B}}}} | {\frac{\frac{A}{B}}{\frac{A}{B}}}}$ | | -+------------------------------------------------+----------------------------------------------+-----------+ - -[sqrt]: images/sqrt.svg - -#### SqrtRoot - -+------------------------------------------------------+--------------------------------------------------+---------------+ -| \begin{array}{l} \ | $\begin{array}{l} | ![SqrtRoot][] | -| 1+\sqrt[3]{2}+\sqrt[1923^234] \ | 1+\sqrt[3]{2}+\sqrt[1923^234] | | -| {2^{2^{2^{2^{2^{2^{2^{2^{2^{2^{2^2}}}}}}}}}}} \\\\ \ | {2^{2^{2^{2^{2^{2^{2^{2^{2^{2^{2^2}}}}}}}}}}} \\ | | -| \Huge \sqrt[3]{M} + x^{\sqrt[3] a} \ | \Huge \sqrt[3]{M} + x^{\sqrt[3] a} | | -| \end{array} | \end{array}$ | | -+------------------------------------------------------+--------------------------------------------------+---------------+ - -[SqrtRoot]: images/SqrtRoot.svg - -#### StackRel - -+----------------------------+-----------------------------+----------------------------------+ -| a \stackrel{?}{=} b \ | $a \stackrel{?}{=} b | ![StackRel](images/StackRel.svg) | -| \stackrel{\text{def}}{=} c | \stackrel{\text{def}}{=} c$ | | -+----------------------------+-----------------------------+----------------------------------+ - -#### StretchyAccent - -+---------------------------------------------------------+--------------------------------------------------------+---------------------+ -| \begin{array}{l} \ | $\begin{array}{l} | ![StretchyAccent][] | -| \overrightarrow{AB} \quad \overleftarrow{AB} \quad \ | \overrightarrow{AB} \quad \overleftarrow{AB} \quad | | -| \overleftrightarrow{AB} \quad \ | \overleftrightarrow{AB} \quad | | -| \left(\underleftarrow{\frac{value}{j}}\right) \\\\ \ | \left(\underleftarrow{\frac{value}{j}}\right) \\ | | -| \widehat{ABC} \quad \ | \widehat{ABC} \quad | | -| \widetilde{AB} \quad \widetilde{ABC} \\\\ \ | \widetilde{AB} \quad \widetilde{ABC} \\ | | -| \overrightarrow{F} + \overrightarrow{AB} + \ | \overrightarrow{F} + \overrightarrow{AB} + | | -| \overrightarrow{F}^2 + \overrightarrow{F}\_2 + \ | \overrightarrow{F}^2 + \overrightarrow{F}_2 + | | -| \overrightarrow{F}\_1^2 \\\\ \ | \overrightarrow{F}_1^2 \\ | | -| \overrightarrow{AB}^2+ \ | \overrightarrow{AB}^2+ | | -| \frac{\overrightarrow{AB}}{\overrightarrow{AB}} + \ | \frac{\overrightarrow{AB}}{\overrightarrow{AB}} + | | -| \sqrt{\overrightarrow{AB}} + \ | \sqrt{\overrightarrow{AB}} + | | -| \left\lvert\overrightarrow{AB}\right\rvert | \left\lvert\overrightarrow{AB}\right\rvert | | -| \end{array} | \end{array}$ | | -+---------------------------------------------------------+--------------------------------------------------------+---------------------+ - -[StretchyAccent]: images/StretchyAccent.svg - -#### StrikeThrough - -+-------------------------------------------+----------------------------------------+--------------------+ -| \begin{array}{l} \ | $\begin{array}{l} | ![StrikeThrough][] | -| \cancel x \quad \cancel{2B} + \ | \cancel x \quad \cancel{2B} + | | -| \bcancel 5 +\bcancel{5ay} \\\\ \ | \bcancel 5 +\bcancel{5ay} \\ | | -| \sout{5ab} + \sout{5ABC} + \ | \sout{5ab} + \sout{5ABC} + | | -| \xcancel{\oint\_S{\vec E\cdot\hat n \ | \xcancel{\oint_S{\vec E\cdot\hat n | | -| \\,\mathrm d a}} \\\\[0.3em] \ | \,\mathrm d a}} \\[0.3em] | | -| \frac{x+\cancel B}{x+\cancel x} + \ | \frac{x+\cancel B}{x+\cancel x} + | | -| \frac{x+\cancel y}{x} + \cancel{B}\_1^2 \ | \frac{x+\cancel y}{x} + \cancel{B}_1^2 | | -| + \cancel{B^2} \\\\[0.2em] \ | + \cancel{B^2} \\[0.2em] | | -| \left\lvert\cancel{ac}\right\rvert \ | \left\lvert\cancel{ac}\right\rvert | | -| \end{array} | \end{array}$ | | -+-------------------------------------------+----------------------------------------+--------------------+ - -[StrikeThrough]: images/StrikeThrough.svg - -#### StrikeThroughColor - -+----------------------------------------------------------+------------------------------------------------------+-------------------------+ -| \begin{array}{l} | $\begin{array}{l} | ![StrikeThroughColor][] | -| \textcolor{red}{\cancel x \quad \cancel{2B}} \\\\ \ | \textcolor{red}{\cancel x \quad \cancel{2B}} \\ | | -| \textcolor{red}{\bcancel{\textcolor{black}{5}}} + \ | \textcolor{red}{\bcancel{\textcolor{black}{5}}} + | | -| \textcolor{red}{\bcancel{\textcolor{black}{5ay}}} \\\\ \ | \textcolor{red}{\bcancel{\textcolor{black}{5ay}}} \\ | | -| \color{green}{\sout{5ABC}} \ | \color{green}{\sout{5ABC}} | | -| \end{array} | \end{array}$ | | -+----------------------------------------------------------+------------------------------------------------------+-------------------------+ - -[StrikeThroughColor]: images/StrikeThroughColor.svg - -#### StyleSpacing - -+----------------------+------------------------+------------------------------------------+ -| \scriptstyle ab\\;cd | $\scriptstyle ab\;cd$ | ![StyleSpacing](images/StyleSpacing.svg) | -+----------------------+------------------------+------------------------------------------+ - -#### StyleSwitching - -+---------------------------------------+----------------------------------------+---------------------+ -| a\cdot b\scriptstyle a\cdot ba \ | $a\cdot b\scriptstyle a\cdot ba | ![StyleSwitching][] | -| \textstyle\cdot ba\scriptstyle\cdot b | \textstyle\cdot ba\scriptstyle\cdot b$ | | -+---------------------------------------+----------------------------------------+---------------------+ - -[StyleSwitching]: images/StyleSwitching.svg - -#### SupSubCharacterBox - -+------------------------------------------+-------------------------------------------+-------------------------+ -| `a_2f_2{f}_2{aa}_2{af}_2\mathbf{y}_Ay_A` | $a_2f_2{f}_2{aa}_2{af}_2\mathbf{y}_Ay_A$ | ![SupSubCharacterBox][] | -+------------------------------------------+-------------------------------------------+-------------------------+ - -[SupSubCharacterBox]: images/SupSubCharacterBox.svg - -#### SupSubHorizSpacing - -+------------------------------------+----------------------------------+-------------------------+ -| `x^{x^{x}}\Big|` \ | $x^{x^{x}}\Big| | ![SupSubHorizSpacing][] | -| `x_{x_{x_{x_{x}}}}\bigg|` \ | x_{x_{x_{x_{x}}}}\bigg| | | -| `x^{x^{x_{x_{x_{x_{x}}}}}}\bigg|` | x^{x^{x_{x_{x_{x_{x}}}}}}\bigg|$ | | -+------------------------------------+----------------------------------+-------------------------+ - -[SupSubHorizSpacing]: images/SupSubHorizSpacing.svg - -#### SupSubLeftAlignReset - -+-------------------------------------------+----------------------------------------+---------------------------+ -| \omega^8\_{888} \quad \ | $\omega^8_{888} \quad | ![SupSubLeftAlignReset][] | -| \frac{1}{\hat{\omega}^{8}\_{888}} \quad \ | \frac{1}{\hat{\omega}^{8}_{888}} \quad | | -| \displaystyle\sum\_{\omega^{8}\_{888}} | \displaystyle\sum_{\omega^{8}_{888}}$ | | -+-------------------------------------------+----------------------------------------+---------------------------+ - -[SupSubLeftAlignReset]: images/SupSubLeftAlignReset.svg - -#### SupSubOffsets - -+-------------------------------------+-------------------------------------+--------------------+ -| \displaystyle \int_{2+3}x f^{2+3} \ | $\displaystyle \int_{2+3}x f^{2+3} | ![SupSubOffsets][] | -| +3\lim\_{2+3+4+5}f | +3\lim_{2+3+4+5}f$ | | -+-------------------------------------+-------------------------------------+--------------------+ - -[SupSubOffsets]: images/SupSubOffsets.svg - -#### SurrogatePairs - -| Source | Temml | -|-----------------------|------------------------| -| 𝐀𝐚𝟎𝐴𝑎𝑨𝒂𝔅𝔞𝔸𝒜 | $𝐀𝐚𝟎𝐴𝑎𝑨𝒂𝔅𝔞𝔸𝒜$ | -| 𝖠𝖺𝟢𝗔𝗮𝟬𝘈𝘢𝙰𝚊𝟶 | $𝖠𝖺𝟢𝗔𝗮𝟬𝘈𝘢𝙰𝚊𝟶$ | -| \text{𝐀𝐚𝟎𝐴𝑎𝑨𝒂𝔅𝔞𝔸𝒜} | $\text{𝐀𝐚𝟎𝐴𝑎𝑨𝒂𝔅𝔞𝔸𝒜}$ | -| \text{𝖠𝖺𝟢𝗔𝗮𝟬𝘈𝘢𝙰𝚊𝟶} | $\text{𝖠𝖺𝟢𝗔𝗮𝟬𝘈𝘢𝙰𝚊𝟶}$ | -| \mathrm{𝐀𝐚𝑨𝒂𝔅𝔞𝔸𝒜} | $\mathrm{𝐀𝐚𝑨𝒂𝔅𝔞𝔸𝒜}$ | - -#### Symbols1 - -+-------------------------------------------+-------------------------------------------+ -| \maltese\degree\standardstate\pounds\\$ \ | $\maltese\degree\standardstate\pounds\$ | -| \text{\maltese\degree\pounds\textdollar} | \text{\maltese\degree\pounds\textdollar}$ | -+-------------------------------------------+-------------------------------------------+ - -#### Tag - -+-----------------------------------+---------------------------------------+ -| \tag{$+$hi} \frac{x^2}{y}+x^{2^y} | $$\tag{$+$hi} \frac{x^2}{y}+x^{2^y}$$ | -+-----------------------------------+---------------------------------------+ -{colWidths="null 200"} - -#### Text - -+----------------------------------+-------------------------------------+--------------------------+ -| \frac{a}{b}\text{c~ {ab} \ e}+fg | $\frac{a}{b}\text{c~ {ab} \ e}+fg$ | ![text](images/text.svg) | -+----------------------------------+-------------------------------------+--------------------------+ - -#### TextSpace - -+-------------------------------------+-------------------------------+------------------------------------+ -| \begin{array}{l} \ | $\begin{array}{l} | ![TextSpace](images/TextSpace.svg) | -| \texttt{12345678901234} \\\\ \ | \texttt{12345678901234} \\ | | -| \texttt{A test 1~~2 \ \\ 3} \\\\ \ | \texttt{A test 1~~2\ \ 3} \\ | | -| \verb|A test 1 2 3| \ | \verb|A test 1 2 3| | | -| \end{array} | \end{array}$ | | -+-------------------------------------+-------------------------------+------------------------------------+ - -#### TextStacked - -+------------------------------------+----------------------------------+------------------+ -| \begin{matrix} \ | $\begin{matrix} | ![TextStacked][] | -| \textsf{abc123 \textbf{abc123} \ | \textsf{abc123 \textbf{abc123} | | -| \textit{abc123}}\\\\ \ | \textit{abc123}}\\ | | -| \text{abc123 \textbf{abc123} \ | \text{abc123 \textbf{abc123} | | -| \textit{abc123}}\\\\ \ | \textit{abc123}}\\ | | -| \textrm{abc123 \textbf{abc123} \ | \textrm{abc123 \textbf{abc123} | | -| \textit{abc123}}\\\\ \ | \textit{abc123}}\\ | | -| \textsf{\textrm{\textbf{abc123}} \ | \textsf{\textrm{\textbf{abc123}} | | -| \textbf{abc123} \ | \textbf{abc123} | | -| \textit{abc123}}\\\\ \ | \textit{abc123}}\\ | | -| \textit{abc123 \textbf{abc123} \ | \textit{abc123 \textbf{abc123} | | -| \textsf{abc123}}\\\\ \ | \textsf{abc123}}\\ | | -| \end{matrix} | \end{matrix}$ | | -+------------------------------------+----------------------------------+------------------+ - -[TextStacked]: images/TextStacked.svg - -#### TextWithMath - -+---------------------------------------------------+-----------------------------------------------+-------------------+ -| \begin{matrix} \ | $\begin{matrix} | ![TextWithMath][] | -| \text{for $a < b $ and $ c < d $}. \\\\ \ | \text{for $a < b $ and $ c < d $}. \\ | | -| \textsf{for $a < b $ and $ c < d $}. \\\\ \ | \textsf{for $a < b $ and $ c < d $}. \\ | | -| \textsf{for $a < b \textbf{ and } c < d $} \\\\ \ | \textsf{for $a < b \textbf{ and } c < d $} \\ | | -| \text{\sf for $a < b $ and $c < d $.} \ | \text{\sf for $a < b $ and $c < d $.} | | -| \end{matrix} | \end{matrix}$ | | -+---------------------------------------------------+-----------------------------------------------+-------------------+ - -[TextWithMath]: images/TextWithMath.svg - -#### Unicode - -| Source | Temml | -|----------------------|------------------------| -| \text{ÀàÇçÉéÏïÖöÛû} | $\text{ÀàÇçÉéÏïÖöÛû}$ | -| \text{БГДЖЗЙЛФЦШЫЮЯ} | $\text{БГДЖЗЙЛФЦШЫЮЯ}$ | -| \text{여보세요} | $\text{여보세요}$ | -| \text{私はバナナです} | $\text{私はバナナです}$ | - -#### Units - -+------------------------------------------------+----------------------------------------------+------------+ -| \begin{array}{ll} \ | $\begin{array}{ll} | ![units][] | -| \mathrm H\kern 1em\mathrm H \ | \mathrm H\kern 1em\mathrm H | | -| \text{\tiny (1em)} & \ | \text{\tiny (1em)} & | | -| \mathrm H\kern 1ex\mathrm H \ | \mathrm H\kern 1ex\mathrm H | | -| \text{\tiny (1ex)} \\\\ \ | \text{\tiny (1ex)} \\ | | -| \mathrm H{\scriptstyle \kern 1em}\mathrm H \ | \mathrm H{\scriptstyle \kern 1em}\mathrm H | | -| \text{\tiny (ss 1em)} & \ | \text{\tiny (ss 1em)} & | | -| \mathrm H{\scriptstyle \kern 1ex}\mathrm H \ | \mathrm H{\scriptstyle \kern 1ex}\mathrm H | | -| \text{\tiny (ss 1ex)} \\\\ \ | \text{\tiny (ss 1ex)} \\ | | -| \mathrm H{\small \kern 1em}\mathrm H \ | \mathrm H{\small \kern 1em}\mathrm H | | -| \text{\tiny (sm 1em)} & \ | \text{\tiny (sm 1em)} & | | -| \mathrm H{\small \kern 1ex}\mathrm H \ | \mathrm H{\small \kern 1ex}\mathrm H | | -| \text{\tiny (sm 1ex)} \\\\ \ | \text{\tiny (sm 1ex)} \\ | | -| \mathrm H\mkern 18mu\mathrm H \ | \mathrm H\mkern 18mu\mathrm H | | -| \text{\tiny (18mu)} & \ | \text{\tiny (18mu)} & | | -| \mathrm H\kern 1cm\mathrm H \ | \mathrm H\kern 1cm\mathrm H | | -| \text{\tiny (1cm)} \\\\ \ | \text{\tiny (1cm)} \\ | | -| \mathrm H{\scriptstyle \mkern 18mu}\mathrm H \ | \mathrm H{\scriptstyle \mkern 18mu}\mathrm H | | -| \text{\tiny (ss 18mu)} & \ | \text{\tiny (ss 18mu)} & | | -| \mathrm H{\scriptstyle \kern 1cm}\mathrm H \ | \mathrm H{\scriptstyle \kern 1cm}\mathrm H | | -| \text{\tiny (ss 1cm)} \\\\ \ | \text{\tiny (ss 1cm)} \\ | | -| \mathrm H{\small \mkern 18mu}\mathrm H \ | \mathrm H{\small \mkern 18mu}\mathrm H | | -| \text{\tiny (sm 18mu)} & \ | \text{\tiny (sm 18mu)} & | | -| \mathrm H{\small \kern 1cm}\mathrm H \ | \mathrm H{\small \kern 1cm}\mathrm H | | -| \text{\tiny (sm 1cm)} \ | \text{\tiny (sm 1cm)} | | -| \end{array} | \end{array}$ | | -+------------------------------------------------+----------------------------------------------+------------+ - -[units]: images/units.svg - -#### UnsupportedCmds - -$\err\,\frac\fracerr3\,2^\superr_\suberr\,\sqrt\sqrterr$ - -deliberately does not compile - -#### Verb - -+-------------------------------------------------------+---------------------------------------------------+-----------+ -| \begin{array}{ll} \ | $\begin{array}{ll} | ![verb][] | -| \verb \verb , & \verb|\verb |, \\\\ \ | \verb \verb , & \verb|\verb |, \\ | | -| \verb* \verb* , & \verb*|\verb* |, \\\\ \ | \verb* \verb* , & \verb*|\verb* |, \\ | | -| \verb! & ! & \scriptstyle\verb|ss verb| \\\\ \ | \verb! & ! & \scriptstyle\verb|ss verb| \\ | | -| \verb*! & ! & \small\verb|sm verb| \\\\ \ | \verb*! & ! & \small\verb|sm verb| \\ | | -| \verb|``---''~| \ | \verb|``---''~| | | -| \end{array} | \end{array}$ | | -+-------------------------------------------------------+---------------------------------------------------+-----------+ - -[verb]: images/verb.svg - - - \ No newline at end of file diff --git a/test/main.css b/test/main.css deleted file mode 100644 index aaffc0ba..00000000 --- a/test/main.css +++ /dev/null @@ -1,16 +0,0 @@ -body { - margin: 0; - padding: 0; - font-size: 24px; -} - -.math { - font-size: 24px; -} - -#input { - margin: 0; - font-size: 100%; - width: 100%; - box-sizing: border-box; -} diff --git a/test/mhchem-tests.md b/test/mhchem-tests.md deleted file mode 100644 index c80a5700..00000000 --- a/test/mhchem-tests.md +++ /dev/null @@ -1,279 +0,0 @@ - - - - - - Temml mhchem Tests - - - - - - - - -# mhchem - -This file contains all the examples in the `mhchem` manual.\ -Ref: https://mhchem.github.io/MathJax-mhchem/ - -## Chemical Equations (ce) - -| Source | Temml | -|------------------------------------------------|-------------------------| -| `\ce{CO2 + C -> 2 CO}` | $\ce{CO2 + C -> 2 CO}$ | -| `\ce{Hg^2+ ->[I-] HgI2 ->[I-] [Hg^{II}I4]^2-}` | $\ce{Hg^2+ ->[I-] HgI2 ->[I-] [Hg^{II}I4]^2-}$ | -| `C_p[\ce{H2O(l)}] = \pu{75.3 J // mol K}` | $C_p[\ce{H2O(l)}] = \pu{75.3 J // mol K}$ | - -## Chemical Formulae - -| Source | Temml | -|--------------|---------------| -| `\ce{H2O}` | $\ce{H2O}$ | -| `\ce{Sb2O3}` | $\ce{Sb2O3}$ | - -## Charges - -| Source | Temml | -|-----------------|------------------| -| `\ce{H+}` | $\ce{H+}$ | -| `\ce{CrO4^2-}` | $\ce{CrO4^2-}$ | -| `\ce{[AgCl2]-}` | $\ce{[AgCl2]-}$ | -| `\ce{Y^99+}` | $\ce{Y^99+}$ | -| `\ce{Y^{99+}}` | $\ce{Y^{99+}}$ | - -## Stoichiometric Numbers - -| Source | Temml | -|-----------------|--------------------| -| `\ce{2 H2O}` | $\ce{2 H2O}$ | -| `\ce{2H2O}` | $\ce{2H2O}$ | -| `\ce{0.5 H2O}` | $\ce{0.5 H2O}$ | -| `\ce{1/2 H2O}` | $\ce{1/2 H2O}$ | -| `\ce{(1/2) H2O}` | $\ce{(1/2) H2O}$ | -| `\ce{$n$ H2O}` | $\ce{ $n $ H2O}$ | - -## Isotopes - -+-----------------------+------------------------------+ -| `\ce{^{227}_{90}Th+}` | $\ce{^{227}_{90}Th+}$ | -+-----------------------+------------------------------+ -| `\ce{^227_90Th+}` | $\ce{^227_90Th+}$ | -+-----------------------+------------------------------+ -| `\ce{^{0}_{-1}n^{-}}` | $\ce{^{0}_{-1}n^{-}}$ | -+-----------------------+------------------------------+ -| `\ce{^0_-1n-}` | $\ce{^0_-1n-}$ | -+-----------------------+------------------------------+ -| `\ce{H{}^3HO}` | $\ce{H{}^3HO}$ | -+-----------------------+------------------------------+ -| `\ce{H^3HO}` | $\ce{H^3HO}$ | -+-----------------------+------------------------------+ - -## Reaction Arrows - -| Source | Temml | -|------------------|------------------| -| `\ce{A -> B}` | $\ce{A -> B}$ | -| `\ce{A <- B}` | $\ce{A <- B}$ | -| `\ce{A <-> B}` | $\ce{A <-> B}$ | -| `\ce{A <--> B}` | $\ce{A <--> B}$ | -| `\ce{A <=> B}` | $\ce{A <=> B}$ | -| `\ce{A <=>> B}` | $\ce{A <=>> B}$ | -| `\ce{A <<=> B}` | $\ce{A <<=> B}$ | -| `\ce{A ->[H2O] B}` | $\ce{A ->[H2O] B}$ | -| `\ce{A ->[{text above}][{text below}] B}` | $\ce{A ->[{text above}][{text below}] B}$ | -| `\ce{A ->[$x$][$x_i$] B}` | $\ce{A ->[ $x $][ $x_i $] B}$ | - -## Parentheses, Brackets, Braces - -| Source | Temml | -|------------------------|------------------| -| `\ce{(NH4)2S}` | $\ce{(NH4)2S}$ | -| `\ce{[\{(X2)3\}2]^3+}` | $\ce{[\{(X2)3\}2]^3+}$ | -| `\ce{CH4 + 2 $\left( \ce{O2 + 79/21 N2} \right)$}` | $\ce{CH4 + 2 $\left( \ce{O2 + 79/21 N2} \right) $}$ | - -## States of Aggregation - -| Source | Temml | -|--------------------------|-----------------------------| -| `\ce{H2(aq)}` | $\ce{H2(aq)}$ | -| `\ce{CO3^2-_{(aq)}}` | $\ce{CO3^2-_{(aq)}}$ | -| `\ce{NaOH(aq,$\infty$)}` | $\ce{NaOH(aq, $\infty $)}$ | - -## Crystal Systems - -| Source | Temml | -|--------------------|----------------------| -| `\ce{ZnS($c$)}` | $\ce{ZnS( $c $)}$ | -| `\ce{ZnS(\ca$c$)}` | $\ce{ZnS(\ca $c $)}$ | - -## Variables - -+--------------------------------+--------------------------------+ -| Source | Temml | -+================================+================================+ -| `\ce{NO_x}` | $\ce{NO_x}$ | -+--------------------------------+--------------------------------+ -| `\ce{Fe^n+}` | $\ce{Fe^n+}$ | -+--------------------------------+--------------------------------+ -| \ce{x Na(NH4)HPO4 ->[\Delta] \ | $\ce{x Na(NH4)HPO4 ->[\Delta] | -| (NaPO3)_x + x NH3 ^ + x H2O} | (NaPO3)_x + x NH3 ^ + x H2O}$ | -+--------------------------------+--------------------------------+ - -## Greek Characters - -| Source | Temml | -|------------------------------------|---------------------| -| `\ce{\mu-Cl}` | $\ce{\mu-Cl}$ | -| `\ce{[Pt(\eta^2-C2H4)Cl3]-}` | $\ce{[Pt(\eta^2-C2H4)Cl3]-}$ | -| `\ce{\beta +}` | $\ce{\beta +}$ | -| `\ce{^40_18Ar + \gamma{} + \nu_e}` | $\ce{^40_18Ar + \gamma{} + \nu_e}$ | - -## (Italic) Math - -| Source | Temml | -|-------------------------------|------------------| -| `\ce{NaOH(aq,$\infty$)}` | $\ce{NaOH(aq, $\infty $)}$ | -| `\ce{Fe(CN)_{$\frac{6}{2}$}}` | $\ce{Fe(CN)_{{ $\frac{6}{2} $}}}$ | -| `\ce{X_{$i$}^{$x$}}` | $\ce{X_{ $i $}^{ $x $}}$ | -| `\ce{X_$i$^$x$}` | $\ce{X_{ $i $}^{ $x $}}$ | - -## Italic Text - -| Source | Temml | -|-------------------------------|------------------| -| `\ce{$cis${-}[PtCl2(NH3)2]}` | $\ce{ $cis ${-}[PtCl2(NH3)2]}$ | -| `\ce{CuS($hP12$)}` | $\ce{CuS( $hP12 $)}$ | - -## Upright Text, Escape Parsing - -| Source | Temml | -|---------------------------------|------------------| -| `\ce{{Gluconic Acid} + H2O2}` | $\ce{{Gluconic Acid} + H2O2}$ | -| `\ce{X_{{red}}}` | $\ce{X_{{red}}}$ | -| `\ce{{(+)}_589{-}[Co(en)3]Cl3}` | $\ce{{(+)}_589{-}[Co(en)3]Cl3}$ | - -## Bonds - -| Source | Temml | -|------------------------------------------|------------------| -| `\ce{C6H5-CHO}` | $\ce{C6H5-CHO}$ | -| `\ce{A-B=C#D}` | $\ce{A-B=C#D}$ | -| `\ce{A\bond{-}B\bond{=}C\bond{#}D}` | $\ce{A\bond{-}B\bond{=}C\bond{#}D}$ | -| `\ce{A\bond{1}B\bond{2}C\bond{3}D}` | $\ce{A\bond{1}B\bond{2}C\bond{3}D}$ | -| `\ce{A\bond{~}B\bond{~-}C}` | $\ce{A\bond{~}B\bond{~-}C}$ | -| `\ce{A\bond{~--}B\bond{~=}C\bond{-~-}D}` | $\ce{A\bond{~--}B\bond{~=}C\bond{-~-}D}$ | -| `\ce{A\bond{...}B\bond{....}C}` | $\ce{A\bond{...}B\bond{....}C}$ | -| `\ce{A\bond{->}B\bond{<-}C}` | $\ce{A\bond{->}B\bond{<-}C}$ | - -## Addition Compounds - -| Source | Temml | -|---------------------------|------------------| -| `\ce{KCr(SO4)2*12H2O}` | $\ce{KCr(SO4)2*12H2O}$ | -| `\ce{KCr(SO4)2.12H2O}` | $\ce{KCr(SO4)2.12H2O}$ | -| `\ce{KCr(SO4)2 * 12 H2O}` | $\ce{KCr(SO4)2 * 12 H2O}$ | - -## Oxidation States - -| Source | Temml | -|---------------------------|------------------| -| `\ce{Fe^{II}Fe^{III}2O4}` | $\ce{Fe^{II}Fe^{III}2O4}$ | - -## Unpaired Electrons, Radical Dots - -| Source | Temml | -|-------------------|--------------------| -| `\ce{OCO^{.-}}` | $\ce{OCO^{.-}}$ | -| `\ce{NO^{(2.)-}}` | $\ce{NO^{(2.)-}}$ | - -## Kröger-Vink Notation - -+------------------------------------+------------------------------------------+ -| Source | Temml | -+====================================+==========================================+ -| `\ce{Li^x_{Li,1-2x}Mg^._{Li,x}` \ | $\ce{Li^x_{Li,1-2x}Mg^._{Li,x} | -| ``$V$'_{Li,x}Cl^x_{Cl}}`` | $V $'_{Li,x}Cl^x_{Cl}}$ | -+------------------------------------+------------------------------------------+ -| ```\ce{O''_{i,x}}``` | $\ce{O''_{i,x}}$ | -+------------------------------------+------------------------------------------+ -| `\ce{M^{..}_i}` | $\ce{M^{..}_i}$ | -+------------------------------------+------------------------------------------+ -| ``\ce{$V$^{4'}_{Ti}}`` | $\ce{ $V $^{4'}_{Ti}}$ | -+------------------------------------+------------------------------------------+ -| `\ce{V_{V,1}C_{C,0.8}$V$_{C,0.2}}` | $\ce{V_{V,1}C_{C,0.8} $V $_{C,0.2}}$ | -+------------------------------------+------------------------------------------+ - -## Equation Operators - -| Source | Temml | -|----------------|-----------------| -| `\ce{A + B}` | $\ce{A + B}$ | -| `\ce{A - B}` | $\ce{A - B}$ | -| `\ce{A = B}` | $\ce{A = B}$ | -| `\ce{A \pm B}` | $\ce{A \pm B}$ | - -## Precipitate and Gas - -| Source | Temml | -|----------------------------------|------------------| -| `\ce{SO4^2- + Ba^2+ -> BaSO4 v}` | $\ce{SO4^2- + Ba^2+ -> BaSO4 v}$ | -| `\ce{A v B (v) -> B ^ B (^)}` | $\ce{A v B (v) -> B ^ B (^)}$ | - -## Other Symbols and Shortcuts - -| Source | Temml | -|---------------------|----------------| -| `\ce{NO^*}` | $\ce{NO^*}$ | -| `\ce{1s^2-N}` | $\ce{1s^2-N}$ | -| `\ce{n-Pr}` | $\ce{n-Pr}$ | -| `\ce{iPr}` | $\ce{iPr}$ | -| `\ce{\ca Fe}` | $\ce{\ca Fe}$ | -| `\ce{A, B, C; F}` | $\ce{A, B, C; F}$ | -| `\ce{{and others}}` | $\ce{{and others}}$ | - -## Complex Examples - -+---------------------------------------------+-------------------------------------------+ -| Source | Temml | -+=============================================+===========================================+ -| `\ce{Zn^2+ <=>[+ 2OH-][+ 2H+]` \ | $\ce{Zn^2+ <=>[+ 2OH-][+ 2H+] | -| `$\underset{\text{amphoteres Hydroxid}}` \ | $\underset{\text{amphoteres Hydroxid}} | -| `{\ce{Zn(OH)2 v}}$ <=>[+ 2OH-][+ 2H+]` \ | {\ce{Zn(OH)2 v}} $ <=>[+ 2OH-][+ 2H+] | -| `$\underset{\text{Hydroxozikat}}` \ | { $\underset{\text{Hydroxozikat}} | -| `{\ce{[Zn(OH)4]^2-}}$}` | {\ce{[Zn(OH)4]^2-}} $}}$ | -+---------------------------------------------+-------------------------------------------+ -| `\ce{$K = \frac{[\ce{Hg^2+}][\ce{Hg}]}` \ | $\ce{ $K = \frac{[\ce{Hg^2+}][\ce{Hg}]} | -| `{[\ce{Hg2^2+}]}$}` | {[\ce{Hg2^2+}]} $}$ | -+---------------------------------------------+-------------------------------------------+ -| `\ce{$K =` \ | $\ce{ $K = | -| `\ce{\frac{[Hg^2+][Hg]}{[Hg2^2+]}}$}` | \ce{\frac{[Hg^2+][Hg]}{[Hg2^2+]}} $}$ | -+---------------------------------------------+-------------------------------------------+ -| `\ce{Hg^2+ ->[I-]` \ | $\ce{Hg^2+ ->[I-] | -| `$\underset{\mathrm{red}}{\ce{HgI2}}$` \ | $\underset{\mathrm{red}}{\ce{HgI2}} $ | -| `->[I-] $\underset{\mathrm{red}}` \ | ->[I-] $\underset{\mathrm{red}} | -| `{\ce{[Hg^{II}I4]^2-}}$}` | {\ce{[Hg^{II}I4]^2-}} $}$ | -+---------------------------------------------+-------------------------------------------+ - -## Physical Units - -| Source | Temml | -|---------------------|-----------------| -| `\pu{123 kJ}` | $\pu{123 kJ}$ | -| `\pu{123 mm2}` | $\pu{123 mm2}$ | -| `\pu{123 J s}` | $\pu{123 J s}$ | -| `\pu{123 J*s}` | $\pu{123 J*s}$ | -| `\pu{123 kJ/mol}` | $\pu{123 kJ/mol}$ | -| `\pu{123 kJ//mol}` | $\pu{123 kJ//mol}$ | -| `\pu{123 kJ mol-1}` | $\pu{123 kJ mol-1}$ | -| `\pu{123 kJ*mol-1}` | $\pu{123 kJ*mol-1}$ | -| `\pu{1.2e3 kJ}` | $\pu{1.2e3 kJ}$ | -| `\pu{1,2e3 kJ}` | $\pu{1,2e3 kJ}$ | -| `\pu{1.2E3 kJ}` | $\pu{1.2E3 kJ}$ | -| `\pu{1,2E3 kJ}` | $\pu{1,2E3 kJ}$ | - - - \ No newline at end of file diff --git a/test/mozilla-tests.md b/test/mozilla-tests.md deleted file mode 100644 index f941cb1d..00000000 --- a/test/mozilla-tests.md +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - Temml Mozilla Tests - - - - - - - - -# Mozilla Torture Test - -This page reproduces the tests from \ -https://www-archive.mozilla.org/projects/mathml/demo/texvsmml.xhtml and \ -https://fred-wang.github.io/MathFonts/mozilla\_mathml\_test/ - -Images from LaTeX are also included for comparison. - -
    - -+----+------------------------------+------------------------------+-----------+--------------+ -| | Source | Temml | LaTeX | Comment | -+====+==============================+==============================+===========+==============+ -| 1 | x^2y^2 | $$x^2y^2$$ | ![ex1][] | TeXbook p128 | -+----+------------------------------+------------------------------+-----------+--------------+ -| 2 | \_2F\_3 | $$_2F_3$$ | ![ex2][] | TeXbook p128 | -+----+------------------------------+------------------------------+-----------+--------------+ -| 3 | x+y^2\over k+1 | $$x+y^2\over k+1$$ | ![ex3][] | TeXbook p139 | -+----+------------------------------+------------------------------+-----------+--------------+ -| 4 | x+y^{2\over k+1} | $$x+y^{2\over k+1}$$ | ![ex4][] | TeXbook p139 | -+----+------------------------------+------------------------------+-----------+--------------+ -| 5 | a\over{b/2} | $$a\over{b/2}$$ | ![ex5][] | TeXbook p139 | -+----+------------------------------+------------------------------+-----------+--------------+ -| 6 | a\_0 + \cfrac{1}{a\_1 + \ | $$a_0 + \cfrac{1}{a_1 + | ![ex6][] | TeXbook p142 | -| | \cfrac{1}{a\_2 + \ | \cfrac{1}{a_2 + | | | -| | \cfrac{1}{a\_3 + \ | \cfrac{1}{a_3 + | | | -| | \cfrac{1}{a\_4}}}} | \cfrac{1}{a_4}}}}$$ | | | -+----+------------------------------+------------------------------+-----------+--------------+ -| 7 | a\_0+{1\over a\_1+{1\over \ | $$a_0+{1\over a_1+{1\over | ![ex7][] | TeXbook p142 | -| | a\_2+{1\over a\_3+ \ | a_2+{1\over a_3+ | | | -| | {1\over a\_4}}}} | {1\over a_4}}}}$$ | | | -+----+------------------------------+------------------------------+-----------+--------------+ -| 8 | n\choose {k / 2} | $$n\choose {k / 2}$$ | ![ex8][] | TeXbook p143 | -+----+------------------------------+------------------------------+-----------+--------------+ -| 9 | {p \choose 2} x^2 y^{p-2} \ | $${p \choose 2} x^2 y^{p-2} | ![ex9][] | TeXbook p143 | -| | - {1\over{1-x}} \ | - {1\over{1-x}} | | | -| | {1\over{1-x^2}} | {1\over{1-x^2}}$$ | | | -+----+------------------------------+------------------------------+-----------+--------------+ -| 10 | \sum\_{\scriptstyle 0 \le\ | $$\sum_{\scriptstyle 0 \le | ![ex10][] | TeXbook p145 | -| | i \le m \atop \scriptstyle\ | i \le m \atop \scriptstyle | | | -| | 0 < j < n} P(i, j) | 0 < j < n} P(i, j)$$ | | | -+----+------------------------------+------------------------------+-----------+--------------+ -| 11 | x^{2y} | $$x^{2y}$$ | ![ex11][] | TeXbook p128 | -+----+------------------------------+------------------------------+-----------+--------------+ -| 12 | \sum\_{i=1}^p \ | $$\sum_{i=1}^p | ![ex12][] | TeXbook p145 | -| | \sum\_{j=1}^q \ | \sum_{j=1}^q | | | -| | \sum\_{k=1}^r \ | \sum_{k=1}^r | | | -| | a\_{ij}b\_{jk}c\_{ki} | a_{ij}b_{jk}c_{ki}$$ | | | -+----+------------------------------+------------------------------+-----------+--------------+ -| 13 | \sqrt{1+\sqrt{1+\sqrt{1+ \ | $$\sqrt{1+\sqrt{1+\sqrt{1+ | ![ex13][] | TeXbook p145 | -| | \sqrt{1+\sqrt{1+\sqrt{1+ \ | \sqrt{1+\sqrt{1+\sqrt{1+ | | | -| | \sqrt{1+x}}}}}}} | \sqrt{1+x}}}}}}}$$ | | | -+----+------------------------------+------------------------------+-----------+--------------+ -| 14 | \bigg(\frac{\partial^2} \ | $$\bigg(\frac{\partial^2} | ![ex14][] | TeXbook p147 | -| | {\partial x^2} + \frac \ | {\partial x^2} + \frac | | | -| | {\partial^2}{\partial y^2}\ | {\partial^2}{\partial y^2} | | | -| | \bigg){\big\lvert\varphi \ | \bigg){\big\lvert\varphi | | | -| | (x+iy)\big\rvert}^2 | (x+iy)\big\rvert}^2$$ | | | -+----+------------------------------+------------------------------+-----------+--------------+ -| 15 | 2^{2^{2^x}} | $$2^{2^{2^x}}$$ | ![ex15][] | TeXbook p128 | -+----+------------------------------+------------------------------+-----------+--------------+ -| 16 | \int\_1^x {dt\over t} | $$\int_1^x {dt\over t}$$ | ![ex16][] | TeXbook p168 | -+----+------------------------------+------------------------------+-----------+--------------+ -| 17 | \int\\!\\!\\!\int\_D dx\,dy | $$\int\!\!\!\int_D dx\,dy$$ | ![ex17][] | TeXbook p169 | -+----+------------------------------+------------------------------+-----------+--------------+ -| 18 | f(x) = \begin{cases}1/3 & \ | $$f(x) = \begin{cases}1/3 & | ![ex18][] | TeXbook p175 | -| | \text{if }0 \le x \le 1; \ | \text{if }0 \le x \le 1; \\ | | | -| | \\\\ \ | 2/3 & \text{if }3\le x \le | | | -| | 2/3 & \text{if }3\le x \le \ | 4;\\ 0 & \text{elsewhere.} | | | -| | 4;\\\\ 0 &\text{elsewhere.}\ | \end{cases}$$ | | | -| | \end{cases} | | | | -+----+------------------------------+------------------------------+-----------+--------------+ -| 19 | \overbrace{x +\cdots + x} \ | $$\overbrace{x +\cdots + x} | ![ex19][] | TeXbook p176 | -| | ^{k \text{ times}} | ^{k \text{ times}}$$ | | | -+----+------------------------------+------------------------------+-----------+--------------+ -| 20 | y\_{x^2} | $$y_{x^2}$$ | ![ex20][] | TeXbook p128 | -+----+------------------------------+------------------------------+-----------+--------------+ -| 21 | \sum\_{p\text{ prime}} \ | $$\sum_{p\text{ prime}}f(p) | ![ex21][] | TeXbook p181 | -| | f(p)=\int\_{t>1} f(t)d\pi(t) | =\int_{t>1} f(t)d\pi(t)$$ | | | -+----+------------------------------+------------------------------+-----------+--------------+ -| 22 | \{\underbrace{\overbrace{ \ | $$\{\underbrace{\overbrace{ | ![ex22][] | TeXbook p181 | -| | \mathstrut a,\dots,a}^{k \ | \mathstrut a,\dots,a}^{k | | | -| | \,a\rq\text{s}},\overbrace{\ | \,a\rq\text{s}},\overbrace{ | | | -| | \mathstrut b,\dots,b}^{l\,\ | \mathstrut b,\dots,b}^{l\, | | | -| | b\rq\text{s}}}\_{k+l \ | b\rq\text{s}}}_{k+l | | | -| | \text{ elements}}\} | \text{ elements}}\}$$ | | | -+----+------------------------------+------------------------------+-----------+--------------+ -| 23 | \begin{pmatrix} \ | $$\begin{pmatrix} | ![ex23][] | TeXbook p181 | -| | \begin{pmatrix}a&b\\\\c&d \ | \begin{pmatrix}a&b\\c&d | | | -| | \end{pmatrix} & \ | \end{pmatrix} & | | | -| | \begin{pmatrix}e&f\\\\g&h \ | \begin{pmatrix}e&f\\g&h | | | -| | \end{pmatrix} \\\\ 0 & \ | \end{pmatrix} \\ 0 & | | | -| | \begin{pmatrix}i&j\\\\k&l \ | \begin{pmatrix}i&j\\k&l | | | -| | \end{pmatrix} \ | \end{pmatrix} | | | -| | \end{pmatrix} | \end{pmatrix}$$ | | | -+----+------------------------------+------------------------------+-----------+--------------+ -| 24 | `\det\begin{vmatrix}` \ | $$\det\begin{vmatrix} | ![ex24][] | TeXbook p181 | -| | `c_0&c_1&c_2&\dots& c_n\\`\ `| c_0&c_1&c_2&\dots& c_n\\ | | | -| | `c_1 & c_2 & c_3 & \dots &`\ | c_1 & c_2 & c_3 & \dots & | | | -| | `c_{n+1}\\ c_2 & c_3 & c_4`\ | c_{n+1}\\ c_2 & c_3 & c_4 | | | -| | `&\dots & c_{n+2}\\ \vdots`\ | &\dots & c_{n+2}\\ \vdots | | | -| | `&\vdots&\vdots & &\vdots` \ | &\vdots&\vdots & &\vdots | | | -| | `\\c_n & c_{n+1} & c_{n+2}`\ | \\c_n & c_{n+1} & c_{n+2} | | | -| | `&\dots&c_{2n}` \ | &\dots&c_{2n} | | | -| | `\end{vmatrix} > 0` | \end{vmatrix} > 0$$ | | | -+----+------------------------------+------------------------------+-----------+--------------+ -| 25 | y\_{x\_2} | $$y_{x_2}$$ | ![ex25][] | TeXbook p128 | -+----+------------------------------+------------------------------+-----------+--------------+ -| 26 | x\_{92}^{31415} + \pi | $$x_{92}^{31415} + \pi$$ | ![ex26][] | TeXbook p129 | -+----+------------------------------+------------------------------+-----------+--------------+ -| 27 | x\_{y^a\_b}^{z^c\_d} | $$x_{y^a_b}^{z^c_d}$$ | ![ex27][] | TeXbook p129 | -+----+------------------------------+------------------------------+-----------+--------------+ -| 28 | y\_3''' | $$y_3'''$$ | ![ex28][] | TeXbook p130 | -+----+------------------------------+------------------------------+-----------+--------------+ -| 29 | \lim\_{n\rightarrow+\infty}\ | $$\lim_{n\rightarrow+\infty} | ![ex29][] | | -| | {\sqrt{2\pi n}\over n!} \ | {\sqrt{2\pi n}\over n!} | | | -| | \genfrac (){}{}n{e}^n = 1 | \genfrac (){}{}n{e}^n = 1$$ | | | -+----+------------------------------+------------------------------+-----------+--------------+ -| 30 | \det(A) = \sum\_{\sigma \ | $$\det(A) = \sum_{\sigma | ![ex30][] | | -| | \in S_n} \epsilon(\sigma) \ | \in S_n} \epsilon(\sigma) | | | -| | \prod\_{i=1}^n \ | \prod_{i=1}^n | | | -| | a\_{i, \sigma\_i} | a_{i, \sigma_i}$$ | | | -+----+------------------------------+------------------------------+-----------+--------------+ - -[ex1]: images/ex1.gif -[ex2]: images/ex2.gif -[ex3]: images/ex3.gif -[ex4]: images/ex4.gif -[ex5]: images/ex5.gif -[ex6]: images/ex6.gif -[ex7]: images/ex7.gif -[ex8]: images/ex8.gif -[ex9]: images/ex9.gif -[ex10]: images/ex10.gif -[ex11]: images/ex11.gif -[ex12]: images/ex12.gif -[ex13]: images/ex13.gif -[ex14]: images/ex14.gif -[ex15]: images/ex15.gif -[ex16]: images/ex16.gif -[ex17]: images/ex17.gif -[ex18]: images/ex18.gif -[ex19]: images/ex19.gif -[ex20]: images/ex20.gif -[ex21]: images/ex21.gif -[ex22]: images/ex22.gif -[ex23]: images/ex23.gif -[ex24]: images/ex24.gif -[ex25]: images/ex25.gif -[ex26]: images/ex26.gif -[ex27]: images/ex27.gif -[ex28]: images/ex28.gif -[ex29]: images/ex29.png -[ex30]: images/ex30.png - - - diff --git a/test/processTests.js b/test/processTests.js deleted file mode 100644 index 7b0cda00..00000000 --- a/test/processTests.js +++ /dev/null @@ -1,6 +0,0 @@ -const fs = require("fs") // Node.js file system - -let str = fs.readFileSync('./test/katex-spec1.js').toString('utf8') -str = str.replace(/Expect(`[^`]*`)/g, - 'Expect($1)') -fs.writeFileSync('./test/katex-spec2.js', str) diff --git a/test/repl.html b/test/repl.html deleted file mode 100644 index f3542668..00000000 --- a/test/repl.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - - Temml REPL - - - - - - - - - - - - - - - -
    - - diff --git a/test/temml.js b/test/temml.js deleted file mode 100644 index 2adf8d24..00000000 --- a/test/temml.js +++ /dev/null @@ -1,11634 +0,0 @@ -var temml = (function () { - 'use strict'; - - /** - * This is the ParseError class, which is the main error thrown by Temml - * functions when something has gone wrong. This is used to distinguish internal - * errors from errors in the expression that the user provided. - * - * If possible, a caller should provide a Token or ParseNode with information - * about where in the source string the problem occurred. - */ - class ParseError { - constructor( - message, // The error message - token // An object providing position information - ) { - let error = " " + message; - let start; - - const loc = token && token.loc; - if (loc && loc.start <= loc.end) { - // If we have the input and a position, make the error a bit fancier - - // Get the input - const input = loc.lexer.input; - - // Prepend some information - start = loc.start; - const end = loc.end; - if (start === input.length) { - error += " at end of input: "; - } else { - error += " at position " + (start + 1) + ": "; - } - - // Underline token in question using combining underscores - const underlined = input.slice(start, end).replace(/[^]/g, "$&\u0332"); - - // Extract some context from the input and add it to the error - let left; - if (start > 15) { - left = "…" + input.slice(start - 15, start); - } else { - left = input.slice(0, start); - } - let right; - if (end + 15 < input.length) { - right = input.slice(end, end + 15) + "…"; - } else { - right = input.slice(end); - } - error += left + underlined + right; - } - - // Some hackery to make ParseError a prototype of Error - // See http://stackoverflow.com/a/8460753 - const self = new Error(error); - self.name = "ParseError"; - self.__proto__ = ParseError.prototype; - self.position = start; - return self; - } - } - - ParseError.prototype.__proto__ = Error.prototype; - - // - /** - * This file contains a list of utility functions which are useful in other - * files. - */ - - /** - * Provide a default value if a setting is undefined - */ - const deflt = function(setting, defaultIfUndefined) { - return setting === undefined ? defaultIfUndefined : setting; - }; - - // hyphenate and escape adapted from Facebook's React under Apache 2 license - - const uppercase = /([A-Z])/g; - const hyphenate = function(str) { - return str.replace(uppercase, "-$1").toLowerCase(); - }; - - const ESCAPE_LOOKUP = { - "&": "&", - ">": ">", - "<": "<", - '"': """, - "'": "'" - }; - - const ESCAPE_REGEX = /[&><"']/g; - - /** - * Escapes text to prevent scripting attacks. - */ - function escape(text) { - return String(text).replace(ESCAPE_REGEX, (match) => ESCAPE_LOOKUP[match]); - } - - /** - * Sometimes we want to pull out the innermost element of a group. In most - * cases, this will just be the group itself, but when ordgroups and colors have - * a single element, we want to pull that out. - */ - const getBaseElem = function(group) { - if (group.type === "ordgroup") { - if (group.body.length === 1) { - return getBaseElem(group.body[0]); - } else { - return group; - } - } else if (group.type === "color") { - if (group.body.length === 1) { - return getBaseElem(group.body[0]); - } else { - return group; - } - } else if (group.type === "font") { - return getBaseElem(group.body); - } else { - return group; - } - }; - - /** - * TeXbook algorithms often reference "character boxes", which are simply groups - * with a single character in them. To decide if something is a character box, - * we find its innermost group, and see if it is a single character. - */ - const isCharacterBox = function(group) { - const baseElem = getBaseElem(group); - - // These are all the types of groups which hold single characters - return baseElem.type === "mathord" || baseElem.type === "textord" || baseElem.type === "atom" - }; - - const assert = function(value) { - if (!value) { - throw new Error("Expected non-null, but got " + String(value)); - } - return value; - }; - - /** - * Return the protocol of a URL, or "_relative" if the URL does not specify a - * protocol (and thus is relative), or `null` if URL has invalid protocol - * (so should be outright rejected). - */ - const protocolFromUrl = function(url) { - // Check for possible leading protocol. - // https://url.spec.whatwg.org/#url-parsing strips leading whitespace - // (\x00) or C0 control (\x00-\x1F) characters. - // eslint-disable-next-line no-control-regex - const protocol = /^[\x00-\x20]*([^\\/#?]*?)(:|�*58|�*3a|&colon)/i.exec(url); - if (!protocol) { - return "_relative"; - } - // Reject weird colons - if (protocol[2] !== ":") { - return null; - } - // Reject invalid characters in scheme according to - // https://datatracker.ietf.org/doc/html/rfc3986#section-3.1 - if (!/^[a-zA-Z][a-zA-Z0-9+\-.]*$/.test(protocol[1])) { - return null; - } - // Lowercase the protocol - return protocol[1].toLowerCase(); - }; - - /** - * Round `n` to 4 decimal places, or to the nearest 1/10,000th em. The TeXbook - * gives an acceptable rounding error of 100sp (which would be the nearest - * 1/6551.6em with our ptPerEm = 10): - * http://www.ctex.org/documents/shredder/src/texbook.pdf#page=69 - */ - const round = function(n) { - return +n.toFixed(4); - }; - - var utils = { - deflt, - escape, - hyphenate, - getBaseElem, - isCharacterBox, - protocolFromUrl, - round - }; - - /** - * This is a module for storing settings passed into Temml. It correctly handles - * default settings. - */ - - /** - * The main Settings object - */ - class Settings { - constructor(options) { - // allow null options - options = options || {}; - this.displayMode = utils.deflt(options.displayMode, false); // boolean - this.annotate = utils.deflt(options.annotate, false); // boolean - this.leqno = utils.deflt(options.leqno, false); // boolean - this.throwOnError = utils.deflt(options.throwOnError, false); // boolean - this.errorColor = utils.deflt(options.errorColor, "#b22222"); // string - this.macros = options.macros || {}; - this.wrap = utils.deflt(options.wrap, "tex"); // "tex" | "=" - this.xml = utils.deflt(options.xml, false); // boolean - this.colorIsTextColor = utils.deflt(options.colorIsTextColor, false); // booelean - this.strict = utils.deflt(options.strict, false); // boolean - this.trust = utils.deflt(options.trust, false); // trust context. See html.js. - this.maxSize = (options.maxSize === undefined - ? [Infinity, Infinity] - : Array.isArray(options.maxSize) - ? options.maxSize - : [Infinity, Infinity] - ); - this.maxExpand = Math.max(0, utils.deflt(options.maxExpand, 1000)); // number - } - - /** - * Check whether to test potentially dangerous input, and return - * `true` (trusted) or `false` (untrusted). The sole argument `context` - * should be an object with `command` field specifying the relevant LaTeX - * command (as a string starting with `\`), and any other arguments, etc. - * If `context` has a `url` field, a `protocol` field will automatically - * get added by this function (changing the specified object). - */ - isTrusted(context) { - if (context.url && !context.protocol) { - const protocol = utils.protocolFromUrl(context.url); - if (protocol == null) { - return false - } - context.protocol = protocol; - } - const trust = typeof this.trust === "function" ? this.trust(context) : this.trust; - return Boolean(trust); - } - } - - /** - * All registered functions. - * `functions.js` just exports this same dictionary again and makes it public. - * `Parser.js` requires this dictionary. - */ - const _functions = {}; - - /** - * All MathML builders. Should be only used in the `define*` and the `build*ML` - * functions. - */ - const _mathmlGroupBuilders = {}; - - function defineFunction({ - type, - names, - props, - handler, - mathmlBuilder - }) { - // Set default values of functions - const data = { - type, - numArgs: props.numArgs, - argTypes: props.argTypes, - allowedInArgument: !!props.allowedInArgument, - allowedInText: !!props.allowedInText, - allowedInMath: props.allowedInMath === undefined ? true : props.allowedInMath, - numOptionalArgs: props.numOptionalArgs || 0, - infix: !!props.infix, - primitive: !!props.primitive, - handler: handler - }; - for (let i = 0; i < names.length; ++i) { - _functions[names[i]] = data; - } - if (type) { - if (mathmlBuilder) { - _mathmlGroupBuilders[type] = mathmlBuilder; - } - } - } - - /** - * Use this to register only the MathML builder for a function(e.g. - * if the function's ParseNode is generated in Parser.js rather than via a - * stand-alone handler provided to `defineFunction`). - */ - function defineFunctionBuilders({ type, mathmlBuilder }) { - defineFunction({ - type, - names: [], - props: { numArgs: 0 }, - handler() { - throw new Error("Should never be called.") - }, - mathmlBuilder - }); - } - - const normalizeArgument = function(arg) { - return arg.type === "ordgroup" && arg.body.length === 1 ? arg.body[0] : arg - }; - - // Since the corresponding buildMathML function expects a - // list of elements, we normalize for different kinds of arguments - const ordargument = function(arg) { - return arg.type === "ordgroup" ? arg.body : [arg] - }; - - /** - * This node represents a document fragment, which contains elements, but when - * placed into the DOM doesn't have any representation itself. It only contains - * children and doesn't have any DOM node properties. - */ - class DocumentFragment { - constructor(children) { - this.children = children; - this.classes = []; - this.style = {}; - } - - hasClass(className) { - return this.classes.includes(className); - } - - /** Convert the fragment into a node. */ - toNode() { - const frag = document.createDocumentFragment(); - - for (let i = 0; i < this.children.length; i++) { - frag.appendChild(this.children[i].toNode()); - } - - return frag; - } - - /** Convert the fragment into HTML markup. */ - toMarkup() { - let markup = ""; - - // Simply concatenate the markup for the children together. - for (let i = 0; i < this.children.length; i++) { - markup += this.children[i].toMarkup(); - } - - return markup; - } - - /** - * Converts the math node into a string, similar to innerText. Applies to - * MathDomNode's only. - */ - toText() { - // To avoid this, we would subclass documentFragment separately for - // MathML, but polyfills for subclassing is expensive per PR 1469. - const toText = (child) => child.toText(); - return this.children.map(toText).join(""); - } - } - - /** - * These objects store the data about the DOM nodes we create, as well as some - * extra data. They can then be transformed into real DOM nodes with the - * `toNode` function or HTML markup using `toMarkup`. They are useful for both - * storing extra properties on the nodes, as well as providing a way to easily - * work with the DOM. - * - * Similar functions for working with MathML nodes exist in mathMLTree.js. - * - */ - - /** - * Create an HTML className based on a list of classes. In addition to joining - * with spaces, we also remove empty classes. - */ - const createClass = function(classes) { - return classes.filter((cls) => cls).join(" "); - }; - - const initNode = function(classes, style) { - this.classes = classes || []; - this.attributes = {}; - this.style = style || {}; - }; - - /** - * Convert into an HTML node - */ - const toNode = function(tagName) { - const node = document.createElement(tagName); - - // Apply the class - node.className = createClass(this.classes); - - // Apply inline styles - for (const style in this.style) { - if (Object.prototype.hasOwnProperty.call(this.style, style )) { - node.style[style] = this.style[style]; - } - } - - // Apply attributes - for (const attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr )) { - node.setAttribute(attr, this.attributes[attr]); - } - } - - // Append the children, also as HTML nodes - for (let i = 0; i < this.children.length; i++) { - node.appendChild(this.children[i].toNode()); - } - - return node; - }; - - /** - * Convert into an HTML markup string - */ - const toMarkup = function(tagName) { - let markup = `<${tagName}`; - - // Add the class - if (this.classes.length) { - markup += ` class="${utils.escape(createClass(this.classes))}"`; - } - - let styles = ""; - - // Add the styles, after hyphenation - for (const style in this.style) { - if (Object.prototype.hasOwnProperty.call(this.style, style )) { - styles += `${utils.hyphenate(style)}:${this.style[style]};`; - } - } - - if (styles) { - markup += ` style="${styles}"`; - } - - // Add the attributes - for (const attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr )) { - markup += ` ${attr}="${utils.escape(this.attributes[attr])}"`; - } - } - - markup += ">"; - - // Add the markup of the children, also as markup - for (let i = 0; i < this.children.length; i++) { - markup += this.children[i].toMarkup(); - } - - markup += ``; - - return markup; - }; - - /** - * This node represents a span node, with a className, a list of children, and - * an inline style. - * - */ - class Span { - constructor(classes, children, style) { - initNode.call(this, classes, style); - this.children = children || []; - } - - setAttribute(attribute, value) { - this.attributes[attribute] = value; - } - - toNode() { - return toNode.call(this, "span"); - } - - toMarkup() { - return toMarkup.call(this, "span"); - } - } - - class TextNode$1 { - constructor(text) { - this.text = text; - } - toNode() { - return document.createTextNode(this.text); - } - toMarkup() { - return utils.escape(this.text); - } - } - - /* - * This node represents an image embed () element. - */ - class Img { - constructor(src, alt, style) { - this.alt = alt; - this.src = src; - this.classes = ["mord"]; - this.style = style; - } - - hasClass(className) { - return this.classes.includes(className); - } - - toNode() { - const node = document.createElement("img"); - node.src = this.src; - node.alt = this.alt; - node.className = "mord"; - - // Apply inline styles - for (const style in this.style) { - if (Object.prototype.hasOwnProperty.call(this.style, style )) { - node.style[style] = this.style[style]; - } - } - - return node; - } - - toMarkup() { - let markup = `${this.alt}` and - * `` tags). - */ - class MathNode { - constructor(type, children, classes, style) { - this.type = type; - this.attributes = {}; - this.children = children || []; - this.classes = classes || []; - this.style = style || {}; // Used for elements - } - - /** - * Sets an attribute on a MathML node. MathML depends on attributes to convey a - * semantic content, so this is used heavily. - */ - setAttribute(name, value) { - this.attributes[name] = value; - } - - /** - * Gets an attribute on a MathML node. - */ - getAttribute(name) { - return this.attributes[name]; - } - - /** - * Converts the math node into a MathML-namespaced DOM element. - */ - toNode() { - const node = document.createElementNS("http://www.w3.org/1998/Math/MathML", this.type); - - for (const attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { - node.setAttribute(attr, this.attributes[attr]); - } - } - - if (this.classes.length > 0) { - node.className = createClass(this.classes); - } - - // Apply inline styles - for (const style in this.style) { - if (Object.prototype.hasOwnProperty.call(this.style, style )) { - node.style[style] = this.style[style]; - } - } - - for (let i = 0; i < this.children.length; i++) { - node.appendChild(this.children[i].toNode()); - } - - return node; - } - - /** - * Converts the math node into an HTML markup string. - */ - toMarkup() { - let markup = "<" + this.type; - - // Add the attributes - for (const attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { - markup += " " + attr + '="'; - markup += utils.escape(this.attributes[attr]); - markup += '"'; - } - } - - if (this.classes.length > 0) { - markup += ` class="${utils.escape(createClass(this.classes))}"`; - } - - let styles = ""; - - // Add the styles, after hyphenation - for (const style in this.style) { - if (Object.prototype.hasOwnProperty.call(this.style, style )) { - styles += `${utils.hyphenate(style)}:${this.style[style]};`; - } - } - - if (styles) { - markup += ` style="${styles}"`; - } - - markup += ">"; - - for (let i = 0; i < this.children.length; i++) { - markup += this.children[i].toMarkup(); - } - - markup += ""; - - return markup; - } - - /** - * Converts the math node into a string, similar to innerText, but escaped. - */ - toText() { - return this.children.map((child) => child.toText()).join(""); - } - } - - /** - * This node represents a piece of text. - */ - class TextNode { - constructor(text) { - this.text = text; - } - - /** - * Converts the text node into a DOM text node. - */ - toNode() { - return document.createTextNode(this.text); - } - - /** - * Converts the text node into escaped HTML markup - * (representing the text itself). - */ - toMarkup() { - return utils.escape(this.toText()); - } - - /** - * Converts the text node into a string - * (representing the text itself). - */ - toText() { - return this.text; - } - } - - // Do not make an the only child of a . - // An acts as its own implicit . - const wrapWithMstyle = expression => { - let node; - if (expression.length === 1 && expression[0].type === "mrow") { - node = expression.pop(); - node.type = "mstyle"; - } else { - node = new MathNode("mstyle", expression); - } - return node - }; - - var mathMLTree = { - MathNode, - TextNode, - newDocumentFragment - }; - - /** - * This file provides support for building horizontal stretchy elements. - */ - - // TODO: Remove when Chromium stretches \widetilde & \widehat - const estimatedWidth = node => { - let width = 0; - if (node.body) { - for (const item of node.body) { - width += estimatedWidth(item); - } - } else if (node.type === "supsub") { - width += estimatedWidth(node.base); - if (node.sub) { width += 0.7 * estimatedWidth(node.sub); } - if (node.sup) { width += 0.7 * estimatedWidth(node.sup); } - } else if (node.type === "mathord" || node.type === "textord") { - for (const ch of node.text.split('')) { - const codePoint = ch.codePointAt(0); - if ((0x60 < codePoint && codePoint < 0x7B) || (0x03B0 < codePoint && codePoint < 0x3CA)) { - width += 0.56; // lower case latin or greek. Use advance width of letter n - } else if (0x2F < codePoint && codePoint < 0x3A) { - width += 0.50; // numerals. - } else { - width += 0.92; // advance width of letter M - } - } - } else { - width += 1.0; - } - return width - }; - - const stretchyCodePoint = { - widehat: "^", - widecheck: "ˇ", - widetilde: "~", - wideparen: "⏜", // \u23dc - utilde: "~", - overleftarrow: "\u2190", - underleftarrow: "\u2190", - xleftarrow: "\u2190", - overrightarrow: "\u2192", - underrightarrow: "\u2192", - xrightarrow: "\u2192", - underbrace: "\u23df", - overbrace: "\u23de", - overgroup: "\u23e0", - overparen: "⏜", - undergroup: "\u23e1", - underparen: "\u23dd", - overleftrightarrow: "\u2194", - underleftrightarrow: "\u2194", - xleftrightarrow: "\u2194", - Overrightarrow: "\u21d2", - xRightarrow: "\u21d2", - overleftharpoon: "\u21bc", - xleftharpoonup: "\u21bc", - overrightharpoon: "\u21c0", - xrightharpoonup: "\u21c0", - xLeftarrow: "\u21d0", - xLeftrightarrow: "\u21d4", - xhookleftarrow: "\u21a9", - xhookrightarrow: "\u21aa", - xmapsto: "\u21a6", - xrightharpoondown: "\u21c1", - xleftharpoondown: "\u21bd", - xtwoheadleftarrow: "\u219e", - xtwoheadrightarrow: "\u21a0", - xlongequal: "=", - xrightleftarrows: "\u21c4", - yields: "\u2192", - yieldsLeft: "\u2190", - mesomerism: "\u2194", - longrightharpoonup: "\u21c0", - longleftharpoondown: "\u21bd", - eqrightharpoonup: "\u21c0", - eqleftharpoondown: "\u21bd", - "\\cdrightarrow": "\u2192", - "\\cdleftarrow": "\u2190", - "\\cdlongequal": "=" - }; - - const mathMLnode = function(label) { - const child = new mathMLTree.TextNode(stretchyCodePoint[label.slice(1)]); - const node = new mathMLTree.MathNode("mo", [child]); - node.setAttribute("stretchy", "true"); - return node - }; - - const crookedWides = ["\\widetilde", "\\widehat", "\\widecheck", "\\utilde"]; - - // TODO: Remove when Chromium stretches \widetilde & \widehat - const accentNode = (group) => { - const mo = mathMLnode(group.label); - if (crookedWides.includes(group.label)) { - const width = estimatedWidth(group.base); - if (1 < width && width < 1.6) { - mo.classes.push("tml-crooked-2"); - } else if (1.6 <= width && width < 2.5) { - mo.classes.push("tml-crooked-3"); - } else if (2.5 <= width) { - mo.classes.push("tml-crooked-4"); - } - } - return mo - }; - - var stretchy = { - mathMLnode, - accentNode - }; - - /** - * This file holds a list of all no-argument functions and single-character - * symbols (like 'a' or ';'). - * - * For each of the symbols, there are two properties they can have: - * - group (required): the ParseNode group type the symbol should have (i.e. - "textord", "mathord", etc). - * - replace: the character that this symbol or function should be - * replaced with (i.e. "\phi" has a replace value of "\u03d5", the phi - * character in the main font). - * - * The outermost map in the table indicates what mode the symbols should be - * accepted in (e.g. "math" or "text"). - */ - - // Some of these have a "-token" suffix since these are also used as `ParseNode` - // types for raw text tokens, and we want to avoid conflicts with higher-level - // `ParseNode` types. These `ParseNode`s are constructed within `Parser` by - // looking up the `symbols` map. - const ATOMS = { - bin: 1, - close: 1, - inner: 1, - open: 1, - punct: 1, - rel: 1 - }; - const NON_ATOMS = { - "accent-token": 1, - mathord: 1, - "op-token": 1, - spacing: 1, - textord: 1 - }; - - const symbols = { - math: {}, - text: {} - }; - - /** `acceptUnicodeChar = true` is only applicable if `replace` is set. */ - function defineSymbol(mode, group, replace, name, acceptUnicodeChar) { - symbols[mode][name] = { group, replace }; - - if (acceptUnicodeChar && replace) { - symbols[mode][replace] = symbols[mode][name]; - } - } - - // Some abbreviations for commonly used strings. - // This helps minify the code, and also spotting typos using jshint. - - // modes: - const math = "math"; - const text = "text"; - - // groups: - const accent = "accent-token"; - const bin = "bin"; - const close = "close"; - const inner = "inner"; - const mathord = "mathord"; - const op = "op-token"; - const open = "open"; - const punct = "punct"; - const rel = "rel"; - const spacing = "spacing"; - const textord = "textord"; - - // Now comes the symbol table - - // Relation Symbols - defineSymbol(math, rel, "\u2261", "\\equiv", true); - defineSymbol(math, rel, "\u227a", "\\prec", true); - defineSymbol(math, rel, "\u227b", "\\succ", true); - defineSymbol(math, rel, "\u223c", "\\sim", true); - defineSymbol(math, rel, "\u27c2", "\\perp", true); - defineSymbol(math, rel, "\u2aaf", "\\preceq", true); - defineSymbol(math, rel, "\u2ab0", "\\succeq", true); - defineSymbol(math, rel, "\u2243", "\\simeq", true); - defineSymbol(math, rel, "\u224c", "\\backcong", true); - defineSymbol(math, rel, "|", "\\mid", true); - defineSymbol(math, rel, "\u226a", "\\ll", true); - defineSymbol(math, rel, "\u226b", "\\gg", true); - defineSymbol(math, rel, "\u224d", "\\asymp", true); - defineSymbol(math, rel, "\u2225", "\\parallel"); - defineSymbol(math, rel, "\u2323", "\\smile", true); - defineSymbol(math, rel, "\u2291", "\\sqsubseteq", true); - defineSymbol(math, rel, "\u2292", "\\sqsupseteq", true); - defineSymbol(math, rel, "\u2250", "\\doteq", true); - defineSymbol(math, rel, "\u2322", "\\frown", true); - defineSymbol(math, rel, "\u220b", "\\ni", true); - defineSymbol(math, rel, "\u220c", "\\notni", true); - defineSymbol(math, rel, "\u221d", "\\propto", true); - defineSymbol(math, rel, "\u22a2", "\\vdash", true); - defineSymbol(math, rel, "\u22a3", "\\dashv", true); - defineSymbol(math, rel, "\u220b", "\\owns"); - defineSymbol(math, rel, "\u2258", "\\arceq", true); - defineSymbol(math, rel, "\u2259", "\\wedgeq", true); - defineSymbol(math, rel, "\u225a", "\\veeeq", true); - defineSymbol(math, rel, "\u225b", "\\stareq", true); - defineSymbol(math, rel, "\u225d", "\\eqdef", true); - defineSymbol(math, rel, "\u225e", "\\measeq", true); - defineSymbol(math, rel, "\u225f", "\\questeq", true); - defineSymbol(math, rel, "\u2260", "\\ne", true); - defineSymbol(math, rel, "\u2260", "\\neq"); - // unicodemath - defineSymbol(math, rel, "\u2a75", "\\eqeq", true); - defineSymbol(math, rel, "\u2a76", "\\eqeqeq", true); - // mathtools.sty - defineSymbol(math, rel, "\u2237", "\\dblcolon", true); - defineSymbol(math, rel, "\u2254", "\\coloneqq", true); - defineSymbol(math, rel, "\u2255", "\\eqqcolon", true); - defineSymbol(math, rel, "\u2239", "\\eqcolon", true); - defineSymbol(math, rel, "\u2A74", "\\Coloneqq", true); - - // Punctuation - defineSymbol(math, punct, "\u002e", "\\ldotp"); - defineSymbol(math, punct, "\u00b7", "\\cdotp"); - - // Misc Symbols - defineSymbol(math, textord, "\u0023", "\\#"); - defineSymbol(text, textord, "\u0023", "\\#"); - defineSymbol(math, textord, "\u0026", "\\&"); - defineSymbol(text, textord, "\u0026", "\\&"); - defineSymbol(math, textord, "\u2135", "\\aleph", true); - defineSymbol(math, textord, "\u2200", "\\forall", true); - defineSymbol(math, textord, "\u210f", "\\hbar", true); - defineSymbol(math, textord, "\u2203", "\\exists", true); - // ∇ is actually a unary operator, not binary. But this works. - defineSymbol(math, bin, "\u2207", "\\nabla", true); - defineSymbol(math, textord, "\u266d", "\\flat", true); - defineSymbol(math, textord, "\u2113", "\\ell", true); - defineSymbol(math, textord, "\u266e", "\\natural", true); - defineSymbol(math, textord, "Å", "\\Angstrom", true); - defineSymbol(text, textord, "Å", "\\Angstrom", true); - defineSymbol(math, textord, "\u2663", "\\clubsuit", true); - defineSymbol(math, textord, "\u2667", "\\varclubsuit", true); - defineSymbol(math, textord, "\u2118", "\\wp", true); - defineSymbol(math, textord, "\u266f", "\\sharp", true); - defineSymbol(math, textord, "\u2662", "\\diamondsuit", true); - defineSymbol(math, textord, "\u2666", "\\vardiamondsuit", true); - defineSymbol(math, textord, "\u211c", "\\Re", true); - defineSymbol(math, textord, "\u2661", "\\heartsuit", true); - defineSymbol(math, textord, "\u2665", "\\varheartsuit", true); - defineSymbol(math, textord, "\u2111", "\\Im", true); - defineSymbol(math, textord, "\u2660", "\\spadesuit", true); - defineSymbol(math, textord, "\u2664", "\\varspadesuit", true); - defineSymbol(math, textord, "\u2640", "\\female", true); - defineSymbol(math, textord, "\u2642", "\\male", true); - defineSymbol(math, textord, "\u00a7", "\\S", true); - defineSymbol(text, textord, "\u00a7", "\\S"); - defineSymbol(math, textord, "\u00b6", "\\P", true); - defineSymbol(text, textord, "\u00b6", "\\P"); - defineSymbol(text, textord, "\u263a", "\\smiley", true); - defineSymbol(math, textord, "\u263a", "\\smiley", true); - - // Math and Text - defineSymbol(math, textord, "\u2020", "\\dag"); - defineSymbol(text, textord, "\u2020", "\\dag"); - defineSymbol(text, textord, "\u2020", "\\textdagger"); - defineSymbol(math, textord, "\u2021", "\\ddag"); - defineSymbol(text, textord, "\u2021", "\\ddag"); - defineSymbol(text, textord, "\u2021", "\\textdaggerdbl"); - - // Large Delimiters - defineSymbol(math, close, "\u23b1", "\\rmoustache", true); - defineSymbol(math, open, "\u23b0", "\\lmoustache", true); - defineSymbol(math, close, "\u27ef", "\\rgroup", true); - defineSymbol(math, open, "\u27ee", "\\lgroup", true); - - // Binary Operators - defineSymbol(math, bin, "\u2213", "\\mp", true); - defineSymbol(math, bin, "\u2296", "\\ominus", true); - defineSymbol(math, bin, "\u228e", "\\uplus", true); - defineSymbol(math, bin, "\u2293", "\\sqcap", true); - defineSymbol(math, bin, "\u2217", "\\ast"); - defineSymbol(math, bin, "\u2294", "\\sqcup", true); - defineSymbol(math, bin, "\u25ef", "\\bigcirc", true); - defineSymbol(math, bin, "\u2219", "\\bullet", true); - defineSymbol(math, bin, "\u2021", "\\ddagger"); - defineSymbol(math, bin, "\u2240", "\\wr", true); - defineSymbol(math, bin, "\u2a3f", "\\amalg"); - defineSymbol(math, bin, "\u0026", "\\And"); // from amsmath - defineSymbol(math, bin, "\u2AFD", "\\sslash", true); // from stmaryrd - - // Arrow Symbols - defineSymbol(math, rel, "\u27f5", "\\longleftarrow", true); - defineSymbol(math, rel, "\u21d0", "\\Leftarrow", true); - defineSymbol(math, rel, "\u27f8", "\\Longleftarrow", true); - defineSymbol(math, rel, "\u27f6", "\\longrightarrow", true); - defineSymbol(math, rel, "\u21d2", "\\Rightarrow", true); - defineSymbol(math, rel, "\u27f9", "\\Longrightarrow", true); - defineSymbol(math, rel, "\u2194", "\\leftrightarrow", true); - defineSymbol(math, rel, "\u27f7", "\\longleftrightarrow", true); - defineSymbol(math, rel, "\u21d4", "\\Leftrightarrow", true); - defineSymbol(math, rel, "\u27fa", "\\Longleftrightarrow", true); - defineSymbol(math, rel, "\u21a4", "\\mapsfrom", true); - defineSymbol(math, rel, "\u21a6", "\\mapsto", true); - defineSymbol(math, rel, "\u27fc", "\\longmapsto", true); - defineSymbol(math, rel, "\u2197", "\\nearrow", true); - defineSymbol(math, rel, "\u21a9", "\\hookleftarrow", true); - defineSymbol(math, rel, "\u21aa", "\\hookrightarrow", true); - defineSymbol(math, rel, "\u2198", "\\searrow", true); - defineSymbol(math, rel, "\u21bc", "\\leftharpoonup", true); - defineSymbol(math, rel, "\u21c0", "\\rightharpoonup", true); - defineSymbol(math, rel, "\u2199", "\\swarrow", true); - defineSymbol(math, rel, "\u21bd", "\\leftharpoondown", true); - defineSymbol(math, rel, "\u21c1", "\\rightharpoondown", true); - defineSymbol(math, rel, "\u2196", "\\nwarrow", true); - defineSymbol(math, rel, "\u21cc", "\\rightleftharpoons", true); - defineSymbol(math, mathord, "\u21af", "\\lightning", true); - defineSymbol(math, mathord, "\u220E", "\\QED", true); - defineSymbol(math, mathord, "\u2030", "\\permil", true); - defineSymbol(text, textord, "\u2030", "\\permil"); - defineSymbol(math, mathord, "\u2609", "\\astrosun", true); - defineSymbol(math, mathord, "\u263c", "\\sun", true); - defineSymbol(math, mathord, "\u263e", "\\leftmoon", true); - defineSymbol(math, mathord, "\u263d", "\\rightmoon", true); - defineSymbol(math, mathord, "\u2295", "\\Earth"); - - // AMS Negated Binary Relations - defineSymbol(math, rel, "\u226e", "\\nless", true); - // Symbol names preceeded by "@" each have a corresponding macro. - defineSymbol(math, rel, "\u2a87", "\\lneq", true); - defineSymbol(math, rel, "\u2268", "\\lneqq", true); - defineSymbol(math, rel, "\u2268\ufe00", "\\lvertneqq"); - defineSymbol(math, rel, "\u22e6", "\\lnsim", true); - defineSymbol(math, rel, "\u2a89", "\\lnapprox", true); - defineSymbol(math, rel, "\u2280", "\\nprec", true); - // unicode-math maps \u22e0 to \npreccurlyeq. We'll use the AMS synonym. - defineSymbol(math, rel, "\u22e0", "\\npreceq", true); - defineSymbol(math, rel, "\u22e8", "\\precnsim", true); - defineSymbol(math, rel, "\u2ab9", "\\precnapprox", true); - defineSymbol(math, rel, "\u2241", "\\nsim", true); - defineSymbol(math, rel, "\u2224", "\\nmid", true); - defineSymbol(math, rel, "\u2224", "\\nshortmid"); - defineSymbol(math, rel, "\u22ac", "\\nvdash", true); - defineSymbol(math, rel, "\u22ad", "\\nvDash", true); - defineSymbol(math, rel, "\u22ea", "\\ntriangleleft"); - defineSymbol(math, rel, "\u22ec", "\\ntrianglelefteq", true); - defineSymbol(math, rel, "\u2284", "\\nsubset", true); - defineSymbol(math, rel, "\u2285", "\\nsupset", true); - defineSymbol(math, rel, "\u228a", "\\subsetneq", true); - defineSymbol(math, rel, "\u228a\ufe00", "\\varsubsetneq"); - defineSymbol(math, rel, "\u2acb", "\\subsetneqq", true); - defineSymbol(math, rel, "\u2acb\ufe00", "\\varsubsetneqq"); - defineSymbol(math, rel, "\u226f", "\\ngtr", true); - defineSymbol(math, rel, "\u2a88", "\\gneq", true); - defineSymbol(math, rel, "\u2269", "\\gneqq", true); - defineSymbol(math, rel, "\u2269\ufe00", "\\gvertneqq"); - defineSymbol(math, rel, "\u22e7", "\\gnsim", true); - defineSymbol(math, rel, "\u2a8a", "\\gnapprox", true); - defineSymbol(math, rel, "\u2281", "\\nsucc", true); - // unicode-math maps \u22e1 to \nsucccurlyeq. We'll use the AMS synonym. - defineSymbol(math, rel, "\u22e1", "\\nsucceq", true); - defineSymbol(math, rel, "\u22e9", "\\succnsim", true); - defineSymbol(math, rel, "\u2aba", "\\succnapprox", true); - // unicode-math maps \u2246 to \simneqq. We'll use the AMS synonym. - defineSymbol(math, rel, "\u2246", "\\ncong", true); - defineSymbol(math, rel, "\u2226", "\\nparallel", true); - defineSymbol(math, rel, "\u2226", "\\nshortparallel"); - defineSymbol(math, rel, "\u22af", "\\nVDash", true); - defineSymbol(math, rel, "\u22eb", "\\ntriangleright"); - defineSymbol(math, rel, "\u22ed", "\\ntrianglerighteq", true); - defineSymbol(math, rel, "\u228b", "\\supsetneq", true); - defineSymbol(math, rel, "\u228b", "\\varsupsetneq"); - defineSymbol(math, rel, "\u2acc", "\\supsetneqq", true); - defineSymbol(math, rel, "\u2acc\ufe00", "\\varsupsetneqq"); - defineSymbol(math, rel, "\u22ae", "\\nVdash", true); - defineSymbol(math, rel, "\u2ab5", "\\precneqq", true); - defineSymbol(math, rel, "\u2ab6", "\\succneqq", true); - defineSymbol(math, bin, "\u22b4", "\\unlhd"); - defineSymbol(math, bin, "\u22b5", "\\unrhd"); - - // AMS Negated Arrows - defineSymbol(math, rel, "\u219a", "\\nleftarrow", true); - defineSymbol(math, rel, "\u219b", "\\nrightarrow", true); - defineSymbol(math, rel, "\u21cd", "\\nLeftarrow", true); - defineSymbol(math, rel, "\u21cf", "\\nRightarrow", true); - defineSymbol(math, rel, "\u21ae", "\\nleftrightarrow", true); - defineSymbol(math, rel, "\u21ce", "\\nLeftrightarrow", true); - - // AMS Misc - defineSymbol(math, rel, "\u25b3", "\\vartriangle"); - defineSymbol(math, textord, "\u210f", "\\hslash"); - defineSymbol(math, textord, "\u25bd", "\\triangledown"); - defineSymbol(math, textord, "\u25ca", "\\lozenge"); - defineSymbol(math, textord, "\u24c8", "\\circledS"); - defineSymbol(math, textord, "\u00ae", "\\circledR", true); - defineSymbol(text, textord, "\u00ae", "\\circledR"); - defineSymbol(text, textord, "\u00ae", "\\textregistered"); - defineSymbol(math, textord, "\u2221", "\\measuredangle", true); - defineSymbol(math, textord, "\u2204", "\\nexists"); - defineSymbol(math, textord, "\u2127", "\\mho"); - defineSymbol(math, textord, "\u2132", "\\Finv", true); - defineSymbol(math, textord, "\u2141", "\\Game", true); - defineSymbol(math, textord, "\u2035", "\\backprime"); - defineSymbol(math, textord, "\u2036", "\\backdprime"); - defineSymbol(math, textord, "\u2037", "\\backtrprime"); - defineSymbol(math, textord, "\u25b2", "\\blacktriangle"); - defineSymbol(math, textord, "\u25bc", "\\blacktriangledown"); - defineSymbol(math, textord, "\u25a0", "\\blacksquare"); - defineSymbol(math, textord, "\u29eb", "\\blacklozenge"); - defineSymbol(math, textord, "\u2605", "\\bigstar"); - defineSymbol(math, textord, "\u2222", "\\sphericalangle", true); - defineSymbol(math, textord, "\u2201", "\\complement", true); - // unicode-math maps U+F0 to \matheth. We map to AMS function \eth - defineSymbol(math, textord, "\u00f0", "\\eth", true); - defineSymbol(text, textord, "\u00f0", "\u00f0"); - defineSymbol(math, textord, "\u2571", "\\diagup"); - defineSymbol(math, textord, "\u2572", "\\diagdown"); - defineSymbol(math, textord, "\u25a1", "\\square"); - defineSymbol(math, textord, "\u25a1", "\\Box"); - defineSymbol(math, textord, "\u25ca", "\\Diamond"); - // unicode-math maps U+A5 to \mathyen. We map to AMS function \yen - defineSymbol(math, textord, "\u00a5", "\\yen", true); - defineSymbol(text, textord, "\u00a5", "\\yen", true); - defineSymbol(math, textord, "\u2713", "\\checkmark", true); - defineSymbol(text, textord, "\u2713", "\\checkmark"); - defineSymbol(math, textord, "\u2717", "\\ballotx", true); - defineSymbol(text, textord, "\u2717", "\\ballotx"); - defineSymbol(text, textord, "\u2022", "\\textbullet"); - - // AMS Hebrew - defineSymbol(math, textord, "\u2136", "\\beth", true); - defineSymbol(math, textord, "\u2138", "\\daleth", true); - defineSymbol(math, textord, "\u2137", "\\gimel", true); - - // AMS Greek - defineSymbol(math, textord, "\u03dd", "\\digamma", true); - defineSymbol(math, textord, "\u03f0", "\\varkappa"); - - // AMS Delimiters - defineSymbol(math, open, "\u231C", "\\ulcorner", true); - defineSymbol(math, close, "\u231D", "\\urcorner", true); - defineSymbol(math, open, "\u231E", "\\llcorner", true); - defineSymbol(math, close, "\u231F", "\\lrcorner", true); - - // AMS Binary Relations - defineSymbol(math, rel, "\u2266", "\\leqq", true); - defineSymbol(math, rel, "\u2a7d", "\\leqslant", true); - defineSymbol(math, rel, "\u2a95", "\\eqslantless", true); - defineSymbol(math, rel, "\u2272", "\\lesssim", true); - defineSymbol(math, rel, "\u2a85", "\\lessapprox", true); - defineSymbol(math, rel, "\u224a", "\\approxeq", true); - defineSymbol(math, bin, "\u22d6", "\\lessdot"); - defineSymbol(math, rel, "\u22d8", "\\lll", true); - defineSymbol(math, rel, "\u2276", "\\lessgtr", true); - defineSymbol(math, rel, "\u22da", "\\lesseqgtr", true); - defineSymbol(math, rel, "\u2a8b", "\\lesseqqgtr", true); - defineSymbol(math, rel, "\u2251", "\\doteqdot"); - defineSymbol(math, rel, "\u2253", "\\risingdotseq", true); - defineSymbol(math, rel, "\u2252", "\\fallingdotseq", true); - defineSymbol(math, rel, "\u223d", "\\backsim", true); - defineSymbol(math, rel, "\u22cd", "\\backsimeq", true); - defineSymbol(math, rel, "\u2ac5", "\\subseteqq", true); - defineSymbol(math, rel, "\u22d0", "\\Subset", true); - defineSymbol(math, rel, "\u228f", "\\sqsubset", true); - defineSymbol(math, rel, "\u227c", "\\preccurlyeq", true); - defineSymbol(math, rel, "\u22de", "\\curlyeqprec", true); - defineSymbol(math, rel, "\u227e", "\\precsim", true); - defineSymbol(math, rel, "\u2ab7", "\\precapprox", true); - defineSymbol(math, rel, "\u22b2", "\\vartriangleleft"); - defineSymbol(math, rel, "\u22b4", "\\trianglelefteq"); - defineSymbol(math, rel, "\u22a8", "\\vDash", true); - defineSymbol(math, rel, "\u22ab", "\\VDash", true); - defineSymbol(math, rel, "\u22aa", "\\Vvdash", true); - defineSymbol(math, rel, "\u2323", "\\smallsmile"); - defineSymbol(math, rel, "\u2322", "\\smallfrown"); - defineSymbol(math, rel, "\u224f", "\\bumpeq", true); - defineSymbol(math, rel, "\u224e", "\\Bumpeq", true); - defineSymbol(math, rel, "\u2267", "\\geqq", true); - defineSymbol(math, rel, "\u2a7e", "\\geqslant", true); - defineSymbol(math, rel, "\u2a96", "\\eqslantgtr", true); - defineSymbol(math, rel, "\u2273", "\\gtrsim", true); - defineSymbol(math, rel, "\u2a86", "\\gtrapprox", true); - defineSymbol(math, bin, "\u22d7", "\\gtrdot"); - defineSymbol(math, rel, "\u22d9", "\\ggg", true); - defineSymbol(math, rel, "\u2277", "\\gtrless", true); - defineSymbol(math, rel, "\u22db", "\\gtreqless", true); - defineSymbol(math, rel, "\u2a8c", "\\gtreqqless", true); - defineSymbol(math, rel, "\u2256", "\\eqcirc", true); - defineSymbol(math, rel, "\u2257", "\\circeq", true); - defineSymbol(math, rel, "\u225c", "\\triangleq", true); - defineSymbol(math, rel, "\u223c", "\\thicksim"); - defineSymbol(math, rel, "\u2248", "\\thickapprox"); - defineSymbol(math, rel, "\u2ac6", "\\supseteqq", true); - defineSymbol(math, rel, "\u22d1", "\\Supset", true); - defineSymbol(math, rel, "\u2290", "\\sqsupset", true); - defineSymbol(math, rel, "\u227d", "\\succcurlyeq", true); - defineSymbol(math, rel, "\u22df", "\\curlyeqsucc", true); - defineSymbol(math, rel, "\u227f", "\\succsim", true); - defineSymbol(math, rel, "\u2ab8", "\\succapprox", true); - defineSymbol(math, rel, "\u22b3", "\\vartriangleright"); - defineSymbol(math, rel, "\u22b5", "\\trianglerighteq"); - defineSymbol(math, rel, "\u22a9", "\\Vdash", true); - defineSymbol(math, rel, "\u2223", "\\shortmid"); - defineSymbol(math, rel, "\u2225", "\\shortparallel"); - defineSymbol(math, rel, "\u226c", "\\between", true); - defineSymbol(math, rel, "\u22d4", "\\pitchfork", true); - defineSymbol(math, rel, "\u221d", "\\varpropto"); - defineSymbol(math, rel, "\u25c0", "\\blacktriangleleft"); - // unicode-math says that \therefore is a mathord atom. - // We kept the amssymb atom type, which is rel. - defineSymbol(math, rel, "\u2234", "\\therefore", true); - defineSymbol(math, rel, "\u220d", "\\backepsilon"); - defineSymbol(math, rel, "\u25b6", "\\blacktriangleright"); - // unicode-math says that \because is a mathord atom. - // We kept the amssymb atom type, which is rel. - defineSymbol(math, rel, "\u2235", "\\because", true); - defineSymbol(math, rel, "\u22d8", "\\llless"); - defineSymbol(math, rel, "\u22d9", "\\gggtr"); - defineSymbol(math, bin, "\u22b2", "\\lhd"); - defineSymbol(math, bin, "\u22b3", "\\rhd"); - defineSymbol(math, rel, "\u2242", "\\eqsim", true); - defineSymbol(math, rel, "\u2251", "\\Doteq", true); - defineSymbol(math, rel, "\u297d", "\\strictif", true); - defineSymbol(math, rel, "\u297c", "\\strictfi", true); - - // AMS Binary Operators - defineSymbol(math, bin, "\u2214", "\\dotplus", true); - defineSymbol(math, bin, "\u2216", "\\smallsetminus"); - defineSymbol(math, bin, "\u22d2", "\\Cap", true); - defineSymbol(math, bin, "\u22d3", "\\Cup", true); - defineSymbol(math, bin, "\u2a5e", "\\doublebarwedge", true); - defineSymbol(math, bin, "\u229f", "\\boxminus", true); - defineSymbol(math, bin, "\u229e", "\\boxplus", true); - defineSymbol(math, bin, "\u22c7", "\\divideontimes", true); - defineSymbol(math, bin, "\u22c9", "\\ltimes", true); - defineSymbol(math, bin, "\u22ca", "\\rtimes", true); - defineSymbol(math, bin, "\u22cb", "\\leftthreetimes", true); - defineSymbol(math, bin, "\u22cc", "\\rightthreetimes", true); - defineSymbol(math, bin, "\u22cf", "\\curlywedge", true); - defineSymbol(math, bin, "\u22ce", "\\curlyvee", true); - defineSymbol(math, bin, "\u229d", "\\circleddash", true); - defineSymbol(math, bin, "\u229b", "\\circledast", true); - defineSymbol(math, bin, "\u22ba", "\\intercal", true); - defineSymbol(math, bin, "\u22d2", "\\doublecap"); - defineSymbol(math, bin, "\u22d3", "\\doublecup"); - defineSymbol(math, bin, "\u22a0", "\\boxtimes", true); - defineSymbol(math, bin, "\u22c8", "\\bowtie", true); - defineSymbol(math, bin, "\u22c8", "\\Join"); - defineSymbol(math, bin, "\u27d5", "\\leftouterjoin", true); - defineSymbol(math, bin, "\u27d6", "\\rightouterjoin", true); - defineSymbol(math, bin, "\u27d7", "\\fullouterjoin", true); - - // stix Binary Operators - defineSymbol(math, bin, "\u2238", "\\dotminus", true); - defineSymbol(math, bin, "\u27D1", "\\wedgedot", true); - defineSymbol(math, bin, "\u27C7", "\\veedot", true); - defineSymbol(math, bin, "\u2A62", "\\doublebarvee", true); - defineSymbol(math, bin, "\u2A63", "\\veedoublebar", true); - defineSymbol(math, bin, "\u2A5F", "\\wedgebar", true); - defineSymbol(math, bin, "\u2A60", "\\wedgedoublebar", true); - defineSymbol(math, bin, "\u2A54", "\\Vee", true); - defineSymbol(math, bin, "\u2A53", "\\Wedge", true); - defineSymbol(math, bin, "\u2A43", "\\barcap", true); - defineSymbol(math, bin, "\u2A42", "\\barcup", true); - defineSymbol(math, bin, "\u2A48", "\\capbarcup", true); - defineSymbol(math, bin, "\u2A40", "\\capdot", true); - defineSymbol(math, bin, "\u2A47", "\\capovercup", true); - defineSymbol(math, bin, "\u2A46", "\\cupovercap", true); - defineSymbol(math, bin, "\u2A4D", "\\closedvarcap", true); - defineSymbol(math, bin, "\u2A4C", "\\closedvarcup", true); - defineSymbol(math, bin, "\u2A2A", "\\minusdot", true); - defineSymbol(math, bin, "\u2A2B", "\\minusfdots", true); - defineSymbol(math, bin, "\u2A2C", "\\minusrdots", true); - defineSymbol(math, bin, "\u22BB", "\\Xor", true); - defineSymbol(math, bin, "\u22BC", "\\Nand", true); - defineSymbol(math, bin, "\u22BD", "\\Nor", true); - defineSymbol(math, bin, "\u22BD", "\\barvee"); - defineSymbol(math, bin, "\u2AF4", "\\interleave", true); - defineSymbol(math, bin, "\u29E2", "\\shuffle", true); - defineSymbol(math, bin, "\u2AF6", "\\threedotcolon", true); - defineSymbol(math, bin, "\u2982", "\\typecolon", true); - defineSymbol(math, bin, "\u223E", "\\invlazys", true); - defineSymbol(math, bin, "\u2A4B", "\\twocaps", true); - defineSymbol(math, bin, "\u2A4A", "\\twocups", true); - defineSymbol(math, bin, "\u2A4E", "\\Sqcap", true); - defineSymbol(math, bin, "\u2A4F", "\\Sqcup", true); - defineSymbol(math, bin, "\u2A56", "\\veeonvee", true); - defineSymbol(math, bin, "\u2A55", "\\wedgeonwedge", true); - defineSymbol(math, bin, "\u29D7", "\\blackhourglass", true); - defineSymbol(math, bin, "\u29C6", "\\boxast", true); - defineSymbol(math, bin, "\u29C8", "\\boxbox", true); - defineSymbol(math, bin, "\u29C7", "\\boxcircle", true); - defineSymbol(math, bin, "\u229C", "\\circledequal", true); - defineSymbol(math, bin, "\u29B7", "\\circledparallel", true); - defineSymbol(math, bin, "\u29B6", "\\circledvert", true); - defineSymbol(math, bin, "\u29B5", "\\circlehbar", true); - defineSymbol(math, bin, "\u27E1", "\\concavediamond", true); - defineSymbol(math, bin, "\u27E2", "\\concavediamondtickleft", true); - defineSymbol(math, bin, "\u27E3", "\\concavediamondtickright", true); - defineSymbol(math, bin, "\u22C4", "\\diamond", true); - defineSymbol(math, bin, "\u29D6", "\\hourglass", true); - defineSymbol(math, bin, "\u27E0", "\\lozengeminus", true); - defineSymbol(math, bin, "\u233D", "\\obar", true); - defineSymbol(math, bin, "\u29B8", "\\obslash", true); - defineSymbol(math, bin, "\u2A38", "\\odiv", true); - defineSymbol(math, bin, "\u29C1", "\\ogreaterthan", true); - defineSymbol(math, bin, "\u29C0", "\\olessthan", true); - defineSymbol(math, bin, "\u29B9", "\\operp", true); - defineSymbol(math, bin, "\u2A37", "\\Otimes", true); - defineSymbol(math, bin, "\u2A36", "\\otimeshat", true); - defineSymbol(math, bin, "\u22C6", "\\star", true); - defineSymbol(math, bin, "\u25B3", "\\triangle", true); - defineSymbol(math, bin, "\u2A3A", "\\triangleminus", true); - defineSymbol(math, bin, "\u2A39", "\\triangleplus", true); - defineSymbol(math, bin, "\u2A3B", "\\triangletimes", true); - defineSymbol(math, bin, "\u27E4", "\\whitesquaretickleft", true); - defineSymbol(math, bin, "\u27E5", "\\whitesquaretickright", true); - defineSymbol(math, bin, "\u2A33", "\\smashtimes", true); - - // AMS Arrows - // Note: unicode-math maps \u21e2 to their own function \rightdasharrow. - // We'll map it to AMS function \dashrightarrow. It produces the same atom. - defineSymbol(math, rel, "\u21e2", "\\dashrightarrow", true); - // unicode-math maps \u21e0 to \leftdasharrow. We'll use the AMS synonym. - defineSymbol(math, rel, "\u21e0", "\\dashleftarrow", true); - defineSymbol(math, rel, "\u21c7", "\\leftleftarrows", true); - defineSymbol(math, rel, "\u21c6", "\\leftrightarrows", true); - defineSymbol(math, rel, "\u21da", "\\Lleftarrow", true); - defineSymbol(math, rel, "\u219e", "\\twoheadleftarrow", true); - defineSymbol(math, rel, "\u21a2", "\\leftarrowtail", true); - defineSymbol(math, rel, "\u21ab", "\\looparrowleft", true); - defineSymbol(math, rel, "\u21cb", "\\leftrightharpoons", true); - defineSymbol(math, rel, "\u21b6", "\\curvearrowleft", true); - // unicode-math maps \u21ba to \acwopencirclearrow. We'll use the AMS synonym. - defineSymbol(math, rel, "\u21ba", "\\circlearrowleft", true); - defineSymbol(math, rel, "\u21b0", "\\Lsh", true); - defineSymbol(math, rel, "\u21c8", "\\upuparrows", true); - defineSymbol(math, rel, "\u21bf", "\\upharpoonleft", true); - defineSymbol(math, rel, "\u21c3", "\\downharpoonleft", true); - defineSymbol(math, rel, "\u22b6", "\\origof", true); - defineSymbol(math, rel, "\u22b7", "\\imageof", true); - defineSymbol(math, rel, "\u22b8", "\\multimap", true); - defineSymbol(math, rel, "\u21ad", "\\leftrightsquigarrow", true); - defineSymbol(math, rel, "\u21c9", "\\rightrightarrows", true); - defineSymbol(math, rel, "\u21c4", "\\rightleftarrows", true); - defineSymbol(math, rel, "\u21a0", "\\twoheadrightarrow", true); - defineSymbol(math, rel, "\u21a3", "\\rightarrowtail", true); - defineSymbol(math, rel, "\u21ac", "\\looparrowright", true); - defineSymbol(math, rel, "\u21b7", "\\curvearrowright", true); - // unicode-math maps \u21bb to \cwopencirclearrow. We'll use the AMS synonym. - defineSymbol(math, rel, "\u21bb", "\\circlearrowright", true); - defineSymbol(math, rel, "\u21b1", "\\Rsh", true); - defineSymbol(math, rel, "\u21ca", "\\downdownarrows", true); - defineSymbol(math, rel, "\u21be", "\\upharpoonright", true); - defineSymbol(math, rel, "\u21c2", "\\downharpoonright", true); - defineSymbol(math, rel, "\u21dd", "\\rightsquigarrow", true); - defineSymbol(math, rel, "\u21dd", "\\leadsto"); - defineSymbol(math, rel, "\u21db", "\\Rrightarrow", true); - defineSymbol(math, rel, "\u21be", "\\restriction"); - - defineSymbol(math, textord, "\u2018", "`"); - defineSymbol(math, textord, "$", "\\$"); - defineSymbol(text, textord, "$", "\\$"); - defineSymbol(text, textord, "$", "\\textdollar"); - defineSymbol(math, textord, "¢", "\\cent"); - defineSymbol(text, textord, "¢", "\\cent"); - defineSymbol(math, textord, "%", "\\%"); - defineSymbol(text, textord, "%", "\\%"); - defineSymbol(math, textord, "_", "\\_"); - defineSymbol(text, textord, "_", "\\_"); - defineSymbol(text, textord, "_", "\\textunderscore"); - defineSymbol(text, textord, "\u2423", "\\textvisiblespace", true); - defineSymbol(math, textord, "\u2220", "\\angle", true); - defineSymbol(math, textord, "\u221e", "\\infty", true); - defineSymbol(math, textord, "\u2032", "\\prime"); - defineSymbol(math, textord, "\u2033", "\\dprime"); - defineSymbol(math, textord, "\u2034", "\\trprime"); - defineSymbol(math, textord, "\u2057", "\\qprime"); - defineSymbol(math, textord, "\u25b3", "\\triangle"); - defineSymbol(text, textord, "\u0391", "\\Alpha", true); - defineSymbol(text, textord, "\u0392", "\\Beta", true); - defineSymbol(text, textord, "\u0393", "\\Gamma", true); - defineSymbol(text, textord, "\u0394", "\\Delta", true); - defineSymbol(text, textord, "\u0395", "\\Epsilon", true); - defineSymbol(text, textord, "\u0396", "\\Zeta", true); - defineSymbol(text, textord, "\u0397", "\\Eta", true); - defineSymbol(text, textord, "\u0398", "\\Theta", true); - defineSymbol(text, textord, "\u0399", "\\Iota", true); - defineSymbol(text, textord, "\u039a", "\\Kappa", true); - defineSymbol(text, textord, "\u039b", "\\Lambda", true); - defineSymbol(text, textord, "\u039c", "\\Mu", true); - defineSymbol(text, textord, "\u039d", "\\Nu", true); - defineSymbol(text, textord, "\u039e", "\\Xi", true); - defineSymbol(text, textord, "\u039f", "\\Omicron", true); - defineSymbol(text, textord, "\u03a0", "\\Pi", true); - defineSymbol(text, textord, "\u03a1", "\\Rho", true); - defineSymbol(text, textord, "\u03a3", "\\Sigma", true); - defineSymbol(text, textord, "\u03a4", "\\Tau", true); - defineSymbol(text, textord, "\u03a5", "\\Upsilon", true); - defineSymbol(text, textord, "\u03a6", "\\Phi", true); - defineSymbol(text, textord, "\u03a7", "\\Chi", true); - defineSymbol(text, textord, "\u03a8", "\\Psi", true); - defineSymbol(text, textord, "\u03a9", "\\Omega", true); - defineSymbol(math, mathord, "\u0391", "\\Alpha", true); - defineSymbol(math, mathord, "\u0392", "\\Beta", true); - defineSymbol(math, mathord, "\u0393", "\\Gamma", true); - defineSymbol(math, mathord, "\u0394", "\\Delta", true); - defineSymbol(math, mathord, "\u0395", "\\Epsilon", true); - defineSymbol(math, mathord, "\u0396", "\\Zeta", true); - defineSymbol(math, mathord, "\u0397", "\\Eta", true); - defineSymbol(math, mathord, "\u0398", "\\Theta", true); - defineSymbol(math, mathord, "\u0399", "\\Iota", true); - defineSymbol(math, mathord, "\u039a", "\\Kappa", true); - defineSymbol(math, mathord, "\u039b", "\\Lambda", true); - defineSymbol(math, mathord, "\u039c", "\\Mu", true); - defineSymbol(math, mathord, "\u039d", "\\Nu", true); - defineSymbol(math, mathord, "\u039e", "\\Xi", true); - defineSymbol(math, mathord, "\u039f", "\\Omicron", true); - defineSymbol(math, mathord, "\u03a0", "\\Pi", true); - defineSymbol(math, mathord, "\u03a1", "\\Rho", true); - defineSymbol(math, mathord, "\u03a3", "\\Sigma", true); - defineSymbol(math, mathord, "\u03a4", "\\Tau", true); - defineSymbol(math, mathord, "\u03a5", "\\Upsilon", true); - defineSymbol(math, mathord, "\u03a6", "\\Phi", true); - defineSymbol(math, mathord, "\u03a7", "\\Chi", true); - defineSymbol(math, mathord, "\u03a8", "\\Psi", true); - defineSymbol(math, mathord, "\u03a9", "\\Omega", true); - defineSymbol(math, open, "\u00ac", "\\neg", true); - defineSymbol(math, open, "\u00ac", "\\lnot"); - defineSymbol(math, textord, "\u22a4", "\\top"); - defineSymbol(math, textord, "\u22a5", "\\bot"); - defineSymbol(math, textord, "\u2205", "\\emptyset"); - defineSymbol(math, textord, "\u2300", "\\varnothing"); - defineSymbol(math, mathord, "\u03b1", "\\alpha", true); - defineSymbol(math, mathord, "\u03b2", "\\beta", true); - defineSymbol(math, mathord, "\u03b3", "\\gamma", true); - defineSymbol(math, mathord, "\u03b4", "\\delta", true); - defineSymbol(math, mathord, "\u03f5", "\\epsilon", true); - defineSymbol(math, mathord, "\u03b6", "\\zeta", true); - defineSymbol(math, mathord, "\u03b7", "\\eta", true); - defineSymbol(math, mathord, "\u03b8", "\\theta", true); - defineSymbol(math, mathord, "\u03b9", "\\iota", true); - defineSymbol(math, mathord, "\u03ba", "\\kappa", true); - defineSymbol(math, mathord, "\u03bb", "\\lambda", true); - defineSymbol(math, mathord, "\u03bc", "\\mu", true); - defineSymbol(math, mathord, "\u03bd", "\\nu", true); - defineSymbol(math, mathord, "\u03be", "\\xi", true); - defineSymbol(math, mathord, "\u03bf", "\\omicron", true); - defineSymbol(math, mathord, "\u03c0", "\\pi", true); - defineSymbol(math, mathord, "\u03c1", "\\rho", true); - defineSymbol(math, mathord, "\u03c3", "\\sigma", true); - defineSymbol(math, mathord, "\u03c4", "\\tau", true); - defineSymbol(math, mathord, "\u03c5", "\\upsilon", true); - defineSymbol(math, mathord, "\u03d5", "\\phi", true); - defineSymbol(math, mathord, "\u03c7", "\\chi", true); - defineSymbol(math, mathord, "\u03c8", "\\psi", true); - defineSymbol(math, mathord, "\u03c9", "\\omega", true); - defineSymbol(math, mathord, "\u03b5", "\\varepsilon", true); - defineSymbol(math, mathord, "\u03d1", "\\vartheta", true); - defineSymbol(math, mathord, "\u03d6", "\\varpi", true); - defineSymbol(math, mathord, "\u03f1", "\\varrho", true); - defineSymbol(math, mathord, "\u03c2", "\\varsigma", true); - defineSymbol(math, mathord, "\u03c6", "\\varphi", true); - defineSymbol(math, mathord, "\u03d8", "\\Coppa", true); - defineSymbol(math, mathord, "\u03d9", "\\coppa", true); - defineSymbol(math, mathord, "\u03d9", "\\varcoppa", true); - defineSymbol(math, mathord, "\u03de", "\\Koppa", true); - defineSymbol(math, mathord, "\u03df", "\\koppa", true); - defineSymbol(math, mathord, "\u03e0", "\\Sampi", true); - defineSymbol(math, mathord, "\u03e1", "\\sampi", true); - defineSymbol(math, mathord, "\u03da", "\\Stigma", true); - defineSymbol(math, mathord, "\u03db", "\\stigma", true); - defineSymbol(math, mathord, "\u2aeb", "\\Bot"); - defineSymbol(math, bin, "\u2217", "\u2217", true); - defineSymbol(math, bin, "+", "+"); - defineSymbol(math, bin, "*", "*"); - defineSymbol(math, bin, "\u2044", "/", true); - defineSymbol(math, bin, "\u2044", "\u2044"); - defineSymbol(math, bin, "\u2212", "-", true); - defineSymbol(math, bin, "\u22c5", "\\cdot", true); - defineSymbol(math, bin, "\u2218", "\\circ", true); - defineSymbol(math, bin, "\u00f7", "\\div", true); - defineSymbol(math, bin, "\u00b1", "\\pm", true); - defineSymbol(math, bin, "\u00d7", "\\times", true); - defineSymbol(math, bin, "\u2229", "\\cap", true); - defineSymbol(math, bin, "\u222a", "\\cup", true); - defineSymbol(math, bin, "\u2216", "\\setminus", true); - defineSymbol(math, bin, "\u2227", "\\land"); - defineSymbol(math, bin, "\u2228", "\\lor"); - defineSymbol(math, bin, "\u2227", "\\wedge", true); - defineSymbol(math, bin, "\u2228", "\\vee", true); - defineSymbol(math, open, "\u27e6", "\\llbracket", true); // stmaryrd/semantic packages - defineSymbol(math, close, "\u27e7", "\\rrbracket", true); - defineSymbol(math, open, "\u27e8", "\\langle", true); - defineSymbol(math, open, "\u27ea", "\\lAngle", true); - defineSymbol(math, open, "\u2989", "\\llangle", true); - defineSymbol(math, open, "|", "\\lvert"); - defineSymbol(math, open, "\u2016", "\\lVert"); - defineSymbol(math, textord, "!", "\\oc"); // cmll package - defineSymbol(math, textord, "?", "\\wn"); - defineSymbol(math, textord, "\u2193", "\\shpos"); - defineSymbol(math, textord, "\u2195", "\\shift"); - defineSymbol(math, textord, "\u2191", "\\shneg"); - defineSymbol(math, close, "?", "?"); - defineSymbol(math, close, "!", "!"); - defineSymbol(math, close, "‼", "‼"); - defineSymbol(math, close, "\u27e9", "\\rangle", true); - defineSymbol(math, close, "\u27eb", "\\rAngle", true); - defineSymbol(math, close, "\u298a", "\\rrangle", true); - defineSymbol(math, close, "|", "\\rvert"); - defineSymbol(math, close, "\u2016", "\\rVert"); - defineSymbol(math, open, "\u2983", "\\lBrace", true); // stmaryrd/semantic packages - defineSymbol(math, close, "\u2984", "\\rBrace", true); - defineSymbol(math, rel, "=", "\\equal", true); - defineSymbol(math, rel, ":", ":"); - defineSymbol(math, rel, "\u2248", "\\approx", true); - defineSymbol(math, rel, "\u2245", "\\cong", true); - defineSymbol(math, rel, "\u2265", "\\ge"); - defineSymbol(math, rel, "\u2265", "\\geq", true); - defineSymbol(math, rel, "\u2190", "\\gets"); - defineSymbol(math, rel, ">", "\\gt", true); - defineSymbol(math, rel, "\u2208", "\\in", true); - defineSymbol(math, rel, "\u2209", "\\notin", true); - defineSymbol(math, rel, "\ue020", "\\@not"); - defineSymbol(math, rel, "\u2282", "\\subset", true); - defineSymbol(math, rel, "\u2283", "\\supset", true); - defineSymbol(math, rel, "\u2286", "\\subseteq", true); - defineSymbol(math, rel, "\u2287", "\\supseteq", true); - defineSymbol(math, rel, "\u2288", "\\nsubseteq", true); - defineSymbol(math, rel, "\u2288", "\\nsubseteqq"); - defineSymbol(math, rel, "\u2289", "\\nsupseteq", true); - defineSymbol(math, rel, "\u2289", "\\nsupseteqq"); - defineSymbol(math, rel, "\u22a8", "\\models"); - defineSymbol(math, rel, "\u2190", "\\leftarrow", true); - defineSymbol(math, rel, "\u2264", "\\le"); - defineSymbol(math, rel, "\u2264", "\\leq", true); - defineSymbol(math, rel, "<", "\\lt", true); - defineSymbol(math, rel, "\u2192", "\\rightarrow", true); - defineSymbol(math, rel, "\u2192", "\\to"); - defineSymbol(math, rel, "\u2271", "\\ngeq", true); - defineSymbol(math, rel, "\u2271", "\\ngeqq"); - defineSymbol(math, rel, "\u2271", "\\ngeqslant"); - defineSymbol(math, rel, "\u2270", "\\nleq", true); - defineSymbol(math, rel, "\u2270", "\\nleqq"); - defineSymbol(math, rel, "\u2270", "\\nleqslant"); - defineSymbol(math, rel, "\u2aeb", "\\Perp", true); //cmll package - defineSymbol(math, spacing, "\u00a0", "\\ "); - defineSymbol(math, spacing, "\u00a0", "\\space"); - // Ref: LaTeX Source 2e: \DeclareRobustCommand{\nobreakspace}{% - defineSymbol(math, spacing, "\u00a0", "\\nobreakspace"); - defineSymbol(text, spacing, "\u00a0", "\\ "); - defineSymbol(text, spacing, "\u00a0", " "); - defineSymbol(text, spacing, "\u00a0", "\\space"); - defineSymbol(text, spacing, "\u00a0", "\\nobreakspace"); - defineSymbol(math, spacing, null, "\\nobreak"); - defineSymbol(math, spacing, null, "\\allowbreak"); - defineSymbol(math, punct, ",", ","); - defineSymbol(text, punct, ":", ":"); - defineSymbol(math, punct, ";", ";"); - defineSymbol(math, bin, "\u22bc", "\\barwedge"); - defineSymbol(math, bin, "\u22bb", "\\veebar"); - defineSymbol(math, bin, "\u2299", "\\odot", true); - // Firefox turns ⊕ into an emoji. So append \uFE0E. Define Unicode character in macros, not here. - defineSymbol(math, bin, "\u2295\uFE0E", "\\oplus"); - defineSymbol(math, bin, "\u2297", "\\otimes", true); - defineSymbol(math, textord, "\u2202", "\\partial", true); - defineSymbol(math, bin, "\u2298", "\\oslash", true); - defineSymbol(math, bin, "\u229a", "\\circledcirc", true); - defineSymbol(math, bin, "\u22a1", "\\boxdot", true); - defineSymbol(math, bin, "\u25b3", "\\bigtriangleup"); - defineSymbol(math, bin, "\u25bd", "\\bigtriangledown"); - defineSymbol(math, bin, "\u2020", "\\dagger"); - defineSymbol(math, bin, "\u22c4", "\\diamond"); - defineSymbol(math, bin, "\u25c3", "\\triangleleft"); - defineSymbol(math, bin, "\u25b9", "\\triangleright"); - defineSymbol(math, open, "{", "\\{"); - defineSymbol(text, textord, "{", "\\{"); - defineSymbol(text, textord, "{", "\\textbraceleft"); - defineSymbol(math, close, "}", "\\}"); - defineSymbol(text, textord, "}", "\\}"); - defineSymbol(text, textord, "}", "\\textbraceright"); - defineSymbol(math, open, "{", "\\lbrace"); - defineSymbol(math, close, "}", "\\rbrace"); - defineSymbol(math, open, "[", "\\lbrack", true); - defineSymbol(text, textord, "[", "\\lbrack", true); - defineSymbol(math, close, "]", "\\rbrack", true); - defineSymbol(text, textord, "]", "\\rbrack", true); - defineSymbol(math, open, "(", "\\lparen", true); - defineSymbol(math, close, ")", "\\rparen", true); - defineSymbol(math, open, "⦇", "\\llparenthesis", true); - defineSymbol(math, close, "⦈", "\\rrparenthesis", true); - defineSymbol(text, textord, "<", "\\textless", true); // in T1 fontenc - defineSymbol(text, textord, ">", "\\textgreater", true); // in T1 fontenc - defineSymbol(math, open, "\u230a", "\\lfloor", true); - defineSymbol(math, close, "\u230b", "\\rfloor", true); - defineSymbol(math, open, "\u2308", "\\lceil", true); - defineSymbol(math, close, "\u2309", "\\rceil", true); - defineSymbol(math, textord, "\\", "\\backslash"); - defineSymbol(math, textord, "|", "|"); - defineSymbol(math, textord, "|", "\\vert"); - defineSymbol(text, textord, "|", "\\textbar", true); // in T1 fontenc - defineSymbol(math, textord, "\u2016", "\\|"); - defineSymbol(math, textord, "\u2016", "\\Vert"); - defineSymbol(text, textord, "\u2016", "\\textbardbl"); - defineSymbol(text, textord, "~", "\\textasciitilde"); - defineSymbol(text, textord, "\\", "\\textbackslash"); - defineSymbol(text, textord, "^", "\\textasciicircum"); - defineSymbol(math, rel, "\u2191", "\\uparrow", true); - defineSymbol(math, rel, "\u21d1", "\\Uparrow", true); - defineSymbol(math, rel, "\u2193", "\\downarrow", true); - defineSymbol(math, rel, "\u21d3", "\\Downarrow", true); - defineSymbol(math, rel, "\u2195", "\\updownarrow", true); - defineSymbol(math, rel, "\u21d5", "\\Updownarrow", true); - defineSymbol(math, op, "\u2210", "\\coprod"); - defineSymbol(math, op, "\u22c1", "\\bigvee"); - defineSymbol(math, op, "\u22c0", "\\bigwedge"); - defineSymbol(math, op, "\u2a04", "\\biguplus"); - defineSymbol(math, op, "\u22c2", "\\bigcap"); - defineSymbol(math, op, "\u22c3", "\\bigcup"); - defineSymbol(math, op, "\u222b", "\\int"); - defineSymbol(math, op, "\u222b", "\\intop"); - defineSymbol(math, op, "\u222c", "\\iint"); - defineSymbol(math, op, "\u222d", "\\iiint"); - defineSymbol(math, op, "\u220f", "\\prod"); - defineSymbol(math, op, "\u2211", "\\sum"); - defineSymbol(math, op, "\u2a02", "\\bigotimes"); - defineSymbol(math, op, "\u2a01", "\\bigoplus"); - defineSymbol(math, op, "\u2a00", "\\bigodot"); - defineSymbol(math, op, "\u2a09", "\\bigtimes"); - defineSymbol(math, op, "\u222e", "\\oint"); - defineSymbol(math, op, "\u222f", "\\oiint"); - defineSymbol(math, op, "\u2230", "\\oiiint"); - defineSymbol(math, op, "\u2231", "\\intclockwise"); - defineSymbol(math, op, "\u2232", "\\varointclockwise"); - defineSymbol(math, op, "\u2a0c", "\\iiiint"); - defineSymbol(math, op, "\u2a0d", "\\intbar"); - defineSymbol(math, op, "\u2a0e", "\\intBar"); - defineSymbol(math, op, "\u2a0f", "\\fint"); - defineSymbol(math, op, "\u2a12", "\\rppolint"); - defineSymbol(math, op, "\u2a13", "\\scpolint"); - defineSymbol(math, op, "\u2a15", "\\pointint"); - defineSymbol(math, op, "\u2a16", "\\sqint"); - defineSymbol(math, op, "\u2a17", "\\intlarhk"); - defineSymbol(math, op, "\u2a18", "\\intx"); - defineSymbol(math, op, "\u2a19", "\\intcap"); - defineSymbol(math, op, "\u2a1a", "\\intcup"); - defineSymbol(math, op, "\u2a05", "\\bigsqcap"); - defineSymbol(math, op, "\u2a06", "\\bigsqcup"); - defineSymbol(math, op, "\u222b", "\\smallint"); - defineSymbol(text, inner, "\u2026", "\\textellipsis"); - defineSymbol(math, inner, "\u2026", "\\mathellipsis"); - defineSymbol(text, inner, "\u2026", "\\ldots", true); - defineSymbol(math, inner, "\u2026", "\\ldots", true); - defineSymbol(math, inner, "\u22f0", "\\iddots", true); - defineSymbol(math, inner, "\u22ef", "\\@cdots", true); - defineSymbol(math, inner, "\u22f1", "\\ddots", true); - defineSymbol(math, textord, "\u22ee", "\\varvdots"); // \vdots is a macro - defineSymbol(math, accent, "\u02ca", "\\acute"); - defineSymbol(math, accent, "\u0060", "\\grave"); - defineSymbol(math, accent, "\u00a8", "\\ddot"); - defineSymbol(math, accent, "\u2026", "\\dddot"); - defineSymbol(math, accent, "\u2026\u002e", "\\ddddot"); - defineSymbol(math, accent, "\u007e", "\\tilde"); - defineSymbol(math, accent, "\u203e", "\\bar"); - defineSymbol(math, accent, "\u02d8", "\\breve"); - defineSymbol(math, accent, "\u02c7", "\\check"); - defineSymbol(math, accent, "\u005e", "\\hat"); - defineSymbol(math, accent, "\u2192", "\\vec"); - defineSymbol(math, accent, "\u02d9", "\\dot"); - defineSymbol(math, accent, "\u02da", "\\mathring"); - defineSymbol(math, mathord, "\u0131", "\\imath", true); - defineSymbol(math, mathord, "\u0237", "\\jmath", true); - defineSymbol(math, textord, "\u0131", "\u0131"); - defineSymbol(math, textord, "\u0237", "\u0237"); - defineSymbol(text, textord, "\u0131", "\\i", true); - defineSymbol(text, textord, "\u0237", "\\j", true); - defineSymbol(text, textord, "\u00df", "\\ss", true); - defineSymbol(text, textord, "\u00e6", "\\ae", true); - defineSymbol(text, textord, "\u0153", "\\oe", true); - defineSymbol(text, textord, "\u00f8", "\\o", true); - defineSymbol(math, mathord, "\u00f8", "\\o", true); - defineSymbol(text, textord, "\u00c6", "\\AE", true); - defineSymbol(text, textord, "\u0152", "\\OE", true); - defineSymbol(text, textord, "\u00d8", "\\O", true); - defineSymbol(math, mathord, "\u00d8", "\\O", true); - defineSymbol(text, accent, "\u02ca", "\\'"); // acute - defineSymbol(text, accent, "\u02cb", "\\`"); // grave - defineSymbol(text, accent, "\u02c6", "\\^"); // circumflex - defineSymbol(text, accent, "\u02dc", "\\~"); // tilde - defineSymbol(text, accent, "\u02c9", "\\="); // macron - defineSymbol(text, accent, "\u02d8", "\\u"); // breve - defineSymbol(text, accent, "\u02d9", "\\."); // dot above - defineSymbol(text, accent, "\u00b8", "\\c"); // cedilla - defineSymbol(text, accent, "\u02da", "\\r"); // ring above - defineSymbol(text, accent, "\u02c7", "\\v"); // caron - defineSymbol(text, accent, "\u00a8", '\\"'); // diaresis - defineSymbol(text, accent, "\u02dd", "\\H"); // double acute - defineSymbol(math, accent, "\u02ca", "\\'"); // acute - defineSymbol(math, accent, "\u02cb", "\\`"); // grave - defineSymbol(math, accent, "\u02c6", "\\^"); // circumflex - defineSymbol(math, accent, "\u02dc", "\\~"); // tilde - defineSymbol(math, accent, "\u02c9", "\\="); // macron - defineSymbol(math, accent, "\u02d8", "\\u"); // breve - defineSymbol(math, accent, "\u02d9", "\\."); // dot above - defineSymbol(math, accent, "\u00b8", "\\c"); // cedilla - defineSymbol(math, accent, "\u02da", "\\r"); // ring above - defineSymbol(math, accent, "\u02c7", "\\v"); // caron - defineSymbol(math, accent, "\u00a8", '\\"'); // diaresis - defineSymbol(math, accent, "\u02dd", "\\H"); // double acute - - // These ligatures are detected and created in Parser.js's `formLigatures`. - const ligatures = { - "--": true, - "---": true, - "``": true, - "''": true - }; - - defineSymbol(text, textord, "\u2013", "--", true); - defineSymbol(text, textord, "\u2013", "\\textendash"); - defineSymbol(text, textord, "\u2014", "---", true); - defineSymbol(text, textord, "\u2014", "\\textemdash"); - defineSymbol(text, textord, "\u2018", "`", true); - defineSymbol(text, textord, "\u2018", "\\textquoteleft"); - defineSymbol(text, textord, "\u2019", "'", true); - defineSymbol(text, textord, "\u2019", "\\textquoteright"); - defineSymbol(text, textord, "\u201c", "``", true); - defineSymbol(text, textord, "\u201c", "\\textquotedblleft"); - defineSymbol(text, textord, "\u201d", "''", true); - defineSymbol(text, textord, "\u201d", "\\textquotedblright"); - // \degree from gensymb package - defineSymbol(math, textord, "\u00b0", "\\degree", true); - defineSymbol(text, textord, "\u00b0", "\\degree"); - // \textdegree from inputenc package - defineSymbol(text, textord, "\u00b0", "\\textdegree", true); - // TODO: In LaTeX, \pounds can generate a different character in text and math - // mode, but among our fonts, only Main-Regular defines this character "163". - defineSymbol(math, textord, "\u00a3", "\\pounds"); - defineSymbol(math, textord, "\u00a3", "\\mathsterling", true); - defineSymbol(text, textord, "\u00a3", "\\pounds"); - defineSymbol(text, textord, "\u00a3", "\\textsterling", true); - defineSymbol(math, textord, "\u2720", "\\maltese"); - defineSymbol(text, textord, "\u2720", "\\maltese"); - defineSymbol(math, textord, "\u20ac", "\\euro", true); - defineSymbol(text, textord, "\u20ac", "\\euro", true); - defineSymbol(text, textord, "\u20ac", "\\texteuro"); - defineSymbol(math, textord, "\u00a9", "\\copyright", true); - defineSymbol(text, textord, "\u00a9", "\\textcopyright"); - defineSymbol(math, textord, "\u2300", "\\diameter", true); - defineSymbol(text, textord, "\u2300", "\\diameter"); - - // Italic Greek - defineSymbol(math, textord, "𝛤", "\\varGamma"); - defineSymbol(math, textord, "𝛥", "\\varDelta"); - defineSymbol(math, textord, "𝛩", "\\varTheta"); - defineSymbol(math, textord, "𝛬", "\\varLambda"); - defineSymbol(math, textord, "𝛯", "\\varXi"); - defineSymbol(math, textord, "𝛱", "\\varPi"); - defineSymbol(math, textord, "𝛴", "\\varSigma"); - defineSymbol(math, textord, "𝛶", "\\varUpsilon"); - defineSymbol(math, textord, "𝛷", "\\varPhi"); - defineSymbol(math, textord, "𝛹", "\\varPsi"); - defineSymbol(math, textord, "𝛺", "\\varOmega"); - defineSymbol(text, textord, "𝛤", "\\varGamma"); - defineSymbol(text, textord, "𝛥", "\\varDelta"); - defineSymbol(text, textord, "𝛩", "\\varTheta"); - defineSymbol(text, textord, "𝛬", "\\varLambda"); - defineSymbol(text, textord, "𝛯", "\\varXi"); - defineSymbol(text, textord, "𝛱", "\\varPi"); - defineSymbol(text, textord, "𝛴", "\\varSigma"); - defineSymbol(text, textord, "𝛶", "\\varUpsilon"); - defineSymbol(text, textord, "𝛷", "\\varPhi"); - defineSymbol(text, textord, "𝛹", "\\varPsi"); - defineSymbol(text, textord, "𝛺", "\\varOmega"); - - - // There are lots of symbols which are the same, so we add them in afterwards. - // All of these are textords in math mode - const mathTextSymbols = '0123456789/@."'; - for (let i = 0; i < mathTextSymbols.length; i++) { - const ch = mathTextSymbols.charAt(i); - defineSymbol(math, textord, ch, ch); - } - - // All of these are textords in text mode - const textSymbols = '0123456789!@*()-=+";:?/.,'; - for (let i = 0; i < textSymbols.length; i++) { - const ch = textSymbols.charAt(i); - defineSymbol(text, textord, ch, ch); - } - - // All of these are textords in text mode, and mathords in math mode - const letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; - for (let i = 0; i < letters.length; i++) { - const ch = letters.charAt(i); - defineSymbol(math, mathord, ch, ch); - defineSymbol(text, textord, ch, ch); - } - - // Some more letters in Unicode Basic Multilingual Plane. - const narrow = "ÇÐÞçþℂℍℕℙℚℝℤℎℏℊℋℌℐℑℒℓ℘ℛℜℬℰℱℳℭℨ"; - for (let i = 0; i < narrow.length; i++) { - const ch = narrow.charAt(i); - defineSymbol(math, mathord, ch, ch); - defineSymbol(text, textord, ch, ch); - } - - // The next loop loads wide (surrogate pair) characters. - // We support some letters in the Unicode range U+1D400 to U+1D7FF, - // Mathematical Alphanumeric Symbols. - let wideChar = ""; - for (let i = 0; i < letters.length; i++) { - // The hex numbers in the next line are a surrogate pair. - // 0xD835 is the high surrogate for all letters in the range we support. - // 0xDC00 is the low surrogate for bold A. - wideChar = String.fromCharCode(0xd835, 0xdc00 + i); // A-Z a-z bold - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xdc34 + i); // A-Z a-z italic - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xdc68 + i); // A-Z a-z bold italic - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xdd04 + i); // A-Z a-z Fractur - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xdda0 + i); // A-Z a-z sans-serif - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xddd4 + i); // A-Z a-z sans bold - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xde08 + i); // A-Z a-z sans italic - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xde70 + i); // A-Z a-z monospace - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xdd38 + i); // A-Z a-z double struck - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - const ch = letters.charAt(i); - wideChar = String.fromCharCode(0xd835, 0xdc9c + i); // A-Z a-z calligraphic - defineSymbol(math, mathord, ch, wideChar); - defineSymbol(text, textord, ch, wideChar); - } - - // Next, some wide character numerals - for (let i = 0; i < 10; i++) { - wideChar = String.fromCharCode(0xd835, 0xdfce + i); // 0-9 bold - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xdfe2 + i); // 0-9 sans serif - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xdfec + i); // 0-9 bold sans - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xdff6 + i); // 0-9 monospace - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - } - - /* - * Neither Firefox nor Chrome support hard line breaks or soft line breaks. - * (Despite https://www.w3.org/Math/draft-spec/mathml.html#chapter3_presm.lbattrs) - * So Temml has work-arounds for both hard and soft breaks. - * The work-arounds sadly do not work simultaneously. Any top-level hard - * break makes soft line breaks impossible. - * - * Hard breaks are simulated by creating a and putting each line in its own . - * - * To create soft line breaks, Temml avoids using the and tags. - * Then the top level of a element can be occupied by elements, and the browser - * will break after a if the expression extends beyond the container limit. - * - * The default is for soft line breaks after each top-level binary or - * relational operator, per TeXbook p. 173. So we gather the expression into s so that - * each ends in a binary or relational operator. - * - * An option is for soft line breaks before an "=" sign. That changes the s. - * - * Soft line breaks will not work in Chromium and Safari, only Firefox. - * - * Hopefully browsers will someday do their own linebreaking and we will be able to delete - * much of this module. - */ - - const openDelims = "([{⌊⌈⟨⟮⎰⟦⦃"; - const closeDelims = ")]}⌋⌉⟩⟯⎱⟦⦄"; - - function setLineBreaks(expression, wrapMode, isDisplayMode) { - const mtrs = []; - let mrows = []; - let block = []; - let numTopLevelEquals = 0; - let i = 0; - let level = 0; - while (i < expression.length) { - while (expression[i] instanceof DocumentFragment) { - expression.splice(i, 1, ...expression[i].children); // Expand the fragment. - } - const node = expression[i]; - if (node.attributes && node.attributes.linebreak && - node.attributes.linebreak === "newline") { - // A hard line break. Create a for the current block. - if (block.length > 0) { - mrows.push(new mathMLTree.MathNode("mrow", block)); - } - mrows.push(node); - block = []; - const mtd = new mathMLTree.MathNode("mtd", mrows); - mtd.style.textAlign = "left"; - mtrs.push(new mathMLTree.MathNode("mtr", [mtd])); - mrows = []; - i += 1; - continue - } - block.push(node); - if (node.type && node.type === "mo" && node.children.length === 1 && - !Object.hasOwn(node.attributes, "movablelimits")) { - const ch = node.children[0].text; - if (openDelims.indexOf(ch) > -1) { - level += 1; - } else if (closeDelims.indexOf(ch) > -1) { - level -= 1; - } else if (level === 0 && wrapMode === "=" && ch === "=") { - numTopLevelEquals += 1; - if (numTopLevelEquals > 1) { - block.pop(); - // Start a new block. (Insert a soft linebreak.) - const element = new mathMLTree.MathNode("mrow", block); - mrows.push(element); - block = [node]; - } - } else if (level === 0 && wrapMode === "tex" && ch !== "∇") { - // Check if the following node is a \nobreak text node, e.g. "~"" - const next = i < expression.length - 1 ? expression[i + 1] : null; - let glueIsFreeOfNobreak = true; - if ( - !( - next && - next.type === "mtext" && - next.attributes.linebreak && - next.attributes.linebreak === "nobreak" - ) - ) { - // We may need to start a new block. - // First, put any post-operator glue on same line as operator. - for (let j = i + 1; j < expression.length; j++) { - const nd = expression[j]; - if ( - nd.type && - nd.type === "mspace" && - !(nd.attributes.linebreak && nd.attributes.linebreak === "newline") - ) { - block.push(nd); - i += 1; - if ( - nd.attributes && - nd.attributes.linebreak && - nd.attributes.linebreak === "nobreak" - ) { - glueIsFreeOfNobreak = false; - } - } else { - break; - } - } - } - if (glueIsFreeOfNobreak) { - // Start a new block. (Insert a soft linebreak.) - const element = new mathMLTree.MathNode("mrow", block); - mrows.push(element); - block = []; - } - } - } - i += 1; - } - if (block.length > 0) { - const element = new mathMLTree.MathNode("mrow", block); - mrows.push(element); - } - if (mtrs.length > 0) { - const mtd = new mathMLTree.MathNode("mtd", mrows); - mtd.style.textAlign = "left"; - const mtr = new mathMLTree.MathNode("mtr", [mtd]); - mtrs.push(mtr); - const mtable = new mathMLTree.MathNode("mtable", mtrs); - if (!isDisplayMode) { - mtable.setAttribute("columnalign", "left"); - mtable.setAttribute("rowspacing", "0em"); - } - return mtable - } - return mathMLTree.newDocumentFragment(mrows); - } - - /** - * This file converts a parse tree into a corresponding MathML tree. The main - * entry point is the `buildMathML` function, which takes a parse tree from the - * parser. - */ - - /** - * Takes a symbol and converts it into a MathML text node after performing - * optional replacement from symbols.js. - */ - const makeText = function(text, mode, style) { - if ( - symbols[mode][text] && - symbols[mode][text].replace && - text.charCodeAt(0) !== 0xd835 && - !( - Object.prototype.hasOwnProperty.call(ligatures, text) && - style && - ((style.fontFamily && style.fontFamily.slice(4, 6) === "tt") || - (style.font && style.font.slice(4, 6) === "tt")) - ) - ) { - text = symbols[mode][text].replace; - } - - return new mathMLTree.TextNode(text); - }; - - const consolidateText = mrow => { - // If possible, consolidate adjacent elements into a single element. - if (mrow.type !== "mrow" && mrow.type !== "mstyle") { return mrow } - if (mrow.children.length === 0) { return mrow } // empty group, e.g., \text{} - if (!mrow.children[0].attributes || mrow.children[0].type !== "mtext") { return mrow } - const variant = mrow.children[0].attributes.mathvariant || ""; - const mtext = new mathMLTree.MathNode( - "mtext", - [new mathMLTree.TextNode(mrow.children[0].children[0].text)] - ); - for (let i = 1; i < mrow.children.length; i++) { - // Check each child and, if possible, copy the character into child[0]. - const localVariant = mrow.children[i].attributes.mathvariant || ""; - if (mrow.children[i].type === "mrow") { - const childRow = mrow.children[i]; - for (let j = 0; j < childRow.children.length; j++) { - // We'll also check the children of a mrow. One level only. No recursion. - const childVariant = childRow.children[j].attributes.mathvariant || ""; - if (childVariant !== variant || childRow.children[j].type !== "mtext") { - return mrow // At least one element cannot be consolidated. Get out. - } else { - mtext.children[0].text += childRow.children[j].children[0].text; - } - } - } else if (localVariant !== variant || mrow.children[i].type !== "mtext") { - return mrow - } else { - mtext.children[0].text += mrow.children[i].children[0].text; - } - } - // Firefox does not render a space at either end of an string. - // To get proper rendering, we replace leading or trailing spaces with no-break spaces. - if (mtext.children[0].text.charAt(0) === " ") { - mtext.children[0].text = "\u00a0" + mtext.children[0].text.slice(1); - } - const L = mtext.children[0].text.length; - if (L > 0 && mtext.children[0].text.charAt(L - 1) === " ") { - mtext.children[0].text = mtext.children[0].text.slice(0, -1) + "\u00a0"; - } - for (const [key, value] of Object.entries(mrow.attributes)) { - mtext.attributes[key] = value; - } - return mtext - }; - - const numberRegEx$1 = /^[0-9]$/; - const isDotOrComma = (node, followingNode) => { - return ((node.type === "textord" && node.text === ".") || - (node.type === "atom" && node.text === ",")) && - // Don't consolidate if there is a space after the comma. - node.loc && followingNode.loc && node.loc.end === followingNode.loc.start - }; - const consolidateNumbers = expression => { - // Consolidate adjacent numbers. We want to return 1,506.3, - // not 1,506.3 - if (expression.length < 2) { return } - const nums = []; - let inNum = false; - // Find adjacent numerals - for (let i = 0; i < expression.length; i++) { - const node = expression[i]; - if (node.type === "textord" && numberRegEx$1.test(node.text)) { - if (!inNum) { nums.push({ start: i }); } - inNum = true; - } else { - if (inNum) { nums[nums.length - 1].end = i - 1; } - inNum = false; - } - } - if (inNum) { nums[nums.length - 1].end = expression.length - 1; } - - // Determine if numeral groups are separated by a comma or dot. - for (let i = nums.length - 1; i > 0; i--) { - if (nums[i - 1].end === nums[i].start - 2 && - isDotOrComma(expression[nums[i].start - 1], expression[nums[i].start])) { - // Merge the two groups. - nums[i - 1].end = nums[i].end; - nums.splice(i, 1); - } - } - - // Consolidate the number nodes - for (let i = nums.length - 1; i >= 0; i--) { - for (let j = nums[i].start + 1; j <= nums[i].end; j++) { - expression[nums[i].start].text += expression[j].text; - } - expression.splice(nums[i].start + 1, nums[i].end - nums[i].start); - // Check if the is followed by a numeric base in a supsub, e.g. the "3" in 123^4 - // If so, merge the first into the base. - if (expression.length > nums[i].start + 1) { - const nextTerm = expression[nums[i].start + 1]; - if (nextTerm.type === "supsub" && nextTerm.base && nextTerm.base.type === "textord" && - numberRegEx$1.test(nextTerm.base.text)) { - nextTerm.base.text = expression[nums[i].start].text + nextTerm.base.text; - expression.splice(nums[i].start, 1); - } - } - } - }; - - /** - * Wrap the given array of nodes in an node if needed, i.e., - * unless the array has length 1. Always returns a single node. - */ - const makeRow = function(body, semisimple = false) { - if (body.length === 1 && !(body[0] instanceof DocumentFragment)) { - return body[0]; - } else if (!semisimple) { - // Suppress spacing on nodes at both ends of the row. - if (body[0] instanceof MathNode && body[0].type === "mo" && !body[0].attributes.fence) { - body[0].attributes.lspace = "0em"; - body[0].attributes.rspace = "0em"; - } - const end = body.length - 1; - if (body[end] instanceof MathNode && body[end].type === "mo" && !body[end].attributes.fence) { - body[end].attributes.lspace = "0em"; - body[end].attributes.rspace = "0em"; - } - } - return new mathMLTree.MathNode("mrow", body); - }; - - const isRel = item => { - return (item.type === "atom" && item.family === "rel") || - (item.type === "mclass" && item.mclass === "mrel") - }; - - /** - * Takes a list of nodes, builds them, and returns a list of the generated - * MathML nodes. Also do a couple chores along the way: - * (1) Suppress spacing when an author wraps an operator w/braces, as in {=}. - * (2) Suppress spacing between two adjacent relations. - */ - const buildExpression = function(expression, style, semisimple = false) { - if (!semisimple && expression.length === 1) { - const group = buildGroup$1(expression[0], style); - if (group instanceof MathNode && group.type === "mo") { - // When TeX writers want to suppress spacing on an operator, - // they often put the operator by itself inside braces. - group.setAttribute("lspace", "0em"); - group.setAttribute("rspace", "0em"); - } - return [group]; - } - - consolidateNumbers(expression); - - const groups = []; - for (let i = 0; i < expression.length; i++) { - const group = buildGroup$1(expression[i], style); - // Suppress spacing between adjacent relations - if (i < expression.length - 1 && isRel(expression[i]) && isRel(expression[i + 1])) { - group.setAttribute("rspace", "0em"); - } - if (i > 0 && isRel(expression[i]) && isRel(expression[i - 1])) { - group.setAttribute("lspace", "0em"); - } - groups.push(group); - } - return groups; - }; - - /** - * Equivalent to buildExpression, but wraps the elements in an - * if there's more than one. Returns a single node instead of an array. - */ - const buildExpressionRow = function(expression, style, semisimple = false) { - return makeRow(buildExpression(expression, style, semisimple), semisimple); - }; - - /** - * Takes a group from the parser and calls the appropriate groupBuilders function - * on it to produce a MathML node. - */ - const buildGroup$1 = function(group, style) { - if (!group) { - return new mathMLTree.MathNode("mrow"); - } - - if (_mathmlGroupBuilders[group.type]) { - // Call the groupBuilders function - const result = _mathmlGroupBuilders[group.type](group, style); - return result; - } else { - throw new ParseError("Got group of unknown type: '" + group.type + "'"); - } - }; - - const glue$1 = _ => { - return new mathMLTree.MathNode("mtd", [], [], { padding: "0", width: "50%" }) - }; - - const taggedExpression = (expression, tag, style, leqno) => { - tag = buildExpressionRow(tag[0].body, style); - tag = consolidateText(tag); - tag.classes.push("tml-tag"); - - expression = new mathMLTree.MathNode("mtd", [expression]); - const rowArray = [glue$1(), expression, glue$1()]; - rowArray[leqno ? 0 : 2].classes.push(leqno ? "tml-left" : "tml-right"); - rowArray[leqno ? 0 : 2].children.push(tag); - const mtr = new mathMLTree.MathNode("mtr", rowArray, ["tml-tageqn"]); - const table = new mathMLTree.MathNode("mtable", [mtr]); - table.style.width = "100%"; - table.setAttribute("displaystyle", "true"); - return table - }; - - /** - * Takes a full parse tree and settings and builds a MathML representation of - * it. - */ - function buildMathML(tree, texExpression, style, settings) { - // Strip off outer tag wrapper for processing below. - let tag = null; - if (tree.length === 1 && tree[0].type === "tag") { - tag = tree[0].tag; - tree = tree[0].body; - } - - const expression = buildExpression(tree, style); - const wrap = (settings.displayMode || settings.annotate) ? "none" : settings.wrap; - - const n1 = expression.length === 0 ? null : expression[0]; - let wrapper = expression.length === 1 && tag === null && (n1 instanceof MathNode) - ? expression[0] - : setLineBreaks(expression, wrap, settings.displayMode); - - if (tag) { - wrapper = taggedExpression(wrapper, tag, style, settings.leqno); - } - - if (settings.annotate) { - // Build a TeX annotation of the source - const annotation = new mathMLTree.MathNode( - "annotation", [new mathMLTree.TextNode(texExpression)]); - annotation.setAttribute("encoding", "application/x-tex"); - wrapper = new mathMLTree.MathNode("semantics", [wrapper, annotation]); - } - - const math = new mathMLTree.MathNode("math", [wrapper]); - - if (settings.xml) { - math.setAttribute("xmlns", "http://www.w3.org/1998/Math/MathML"); - } - if (settings.displayMode) { - math.setAttribute("display", "block"); - math.style.display = "block math"; // necessary in Chromium. - // Firefox and Safari do not recognize display: "block math". - // Set a class so that the CSS file can set display: block. - math.classes = ["tml-display"]; - } - return math; - } - - const smalls = "acegıȷmnopqrsuvwxyzαγεηικμνοπρςστυχωϕ𝐚𝐜𝐞𝐠𝐦𝐧𝐨𝐩𝐪𝐫𝐬𝐮𝐯𝐰𝐱𝐲𝐳"; - const talls = "ABCDEFGHIJKLMNOPQRSTUVWXYZbdfhkltΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩβδλζφθψ" - + "𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙𝐛𝐝𝐟𝐡𝐤𝐥𝐭"; - const longSmalls = new Set(["\\alpha", "\\gamma", "\\delta", "\\epsilon", "\\eta", "\\iota", - "\\kappa", "\\mu", "\\nu", "\\pi", "\\rho", "\\sigma", "\\tau", "\\upsilon", "\\chi", "\\psi", - "\\omega", "\\imath", "\\jmath"]); - const longTalls = new Set(["\\Gamma", "\\Delta", "\\Sigma", "\\Omega", "\\beta", "\\delta", - "\\lambda", "\\theta", "\\psi"]); - - const mathmlBuilder$a = (group, style) => { - const accentNode = group.isStretchy - ? stretchy.accentNode(group) - : new mathMLTree.MathNode("mo", [makeText(group.label, group.mode)]); - - if (group.label === "\\vec") { - accentNode.style.transform = "scale(0.75) translate(10%, 30%)"; - } else { - accentNode.style.mathStyle = "normal"; - accentNode.style.mathDepth = "0"; - if (needWebkitShift.has(group.label) && utils.isCharacterBox(group.base)) { - let shift = ""; - const ch = group.base.text; - if (smalls.indexOf(ch) > -1 || longSmalls.has(ch)) { shift = "tml-xshift"; } - if (talls.indexOf(ch) > -1 || longTalls.has(ch)) { shift = "tml-capshift"; } - if (shift) { accentNode.classes.push(shift); } - } - } - if (!group.isStretchy) { - accentNode.setAttribute("stretchy", "false"); - } - - const node = new mathMLTree.MathNode((group.label === "\\c" ? "munder" : "mover"), - [buildGroup$1(group.base, style), accentNode] - ); - - return node; - }; - - const nonStretchyAccents = new Set([ - "\\acute", - "\\grave", - "\\ddot", - "\\dddot", - "\\ddddot", - "\\tilde", - "\\bar", - "\\breve", - "\\check", - "\\hat", - "\\vec", - "\\dot", - "\\mathring" - ]); - - const needWebkitShift = new Set([ - "\\acute", - "\\bar", - "\\breve", - "\\check", - "\\dot", - "\\ddot", - "\\grave", - "\\hat", - "\\mathring", - "\\'", "\\^", "\\~", "\\=", "\\u", "\\.", '\\"', "\\r", "\\H", "\\v" - ]); - - // Accents - defineFunction({ - type: "accent", - names: [ - "\\acute", - "\\grave", - "\\ddot", - "\\dddot", - "\\ddddot", - "\\tilde", - "\\bar", - "\\breve", - "\\check", - "\\hat", - "\\vec", - "\\dot", - "\\mathring", - "\\overparen", - "\\widecheck", - "\\widehat", - "\\wideparen", - "\\widetilde", - "\\overrightarrow", - "\\overleftarrow", - "\\Overrightarrow", - "\\overleftrightarrow", - "\\overgroup", - "\\overleftharpoon", - "\\overrightharpoon" - ], - props: { - numArgs: 1 - }, - handler: (context, args) => { - const base = normalizeArgument(args[0]); - - const isStretchy = !nonStretchyAccents.has(context.funcName); - - return { - type: "accent", - mode: context.parser.mode, - label: context.funcName, - isStretchy: isStretchy, - base: base - }; - }, - mathmlBuilder: mathmlBuilder$a - }); - - // Text-mode accents - defineFunction({ - type: "accent", - names: ["\\'", "\\`", "\\^", "\\~", "\\=", "\\c", "\\u", "\\.", '\\"', "\\r", "\\H", "\\v"], - props: { - numArgs: 1, - allowedInText: true, - allowedInMath: true, - argTypes: ["primitive"] - }, - handler: (context, args) => { - const base = normalizeArgument(args[0]); - const mode = context.parser.mode; - - if (mode === "math" && context.parser.settings.strict) { - // LaTeX only writes a warning. It doesn't stop. We'll issue the same warning. - // eslint-disable-next-line no-console - console.log(`Temml parse error: Command ${context.funcName} is invalid in math mode.`); - } - - return { - type: "accent", - mode: mode, - label: context.funcName, - isStretchy: false, - base: base - }; - }, - mathmlBuilder: mathmlBuilder$a - }); - - defineFunction({ - type: "accentUnder", - names: [ - "\\underleftarrow", - "\\underrightarrow", - "\\underleftrightarrow", - "\\undergroup", - "\\underparen", - "\\utilde" - ], - props: { - numArgs: 1 - }, - handler: ({ parser, funcName }, args) => { - const base = args[0]; - return { - type: "accentUnder", - mode: parser.mode, - label: funcName, - base: base - }; - }, - mathmlBuilder: (group, style) => { - const accentNode = stretchy.accentNode(group); - accentNode.style["math-depth"] = 0; - const node = new mathMLTree.MathNode("munder", [ - buildGroup$1(group.base, style), - accentNode - ]); - return node; - } - }); - - /** - * This file does conversion between units. In particular, it provides - * calculateSize to convert other units into CSS units. - */ - - const ptPerUnit = { - // Convert to CSS (Postscipt) points, not TeX points - // https://en.wikibooks.org/wiki/LaTeX/Lengths and - // https://tex.stackexchange.com/a/8263 - pt: 800 / 803, // convert TeX point to CSS (Postscript) point - pc: (12 * 800) / 803, // pica - dd: ((1238 / 1157) * 800) / 803, // didot - cc: ((14856 / 1157) * 800) / 803, // cicero (12 didot) - nd: ((685 / 642) * 800) / 803, // new didot - nc: ((1370 / 107) * 800) / 803, // new cicero (12 new didot) - sp: ((1 / 65536) * 800) / 803, // scaled point (TeX's internal smallest unit) - mm: (25.4 / 72), - cm: (2.54 / 72), - in: (1 / 72), - px: (96 / 72) - }; - - /** - * Determine whether the specified unit (either a string defining the unit - * or a "size" parse node containing a unit field) is valid. - */ - const validUnits = [ - "em", - "ex", - "mu", - "pt", - "mm", - "cm", - "in", - "px", - "bp", - "pc", - "dd", - "cc", - "nd", - "nc", - "sp" - ]; - - const validUnit = function(unit) { - if (typeof unit !== "string") { - unit = unit.unit; - } - return validUnits.indexOf(unit) > -1 - }; - - const emScale = styleLevel => { - const scriptLevel = Math.max(styleLevel - 1, 0); - return [1, 0.7, 0.5][scriptLevel] - }; - - /* - * Convert a "size" parse node (with numeric "number" and string "unit" fields, - * as parsed by functions.js argType "size") into a CSS value. - */ - const calculateSize = function(sizeValue, style) { - let number = sizeValue.number; - if (style.maxSize[0] < 0 && number > 0) { - return { number: 0, unit: "em" } - } - const unit = sizeValue.unit; - switch (unit) { - case "mm": - case "cm": - case "in": - case "px": { - const numInCssPts = number * ptPerUnit[unit]; - if (numInCssPts > style.maxSize[1]) { - return { number: style.maxSize[1], unit: "pt" } - } - return { number, unit }; // absolute CSS units. - } - case "em": - case "ex": { - // In TeX, em and ex do not change size in \scriptstyle. - if (unit === "ex") { number *= 0.431; } - number = Math.min(number / emScale(style.level), style.maxSize[0]); - return { number: utils.round(number), unit: "em" }; - } - case "bp": { - if (number > style.maxSize[1]) { number = style.maxSize[1]; } - return { number, unit: "pt" }; // TeX bp is a CSS pt. (1/72 inch). - } - case "pt": - case "pc": - case "dd": - case "cc": - case "nd": - case "nc": - case "sp": { - number = Math.min(number * ptPerUnit[unit], style.maxSize[1]); - return { number: utils.round(number), unit: "pt" } - } - case "mu": { - number = Math.min(number / 18, style.maxSize[0]); - return { number: utils.round(number), unit: "em" } - } - default: - throw new ParseError("Invalid unit: '" + unit + "'") - } - }; - - // Helper functions - - const padding$2 = width => { - const node = new mathMLTree.MathNode("mspace"); - node.setAttribute("width", width + "em"); - return node - }; - - const paddedNode = (group, lspace = 0.3, rspace = 0) => { - if (group == null && rspace === 0) { return padding$2(lspace) } - const row = group ? [group] : []; - if (lspace !== 0) { row.unshift(padding$2(lspace)); } - if (rspace > 0) { row.push(padding$2(rspace)); } - return new mathMLTree.MathNode("mrow", row) - }; - - const labelSize = (size, scriptLevel) => Number(size) / emScale(scriptLevel); - - const munderoverNode = (fName, body, below, style) => { - const arrowNode = stretchy.mathMLnode(fName); - // Is this the short part of a mhchem equilibrium arrow? - const isEq = fName.slice(1, 3) === "eq"; - const minWidth = fName.charAt(1) === "x" - ? "1.75" // mathtools extensible arrows are ≥ 1.75em long - : fName.slice(2, 4) === "cd" - ? "3.0" // cd package arrows - : isEq - ? "1.0" // The shorter harpoon of a mhchem equilibrium arrow - : "2.0"; // other mhchem arrows - // TODO: When Firefox supports minsize, use the next line. - //arrowNode.setAttribute("minsize", String(minWidth) + "em") - arrowNode.setAttribute("lspace", "0"); - arrowNode.setAttribute("rspace", (isEq ? "0.5em" : "0")); - - // upper and lower labels are set to scriptlevel by MathML - // So we have to adjust our label dimensions accordingly. - const labelStyle = style.withLevel(style.level < 2 ? 2 : 3); - const minArrowWidth = labelSize(minWidth, labelStyle.level); - // The dummyNode will be inside a inside a - // So it will be at scriptlevel 3 - const dummyWidth = labelSize(minWidth, 3); - const emptyLabel = paddedNode(null, minArrowWidth.toFixed(4), 0); - const dummyNode = paddedNode(null, dummyWidth.toFixed(4), 0); - // The arrow is a little longer than the label. Set a spacer length. - const space = labelSize((isEq ? 0 : 0.3), labelStyle.level).toFixed(4); - let upperNode; - let lowerNode; - - const gotUpper = (body && body.body && - // \hphantom visible content - (body.body.body || body.body.length > 0)); - if (gotUpper) { - let label = buildGroup$1(body, labelStyle); - label = paddedNode(label, space, space); - // Since Firefox does not support minsize, stack a invisible node - // on top of the label. Its width will serve as a min-width. - // TODO: Refactor this after Firefox supports minsize. - upperNode = new mathMLTree.MathNode("mover", [label, dummyNode]); - } - const gotLower = (below && below.body && - (below.body.body || below.body.length > 0)); - if (gotLower) { - let label = buildGroup$1(below, labelStyle); - label = paddedNode(label, space, space); - lowerNode = new mathMLTree.MathNode("munder", [label, dummyNode]); - } - - let node; - if (!gotUpper && !gotLower) { - node = new mathMLTree.MathNode("mover", [arrowNode, emptyLabel]); - } else if (gotUpper && gotLower) { - node = new mathMLTree.MathNode("munderover", [arrowNode, lowerNode, upperNode]); - } else if (gotUpper) { - node = new mathMLTree.MathNode("mover", [arrowNode, upperNode]); - } else { - node = new mathMLTree.MathNode("munder", [arrowNode, lowerNode]); - } - if (minWidth === "3.0") { node.style.height = "1em"; } // CD environment - node.setAttribute("accent", "false"); // Necessary for MS Word - return node - }; - - // Stretchy arrows with an optional argument - defineFunction({ - type: "xArrow", - names: [ - "\\xleftarrow", - "\\xrightarrow", - "\\xLeftarrow", - "\\xRightarrow", - "\\xleftrightarrow", - "\\xLeftrightarrow", - "\\xhookleftarrow", - "\\xhookrightarrow", - "\\xmapsto", - "\\xrightharpoondown", - "\\xrightharpoonup", - "\\xleftharpoondown", - "\\xleftharpoonup", - "\\xlongequal", - "\\xtwoheadrightarrow", - "\\xtwoheadleftarrow", - // The next 5 functions are here only to support mhchem - "\\yields", - "\\yieldsLeft", - "\\mesomerism", - "\\longrightharpoonup", - "\\longleftharpoondown", - // The next 3 functions are here only to support the {CD} environment. - "\\\\cdrightarrow", - "\\\\cdleftarrow", - "\\\\cdlongequal" - ], - props: { - numArgs: 1, - numOptionalArgs: 1 - }, - handler({ parser, funcName }, args, optArgs) { - return { - type: "xArrow", - mode: parser.mode, - name: funcName, - body: args[0], - below: optArgs[0] - }; - }, - mathmlBuilder(group, style) { - // Build the arrow and its labels. - const node = munderoverNode(group.name, group.body, group.below, style); - // Create operator spacing for a relation. - const row = [node]; - row.unshift(padding$2(0.2778)); - row.push(padding$2(0.2778)); - return new mathMLTree.MathNode("mrow", row) - } - }); - - const arrowComponent = { - "\\xtofrom": ["\\xrightarrow", "\\xleftarrow"], - "\\xleftrightharpoons": ["\\xleftharpoonup", "\\xrightharpoondown"], - "\\xrightleftharpoons": ["\\xrightharpoonup", "\\xleftharpoondown"], - "\\yieldsLeftRight": ["\\yields", "\\yieldsLeft"], - // The next three all get the same harpoon glyphs. Only the lengths and paddings differ. - "\\equilibrium": ["\\longrightharpoonup", "\\longleftharpoondown"], - "\\equilibriumRight": ["\\longrightharpoonup", "\\eqleftharpoondown"], - "\\equilibriumLeft": ["\\eqrightharpoonup", "\\longleftharpoondown"] - }; - - // Browsers are not good at stretching a glyph that contains a pair of stacked arrows such as ⇄. - // So we stack a pair of single arrows. - defineFunction({ - type: "stackedArrow", - names: [ - "\\xtofrom", // expfeil - "\\xleftrightharpoons", // mathtools - "\\xrightleftharpoons", // mathtools - "\\yieldsLeftRight", // mhchem - "\\equilibrium", // mhchem - "\\equilibriumRight", - "\\equilibriumLeft" - ], - props: { - numArgs: 1, - numOptionalArgs: 1 - }, - handler({ parser, funcName }, args, optArgs) { - const lowerArrowBody = args[0] - ? { - type: "hphantom", - mode: parser.mode, - body: args[0] - } - : null; - const upperArrowBelow = optArgs[0] - ? { - type: "hphantom", - mode: parser.mode, - body: optArgs[0] - } - : null; - return { - type: "stackedArrow", - mode: parser.mode, - name: funcName, - body: args[0], - upperArrowBelow, - lowerArrowBody, - below: optArgs[0] - }; - }, - mathmlBuilder(group, style) { - const topLabel = arrowComponent[group.name][0]; - const botLabel = arrowComponent[group.name][1]; - const topArrow = munderoverNode(topLabel, group.body, group.upperArrowBelow, style); - const botArrow = munderoverNode(botLabel, group.lowerArrowBody, group.below, style); - let wrapper; - - const raiseNode = new mathMLTree.MathNode("mpadded", [topArrow]); - raiseNode.setAttribute("voffset", "0.3em"); - raiseNode.setAttribute("height", "+0.3em"); - raiseNode.setAttribute("depth", "-0.3em"); - // One of the arrows is given ~zero width. so the other has the same horzontal alignment. - if (group.name === "\\equilibriumLeft") { - const botNode = new mathMLTree.MathNode("mpadded", [botArrow]); - botNode.setAttribute("width", "0.5em"); - wrapper = new mathMLTree.MathNode( - "mpadded", - [padding$2(0.2778), botNode, raiseNode, padding$2(0.2778)] - ); - } else { - raiseNode.setAttribute("width", (group.name === "\\equilibriumRight" ? "0.5em" : "0")); - wrapper = new mathMLTree.MathNode( - "mpadded", - [padding$2(0.2778), raiseNode, botArrow, padding$2(0.2778)] - ); - } - - wrapper.setAttribute("voffset", "-0.18em"); - wrapper.setAttribute("height", "-0.18em"); - wrapper.setAttribute("depth", "+0.18em"); - return wrapper - } - }); - - /** - * Asserts that the node is of the given type and returns it with stricter - * typing. Throws if the node's type does not match. - */ - function assertNodeType(node, type) { - if (!node || node.type !== type) { - throw new Error( - `Expected node of type ${type}, but got ` + - (node ? `node of type ${node.type}` : String(node)) - ); - } - return node; - } - - /** - * Returns the node more strictly typed iff it is of the given type. Otherwise, - * returns null. - */ - function assertSymbolNodeType(node) { - const typedNode = checkSymbolNodeType(node); - if (!typedNode) { - throw new Error( - `Expected node of symbol group type, but got ` + - (node ? `node of type ${node.type}` : String(node)) - ); - } - return typedNode; - } - - /** - * Returns the node more strictly typed iff it is of the given type. Otherwise, - * returns null. - */ - function checkSymbolNodeType(node) { - if (node && (node.type === "atom" || - Object.prototype.hasOwnProperty.call(NON_ATOMS, node.type))) { - return node; - } - return null; - } - - const cdArrowFunctionName = { - ">": "\\\\cdrightarrow", - "<": "\\\\cdleftarrow", - "=": "\\\\cdlongequal", - A: "\\uparrow", - V: "\\downarrow", - "|": "\\Vert", - ".": "no arrow" - }; - - const newCell = () => { - // Create an empty cell, to be filled below with parse nodes. - return { type: "styling", body: [], mode: "math", scriptLevel: "display" }; - }; - - const isStartOfArrow = (node) => { - return node.type === "textord" && node.text === "@"; - }; - - const isLabelEnd = (node, endChar) => { - return (node.type === "mathord" || node.type === "atom") && node.text === endChar; - }; - - function cdArrow(arrowChar, labels, parser) { - // Return a parse tree of an arrow and its labels. - // This acts in a way similar to a macro expansion. - const funcName = cdArrowFunctionName[arrowChar]; - switch (funcName) { - case "\\\\cdrightarrow": - case "\\\\cdleftarrow": - return parser.callFunction(funcName, [labels[0]], [labels[1]]); - case "\\uparrow": - case "\\downarrow": { - const leftLabel = parser.callFunction("\\\\cdleft", [labels[0]], []); - const bareArrow = { - type: "atom", - text: funcName, - mode: "math", - family: "rel" - }; - const sizedArrow = parser.callFunction("\\Big", [bareArrow], []); - const rightLabel = parser.callFunction("\\\\cdright", [labels[1]], []); - const arrowGroup = { - type: "ordgroup", - mode: "math", - body: [leftLabel, sizedArrow, rightLabel], - semisimple: true - }; - return parser.callFunction("\\\\cdparent", [arrowGroup], []); - } - case "\\\\cdlongequal": - return parser.callFunction("\\\\cdlongequal", [], []); - case "\\Vert": { - const arrow = { type: "textord", text: "\\Vert", mode: "math" }; - return parser.callFunction("\\Big", [arrow], []); - } - default: - return { type: "textord", text: " ", mode: "math" }; - } - } - - function parseCD(parser) { - // Get the array's parse nodes with \\ temporarily mapped to \cr. - const parsedRows = []; - parser.gullet.beginGroup(); - parser.gullet.macros.set("\\cr", "\\\\\\relax"); - parser.gullet.beginGroup(); - while (true) { // eslint-disable-line no-constant-condition - // Get the parse nodes for the next row. - parsedRows.push(parser.parseExpression(false, "\\\\")); - parser.gullet.endGroup(); - parser.gullet.beginGroup(); - const next = parser.fetch().text; - if (next === "&" || next === "\\\\") { - parser.consume(); - } else if (next === "\\end") { - if (parsedRows[parsedRows.length - 1].length === 0) { - parsedRows.pop(); // final row ended in \\ - } - break; - } else { - throw new ParseError("Expected \\\\ or \\cr or \\end", parser.nextToken); - } - } - - let row = []; - const body = [row]; - - // Loop thru the parse nodes. Collect them into cells and arrows. - for (let i = 0; i < parsedRows.length; i++) { - // Start a new row. - const rowNodes = parsedRows[i]; - // Create the first cell. - let cell = newCell(); - - for (let j = 0; j < rowNodes.length; j++) { - if (!isStartOfArrow(rowNodes[j])) { - // If a parseNode is not an arrow, it goes into a cell. - cell.body.push(rowNodes[j]); - } else { - // Parse node j is an "@", the start of an arrow. - // Before starting on the arrow, push the cell into `row`. - row.push(cell); - - // Now collect parseNodes into an arrow. - // The character after "@" defines the arrow type. - j += 1; - const arrowChar = assertSymbolNodeType(rowNodes[j]).text; - - // Create two empty label nodes. We may or may not use them. - const labels = new Array(2); - labels[0] = { type: "ordgroup", mode: "math", body: [] }; - labels[1] = { type: "ordgroup", mode: "math", body: [] }; - - // Process the arrow. - if ("=|.".indexOf(arrowChar) > -1) ; else if ("<>AV".indexOf(arrowChar) > -1) { - // Four arrows, `@>>>`, `@<<<`, `@AAA`, and `@VVV`, each take - // two optional labels. E.g. the right-point arrow syntax is - // really: @>{optional label}>{optional label}> - // Collect parseNodes into labels. - for (let labelNum = 0; labelNum < 2; labelNum++) { - let inLabel = true; - for (let k = j + 1; k < rowNodes.length; k++) { - if (isLabelEnd(rowNodes[k], arrowChar)) { - inLabel = false; - j = k; - break; - } - if (isStartOfArrow(rowNodes[k])) { - throw new ParseError( - "Missing a " + arrowChar + " character to complete a CD arrow.", - rowNodes[k] - ); - } - - labels[labelNum].body.push(rowNodes[k]); - } - if (inLabel) { - // isLabelEnd never returned a true. - throw new ParseError( - "Missing a " + arrowChar + " character to complete a CD arrow.", - rowNodes[j] - ); - } - } - } else { - throw new ParseError(`Expected one of "<>AV=|." after @.`); - } - - // Now join the arrow to its labels. - const arrow = cdArrow(arrowChar, labels, parser); - - // Wrap the arrow in a styling node - row.push(arrow); - // In CD's syntax, cells are implicit. That is, everything that - // is not an arrow gets collected into a cell. So create an empty - // cell now. It will collect upcoming parseNodes. - cell = newCell(); - } - } - if (i % 2 === 0) { - // Even-numbered rows consist of: cell, arrow, cell, arrow, ... cell - // The last cell is not yet pushed into `row`, so: - row.push(cell); - } else { - // Odd-numbered rows consist of: vert arrow, empty cell, ... vert arrow - // Remove the empty cell that was placed at the beginning of `row`. - row.shift(); - } - row = []; - body.push(row); - } - body.pop(); - - // End row group - parser.gullet.endGroup(); - // End array group defining \\ - parser.gullet.endGroup(); - - return { - type: "array", - mode: "math", - body, - envClasses: ["jot", "cd"], - cols: [], - hLinesBeforeRow: new Array(body.length + 1).fill([]) - }; - } - - // The functions below are not available for general use. - // They are here only for internal use by the {CD} environment in placing labels - // next to vertical arrows. - - // We don't need any such functions for horizontal arrows because we can reuse - // the functionality that already exists for extensible arrows. - - defineFunction({ - type: "cdlabel", - names: ["\\\\cdleft", "\\\\cdright"], - props: { - numArgs: 1 - }, - handler({ parser, funcName }, args) { - return { - type: "cdlabel", - mode: parser.mode, - side: funcName.slice(4), - label: args[0] - }; - }, - mathmlBuilder(group, style) { - let label = new mathMLTree.MathNode("mrow", [buildGroup$1(group.label, style)]); - label = new mathMLTree.MathNode("mpadded", [label]); - label.setAttribute("width", "0"); - if (group.side === "left") { - label.setAttribute("lspace", "-1width"); - } - // We have to guess at vertical alignment. We know the arrow is 1.8em tall, - // But we don't know the height or depth of the label. - label.setAttribute("voffset", "0.7em"); - label = new mathMLTree.MathNode("mstyle", [label]); - label.setAttribute("displaystyle", "false"); - label.setAttribute("scriptlevel", "1"); - return label; - } - }); - - defineFunction({ - type: "cdlabelparent", - names: ["\\\\cdparent"], - props: { - numArgs: 1 - }, - handler({ parser }, args) { - return { - type: "cdlabelparent", - mode: parser.mode, - fragment: args[0] - }; - }, - mathmlBuilder(group, style) { - return new mathMLTree.MathNode("mrow", [buildGroup$1(group.fragment, style)]); - } - }); - - // \@char is an internal function that takes a grouped decimal argument like - // {123} and converts into symbol with code 123. It is used by the *macro* - // \char defined in macros.js. - defineFunction({ - type: "textord", - names: ["\\@char"], - props: { - numArgs: 1, - allowedInText: true - }, - handler({ parser, token }, args) { - const arg = assertNodeType(args[0], "ordgroup"); - const group = arg.body; - let number = ""; - for (let i = 0; i < group.length; i++) { - const node = assertNodeType(group[i], "textord"); - number += node.text; - } - const code = parseInt(number); - if (isNaN(code)) { - throw new ParseError(`\\@char has non-numeric argument ${number}`, token) - } - return { - type: "textord", - mode: parser.mode, - text: String.fromCodePoint(code) - } - } - }); - - // Helpers - const htmlRegEx = /^(#[a-f0-9]{3}|#?[a-f0-9]{6})$/i; - const htmlOrNameRegEx = /^(#[a-f0-9]{3}|#?[a-f0-9]{6}|[a-z]+)$/i; - const RGBregEx = /^ *\d{1,3} *(?:, *\d{1,3} *){2}$/; - const rgbRegEx = /^ *[10](?:\.\d*)? *(?:, *[10](?:\.\d*)? *){2}$/; - const xcolorHtmlRegEx = /^[a-f0-9]{6}$/i; - const toHex = num => { - let str = num.toString(16); - if (str.length === 1) { str = "0" + str; } - return str - }; - - // Colors from Tables 4.1 and 4.2 of the xcolor package. - // Table 4.1 (lower case) RGB values are taken from chroma and xcolor.dtx. - // Table 4.2 (Capitalizzed) values were sampled, because Chroma contains a unreliable - // conversion from cmyk to RGB. See https://tex.stackexchange.com/a/537274. - const xcolors = JSON.parse(`{ - "Apricot": "#ffb484", - "Aquamarine": "#08b4bc", - "Bittersweet": "#c84c14", - "blue": "#0000FF", - "Blue": "#303494", - "BlueGreen": "#08b4bc", - "BlueViolet": "#503c94", - "BrickRed": "#b8341c", - "brown": "#BF8040", - "Brown": "#802404", - "BurntOrange": "#f8941c", - "CadetBlue": "#78749c", - "CarnationPink": "#f884b4", - "Cerulean": "#08a4e4", - "CornflowerBlue": "#40ace4", - "cyan": "#00FFFF", - "Cyan": "#08acec", - "Dandelion": "#ffbc44", - "darkgray": "#404040", - "DarkOrchid": "#a8548c", - "Emerald": "#08ac9c", - "ForestGreen": "#089c54", - "Fuchsia": "#90348c", - "Goldenrod": "#ffdc44", - "gray": "#808080", - "Gray": "#98949c", - "green": "#00FF00", - "Green": "#08a44c", - "GreenYellow": "#e0e474", - "JungleGreen": "#08ac9c", - "Lavender": "#f89cc4", - "lightgray": "#c0c0c0", - "lime": "#BFFF00", - "LimeGreen": "#90c43c", - "magenta": "#FF00FF", - "Magenta": "#f0048c", - "Mahogany": "#b0341c", - "Maroon": "#b03434", - "Melon": "#f89c7c", - "MidnightBlue": "#086494", - "Mulberry": "#b03c94", - "NavyBlue": "#086cbc", - "olive": "#7F7F00", - "OliveGreen": "#407c34", - "orange": "#FF8000", - "Orange": "#f8843c", - "OrangeRed": "#f0145c", - "Orchid": "#b074ac", - "Peach": "#f8945c", - "Periwinkle": "#8074bc", - "PineGreen": "#088c74", - "pink": "#ff7f7f", - "Plum": "#98248c", - "ProcessBlue": "#08b4ec", - "purple": "#BF0040", - "Purple": "#a0449c", - "RawSienna": "#983c04", - "red": "#ff0000", - "Red": "#f01c24", - "RedOrange": "#f86434", - "RedViolet": "#a0246c", - "Rhodamine": "#f0549c", - "Royallue": "#0874bc", - "RoyalPurple": "#683c9c", - "RubineRed": "#f0047c", - "Salmon": "#f8948c", - "SeaGreen": "#30bc9c", - "Sepia": "#701404", - "SkyBlue": "#48c4dc", - "SpringGreen": "#c8dc64", - "Tan": "#e09c74", - "teal": "#007F7F", - "TealBlue": "#08acb4", - "Thistle": "#d884b4", - "Turquoise": "#08b4cc", - "violet": "#800080", - "Violet": "#60449c", - "VioletRed": "#f054a4", - "WildStrawberry": "#f0246c", - "yellow": "#FFFF00", - "Yellow": "#fff404", - "YellowGreen": "#98cc6c", - "YellowOrange": "#ffa41c" -}`); - - const colorFromSpec = (model, spec) => { - let color = ""; - if (model === "HTML") { - if (!htmlRegEx.test(spec)) { - throw new ParseError("Invalid HTML input.") - } - color = spec; - } else if (model === "RGB") { - if (!RGBregEx.test(spec)) { - throw new ParseError("Invalid RGB input.") - } - spec.split(",").map(e => { color += toHex(Number(e.trim())); }); - } else { - if (!rgbRegEx.test(spec)) { - throw new ParseError("Invalid rbg input.") - } - spec.split(",").map(e => { - const num = Number(e.trim()); - if (num > 1) { throw new ParseError("Color rgb input must be < 1.") } - color += toHex(Number((num * 255).toFixed(0))); - }); - } - if (color.charAt(0) !== "#") { color = "#" + color; } - return color - }; - - const validateColor = (color, macros, token) => { - const macroName = `\\\\color@${color}`; // from \defineColor. - const match = htmlOrNameRegEx.exec(color); - if (!match) { throw new ParseError("Invalid color: '" + color + "'", token) } - // We allow a 6-digit HTML color spec without a leading "#". - // This follows the xcolor package's HTML color model. - // Predefined color names are all missed by this RegEx pattern. - if (xcolorHtmlRegEx.test(color)) { - return "#" + color - } else if (color.charAt(0) === "#") { - return color - } else if (macros.has(macroName)) { - color = macros.get(macroName).tokens[0].text; - } else if (xcolors[color]) { - color = xcolors[color]; - } - return color - }; - - const mathmlBuilder$9 = (group, style) => { - // In LaTeX, color is not supposed to change the spacing of any node. - // So instead of wrapping the group in an , we apply - // the color individually to each node and return a document fragment. - let expr = buildExpression(group.body, style.withColor(group.color)); - expr = expr.map(e => { - e.style.color = group.color; - return e - }); - return mathMLTree.newDocumentFragment(expr) - }; - - defineFunction({ - type: "color", - names: ["\\textcolor"], - props: { - numArgs: 2, - numOptionalArgs: 1, - allowedInText: true, - argTypes: ["raw", "raw", "original"] - }, - handler({ parser, token }, args, optArgs) { - const model = optArgs[0] && assertNodeType(optArgs[0], "raw").string; - let color = ""; - if (model) { - const spec = assertNodeType(args[0], "raw").string; - color = colorFromSpec(model, spec); - } else { - color = validateColor(assertNodeType(args[0], "raw").string, parser.gullet.macros, token); - } - const body = args[1]; - return { - type: "color", - mode: parser.mode, - color, - body: ordargument(body) - } - }, - mathmlBuilder: mathmlBuilder$9 - }); - - defineFunction({ - type: "color", - names: ["\\color"], - props: { - numArgs: 1, - numOptionalArgs: 1, - allowedInText: true, - argTypes: ["raw", "raw"] - }, - handler({ parser, breakOnTokenText, token }, args, optArgs) { - const model = optArgs[0] && assertNodeType(optArgs[0], "raw").string; - let color = ""; - if (model) { - const spec = assertNodeType(args[0], "raw").string; - color = colorFromSpec(model, spec); - } else { - color = validateColor(assertNodeType(args[0], "raw").string, parser.gullet.macros, token); - } - - // Parse out the implicit body that should be colored. - const body = parser.parseExpression(true, breakOnTokenText, true); - - return { - type: "color", - mode: parser.mode, - color, - body - } - }, - mathmlBuilder: mathmlBuilder$9 - }); - - defineFunction({ - type: "color", - names: ["\\definecolor"], - props: { - numArgs: 3, - allowedInText: true, - argTypes: ["raw", "raw", "raw"] - }, - handler({ parser, funcName, token }, args) { - const name = assertNodeType(args[0], "raw").string; - if (!/^[A-Za-z]+$/.test(name)) { - throw new ParseError("Color name must be latin letters.", token) - } - const model = assertNodeType(args[1], "raw").string; - if (!["HTML", "RGB", "rgb"].includes(model)) { - throw new ParseError("Color model must be HTML, RGB, or rgb.", token) - } - const spec = assertNodeType(args[2], "raw").string; - const color = colorFromSpec(model, spec); - parser.gullet.macros.set(`\\\\color@${name}`, { tokens: [{ text: color }], numArgs: 0 }); - return { type: "internal", mode: parser.mode } - } - // No mathmlBuilder. The point of \definecolor is to set a macro. - }); - - // Row breaks within tabular environments, and line breaks at top level - - // \DeclareRobustCommand\\{...\@xnewline} - defineFunction({ - type: "cr", - names: ["\\\\"], - props: { - numArgs: 0, - numOptionalArgs: 0, - allowedInText: true - }, - - handler({ parser }, args, optArgs) { - const size = parser.gullet.future().text === "[" ? parser.parseSizeGroup(true) : null; - const newLine = !parser.settings.displayMode; - return { - type: "cr", - mode: parser.mode, - newLine, - size: size && assertNodeType(size, "size").value - } - }, - - // The following builder is called only at the top level, - // not within tabular/array environments. - - mathmlBuilder(group, style) { - // MathML 3.0 calls for newline to occur in an or an . - // Ref: https://www.w3.org/TR/MathML3/chapter3.html#presm.linebreaking - const node = new mathMLTree.MathNode("mo"); - if (group.newLine) { - node.setAttribute("linebreak", "newline"); - if (group.size) { - const size = calculateSize(group.size, style); - node.setAttribute("height", size.number + size.unit); - } - } - return node - } - }); - - const globalMap = { - "\\global": "\\global", - "\\long": "\\\\globallong", - "\\\\globallong": "\\\\globallong", - "\\def": "\\gdef", - "\\gdef": "\\gdef", - "\\edef": "\\xdef", - "\\xdef": "\\xdef", - "\\let": "\\\\globallet", - "\\futurelet": "\\\\globalfuture" - }; - - const checkControlSequence = (tok) => { - const name = tok.text; - if (/^(?:[\\{}$&#^_]|EOF)$/.test(name)) { - throw new ParseError("Expected a control sequence", tok); - } - return name; - }; - - const getRHS = (parser) => { - let tok = parser.gullet.popToken(); - if (tok.text === "=") { - // consume optional equals - tok = parser.gullet.popToken(); - if (tok.text === " ") { - // consume one optional space - tok = parser.gullet.popToken(); - } - } - return tok; - }; - - const letCommand = (parser, name, tok, global) => { - let macro = parser.gullet.macros.get(tok.text); - if (macro == null) { - // don't expand it later even if a macro with the same name is defined - // e.g., \let\foo=\frac \def\frac{\relax} \frac12 - tok.noexpand = true; - macro = { - tokens: [tok], - numArgs: 0, - // reproduce the same behavior in expansion - unexpandable: !parser.gullet.isExpandable(tok.text) - }; - } - parser.gullet.macros.set(name, macro, global); - }; - - // -> | - // -> |\global - // -> | - // -> \global|\long|\outer - defineFunction({ - type: "internal", - names: [ - "\\global", - "\\long", - "\\\\globallong" // can’t be entered directly - ], - props: { - numArgs: 0, - allowedInText: true - }, - handler({ parser, funcName }) { - parser.consumeSpaces(); - const token = parser.fetch(); - if (globalMap[token.text]) { - // Temml doesn't have \par, so ignore \long - if (funcName === "\\global" || funcName === "\\\\globallong") { - token.text = globalMap[token.text]; - } - return assertNodeType(parser.parseFunction(), "internal"); - } - throw new ParseError(`Invalid token after macro prefix`, token); - } - }); - - // Basic support for macro definitions: \def, \gdef, \edef, \xdef - // -> - // -> \def|\gdef|\edef|\xdef - // -> - defineFunction({ - type: "internal", - names: ["\\def", "\\gdef", "\\edef", "\\xdef"], - props: { - numArgs: 0, - allowedInText: true, - primitive: true - }, - handler({ parser, funcName }) { - let tok = parser.gullet.popToken(); - const name = tok.text; - if (/^(?:[\\{}$&#^_]|EOF)$/.test(name)) { - throw new ParseError("Expected a control sequence", tok); - } - - let numArgs = 0; - let insert; - const delimiters = [[]]; - // contains no braces - while (parser.gullet.future().text !== "{") { - tok = parser.gullet.popToken(); - if (tok.text === "#") { - // If the very last character of the is #, so that - // this # is immediately followed by {, TeX will behave as if the { - // had been inserted at the right end of both the parameter text - // and the replacement text. - if (parser.gullet.future().text === "{") { - insert = parser.gullet.future(); - delimiters[numArgs].push("{"); - break; - } - - // A parameter, the first appearance of # must be followed by 1, - // the next by 2, and so on; up to nine #’s are allowed - tok = parser.gullet.popToken(); - if (!/^[1-9]$/.test(tok.text)) { - throw new ParseError(`Invalid argument number "${tok.text}"`); - } - if (parseInt(tok.text) !== numArgs + 1) { - throw new ParseError(`Argument number "${tok.text}" out of order`); - } - numArgs++; - delimiters.push([]); - } else if (tok.text === "EOF") { - throw new ParseError("Expected a macro definition"); - } else { - delimiters[numArgs].push(tok.text); - } - } - // replacement text, enclosed in '{' and '}' and properly nested - let { tokens } = parser.gullet.consumeArg(); - if (insert) { - tokens.unshift(insert); - } - - if (funcName === "\\edef" || funcName === "\\xdef") { - tokens = parser.gullet.expandTokens(tokens); - if (tokens.length > parser.gullet.settings.maxExpand) { - throw new ParseError("Too many expansions in an " + funcName); - } - tokens.reverse(); // to fit in with stack order - } - // Final arg is the expansion of the macro - parser.gullet.macros.set( - name, - { tokens, numArgs, delimiters }, - funcName === globalMap[funcName] - ); - return { type: "internal", mode: parser.mode }; - } - }); - - // -> - // -> \futurelet - // | \let - // -> |= - defineFunction({ - type: "internal", - names: [ - "\\let", - "\\\\globallet" // can’t be entered directly - ], - props: { - numArgs: 0, - allowedInText: true, - primitive: true - }, - handler({ parser, funcName }) { - const name = checkControlSequence(parser.gullet.popToken()); - parser.gullet.consumeSpaces(); - const tok = getRHS(parser); - letCommand(parser, name, tok, funcName === "\\\\globallet"); - return { type: "internal", mode: parser.mode }; - } - }); - - // ref: https://www.tug.org/TUGboat/tb09-3/tb22bechtolsheim.pdf - defineFunction({ - type: "internal", - names: [ - "\\futurelet", - "\\\\globalfuture" // can’t be entered directly - ], - props: { - numArgs: 0, - allowedInText: true, - primitive: true - }, - handler({ parser, funcName }) { - const name = checkControlSequence(parser.gullet.popToken()); - const middle = parser.gullet.popToken(); - const tok = parser.gullet.popToken(); - letCommand(parser, name, tok, funcName === "\\\\globalfuture"); - parser.gullet.pushToken(tok); - parser.gullet.pushToken(middle); - return { type: "internal", mode: parser.mode }; - } - }); - - defineFunction({ - type: "internal", - names: ["\\newcommand", "\\renewcommand", "\\providecommand"], - props: { - numArgs: 0, - allowedInText: true, - primitive: true - }, - handler({ parser, funcName }) { - let name = ""; - const tok = parser.gullet.popToken(); - if (tok.text === "{") { - name = checkControlSequence(parser.gullet.popToken()); - parser.gullet.popToken(); - } else { - name = checkControlSequence(tok); - } - - const exists = parser.gullet.isDefined(name); - if (exists && funcName === "\\newcommand") { - throw new ParseError( - `\\newcommand{${name}} attempting to redefine ${name}; use \\renewcommand` - ); - } - if (!exists && funcName === "\\renewcommand") { - throw new ParseError( - `\\renewcommand{${name}} when command ${name} does not yet exist; use \\newcommand` - ); - } - - let numArgs = 0; - if (parser.gullet.future().text === "[") { - let tok = parser.gullet.popToken(); - tok = parser.gullet.popToken(); - if (!/^[0-9]$/.test(tok.text)) { - throw new ParseError(`Invalid number of arguments: "${tok.text}"`); - } - numArgs = parseInt(tok.text); - tok = parser.gullet.popToken(); - if (tok.text !== "]") { - throw new ParseError(`Invalid argument "${tok.text}"`); - } - } - - // replacement text, enclosed in '{' and '}' and properly nested - const { tokens } = parser.gullet.consumeArg(); - - parser.gullet.macros.set( - name, - { tokens, numArgs }, - !parser.settings.strict - ); - - return { type: "internal", mode: parser.mode }; - - } - }); - - // Extra data needed for the delimiter handler down below - const delimiterSizes = { - "\\bigl": { mclass: "mopen", size: 1 }, - "\\Bigl": { mclass: "mopen", size: 2 }, - "\\biggl": { mclass: "mopen", size: 3 }, - "\\Biggl": { mclass: "mopen", size: 4 }, - "\\bigr": { mclass: "mclose", size: 1 }, - "\\Bigr": { mclass: "mclose", size: 2 }, - "\\biggr": { mclass: "mclose", size: 3 }, - "\\Biggr": { mclass: "mclose", size: 4 }, - "\\bigm": { mclass: "mrel", size: 1 }, - "\\Bigm": { mclass: "mrel", size: 2 }, - "\\biggm": { mclass: "mrel", size: 3 }, - "\\Biggm": { mclass: "mrel", size: 4 }, - "\\big": { mclass: "mord", size: 1 }, - "\\Big": { mclass: "mord", size: 2 }, - "\\bigg": { mclass: "mord", size: 3 }, - "\\Bigg": { mclass: "mord", size: 4 } - }; - - const delimiters = [ - "(", - "\\lparen", - ")", - "\\rparen", - "[", - "\\lbrack", - "]", - "\\rbrack", - "\\{", - "\\lbrace", - "\\}", - "\\rbrace", - "⦇", - "\\llparenthesis", - "⦈", - "\\rrparenthesis", - "\\lfloor", - "\\rfloor", - "\u230a", - "\u230b", - "\\lceil", - "\\rceil", - "\u2308", - "\u2309", - "<", - ">", - "\\langle", - "\u27e8", - "\\rangle", - "\u27e9", - "\\lAngle", - "\u27ea", - "\\rAngle", - "\u27eb", - "\\llangle", - "⦉", - "\\rrangle", - "⦊", - "\\lt", - "\\gt", - "\\lvert", - "\\rvert", - "\\lVert", - "\\rVert", - "\\lgroup", - "\\rgroup", - "\u27ee", - "\u27ef", - "\\lmoustache", - "\\rmoustache", - "\u23b0", - "\u23b1", - "\\llbracket", - "\\rrbracket", - "\u27e6", - "\u27e6", - "\\lBrace", - "\\rBrace", - "\u2983", - "\u2984", - "/", - "\\backslash", - "|", - "\\vert", - "\\|", - "\\Vert", - "\\uparrow", - "\\Uparrow", - "\\downarrow", - "\\Downarrow", - "\\updownarrow", - "\\Updownarrow", - "." - ]; - - // Export isDelimiter for benefit of parser. - const dels = ["}", "\\left", "\\middle", "\\right"]; - const isDelimiter = str => str.length > 0 && - (delimiters.includes(str) || delimiterSizes[str] || dels.includes(str)); - - // Metrics of the different sizes. Found by looking at TeX's output of - // $\bigl| // \Bigl| \biggl| \Biggl| \showlists$ - // Used to create stacked delimiters of appropriate sizes in makeSizedDelim. - const sizeToMaxHeight = [0, 1.2, 1.8, 2.4, 3.0]; - - // Delimiter functions - function checkDelimiter(delim, context) { - const symDelim = checkSymbolNodeType(delim); - if (symDelim && delimiters.includes(symDelim.text)) { - // If a character is not in the MathML operator dictionary, it will not stretch. - // Replace such characters w/characters that will stretch. - if (["/", "\u2044"].includes(symDelim.text)) { symDelim.text = "\u2215"; } - if (["<", "\\lt"].includes(symDelim.text)) { symDelim.text = "⟨"; } - if ([">", "\\gt"].includes(symDelim.text)) { symDelim.text = "⟩"; } - if (symDelim.text === "\\backslash") { symDelim.text = "\u2216"; } - return symDelim; - } else if (symDelim) { - throw new ParseError(`Invalid delimiter '${symDelim.text}' after '${context.funcName}'`, delim); - } else { - throw new ParseError(`Invalid delimiter type '${delim.type}'`, delim); - } - } - - defineFunction({ - type: "delimsizing", - names: [ - "\\bigl", - "\\Bigl", - "\\biggl", - "\\Biggl", - "\\bigr", - "\\Bigr", - "\\biggr", - "\\Biggr", - "\\bigm", - "\\Bigm", - "\\biggm", - "\\Biggm", - "\\big", - "\\Big", - "\\bigg", - "\\Bigg" - ], - props: { - numArgs: 1, - argTypes: ["primitive"] - }, - handler: (context, args) => { - const delim = checkDelimiter(args[0], context); - - return { - type: "delimsizing", - mode: context.parser.mode, - size: delimiterSizes[context.funcName].size, - mclass: delimiterSizes[context.funcName].mclass, - delim: delim.text - }; - }, - mathmlBuilder: (group) => { - const children = []; - - if (group.delim === ".") { group.delim = ""; } - children.push(makeText(group.delim, group.mode)); - - const node = new mathMLTree.MathNode("mo", children); - - if (group.mclass === "mopen" || group.mclass === "mclose") { - // Only some of the delimsizing functions act as fences, and they - // return "mopen" or "mclose" mclass. - node.setAttribute("fence", "true"); - } else { - // Explicitly disable fencing if it's not a fence, to override the - // defaults. - node.setAttribute("fence", "false"); - } - if (group.delim === "\u2216" || group.delim === "\\vert" || - group.delim === "|" || group.delim.indexOf("arrow") > -1) { - // We have to explicitly set stretchy to true. - node.setAttribute("stretchy", "true"); - } - node.setAttribute("symmetric", "true"); // Needed for tall arrows in Firefox. - node.setAttribute("minsize", sizeToMaxHeight[group.size] + "em"); - node.setAttribute("maxsize", sizeToMaxHeight[group.size] + "em"); - return node; - } - }); - - function assertParsed(group) { - if (!group.body) { - throw new Error("Bug: The leftright ParseNode wasn't fully parsed."); - } - } - - defineFunction({ - type: "leftright-right", - names: ["\\right"], - props: { - numArgs: 1, - argTypes: ["primitive"] - }, - handler: (context, args) => { - return { - type: "leftright-right", - mode: context.parser.mode, - delim: checkDelimiter(args[0], context).text - }; - } - }); - - defineFunction({ - type: "leftright", - names: ["\\left"], - props: { - numArgs: 1, - argTypes: ["primitive"] - }, - handler: (context, args) => { - const delim = checkDelimiter(args[0], context); - - const parser = context.parser; - // Parse out the implicit body - ++parser.leftrightDepth; - // parseExpression stops before '\\right' or `\\middle` - let body = parser.parseExpression(false, null, true); - let nextToken = parser.fetch(); - while (nextToken.text === "\\middle") { - // `\middle`, from the ε-TeX package, ends one group and starts another group. - // We had to parse this expression with `breakOnMiddle` enabled in order - // to get TeX-compliant parsing of \over. - // But we do not want, at this point, to end on \middle, so continue - // to parse until we fetch a `\right`. - parser.consume(); - const middle = parser.fetch().text; - if (!symbols.math[middle]) { - throw new ParseError(`Invalid delimiter '${middle}' after '\\middle'`); - } - checkDelimiter({ type: "atom", mode: "math", text: middle }, { funcName: "\\middle" }); - body.push({ type: "middle", mode: "math", delim: middle }); - parser.consume(); - body = body.concat(parser.parseExpression(false, null, true)); - nextToken = parser.fetch(); - } - --parser.leftrightDepth; - // Check the next token - parser.expect("\\right", false); - const right = assertNodeType(parser.parseFunction(), "leftright-right"); - return { - type: "leftright", - mode: parser.mode, - body, - left: delim.text, - right: right.delim - }; - }, - mathmlBuilder: (group, style) => { - assertParsed(group); - const inner = buildExpression(group.body, style); - - if (group.left === ".") { group.left = ""; } - const leftNode = new mathMLTree.MathNode("mo", [makeText(group.left, group.mode)]); - leftNode.setAttribute("fence", "true"); - leftNode.setAttribute("form", "prefix"); - if (group.left === "\u2216" || group.left.indexOf("arrow") > -1) { - leftNode.setAttribute("stretchy", "true"); - } - inner.unshift(leftNode); - - if (group.right === ".") { group.right = ""; } - const rightNode = new mathMLTree.MathNode("mo", [makeText(group.right, group.mode)]); - rightNode.setAttribute("fence", "true"); - rightNode.setAttribute("form", "postfix"); - if (group.right === "\u2216" || group.right.indexOf("arrow") > -1) { - rightNode.setAttribute("stretchy", "true"); - } - inner.push(rightNode); - - return makeRow(inner); - } - }); - - defineFunction({ - type: "middle", - names: ["\\middle"], - props: { - numArgs: 1, - argTypes: ["primitive"] - }, - handler: (context, args) => { - const delim = checkDelimiter(args[0], context); - if (!context.parser.leftrightDepth) { - throw new ParseError("\\middle without preceding \\left", delim); - } - - return { - type: "middle", - mode: context.parser.mode, - delim: delim.text - }; - }, - mathmlBuilder: (group, style) => { - const textNode = makeText(group.delim, group.mode); - const middleNode = new mathMLTree.MathNode("mo", [textNode]); - middleNode.setAttribute("fence", "true"); - if (group.delim.indexOf("arrow") > -1) { - middleNode.setAttribute("stretchy", "true"); - } - // The next line is not semantically correct, but - // Chromium fails to stretch if it is not there. - middleNode.setAttribute("form", "prefix"); - // MathML gives 5/18em spacing to each element. - // \middle should get delimiter spacing instead. - middleNode.setAttribute("lspace", "0.05em"); - middleNode.setAttribute("rspace", "0.05em"); - return middleNode; - } - }); - - const padding$1 = _ => { - const node = new mathMLTree.MathNode("mspace"); - node.setAttribute("width", "3pt"); - return node - }; - - const mathmlBuilder$8 = (group, style) => { - let node; - if (group.label.indexOf("colorbox") > -1 || group.label === "\\boxed") { - // MathML core does not support +width attribute in . - // Firefox does not reliably add side padding. - // Insert - node = new mathMLTree.MathNode("mrow", [ - padding$1(), - buildGroup$1(group.body, style), - padding$1() - ]); - } else { - node = new mathMLTree.MathNode("mrow", [buildGroup$1(group.body, style)]); - } - switch (group.label) { - case "\\overline": - node.style.padding = "0.1em 0 0 0"; - node.style.borderTop = "0.065em solid"; - break - case "\\underline": - node.style.padding = "0 0 0.1em 0"; - node.style.borderBottom = "0.065em solid"; - break - case "\\cancel": - // We can't use an inline background-gradient. It does not work client-side. - // So set a class and put the rule in the external CSS file. - node.classes.push("tml-cancel"); - break - case "\\bcancel": - node.classes.push("tml-bcancel"); - break - /* - case "\\longdiv": - node.setAttribute("notation", "longdiv"); - break - case "\\phase": - node.setAttribute("notation", "phasorangle"); - break */ - case "\\angl": - node.style.padding = "0.03889em 0.03889em 0 0.03889em"; - node.style.borderTop = "0.049em solid"; - node.style.borderRight = "0.049em solid"; - node.style.marginRight = "0.03889em"; - break - case "\\sout": - node.style.backgroundImage = 'linear-gradient(black, black)'; - node.style.backgroundRepeat = 'no-repeat'; - node.style.backgroundSize = '100% 1.5px'; - node.style.backgroundPosition = '0 center'; - break - case "\\boxed": - // \newcommand{\boxed}[1]{\fbox{\m@th$\displaystyle#1$}} from amsmath.sty - node.style = { padding: "3pt 0 3pt 0", border: "1px solid" }; - node.setAttribute("scriptlevel", "0"); - node.setAttribute("displaystyle", "true"); - break - case "\\fbox": - node.style = { padding: "3pt", border: "1px solid" }; - break - case "\\fcolorbox": - case "\\colorbox": { - // doesn't have a good notation option for \colorbox. - // So use instead. Set some attributes that come - // included with . - //const fboxsep = 3; // 3 pt from LaTeX source2e - //node.setAttribute("height", `+${2 * fboxsep}pt`) - //node.setAttribute("voffset", `${fboxsep}pt`) - const style = { padding: "3pt 0 3pt 0" }; - - if (group.label === "\\fcolorbox") { - style.border = "0.06em solid " + String(group.borderColor); - } - node.style = style; - break - } - case "\\xcancel": - node.classes.push("tml-xcancel"); - break - } - if (group.backgroundColor) { - node.setAttribute("mathbackground", group.backgroundColor); - } - return node; - }; - - defineFunction({ - type: "enclose", - names: ["\\colorbox"], - props: { - numArgs: 2, - numOptionalArgs: 1, - allowedInText: true, - argTypes: ["raw", "raw", "text"] - }, - handler({ parser, funcName }, args, optArgs) { - const model = optArgs[0] && assertNodeType(optArgs[0], "raw").string; - let color = ""; - if (model) { - const spec = assertNodeType(args[0], "raw").string; - color = colorFromSpec(model, spec); - } else { - color = validateColor(assertNodeType(args[0], "raw").string, parser.gullet.macros); - } - const body = args[1]; - return { - type: "enclose", - mode: parser.mode, - label: funcName, - backgroundColor: color, - body - }; - }, - mathmlBuilder: mathmlBuilder$8 - }); - - defineFunction({ - type: "enclose", - names: ["\\fcolorbox"], - props: { - numArgs: 3, - numOptionalArgs: 1, - allowedInText: true, - argTypes: ["raw", "raw", "raw", "text"] - }, - handler({ parser, funcName }, args, optArgs) { - const model = optArgs[0] && assertNodeType(optArgs[0], "raw").string; - let borderColor = ""; - let backgroundColor; - if (model) { - const borderSpec = assertNodeType(args[0], "raw").string; - const backgroundSpec = assertNodeType(args[0], "raw").string; - borderColor = colorFromSpec(model, borderSpec); - backgroundColor = colorFromSpec(model, backgroundSpec); - } else { - borderColor = validateColor(assertNodeType(args[0], "raw").string, parser.gullet.macros); - backgroundColor = validateColor(assertNodeType(args[1], "raw").string, parser.gullet.macros); - } - const body = args[2]; - return { - type: "enclose", - mode: parser.mode, - label: funcName, - backgroundColor, - borderColor, - body - }; - }, - mathmlBuilder: mathmlBuilder$8 - }); - - defineFunction({ - type: "enclose", - names: ["\\fbox"], - props: { - numArgs: 1, - argTypes: ["hbox"], - allowedInText: true - }, - handler({ parser }, args) { - return { - type: "enclose", - mode: parser.mode, - label: "\\fbox", - body: args[0] - }; - } - }); - - defineFunction({ - type: "enclose", - names: ["\\angl", "\\cancel", "\\bcancel", "\\xcancel", "\\sout", "\\overline", "\\boxed"], - // , "\\phase", "\\longdiv" - props: { - numArgs: 1 - }, - handler({ parser, funcName }, args) { - const body = args[0]; - return { - type: "enclose", - mode: parser.mode, - label: funcName, - body - }; - }, - mathmlBuilder: mathmlBuilder$8 - }); - - defineFunction({ - type: "enclose", - names: ["\\underline"], - props: { - numArgs: 1, - allowedInText: true - }, - handler({ parser, funcName }, args) { - const body = args[0]; - return { - type: "enclose", - mode: parser.mode, - label: funcName, - body - }; - }, - mathmlBuilder: mathmlBuilder$8 - }); - - /** - * All registered environments. - * `environments.js` exports this same dictionary again and makes it public. - * `Parser.js` requires this dictionary via `environments.js`. - */ - const _environments = {}; - - function defineEnvironment({ type, names, props, handler, mathmlBuilder }) { - // Set default values of environments. - const data = { - type, - numArgs: props.numArgs || 0, - allowedInText: false, - numOptionalArgs: 0, - handler - }; - for (let i = 0; i < names.length; ++i) { - _environments[names[i]] = data; - } - if (mathmlBuilder) { - _mathmlGroupBuilders[type] = mathmlBuilder; - } - } - - // In TeX, there are actually three sets of dimensions, one for each of - - // Math style is not quite the same thing as script level. - const StyleLevel = { - DISPLAY: 0, - TEXT: 1, - SCRIPT: 2, - SCRIPTSCRIPT: 3 - }; - - // Helper functions - function getHLines(parser) { - // Return an array. The array length = number of hlines. - // Each element in the array tells if the line is dashed. - const hlineInfo = []; - parser.consumeSpaces(); - let nxt = parser.fetch().text; - if (nxt === "\\relax") { - parser.consume(); - parser.consumeSpaces(); - nxt = parser.fetch().text; - } - while (nxt === "\\hline" || nxt === "\\hdashline") { - parser.consume(); - hlineInfo.push(nxt === "\\hdashline"); - parser.consumeSpaces(); - nxt = parser.fetch().text; - } - return hlineInfo; - } - - const validateAmsEnvironmentContext = context => { - const settings = context.parser.settings; - if (!settings.displayMode) { - throw new ParseError(`{${context.envName}} can be used only in display mode.`); - } - }; - - const getTag = (group, style, rowNum) => { - let tag; - const tagContents = group.tags.shift(); - if (tagContents) { - // The author has written a \tag or a \notag in this row. - if (tagContents.body) { - tag = buildExpressionRow(tagContents.body, style, true); - tag.classes = ["tml-tag"]; - } else { - // \notag. Return an empty span. - tag = new mathMLTree.MathNode("mtext", [], []); - return tag - } - } else if (group.envClasses.includes("multline") && - ((group.leqno && rowNum !== 0) || (!group.leqno && rowNum !== group.body.length - 1))) { - // A multiline that does not receive a tag. Return an empty cell. - tag = new mathMLTree.MathNode("mtext", [], []); - return tag - } else { - // AMS automatcally numbered equaton. - // Insert a class so the element can be populated by a CSS counter. - // WebKit will display the CSS counter only inside a span. - tag = new mathMLTree.MathNode("mtext", [new Span(["tml-eqn"])]); - } - return tag - }; - - /** - * Parse the body of the environment, with rows delimited by \\ and - * columns delimited by &, and create a nested list in row-major order - * with one group per cell. If given an optional argument scriptLevel - * ("text", "display", etc.), then each cell is cast into that scriptLevel. - */ - function parseArray( - parser, - { - cols, // [{ type: string , align: l|c|r|null }] - envClasses, // align(ed|at|edat) | array | cases | cd | small | multline - addEqnNum, // boolean - singleRow, // boolean - emptySingleRow, // boolean - maxNumCols, // number - leqno // boolean - }, - scriptLevel - ) { - parser.gullet.beginGroup(); - if (!singleRow) { - // \cr is equivalent to \\ without the optional size argument (see below) - // TODO: provide helpful error when \cr is used outside array environment - parser.gullet.macros.set("\\cr", "\\\\\\relax"); - } - if (addEqnNum) { - parser.gullet.macros.set("\\tag", "\\@ifstar\\envtag@literal\\envtag@paren"); - parser.gullet.macros.set("\\envtag@paren", "\\env@tag{{(\\text{#1})}}"); - parser.gullet.macros.set("\\envtag@literal", "\\env@tag{\\text{#1}}"); - parser.gullet.macros.set("\\notag", "\\env@notag"); - parser.gullet.macros.set("\\nonumber", "\\env@notag"); - } - - // Start group for first cell - parser.gullet.beginGroup(); - - let row = []; - const body = [row]; - const rowGaps = []; - const tags = []; - let rowTag; - const hLinesBeforeRow = []; - - // Test for \hline at the top of the array. - hLinesBeforeRow.push(getHLines(parser)); - - // eslint-disable-next-line no-constant-condition - while (true) { - // Parse each cell in its own group (namespace) - let cell = parser.parseExpression(false, singleRow ? "\\end" : "\\\\"); - - if (addEqnNum && !rowTag) { - // Check if the author wrote a \tag{} inside this cell. - for (let i = 0; i < cell.length; i++) { - if (cell[i].type === "envTag" || cell[i].type === "noTag") { - // Get the contents of the \text{} nested inside the \env@Tag{} - rowTag = cell[i].type === "envTag" - ? cell.splice(i, 1)[0].body.body[0] - : { body: null }; - break - } - } - } - parser.gullet.endGroup(); - parser.gullet.beginGroup(); - - cell = { - type: "ordgroup", - mode: parser.mode, - body: cell, - semisimple: true - }; - row.push(cell); - const next = parser.fetch().text; - if (next === "&") { - if (maxNumCols && row.length === maxNumCols) { - if (envClasses.includes("array")) { - if (parser.settings.strict) { - throw new ParseError("Too few columns " + "specified in the {array} column argument.", - parser.nextToken) - } - } else if (maxNumCols === 2) { - throw new ParseError("The split environment accepts no more than two columns", - parser.nextToken); - } else { - throw new ParseError("The equation environment accepts only one column", - parser.nextToken) - } - } - parser.consume(); - } else if (next === "\\end") { - // Arrays terminate newlines with `\crcr` which consumes a `\cr` if - // the last line is empty. However, AMS environments keep the - // empty row if it's the only one. - // NOTE: Currently, `cell` is the last item added into `row`. - if (row.length === 1 && cell.body.length === 0 && (body.length > 1 || !emptySingleRow)) { - body.pop(); - } - if (hLinesBeforeRow.length < body.length + 1) { - hLinesBeforeRow.push([]); - } - break; - } else if (next === "\\\\") { - parser.consume(); - let size; - // \def\Let@{\let\\\math@cr} - // \def\math@cr{...\math@cr@} - // \def\math@cr@{\new@ifnextchar[\math@cr@@{\math@cr@@[\z@]}} - // \def\math@cr@@[#1]{...\math@cr@@@...} - // \def\math@cr@@@{\cr} - if (parser.gullet.future().text !== " ") { - size = parser.parseSizeGroup(true); - } - rowGaps.push(size ? size.value : null); - - tags.push(rowTag); - - // check for \hline(s) following the row separator - hLinesBeforeRow.push(getHLines(parser)); - - row = []; - rowTag = null; - body.push(row); - } else { - throw new ParseError("Expected & or \\\\ or \\cr or \\end", parser.nextToken); - } - } - - // End cell group - parser.gullet.endGroup(); - // End array group defining \cr - parser.gullet.endGroup(); - - tags.push(rowTag); - - return { - type: "array", - mode: parser.mode, - body, - cols, - rowGaps, - hLinesBeforeRow, - envClasses, - addEqnNum, - scriptLevel, - tags, - leqno - }; - } - - // Decides on a scriptLevel for cells in an array according to whether the given - // environment name starts with the letter 'd'. - function dCellStyle(envName) { - return envName.slice(0, 1) === "d" ? "display" : "text" - } - - const alignMap = { - c: "center ", - l: "left ", - r: "right " - }; - - const glue = group => { - const glueNode = new mathMLTree.MathNode("mtd", []); - glueNode.style = { padding: "0", width: "50%" }; - if (group.envClasses.includes("multline")) { - glueNode.style.width = "7.5%"; - } - return glueNode - }; - - const mathmlBuilder$7 = function(group, style) { - const tbl = []; - const numRows = group.body.length; - const hlines = group.hLinesBeforeRow; - - for (let i = 0; i < numRows; i++) { - const rw = group.body[i]; - const row = []; - const cellLevel = group.scriptLevel === "text" - ? StyleLevel.TEXT - : group.scriptLevel === "script" - ? StyleLevel.SCRIPT - : StyleLevel.DISPLAY; - - for (let j = 0; j < rw.length; j++) { - const mtd = new mathMLTree.MathNode( - "mtd", - [buildGroup$1(rw[j], style.withLevel(cellLevel))] - ); - - if (group.envClasses.includes("multline")) { - const align = i === 0 ? "left" : i === numRows - 1 ? "right" : "center"; - mtd.setAttribute("columnalign", align); - if (align !== "center") { - mtd.classes.push("tml-" + align); - } - } - row.push(mtd); - } - if (group.addEqnNum) { - row.unshift(glue(group)); - row.push(glue(group)); - const tag = getTag(group, style.withLevel(cellLevel), i); - if (group.leqno) { - row[0].children.push(tag); - row[0].classes.push("tml-left"); - } else { - row[row.length - 1].children.push(tag); - row[row.length - 1].classes.push("tml-right"); - } - } - const mtr = new mathMLTree.MathNode("mtr", row, []); - // Write horizontal rules - if (i === 0 && hlines[0].length > 0) { - if (hlines[0].length === 2) { - mtr.children.forEach(cell => { cell.style.borderTop = "0.15em double"; }); - } else { - mtr.children.forEach(cell => { - cell.style.borderTop = hlines[0][0] ? "0.06em dashed" : "0.06em solid"; - }); - } - } - if (hlines[i + 1].length > 0) { - if (hlines[i + 1].length === 2) { - mtr.children.forEach(cell => { cell.style.borderBottom = "0.15em double"; }); - } else { - mtr.children.forEach(cell => { - cell.style.borderBottom = hlines[i + 1][0] ? "0.06em dashed" : "0.06em solid"; - }); - } - } - tbl.push(mtr); - } - - if (group.envClasses.length > 0) { - const pad = group.envClasses.includes("jot") - ? "0.7" // 0.5ex + 0.09em top & bot padding - : group.envClasses.includes("small") - ? "0.35" - : "0.5"; // 0.5ex default top & bot padding - const sidePadding = group.envClasses.includes("abut") - ? "0" - : group.envClasses.includes("cases") - ? "0" - : group.envClasses.includes("small") - ? "0.1389" - : group.envClasses.includes("cd") - ? "0.25" - : "0.4"; // default side padding - - const numCols = tbl.length === 0 ? 0 : tbl[0].children.length; - - const sidePad = (j, hand) => { - if (j === 0 && hand === 0) { return "0" } - if (j === numCols - 1 && hand === 1) { return "0" } - if (group.envClasses[0] !== "align") { return sidePadding } - if (hand === 1) { return "0" } - if (group.addEqnNum) { - return (j % 2) ? "1" : "0" - } else { - return (j % 2) ? "0" : "1" - } - }; - - // Padding - for (let i = 0; i < tbl.length; i++) { - for (let j = 0; j < tbl[i].children.length; j++) { - tbl[i].children[j].style.padding = `${pad}ex ${sidePad(j, 1)}em ${pad}ex ${sidePad(j, 0)}em`; - } - } - - // Justification - const align = group.envClasses.includes("align") || group.envClasses.includes("alignat"); - for (let i = 0; i < tbl.length; i++) { - const row = tbl[i]; - if (align) { - for (let j = 0; j < row.children.length; j++) { - // Chromium does not recognize text-align: left. Use -webkit- - // TODO: Remove -webkit- when Chromium no longer needs it. - row.children[j].classes = ["tml-" + (j % 2 ? "left" : "right")]; - } - if (group.addEqnNum) { - const k = group.leqno ? 0 : row.children.length - 1; - row.children[k].classes = ["tml-" + (group.leqno ? "left" : "right")]; - } - } - if (row.children.length > 1 && group.envClasses.includes("cases")) { - row.children[1].style.padding = row.children[1].style.padding.replace(/0em$/, "1em"); - } - - if (group.envClasses.includes("cases") || group.envClasses.includes("subarray")) { - for (const cell of row.children) { - cell.classes.push("tml-left"); - } - } - } - } else { - // Set zero padding on side of the matrix - for (let i = 0; i < tbl.length; i++) { - tbl[i].children[0].style.paddingLeft = "0em"; - if (tbl[i].children.length === tbl[0].children.length) { - tbl[i].children[tbl[i].children.length - 1].style.paddingRight = "0em"; - } - } - } - - let table = new mathMLTree.MathNode("mtable", tbl); - if (group.scriptLevel === "display") { table.setAttribute("displaystyle", "true"); } - - if (group.addEqnNum || group.envClasses.includes("multline")) { - table.style.width = "100%"; - } - - // Column separator lines and column alignment - let align = ""; - - if (group.cols && group.cols.length > 0) { - const cols = group.cols; - let prevTypeWasAlign = false; - let iStart = 0; - let iEnd = cols.length; - - while (cols[iStart].type === "separator") { - iStart += 1; - } - while (cols[iEnd - 1].type === "separator") { - iEnd -= 1; - } - - if (cols[0].type === "separator") { - const sep = cols[1].type === "separator" - ? "0.15em double" - : cols[0].separator === "|" - ? "0.06em solid " - : "0.06em dashed "; - for (const row of table.children) { - row.children[0].style.borderLeft = sep; - } - } - let iCol = group.addEqnNum ? 0 : -1; - for (let i = iStart; i < iEnd; i++) { - if (cols[i].type === "align") { - const colAlign = alignMap[cols[i].align]; - align += colAlign; - iCol += 1; - for (const row of table.children) { - if (colAlign.trim() !== "center" && iCol < row.children.length) { - row.children[iCol].classes = ["tml-" + colAlign.trim()]; - } - } - prevTypeWasAlign = true; - } else if (cols[i].type === "separator") { - // MathML accepts only single lines between cells. - // So we read only the first of consecutive separators. - if (prevTypeWasAlign) { - const sep = cols[i + 1].type === "separator" - ? "0.15em double" - : cols[i].separator === "|" - ? "0.06em solid" - : "0.06em dashed"; - for (const row of table.children) { - if (iCol < row.children.length) { - row.children[iCol].style.borderRight = sep; - } - } - } - prevTypeWasAlign = false; - } - } - if (cols[cols.length - 1].type === "separator") { - const sep = cols[cols.length - 2].type === "separator" - ? "0.15em double" - : cols[cols.length - 1].separator === "|" - ? "0.06em solid" - : "0.06em dashed"; - for (const row of table.children) { - row.children[row.children.length - 1].style.borderRight = sep; - row.children[row.children.length - 1].style.paddingRight = "0.4em"; - } - } - } - if (group.addEqnNum) { - // allow for glue cells on each side - align = "left " + (align.length > 0 ? align : "center ") + "right "; - } - if (align) { - // Firefox reads this attribute, not the -webkit-left|right written above. - // TODO: When Chrome no longer needs "-webkit-", use CSS and delete the next line. - table.setAttribute("columnalign", align.trim()); - } - - if (group.envClasses.includes("small")) { - // A small array. Wrap in scriptstyle. - table = new mathMLTree.MathNode("mstyle", [table]); - table.setAttribute("scriptlevel", "1"); - } - - return table - }; - - // Convenience function for align, align*, aligned, alignat, alignat*, alignedat, split. - const alignedHandler = function(context, args) { - if (context.envName.indexOf("ed") === -1) { - validateAmsEnvironmentContext(context); - } - const cols = []; - const res = parseArray( - context.parser, - { - cols, - addEqnNum: context.envName === "align" || context.envName === "alignat", - emptySingleRow: true, - envClasses: ["abut", "jot"], // set row spacing & provisional column spacing - maxNumCols: context.envName === "split" ? 2 : undefined, - leqno: context.parser.settings.leqno - }, - "display" - ); - - // Determining number of columns. - // 1. If the first argument is given, we use it as a number of columns, - // and makes sure that each row doesn't exceed that number. - // 2. Otherwise, just count number of columns = maximum number - // of cells in each row ("aligned" mode -- isAligned will be true). - // - // At the same time, prepend empty group {} at beginning of every second - // cell in each row (starting with second cell) so that operators become - // binary. This behavior is implemented in amsmath's \start@aligned. - let numMaths; - let numCols = 0; - const isAlignedAt = context.envName.indexOf("at") > -1; - if (args[0] && isAlignedAt) { - // alignat environment takes an argument w/ number of columns - let arg0 = ""; - for (let i = 0; i < args[0].body.length; i++) { - const textord = assertNodeType(args[0].body[i], "textord"); - arg0 += textord.text; - } - if (isNaN(arg0)) { - throw new ParseError("The alignat enviroment requires a numeric first argument.") - } - numMaths = Number(arg0); - numCols = numMaths * 2; - } - res.body.forEach(function(row) { - if (isAlignedAt) { - // Case 1 - const curMaths = row.length / 2; - if (numMaths < curMaths) { - throw new ParseError( - "Too many math in a row: " + `expected ${numMaths}, but got ${curMaths}`, - row[0] - ); - } - } else if (numCols < row.length) { - // Case 2 - numCols = row.length; - } - }); - - // Adjusting alignment. - // In aligned mode, we add one \qquad between columns; - // otherwise we add nothing. - for (let i = 0; i < numCols; ++i) { - let align = "r"; - if (i % 2 === 1) { - align = "l"; - } - cols[i] = { - type: "align", - align: align - }; - } - if (context.envName === "split") ; else if (isAlignedAt) { - res.envClasses.push("alignat"); // Sets justification - } else { - res.envClasses[0] = "align"; // Sets column spacing & justification - } - return res; - }; - - // Arrays are part of LaTeX, defined in lttab.dtx so its documentation - // is part of the source2e.pdf file of LaTeX2e source documentation. - // {darray} is an {array} environment where cells are set in \displaystyle, - // as defined in nccmath.sty. - defineEnvironment({ - type: "array", - names: ["array", "darray"], - props: { - numArgs: 1 - }, - handler(context, args) { - // Since no types are specified above, the two possibilities are - // - The argument is wrapped in {} or [], in which case Parser's - // parseGroup() returns an "ordgroup" wrapping some symbol node. - // - The argument is a bare symbol node. - const symNode = checkSymbolNodeType(args[0]); - const colalign = symNode ? [args[0]] : assertNodeType(args[0], "ordgroup").body; - const cols = colalign.map(function(nde) { - const node = assertSymbolNodeType(nde); - const ca = node.text; - if ("lcr".indexOf(ca) !== -1) { - return { - type: "align", - align: ca - }; - } else if (ca === "|") { - return { - type: "separator", - separator: "|" - }; - } else if (ca === ":") { - return { - type: "separator", - separator: ":" - }; - } - throw new ParseError("Unknown column alignment: " + ca, nde); - }); - const res = { - cols, - envClasses: ["array"], - maxNumCols: cols.length - }; - return parseArray(context.parser, res, dCellStyle(context.envName)); - }, - mathmlBuilder: mathmlBuilder$7 - }); - - // The matrix environments of amsmath builds on the array environment - // of LaTeX, which is discussed above. - // The mathtools package adds starred versions of the same environments. - // These have an optional argument to choose left|center|right justification. - defineEnvironment({ - type: "array", - names: [ - "matrix", - "pmatrix", - "bmatrix", - "Bmatrix", - "vmatrix", - "Vmatrix", - "matrix*", - "pmatrix*", - "bmatrix*", - "Bmatrix*", - "vmatrix*", - "Vmatrix*" - ], - props: { - numArgs: 0 - }, - handler(context) { - const delimiters = { - matrix: null, - pmatrix: ["(", ")"], - bmatrix: ["[", "]"], - Bmatrix: ["\\{", "\\}"], - vmatrix: ["|", "|"], - Vmatrix: ["\\Vert", "\\Vert"] - }[context.envName.replace("*", "")]; - // \hskip -\arraycolsep in amsmath - let colAlign = "c"; - const payload = { - envClasses: [], - cols: [] - }; - if (context.envName.charAt(context.envName.length - 1) === "*") { - // It's one of the mathtools starred functions. - // Parse the optional alignment argument. - const parser = context.parser; - parser.consumeSpaces(); - if (parser.fetch().text === "[") { - parser.consume(); - parser.consumeSpaces(); - colAlign = parser.fetch().text; - if ("lcr".indexOf(colAlign) === -1) { - throw new ParseError("Expected l or c or r", parser.nextToken); - } - parser.consume(); - parser.consumeSpaces(); - parser.expect("]"); - parser.consume(); - payload.cols = []; - } - } - const res = parseArray(context.parser, payload, "text"); - res.cols = new Array(res.body[0].length).fill({ type: "align", align: colAlign }); - return delimiters - ? { - type: "leftright", - mode: context.mode, - body: [res], - left: delimiters[0], - right: delimiters[1], - rightColor: undefined // \right uninfluenced by \color in array - } - : res; - }, - mathmlBuilder: mathmlBuilder$7 - }); - - defineEnvironment({ - type: "array", - names: ["smallmatrix"], - props: { - numArgs: 0 - }, - handler(context) { - const payload = { type: "small" }; - const res = parseArray(context.parser, payload, "script"); - res.envClasses = ["small"]; - return res; - }, - mathmlBuilder: mathmlBuilder$7 - }); - - defineEnvironment({ - type: "array", - names: ["subarray"], - props: { - numArgs: 1 - }, - handler(context, args) { - // Parsing of {subarray} is similar to {array} - const symNode = checkSymbolNodeType(args[0]); - const colalign = symNode ? [args[0]] : assertNodeType(args[0], "ordgroup").body; - const cols = colalign.map(function(nde) { - const node = assertSymbolNodeType(nde); - const ca = node.text; - // {subarray} only recognizes "l" & "c" - if ("lc".indexOf(ca) !== -1) { - return { - type: "align", - align: ca - }; - } - throw new ParseError("Unknown column alignment: " + ca, nde); - }); - if (cols.length > 1) { - throw new ParseError("{subarray} can contain only one column"); - } - let res = { - cols, - envClasses: ["small"] - }; - res = parseArray(context.parser, res, "script"); - if (res.body.length > 0 && res.body[0].length > 1) { - throw new ParseError("{subarray} can contain only one column"); - } - return res; - }, - mathmlBuilder: mathmlBuilder$7 - }); - - // A cases environment (in amsmath.sty) is almost equivalent to - // \def - // \left\{\begin{array}{@{}l@{\quad}l@{}} … \end{array}\right. - // {dcases} is a {cases} environment where cells are set in \displaystyle, - // as defined in mathtools.sty. - // {rcases} is another mathtools environment. It's brace is on the right side. - defineEnvironment({ - type: "array", - names: ["cases", "dcases", "rcases", "drcases"], - props: { - numArgs: 0 - }, - handler(context) { - const payload = { - cols: [], - envClasses: ["cases"] - }; - const res = parseArray(context.parser, payload, dCellStyle(context.envName)); - return { - type: "leftright", - mode: context.mode, - body: [res], - left: context.envName.indexOf("r") > -1 ? "." : "\\{", - right: context.envName.indexOf("r") > -1 ? "\\}" : ".", - rightColor: undefined - }; - }, - mathmlBuilder: mathmlBuilder$7 - }); - - // In the align environment, one uses ampersands, &, to specify number of - // columns in each row, and to locate spacing between each column. - // align gets automatic numbering. align* and aligned do not. - // The alignedat environment can be used in math mode. - defineEnvironment({ - type: "array", - names: ["align", "align*", "aligned", "split"], - props: { - numArgs: 0 - }, - handler: alignedHandler, - mathmlBuilder: mathmlBuilder$7 - }); - - // alignat environment is like an align environment, but one must explicitly - // specify maximum number of columns in each row, and can adjust where spacing occurs. - defineEnvironment({ - type: "array", - names: ["alignat", "alignat*", "alignedat"], - props: { - numArgs: 1 - }, - handler: alignedHandler, - mathmlBuilder: mathmlBuilder$7 - }); - - // A gathered environment is like an array environment with one centered - // column, but where rows are considered lines so get \jot line spacing - // and contents are set in \displaystyle. - defineEnvironment({ - type: "array", - names: ["gathered", "gather", "gather*"], - props: { - numArgs: 0 - }, - handler(context) { - if (context.envName !== "gathered") { - validateAmsEnvironmentContext(context); - } - const res = { - cols: [], - envClasses: ["abut", "jot"], - addEqnNum: context.envName === "gather", - emptySingleRow: true, - leqno: context.parser.settings.leqno - }; - return parseArray(context.parser, res, "display"); - }, - mathmlBuilder: mathmlBuilder$7 - }); - - defineEnvironment({ - type: "array", - names: ["equation", "equation*"], - props: { - numArgs: 0 - }, - handler(context) { - validateAmsEnvironmentContext(context); - const res = { - addEqnNum: context.envName === "equation", - emptySingleRow: true, - singleRow: true, - maxNumCols: 1, - envClasses: ["align"], - leqno: context.parser.settings.leqno - }; - return parseArray(context.parser, res, "display"); - }, - mathmlBuilder: mathmlBuilder$7 - }); - - defineEnvironment({ - type: "array", - names: ["multline", "multline*"], - props: { - numArgs: 0 - }, - handler(context) { - validateAmsEnvironmentContext(context); - const res = { - addEqnNum: context.envName === "multline", - maxNumCols: 1, - envClasses: ["jot", "multline"], - leqno: context.parser.settings.leqno - }; - return parseArray(context.parser, res, "display"); - }, - mathmlBuilder: mathmlBuilder$7 - }); - - defineEnvironment({ - type: "array", - names: ["CD"], - props: { - numArgs: 0 - }, - handler(context) { - validateAmsEnvironmentContext(context); - return parseCD(context.parser); - }, - mathmlBuilder: mathmlBuilder$7 - }); - - // Catch \hline outside array environment - defineFunction({ - type: "text", // Doesn't matter what this is. - names: ["\\hline", "\\hdashline"], - props: { - numArgs: 0, - allowedInText: true, - allowedInMath: true - }, - handler(context, args) { - throw new ParseError(`${context.funcName} valid only within array environment`); - } - }); - - const environments = _environments; - - // Environment delimiters. HTML/MathML rendering is defined in the corresponding - // defineEnvironment definitions. - defineFunction({ - type: "environment", - names: ["\\begin", "\\end"], - props: { - numArgs: 1, - argTypes: ["text"] - }, - handler({ parser, funcName }, args) { - const nameGroup = args[0]; - if (nameGroup.type !== "ordgroup") { - throw new ParseError("Invalid environment name", nameGroup); - } - let envName = ""; - for (let i = 0; i < nameGroup.body.length; ++i) { - envName += assertNodeType(nameGroup.body[i], "textord").text; - } - - if (funcName === "\\begin") { - // begin...end is similar to left...right - if (!Object.prototype.hasOwnProperty.call(environments, envName )) { - throw new ParseError("No such environment: " + envName, nameGroup); - } - // Build the environment object. Arguments and other information will - // be made available to the begin and end methods using properties. - const env = environments[envName]; - const { args, optArgs } = parser.parseArguments("\\begin{" + envName + "}", env); - const context = { - mode: parser.mode, - envName, - parser - }; - const result = env.handler(context, args, optArgs); - parser.expect("\\end", false); - const endNameToken = parser.nextToken; - const end = assertNodeType(parser.parseFunction(), "environment"); - if (end.name !== envName) { - throw new ParseError( - `Mismatch: \\begin{${envName}} matched by \\end{${end.name}}`, - endNameToken - ); - } - return result; - } - - return { - type: "environment", - mode: parser.mode, - name: envName, - nameGroup - }; - } - }); - - defineFunction({ - type: "envTag", - names: ["\\env@tag"], - props: { - numArgs: 1, - argTypes: ["math"] - }, - handler({ parser }, args) { - return { - type: "envTag", - mode: parser.mode, - body: args[0] - }; - }, - mathmlBuilder(group, style) { - return new mathMLTree.MathNode("mrow"); - } - }); - - defineFunction({ - type: "noTag", - names: ["\\env@notag"], - props: { - numArgs: 0 - }, - handler({ parser }) { - return { - type: "noTag", - mode: parser.mode - }; - }, - mathmlBuilder(group, style) { - return new mathMLTree.MathNode("mrow"); - } - }); - - const isLongVariableName = (group, font) => { - if (font !== "mathrm" || group.body.type !== "ordgroup" || group.body.body.length === 1) { - return false - } - if (group.body.body[0].type !== "mathord") { return false } - for (let i = 1; i < group.body.body.length; i++) { - const parseNodeType = group.body.body[i].type; - if (!(parseNodeType === "mathord" || - (parseNodeType === "textord" && !isNaN(group.body.body[i].text)))) { - return false - } - } - return true - }; - - const mathmlBuilder$6 = (group, style) => { - const font = group.font; - const newStyle = style.withFont(font); - const mathGroup = buildGroup$1(group.body, newStyle); - - if (mathGroup.children.length === 0) { return mathGroup } // empty group, e.g., \mathrm{} - if (font === "boldsymbol" && ["mo", "mpadded", "mrow"].includes(mathGroup.type)) { - mathGroup.style.fontWeight = "bold"; - return mathGroup - } - // Check if it is possible to consolidate elements into a single element. - if (isLongVariableName(group, font)) { - // This is a \mathrm{…} group. It gets special treatment because symbolsOrd.js - // wraps elements with s to work around a Firefox bug. - const mi = mathGroup.children[0].children[0]; - delete mi.attributes.mathvariant; - for (let i = 1; i < mathGroup.children.length; i++) { - mi.children[0].text += mathGroup.children[i].type === "mn" - ? mathGroup.children[i].children[0].text - : mathGroup.children[i].children[0].children[0].text; - } - // Wrap in a to prevent the same Firefox bug. - const bogus = new mathMLTree.MathNode("mtext", new mathMLTree.TextNode("\u200b")); - return new mathMLTree.MathNode("mrow", [bogus, mi]) - } - let canConsolidate = mathGroup.children[0].type === "mo"; - for (let i = 1; i < mathGroup.children.length; i++) { - if (mathGroup.children[i].type === "mo" && font === "boldsymbol") { - mathGroup.children[i].style.fontWeight = "bold"; - } - if (mathGroup.children[i].type !== "mi") { canConsolidate = false; } - const localVariant = mathGroup.children[i].attributes && - mathGroup.children[i].attributes.mathvariant || ""; - if (localVariant !== "normal") { canConsolidate = false; } - } - if (!canConsolidate) { return mathGroup } - // Consolidate the elements. - const mi = mathGroup.children[0]; - for (let i = 1; i < mathGroup.children.length; i++) { - mi.children.push(mathGroup.children[i].children[0]); - } - if (mi.attributes.mathvariant && mi.attributes.mathvariant === "normal") { - // Workaround for a Firefox bug that renders spurious space around - // a - // Ref: https://bugs.webkit.org/show_bug.cgi?id=129097 - // We insert a text node that contains a zero-width space and wrap in an mrow. - // TODO: Get rid of this workaround when the Firefox bug is fixed. - const bogus = new mathMLTree.MathNode("mtext", new mathMLTree.TextNode("\u200b")); - return new mathMLTree.MathNode("mrow", [bogus, mi]) - } - return mi - }; - - const fontAliases = { - "\\Bbb": "\\mathbb", - "\\bold": "\\mathbf", - "\\frak": "\\mathfrak", - "\\bm": "\\boldsymbol" - }; - - defineFunction({ - type: "font", - names: [ - // styles - "\\mathrm", - "\\mathit", - "\\mathbf", - "\\mathnormal", - "\\up@greek", - "\\boldsymbol", - - // families - "\\mathbb", - "\\mathcal", - "\\mathfrak", - "\\mathscr", - "\\mathsf", - "\\mathtt", - - // aliases - "\\Bbb", - "\\bm", - "\\bold", - "\\frak" - ], - props: { - numArgs: 1, - allowedInArgument: true - }, - handler: ({ parser, funcName }, args) => { - const body = normalizeArgument(args[0]); - let func = funcName; - if (func in fontAliases) { - func = fontAliases[func]; - } - return { - type: "font", - mode: parser.mode, - font: func.slice(1), - body - }; - }, - mathmlBuilder: mathmlBuilder$6 - }); - - // Old font changing functions - defineFunction({ - type: "font", - names: ["\\rm", "\\sf", "\\tt", "\\bf", "\\it", "\\cal"], - props: { - numArgs: 0, - allowedInText: true - }, - handler: ({ parser, funcName, breakOnTokenText }, args) => { - const { mode } = parser; - const body = parser.parseExpression(true, breakOnTokenText, true); - const fontStyle = `math${funcName.slice(1)}`; - - return { - type: "font", - mode: mode, - font: fontStyle, - body: { - type: "ordgroup", - mode: parser.mode, - body - } - }; - }, - mathmlBuilder: mathmlBuilder$6 - }); - - const stylArray = ["display", "text", "script", "scriptscript"]; - const scriptLevel = { auto: -1, display: 0, text: 0, script: 1, scriptscript: 2 }; - - const mathmlBuilder$5 = (group, style) => { - // Track the scriptLevel of the numerator and denominator. - // We may need that info for \mathchoice or for adjusting em dimensions. - const childOptions = group.scriptLevel === "auto" - ? style.incrementLevel() - : group.scriptLevel === "display" - ? style.withLevel(StyleLevel.TEXT) - : group.scriptLevel === "text" - ? style.withLevel(StyleLevel.SCRIPT) - : style.withLevel(StyleLevel.SCRIPTSCRIPT); - - let node = new mathMLTree.MathNode("mfrac", [ - buildGroup$1(group.numer, childOptions), - buildGroup$1(group.denom, childOptions) - ]); - - if (!group.hasBarLine) { - node.setAttribute("linethickness", "0px"); - } else if (group.barSize) { - const ruleWidth = calculateSize(group.barSize, style); - node.setAttribute("linethickness", ruleWidth.number + ruleWidth.unit); - } - - if (group.leftDelim != null || group.rightDelim != null) { - const withDelims = []; - - if (group.leftDelim != null) { - const leftOp = new mathMLTree.MathNode("mo", [ - new mathMLTree.TextNode(group.leftDelim.replace("\\", "")) - ]); - leftOp.setAttribute("fence", "true"); - withDelims.push(leftOp); - } - - withDelims.push(node); - - if (group.rightDelim != null) { - const rightOp = new mathMLTree.MathNode("mo", [ - new mathMLTree.TextNode(group.rightDelim.replace("\\", "")) - ]); - rightOp.setAttribute("fence", "true"); - withDelims.push(rightOp); - } - - node = makeRow(withDelims); - } - - if (group.scriptLevel !== "auto") { - node = new mathMLTree.MathNode("mstyle", [node]); - node.setAttribute("displaystyle", String(group.scriptLevel === "display")); - node.setAttribute("scriptlevel", scriptLevel[group.scriptLevel]); - } - - return node; - }; - - defineFunction({ - type: "genfrac", - names: [ - "\\dfrac", - "\\frac", - "\\tfrac", - "\\dbinom", - "\\binom", - "\\tbinom", - "\\\\atopfrac", // can’t be entered directly - "\\\\bracefrac", - "\\\\brackfrac" // ditto - ], - props: { - numArgs: 2, - allowedInArgument: true - }, - handler: ({ parser, funcName }, args) => { - const numer = args[0]; - const denom = args[1]; - let hasBarLine = false; - let leftDelim = null; - let rightDelim = null; - let scriptLevel = "auto"; - - switch (funcName) { - case "\\dfrac": - case "\\frac": - case "\\tfrac": - hasBarLine = true; - break; - case "\\\\atopfrac": - hasBarLine = false; - break; - case "\\dbinom": - case "\\binom": - case "\\tbinom": - leftDelim = "("; - rightDelim = ")"; - break; - case "\\\\bracefrac": - leftDelim = "\\{"; - rightDelim = "\\}"; - break; - case "\\\\brackfrac": - leftDelim = "["; - rightDelim = "]"; - break; - default: - throw new Error("Unrecognized genfrac command"); - } - - switch (funcName) { - case "\\dfrac": - case "\\dbinom": - scriptLevel = "display"; - break; - case "\\tfrac": - case "\\tbinom": - scriptLevel = "text"; - break; - } - - return { - type: "genfrac", - mode: parser.mode, - continued: false, - numer, - denom, - hasBarLine, - leftDelim, - rightDelim, - scriptLevel, - barSize: null - }; - }, - mathmlBuilder: mathmlBuilder$5 - }); - - defineFunction({ - type: "genfrac", - names: ["\\cfrac"], - props: { - numArgs: 2 - }, - handler: ({ parser, funcName }, args) => { - const numer = args[0]; - const denom = args[1]; - - return { - type: "genfrac", - mode: parser.mode, - continued: true, - numer, - denom, - hasBarLine: true, - leftDelim: null, - rightDelim: null, - scriptLevel: "display", - barSize: null - }; - } - }); - - // Infix generalized fractions -- these are not rendered directly, but replaced - // immediately by one of the variants above. - defineFunction({ - type: "infix", - names: ["\\over", "\\choose", "\\atop", "\\brace", "\\brack"], - props: { - numArgs: 0, - infix: true - }, - handler({ parser, funcName, token }) { - let replaceWith; - switch (funcName) { - case "\\over": - replaceWith = "\\frac"; - break; - case "\\choose": - replaceWith = "\\binom"; - break; - case "\\atop": - replaceWith = "\\\\atopfrac"; - break; - case "\\brace": - replaceWith = "\\\\bracefrac"; - break; - case "\\brack": - replaceWith = "\\\\brackfrac"; - break; - default: - throw new Error("Unrecognized infix genfrac command"); - } - return { - type: "infix", - mode: parser.mode, - replaceWith, - token - }; - } - }); - - const delimFromValue = function(delimString) { - let delim = null; - if (delimString.length > 0) { - delim = delimString; - delim = delim === "." ? null : delim; - } - return delim; - }; - - defineFunction({ - type: "genfrac", - names: ["\\genfrac"], - props: { - numArgs: 6, - allowedInArgument: true, - argTypes: ["math", "math", "size", "text", "math", "math"] - }, - handler({ parser }, args) { - const numer = args[4]; - const denom = args[5]; - - // Look into the parse nodes to get the desired delimiters. - const leftNode = normalizeArgument(args[0]); - const leftDelim = leftNode.type === "atom" && leftNode.family === "open" - ? delimFromValue(leftNode.text) - : null; - const rightNode = normalizeArgument(args[1]); - const rightDelim = - rightNode.type === "atom" && rightNode.family === "close" - ? delimFromValue(rightNode.text) - : null; - - const barNode = assertNodeType(args[2], "size"); - let hasBarLine; - let barSize = null; - if (barNode.isBlank) { - // \genfrac acts differently than \above. - // \genfrac treats an empty size group as a signal to use a - // standard bar size. \above would see size = 0 and omit the bar. - hasBarLine = true; - } else { - barSize = barNode.value; - hasBarLine = barSize.number > 0; - } - - // Find out if we want displaystyle, textstyle, etc. - let scriptLevel = "auto"; - let styl = args[3]; - if (styl.type === "ordgroup") { - if (styl.body.length > 0) { - const textOrd = assertNodeType(styl.body[0], "textord"); - scriptLevel = stylArray[Number(textOrd.text)]; - } - } else { - styl = assertNodeType(styl, "textord"); - scriptLevel = stylArray[Number(styl.text)]; - } - - return { - type: "genfrac", - mode: parser.mode, - numer, - denom, - continued: false, - hasBarLine, - barSize, - leftDelim, - rightDelim, - scriptLevel - }; - }, - mathmlBuilder: mathmlBuilder$5 - }); - - // \above is an infix fraction that also defines a fraction bar size. - defineFunction({ - type: "infix", - names: ["\\above"], - props: { - numArgs: 1, - argTypes: ["size"], - infix: true - }, - handler({ parser, funcName, token }, args) { - return { - type: "infix", - mode: parser.mode, - replaceWith: "\\\\abovefrac", - barSize: assertNodeType(args[0], "size").value, - token - }; - } - }); - - defineFunction({ - type: "genfrac", - names: ["\\\\abovefrac"], - props: { - numArgs: 3, - argTypes: ["math", "size", "math"] - }, - handler: ({ parser, funcName }, args) => { - const numer = args[0]; - const barSize = assert(assertNodeType(args[1], "infix").barSize); - const denom = args[2]; - - const hasBarLine = barSize.number > 0; - return { - type: "genfrac", - mode: parser.mode, - numer, - denom, - continued: false, - hasBarLine, - barSize, - leftDelim: null, - rightDelim: null, - scriptLevel: "auto" - }; - }, - - mathmlBuilder: mathmlBuilder$5 - }); - - // \hbox is provided for compatibility with LaTeX functions that act on a box. - // This function by itself doesn't do anything but set scriptlevel to \textstyle - // and prevent a soft line break. - - defineFunction({ - type: "hbox", - names: ["\\hbox"], - props: { - numArgs: 1, - argTypes: ["hbox"], - allowedInArgument: true, - allowedInText: false - }, - handler({ parser }, args) { - return { - type: "hbox", - mode: parser.mode, - body: ordargument(args[0]) - }; - }, - mathmlBuilder(group, style) { - const newStyle = style.withLevel(StyleLevel.TEXT); - const mrow = buildExpressionRow(group.body, newStyle); - return consolidateText(mrow) - } - }); - - const mathmlBuilder$4 = (group, style) => { - const accentNode = stretchy.mathMLnode(group.label); - accentNode.style["math-depth"] = 0; - return new mathMLTree.MathNode(group.isOver ? "mover" : "munder", [ - buildGroup$1(group.base, style), - accentNode - ]); - }; - - // Horizontal stretchy braces - defineFunction({ - type: "horizBrace", - names: ["\\overbrace", "\\underbrace"], - props: { - numArgs: 1 - }, - handler({ parser, funcName }, args) { - return { - type: "horizBrace", - mode: parser.mode, - label: funcName, - isOver: /^\\over/.test(funcName), - base: args[0] - }; - }, - mathmlBuilder: mathmlBuilder$4 - }); - - defineFunction({ - type: "href", - names: ["\\href"], - props: { - numArgs: 2, - argTypes: ["url", "original"], - allowedInText: true - }, - handler: ({ parser, token }, args) => { - const body = args[1]; - const href = assertNodeType(args[0], "url").url; - - if ( - !parser.settings.isTrusted({ - command: "\\href", - url: href - }) - ) { - throw new ParseError(`Function "\\href" is not trusted`, token) - } - - return { - type: "href", - mode: parser.mode, - href, - body: ordargument(body) - }; - }, - mathmlBuilder: (group, style) => { - let math = buildExpressionRow(group.body, style); - if (!(math instanceof MathNode)) { - math = new MathNode("mrow", [math]); - } - math.setAttribute("href", group.href); - return math; - } - }); - - defineFunction({ - type: "href", - names: ["\\url"], - props: { - numArgs: 1, - argTypes: ["url"], - allowedInText: true - }, - handler: ({ parser, token }, args) => { - const href = assertNodeType(args[0], "url").url; - - if ( - !parser.settings.isTrusted({ - command: "\\url", - url: href - }) - ) { - throw new ParseError(`Function "\\url" is not trusted`, token) - } - - const chars = []; - for (let i = 0; i < href.length; i++) { - let c = href[i]; - if (c === "~") { - c = "\\textasciitilde"; - } - chars.push({ - type: "textord", - mode: "text", - text: c - }); - } - const body = { - type: "text", - mode: parser.mode, - font: "\\texttt", - body: chars - }; - return { - type: "href", - mode: parser.mode, - href, - body: ordargument(body) - }; - } - }); - - defineFunction({ - type: "html", - names: ["\\class", "\\id", "\\style", "\\data"], - props: { - numArgs: 2, - argTypes: ["raw", "original"], - allowedInText: true - }, - handler: ({ parser, funcName, token }, args) => { - const value = assertNodeType(args[0], "raw").string; - const body = args[1]; - - if (parser.settings.strict) { - throw new ParseError(`Function "${funcName}" is disabled in strict mode`, token) - } - - let trustContext; - const attributes = {}; - - switch (funcName) { - case "\\class": - attributes.class = value; - trustContext = { - command: "\\class", - class: value - }; - break; - case "\\id": - attributes.id = value; - trustContext = { - command: "\\id", - id: value - }; - break; - case "\\style": - attributes.style = value; - trustContext = { - command: "\\style", - style: value - }; - break; - case "\\data": { - const data = value.split(","); - for (let i = 0; i < data.length; i++) { - const keyVal = data[i].split("="); - if (keyVal.length !== 2) { - throw new ParseError("Error parsing key-value for \\data"); - } - attributes["data-" + keyVal[0].trim()] = keyVal[1].trim(); - } - - trustContext = { - command: "\\data", - attributes - }; - break; - } - default: - throw new Error("Unrecognized html command"); - } - - if (!parser.settings.isTrusted(trustContext)) { - throw new ParseError(`Function "${funcName}" is not trusted`, token) - } - return { - type: "html", - mode: parser.mode, - attributes, - body: ordargument(body) - }; - }, - mathmlBuilder: (group, style) => { - const element = buildExpressionRow(group.body, style); - - const classes = []; - if (group.attributes.class) { - classes.push(...group.attributes.class.trim().split(/\s+/)); - } - element.classes = classes; - - for (const attr in group.attributes) { - if (attr !== "class" && Object.prototype.hasOwnProperty.call(group.attributes, attr)) { - element.setAttribute(attr, group.attributes[attr]); - } - } - - return element; - } - }); - - const sizeData = function(str) { - if (/^[-+]? *(\d+(\.\d*)?|\.\d+)$/.test(str)) { - // str is a number with no unit specified. - // default unit is bp, per graphix package. - return { number: +str, unit: "bp" } - } else { - const match = /([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(str); - if (!match) { - throw new ParseError("Invalid size: '" + str + "' in \\includegraphics"); - } - const data = { - number: +(match[1] + match[2]), // sign + magnitude, cast to number - unit: match[3] - }; - if (!validUnit(data)) { - throw new ParseError("Invalid unit: '" + data.unit + "' in \\includegraphics."); - } - return data - } - }; - - defineFunction({ - type: "includegraphics", - names: ["\\includegraphics"], - props: { - numArgs: 1, - numOptionalArgs: 1, - argTypes: ["raw", "url"], - allowedInText: false - }, - handler: ({ parser, token }, args, optArgs) => { - let width = { number: 0, unit: "em" }; - let height = { number: 0.9, unit: "em" }; // sorta character sized. - let totalheight = { number: 0, unit: "em" }; - let alt = ""; - - if (optArgs[0]) { - const attributeStr = assertNodeType(optArgs[0], "raw").string; - - // Parser.js does not parse key/value pairs. We get a string. - const attributes = attributeStr.split(","); - for (let i = 0; i < attributes.length; i++) { - const keyVal = attributes[i].split("="); - if (keyVal.length === 2) { - const str = keyVal[1].trim(); - switch (keyVal[0].trim()) { - case "alt": - alt = str; - break - case "width": - width = sizeData(str); - break - case "height": - height = sizeData(str); - break - case "totalheight": - totalheight = sizeData(str); - break - default: - throw new ParseError("Invalid key: '" + keyVal[0] + "' in \\includegraphics.") - } - } - } - } - - const src = assertNodeType(args[0], "url").url; - - if (alt === "") { - // No alt given. Use the file name. Strip away the path. - alt = src; - alt = alt.replace(/^.*[\\/]/, ""); - alt = alt.substring(0, alt.lastIndexOf(".")); - } - - if ( - !parser.settings.isTrusted({ - command: "\\includegraphics", - url: src - }) - ) { - throw new ParseError(`Function "\\includegraphics" is not trusted`, token) - } - - return { - type: "includegraphics", - mode: parser.mode, - alt: alt, - width: width, - height: height, - totalheight: totalheight, - src: src - } - }, - mathmlBuilder: (group, style) => { - const height = calculateSize(group.height, style); - const depth = { number: 0, unit: "em" }; - - if (group.totalheight.number > 0) { - if (group.totalheight.unit === height.unit && - group.totalheight.number > height.number) { - depth.number = group.totalheight.number - height.number; - depth.unit = height.unit; - } - } - - let width = 0; - if (group.width.number > 0) { - width = calculateSize(group.width, style); - } - - const graphicStyle = { height: height.number + depth.number + "em" }; - if (width.number > 0) { - graphicStyle.width = width.number + width.unit; - } - if (depth.number > 0) { - graphicStyle.verticalAlign = -depth.number + depth.unit; - } - - const node = new Img(group.src, group.alt, graphicStyle); - node.height = height; - node.depth = depth; - return new mathMLTree.MathNode("mtext", [node]) - } - }); - - // Horizontal spacing commands - - // TODO: \hskip and \mskip should support plus and minus in lengths - - defineFunction({ - type: "kern", - names: ["\\kern", "\\mkern", "\\hskip", "\\mskip"], - props: { - numArgs: 1, - argTypes: ["size"], - primitive: true, - allowedInText: true - }, - handler({ parser, funcName, token }, args) { - const size = assertNodeType(args[0], "size"); - if (parser.settings.strict) { - const mathFunction = funcName[1] === "m"; // \mkern, \mskip - const muUnit = size.value.unit === "mu"; - if (mathFunction) { - if (!muUnit) { - throw new ParseError(`LaTeX's ${funcName} supports only mu units, ` + - `not ${size.value.unit} units`, token) - } - if (parser.mode !== "math") { - throw new ParseError(`LaTeX's ${funcName} works only in math mode`, token) - } - } else { - // !mathFunction - if (muUnit) { - throw new ParseError(`LaTeX's ${funcName} doesn't support mu units`, token) - } - } - } - return { - type: "kern", - mode: parser.mode, - dimension: size.value - }; - }, - mathmlBuilder(group, style) { - const dimension = calculateSize(group.dimension, style); - const ch = dimension.unit === "em" ? spaceCharacter(dimension.number) : ""; - if (group.mode === "text" && ch.length > 0) { - const character = new mathMLTree.TextNode(ch); - return new mathMLTree.MathNode("mtext", [character]); - } else { - const node = new mathMLTree.MathNode("mspace"); - node.setAttribute("width", dimension.number + dimension.unit); - if (dimension.number < 0) { - node.style.marginLeft = dimension.number + dimension.unit; - } - return node; - } - } - }); - - const spaceCharacter = function(width) { - if (width >= 0.05555 && width <= 0.05556) { - return "\u200a"; //   - } else if (width >= 0.1666 && width <= 0.1667) { - return "\u2009"; //   - } else if (width >= 0.2222 && width <= 0.2223) { - return "\u2005"; //   - } else if (width >= 0.2777 && width <= 0.2778) { - return "\u2005\u200a"; //    - } else { - return ""; - } - }; - - // Limit valid characters to a small set, for safety. - const invalidIdRegEx = /[^A-Za-z_0-9-]/g; - - defineFunction({ - type: "label", - names: ["\\label"], - props: { - numArgs: 1, - argTypes: ["raw"] - }, - handler({ parser }, args) { - return { - type: "label", - mode: parser.mode, - string: args[0].string.replace(invalidIdRegEx, "") - }; - }, - mathmlBuilder(group, style) { - // Return a no-width, no-ink element with an HTML id. - const node = new mathMLTree.MathNode("mrow", [], ["tml-label"]); - if (group.string.length > 0) { - node.setAttribute("id", group.string); - } - return node - } - }); - - // Horizontal overlap functions - - const textModeLap = ["\\clap", "\\llap", "\\rlap"]; - - defineFunction({ - type: "lap", - names: ["\\mathllap", "\\mathrlap", "\\mathclap", "\\clap", "\\llap", "\\rlap"], - props: { - numArgs: 1, - allowedInText: true - }, - handler: ({ parser, funcName, token }, args) => { - if (textModeLap.includes(funcName)) { - if (parser.settings.strict && parser.mode !== "text") { - throw new ParseError(`{${funcName}} can be used only in text mode. - Try \\math${funcName.slice(1)}`, token) - } - funcName = funcName.slice(1); - } else { - funcName = funcName.slice(5); - } - const body = args[0]; - return { - type: "lap", - mode: parser.mode, - alignment: funcName, - body - } - }, - mathmlBuilder: (group, style) => { - // mathllap, mathrlap, mathclap - let strut; - if (group.alignment === "llap") { - // We need an invisible strut with the same depth as the group. - // We can't just read the depth, so we use \vphantom methods. - const phantomInner = buildExpression(ordargument(group.body), style); - const phantom = new mathMLTree.MathNode("mphantom", phantomInner); - strut = new mathMLTree.MathNode("mpadded", [phantom]); - strut.setAttribute("width", "0px"); - } - - const inner = buildGroup$1(group.body, style); - let node; - if (group.alignment === "llap") { - inner.style.position = "absolute"; - inner.style.right = "0"; - inner.style.bottom = `0`; // If we could have read the ink depth, it would go here. - node = new mathMLTree.MathNode("mpadded", [strut, inner]); - } else { - node = new mathMLTree.MathNode("mpadded", [inner]); - } - - if (group.alignment === "rlap") { - if (group.body.body.length > 0 && group.body.body[0].type === "genfrac") { - // In Firefox, a squashes the 3/18em padding of a child \frac. Put it back. - node.setAttribute("lspace", "0.16667em"); - } - } else { - const offset = group.alignment === "llap" ? "-1" : "-0.5"; - node.setAttribute("lspace", offset + "width"); - if (group.alignment === "llap") { - node.style.position = "relative"; - } else { - node.style.display = "flex"; - node.style.justifyContent = "center"; - } - } - node.setAttribute("width", "0px"); - return node - } - }); - - // Switching from text mode back to math mode - defineFunction({ - type: "ordgroup", - names: ["\\(", "$"], - props: { - numArgs: 0, - allowedInText: true, - allowedInMath: false - }, - handler({ funcName, parser }, args) { - const outerMode = parser.mode; - parser.switchMode("math"); - const close = funcName === "\\(" ? "\\)" : "$"; - const body = parser.parseExpression(false, close); - parser.expect(close); - parser.switchMode(outerMode); - return { - type: "ordgroup", - mode: parser.mode, - body - }; - } - }); - - // Check for extra closing math delimiters - defineFunction({ - type: "text", // Doesn't matter what this is. - names: ["\\)", "\\]"], - props: { - numArgs: 0, - allowedInText: true, - allowedInMath: false - }, - handler(context, token) { - throw new ParseError(`Mismatched ${context.funcName}`, token); - } - }); - - const chooseStyle = (group, style) => { - switch (style.level) { - case StyleLevel.DISPLAY: // 0 - return group.display; - case StyleLevel.TEXT: // 1 - return group.text; - case StyleLevel.SCRIPT: // 2 - return group.script; - case StyleLevel.SCRIPTSCRIPT: // 3 - return group.scriptscript; - default: - return group.text; - } - }; - - defineFunction({ - type: "mathchoice", - names: ["\\mathchoice"], - props: { - numArgs: 4, - primitive: true - }, - handler: ({ parser }, args) => { - return { - type: "mathchoice", - mode: parser.mode, - display: ordargument(args[0]), - text: ordargument(args[1]), - script: ordargument(args[2]), - scriptscript: ordargument(args[3]) - }; - }, - mathmlBuilder: (group, style) => { - const body = chooseStyle(group, style); - return buildExpressionRow(body, style); - } - }); - - const textAtomTypes = ["text", "textord", "mathord", "atom"]; - - const padding = width => { - const node = new mathMLTree.MathNode("mspace"); - node.setAttribute("width", width + "em"); - return node - }; - - function mathmlBuilder$3(group, style) { - let node; - const inner = buildExpression(group.body, style); - - if (group.mclass === "minner") { - node = new mathMLTree.MathNode("mpadded", inner); - } else if (group.mclass === "mord") { - if (group.isCharacterBox || inner[0].type === "mathord") { - node = inner[0]; - node.type = "mi"; - if (node.children.length === 1 && node.children[0].text && node.children[0].text === "∇") { - node.setAttribute("mathvariant", "normal"); - } - } else { - node = new mathMLTree.MathNode("mi", inner); - } - } else { - node = new mathMLTree.MathNode("mrow", inner); - if (group.mustPromote) { - node = inner[0]; - node.type = "mo"; - if (group.isCharacterBox && group.body[0].text && /[A-Za-z]/.test(group.body[0].text)) { - node.setAttribute("mathvariant", "italic"); - } - } else { - node = new mathMLTree.MathNode("mrow", inner); - } - - // Set spacing based on what is the most likely adjacent atom type. - // See TeXbook p170. - const doSpacing = style.level < 2; // Operator spacing is zero inside a (sub|super)script. - if (node.type === "mrow") { - if (doSpacing ) { - if (group.mclass === "mbin") { - // medium space - node.children.unshift(padding(0.2222)); - node.children.push(padding(0.2222)); - } else if (group.mclass === "mrel") { - // thickspace - node.children.unshift(padding(0.2778)); - node.children.push(padding(0.2778)); - } else if (group.mclass === "mpunct") { - node.children.push(padding(0.1667)); - } else if (group.mclass === "minner") { - node.children.unshift(padding(0.0556)); // 1 mu is the most likely option - node.children.push(padding(0.0556)); - } - } - } else { - if (group.mclass === "mbin") { - // medium space - node.attributes.lspace = (doSpacing ? "0.2222em" : "0"); - node.attributes.rspace = (doSpacing ? "0.2222em" : "0"); - } else if (group.mclass === "mrel") { - // thickspace - node.attributes.lspace = (doSpacing ? "0.2778em" : "0"); - node.attributes.rspace = (doSpacing ? "0.2778em" : "0"); - } else if (group.mclass === "mpunct") { - node.attributes.lspace = "0em"; - node.attributes.rspace = (doSpacing ? "0.1667em" : "0"); - } else if (group.mclass === "mopen" || group.mclass === "mclose") { - node.attributes.lspace = "0em"; - node.attributes.rspace = "0em"; - } else if (group.mclass === "minner" && doSpacing) { - node.attributes.lspace = "0.0556em"; // 1 mu is the most likely option - node.attributes.width = "+0.1111em"; - } - } - - if (!(group.mclass === "mopen" || group.mclass === "mclose")) { - delete node.attributes.stretchy; - delete node.attributes.form; - } - } - return node; - } - - // Math class commands except \mathop - defineFunction({ - type: "mclass", - names: [ - "\\mathord", - "\\mathbin", - "\\mathrel", - "\\mathopen", - "\\mathclose", - "\\mathpunct", - "\\mathinner" - ], - props: { - numArgs: 1, - primitive: true - }, - handler({ parser, funcName }, args) { - const body = args[0]; - const isCharacterBox = utils.isCharacterBox(body); - // We should not wrap a around a or . That would be invalid MathML. - // In that case, we instead promote the text contents of the body to the parent. - let mustPromote = true; - const mord = { type: "mathord", text: "", mode: parser.mode }; - const arr = (body.body) ? body.body : [body]; - for (const arg of arr) { - if (textAtomTypes.includes(arg.type)) { - if (symbols[parser.mode][arg.text]) { - mord.text += symbols[parser.mode][arg.text].replace; - } else if (arg.text) { - mord.text += arg.text; - } else if (arg.body) { - arg.body.map(e => { mord.text += e.text; }); - } - } else { - mustPromote = false; - break - } - } - return { - type: "mclass", - mode: parser.mode, - mclass: "m" + funcName.slice(5), - body: ordargument(mustPromote ? mord : body), - isCharacterBox, - mustPromote - }; - }, - mathmlBuilder: mathmlBuilder$3 - }); - - const binrelClass = (arg) => { - // \binrel@ spacing varies with (bin|rel|ord) of the atom in the argument. - // (by rendering separately and with {}s before and after, and measuring - // the change in spacing). We'll do roughly the same by detecting the - // atom type directly. - const atom = arg.type === "ordgroup" && arg.body.length ? arg.body[0] : arg; - if (atom.type === "atom" && (atom.family === "bin" || atom.family === "rel")) { - return "m" + atom.family; - } else { - return "mord"; - } - }; - - // \@binrel{x}{y} renders like y but as mbin/mrel/mord if x is mbin/mrel/mord. - // This is equivalent to \binrel@{x}\binrel@@{y} in AMSTeX. - defineFunction({ - type: "mclass", - names: ["\\@binrel"], - props: { - numArgs: 2 - }, - handler({ parser }, args) { - return { - type: "mclass", - mode: parser.mode, - mclass: binrelClass(args[0]), - body: ordargument(args[1]), - isCharacterBox: utils.isCharacterBox(args[1]) - }; - } - }); - - // Build a relation or stacked op by placing one symbol on top of another - defineFunction({ - type: "mclass", - names: ["\\stackrel", "\\overset", "\\underset"], - props: { - numArgs: 2 - }, - handler({ parser, funcName }, args) { - const baseArg = args[1]; - const shiftedArg = args[0]; - - const baseOp = { - type: "op", - mode: baseArg.mode, - limits: true, - alwaysHandleSupSub: true, - parentIsSupSub: false, - symbol: false, - stack: true, - suppressBaseShift: funcName !== "\\stackrel", - body: ordargument(baseArg) - }; - - return { - type: "supsub", - mode: shiftedArg.mode, - base: baseOp, - sup: funcName === "\\underset" ? null : shiftedArg, - sub: funcName === "\\underset" ? shiftedArg : null - }; - }, - mathmlBuilder: mathmlBuilder$3 - }); - - // Helper function - const buildGroup = (el, style, noneNode) => { - if (!el) { return noneNode } - const node = buildGroup$1(el, style); - if (node.type === "mrow" && node.children.length === 0) { return noneNode } - return node - }; - - defineFunction({ - type: "multiscript", - names: ["\\sideset", "\\pres@cript"], // See macros.js for \prescript - props: { - numArgs: 3 - }, - handler({ parser, funcName, token }, args) { - if (args[2].body.length === 0) { - throw new ParseError(funcName + `cannot parse an empty base.`) - } - const base = args[2].body[0]; - if (parser.settings.strict && funcName === "\\sideset" && !base.symbol) { - throw new ParseError(`The base of \\sideset must be a big operator. Try \\prescript.`) - } - - if ((args[0].body.length > 0 && args[0].body[0].type !== "supsub") || - (args[1].body.length > 0 && args[1].body[0].type !== "supsub")) { - throw new ParseError("\\sideset can parse only subscripts and " + - "superscripts in its first two arguments", token) - } - - // The prescripts and postscripts come wrapped in a supsub. - const prescripts = args[0].body.length > 0 ? args[0].body[0] : null; - const postscripts = args[1].body.length > 0 ? args[1].body[0] : null; - - if (!prescripts && !postscripts) { - return base - } else if (!prescripts) { - // It's not a multi-script. Get a \textstyle supsub. - return { - type: "styling", - mode: parser.mode, - scriptLevel: "text", - body: [{ - type: "supsub", - mode: parser.mode, - base, - sup: postscripts.sup, - sub: postscripts.sub - }] - } - } else { - return { - type: "multiscript", - mode: parser.mode, - isSideset: funcName === "\\sideset", - prescripts, - postscripts, - base - } - } - }, - mathmlBuilder(group, style) { - const base = buildGroup$1(group.base, style); - - const prescriptsNode = new mathMLTree.MathNode("mprescripts"); - const noneNode = new mathMLTree.MathNode("none"); - let children = []; - - const preSub = buildGroup(group.prescripts.sub, style, noneNode); - const preSup = buildGroup(group.prescripts.sup, style, noneNode); - if (group.isSideset) { - // This seems silly, but LaTeX does this. Firefox ignores it, which does not make me sad. - preSub.setAttribute("style", "text-align: left;"); - preSup.setAttribute("style", "text-align: left;"); - } - - if (group.postscripts) { - const postSub = buildGroup(group.postscripts.sub, style, noneNode); - const postSup = buildGroup(group.postscripts.sup, style, noneNode); - children = [base, postSub, postSup, prescriptsNode, preSub, preSup]; - } else { - children = [base, prescriptsNode, preSub, preSup]; - } - - return new mathMLTree.MathNode("mmultiscripts", children); - } - }); - - defineFunction({ - type: "not", - names: ["\\not"], - props: { - numArgs: 1, - primitive: true, - allowedInText: false - }, - handler({ parser }, args) { - const isCharacterBox = utils.isCharacterBox(args[0]); - let body; - if (isCharacterBox) { - body = ordargument(args[0]); - if (body[0].text.charAt(0) === "\\") { - body[0].text = symbols.math[body[0].text].replace; - } - // \u0338 is the Unicode Combining Long Solidus Overlay - body[0].text = body[0].text.slice(0, 1) + "\u0338" + body[0].text.slice(1); - } else { - // When the argument is not a character box, TeX does an awkward, poorly placed overlay. - // We'll do the same. - const notNode = { type: "textord", mode: "math", text: "\u0338" }; - const kernNode = { type: "kern", mode: "math", dimension: { number: -0.6, unit: "em" } }; - body = [notNode, kernNode, args[0]]; - } - return { - type: "not", - mode: parser.mode, - body, - isCharacterBox - }; - }, - mathmlBuilder(group, style) { - if (group.isCharacterBox) { - const inner = buildExpression(group.body, style, true); - return inner[0] - } else { - return buildExpressionRow(group.body, style) - } - } - }); - - // Limits, symbols - - // Some helpers - - const ordAtomTypes = ["textord", "mathord", "atom"]; - - // Most operators have a large successor symbol, but these don't. - const noSuccessor = ["\\smallint"]; - - // Math operators (e.g. \sin) need a space between these types and themselves: - const ordTypes = ["textord", "mathord", "ordgroup", "close", "leftright"]; - - // NOTE: Unlike most `builders`s, this one handles not only "op", but also - // "supsub" since some of them (like \int) can affect super/subscripting. - - const setSpacing = node => { - // The user wrote a \mathop{…} function. Change spacing from default to OP spacing. - // The most likely spacing for an OP is a thin space per TeXbook p170. - node.attributes.lspace = "0.1667em"; - node.attributes.rspace = "0.1667em"; - }; - - const mathmlBuilder$2 = (group, style) => { - let node; - - if (group.symbol) { - // This is a symbol. Just add the symbol. - node = new MathNode("mo", [makeText(group.name, group.mode)]); - if (noSuccessor.includes(group.name)) { - node.setAttribute("largeop", "false"); - } else { - node.setAttribute("movablelimits", "false"); - } - if (group.fromMathOp) { setSpacing(node); } - } else if (group.body) { - // This is an operator with children. Add them. - node = new MathNode("mo", buildExpression(group.body, style)); - if (group.fromMathOp) { setSpacing(node); } - } else { - // This is a text operator. Add all of the characters from the operator's name. - node = new MathNode("mi", [new TextNode(group.name.slice(1))]); - - if (!group.parentIsSupSub) { - // Append an invisible . - // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4 - const operator = new MathNode("mo", [makeText("\u2061", "text")]); - const row = [node, operator]; - // Set spacing - if (group.needsLeadingSpace) { - const lead = new MathNode("mspace"); - lead.setAttribute("width", "0.1667em"); // thin space. - row.unshift(lead); - } - if (!group.isFollowedByDelimiter) { - const trail = new MathNode("mspace"); - trail.setAttribute("width", "0.1667em"); // thin space. - row.push(trail); - } - node = new MathNode("mrow", row); - } - } - - return node; - }; - - const singleCharBigOps = { - "\u220F": "\\prod", - "\u2210": "\\coprod", - "\u2211": "\\sum", - "\u22c0": "\\bigwedge", - "\u22c1": "\\bigvee", - "\u22c2": "\\bigcap", - "\u22c3": "\\bigcup", - "\u2a00": "\\bigodot", - "\u2a01": "\\bigoplus", - "\u2a02": "\\bigotimes", - "\u2a04": "\\biguplus", - "\u2a05": "\\bigsqcap", - "\u2a06": "\\bigsqcup", - "\u2a09": "\\bigtimes" - }; - - defineFunction({ - type: "op", - names: [ - "\\coprod", - "\\bigvee", - "\\bigwedge", - "\\biguplus", - "\\bigcap", - "\\bigcup", - "\\intop", - "\\prod", - "\\sum", - "\\bigotimes", - "\\bigoplus", - "\\bigodot", - "\\bigsqcap", - "\\bigsqcup", - "\\bigtimes", - "\\smallint", - "\u220F", - "\u2210", - "\u2211", - "\u22c0", - "\u22c1", - "\u22c2", - "\u22c3", - "\u2a00", - "\u2a01", - "\u2a02", - "\u2a04", - "\u2a06" - ], - props: { - numArgs: 0 - }, - handler: ({ parser, funcName }, args) => { - let fName = funcName; - if (fName.length === 1) { - fName = singleCharBigOps[fName]; - } - return { - type: "op", - mode: parser.mode, - limits: true, - parentIsSupSub: false, - symbol: true, - stack: false, // This is true for \stackrel{}, not here. - name: fName - }; - }, - mathmlBuilder: mathmlBuilder$2 - }); - - // Note: calling defineFunction with a type that's already been defined only - // works because the same mathmlBuilder is being used. - defineFunction({ - type: "op", - names: ["\\mathop"], - props: { - numArgs: 1, - primitive: true - }, - handler: ({ parser }, args) => { - const body = args[0]; - // It would be convienient to just wrap a around the argument. - // But if the argument is a or , that would be invalid MathML. - // In that case, we instead promote the text contents of the body to the parent. - const arr = (body.body) ? body.body : [body]; - const isSymbol = arr.length === 1 && ordAtomTypes.includes(arr[0].type); - return { - type: "op", - mode: parser.mode, - limits: true, - parentIsSupSub: false, - symbol: isSymbol, - fromMathOp: true, - stack: false, - name: isSymbol ? arr[0].text : null, - body: isSymbol ? null : ordargument(body) - }; - }, - mathmlBuilder: mathmlBuilder$2 - }); - - // There are 2 flags for operators; whether they produce limits in - // displaystyle, and whether they are symbols and should grow in - // displaystyle. These four groups cover the four possible choices. - - const singleCharIntegrals = { - "\u222b": "\\int", - "\u222c": "\\iint", - "\u222d": "\\iiint", - "\u222e": "\\oint", - "\u222f": "\\oiint", - "\u2230": "\\oiiint", - "\u2231": "\\intclockwise", - "\u2232": "\\varointclockwise", - "\u2a0c": "\\iiiint", - "\u2a0d": "\\intbar", - "\u2a0e": "\\intBar", - "\u2a0f": "\\fint", - "\u2a12": "\\rppolint", - "\u2a13": "\\scpolint", - "\u2a15": "\\pointint", - "\u2a16": "\\sqint", - "\u2a17": "\\intlarhk", - "\u2a18": "\\intx", - "\u2a19": "\\intcap", - "\u2a1a": "\\intcup" - }; - - // No limits, not symbols - defineFunction({ - type: "op", - names: [ - "\\arcsin", - "\\arccos", - "\\arctan", - "\\arctg", - "\\arcctg", - "\\arg", - "\\ch", - "\\cos", - "\\cosec", - "\\cosh", - "\\cot", - "\\cotg", - "\\coth", - "\\csc", - "\\ctg", - "\\cth", - "\\deg", - "\\dim", - "\\exp", - "\\hom", - "\\ker", - "\\lg", - "\\ln", - "\\log", - "\\sec", - "\\sin", - "\\sinh", - "\\sh", - "\\sgn", - "\\tan", - "\\tanh", - "\\tg", - "\\th" - ], - props: { - numArgs: 0 - }, - handler({ parser, funcName }) { - const prevAtomType = parser.prevAtomType; - const next = parser.gullet.future().text; - return { - type: "op", - mode: parser.mode, - limits: false, - parentIsSupSub: false, - symbol: false, - stack: false, - isFollowedByDelimiter: isDelimiter(next), - needsLeadingSpace: prevAtomType.length > 0 && ordTypes.includes(prevAtomType), - name: funcName - }; - }, - mathmlBuilder: mathmlBuilder$2 - }); - - // Limits, not symbols - defineFunction({ - type: "op", - names: ["\\det", "\\gcd", "\\inf", "\\lim", "\\max", "\\min", "\\Pr", "\\sup"], - props: { - numArgs: 0 - }, - handler({ parser, funcName }) { - const prevAtomType = parser.prevAtomType; - const next = parser.gullet.future().text; - return { - type: "op", - mode: parser.mode, - limits: true, - parentIsSupSub: false, - symbol: false, - stack: false, - isFollowedByDelimiter: isDelimiter(next), - needsLeadingSpace: prevAtomType.length > 0 && ordTypes.includes(prevAtomType), - name: funcName - }; - }, - mathmlBuilder: mathmlBuilder$2 - }); - - // No limits, symbols - defineFunction({ - type: "op", - names: [ - "\\int", - "\\iint", - "\\iiint", - "\\iiiint", - "\\oint", - "\\oiint", - "\\oiiint", - "\\intclockwise", - "\\varointclockwise", - "\\intbar", - "\\intBar", - "\\fint", - "\\rppolint", - "\\scpolint", - "\\pointint", - "\\sqint", - "\\intlarhk", - "\\intx", - "\\intcap", - "\\intcup", - "\u222b", - "\u222c", - "\u222d", - "\u222e", - "\u222f", - "\u2230", - "\u2231", - "\u2232", - "\u2a0c", - "\u2a0d", - "\u2a0e", - "\u2a0f", - "\u2a12", - "\u2a13", - "\u2a15", - "\u2a16", - "\u2a17", - "\u2a18", - "\u2a19", - "\u2a1a" - ], - props: { - numArgs: 0 - }, - handler({ parser, funcName }) { - let fName = funcName; - if (fName.length === 1) { - fName = singleCharIntegrals[fName]; - } - return { - type: "op", - mode: parser.mode, - limits: false, - parentIsSupSub: false, - symbol: true, - stack: false, - name: fName - }; - }, - mathmlBuilder: mathmlBuilder$2 - }); - - /** - * All registered global/built-in macros. - * `macros.js` exports this same dictionary again and makes it public. - * `Parser.js` requires this dictionary via `macros.js`. - */ - const _macros = {}; - - // This function might one day accept an additional argument and do more things. - function defineMacro(name, body) { - _macros[name] = body; - } - - // NOTE: Unlike most builders, this one handles not only - // "operatorname", but also "supsub" since \operatorname* can - // affect super/subscripting. - - const mathmlBuilder$1 = (group, style) => { - let expression = buildExpression(group.body, style.withFont("mathrm")); - - // Is expression a string or has it something like a fraction? - let isAllString = true; // default - for (let i = 0; i < expression.length; i++) { - let node = expression[i]; - if (node instanceof mathMLTree.MathNode) { - if (node.type === "mrow" && node.children.length === 1 && - node.children[0] instanceof mathMLTree.MathNode) { - node = node.children[0]; - } - switch (node.type) { - case "mi": - case "mn": - case "ms": - case "mtext": - break; // Do nothing yet. - case "mspace": - { - if (node.attributes.width) { - const width = node.attributes.width.replace("em", ""); - const ch = spaceCharacter(Number(width)); - if (ch === "") { - isAllString = false; - } else { - expression[i] = new mathMLTree.MathNode("mtext", [new mathMLTree.TextNode(ch)]); - } - } - } - break - case "mo": { - const child = node.children[0]; - if (node.children.length === 1 && child instanceof mathMLTree.TextNode) { - child.text = child.text.replace(/\u2212/, "-").replace(/\u2217/, "*"); - } else { - isAllString = false; - } - break - } - default: - isAllString = false; - } - } else { - isAllString = false; - } - } - - if (isAllString) { - // Write a single TextNode instead of multiple nested tags. - const word = expression.map((node) => node.toText()).join(""); - expression = [new mathMLTree.TextNode(word)]; - } else if ( - expression.length === 1 - && ["mover", "munder"].includes(expression[0].type) && - (expression[0].children[0].type === "mi" || expression[0].children[0].type === "mtext") - ) { - expression[0].children[0].type = "mi"; - if (group.parentIsSupSub) { - return new mathMLTree.MathNode("mrow", expression) - } else { - const operator = new mathMLTree.MathNode("mo", [makeText("\u2061", "text")]); - return mathMLTree.newDocumentFragment([expression[0], operator]) - } - } - - let wrapper; - if (isAllString) { - wrapper = new mathMLTree.MathNode("mi", expression); - if (expression[0].text.length === 1) { - wrapper.setAttribute("mathvariant", "normal"); - } - } else { - wrapper = new mathMLTree.MathNode("mrow", expression); - } - - if (!group.parentIsSupSub) { - // Append an . - // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4 - const operator = new mathMLTree.MathNode("mo", [makeText("\u2061", "text")]); - const fragment = [wrapper, operator]; - if (group.needsLeadingSpace) { - // LaTeX gives operator spacing, but a gets ord spacing. - // So add a leading space. - const space = new mathMLTree.MathNode("mspace"); - space.setAttribute("width", "0.1667em"); // thin space. - fragment.unshift(space); - } - if (!group.isFollowedByDelimiter) { - const trail = new mathMLTree.MathNode("mspace"); - trail.setAttribute("width", "0.1667em"); // thin space. - fragment.push(trail); - } - return mathMLTree.newDocumentFragment(fragment) - } - - return wrapper - }; - - // \operatorname - // amsopn.dtx: \mathop{#1\kern\z@\operator@font#3}\newmcodes@ - defineFunction({ - type: "operatorname", - names: ["\\operatorname@", "\\operatornamewithlimits"], - props: { - numArgs: 1, - allowedInArgument: true - }, - handler: ({ parser, funcName }, args) => { - const body = args[0]; - const prevAtomType = parser.prevAtomType; - const next = parser.gullet.future().text; - return { - type: "operatorname", - mode: parser.mode, - body: ordargument(body), - alwaysHandleSupSub: (funcName === "\\operatornamewithlimits"), - limits: false, - parentIsSupSub: false, - isFollowedByDelimiter: isDelimiter(next), - needsLeadingSpace: prevAtomType.length > 0 && ordTypes.includes(prevAtomType) - }; - }, - mathmlBuilder: mathmlBuilder$1 - }); - - defineMacro("\\operatorname", - "\\@ifstar\\operatornamewithlimits\\operatorname@"); - - defineFunctionBuilders({ - type: "ordgroup", - mathmlBuilder(group, style) { - return buildExpressionRow(group.body, style, group.semisimple); - } - }); - - defineFunction({ - type: "phantom", - names: ["\\phantom"], - props: { - numArgs: 1, - allowedInText: true - }, - handler: ({ parser }, args) => { - const body = args[0]; - return { - type: "phantom", - mode: parser.mode, - body: ordargument(body) - }; - }, - mathmlBuilder: (group, style) => { - const inner = buildExpression(group.body, style); - return new mathMLTree.MathNode("mphantom", inner); - } - }); - - defineFunction({ - type: "hphantom", - names: ["\\hphantom"], - props: { - numArgs: 1, - allowedInText: true - }, - handler: ({ parser }, args) => { - const body = args[0]; - return { - type: "hphantom", - mode: parser.mode, - body - }; - }, - mathmlBuilder: (group, style) => { - const inner = buildExpression(ordargument(group.body), style); - const phantom = new mathMLTree.MathNode("mphantom", inner); - const node = new mathMLTree.MathNode("mpadded", [phantom]); - node.setAttribute("height", "0px"); - node.setAttribute("depth", "0px"); - return node; - } - }); - - defineFunction({ - type: "vphantom", - names: ["\\vphantom"], - props: { - numArgs: 1, - allowedInText: true - }, - handler: ({ parser }, args) => { - const body = args[0]; - return { - type: "vphantom", - mode: parser.mode, - body - }; - }, - mathmlBuilder: (group, style) => { - const inner = buildExpression(ordargument(group.body), style); - const phantom = new mathMLTree.MathNode("mphantom", inner); - const node = new mathMLTree.MathNode("mpadded", [phantom]); - node.setAttribute("width", "0px"); - return node; - } - }); - - // In LaTeX, \pmb is a simulation of bold font. - // The version of \pmb in ambsy.sty works by typesetting three copies of the argument - // with small offsets. We use CSS font-weight:bold. - - defineFunction({ - type: "pmb", - names: ["\\pmb"], - props: { - numArgs: 1, - allowedInText: true - }, - handler({ parser }, args) { - return { - type: "pmb", - mode: parser.mode, - body: ordargument(args[0]) - } - }, - mathmlBuilder(group, style) { - const inner = buildExpression(group.body, style); - // Wrap with an element. - const node = wrapWithMstyle(inner); - node.setAttribute("style", "font-weight:bold"); - return node - } - }); - - // \raise, \lower, and \raisebox - - const mathmlBuilder = (group, style) => { - const newStyle = style.withLevel(StyleLevel.TEXT); - const node = new mathMLTree.MathNode("mpadded", [buildGroup$1(group.body, newStyle)]); - const dy = calculateSize(group.dy, style); - node.setAttribute("voffset", dy.number + dy.unit); - // Add padding, which acts to increase height in Chromium. - // TODO: Figure out some way to change height in Firefox w/o breaking Chromium. - if (dy.number > 0) { - node.style.padding = dy.number + dy.unit + " 0 0 0"; - } else { - node.style.padding = "0 0 " + Math.abs(dy.number) + dy.unit + " 0"; - } - return node - }; - - defineFunction({ - type: "raise", - names: ["\\raise", "\\lower"], - props: { - numArgs: 2, - argTypes: ["size", "primitive"], - primitive: true - }, - handler({ parser, funcName }, args) { - const amount = assertNodeType(args[0], "size").value; - if (funcName === "\\lower") { amount.number *= -1; } - const body = args[1]; - return { - type: "raise", - mode: parser.mode, - dy: amount, - body - }; - }, - mathmlBuilder - }); - - - defineFunction({ - type: "raise", - names: ["\\raisebox"], - props: { - numArgs: 2, - argTypes: ["size", "hbox"], - allowedInText: true - }, - handler({ parser, funcName }, args) { - const amount = assertNodeType(args[0], "size").value; - const body = args[1]; - return { - type: "raise", - mode: parser.mode, - dy: amount, - body - }; - }, - mathmlBuilder - }); - - defineFunction({ - type: "ref", - names: ["\\ref", "\\eqref"], - props: { - numArgs: 1, - argTypes: ["raw"] - }, - handler({ parser, funcName }, args) { - return { - type: "ref", - mode: parser.mode, - funcName, - string: args[0].string.replace(invalidIdRegEx, "") - }; - }, - mathmlBuilder(group, style) { - // Create an empty text node. Set a class and an href. - // The post-processor will populate with the target's tag or equation number. - const classes = group.funcName === "\\ref" ? ["tml-ref"] : ["tml-ref", "tml-eqref"]; - const node = new mathMLTree.MathNode("mtext", [new mathMLTree.TextNode("")], classes); - node.setAttribute("href", "#" + group.string); - return node - } - }); - - defineFunction({ - type: "reflect", - names: ["\\reflectbox"], - props: { - numArgs: 1, - argTypes: ["hbox"], - allowedInText: true - }, - handler({ parser }, args) { - return { - type: "reflect", - mode: parser.mode, - body: args[0] - }; - }, - mathmlBuilder(group, style) { - const node = buildGroup$1(group.body, style); - node.style.transform = "scaleX(-1)"; - return node - } - }); - - defineFunction({ - type: "internal", - names: ["\\relax"], - props: { - numArgs: 0, - allowedInText: true - }, - handler({ parser }) { - return { - type: "internal", - mode: parser.mode - }; - } - }); - - defineFunction({ - type: "rule", - names: ["\\rule"], - props: { - numArgs: 2, - numOptionalArgs: 1, - argTypes: ["size", "size", "size"] - }, - handler({ parser }, args, optArgs) { - const shift = optArgs[0]; - const width = assertNodeType(args[0], "size"); - const height = assertNodeType(args[1], "size"); - return { - type: "rule", - mode: parser.mode, - shift: shift && assertNodeType(shift, "size").value, - width: width.value, - height: height.value - }; - }, - mathmlBuilder(group, style) { - const width = calculateSize(group.width, style); - const height = calculateSize(group.height, style); - const shift = group.shift - ? calculateSize(group.shift, style) - : { number: 0, unit: "em" }; - const color = (style.color && style.getColor()) || "black"; - - const rule = new mathMLTree.MathNode("mspace"); - if (width.number > 0 && height.number > 0) { - rule.setAttribute("mathbackground", color); - } - rule.setAttribute("width", width.number + width.unit); - rule.setAttribute("height", height.number + height.unit); - if (shift.number === 0) { return rule } - - const wrapper = new mathMLTree.MathNode("mpadded", [rule]); - if (shift.number >= 0) { - wrapper.setAttribute("height", "+" + shift.number + shift.unit); - } else { - wrapper.setAttribute("height", shift.number + shift.unit); - wrapper.setAttribute("depth", "+" + -shift.number + shift.unit); - } - wrapper.setAttribute("voffset", shift.number + shift.unit); - return wrapper; - } - }); - - // The size mappings are taken from TeX with \normalsize=10pt. - // We don't have to track script level. MathML does that. - const sizeMap = { - "\\tiny": 0.5, - "\\sixptsize": 0.6, - "\\Tiny": 0.6, - "\\scriptsize": 0.7, - "\\footnotesize": 0.8, - "\\small": 0.9, - "\\normalsize": 1.0, - "\\large": 1.2, - "\\Large": 1.44, - "\\LARGE": 1.728, - "\\huge": 2.074, - "\\Huge": 2.488 - }; - - defineFunction({ - type: "sizing", - names: [ - "\\tiny", - "\\sixptsize", - "\\Tiny", - "\\scriptsize", - "\\footnotesize", - "\\small", - "\\normalsize", - "\\large", - "\\Large", - "\\LARGE", - "\\huge", - "\\Huge" - ], - props: { - numArgs: 0, - allowedInText: true - }, - handler: ({ breakOnTokenText, funcName, parser }, args) => { - if (parser.settings.strict && parser.mode === "math") { - // eslint-disable-next-line no-console - console.log(`Temml strict-mode warning: Command ${funcName} is invalid in math mode.`); - } - const body = parser.parseExpression(false, breakOnTokenText, true); - return { - type: "sizing", - mode: parser.mode, - funcName, - body - }; - }, - mathmlBuilder: (group, style) => { - const newStyle = style.withFontSize(sizeMap[group.funcName]); - const inner = buildExpression(group.body, newStyle); - // Wrap with an element. - const node = wrapWithMstyle(inner); - const factor = (sizeMap[group.funcName] / style.fontSize).toFixed(4); - node.setAttribute("mathsize", factor + "em"); - return node; - } - }); - - // smash, with optional [tb], as in AMS - - defineFunction({ - type: "smash", - names: ["\\smash"], - props: { - numArgs: 1, - numOptionalArgs: 1, - allowedInText: true - }, - handler: ({ parser }, args, optArgs) => { - let smashHeight = false; - let smashDepth = false; - const tbArg = optArgs[0] && assertNodeType(optArgs[0], "ordgroup"); - if (tbArg) { - // Optional [tb] argument is engaged. - // ref: amsmath: \renewcommand{\smash}[1][tb]{% - // def\mb@t{\ht}\def\mb@b{\dp}\def\mb@tb{\ht\z@\z@\dp}% - let letter = ""; - for (let i = 0; i < tbArg.body.length; ++i) { - const node = tbArg.body[i]; - // TODO: Write an AssertSymbolNode - letter = node.text; - if (letter === "t") { - smashHeight = true; - } else if (letter === "b") { - smashDepth = true; - } else { - smashHeight = false; - smashDepth = false; - break; - } - } - } else { - smashHeight = true; - smashDepth = true; - } - - const body = args[0]; - return { - type: "smash", - mode: parser.mode, - body, - smashHeight, - smashDepth - }; - }, - mathmlBuilder: (group, style) => { - const node = new mathMLTree.MathNode("mpadded", [buildGroup$1(group.body, style)]); - - if (group.smashHeight) { - node.setAttribute("height", "0px"); - } - - if (group.smashDepth) { - node.setAttribute("depth", "0px"); - } - - return node; - } - }); - - defineFunction({ - type: "sqrt", - names: ["\\sqrt"], - props: { - numArgs: 1, - numOptionalArgs: 1 - }, - handler({ parser }, args, optArgs) { - const index = optArgs[0]; - const body = args[0]; - return { - type: "sqrt", - mode: parser.mode, - body, - index - }; - }, - mathmlBuilder(group, style) { - const { body, index } = group; - return index - ? new mathMLTree.MathNode("mroot", [ - buildGroup$1(body, style), - buildGroup$1(index, style.incrementLevel()) - ]) - : new mathMLTree.MathNode("msqrt", [buildGroup$1(body, style)]); - } - }); - - const styleMap = { - display: 0, - text: 1, - script: 2, - scriptscript: 3 - }; - - const styleAttributes = { - display: ["0", "true"], - text: ["0", "false"], - script: ["1", "false"], - scriptscript: ["2", "false"] - }; - - defineFunction({ - type: "styling", - names: ["\\displaystyle", "\\textstyle", "\\scriptstyle", "\\scriptscriptstyle"], - props: { - numArgs: 0, - allowedInText: true, - primitive: true - }, - handler({ breakOnTokenText, funcName, parser }, args) { - // parse out the implicit body - const body = parser.parseExpression(true, breakOnTokenText, true); - - const scriptLevel = funcName.slice(1, funcName.length - 5); - return { - type: "styling", - mode: parser.mode, - // Figure out what scriptLevel to use by pulling out the scriptLevel from - // the function name - scriptLevel, - body - }; - }, - mathmlBuilder(group, style) { - // Figure out what scriptLevel we're changing to. - const newStyle = style.withLevel(styleMap[group.scriptLevel]); - // The style argument in the next line does NOT directly set a MathML script level. - // It just tracks the style level, in case we need to know it for supsub or mathchoice. - const inner = buildExpression(group.body, newStyle); - // Wrap with an element. - const node = wrapWithMstyle(inner); - - const attr = styleAttributes[group.scriptLevel]; - - // Here is where we set the MathML script level. - node.setAttribute("scriptlevel", attr[0]); - node.setAttribute("displaystyle", attr[1]); - - return node; - } - }); - - /** - * Sometimes, groups perform special rules when they have superscripts or - * subscripts attached to them. This function lets the `supsub` group know that - * Sometimes, groups perform special rules when they have superscripts or - * its inner element should handle the superscripts and subscripts instead of - * handling them itself. - */ - - // Helpers - const symbolRegEx = /^m(over|under|underover)$/; - - // Super scripts and subscripts, whose precise placement can depend on other - // functions that precede them. - defineFunctionBuilders({ - type: "supsub", - mathmlBuilder(group, style) { - // Is the inner group a relevant horizonal brace? - let isBrace = false; - let isOver; - let isSup; - let appendApplyFunction = false; - let appendSpace = false; - let needsLeadingSpace = false; - - if (group.base && group.base.type === "horizBrace") { - isSup = !!group.sup; - if (isSup === group.base.isOver) { - isBrace = true; - isOver = group.base.isOver; - } - } - - if (group.base && !group.base.stack && - (group.base.type === "op" || group.base.type === "operatorname")) { - group.base.parentIsSupSub = true; - appendApplyFunction = !group.base.symbol; - appendSpace = appendApplyFunction && !group.isFollowedByDelimiter; - needsLeadingSpace = group.base.needsLeadingSpace; - } - - const children = group.base && group.base.stack - ? [buildGroup$1(group.base.body[0], style)] - : [buildGroup$1(group.base, style)]; - - const childStyle = style.inSubOrSup(); - if (group.sub) { - children.push(buildGroup$1(group.sub, childStyle)); - } - - if (group.sup) { - const sup = buildGroup$1(group.sup, childStyle); - const testNode = sup.type === "mrow" ? sup.children[0] : sup; - if ((testNode.type === "mo" && testNode.classes.includes("tml-prime")) - && group.base && group.base.text && group.base.text === "f") { - // Chromium does not address italic correction on prime. Prevent f′ from overlapping. - testNode.classes.push("prime-pad"); - } - children.push(sup); - } - - let nodeType; - if (isBrace) { - nodeType = isOver ? "mover" : "munder"; - } else if (!group.sub) { - const base = group.base; - if ( - base && - base.type === "op" && - base.limits && - (style.level === StyleLevel.DISPLAY || base.alwaysHandleSupSub) - ) { - nodeType = "mover"; - } else if ( - base && - base.type === "operatorname" && - base.alwaysHandleSupSub && - (base.limits || style.level === StyleLevel.DISPLAY) - ) { - nodeType = "mover"; - } else { - nodeType = "msup"; - } - } else if (!group.sup) { - const base = group.base; - if ( - base && - base.type === "op" && - base.limits && - (style.level === StyleLevel.DISPLAY || base.alwaysHandleSupSub) - ) { - nodeType = "munder"; - } else if ( - base && - base.type === "operatorname" && - base.alwaysHandleSupSub && - (base.limits || style.level === StyleLevel.DISPLAY) - ) { - nodeType = "munder"; - } else { - nodeType = "msub"; - } - } else { - const base = group.base; - if (base && ((base.type === "op" && base.limits) || base.type === "multiscript") && - (style.level === StyleLevel.DISPLAY || base.alwaysHandleSupSub) - ) { - nodeType = "munderover"; - } else if ( - base && - base.type === "operatorname" && - base.alwaysHandleSupSub && - (style.level === StyleLevel.DISPLAY || base.limits) - ) { - nodeType = "munderover"; - } else { - nodeType = "msubsup"; - } - } - - let node = new mathMLTree.MathNode(nodeType, children); - if (appendApplyFunction) { - // Append an . - // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4 - const operator = new mathMLTree.MathNode("mo", [makeText("\u2061", "text")]); - if (needsLeadingSpace) { - const space = new mathMLTree.MathNode("mspace"); - space.setAttribute("width", "0.1667em"); // thin space. - node = mathMLTree.newDocumentFragment([space, node, operator]); - } else { - node = mathMLTree.newDocumentFragment([node, operator]); - } - if (appendSpace) { - const space = new mathMLTree.MathNode("mspace"); - space.setAttribute("width", "0.1667em"); // thin space. - node.children.push(space); - } - } else if (symbolRegEx.test(nodeType)) { - // Wrap in a . Otherwise Firefox stretchy parens will not stretch to include limits. - node = new mathMLTree.MathNode("mrow", [node]); - } - - return node - } - }); - - // Operator ParseNodes created in Parser.js from symbol Groups in src/symbols.js. - - const short = ["\\shortmid", "\\nshortmid", "\\shortparallel", - "\\nshortparallel", "\\smallsetminus"]; - - const arrows = ["\\Rsh", "\\Lsh", "\\restriction"]; - - const isArrow = str => { - if (str.length === 1) { - const codePoint = str.codePointAt(0); - return (0x218f < codePoint && codePoint < 0x2200) - } - return str.indexOf("arrow") > -1 || str.indexOf("harpoon") > -1 || arrows.includes(str) - }; - - defineFunctionBuilders({ - type: "atom", - mathmlBuilder(group, style) { - const node = new mathMLTree.MathNode("mo", [makeText(group.text, group.mode)]); - if (group.family === "punct") { - node.setAttribute("separator", "true"); - } else if (group.family === "open" || group.family === "close") { - // Delims built here should not stretch vertically. - // See delimsizing.js for stretchy delims. - if (group.family === "open") { - node.setAttribute("form", "prefix"); - // Set an explicit attribute for stretch. Otherwise Firefox may do it wrong. - node.setAttribute("stretchy", "false"); - } else if (group.family === "close") { - node.setAttribute("form", "postfix"); - node.setAttribute("stretchy", "false"); - } - } else if (group.text === "\\mid") { - // Firefox messes up this spacing if at the end of an . See it explicitly. - node.setAttribute("lspace", "0.22em"); // medium space - node.setAttribute("rspace", "0.22em"); - node.setAttribute("stretchy", "false"); - } else if (group.family === "rel" && isArrow(group.text)) { - node.setAttribute("stretchy", "false"); - } else if (short.includes(group.text)) { - node.setAttribute("mathsize", "70%"); - } else if (group.text === ":") { - // ":" is not in the MathML operator dictionary. Give it BIN spacing. - node.attributes.lspace = "0.2222em"; - node.attributes.rspace = "0.2222em"; - } - return node; - } - }); - - /** - * Maps TeX font commands to "mathvariant" attribute in buildMathML.js - */ - const fontMap = { - // styles - mathbf: "bold", - mathrm: "normal", - textit: "italic", - mathit: "italic", - mathnormal: "italic", - - // families - mathbb: "double-struck", - mathcal: "script", - mathfrak: "fraktur", - mathscr: "script", - mathsf: "sans-serif", - mathtt: "monospace" - }; - - /** - * Returns the math variant as a string or null if none is required. - */ - const getVariant = function(group, style) { - // Handle font specifiers as best we can. - // Chromium does not support the MathML mathvariant attribute. - // So we'll use Unicode replacement characters instead. - // But first, determine the math variant. - - // Deal with the \textit, \textbf, etc., functions. - if (style.fontFamily === "texttt") { - return "monospace" - } else if (style.fontFamily === "textsc") { - return "normal"; // handled via character substitution in symbolsOrd.js. - } else if (style.fontFamily === "textsf") { - if (style.fontShape === "textit" && style.fontWeight === "textbf") { - return "sans-serif-bold-italic" - } else if (style.fontShape === "textit") { - return "sans-serif-italic" - } else if (style.fontWeight === "textbf") { - return "sans-serif-bold" - } else { - return "sans-serif" - } - } else if (style.fontShape === "textit" && style.fontWeight === "textbf") { - return "bold-italic" - } else if (style.fontShape === "textit") { - return "italic" - } else if (style.fontWeight === "textbf") { - return "bold" - } - - // Deal with the \mathit, mathbf, etc, functions. - const font = style.font; - if (!font || font === "mathnormal") { - return null - } - - const mode = group.mode; - switch (font) { - case "mathit": - return "italic" - case "mathrm": { - const codePoint = group.text.codePointAt(0); - // LaTeX \mathrm returns italic for Greek characters. - return (0x03ab < codePoint && codePoint < 0x03cf) ? "italic" : "normal" - } - case "greekItalic": - return "italic" - case "up@greek": - return "normal" - case "boldsymbol": - case "mathboldsymbol": - return "bold-italic" - case "mathbf": - return "bold" - case "mathbb": - return "double-struck" - case "mathfrak": - return "fraktur" - case "mathscr": - case "mathcal": - return "script" - case "mathsf": - return "sans-serif" - case "mathtt": - return "monospace" - } - - let text = group.text; - if (symbols[mode][text] && symbols[mode][text].replace) { - text = symbols[mode][text].replace; - } - - return Object.prototype.hasOwnProperty.call(fontMap, font) ? fontMap[font] : null - }; - - // Chromium does not support the MathML `mathvariant` attribute. - // Instead, we replace ASCII characters with Unicode characters that - // are defined in the font as bold, italic, double-struck, etc. - // This module identifies those Unicode code points. - - // First, a few helpers. - const script = Object.freeze({ - B: 0x20EA, // Offset from ASCII B to Unicode script B - E: 0x20EB, - F: 0x20EB, - H: 0x20C3, - I: 0x20C7, - L: 0x20C6, - M: 0x20E6, - R: 0x20C9, - e: 0x20CA, - g: 0x20A3, - o: 0x20C5 - }); - - const frak = Object.freeze({ - C: 0x20EA, - H: 0x20C4, - I: 0x20C8, - R: 0x20CA, - Z: 0x20CE - }); - - const bbb = Object.freeze({ - C: 0x20BF, // blackboard bold - H: 0x20C5, - N: 0x20C7, - P: 0x20C9, - Q: 0x20C9, - R: 0x20CB, - Z: 0x20CA - }); - - const bold = Object.freeze({ - "\u03f5": 0x1D2E7, // lunate epsilon - "\u03d1": 0x1D30C, // vartheta - "\u03f0": 0x1D2EE, // varkappa - "\u03c6": 0x1D319, // varphi - "\u03f1": 0x1D2EF, // varrho - "\u03d6": 0x1D30B // varpi - }); - - const boldItalic = Object.freeze({ - "\u03f5": 0x1D35B, // lunate epsilon - "\u03d1": 0x1D380, // vartheta - "\u03f0": 0x1D362, // varkappa - "\u03c6": 0x1D38D, // varphi - "\u03f1": 0x1D363, // varrho - "\u03d6": 0x1D37F // varpi - }); - - const boldsf = Object.freeze({ - "\u03f5": 0x1D395, // lunate epsilon - "\u03d1": 0x1D3BA, // vartheta - "\u03f0": 0x1D39C, // varkappa - "\u03c6": 0x1D3C7, // varphi - "\u03f1": 0x1D39D, // varrho - "\u03d6": 0x1D3B9 // varpi - }); - - const bisf = Object.freeze({ - "\u03f5": 0x1D3CF, // lunate epsilon - "\u03d1": 0x1D3F4, // vartheta - "\u03f0": 0x1D3D6, // varkappa - "\u03c6": 0x1D401, // varphi - "\u03f1": 0x1D3D7, // varrho - "\u03d6": 0x1D3F3 // varpi - }); - - // Code point offsets below are derived from https://www.unicode.org/charts/PDF/U1D400.pdf - const offset = Object.freeze({ - upperCaseLatin: { // A-Z - "normal": ch => { return 0 }, - "bold": ch => { return 0x1D3BF }, - "italic": ch => { return 0x1D3F3 }, - "bold-italic": ch => { return 0x1D427 }, - "script": ch => { return script[ch] || 0x1D45B }, - "script-bold": ch => { return 0x1D48F }, - "fraktur": ch => { return frak[ch] || 0x1D4C3 }, - "fraktur-bold": ch => { return 0x1D52B }, - "double-struck": ch => { return bbb[ch] || 0x1D4F7 }, - "sans-serif": ch => { return 0x1D55F }, - "sans-serif-bold": ch => { return 0x1D593 }, - "sans-serif-italic": ch => { return 0x1D5C7 }, - "sans-serif-bold-italic": ch => { return 0x1D63C }, - "monospace": ch => { return 0x1D62F } - }, - lowerCaseLatin: { // a-z - "normal": ch => { return 0 }, - "bold": ch => { return 0x1D3B9 }, - "italic": ch => { return ch === "h" ? 0x20A6 : 0x1D3ED }, - "bold-italic": ch => { return 0x1D421 }, - "script": ch => { return script[ch] || 0x1D455 }, - "script-bold": ch => { return 0x1D489 }, - "fraktur": ch => { return 0x1D4BD }, - "fraktur-bold": ch => { return 0x1D525 }, - "double-struck": ch => { return 0x1D4F1 }, - "sans-serif": ch => { return 0x1D559 }, - "sans-serif-bold": ch => { return 0x1D58D }, - "sans-serif-italic": ch => { return 0x1D5C1 }, - "sans-serif-bold-italic": ch => { return 0x1D5F5 }, - "monospace": ch => { return 0x1D629 } - }, - upperCaseGreek: { // A-Ω - "normal": ch => { return 0 }, - "bold": ch => { return 0x1D317 }, - "italic": ch => { return 0x1D351 }, - // \boldsymbol actually returns upright bold for upperCaseGreek - "bold-italic": ch => { return 0x1D317 }, - "script": ch => { return 0 }, - "script-bold": ch => { return 0 }, - "fraktur": ch => { return 0 }, - "fraktur-bold": ch => { return 0 }, - "double-struck": ch => { return 0 }, - // Unicode has no code points for regular-weight san-serif Greek. Use bold. - "sans-serif": ch => { return 0x1D3C5 }, - "sans-serif-bold": ch => { return 0x1D3C5 }, - "sans-serif-italic": ch => { return 0 }, - "sans-serif-bold-italic": ch => { return 0x1D3FF }, - "monospace": ch => { return 0 } - }, - lowerCaseGreek: { // α-ω - "normal": ch => { return 0 }, - "bold": ch => { return 0x1D311 }, - "italic": ch => { return 0x1D34B }, - "bold-italic": ch => { return ch === "\u03d5" ? 0x1D37E : 0x1D385 }, - "script": ch => { return 0 }, - "script-bold": ch => { return 0 }, - "fraktur": ch => { return 0 }, - "fraktur-bold": ch => { return 0 }, - "double-struck": ch => { return 0 }, - // Unicode has no code points for regular-weight san-serif Greek. Use bold. - "sans-serif": ch => { return 0x1D3BF }, - "sans-serif-bold": ch => { return 0x1D3BF }, - "sans-serif-italic": ch => { return 0 }, - "sans-serif-bold-italic": ch => { return 0x1D3F9 }, - "monospace": ch => { return 0 } - }, - varGreek: { // \varGamma, etc - "normal": ch => { return 0 }, - "bold": ch => { return bold[ch] || -51 }, - "italic": ch => { return 0 }, - "bold-italic": ch => { return boldItalic[ch] || 0x3A }, - "script": ch => { return 0 }, - "script-bold": ch => { return 0 }, - "fraktur": ch => { return 0 }, - "fraktur-bold": ch => { return 0 }, - "double-struck": ch => { return 0 }, - "sans-serif": ch => { return boldsf[ch] || 0x74 }, - "sans-serif-bold": ch => { return boldsf[ch] || 0x74 }, - "sans-serif-italic": ch => { return 0 }, - "sans-serif-bold-italic": ch => { return bisf[ch] || 0xAE }, - "monospace": ch => { return 0 } - }, - numeral: { // 0-9 - "normal": ch => { return 0 }, - "bold": ch => { return 0x1D79E }, - "italic": ch => { return 0 }, - "bold-italic": ch => { return 0 }, - "script": ch => { return 0 }, - "script-bold": ch => { return 0 }, - "fraktur": ch => { return 0 }, - "fraktur-bold": ch => { return 0 }, - "double-struck": ch => { return 0x1D7A8 }, - "sans-serif": ch => { return 0x1D7B2 }, - "sans-serif-bold": ch => { return 0x1D7BC }, - "sans-serif-italic": ch => { return 0 }, - "sans-serif-bold-italic": ch => { return 0 }, - "monospace": ch => { return 0x1D7C6 } - } - }); - - const variantChar = (ch, variant) => { - const codePoint = ch.codePointAt(0); - const block = 0x40 < codePoint && codePoint < 0x5b - ? "upperCaseLatin" - : 0x60 < codePoint && codePoint < 0x7b - ? "lowerCaseLatin" - : (0x390 < codePoint && codePoint < 0x3AA) - ? "upperCaseGreek" - : 0x3B0 < codePoint && codePoint < 0x3CA || ch === "\u03d5" - ? "lowerCaseGreek" - : 0x1D6E1 < codePoint && codePoint < 0x1D6FC || bold[ch] - ? "varGreek" - : (0x2F < codePoint && codePoint < 0x3A) - ? "numeral" - : "other"; - return block === "other" - ? ch - : String.fromCodePoint(codePoint + offset[block][variant](ch)) - }; - - const smallCaps = Object.freeze({ - a: "ᴀ", - b: "ʙ", - c: "ᴄ", - d: "ᴅ", - e: "ᴇ", - f: "ꜰ", - g: "ɢ", - h: "ʜ", - i: "ɪ", - j: "ᴊ", - k: "ᴋ", - l: "ʟ", - m: "ᴍ", - n: "ɴ", - o: "ᴏ", - p: "ᴘ", - q: "ǫ", - r: "ʀ", - s: "s", - t: "ᴛ", - u: "ᴜ", - v: "ᴠ", - w: "ᴡ", - x: "x", - y: "ʏ", - z: "ᴢ" - }); - - // "mathord" and "textord" ParseNodes created in Parser.js from symbol Groups in - // src/symbols.js. - - const numberRegEx = /^\d(?:[\d,.]*\d)?$/; - const latinRegEx = /[A-Ba-z]/; - const primes = new Set(["\\prime", "\\dprime", "\\trprime", "\\qprime", - "\\backprime", "\\backdprime", "\\backtrprime"]); - - const italicNumber = (text, variant, tag) => { - const mn = new mathMLTree.MathNode(tag, [text]); - const wrapper = new mathMLTree.MathNode("mstyle", [mn]); - wrapper.style["font-style"] = "italic"; - wrapper.style["font-family"] = "Cambria, 'Times New Roman', serif"; - if (variant === "bold-italic") { wrapper.style["font-weight"] = "bold"; } - return wrapper - }; - - defineFunctionBuilders({ - type: "mathord", - mathmlBuilder(group, style) { - const text = makeText(group.text, group.mode, style); - const codePoint = text.text.codePointAt(0); - // Test for upper-case Greek - const defaultVariant = (0x0390 < codePoint && codePoint < 0x03aa) ? "normal" : "italic"; - const variant = getVariant(group, style) || defaultVariant; - if (variant === "script") { - text.text = variantChar(text.text, variant); - return new mathMLTree.MathNode("mi", [text], [style.font]) - } else if (variant !== "italic") { - text.text = variantChar(text.text, variant); - } - let node = new mathMLTree.MathNode("mi", [text]); - // TODO: Handle U+1D49C - U+1D4CF per https://www.unicode.org/charts/PDF/U1D400.pdf - if (variant === "normal") { - node.setAttribute("mathvariant", "normal"); - if (text.text.length === 1) { - // A Firefox bug will apply spacing here, but there should be none. Fix it. - node = new mathMLTree.MathNode("mrow", [node]); - } - } - return node - } - }); - - defineFunctionBuilders({ - type: "textord", - mathmlBuilder(group, style) { - let ch = group.text; - const codePoint = ch.codePointAt(0); - if (style.fontFamily === "textsc") { - // Convert small latin letters to small caps. - if (96 < codePoint && codePoint < 123) { - ch = smallCaps[ch]; - } - } - const text = makeText(ch, group.mode, style); - const variant = getVariant(group, style) || "normal"; - - let node; - if (numberRegEx.test(group.text)) { - const tag = group.mode === "text" ? "mtext" : "mn"; - if (variant === "italic" || variant === "bold-italic") { - return italicNumber(text, variant, tag) - } else { - if (variant !== "normal") { - text.text = text.text.split("").map(c => variantChar(c, variant)).join(""); - } - node = new mathMLTree.MathNode(tag, [text]); - } - } else if (group.mode === "text") { - if (variant !== "normal") { - text.text = variantChar(text.text, variant); - } - node = new mathMLTree.MathNode("mtext", [text]); - } else if (primes.has(group.text)) { - node = new mathMLTree.MathNode("mo", [text]); - // TODO: If/when Chromium uses ssty variant for prime, remove the next line. - node.classes.push("tml-prime"); - } else { - const origText = text.text; - if (variant !== "italic") { - text.text = variantChar(text.text, variant); - } - node = new mathMLTree.MathNode("mi", [text]); - if (text.text === origText && latinRegEx.test(origText)) { - node.setAttribute("mathvariant", "italic"); - } - } - return node - } - }); - - // A map of CSS-based spacing functions to their CSS class. - const cssSpace = { - "\\nobreak": "nobreak", - "\\allowbreak": "allowbreak" - }; - - // A lookup table to determine whether a spacing function/symbol should be - // treated like a regular space character. If a symbol or command is a key - // in this table, then it should be a regular space character. Furthermore, - // the associated value may have a `className` specifying an extra CSS class - // to add to the created `span`. - const regularSpace = { - " ": {}, - "\\ ": {}, - "~": { - className: "nobreak" - }, - "\\space": {}, - "\\nobreakspace": { - className: "nobreak" - } - }; - - // ParseNode<"spacing"> created in Parser.js from the "spacing" symbol Groups in - // src/symbols.js. - defineFunctionBuilders({ - type: "spacing", - mathmlBuilder(group, style) { - let node; - - if (Object.prototype.hasOwnProperty.call(regularSpace, group.text)) { - // Firefox does not render a space in a . So write a no-break space. - // TODO: If Firefox fixes that bug, uncomment the next line and write ch into the node. - //const ch = (regularSpace[group.text].className === "nobreak") ? "\u00a0" : " " - node = new mathMLTree.MathNode("mtext", [new mathMLTree.TextNode("\u00a0")]); - } else if (Object.prototype.hasOwnProperty.call(cssSpace, group.text)) { - // MathML 3.0 calls for nobreak to occur in an , not an - // Ref: https://www.w3.org/Math/draft-spec/mathml.html#chapter3_presm.lbattrs - node = new mathMLTree.MathNode("mo"); - if (group.text === "\\nobreak") { - node.setAttribute("linebreak", "nobreak"); - } - } else { - throw new ParseError(`Unknown type of space "${group.text}"`) - } - - return node - } - }); - - defineFunctionBuilders({ - type: "tag" - }); - - // For a \tag, the work usually done in a mathmlBuilder is instead done in buildMathML.js. - // That way, a \tag can be pulled out of the parse tree and wrapped around the outer node. - - // Non-mathy text, possibly in a font - const textFontFamilies = { - "\\text": undefined, - "\\textrm": "textrm", - "\\textsf": "textsf", - "\\texttt": "texttt", - "\\textnormal": "textrm", - "\\textsc": "textsc" // small caps - }; - - const textFontWeights = { - "\\textbf": "textbf", - "\\textmd": "textmd" - }; - - const textFontShapes = { - "\\textit": "textit", - "\\textup": "textup" - }; - - const styleWithFont = (group, style) => { - const font = group.font; - // Checks if the argument is a font family or a font style. - if (!font) { - return style; - } else if (textFontFamilies[font]) { - return style.withTextFontFamily(textFontFamilies[font]); - } else if (textFontWeights[font]) { - return style.withTextFontWeight(textFontWeights[font]); - } else { - return style.withTextFontShape(textFontShapes[font]); - } - }; - - defineFunction({ - type: "text", - names: [ - // Font families - "\\text", - "\\textrm", - "\\textsf", - "\\texttt", - "\\textnormal", - "\\textsc", - // Font weights - "\\textbf", - "\\textmd", - // Font Shapes - "\\textit", - "\\textup" - ], - props: { - numArgs: 1, - argTypes: ["text"], - allowedInArgument: true, - allowedInText: true - }, - handler({ parser, funcName }, args) { - const body = args[0]; - return { - type: "text", - mode: parser.mode, - body: ordargument(body), - font: funcName - }; - }, - mathmlBuilder(group, style) { - const newStyle = styleWithFont(group, style); - const mrow = buildExpressionRow(group.body, newStyle); - return consolidateText(mrow) - } - }); - - defineFunction({ - type: "verb", - names: ["\\verb"], - props: { - numArgs: 0, - allowedInText: true - }, - handler(context, args, optArgs) { - // \verb and \verb* are dealt with directly in Parser.js. - // If we end up here, it's because of a failure to match the two delimiters - // in the regex in Lexer.js. LaTeX raises the following error when \verb is - // terminated by end of line (or file). - throw new ParseError("\\verb ended by end of line instead of matching delimiter"); - }, - mathmlBuilder(group, style) { - const text = new mathMLTree.TextNode(makeVerb(group)); - const node = new mathMLTree.MathNode("mtext", [text]); - node.setAttribute("mathvariant", "monospace"); - return node; - } - }); - - /** - * Converts verb group into body string. - * - * \verb* replaces each space with an open box \u2423 - * \verb replaces each space with a no-break space \xA0 - */ - const makeVerb = (group) => group.body.replace(/ /g, group.star ? "\u2423" : "\xA0"); - - /** Include this to ensure that all functions are defined. */ - - const functions = _functions; - - /** - * Lexing or parsing positional information for error reporting. - * This object is immutable. - */ - class SourceLocation { - constructor(lexer, start, end) { - this.lexer = lexer; // Lexer holding the input string. - this.start = start; // Start offset, zero-based inclusive. - this.end = end; // End offset, zero-based exclusive. - } - - /** - * Merges two `SourceLocation`s from location providers, given they are - * provided in order of appearance. - * - Returns the first one's location if only the first is provided. - * - Returns a merged range of the first and the last if both are provided - * and their lexers match. - * - Otherwise, returns null. - */ - static range(first, second) { - if (!second) { - return first && first.loc; - } else if (!first || !first.loc || !second.loc || first.loc.lexer !== second.loc.lexer) { - return null; - } else { - return new SourceLocation(first.loc.lexer, first.loc.start, second.loc.end); - } - } - } - - /** - * Interface required to break circular dependency between Token, Lexer, and - * ParseError. - */ - - /** - * The resulting token returned from `lex`. - * - * It consists of the token text plus some position information. - * The position information is essentially a range in an input string, - * but instead of referencing the bare input string, we refer to the lexer. - * That way it is possible to attach extra metadata to the input string, - * like for example a file name or similar. - * - * The position information is optional, so it is OK to construct synthetic - * tokens if appropriate. Not providing available position information may - * lead to degraded error reporting, though. - */ - class Token { - constructor( - text, // the text of this token - loc - ) { - this.text = text; - this.loc = loc; - } - - /** - * Given a pair of tokens (this and endToken), compute a `Token` encompassing - * the whole input range enclosed by these two. - */ - range( - endToken, // last token of the range, inclusive - text // the text of the newly constructed token - ) { - return new Token(text, SourceLocation.range(this, endToken)); - } - } - - /** - * The Lexer class handles tokenizing the input in various ways. Since our - * parser expects us to be able to backtrack, the lexer allows lexing from any - * given starting point. - * - * Its main exposed function is the `lex` function, which takes a position to - * lex from and a type of token to lex. It defers to the appropriate `_innerLex` - * function. - * - * The various `_innerLex` functions perform the actual lexing of different - * kinds. - */ - - /* The following tokenRegex - * - matches typical whitespace (but not NBSP etc.) using its first two groups - * - does not match any control character \x00-\x1f except whitespace - * - does not match a bare backslash - * - matches any ASCII character except those just mentioned - * - does not match the BMP private use area \uE000-\uF8FF - * - does not match bare surrogate code units - * - matches any BMP character except for those just described - * - matches any valid Unicode surrogate pair - * - mathches numerals - * - matches a backslash followed by one or more whitespace characters - * - matches a backslash followed by one or more letters then whitespace - * - matches a backslash followed by any BMP character - * Capturing groups: - * [1] regular whitespace - * [2] backslash followed by whitespace - * [3] anything else, which may include: - * [4] left character of \verb* - * [5] left character of \verb - * [6] backslash followed by word, excluding any trailing whitespace - * Just because the Lexer matches something doesn't mean it's valid input: - * If there is no matching function or symbol definition, the Parser will - * still reject the input. - */ - const spaceRegexString = "[ \r\n\t]"; - const controlWordRegexString = "\\\\[a-zA-Z@]+"; - const controlSymbolRegexString = "\\\\[^\uD800-\uDFFF]"; - const controlWordWhitespaceRegexString = `(${controlWordRegexString})${spaceRegexString}*`; - const controlSpaceRegexString = "\\\\(\n|[ \r\t]+\n?)[ \r\t]*"; - const combiningDiacriticalMarkString = "[\u0300-\u036f]"; - const combiningDiacriticalMarksEndRegex = new RegExp(`${combiningDiacriticalMarkString}+$`); - const tokenRegexString = - `(${spaceRegexString}+)|` + // whitespace - `${controlSpaceRegexString}|` + // whitespace - "([!-\\[\\]-\u2027\u202A-\uD7FF\uF900-\uFFFF]" + // single codepoint - `${combiningDiacriticalMarkString}*` + // ...plus accents - "|[\uD800-\uDBFF][\uDC00-\uDFFF]" + // surrogate pair - `${combiningDiacriticalMarkString}*` + // ...plus accents - "|\\\\verb\\*([^]).*?\\4" + // \verb* - "|\\\\verb([^*a-zA-Z]).*?\\5" + // \verb unstarred - `|${controlWordWhitespaceRegexString}` + // \macroName + spaces - `|${controlSymbolRegexString})`; // \\, \', etc. - - /** Main Lexer class */ - class Lexer { - constructor(input, settings) { - // Separate accents from characters - this.input = input; - this.settings = settings; - this.tokenRegex = new RegExp(tokenRegexString, 'g'); - // Category codes. The lexer only supports comment characters (14) for now. - // MacroExpander additionally distinguishes active (13). - this.catcodes = { - "%": 14, // comment character - "~": 13 // active character - }; - } - - setCatcode(char, code) { - this.catcodes[char] = code; - } - - /** - * This function lexes a single token. - */ - lex() { - const input = this.input; - const pos = this.tokenRegex.lastIndex; - if (pos === input.length) { - return new Token("EOF", new SourceLocation(this, pos, pos)); - } - const match = this.tokenRegex.exec(input); - if (match === null || match.index !== pos) { - throw new ParseError( - `Unexpected character: '${input[pos]}'`, - new Token(input[pos], new SourceLocation(this, pos, pos + 1)) - ); - } - const text = match[6] || match[3] || (match[2] ? "\\ " : " "); - - if (this.catcodes[text] === 14) { - // comment character - const nlIndex = input.indexOf("\n", this.tokenRegex.lastIndex); - if (nlIndex === -1) { - this.tokenRegex.lastIndex = input.length; // EOF - if (this.settings.strict) { - throw new ParseError("% comment has no terminating newline; LaTeX would " + - "fail because of commenting the end of math mode") - } - } else { - this.tokenRegex.lastIndex = nlIndex + 1; - } - return this.lex(); - } - - return new Token(text, new SourceLocation(this, pos, this.tokenRegex.lastIndex)); - } - } - - /** - * A `Namespace` refers to a space of nameable things like macros or lengths, - * which can be `set` either globally or local to a nested group, using an - * undo stack similar to how TeX implements this functionality. - * Performance-wise, `get` and local `set` take constant time, while global - * `set` takes time proportional to the depth of group nesting. - */ - - class Namespace { - /** - * Both arguments are optional. The first argument is an object of - * built-in mappings which never change. The second argument is an object - * of initial (global-level) mappings, which will constantly change - * according to any global/top-level `set`s done. - */ - constructor(builtins = {}, globalMacros = {}) { - this.current = globalMacros; - this.builtins = builtins; - this.undefStack = []; - } - - /** - * Start a new nested group, affecting future local `set`s. - */ - beginGroup() { - this.undefStack.push({}); - } - - /** - * End current nested group, restoring values before the group began. - */ - endGroup() { - if (this.undefStack.length === 0) { - throw new ParseError( - "Unbalanced namespace destruction: attempt " + - "to pop global namespace; please report this as a bug" - ); - } - const undefs = this.undefStack.pop(); - for (const undef in undefs) { - if (Object.prototype.hasOwnProperty.call(undefs, undef )) { - if (undefs[undef] === undefined) { - delete this.current[undef]; - } else { - this.current[undef] = undefs[undef]; - } - } - } - } - - /** - * Detect whether `name` has a definition. Equivalent to - * `get(name) != null`. - */ - has(name) { - return Object.prototype.hasOwnProperty.call(this.current, name ) || - Object.prototype.hasOwnProperty.call(this.builtins, name ); - } - - /** - * Get the current value of a name, or `undefined` if there is no value. - * - * Note: Do not use `if (namespace.get(...))` to detect whether a macro - * is defined, as the definition may be the empty string which evaluates - * to `false` in JavaScript. Use `if (namespace.get(...) != null)` or - * `if (namespace.has(...))`. - */ - get(name) { - if (Object.prototype.hasOwnProperty.call(this.current, name )) { - return this.current[name]; - } else { - return this.builtins[name]; - } - } - - /** - * Set the current value of a name, and optionally set it globally too. - * Local set() sets the current value and (when appropriate) adds an undo - * operation to the undo stack. Global set() may change the undo - * operation at every level, so takes time linear in their number. - */ - set(name, value, global = false) { - if (global) { - // Global set is equivalent to setting in all groups. Simulate this - // by destroying any undos currently scheduled for this name, - // and adding an undo with the *new* value (in case it later gets - // locally reset within this environment). - for (let i = 0; i < this.undefStack.length; i++) { - delete this.undefStack[i][name]; - } - if (this.undefStack.length > 0) { - this.undefStack[this.undefStack.length - 1][name] = value; - } - } else { - // Undo this set at end of this group (possibly to `undefined`), - // unless an undo is already in place, in which case that older - // value is the correct one. - const top = this.undefStack[this.undefStack.length - 1]; - if (top && !Object.prototype.hasOwnProperty.call(top, name )) { - top[name] = this.current[name]; - } - } - this.current[name] = value; - } - } - - /** - * Predefined macros for Temml. - * This can be used to define some commands in terms of others. - */ - const macros = _macros; - - ////////////////////////////////////////////////////////////////////// - // macro tools - - defineMacro("\\noexpand", function(context) { - // The expansion is the token itself; but that token is interpreted - // as if its meaning were ‘\relax’ if it is a control sequence that - // would ordinarily be expanded by TeX’s expansion rules. - const t = context.popToken(); - if (context.isExpandable(t.text)) { - t.noexpand = true; - t.treatAsRelax = true; - } - return { tokens: [t], numArgs: 0 }; - }); - - defineMacro("\\expandafter", function(context) { - // TeX first reads the token that comes immediately after \expandafter, - // without expanding it; let’s call this token t. Then TeX reads the - // token that comes after t (and possibly more tokens, if that token - // has an argument), replacing it by its expansion. Finally TeX puts - // t back in front of that expansion. - const t = context.popToken(); - context.expandOnce(true); // expand only an expandable token - return { tokens: [t], numArgs: 0 }; - }); - - // LaTeX's \@firstoftwo{#1}{#2} expands to #1, skipping #2 - // TeX source: \long\def\@firstoftwo#1#2{#1} - defineMacro("\\@firstoftwo", function(context) { - const args = context.consumeArgs(2); - return { tokens: args[0], numArgs: 0 }; - }); - - // LaTeX's \@secondoftwo{#1}{#2} expands to #2, skipping #1 - // TeX source: \long\def\@secondoftwo#1#2{#2} - defineMacro("\\@secondoftwo", function(context) { - const args = context.consumeArgs(2); - return { tokens: args[1], numArgs: 0 }; - }); - - // LaTeX's \@ifnextchar{#1}{#2}{#3} looks ahead to the next (unexpanded) - // symbol that isn't a space, consuming any spaces but not consuming the - // first nonspace character. If that nonspace character matches #1, then - // the macro expands to #2; otherwise, it expands to #3. - defineMacro("\\@ifnextchar", function(context) { - const args = context.consumeArgs(3); // symbol, if, else - context.consumeSpaces(); - const nextToken = context.future(); - if (args[0].length === 1 && args[0][0].text === nextToken.text) { - return { tokens: args[1], numArgs: 0 }; - } else { - return { tokens: args[2], numArgs: 0 }; - } - }); - - // LaTeX's \@ifstar{#1}{#2} looks ahead to the next (unexpanded) symbol. - // If it is `*`, then it consumes the symbol, and the macro expands to #1; - // otherwise, the macro expands to #2 (without consuming the symbol). - // TeX source: \def\@ifstar#1{\@ifnextchar *{\@firstoftwo{#1}}} - defineMacro("\\@ifstar", "\\@ifnextchar *{\\@firstoftwo{#1}}"); - - // LaTeX's \TextOrMath{#1}{#2} expands to #1 in text mode, #2 in math mode - defineMacro("\\TextOrMath", function(context) { - const args = context.consumeArgs(2); - if (context.mode === "text") { - return { tokens: args[0], numArgs: 0 }; - } else { - return { tokens: args[1], numArgs: 0 }; - } - }); - - const stringFromArg = arg => { - // Reverse the order of the arg and return a string. - let str = ""; - for (let i = arg.length - 1; i > -1; i--) { - str += arg[i].text; - } - return str - }; - - // Lookup table for parsing numbers in base 8 through 16 - const digitToNumber = { - 0: 0, - 1: 1, - 2: 2, - 3: 3, - 4: 4, - 5: 5, - 6: 6, - 7: 7, - 8: 8, - 9: 9, - a: 10, - A: 10, - b: 11, - B: 11, - c: 12, - C: 12, - d: 13, - D: 13, - e: 14, - E: 14, - f: 15, - F: 15 - }; - - const nextCharNumber = context => { - const numStr = context.future().text; - if (numStr === "EOF") { return [null, ""] } - return [digitToNumber[numStr.charAt(0)], numStr] - }; - - const appendCharNumbers = (number, numStr, base) => { - for (let i = 1; i < numStr.length; i++) { - const digit = digitToNumber[numStr.charAt(i)]; - number *= base; - number += digit; - } - return number - }; - - // TeX \char makes a literal character (catcode 12) using the following forms: - // (see The TeXBook, p. 43) - // \char123 -- decimal - // \char'123 -- octal - // \char"123 -- hex - // \char`x -- character that can be written (i.e. isn't active) - // \char`\x -- character that cannot be written (e.g. %) - // These all refer to characters from the font, so we turn them into special - // calls to a function \@char dealt with in the Parser. - defineMacro("\\char", function(context) { - let token = context.popToken(); - let base; - let number = ""; - if (token.text === "'") { - base = 8; - token = context.popToken(); - } else if (token.text === '"') { - base = 16; - token = context.popToken(); - } else if (token.text === "`") { - token = context.popToken(); - if (token.text[0] === "\\") { - number = token.text.charCodeAt(1); - } else if (token.text === "EOF") { - throw new ParseError("\\char` missing argument"); - } else { - number = token.text.charCodeAt(0); - } - } else { - base = 10; - } - if (base) { - // Parse a number in the given base, starting with first `token`. - let numStr = token.text; - number = digitToNumber[numStr.charAt(0)]; - if (number == null || number >= base) { - throw new ParseError(`Invalid base-${base} digit ${token.text}`); - } - number = appendCharNumbers(number, numStr, base); - let digit; - [digit, numStr] = nextCharNumber(context); - while (digit != null && digit < base) { - number *= base; - number += digit; - number = appendCharNumbers(number, numStr, base); - context.popToken(); - [digit, numStr] = nextCharNumber(context); - } - } - return `\\@char{${number}}`; - }); - - function recreateArgStr(context) { - // Recreate the macro's original argument string from the array of parse tokens. - const tokens = context.consumeArgs(1)[0]; - let str = ""; - let expectedLoc = tokens[tokens.length - 1].loc.start; - for (let i = tokens.length - 1; i >= 0; i--) { - const actualLoc = tokens[i].loc.start; - if (actualLoc > expectedLoc) { - // context.consumeArgs has eaten a space. - str += " "; - expectedLoc = actualLoc; - } - str += tokens[i].text; - expectedLoc += tokens[i].text.length; - } - return str - } - - // The Latin Modern font renders at the wrong vertical alignment. - // This macro provides a better rendering. - defineMacro("\\surd", '\\sqrt{\\vphantom{|}}'); - - // See comment for \oplus in symbols.js. - defineMacro("\u2295", "\\oplus"); - - // Since Temml has no \par, ignore \long. - defineMacro("\\long", ""); - - ////////////////////////////////////////////////////////////////////// - // Grouping - // \let\bgroup={ \let\egroup=} - defineMacro("\\bgroup", "{"); - defineMacro("\\egroup", "}"); - - // Symbols from latex.ltx: - // \def~{\nobreakspace{}} - // \def\lq{`} - // \def\rq{'} - // \def \aa {\r a} - defineMacro("~", "\\nobreakspace"); - defineMacro("\\lq", "`"); - defineMacro("\\rq", "'"); - defineMacro("\\aa", "\\r a"); - - defineMacro("\\Bbbk", "\\Bbb{k}"); - - // \mathstrut from the TeXbook, p 360 - defineMacro("\\mathstrut", "\\vphantom{(}"); - - // \underbar from TeXbook p 353 - defineMacro("\\underbar", "\\underline{\\text{#1}}"); - - ////////////////////////////////////////////////////////////////////// - // LaTeX_2ε - - // \vdots{\vbox{\baselineskip4\p@ \lineskiplimit\z@ - // \kern6\p@\hbox{.}\hbox{.}\hbox{.}}} - // We'll call \varvdots, which gets a glyph from symbols.js. - // The zero-width rule gets us an equivalent to the vertical 6pt kern. - defineMacro("\\vdots", "{\\varvdots\\rule{0pt}{15pt}}"); - defineMacro("\u22ee", "\\vdots"); - - ////////////////////////////////////////////////////////////////////// - // amsmath.sty - // http://mirrors.concertpass.com/tex-archive/macros/latex/required/amsmath/amsmath.pdf - - //\newcommand{\substack}[1]{\subarray{c}#1\endsubarray} - defineMacro("\\substack", "\\begin{subarray}{c}#1\\end{subarray}"); - - // \def\iff{\DOTSB\;\Longleftrightarrow\;} - // \def\implies{\DOTSB\;\Longrightarrow\;} - // \def\impliedby{\DOTSB\;\Longleftarrow\;} - defineMacro("\\iff", "\\DOTSB\\;\\Longleftrightarrow\\;"); - defineMacro("\\implies", "\\DOTSB\\;\\Longrightarrow\\;"); - defineMacro("\\impliedby", "\\DOTSB\\;\\Longleftarrow\\;"); - - // AMSMath's automatic \dots, based on \mdots@@ macro. - const dotsByToken = { - ",": "\\dotsc", - "\\not": "\\dotsb", - // \keybin@ checks for the following: - "+": "\\dotsb", - "=": "\\dotsb", - "<": "\\dotsb", - ">": "\\dotsb", - "-": "\\dotsb", - "*": "\\dotsb", - ":": "\\dotsb", - // Symbols whose definition starts with \DOTSB: - "\\DOTSB": "\\dotsb", - "\\coprod": "\\dotsb", - "\\bigvee": "\\dotsb", - "\\bigwedge": "\\dotsb", - "\\biguplus": "\\dotsb", - "\\bigcap": "\\dotsb", - "\\bigcup": "\\dotsb", - "\\prod": "\\dotsb", - "\\sum": "\\dotsb", - "\\bigotimes": "\\dotsb", - "\\bigoplus": "\\dotsb", - "\\bigodot": "\\dotsb", - "\\bigsqcap": "\\dotsb", - "\\bigsqcup": "\\dotsb", - "\\bigtimes": "\\dotsb", - "\\And": "\\dotsb", - "\\longrightarrow": "\\dotsb", - "\\Longrightarrow": "\\dotsb", - "\\longleftarrow": "\\dotsb", - "\\Longleftarrow": "\\dotsb", - "\\longleftrightarrow": "\\dotsb", - "\\Longleftrightarrow": "\\dotsb", - "\\mapsto": "\\dotsb", - "\\longmapsto": "\\dotsb", - "\\hookrightarrow": "\\dotsb", - "\\doteq": "\\dotsb", - // Symbols whose definition starts with \mathbin: - "\\mathbin": "\\dotsb", - // Symbols whose definition starts with \mathrel: - "\\mathrel": "\\dotsb", - "\\relbar": "\\dotsb", - "\\Relbar": "\\dotsb", - "\\xrightarrow": "\\dotsb", - "\\xleftarrow": "\\dotsb", - // Symbols whose definition starts with \DOTSI: - "\\DOTSI": "\\dotsi", - "\\int": "\\dotsi", - "\\oint": "\\dotsi", - "\\iint": "\\dotsi", - "\\iiint": "\\dotsi", - "\\iiiint": "\\dotsi", - "\\idotsint": "\\dotsi", - // Symbols whose definition starts with \DOTSX: - "\\DOTSX": "\\dotsx" - }; - - defineMacro("\\dots", function(context) { - // TODO: If used in text mode, should expand to \textellipsis. - // However, in Temml, \textellipsis and \ldots behave the same - // (in text mode), and it's unlikely we'd see any of the math commands - // that affect the behavior of \dots when in text mode. So fine for now - // (until we support \ifmmode ... \else ... \fi). - let thedots = "\\dotso"; - const next = context.expandAfterFuture().text; - if (next in dotsByToken) { - thedots = dotsByToken[next]; - } else if (next.slice(0, 4) === "\\not") { - thedots = "\\dotsb"; - } else if (next in symbols.math) { - if (["bin", "rel"].includes(symbols.math[next].group)) { - thedots = "\\dotsb"; - } - } - return thedots; - }); - - const spaceAfterDots = { - // \rightdelim@ checks for the following: - ")": true, - "]": true, - "\\rbrack": true, - "\\}": true, - "\\rbrace": true, - "\\rangle": true, - "\\rceil": true, - "\\rfloor": true, - "\\rgroup": true, - "\\rmoustache": true, - "\\right": true, - "\\bigr": true, - "\\biggr": true, - "\\Bigr": true, - "\\Biggr": true, - // \extra@ also tests for the following: - $: true, - // \extrap@ checks for the following: - ";": true, - ".": true, - ",": true - }; - - defineMacro("\\dotso", function(context) { - const next = context.future().text; - if (next in spaceAfterDots) { - return "\\ldots\\,"; - } else { - return "\\ldots"; - } - }); - - defineMacro("\\dotsc", function(context) { - const next = context.future().text; - // \dotsc uses \extra@ but not \extrap@, instead specially checking for - // ';' and '.', but doesn't check for ','. - if (next in spaceAfterDots && next !== ",") { - return "\\ldots\\,"; - } else { - return "\\ldots"; - } - }); - - defineMacro("\\cdots", function(context) { - const next = context.future().text; - if (next in spaceAfterDots) { - return "\\@cdots\\,"; - } else { - return "\\@cdots"; - } - }); - - defineMacro("\\dotsb", "\\cdots"); - defineMacro("\\dotsm", "\\cdots"); - defineMacro("\\dotsi", "\\!\\cdots"); - defineMacro("\\idotsint", "\\dotsi"); - // amsmath doesn't actually define \dotsx, but \dots followed by a macro - // starting with \DOTSX implies \dotso, and then \extra@ detects this case - // and forces the added `\,`. - defineMacro("\\dotsx", "\\ldots\\,"); - - // \let\DOTSI\relax - // \let\DOTSB\relax - // \let\DOTSX\relax - defineMacro("\\DOTSI", "\\relax"); - defineMacro("\\DOTSB", "\\relax"); - defineMacro("\\DOTSX", "\\relax"); - - // Spacing, based on amsmath.sty's override of LaTeX defaults - // \DeclareRobustCommand{\tmspace}[3]{% - // \ifmmode\mskip#1#2\else\kern#1#3\fi\relax} - defineMacro("\\tmspace", "\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax"); - // \renewcommand{\,}{\tmspace+\thinmuskip{.1667em}} - // TODO: math mode should use \thinmuskip - defineMacro("\\,", "{\\tmspace+{3mu}{.1667em}}"); - // \let\thinspace\, - defineMacro("\\thinspace", "\\,"); - // \def\>{\mskip\medmuskip} - // \renewcommand{\:}{\tmspace+\medmuskip{.2222em}} - // TODO: \> and math mode of \: should use \medmuskip = 4mu plus 2mu minus 4mu - defineMacro("\\>", "\\mskip{4mu}"); - defineMacro("\\:", "{\\tmspace+{4mu}{.2222em}}"); - // \let\medspace\: - defineMacro("\\medspace", "\\:"); - // \renewcommand{\;}{\tmspace+\thickmuskip{.2777em}} - // TODO: math mode should use \thickmuskip = 5mu plus 5mu - defineMacro("\\;", "{\\tmspace+{5mu}{.2777em}}"); - // \let\thickspace\; - defineMacro("\\thickspace", "\\;"); - // \renewcommand{\!}{\tmspace-\thinmuskip{.1667em}} - // TODO: math mode should use \thinmuskip - defineMacro("\\!", "{\\tmspace-{3mu}{.1667em}}"); - // \let\negthinspace\! - defineMacro("\\negthinspace", "\\!"); - // \newcommand{\negmedspace}{\tmspace-\medmuskip{.2222em}} - // TODO: math mode should use \medmuskip - defineMacro("\\negmedspace", "{\\tmspace-{4mu}{.2222em}}"); - // \newcommand{\negthickspace}{\tmspace-\thickmuskip{.2777em}} - // TODO: math mode should use \thickmuskip - defineMacro("\\negthickspace", "{\\tmspace-{5mu}{.277em}}"); - // \def\enspace{\kern.5em } - defineMacro("\\enspace", "\\kern.5em "); - // \def\enskip{\hskip.5em\relax} - defineMacro("\\enskip", "\\hskip.5em\\relax"); - // \def\quad{\hskip1em\relax} - defineMacro("\\quad", "\\hskip1em\\relax"); - // \def\qquad{\hskip2em\relax} - defineMacro("\\qquad", "\\hskip2em\\relax"); - - defineMacro("\\AA", "\\TextOrMath{\\Angstrom}{\\mathring{A}}\\relax"); - - // \tag@in@display form of \tag - defineMacro("\\tag", "\\@ifstar\\tag@literal\\tag@paren"); - defineMacro("\\tag@paren", "\\tag@literal{({#1})}"); - defineMacro("\\tag@literal", (context) => { - if (context.macros.get("\\df@tag")) { - throw new ParseError("Multiple \\tag"); - } - return "\\def\\df@tag{\\text{#1}}"; - }); - - // \renewcommand{\bmod}{\nonscript\mskip-\medmuskip\mkern5mu\mathbin - // {\operator@font mod}\penalty900 - // \mkern5mu\nonscript\mskip-\medmuskip} - // \newcommand{\pod}[1]{\allowbreak - // \if@display\mkern18mu\else\mkern8mu\fi(#1)} - // \renewcommand{\pmod}[1]{\pod{{\operator@font mod}\mkern6mu#1}} - // \newcommand{\mod}[1]{\allowbreak\if@display\mkern18mu - // \else\mkern12mu\fi{\operator@font mod}\,\,#1} - // TODO: math mode should use \medmuskip = 4mu plus 2mu minus 4mu - defineMacro("\\bmod", "\\mathbin{\\text{mod}}"); - defineMacro( - "\\pod", - "\\allowbreak" + "\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)" - ); - defineMacro("\\pmod", "\\pod{{\\rm mod}\\mkern6mu#1}"); - defineMacro( - "\\mod", - "\\allowbreak" + - "\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}" + - "{\\rm mod}\\,\\,#1" - ); - - ////////////////////////////////////////////////////////////////////// - // LaTeX source2e - - // \expandafter\let\expandafter\@normalcr - // \csname\expandafter\@gobble\string\\ \endcsname - // \DeclareRobustCommand\newline{\@normalcr\relax} - defineMacro("\\newline", "\\\\\\relax"); - - // \def\TeX{T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX\@} - // TODO: Doesn't normally work in math mode because \@ fails. - defineMacro("\\TeX", "\\textrm{T}\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125em\\textrm{X}"); - - defineMacro( - "\\LaTeX", - "\\textrm{L}\\kern-.35em\\raisebox{0.2em}{\\scriptstyle A}\\kern-.15em\\TeX" - ); - - defineMacro( - "\\Temml", - // eslint-disable-next-line max-len - "\\textrm{T}\\kern-0.2em\\lower{0.2em}{\\textrm{E}}\\kern-0.08em{\\textrm{M}\\kern-0.08em\\raise{0.2em}\\textrm{M}\\kern-0.08em\\textrm{L}}" - ); - - // \DeclareRobustCommand\hspace{\@ifstar\@hspacer\@hspace} - // \def\@hspace#1{\hskip #1\relax} - // \def\@hspacer#1{\vrule \@width\z@\nobreak - // \hskip #1\hskip \z@skip} - defineMacro("\\hspace", "\\@ifstar\\@hspacer\\@hspace"); - defineMacro("\\@hspace", "\\hskip #1\\relax"); - defineMacro("\\@hspacer", "\\rule{0pt}{0pt}\\hskip #1\\relax"); - - defineMacro("\\colon", `\\mathpunct{\\char"3a}`); - - ////////////////////////////////////////////////////////////////////// - // mathtools.sty - - defineMacro("\\prescript", "\\pres@cript{_{#1}^{#2}}{}{#3}"); - - //\providecommand\ordinarycolon{:} - defineMacro("\\ordinarycolon", `\\char"3a`); - // Raise to center on the math axis, as closely as possible. - defineMacro("\\vcentcolon", "\\mathrel{\\raisebox{0.035em}{\\ordinarycolon}}"); - // \providecommand*\coloneq{\vcentcolon\mathrel{\mkern-1.2mu}\mathrel{-}} - defineMacro("\\coloneq", '\\mathrel{\\raisebox{0.035em}{\\ordinarycolon}\\char"2212}'); - // \providecommand*\Coloneq{\dblcolon\mathrel{\mkern-1.2mu}\mathrel{-}} - defineMacro("\\Coloneq", '\\mathrel{\\char"2237\\char"2212}'); - // \providecommand*\Eqqcolon{=\mathrel{\mkern-1.2mu}\dblcolon} - defineMacro("\\Eqqcolon", '\\mathrel{\\char"3d\\char"2237}'); - // \providecommand*\Eqcolon{\mathrel{-}\mathrel{\mkern-1.2mu}\dblcolon} - defineMacro("\\Eqcolon", '\\mathrel{\\char"2212\\char"2237}'); - // \providecommand*\colonapprox{\vcentcolon\mathrel{\mkern-1.2mu}\approx} - defineMacro("\\colonapprox", '\\mathrel{\\raisebox{0.035em}{\\ordinarycolon}\\char"2248}'); - // \providecommand*\Colonapprox{\dblcolon\mathrel{\mkern-1.2mu}\approx} - defineMacro("\\Colonapprox", '\\mathrel{\\char"2237\\char"2248}'); - // \providecommand*\colonsim{\vcentcolon\mathrel{\mkern-1.2mu}\sim} - defineMacro("\\colonsim", '\\mathrel{\\raisebox{0.035em}{\\ordinarycolon}\\char"223c}'); - // \providecommand*\Colonsim{\dblcolon\mathrel{\mkern-1.2mu}\sim} - defineMacro("\\Colonsim", '\\mathrel{\\raisebox{0.035em}{\\ordinarycolon}\\char"223c}'); - - ////////////////////////////////////////////////////////////////////// - // colonequals.sty - - // Alternate names for mathtools's macros: - defineMacro("\\ratio", "\\vcentcolon"); - defineMacro("\\coloncolon", "\\dblcolon"); - defineMacro("\\colonequals", "\\coloneqq"); - defineMacro("\\coloncolonequals", "\\Coloneqq"); - defineMacro("\\equalscolon", "\\eqqcolon"); - defineMacro("\\equalscoloncolon", "\\Eqqcolon"); - defineMacro("\\colonminus", "\\coloneq"); - defineMacro("\\coloncolonminus", "\\Coloneq"); - defineMacro("\\minuscolon", "\\eqcolon"); - defineMacro("\\minuscoloncolon", "\\Eqcolon"); - // \colonapprox name is same in mathtools and colonequals. - defineMacro("\\coloncolonapprox", "\\Colonapprox"); - // \colonsim name is same in mathtools and colonequals. - defineMacro("\\coloncolonsim", "\\Colonsim"); - - // Present in newtxmath, pxfonts and txfonts - defineMacro("\\notni", "\\mathrel{\\char`\u220C}"); - defineMacro("\\limsup", "\\DOTSB\\operatorname*{lim\\,sup}"); - defineMacro("\\liminf", "\\DOTSB\\operatorname*{lim\\,inf}"); - - ////////////////////////////////////////////////////////////////////// - // From amsopn.sty - defineMacro("\\injlim", "\\DOTSB\\operatorname*{inj\\,lim}"); - defineMacro("\\projlim", "\\DOTSB\\operatorname*{proj\\,lim}"); - defineMacro("\\varlimsup", "\\DOTSB\\operatorname*{\\overline{\\text{lim}}}"); - defineMacro("\\varliminf", "\\DOTSB\\operatorname*{\\underline{\\text{lim}}}"); - defineMacro("\\varinjlim", "\\DOTSB\\operatorname*{\\underrightarrow{\\text{lim}}}"); - defineMacro("\\varprojlim", "\\DOTSB\\operatorname*{\\underleftarrow{\\text{lim}}}"); - - defineMacro("\\centerdot", "{\\medspace\\rule{0.167em}{0.189em}\\medspace}"); - - ////////////////////////////////////////////////////////////////////// - // statmath.sty - // https://ctan.math.illinois.edu/macros/latex/contrib/statmath/statmath.pdf - - defineMacro("\\argmin", "\\DOTSB\\operatorname*{arg\\,min}"); - defineMacro("\\argmax", "\\DOTSB\\operatorname*{arg\\,max}"); - defineMacro("\\plim", "\\DOTSB\\operatorname*{plim}"); - - ////////////////////////////////////////////////////////////////////// - // MnSymbol.sty - - defineMacro("\\leftmodels", "\\mathop{\\reflectbox{$\\models$}}"); - - ////////////////////////////////////////////////////////////////////// - // braket.sty - // http://ctan.math.washington.edu/tex-archive/macros/latex/contrib/braket/braket.pdf - - defineMacro("\\bra", "\\mathinner{\\langle{#1}|}"); - defineMacro("\\ket", "\\mathinner{|{#1}\\rangle}"); - defineMacro("\\braket", "\\mathinner{\\langle{#1}\\rangle}"); - defineMacro("\\Bra", "\\left\\langle#1\\right|"); - defineMacro("\\Ket", "\\left|#1\\right\\rangle"); - // A helper for \Braket and \Set - const replaceVert = (argStr, match) => { - const ch = match[0] === "|" ? "\\vert" : "\\Vert"; - const replaceStr = `}\\,\\middle${ch}\\,{`; - return argStr.slice(0, match.index) + replaceStr + argStr.slice(match.index + match[0].length) - }; - defineMacro("\\Braket", function(context) { - let argStr = recreateArgStr(context); - const regEx = /\|\||\||\\\|/g; - let match; - while ((match = regEx.exec(argStr)) !== null) { - argStr = replaceVert(argStr, match); - } - return "\\left\\langle{" + argStr + "}\\right\\rangle" - }); - defineMacro("\\Set", function(context) { - let argStr = recreateArgStr(context); - const match = /\|\||\||\\\|/.exec(argStr); - if (match) { - argStr = replaceVert(argStr, match); - } - return "\\left\\{\\:{" + argStr + "}\\:\\right\\}" - }); - defineMacro("\\set", function(context) { - const argStr = recreateArgStr(context); - return "\\{{" + argStr.replace(/\|/, "}\\mid{") + "}\\}" - }); - - ////////////////////////////////////////////////////////////////////// - // actuarialangle.dtx - defineMacro("\\angln", "{\\angl n}"); - - ////////////////////////////////////////////////////////////////////// - // derivative.sty - defineMacro("\\odv", "\\@ifstar\\odv@next\\odv@numerator"); - defineMacro("\\odv@numerator", "\\frac{\\mathrm{d}#1}{\\mathrm{d}#2}"); - defineMacro("\\odv@next", "\\frac{\\mathrm{d}}{\\mathrm{d}#2}#1"); - defineMacro("\\pdv", "\\@ifstar\\pdv@next\\pdv@numerator"); - - const pdvHelper = args => { - const numerator = args[0][0].text; - const denoms = stringFromArg(args[1]).split(","); - const power = String(denoms.length); - const numOp = power === "1" ? "\\partial" : `\\partial^${power}`; - let denominator = ""; - denoms.map(e => { denominator += "\\partial " + e.trim() + "\\,";}); - return [numerator, numOp, denominator.replace(/\\,$/, "")] - }; - defineMacro("\\pdv@numerator", function(context) { - const [numerator, numOp, denominator] = pdvHelper(context.consumeArgs(2)); - return `\\frac{${numOp} ${numerator}}{${denominator}}` - }); - defineMacro("\\pdv@next", function(context) { - const [numerator, numOp, denominator] = pdvHelper(context.consumeArgs(2)); - return `\\frac{${numOp}}{${denominator}} ${numerator}` - }); - - ////////////////////////////////////////////////////////////////////// - // upgreek.dtx - defineMacro("\\upalpha", "\\up@greek{\\alpha}"); - defineMacro("\\upbeta", "\\up@greek{\\beta}"); - defineMacro("\\upgamma", "\\up@greek{\\gamma}"); - defineMacro("\\updelta", "\\up@greek{\\delta}"); - defineMacro("\\upepsilon", "\\up@greek{\\epsilon}"); - defineMacro("\\upzeta", "\\up@greek{\\zeta}"); - defineMacro("\\upeta", "\\up@greek{\\eta}"); - defineMacro("\\uptheta", "\\up@greek{\\theta}"); - defineMacro("\\upiota", "\\up@greek{\\iota}"); - defineMacro("\\upkappa", "\\up@greek{\\kappa}"); - defineMacro("\\uplambda", "\\up@greek{\\lambda}"); - defineMacro("\\upmu", "\\up@greek{\\mu}"); - defineMacro("\\upnu", "\\up@greek{\\nu}"); - defineMacro("\\upxi", "\\up@greek{\\xi}"); - defineMacro("\\upomicron", "\\up@greek{\\omicron}"); - defineMacro("\\uppi", "\\up@greek{\\pi}"); - defineMacro("\\upalpha", "\\up@greek{\\alpha}"); - defineMacro("\\uprho", "\\up@greek{\\rho}"); - defineMacro("\\upsigma", "\\up@greek{\\sigma}"); - defineMacro("\\uptau", "\\up@greek{\\tau}"); - defineMacro("\\upupsilon", "\\up@greek{\\upsilon}"); - defineMacro("\\upphi", "\\up@greek{\\phi}"); - defineMacro("\\upchi", "\\up@greek{\\chi}"); - defineMacro("\\uppsi", "\\up@greek{\\psi}"); - defineMacro("\\upomega", "\\up@greek{\\omega}"); - - ////////////////////////////////////////////////////////////////////// - // cmll package - defineMacro("\\invamp", '\\mathbin{\\char"214b}'); - defineMacro("\\parr", '\\mathbin{\\char"214b}'); - defineMacro("\\with", '\\mathbin{\\char"26}'); - defineMacro("\\multimapinv", '\\mathrel{\\char"27dc}'); - defineMacro("\\multimapboth", '\\mathrel{\\char"29df}'); - defineMacro("\\scoh", '{\\mkern5mu\\char"2322\\mkern5mu}'); - defineMacro("\\sincoh", '{\\mkern5mu\\char"2323\\mkern5mu}'); - defineMacro("\\coh", `{\\mkern5mu\\rule{}{0.7em}\\mathrlap{\\smash{\\raise2mu{\\char"2322}}} -{\\smash{\\lower4mu{\\char"2323}}}\\mkern5mu}`); - defineMacro("\\incoh", `{\\mkern5mu\\rule{}{0.7em}\\mathrlap{\\smash{\\raise2mu{\\char"2323}}} -{\\smash{\\lower4mu{\\char"2322}}}\\mkern5mu}`); - - - ////////////////////////////////////////////////////////////////////// - // chemstyle package - defineMacro("\\standardstate", "\\text{\\tiny\\char`⦵}"); - - /** - * This file contains the “gullet” where macros are expanded - * until only non-macro tokens remain. - */ - - // List of commands that act like macros but aren't defined as a macro, - // function, or symbol. Used in `isDefined`. - const implicitCommands = { - "^": true, // Parser.js - _: true, // Parser.js - "\\limits": true, // Parser.js - "\\nolimits": true // Parser.js - }; - - class MacroExpander { - constructor(input, settings, mode) { - this.settings = settings; - this.expansionCount = 0; - this.feed(input); - // Make new global namespace - this.macros = new Namespace(macros, settings.macros); - this.mode = mode; - this.stack = []; // contains tokens in REVERSE order - } - - /** - * Feed a new input string to the same MacroExpander - * (with existing macros etc.). - */ - feed(input) { - this.lexer = new Lexer(input, this.settings); - } - - /** - * Switches between "text" and "math" modes. - */ - switchMode(newMode) { - this.mode = newMode; - } - - /** - * Start a new group nesting within all namespaces. - */ - beginGroup() { - this.macros.beginGroup(); - } - - /** - * End current group nesting within all namespaces. - */ - endGroup() { - this.macros.endGroup(); - } - - /** - * Returns the topmost token on the stack, without expanding it. - * Similar in behavior to TeX's `\futurelet`. - */ - future() { - if (this.stack.length === 0) { - this.pushToken(this.lexer.lex()); - } - return this.stack[this.stack.length - 1] - } - - /** - * Remove and return the next unexpanded token. - */ - popToken() { - this.future(); // ensure non-empty stack - return this.stack.pop(); - } - - /** - * Add a given token to the token stack. In particular, this get be used - * to put back a token returned from one of the other methods. - */ - pushToken(token) { - this.stack.push(token); - } - - /** - * Append an array of tokens to the token stack. - */ - pushTokens(tokens) { - this.stack.push(...tokens); - } - - /** - * Find an macro argument without expanding tokens and append the array of - * tokens to the token stack. Uses Token as a container for the result. - */ - scanArgument(isOptional) { - let start; - let end; - let tokens; - if (isOptional) { - this.consumeSpaces(); // \@ifnextchar gobbles any space following it - if (this.future().text !== "[") { - return null; - } - start = this.popToken(); // don't include [ in tokens - ({ tokens, end } = this.consumeArg(["]"])); - } else { - ({ tokens, start, end } = this.consumeArg()); - } - - // indicate the end of an argument - this.pushToken(new Token("EOF", end.loc)); - - this.pushTokens(tokens); - return start.range(end, ""); - } - - /** - * Consume all following space tokens, without expansion. - */ - consumeSpaces() { - for (;;) { - const token = this.future(); - if (token.text === " ") { - this.stack.pop(); - } else { - break; - } - } - } - - /** - * Consume an argument from the token stream, and return the resulting array - * of tokens and start/end token. - */ - consumeArg(delims) { - // The argument for a delimited parameter is the shortest (possibly - // empty) sequence of tokens with properly nested {...} groups that is - // followed ... by this particular list of non-parameter tokens. - // The argument for an undelimited parameter is the next nonblank - // token, unless that token is ‘{’, when the argument will be the - // entire {...} group that follows. - const tokens = []; - const isDelimited = delims && delims.length > 0; - if (!isDelimited) { - // Ignore spaces between arguments. As the TeXbook says: - // "After you have said ‘\def\row#1#2{...}’, you are allowed to - // put spaces between the arguments (e.g., ‘\row x n’), because - // TeX doesn’t use single spaces as undelimited arguments." - this.consumeSpaces(); - } - const start = this.future(); - let tok; - let depth = 0; - let match = 0; - do { - tok = this.popToken(); - tokens.push(tok); - if (tok.text === "{") { - ++depth; - } else if (tok.text === "}") { - --depth; - if (depth === -1) { - throw new ParseError("Extra }", tok); - } - } else if (tok.text === "EOF") { - throw new ParseError( - "Unexpected end of input in a macro argument" + - ", expected '" + - (delims && isDelimited ? delims[match] : "}") + - "'", - tok - ); - } - if (delims && isDelimited) { - if ((depth === 0 || (depth === 1 && delims[match] === "{")) && tok.text === delims[match]) { - ++match; - if (match === delims.length) { - // don't include delims in tokens - tokens.splice(-match, match); - break; - } - } else { - match = 0; - } - } - } while (depth !== 0 || isDelimited); - // If the argument found ... has the form ‘{}’, - // ... the outermost braces enclosing the argument are removed - if (start.text === "{" && tokens[tokens.length - 1].text === "}") { - tokens.pop(); - tokens.shift(); - } - tokens.reverse(); // to fit in with stack order - return { tokens, start, end: tok }; - } - - /** - * Consume the specified number of (delimited) arguments from the token - * stream and return the resulting array of arguments. - */ - consumeArgs(numArgs, delimiters) { - if (delimiters) { - if (delimiters.length !== numArgs + 1) { - throw new ParseError("The length of delimiters doesn't match the number of args!"); - } - const delims = delimiters[0]; - for (let i = 0; i < delims.length; i++) { - const tok = this.popToken(); - if (delims[i] !== tok.text) { - throw new ParseError("Use of the macro doesn't match its definition", tok); - } - } - } - - const args = []; - for (let i = 0; i < numArgs; i++) { - args.push(this.consumeArg(delimiters && delimiters[i + 1]).tokens); - } - return args; - } - - /** - * Expand the next token only once if possible. - * - * If the token is expanded, the resulting tokens will be pushed onto - * the stack in reverse order, and the number of such tokens will be - * returned. This number might be zero or positive. - * - * If not, the return value is `false`, and the next token remains at the - * top of the stack. - * - * In either case, the next token will be on the top of the stack, - * or the stack will be empty (in case of empty expansion - * and no other tokens). - * - * Used to implement `expandAfterFuture` and `expandNextToken`. - * - * If expandableOnly, only expandable tokens are expanded and - * an undefined control sequence results in an error. - */ - expandOnce(expandableOnly) { - const topToken = this.popToken(); - const name = topToken.text; - const expansion = !topToken.noexpand ? this._getExpansion(name) : null; - if (expansion == null || (expandableOnly && expansion.unexpandable)) { - if (expandableOnly && expansion == null && name[0] === "\\" && !this.isDefined(name)) { - throw new ParseError("Undefined control sequence: " + name); - } - this.pushToken(topToken); - return false; - } - this.expansionCount++; - if (this.expansionCount > this.settings.maxExpand) { - throw new ParseError( - "Too many expansions: infinite loop or " + "need to increase maxExpand setting" - ); - } - let tokens = expansion.tokens; - const args = this.consumeArgs(expansion.numArgs, expansion.delimiters); - if (expansion.numArgs) { - // paste arguments in place of the placeholders - tokens = tokens.slice(); // make a shallow copy - for (let i = tokens.length - 1; i >= 0; --i) { - let tok = tokens[i]; - if (tok.text === "#") { - if (i === 0) { - throw new ParseError("Incomplete placeholder at end of macro body", tok); - } - tok = tokens[--i]; // next token on stack - if (tok.text === "#") { - // ## → # - tokens.splice(i + 1, 1); // drop first # - } else if (/^[1-9]$/.test(tok.text)) { - // replace the placeholder with the indicated argument - tokens.splice(i, 2, ...args[+tok.text - 1]); - } else { - throw new ParseError("Not a valid argument number", tok); - } - } - } - } - // Concatenate expansion onto top of stack. - this.pushTokens(tokens); - return tokens.length; - } - - /** - * Expand the next token only once (if possible), and return the resulting - * top token on the stack (without removing anything from the stack). - * Similar in behavior to TeX's `\expandafter\futurelet`. - * Equivalent to expandOnce() followed by future(). - */ - expandAfterFuture() { - this.expandOnce(); - return this.future(); - } - - /** - * Recursively expand first token, then return first non-expandable token. - */ - expandNextToken() { - for (;;) { - if (this.expandOnce() === false) { // fully expanded - const token = this.stack.pop(); - // The token after \noexpand is interpreted as if its meaning were ‘\relax’ - if (token.treatAsRelax) { - token.text = "\\relax"; - } - return token - } - } - - // This pathway is impossible. - throw new Error(); // eslint-disable-line no-unreachable - } - - /** - * Fully expand the given macro name and return the resulting list of - * tokens, or return `undefined` if no such macro is defined. - */ - expandMacro(name) { - return this.macros.has(name) ? this.expandTokens([new Token(name)]) : undefined; - } - - /** - * Fully expand the given token stream and return the resulting list of - * tokens. Note that the input tokens are in reverse order, but the - * output tokens are in forward order. - */ - expandTokens(tokens) { - const output = []; - const oldStackLength = this.stack.length; - this.pushTokens(tokens); - while (this.stack.length > oldStackLength) { - // Expand only expandable tokens - if (this.expandOnce(true) === false) { // fully expanded - const token = this.stack.pop(); - if (token.treatAsRelax) { - // the expansion of \noexpand is the token itself - token.noexpand = false; - token.treatAsRelax = false; - } - output.push(token); - } - } - return output; - } - - /** - * Fully expand the given macro name and return the result as a string, - * or return `undefined` if no such macro is defined. - */ - expandMacroAsText(name) { - const tokens = this.expandMacro(name); - if (tokens) { - return tokens.map((token) => token.text).join(""); - } else { - return tokens; - } - } - - /** - * Returns the expanded macro as a reversed array of tokens and a macro - * argument count. Or returns `null` if no such macro. - */ - _getExpansion(name) { - const definition = this.macros.get(name); - if (definition == null) { - // mainly checking for undefined here - return definition; - } - // If a single character has an associated catcode other than 13 - // (active character), then don't expand it. - if (name.length === 1) { - const catcode = this.lexer.catcodes[name]; - if (catcode != null && catcode !== 13) { - return - } - } - const expansion = typeof definition === "function" ? definition(this) : definition; - if (typeof expansion === "string") { - let numArgs = 0; - if (expansion.indexOf("#") !== -1) { - const stripped = expansion.replace(/##/g, ""); - while (stripped.indexOf("#" + (numArgs + 1)) !== -1) { - ++numArgs; - } - } - const bodyLexer = new Lexer(expansion, this.settings); - const tokens = []; - let tok = bodyLexer.lex(); - while (tok.text !== "EOF") { - tokens.push(tok); - tok = bodyLexer.lex(); - } - tokens.reverse(); // to fit in with stack using push and pop - const expanded = { tokens, numArgs }; - return expanded; - } - - return expansion; - } - - /** - * Determine whether a command is currently "defined" (has some - * functionality), meaning that it's a macro (in the current group), - * a function, a symbol, or one of the special commands listed in - * `implicitCommands`. - */ - isDefined(name) { - return ( - this.macros.has(name) || - Object.prototype.hasOwnProperty.call(functions, name ) || - Object.prototype.hasOwnProperty.call(symbols.math, name ) || - Object.prototype.hasOwnProperty.call(symbols.text, name ) || - Object.prototype.hasOwnProperty.call(implicitCommands, name ) - ); - } - - /** - * Determine whether a command is expandable. - */ - isExpandable(name) { - const macro = this.macros.get(name); - return macro != null - ? typeof macro === "string" || typeof macro === "function" || !macro.unexpandable - : Object.prototype.hasOwnProperty.call(functions, name ) && !functions[name].primitive; - } - } - - // Helpers for Parser.js handling of Unicode (sub|super)script characters. - - const unicodeSubRegEx = /^[₊₋₌₍₎₀₁₂₃₄₅₆₇₈₉ₐₑₕᵢⱼₖₗₘₙₒₚᵣₛₜᵤᵥₓᵦᵧᵨᵩᵪ]/; - - const uSubsAndSups = Object.freeze({ - '₊': '+', - '₋': '-', - '₌': '=', - '₍': '(', - '₎': ')', - '₀': '0', - '₁': '1', - '₂': '2', - '₃': '3', - '₄': '4', - '₅': '5', - '₆': '6', - '₇': '7', - '₈': '8', - '₉': '9', - '\u2090': 'a', - '\u2091': 'e', - '\u2095': 'h', - '\u1D62': 'i', - '\u2C7C': 'j', - '\u2096': 'k', - '\u2097': 'l', - '\u2098': 'm', - '\u2099': 'n', - '\u2092': 'o', - '\u209A': 'p', - '\u1D63': 'r', - '\u209B': 's', - '\u209C': 't', - '\u1D64': 'u', - '\u1D65': 'v', - '\u2093': 'x', - '\u1D66': 'β', - '\u1D67': 'γ', - '\u1D68': 'ρ', - '\u1D69': '\u03d5', - '\u1D6A': 'χ', - '⁺': '+', - '⁻': '-', - '⁼': '=', - '⁽': '(', - '⁾': ')', - '⁰': '0', - '¹': '1', - '²': '2', - '³': '3', - '⁴': '4', - '⁵': '5', - '⁶': '6', - '⁷': '7', - '⁸': '8', - '⁹': '9', - '\u1D2C': 'A', - '\u1D2E': 'B', - '\u1D30': 'D', - '\u1D31': 'E', - '\u1D33': 'G', - '\u1D34': 'H', - '\u1D35': 'I', - '\u1D36': 'J', - '\u1D37': 'K', - '\u1D38': 'L', - '\u1D39': 'M', - '\u1D3A': 'N', - '\u1D3C': 'O', - '\u1D3E': 'P', - '\u1D3F': 'R', - '\u1D40': 'T', - '\u1D41': 'U', - '\u2C7D': 'V', - '\u1D42': 'W', - '\u1D43': 'a', - '\u1D47': 'b', - '\u1D9C': 'c', - '\u1D48': 'd', - '\u1D49': 'e', - '\u1DA0': 'f', - '\u1D4D': 'g', - '\u02B0': 'h', - '\u2071': 'i', - '\u02B2': 'j', - '\u1D4F': 'k', - '\u02E1': 'l', - '\u1D50': 'm', - '\u207F': 'n', - '\u1D52': 'o', - '\u1D56': 'p', - '\u02B3': 'r', - '\u02E2': 's', - '\u1D57': 't', - '\u1D58': 'u', - '\u1D5B': 'v', - '\u02B7': 'w', - '\u02E3': 'x', - '\u02B8': 'y', - '\u1DBB': 'z', - '\u1D5D': 'β', - '\u1D5E': 'γ', - '\u1D5F': 'δ', - '\u1D60': '\u03d5', - '\u1D61': 'χ', - '\u1DBF': 'θ' - }); - - // Used for Unicode input of calligraphic and script letters - const asciiFromScript = Object.freeze({ - "\ud835\udc9c": "A", - "\u212c": "B", - "\ud835\udc9e": "C", - "\ud835\udc9f": "D", - "\u2130": "E", - "\u2131": "F", - "\ud835\udca2": "G", - "\u210B": "H", - "\u2110": "I", - "\ud835\udca5": "J", - "\ud835\udca6": "K", - "\u2112": "L", - "\u2133": "M", - "\ud835\udca9": "N", - "\ud835\udcaa": "O", - "\ud835\udcab": "P", - "\ud835\udcac": "Q", - "\u211B": "R", - "\ud835\udcae": "S", - "\ud835\udcaf": "T", - "\ud835\udcb0": "U", - "\ud835\udcb1": "V", - "\ud835\udcb2": "W", - "\ud835\udcb3": "X", - "\ud835\udcb4": "Y", - "\ud835\udcb5": "Z" - }); - - // Mapping of Unicode accent characters to their LaTeX equivalent in text and - // math mode (when they exist). - var unicodeAccents = { - "\u0301": { text: "\\'", math: "\\acute" }, - "\u0300": { text: "\\`", math: "\\grave" }, - "\u0308": { text: '\\"', math: "\\ddot" }, - "\u0303": { text: "\\~", math: "\\tilde" }, - "\u0304": { text: "\\=", math: "\\bar" }, - "\u0306": { text: "\\u", math: "\\breve" }, - "\u030c": { text: "\\v", math: "\\check" }, - "\u0302": { text: "\\^", math: "\\hat" }, - "\u0307": { text: "\\.", math: "\\dot" }, - "\u030a": { text: "\\r", math: "\\mathring" }, - "\u030b": { text: "\\H" }, - '\u0327': { text: '\\c' } - }; - - var unicodeSymbols = { - "á": "á", - "à": "à", - "ä": "ä", - "ǟ": "ǟ", - "ã": "ã", - "ā": "ā", - "ă": "ă", - "ắ": "ắ", - "ằ": "ằ", - "ẵ": "ẵ", - "ǎ": "ǎ", - "â": "â", - "ấ": "ấ", - "ầ": "ầ", - "ẫ": "ẫ", - "ȧ": "ȧ", - "ǡ": "ǡ", - "å": "å", - "ǻ": "ǻ", - "ḃ": "ḃ", - "ć": "ć", - "č": "č", - "ĉ": "ĉ", - "ċ": "ċ", - "ď": "ď", - "ḋ": "ḋ", - "é": "é", - "è": "è", - "ë": "ë", - "ẽ": "ẽ", - "ē": "ē", - "ḗ": "ḗ", - "ḕ": "ḕ", - "ĕ": "ĕ", - "ě": "ě", - "ê": "ê", - "ế": "ế", - "ề": "ề", - "ễ": "ễ", - "ė": "ė", - "ḟ": "ḟ", - "ǵ": "ǵ", - "ḡ": "ḡ", - "ğ": "ğ", - "ǧ": "ǧ", - "ĝ": "ĝ", - "ġ": "ġ", - "ḧ": "ḧ", - "ȟ": "ȟ", - "ĥ": "ĥ", - "ḣ": "ḣ", - "í": "í", - "ì": "ì", - "ï": "ï", - "ḯ": "ḯ", - "ĩ": "ĩ", - "ī": "ī", - "ĭ": "ĭ", - "ǐ": "ǐ", - "î": "î", - "ǰ": "ǰ", - "ĵ": "ĵ", - "ḱ": "ḱ", - "ǩ": "ǩ", - "ĺ": "ĺ", - "ľ": "ľ", - "ḿ": "ḿ", - "ṁ": "ṁ", - "ń": "ń", - "ǹ": "ǹ", - "ñ": "ñ", - "ň": "ň", - "ṅ": "ṅ", - "ó": "ó", - "ò": "ò", - "ö": "ö", - "ȫ": "ȫ", - "õ": "õ", - "ṍ": "ṍ", - "ṏ": "ṏ", - "ȭ": "ȭ", - "ō": "ō", - "ṓ": "ṓ", - "ṑ": "ṑ", - "ŏ": "ŏ", - "ǒ": "ǒ", - "ô": "ô", - "ố": "ố", - "ồ": "ồ", - "ỗ": "ỗ", - "ȯ": "ȯ", - "ȱ": "ȱ", - "ő": "ő", - "ṕ": "ṕ", - "ṗ": "ṗ", - "ŕ": "ŕ", - "ř": "ř", - "ṙ": "ṙ", - "ś": "ś", - "ṥ": "ṥ", - "š": "š", - "ṧ": "ṧ", - "ŝ": "ŝ", - "ṡ": "ṡ", - "ẗ": "ẗ", - "ť": "ť", - "ṫ": "ṫ", - "ú": "ú", - "ù": "ù", - "ü": "ü", - "ǘ": "ǘ", - "ǜ": "ǜ", - "ǖ": "ǖ", - "ǚ": "ǚ", - "ũ": "ũ", - "ṹ": "ṹ", - "ū": "ū", - "ṻ": "ṻ", - "ŭ": "ŭ", - "ǔ": "ǔ", - "û": "û", - "ů": "ů", - "ű": "ű", - "ṽ": "ṽ", - "ẃ": "ẃ", - "ẁ": "ẁ", - "ẅ": "ẅ", - "ŵ": "ŵ", - "ẇ": "ẇ", - "ẘ": "ẘ", - "ẍ": "ẍ", - "ẋ": "ẋ", - "ý": "ý", - "ỳ": "ỳ", - "ÿ": "ÿ", - "ỹ": "ỹ", - "ȳ": "ȳ", - "ŷ": "ŷ", - "ẏ": "ẏ", - "ẙ": "ẙ", - "ź": "ź", - "ž": "ž", - "ẑ": "ẑ", - "ż": "ż", - "Á": "Á", - "À": "À", - "Ä": "Ä", - "Ǟ": "Ǟ", - "Ã": "Ã", - "Ā": "Ā", - "Ă": "Ă", - "Ắ": "Ắ", - "Ằ": "Ằ", - "Ẵ": "Ẵ", - "Ǎ": "Ǎ", - "Â": "Â", - "Ấ": "Ấ", - "Ầ": "Ầ", - "Ẫ": "Ẫ", - "Ȧ": "Ȧ", - "Ǡ": "Ǡ", - "Å": "Å", - "Ǻ": "Ǻ", - "Ḃ": "Ḃ", - "Ć": "Ć", - "Č": "Č", - "Ĉ": "Ĉ", - "Ċ": "Ċ", - "Ď": "Ď", - "Ḋ": "Ḋ", - "É": "É", - "È": "È", - "Ë": "Ë", - "Ẽ": "Ẽ", - "Ē": "Ē", - "Ḗ": "Ḗ", - "Ḕ": "Ḕ", - "Ĕ": "Ĕ", - "Ě": "Ě", - "Ê": "Ê", - "Ế": "Ế", - "Ề": "Ề", - "Ễ": "Ễ", - "Ė": "Ė", - "Ḟ": "Ḟ", - "Ǵ": "Ǵ", - "Ḡ": "Ḡ", - "Ğ": "Ğ", - "Ǧ": "Ǧ", - "Ĝ": "Ĝ", - "Ġ": "Ġ", - "Ḧ": "Ḧ", - "Ȟ": "Ȟ", - "Ĥ": "Ĥ", - "Ḣ": "Ḣ", - "Í": "Í", - "Ì": "Ì", - "Ï": "Ï", - "Ḯ": "Ḯ", - "Ĩ": "Ĩ", - "Ī": "Ī", - "Ĭ": "Ĭ", - "Ǐ": "Ǐ", - "Î": "Î", - "İ": "İ", - "Ĵ": "Ĵ", - "Ḱ": "Ḱ", - "Ǩ": "Ǩ", - "Ĺ": "Ĺ", - "Ľ": "Ľ", - "Ḿ": "Ḿ", - "Ṁ": "Ṁ", - "Ń": "Ń", - "Ǹ": "Ǹ", - "Ñ": "Ñ", - "Ň": "Ň", - "Ṅ": "Ṅ", - "Ó": "Ó", - "Ò": "Ò", - "Ö": "Ö", - "Ȫ": "Ȫ", - "Õ": "Õ", - "Ṍ": "Ṍ", - "Ṏ": "Ṏ", - "Ȭ": "Ȭ", - "Ō": "Ō", - "Ṓ": "Ṓ", - "Ṑ": "Ṑ", - "Ŏ": "Ŏ", - "Ǒ": "Ǒ", - "Ô": "Ô", - "Ố": "Ố", - "Ồ": "Ồ", - "Ỗ": "Ỗ", - "Ȯ": "Ȯ", - "Ȱ": "Ȱ", - "Ő": "Ő", - "Ṕ": "Ṕ", - "Ṗ": "Ṗ", - "Ŕ": "Ŕ", - "Ř": "Ř", - "Ṙ": "Ṙ", - "Ś": "Ś", - "Ṥ": "Ṥ", - "Š": "Š", - "Ṧ": "Ṧ", - "Ŝ": "Ŝ", - "Ṡ": "Ṡ", - "Ť": "Ť", - "Ṫ": "Ṫ", - "Ú": "Ú", - "Ù": "Ù", - "Ü": "Ü", - "Ǘ": "Ǘ", - "Ǜ": "Ǜ", - "Ǖ": "Ǖ", - "Ǚ": "Ǚ", - "Ũ": "Ũ", - "Ṹ": "Ṹ", - "Ū": "Ū", - "Ṻ": "Ṻ", - "Ŭ": "Ŭ", - "Ǔ": "Ǔ", - "Û": "Û", - "Ů": "Ů", - "Ű": "Ű", - "Ṽ": "Ṽ", - "Ẃ": "Ẃ", - "Ẁ": "Ẁ", - "Ẅ": "Ẅ", - "Ŵ": "Ŵ", - "Ẇ": "Ẇ", - "Ẍ": "Ẍ", - "Ẋ": "Ẋ", - "Ý": "Ý", - "Ỳ": "Ỳ", - "Ÿ": "Ÿ", - "Ỹ": "Ỹ", - "Ȳ": "Ȳ", - "Ŷ": "Ŷ", - "Ẏ": "Ẏ", - "Ź": "Ź", - "Ž": "Ž", - "Ẑ": "Ẑ", - "Ż": "Ż", - "ά": "ά", - "ὰ": "ὰ", - "ᾱ": "ᾱ", - "ᾰ": "ᾰ", - "έ": "έ", - "ὲ": "ὲ", - "ή": "ή", - "ὴ": "ὴ", - "ί": "ί", - "ὶ": "ὶ", - "ϊ": "ϊ", - "ΐ": "ΐ", - "ῒ": "ῒ", - "ῑ": "ῑ", - "ῐ": "ῐ", - "ό": "ό", - "ὸ": "ὸ", - "ύ": "ύ", - "ὺ": "ὺ", - "ϋ": "ϋ", - "ΰ": "ΰ", - "ῢ": "ῢ", - "ῡ": "ῡ", - "ῠ": "ῠ", - "ώ": "ώ", - "ὼ": "ὼ", - "Ύ": "Ύ", - "Ὺ": "Ὺ", - "Ϋ": "Ϋ", - "Ῡ": "Ῡ", - "Ῠ": "Ῠ", - "Ώ": "Ώ", - "Ὼ": "Ὼ" - }; - - /* eslint no-constant-condition:0 */ - - const binLeftCancellers = ["bin", "op", "open", "punct", "rel"]; - - /** - * This file contains the parser used to parse out a TeX expression from the - * input. Since TeX isn't context-free, standard parsers don't work particularly - * well. - * - * The strategy of this parser is as such: - * - * The main functions (the `.parse...` ones) take a position in the current - * parse string to parse tokens from. The lexer (found in Lexer.js, stored at - * this.gullet.lexer) also supports pulling out tokens at arbitrary places. When - * individual tokens are needed at a position, the lexer is called to pull out a - * token, which is then used. - * - * The parser has a property called "mode" indicating the mode that - * the parser is currently in. Currently it has to be one of "math" or - * "text", which denotes whether the current environment is a math-y - * one or a text-y one (e.g. inside \text). Currently, this serves to - * limit the functions which can be used in text mode. - * - * The main functions then return an object which contains the useful data that - * was parsed at its given point, and a new position at the end of the parsed - * data. The main functions can call each other and continue the parsing by - * using the returned position as a new starting point. - * - * There are also extra `.handle...` functions, which pull out some reused - * functionality into self-contained functions. - * - * The functions return ParseNodes. - */ - - class Parser { - constructor(input, settings, isPreamble = false) { - // Start in math mode - this.mode = "math"; - // Create a new macro expander (gullet) and (indirectly via that) also a - // new lexer (mouth) for this parser (stomach, in the language of TeX) - this.gullet = new MacroExpander(input, settings, this.mode); - // Store the settings for use in parsing - this.settings = settings; - // Are we defining a preamble? - this.isPreamble = isPreamble; - // Count leftright depth (for \middle errors) - this.leftrightDepth = 0; - this.prevAtomType = ""; - } - - /** - * Checks a result to make sure it has the right type, and throws an - * appropriate error otherwise. - */ - expect(text, consume = true) { - if (this.fetch().text !== text) { - throw new ParseError(`Expected '${text}', got '${this.fetch().text}'`, this.fetch()); - } - if (consume) { - this.consume(); - } - } - - /** - * Discards the current lookahead token, considering it consumed. - */ - consume() { - this.nextToken = null; - } - - /** - * Return the current lookahead token, or if there isn't one (at the - * beginning, or if the previous lookahead token was consume()d), - * fetch the next token as the new lookahead token and return it. - */ - fetch() { - if (this.nextToken == null) { - this.nextToken = this.gullet.expandNextToken(); - } - return this.nextToken; - } - - /** - * Switches between "text" and "math" modes. - */ - switchMode(newMode) { - this.mode = newMode; - this.gullet.switchMode(newMode); - } - - /** - * Main parsing function, which parses an entire input. - */ - parse() { - // Create a group namespace for every $...$, $$...$$, \[...\].) - // A \def is then valid only within that pair of delimiters. - this.gullet.beginGroup(); - - if (this.settings.colorIsTextColor) { - // Use old \color behavior (same as LaTeX's \textcolor) if requested. - // We do this within the group for the math expression, so it doesn't - // pollute settings.macros. - this.gullet.macros.set("\\color", "\\textcolor"); - } - - // Try to parse the input - const parse = this.parseExpression(false); - - // If we succeeded, make sure there's an EOF at the end - this.expect("EOF"); - - if (this.isPreamble) { - const macros = Object.create(null); - Object.entries(this.gullet.macros.current).forEach(([key, value]) => { - macros[key] = value; - }); - this.gullet.endGroup(); - return macros - } - - // The only local macro that we want to save is from \tag. - const tag = this.gullet.macros.get("\\df@tag"); - - // End the group namespace for the expression - this.gullet.endGroup(); - - if (tag) { this.gullet.macros.current["\\df@tag"] = tag; } - - return parse; - } - - static get endOfExpression() { - return ["}", "\\endgroup", "\\end", "\\right", "\\endtoggle", "&"]; - } - - /** - * Fully parse a separate sequence of tokens as a separate job. - * Tokens should be specified in reverse order, as in a MacroDefinition. - */ - subparse(tokens) { - // Save the next token from the current job. - const oldToken = this.nextToken; - this.consume(); - - // Run the new job, terminating it with an excess '}' - this.gullet.pushToken(new Token("}")); - this.gullet.pushTokens(tokens); - const parse = this.parseExpression(false); - this.expect("}"); - - // Restore the next token from the current job. - this.nextToken = oldToken; - - return parse; - } - - /** - * Parses an "expression", which is a list of atoms. - * - * `breakOnInfix`: Should the parsing stop when we hit infix nodes? This - * happens when functions have higher precedence han infix - * nodes in implicit parses. - * - * `breakOnTokenText`: The text of the token that the expression should end - * with, or `null` if something else should end the - * expression. - * - * `breakOnMiddle`: \color, \over, and old styling functions work on an implicit group. - * These groups end just before the usual tokens, but they also - * end just before `\middle`. - */ - parseExpression(breakOnInfix, breakOnTokenText, breakOnMiddle) { - const body = []; - // Keep adding atoms to the body until we can't parse any more atoms (either - // we reached the end, a }, or a \right) - while (true) { - // Ignore spaces in math mode - if (this.mode === "math") { - this.consumeSpaces(); - } - const lex = this.fetch(); - if (Parser.endOfExpression.indexOf(lex.text) !== -1) { - break; - } - if (breakOnTokenText && lex.text === breakOnTokenText) { - break; - } - if (breakOnMiddle && lex.text === "\\middle") { - break - } - if (breakOnInfix && functions[lex.text] && functions[lex.text].infix) { - break; - } - const atom = this.parseAtom(breakOnTokenText); - if (!atom) { - break; - } else if (atom.type === "internal") { - continue; - } - body.push(atom); - // Keep a record of the atom type, so that op.js can set correct spacing. - this.prevAtomType = atom.type === "atom" ? atom.family : atom.type; - } - if (this.mode === "text") { - this.formLigatures(body); - } - return this.handleInfixNodes(body); - } - - /** - * Rewrites infix operators such as \over with corresponding commands such - * as \frac. - * - * There can only be one infix operator per group. If there's more than one - * then the expression is ambiguous. This can be resolved by adding {}. - */ - handleInfixNodes(body) { - let overIndex = -1; - let funcName; - - for (let i = 0; i < body.length; i++) { - if (body[i].type === "infix") { - if (overIndex !== -1) { - throw new ParseError("only one infix operator per group", body[i].token); - } - overIndex = i; - funcName = body[i].replaceWith; - } - } - - if (overIndex !== -1 && funcName) { - let numerNode; - let denomNode; - - const numerBody = body.slice(0, overIndex); - const denomBody = body.slice(overIndex + 1); - - if (numerBody.length === 1 && numerBody[0].type === "ordgroup") { - numerNode = numerBody[0]; - } else { - numerNode = { type: "ordgroup", mode: this.mode, body: numerBody }; - } - - if (denomBody.length === 1 && denomBody[0].type === "ordgroup") { - denomNode = denomBody[0]; - } else { - denomNode = { type: "ordgroup", mode: this.mode, body: denomBody }; - } - - let node; - if (funcName === "\\\\abovefrac") { - node = this.callFunction(funcName, [numerNode, body[overIndex], denomNode], []); - } else { - node = this.callFunction(funcName, [numerNode, denomNode], []); - } - return [node]; - } else { - return body; - } - } - - /** - * Handle a subscript or superscript with nice errors. - */ - handleSupSubscript( - name // For error reporting. - ) { - const symbolToken = this.fetch(); - const symbol = symbolToken.text; - this.consume(); - this.consumeSpaces(); // ignore spaces before sup/subscript argument - const group = this.parseGroup(name); - - if (!group) { - throw new ParseError("Expected group after '" + symbol + "'", symbolToken); - } - - return group; - } - - /** - * Converts the textual input of an unsupported command into a text node - * contained within a color node whose color is determined by errorColor - */ - formatUnsupportedCmd(text) { - const textordArray = []; - - for (let i = 0; i < text.length; i++) { - textordArray.push({ type: "textord", mode: "text", text: text[i] }); - } - - const textNode = { - type: "text", - mode: this.mode, - body: textordArray - }; - - const colorNode = { - type: "color", - mode: this.mode, - color: this.settings.errorColor, - body: [textNode] - }; - - return colorNode; - } - - /** - * Parses a group with optional super/subscripts. - */ - parseAtom(breakOnTokenText) { - // The body of an atom is an implicit group, so that things like - // \left(x\right)^2 work correctly. - const base = this.parseGroup("atom", breakOnTokenText); - - // In text mode, we don't have superscripts or subscripts - if (this.mode === "text") { - return base; - } - - // Note that base may be empty (i.e. null) at this point. - - let superscript; - let subscript; - while (true) { - // Guaranteed in math mode, so eat any spaces first. - this.consumeSpaces(); - - // Lex the first token - const lex = this.fetch(); - - if (lex.text === "\\limits" || lex.text === "\\nolimits") { - // We got a limit control - if (base && base.type === "op") { - const limits = lex.text === "\\limits"; - base.limits = limits; - base.alwaysHandleSupSub = true; - } else if (base && base.type === "operatorname") { - if (base.alwaysHandleSupSub) { - base.limits = lex.text === "\\limits"; - } - } else { - throw new ParseError("Limit controls must follow a math operator", lex); - } - this.consume(); - } else if (lex.text === "^") { - // We got a superscript start - if (superscript) { - throw new ParseError("Double superscript", lex); - } - superscript = this.handleSupSubscript("superscript"); - } else if (lex.text === "_") { - // We got a subscript start - if (subscript) { - throw new ParseError("Double subscript", lex); - } - subscript = this.handleSupSubscript("subscript"); - } else if (lex.text === "'") { - // We got a prime - if (superscript) { - throw new ParseError("Double superscript", lex); - } - const prime = { type: "textord", mode: this.mode, text: "\\prime" }; - - // Many primes can be grouped together, so we handle this here - const primes = [prime]; - this.consume(); - // Keep lexing tokens until we get something that's not a prime - while (this.fetch().text === "'") { - // For each one, add another prime to the list - primes.push(prime); - this.consume(); - } - // If there's a superscript following the primes, combine that - // superscript in with the primes. - if (this.fetch().text === "^") { - primes.push(this.handleSupSubscript("superscript")); - } - // Put everything into an ordgroup as the superscript - superscript = { type: "ordgroup", mode: this.mode, body: primes }; - } else if (uSubsAndSups[lex.text]) { - // A Unicode subscript or superscript character. - // We treat these similarly to the unicode-math package. - // So we render a string of Unicode (sub|super)scripts the - // same as a (sub|super)script of regular characters. - const isSub = unicodeSubRegEx.test(lex.text); - const subsupTokens = []; - subsupTokens.push(new Token(uSubsAndSups[lex.text])); - this.consume(); - // Continue fetching tokens to fill out the group. - while (true) { - const token = this.fetch().text; - if (!(uSubsAndSups[token])) { break } - if (unicodeSubRegEx.test(token) !== isSub) { break } - subsupTokens.unshift(new Token(uSubsAndSups[token])); - this.consume(); - } - // Now create a (sub|super)script. - const body = this.subparse(subsupTokens); - if (isSub) { - subscript = { type: "ordgroup", mode: "math", body }; - } else { - superscript = { type: "ordgroup", mode: "math", body }; - } - } else { - // If it wasn't ^, _, a Unicode (sub|super)script, or ', stop parsing super/subscripts - break; - } - } - - if (superscript || subscript) { - if (base && base.type === "multiscript" && !base.postscripts) { - // base is the result of a \prescript function. - // Write the sub- & superscripts into the multiscript element. - base.postscripts = { sup: superscript, sub: subscript }; - return base - } else { - // We got either a superscript or subscript, create a supsub - const isFollowedByDelimiter = (!base || base.type !== "op" && base.type !== "operatorname") - ? undefined - : isDelimiter(this.nextToken.text); - return { - type: "supsub", - mode: this.mode, - base: base, - sup: superscript, - sub: subscript, - isFollowedByDelimiter - } - } - } else { - // Otherwise return the original body - return base; - } - } - - /** - * Parses an entire function, including its base and all of its arguments. - */ - parseFunction( - breakOnTokenText, - name // For determining its context - ) { - const token = this.fetch(); - const func = token.text; - const funcData = functions[func]; - if (!funcData) { - return null; - } - this.consume(); // consume command token - - if (name && name !== "atom" && !funcData.allowedInArgument) { - throw new ParseError( - "Got function '" + func + "' with no arguments" + (name ? " as " + name : ""), - token - ); - } else if (this.mode === "text" && !funcData.allowedInText) { - throw new ParseError("Can't use function '" + func + "' in text mode", token); - } else if (this.mode === "math" && funcData.allowedInMath === false) { - throw new ParseError("Can't use function '" + func + "' in math mode", token); - } - - const prevAtomType = this.prevAtomType; - const { args, optArgs } = this.parseArguments(func, funcData); - this.prevAtomType = prevAtomType; - return this.callFunction(func, args, optArgs, token, breakOnTokenText); - } - - /** - * Call a function handler with a suitable context and arguments. - */ - callFunction(name, args, optArgs, token, breakOnTokenText) { - const context = { - funcName: name, - parser: this, - token, - breakOnTokenText - }; - const func = functions[name]; - if (func && func.handler) { - return func.handler(context, args, optArgs); - } else { - throw new ParseError(`No function handler for ${name}`); - } - } - - /** - * Parses the arguments of a function or environment - */ - parseArguments( - func, // Should look like "\name" or "\begin{name}". - funcData - ) { - const totalArgs = funcData.numArgs + funcData.numOptionalArgs; - if (totalArgs === 0) { - return { args: [], optArgs: [] }; - } - - const args = []; - const optArgs = []; - - for (let i = 0; i < totalArgs; i++) { - let argType = funcData.argTypes && funcData.argTypes[i]; - const isOptional = i < funcData.numOptionalArgs; - - if ( - (funcData.primitive && argType == null) || - // \sqrt expands into primitive if optional argument doesn't exist - (funcData.type === "sqrt" && i === 1 && optArgs[0] == null) - ) { - argType = "primitive"; - } - - const arg = this.parseGroupOfType(`argument to '${func}'`, argType, isOptional); - if (isOptional) { - optArgs.push(arg); - } else if (arg != null) { - args.push(arg); - } else { - // should be unreachable - throw new ParseError("Null argument, please report this as a bug"); - } - } - - return { args, optArgs }; - } - - /** - * Parses a group when the mode is changing. - */ - parseGroupOfType(name, type, optional) { - switch (type) { - case "size": - return this.parseSizeGroup(optional); - case "url": - return this.parseUrlGroup(optional); - case "math": - case "text": - return this.parseArgumentGroup(optional, type); - case "hbox": { - // hbox argument type wraps the argument in the equivalent of - // \hbox, which is like \text but switching to \textstyle size. - const group = this.parseArgumentGroup(optional, "text"); - return group != null - ? { - type: "styling", - mode: group.mode, - body: [group], - scriptLevel: "text" // simulate \textstyle - } - : null; - } - case "raw": { - const token = this.parseStringGroup("raw", optional); - return token != null - ? { - type: "raw", - mode: "text", - string: token.text - } - : null; - } - case "primitive": { - if (optional) { - throw new ParseError("A primitive argument cannot be optional"); - } - const group = this.parseGroup(name); - if (group == null) { - throw new ParseError("Expected group as " + name, this.fetch()); - } - return group; - } - case "original": - case null: - case undefined: - return this.parseArgumentGroup(optional); - default: - throw new ParseError("Unknown group type as " + name, this.fetch()); - } - } - - /** - * Discard any space tokens, fetching the next non-space token. - */ - consumeSpaces() { - while (true) { - const ch = this.fetch().text; - // \ufe0e is the Unicode variation selector to supress emoji. Ignore it. - if (ch === " " || ch === "\u00a0" || ch === "\ufe0e") { - this.consume(); - } else { - break - } - } - } - - /** - * Parses a group, essentially returning the string formed by the - * brace-enclosed tokens plus some position information. - */ - parseStringGroup( - modeName, // Used to describe the mode in error messages. - optional - ) { - const argToken = this.gullet.scanArgument(optional); - if (argToken == null) { - return null; - } - let str = ""; - let nextToken; - while ((nextToken = this.fetch()).text !== "EOF") { - str += nextToken.text; - this.consume(); - } - this.consume(); // consume the end of the argument - argToken.text = str; - return argToken; - } - - /** - * Parses a regex-delimited group: the largest sequence of tokens - * whose concatenated strings match `regex`. Returns the string - * formed by the tokens plus some position information. - */ - parseRegexGroup( - regex, - modeName // Used to describe the mode in error messages. - ) { - const firstToken = this.fetch(); - let lastToken = firstToken; - let str = ""; - let nextToken; - while ((nextToken = this.fetch()).text !== "EOF" && regex.test(str + nextToken.text)) { - lastToken = nextToken; - str += lastToken.text; - this.consume(); - } - if (str === "") { - throw new ParseError("Invalid " + modeName + ": '" + firstToken.text + "'", firstToken); - } - return firstToken.range(lastToken, str); - } - - /** - * Parses a size specification, consisting of magnitude and unit. - */ - parseSizeGroup(optional) { - let res; - let isBlank = false; - // don't expand before parseStringGroup - this.gullet.consumeSpaces(); - if (!optional && this.gullet.future().text !== "{") { - res = this.parseRegexGroup(/^[-+]? *(?:$|\d+|\d+\.\d*|\.\d*) *[a-z]{0,2} *$/, "size"); - } else { - res = this.parseStringGroup("size", optional); - } - if (!res) { - return null; - } - if (!optional && res.text.length === 0) { - // Because we've tested for what is !optional, this block won't - // affect \kern, \hspace, etc. It will capture the mandatory arguments - // to \genfrac and \above. - res.text = "0pt"; // Enable \above{} - isBlank = true; // This is here specifically for \genfrac - } - const match = /([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(res.text); - if (!match) { - throw new ParseError("Invalid size: '" + res.text + "'", res); - } - const data = { - number: +(match[1] + match[2]), // sign + magnitude, cast to number - unit: match[3] - }; - if (!validUnit(data)) { - throw new ParseError("Invalid unit: '" + data.unit + "'", res); - } - return { - type: "size", - mode: this.mode, - value: data, - isBlank - }; - } - - /** - * Parses an URL, checking escaped letters and allowed protocols, - * and setting the catcode of % as an active character (as in \hyperref). - */ - parseUrlGroup(optional) { - this.gullet.lexer.setCatcode("%", 13); // active character - this.gullet.lexer.setCatcode("~", 12); // other character - const res = this.parseStringGroup("url", optional); - this.gullet.lexer.setCatcode("%", 14); // comment character - this.gullet.lexer.setCatcode("~", 13); // active character - if (res == null) { - return null; - } - // hyperref package allows backslashes alone in href, but doesn't - // generate valid links in such cases; we interpret this as - // "undefined" behaviour, and keep them as-is. Some browser will - // replace backslashes with forward slashes. - let url = res.text.replace(/\\([#$%&~_^{}])/g, "$1"); - url = res.text.replace(/{\u2044}/g, "/"); - return { - type: "url", - mode: this.mode, - url - }; - } - - /** - * Parses an argument with the mode specified. - */ - parseArgumentGroup(optional, mode) { - const argToken = this.gullet.scanArgument(optional); - if (argToken == null) { - return null; - } - const outerMode = this.mode; - if (mode) { - // Switch to specified mode - this.switchMode(mode); - } - - this.gullet.beginGroup(); - const expression = this.parseExpression(false, "EOF"); - // TODO: find an alternative way to denote the end - this.expect("EOF"); // expect the end of the argument - this.gullet.endGroup(); - const result = { - type: "ordgroup", - mode: this.mode, - loc: argToken.loc, - body: expression - }; - - if (mode) { - // Switch mode back - this.switchMode(outerMode); - } - return result; - } - - /** - * Parses an ordinary group, which is either a single nucleus (like "x") - * or an expression in braces (like "{x+y}") or an implicit group, a group - * that starts at the current position, and ends right before a higher explicit - * group ends, or at EOF. - */ - parseGroup( - name, // For error reporting. - breakOnTokenText - ) { - const firstToken = this.fetch(); - const text = firstToken.text; - - let result; - // Try to parse an open brace or \begingroup - if (text === "{" || text === "\\begingroup" || text === "\\toggle") { - this.consume(); - const groupEnd = text === "{" - ? "}" - : text === "\\begingroup" - ? "\\endgroup" - : "\\endtoggle"; - - this.gullet.beginGroup(); - // If we get a brace, parse an expression - const expression = this.parseExpression(false, groupEnd); - const lastToken = this.fetch(); - this.expect(groupEnd); // Check that we got a matching closing brace - this.gullet.endGroup(); - result = { - type: (lastToken.text === "\\endtoggle" ? "toggle" : "ordgroup"), - mode: this.mode, - loc: SourceLocation.range(firstToken, lastToken), - body: expression, - // A group formed by \begingroup...\endgroup is a semi-simple group - // which doesn't affect spacing in math mode, i.e., is transparent. - // https://tex.stackexchange.com/questions/1930/ - semisimple: text === "\\begingroup" || undefined - }; - } else { - // If there exists a function with this name, parse the function. - // Otherwise, just return a nucleus - result = this.parseFunction(breakOnTokenText, name) || this.parseSymbol(); - if (result == null && text[0] === "\\" && - !Object.prototype.hasOwnProperty.call(implicitCommands, text )) { - result = this.formatUnsupportedCmd(text); - this.consume(); - } - } - return result; - } - - /** - * Form ligature-like combinations of characters for text mode. - * This includes inputs like "--", "---", "``" and "''". - * The result will simply replace multiple textord nodes with a single - * character in each value by a single textord node having multiple - * characters in its value. The representation is still ASCII source. - * The group will be modified in place. - */ - formLigatures(group) { - let n = group.length - 1; - for (let i = 0; i < n; ++i) { - const a = group[i]; - const v = a.text; - if (v === "-" && group[i + 1].text === "-") { - if (i + 1 < n && group[i + 2].text === "-") { - group.splice(i, 3, { - type: "textord", - mode: "text", - loc: SourceLocation.range(a, group[i + 2]), - text: "---" - }); - n -= 2; - } else { - group.splice(i, 2, { - type: "textord", - mode: "text", - loc: SourceLocation.range(a, group[i + 1]), - text: "--" - }); - n -= 1; - } - } - if ((v === "'" || v === "`") && group[i + 1].text === v) { - group.splice(i, 2, { - type: "textord", - mode: "text", - loc: SourceLocation.range(a, group[i + 1]), - text: v + v - }); - n -= 1; - } - } - } - - /** - * Parse a single symbol out of the string. Here, we handle single character - * symbols and special functions like \verb. - */ - parseSymbol() { - const nucleus = this.fetch(); - let text = nucleus.text; - - if (/^\\verb[^a-zA-Z]/.test(text)) { - this.consume(); - let arg = text.slice(5); - const star = arg.charAt(0) === "*"; - if (star) { - arg = arg.slice(1); - } - // Lexer's tokenRegex is constructed to always have matching - // first/last characters. - if (arg.length < 2 || arg.charAt(0) !== arg.slice(-1)) { - throw new ParseError(`\\verb assertion failed -- - please report what input caused this bug`); - } - arg = arg.slice(1, -1); // remove first and last char - return { - type: "verb", - mode: "text", - body: arg, - star - }; - } - // At this point, we should have a symbol, possibly with accents. - // First expand any accented base symbol according to unicodeSymbols. - if (Object.prototype.hasOwnProperty.call(unicodeSymbols, text[0]) && - !symbols[this.mode][text[0]]) { - // This behavior is not strict (XeTeX-compatible) in math mode. - if (this.settings.strict && this.mode === "math") { - throw new ParseError(`Accented Unicode text character "${text[0]}" used in ` + `math mode`, - nucleus - ); - } - text = unicodeSymbols[text[0]] + text.slice(1); - } - // Strip off any combining characters - const match = combiningDiacriticalMarksEndRegex.exec(text); - if (match) { - text = text.substring(0, match.index); - if (text === "i") { - text = "\u0131"; // dotless i, in math and text mode - } else if (text === "j") { - text = "\u0237"; // dotless j, in math and text mode - } - } - // Recognize base symbol - let symbol; - if (symbols[this.mode][text]) { - let group = symbols[this.mode][text].group; - if (group === "bin" && binLeftCancellers.includes(this.prevAtomType)) { - // Change from a binary operator to a unary (prefix) operator - group = "open"; - } - const loc = SourceLocation.range(nucleus); - let s; - if (Object.prototype.hasOwnProperty.call(ATOMS, group )) { - const family = group; - s = { - type: "atom", - mode: this.mode, - family, - loc, - text - }; - } else { - if (asciiFromScript[text]) { - // Unicode 14 disambiguates chancery from roundhand. - // See https://www.unicode.org/charts/PDF/U1D400.pdf - this.consume(); - const nextCode = this.fetch().text.charCodeAt(0); - // mathcal is Temml default. Use mathscript if called for. - const font = nextCode === 0xfe01 ? "mathscr" : "mathcal"; - if (nextCode === 0xfe00 || nextCode === 0xfe01) { this.consume(); } - return { - type: "font", - mode: "math", - font, - body: { type: "mathord", mode: "math", loc, text: asciiFromScript[text] } - } - } - // Default ord character. No disambiguation necessary. - s = { - type: group, - mode: this.mode, - loc, - text - }; - } - symbol = s; - } else if (text.charCodeAt(0) >= 0x80) { - // no symbol for e.g. ^ - if (this.settings.strict && this.mode === "math") { - throw new ParseError(`Unicode text character "${text[0]}" used in math mode`, nucleus) - } - // All nonmathematical Unicode characters are rendered as if they - // are in text mode (wrapped in \text) because that's what it - // takes to render them in LaTeX. - symbol = { - type: "textord", - mode: "text", - loc: SourceLocation.range(nucleus), - text - }; - } else { - return null; // EOF, ^, _, {, }, etc. - } - this.consume(); - // Transform combining characters into accents - if (match) { - for (let i = 0; i < match[0].length; i++) { - const accent = match[0][i]; - if (!unicodeAccents[accent]) { - throw new ParseError(`Unknown accent ' ${accent}'`, nucleus); - } - const command = unicodeAccents[accent][this.mode] || - unicodeAccents[accent].text; - if (!command) { - throw new ParseError(`Accent ${accent} unsupported in ${this.mode} mode`, nucleus); - } - symbol = { - type: "accent", - mode: this.mode, - loc: SourceLocation.range(nucleus), - label: command, - isStretchy: false, - base: symbol - }; - } - } - return symbol; - } - } - - /** - * Parses an expression using a Parser, then returns the parsed result. - */ - const parseTree = function(toParse, settings) { - if (!(typeof toParse === "string" || toParse instanceof String)) { - throw new TypeError("Temml can only parse string typed expression") - } - const parser = new Parser(toParse, settings); - // Blank out any \df@tag to avoid spurious "Duplicate \tag" errors - delete parser.gullet.macros.current["\\df@tag"]; - - let tree = parser.parse(); - - // LaTeX ignores a \tag placed outside an AMS environment. - if (!(tree.length > 0 && tree[0].type && tree[0].type === "array" && tree[0].addEqnNum)) { - // If the input used \tag, it will set the \df@tag macro to the tag. - // In this case, we separately parse the tag and wrap the tree. - if (parser.gullet.macros.get("\\df@tag")) { - if (!settings.displayMode) { - throw new ParseError("\\tag works only in display mode") - } - parser.gullet.feed("\\df@tag"); - tree = [ - { - type: "tag", - mode: "text", - body: tree, - tag: parser.parse() - } - ]; - } - } - - return tree - }; - - /** - * This file contains information about the style that the mathmlBuilder carries - * around with it. Data is held in an `Style` object, and when - * recursing, a new `Style` object can be created with the `.with*` functions. - */ - - const subOrSupLevel = [2, 2, 3, 3]; - - /** - * This is the main Style class. It contains the current style.level, color, and font. - * - * Style objects should not be modified. To create a new Style with - * different properties, call a `.with*` method. - */ - class Style { - constructor(data) { - // Style.level can be 0 | 1 | 2 | 3, which correspond to - // displaystyle, textstyle, scriptstyle, and scriptscriptstyle. - // style.level does not directly set MathML's script level. MathML does that itself. - // We use style.level to track, not set, math style so that we can get the - // correct scriptlevel when needed in supsub.js, mathchoice.js, or for dimensions in em. - this.level = data.level; - this.color = data.color; // string | void - // A font family applies to a group of fonts (i.e. SansSerif), while a font - // represents a specific font (i.e. SansSerif Bold). - // See: https://tex.stackexchange.com/questions/22350/difference-between-textrm-and-mathrm - this.font = data.font || ""; // string - this.fontFamily = data.fontFamily || ""; // string - this.fontSize = data.fontSize || 1.0; // number - this.fontWeight = data.fontWeight || ""; - this.fontShape = data.fontShape || ""; - this.maxSize = data.maxSize; // [number, number] - } - - /** - * Returns a new style object with the same properties as "this". Properties - * from "extension" will be copied to the new style object. - */ - extend(extension) { - const data = { - level: this.level, - color: this.color, - font: this.font, - fontFamily: this.fontFamily, - fontSize: this.fontSize, - fontWeight: this.fontWeight, - fontShape: this.fontShape, - maxSize: this.maxSize - }; - - for (const key in extension) { - if (Object.prototype.hasOwnProperty.call(extension, key)) { - data[key] = extension[key]; - } - } - - return new Style(data); - } - - withLevel(n) { - return this.extend({ - level: n - }); - } - - incrementLevel() { - return this.extend({ - level: Math.min(this.level + 1, 3) - }); - } - - inSubOrSup() { - return this.extend({ - level: subOrSupLevel[this.level] - }) - } - - /** - * Create a new style object with the given color. - */ - withColor(color) { - return this.extend({ - color: color - }); - } - - /** - * Creates a new style object with the given math font or old text font. - * @type {[type]} - */ - withFont(font) { - return this.extend({ - font - }); - } - - /** - * Create a new style objects with the given fontFamily. - */ - withTextFontFamily(fontFamily) { - return this.extend({ - fontFamily, - font: "" - }); - } - - /** - * Creates a new style object with the given font size - */ - withFontSize(num) { - return this.extend({ - fontSize: num - }); - } - - /** - * Creates a new style object with the given font weight - */ - withTextFontWeight(fontWeight) { - return this.extend({ - fontWeight, - font: "" - }); - } - - /** - * Creates a new style object with the given font weight - */ - withTextFontShape(fontShape) { - return this.extend({ - fontShape, - font: "" - }); - } - - /** - * Gets the CSS color of the current style object - */ - getColor() { - return this.color; - } - } - - /* Temml Post Process - * Perform two tasks not done by Temml when it created each individual Temml element. - * Given a block, - * 1. At each AMS auto-numbered environment, assign an id. - * 2. Populate the text contents of each \ref & \eqref - * - * As with other Temml code, this file is released under terms of the MIT license. - * https://mit-license.org/ - */ - - const version = "0.10.24"; - - function postProcess(block) { - const labelMap = {}; - let i = 0; - - // Get a collection of the parents of each \tag & auto-numbered equation - const parents = block.getElementsByClassName("tml-tageqn"); - for (const parent of parents) { - const eqns = parent.getElementsByClassName("tml-eqn"); - if (eqns. length > 0 ) { - // AMS automatically numbered equation. - // Assign an id. - i += 1; - eqns[0].id = "tml-eqn-" + i; - // No need to write a number into the text content of the element. - // A CSS counter does that even if this postProcess() function is not used. - } - // If there is a \label, add it to labelMap - const labels = parent.getElementsByClassName("tml-label"); - if (labels.length === 0) { continue } - if (eqns.length > 0) { - labelMap[labels[0].id] = String(i); - } else { - const tags = parent.getElementsByClassName("tml-tag"); - if (tags.length > 0) { - labelMap[labels[0].id] = tags[0].textContent; - } - } - } - - // Populate \ref & \eqref text content - const refs = block.getElementsByClassName("tml-ref"); - [...refs].forEach(ref => { - let str = labelMap[ref.getAttribute("href").slice(1)]; - if (ref.className.indexOf("tml-eqref") === -1) { - // \ref. Omit parens. - str = str.replace(/^\(/, ""); - str = str.replace(/\($/, ""); - } { - // \eqref. Include parens - if (str.charAt(0) !== "(") { str = "(" + str; } - if (str.slice(-1) !== ")") { str = str + ")"; } - } - ref.textContent = str; - }); - } - - /* eslint no-console:0 */ - - /** - * @type {import('./temml').render} - * Parse and build an expression, and place that expression in the DOM node - * given. - */ - let render = function(expression, baseNode, options = {}) { - baseNode.textContent = ""; - const alreadyInMathElement = baseNode.tagName.toLowerCase() === "math"; - if (alreadyInMathElement) { options.wrap = "none"; } - const math = renderToMathMLTree(expression, options); - if (alreadyInMathElement) { - // The element already exists. Populate it. - baseNode.textContent = ""; - math.children.forEach(e => { baseNode.appendChild(e.toNode()); }); - } else if (math.children.length > 1) { - baseNode.textContent = ""; - math.children.forEach(e => { baseNode.appendChild(e.toNode()); }); - } else { - baseNode.appendChild(math.toNode()); - } - }; - - // Temml's styles don't work properly in quirks mode. Print out an error, and - // disable rendering. - if (typeof document !== "undefined") { - if (document.compatMode !== "CSS1Compat") { - typeof console !== "undefined" && - console.warn( - "Warning: Temml doesn't work in quirks mode. Make sure your " + - "website has a suitable doctype." - ); - - render = function() { - throw new ParseError("Temml doesn't work in quirks mode."); - }; - } - } - - /** - * @type {import('./temml').renderToString} - * Parse and build an expression, and return the markup for that. - */ - const renderToString = function(expression, options) { - const markup = renderToMathMLTree(expression, options).toMarkup(); - return markup; - }; - - /** - * @type {import('./temml').generateParseTree} - * Parse an expression and return the parse tree. - */ - const generateParseTree = function(expression, options) { - const settings = new Settings(options); - return parseTree(expression, settings); - }; - - /** - * @type {import('./temml').definePreamble} - * Take an expression which contains a preamble. - * Parse it and return the macros. - */ - const definePreamble = function(expression, options) { - const settings = new Settings(options); - settings.macros = {}; - if (!(typeof expression === "string" || expression instanceof String)) { - throw new TypeError("Temml can only parse string typed expression") - } - const parser = new Parser(expression, settings, true); - // Blank out any \df@tag to avoid spurious "Duplicate \tag" errors - delete parser.gullet.macros.current["\\df@tag"]; - const macros = parser.parse(); - return macros - }; - - /** - * If the given error is a Temml ParseError, - * renders the invalid LaTeX as a span with hover title giving the Temml - * error message. Otherwise, simply throws the error. - */ - const renderError = function(error, expression, options) { - if (options.throwOnError || !(error instanceof ParseError)) { - throw error; - } - const node = new Span(["temml-error"], [new TextNode$1(expression + "\n" + error.toString())]); - node.style.color = options.errorColor; - node.style.whiteSpace = "pre-line"; - return node; - }; - - /** - * @type {import('./temml').renderToMathMLTree} - * Generates and returns the Temml build tree. This is used for advanced - * use cases (like rendering to custom output). - */ - const renderToMathMLTree = function(expression, options) { - const settings = new Settings(options); - try { - const tree = parseTree(expression, settings); - const style = new Style({ - level: settings.displayMode ? StyleLevel.DISPLAY : StyleLevel.TEXT, - maxSize: settings.maxSize - }); - return buildMathML(tree, expression, style, settings); - } catch (error) { - return renderError(error, expression, settings); - } - }; - - /** @type {import('./temml').default} */ - var temml = { - /** - * Current Temml version - */ - version: version, - /** - * Renders the given LaTeX into MathML, and adds - * it as a child to the specified DOM node. - */ - render, - /** - * Renders the given LaTeX into MathML string, - * for sending to the client. - */ - renderToString, - /** - * Post-process an entire HTML block. - * Writes AMS auto-numbers and implements \ref{}. - * Typcally called once, after a loop has rendered many individual spans. - */ - postProcess, - /** - * Temml error, usually during parsing. - */ - ParseError, - /** - * Creates a set of macros with document-wide scope. - */ - definePreamble, - /** - * Parses the given LaTeX into Temml's internal parse tree structure, - * without rendering to HTML or MathML. - * - * NOTE: This method is not currently recommended for public use. - * The internal tree representation is unstable and is very likely - * to change. Use at your own risk. - */ - __parse: generateParseTree, - /** - * Renders the given LaTeX into a MathML internal DOM tree - * representation, without flattening that representation to a string. - * - * NOTE: This method is not currently recommended for public use. - * The internal tree representation is unstable and is very likely - * to change. Use at your own risk. - */ - __renderToMathMLTree: renderToMathMLTree, - /** - * adds a new symbol to builtin symbols table - */ - __defineSymbol: defineSymbol, - /** - * adds a new macro to builtin macro list - */ - __defineMacro: defineMacro - }; - - return temml; - -})(); diff --git a/test/temmlPostProcess.js b/test/temmlPostProcess.js deleted file mode 100644 index be7ef50f..00000000 --- a/test/temmlPostProcess.js +++ /dev/null @@ -1,70 +0,0 @@ -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : - typeof define === 'function' && define.amd ? define(['exports'], factory) : - (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.temml = {})); -})(this, (function (exports) { 'use strict'; - - /* Temml Post Process - * Perform two tasks not done by Temml when it created each individual Temml element. - * Given a block, - * 1. At each AMS auto-numbered environment, assign an id. - * 2. Populate the text contents of each \ref & \eqref - * - * As with other Temml code, this file is released under terms of the MIT license. - * https://mit-license.org/ - */ - - const version = "0.10.24"; - - function postProcess(block) { - const labelMap = {}; - let i = 0; - - // Get a collection of the parents of each \tag & auto-numbered equation - const parents = block.getElementsByClassName("tml-tageqn"); - for (const parent of parents) { - const eqns = parent.getElementsByClassName("tml-eqn"); - if (eqns. length > 0 ) { - // AMS automatically numbered equation. - // Assign an id. - i += 1; - eqns[0].id = "tml-eqn-" + i; - // No need to write a number into the text content of the element. - // A CSS counter does that even if this postProcess() function is not used. - } - // If there is a \label, add it to labelMap - const labels = parent.getElementsByClassName("tml-label"); - if (labels.length === 0) { continue } - if (eqns.length > 0) { - labelMap[labels[0].id] = String(i); - } else { - const tags = parent.getElementsByClassName("tml-tag"); - if (tags.length > 0) { - labelMap[labels[0].id] = tags[0].textContent; - } - } - } - - // Populate \ref & \eqref text content - const refs = block.getElementsByClassName("tml-ref"); - [...refs].forEach(ref => { - let str = labelMap[ref.getAttribute("href").slice(1)]; - if (ref.className.indexOf("tml-eqref") === -1) { - // \ref. Omit parens. - str = str.replace(/^\(/, ""); - str = str.replace(/\($/, ""); - } { - // \eqref. Include parens - if (str.charAt(0) !== "(") { str = "(" + str; } - if (str.slice(-1) !== ")") { str = str + ")"; } - } - ref.textContent = str; - }); - } - - exports.postProcess = postProcess; - exports.version = version; - - Object.defineProperty(exports, '__esModule', { value: true }); - -})); diff --git a/test/unit-test.cjs b/test/unit-test.cjs deleted file mode 100644 index 73a182dc..00000000 --- a/test/unit-test.cjs +++ /dev/null @@ -1,2360 +0,0 @@ -const temml = require("../utils/temml.cjs") - -/* - * Unit tests for Temml. - * This file contains more than 1300 tests of various Temml functions. - * - * Sidenote: - * Temml aims to minimize dependency hell by minimizing dependencies. - * When Jest is installed, it adds several thousand files, so I don't use it. - * Instead, I use this roll-your-own testing class. - * - * Many of the tests in this file have been ported from the Jest tests in KaTeX. - */ - -// First, a few helpers. -const defaultSettings = _ => new Settings(); -const strictSettings = _ => new Settings({ strict: true }); -const displayMode = _ => new Settings({ displayMode: true }); -const trustSettings = _ => new Settings({ trust: true }); -const wrapSettings = str => new Settings({ wrap: str }); -const mathTagRegEx = /<\/?math>/g; - -// tagging literal -const r = x => x != null && Object.prototype.hasOwnProperty.call(x, 'raw') ? x.raw[0] : x; - -class ParseError { - constructor(message = "", token = {}) { - this.message = message - this.token = token - } -} - -const deflt = function(setting, defaultIfUndefined) { - return setting === undefined ? defaultIfUndefined : setting; -} - -class Settings { - constructor(options) { - // allow null options - options = options || {}; - this.displayMode = deflt(options.displayMode, false); // boolean - this.annotate = deflt(options.annotate, false) // boolean - this.leqno = deflt(options.leqno, false); // boolean - this.errorColor = deflt(options.errorColor, "#b22222"); // string - this.macros = options.macros || {}; - this.wrap = deflt(options.wrap, "tex") // "tex" | "=" - this.xml = deflt(options.xml, false); // boolean - this.colorIsTextColor = deflt(options.colorIsTextColor, false); // booelean - this.strict = deflt(options.strict, false); // boolean - this.trust = deflt(options.trust, false); // trust context. See html.js. - this.maxSize = (options.maxSize === undefined - ? [Infinity, Infinity] - : Array.isArray(options.maxSize) - ? options.maxSize - : [Infinity, Infinity] - ) - this.maxExpand = Math.max(0, deflt(options.maxExpand, 1000)); // number - } - - isTrusted(context) { - if (context.url && !context.protocol) { - context.protocol = utils.protocolFromUrl(context.url); - } - const trust = typeof this.trust === "function" ? this.trust(context) : this.trust; - return Boolean(trust); - } -} - -function getProtocolViaTrust(url) { - let protocol; - parse(`\\url{${url}}`, new Settings({ - trust: context => protocol = context.protocol, - })); - return protocol; -} - -// Strip positions from ParseNodes. -const stripPositions = expr => { - if (typeof expr !== "object" || expr === null) { return expr } - if (expr.loc && expr.loc.lexer && typeof expr.loc.start === "number") { delete expr.loc } - Object.keys(expr).forEach(function(key) { stripPositions(expr[key]) }); - return expr; -}; - -const parse = (expr, settings = defaultSettings()) => { - const tree = temml.__parse(expr, settings) - return stripPositions(tree) -} - -function build(expr, settings) { - const builtMathML = temml.__renderToMathMLTree(expr, settings); - if (builtMathML.classes.indexOf('temml-error') >= 0) { return builtMathML } - return builtMathML.children; -} - -// This is the main testing function. -const test = () => { - // Before we write any tests, write an Expect class that mimics Jest expect(). - // The Expect class and the say() helper function are inside this closure - // so that they will have access to the `assertion` variable. - const say = problem => { - numFailures += 1 - console.log(assertion + ", but " + problem) - console.log("") - } - - class Expect { - constructor(input) { - this.input = input; - } - - toBe(x) { - numTests += 1 - if (this.input !== x) { say(this.input + " does not equal " + x) } - } - - toNotBe(x) { - numTests += 1 - if (this.input === x) { say(this.input + " equals " + x + "!") } - } - - toMatch(regEx) { - numTests += 1 - if (!regEx.test(this.input)) { say(this.input + " does not match the RegEx!") } - } - - toMatchSnapshot(str) { - numTests += 1 - const flattened = JSON.stringify(this.input) - if (flattened !== str) { say(flattened + " is not " + str) } - } - - toBeDefined() { - numTests += 1 - if (this.input === undefined) { say(this.input + " is undefinded") } - } - - toBeUndefined() { - numTests += 1 - if (this.input !== undefined) { say(this.input + " is defined.") } - } - - toHaveLength(expectedNum) { - numTests += 1 - if (!this.input.length) { say("No length!") } - if (this.input.length !== expectedNum) { say(this.input.length + " is not " + expectedNum) } - } - - toBeTruthy() { - numTests += 1 - if (!this.input) { say(this.input + " is not truthy.") } - } - - toBeFalsy() { - numTests += 1 - if (this.input) { say(this.input + " is truthy.") } - } - - toBeCloseTo(expected) { - numTests += 1 - if (Math.abs(expected - this.input) >= 0.005) { - say(this.input + " is not close to " + expected) - } - } - - toContain(fragment) { - numTests += 1 - if (this.input.indexOf(fragment) === -1) { - say(this.input + " does not contain " + fragment) - } - } - - toNotContain(fragment) { - numTests += 1 - if (this.input.indexOf(fragment) !== -1) { - say(this.input + " contains " + fragment + "!") - } - } - - toParse(settings = defaultSettings()) { - numTests += 1 - let result = true - try { - const tree = parse(this.input, settings) - if (tree instanceof ParseError) { result = false } - if (tree.length === 1 && tree[0].color && tree[0].color === "#b22222") { result = false } - } catch (e) { - result = false - } - if (!result) { say(this.input + " does not parse.") } - } - - toNotParse(settings = defaultSettings()) { - numTests += 1 - let result = true - try { - const tree = parse(this.input, settings) - if (tree instanceof ParseError) { result = false } - if (tree.length === 1 && tree[0].color && tree[0].color === "#b22222") { result = false } - } catch (e) { - result = false - } - if (result) { say(this.input + " parses!") } - } - - toParseLike(str, settings = defaultSettings()) { - numTests += 1 - let result = true - try { - const tree = parse(this.input, settings) - if (tree instanceof ParseError) { result = false } - const comp = parse(str, settings) - if (comp instanceof ParseError) { result = false } - result = JSON.stringify(tree) === JSON.stringify(comp) - } catch (e) { - result = false - } - if (!result) { - say(this.input + " does not parse like " + str) - } - } - - toBuild(settings = defaultSettings()) { - numTests += 1 - let result = true - try { - const tree = build(this.input, settings) - if (tree.classes && tree.classes[0] === "temml-error") { result = false } - } catch (e) { - result = false - console.log(e) - } - if (!result) { - say(this.input + " does not build.") - } - } - - toNotBuild(settings = defaultSettings()) { - numTests += 1 - let result = true - try { - const tree = build(this.input, settings) - if (tree.classes && tree.classes[0] === "temml-error") { result = false } - } catch (e) { - result = false - } - if (result) { say(this.input + " builds!") } - } - - toBuildLike(str, settings = defaultSettings()) { - numTests += 1 - let result = true - try { - const tree = build(this.input, settings) - if (tree instanceof ParseError) { result = false } - const comp = build(str, settings) - if (comp instanceof ParseError) { result = false } - result = JSON.stringify(tree) === JSON.stringify(comp) - } catch (e) { - result = false - } - if (!result) { say(this.input + " does not build like " + str) } - } - } - - // Now we have an Expect class. Here come lots of tests. - - let numTests = 0 - let numFailures = 0 - console.log("") - - let assertion = "Parser should work" - new Expect("").toParse() - new Expect("1234|/@.`abcdefgzABCDEFGZ").toParse() - - assertion = "Parser should ignore whitespace" - new Expect(` x y `).toParseLike("xy") - new Expect(` x ^ y `).toParseLike("x^y") - new Expect("\u00a0\ufe0e" + `x ^ y `).toParseLike("x^y") - - assertion = "Temml should consolidate numbers into a single element" - let nodes = build(`12.34`) - new Expect(nodes.length).toBe(1) - new Expect(nodes[0].type).toBe("mn") - nodes = build(`12.34`) - new Expect(nodes.length).toBe(1) - new Expect(nodes[0].type).toBe("mn") - assertion = "Temml should split numbers if a space follows a comma" - let markup = temml.renderToString(`12, 340`) - new Expect(markup).toBe('12,340') - - assertion = "Parser should build a list of ords" - const ords = parse("1234|@.`abcdefgzABCDEFGZ"); - for (let i = 0; i < ords.length; i++) { - new Expect(ords[i].type.slice(4)).toBe("ord"); - } - - assertion = "Parser should build bins" - nodes = parse(r`1 + 2 - 3 * 4 \cdot 5 \pm 6 \div 7`) - for (let i = 1; i < nodes.length; i+=2) { - new Expect(nodes[i].type).toBe("atom"); - new Expect(nodes[i].family).toBe("bin"); - } - - assertion = "Parser should change bins to opens when they should be unary" - nodes = parse(r`a = -1 \ast (-4) \pm {+5} + \sin -2 x^{-2} \ast 3 \sum -c + \dots + d`) - for (const i of [4, 9, 11, 16, 21, 23]) { - new Expect(nodes[i].type).toBe("atom"); - new Expect(nodes[i].family).toBe("bin"); - } - for (const i of [2, 6, 13, 19]) { - new Expect(nodes[i].type).toBe("atom"); - new Expect(nodes[i].family).toBe("open"); - } - - assertion = "Parser should build a list of rels" - nodes = parse(r`=<>\leq\geq\neq\nleq\ngeq\cong\in`) - for (let i = 0; i < nodes.length; i++) { - new Expect(nodes[i].type).toBe("atom"); - new Expect(nodes[i].family).toBe("rel"); - } - - assertion = "Parser should parse a \\mathinner" - new Expect(r`\mathinner{\langle{\psi}\rangle}`).toParse() - new Expect(r`\frac 1 {\mathinner{\langle{\psi}\rangle}}`).toParse() - assertion = "\\mathinner should return a group, not a fragment" - new Expect(build(r`\mathinner{\langle{\psi}\rangle}`).length).toBe(1) - - assertion = "Parse should build a list of puncts" - nodes = parse(",;") - for (let i = 0; i < nodes.length; i++) { - new Expect(nodes[i].type).toBe("atom"); - new Expect(nodes[i].family).toBe("punct"); - } - - assertion = "Parser should build a list of opens" - nodes = parse("([") - for (let i = 0; i < nodes.length; i++) { - new Expect(nodes[i].type).toBe("atom"); - new Expect(nodes[i].family).toBe("open"); - } - - assertion = "Parser should build a list of closes" - nodes = parse("])") - for (let i = 0; i < nodes.length; i++) { - new Expect(nodes[i].type).toBe("atom"); - new Expect(nodes[i].family).toBe("close"); - } - - assertion = "\\Temml should parse" - new Expect("\\Temml").toParse() - - assertion = "Subscripts and superscripts should parse" - new Expect(`x^2`).toParse() - new Expect(`x_3`).toParse() - new Expect(`x^2_3`).toParse() - new Expect(`x_2^3`).toParse() - new Expect(`^3`).toParse(); - new Expect(`^3+`).toParse(); - new Expect(`_2`).toParse(); - new Expect(`^3_2`).toParse(); - new Expect(`_2^3`).toParse(); - - let node = parse("x^2")[0] - new Expect(node.type).toBe("supsub"); - new Expect(node.base).toBeDefined(); - new Expect(node.sup).toBeDefined(); - new Expect(node.sub).toBeUndefined(); - - node = parse("x_3")[0] - new Expect(node.type).toBe("supsub"); - new Expect(node.base).toBeDefined(); - new Expect(node.sub).toBeDefined(); - new Expect(node.sup).toBeUndefined(); - - node = parse("x^2_3")[0] - new Expect(node.type).toBe("supsub"); - new Expect(node.base).toBeDefined(); - new Expect(node.sub).toBeDefined(); - new Expect(node.sup).toBeDefined(); - - new Expect(`x^2_3`).toParseLike(`x_3^2`) - - assertion = "Double exponents should not parse" - new Expect(`x^x^x`).toNotParse(); - new Expect(`x_x_x`).toNotParse(); - new Expect(`x_x^x_x`).toNotParse(); - new Expect(`x_x^x^x`).toNotParse(); - new Expect(`x^x_x_x`).toNotParse(); - new Expect(`x^x_x^x`).toNotParse(); - - assertion = "A subsup parser should work correctly with {}s" - new Expect(`x^{2+3}`).toParse(); - new Expect(`x_{3-2}`).toParse(); - new Expect(`x^{2+3}_3`).toParse(); - new Expect(`x^2_{3-2}`).toParse(); - new Expect(`x^{2+3}_{3-2}`).toParse(); - new Expect(`x_{3-2}^{2+3}`).toParse(); - new Expect(`x_3^{2+3}`).toParse(); - new Expect(`x_{3-2}^2`).toParse(); - - assertion = "A subsup parser should work with nested super/subscripts" - new Expect(`x^{x^x}`).toParse(); - new Expect(`x^{x_x}`).toParse(); - new Expect(`x_{x^x}`).toParse(); - new Expect(`x_{x_x}`).toParse(); - - assertion = "A row builder should work when given a document fragment" - new Expect((build(`x^{\color{red}{hello}}`))[0].children.length).toBe(2) - new Expect((build(`x^{\color{red}{hello}}`))[0].children[1].type).toBe("mrow") - - assertion = "A subscript and superscript tree-builder should not fail when there is no nucleus" - new Expect(`^3`).toParse(); - new Expect(`_2`).toParse(); - new Expect(`^3_2`).toParse(); - new Expect(`_2^3`).toParse(); - new Expect(`^3`).toBuild(); - new Expect(`_2`).toBuild(); - new Expect(`^3_2`).toBuild(); - new Expect(`_2^3`).toBuild(); - - assertion = "A subsup parser should work with Unicode (sub|super)script characters" - new Expect(`A² + B²⁺³ + ²C + E₂³ + F₂₊₃`).toBuildLike("A^{2} + B^{2+3} + ^{2}C + E_{2}^{3} + F_{2+3}") - new Expect(r`\text{B²⁺³}`).toParse() - new Expect(r`\text{B²⁺³}`).toBuild() - - assertion = "A supsub parser should merge a numeric base with a preceding number" - new Expect(temml.renderToString(r`123^4`)).toContain("123") - - assertion = "A parser with limit controls should fail when the limit control is not preceded by an op node" - new Expect(r`3\nolimits_2^2`).toNotParse(); - new Expect(r`\sqrt\limits_2^2`).toNotParse(); - new Expect(r`45 +\nolimits 45`).toNotParse(); - - assertion = "A parser with limit controls should parse when the limit control directly follows an op node" - new Expect(r`\int\limits_2^2 3`).toParse(); - new Expect(r`\sum\nolimits_3^4 4`).toParse(); - - assertion = "A parser with limit controls should parse when the limit control is in the sup/sub area of an op node" - new Expect(r`\int_2^2\limits`).toParse(); - new Expect(r`\int^2\nolimits_2`).toParse(); - new Expect(r`\int_2\limits^2`).toParse(); - - assertion = "A parser with limit controls should allow multiple limit controls in the sup/sub area of an op node" - new Expect(r`\int_2\nolimits^2\limits 3`).toParse(); - new Expect(r`\int\nolimits\limits_2^2`).toParse(); - new Expect(r`\int\limits\limits\limits_2^2`).toParse(); - - assertion = "A parser with limit controls should have the rightmost limit control determine the limits property of the preceding op node" - new Expect(parse(r`\int\nolimits\limits_2^2`)[0].base.limits).toBe(true) - new Expect(parse(r`\int\limits_2\nolimits^2`)[0].base.limits).toBe(false) - - assertion = "A group parser should work" - new Expect(`{xy}`).toParse(); - nodes = parse(`{xy}`) - new Expect(nodes).toHaveLength(1); - new Expect(nodes[0].type).toBe("ordgroup"); - new Expect(nodes[0].body).toBeTruthy(); - new Expect(nodes[0].semisimple).toBeFalsy(); - new Expect(r`\begingroup xy \endgroup`).toParse(); - new Expect(r`\begingroup xy`).toNotParse(); - new Expect(r`\begingroup xy }`).toNotParse(); - nodes = parse(r`\begingroup xy \endgroup`) - new Expect(nodes).toHaveLength(1) - new Expect(nodes[0].type).toBe("ordgroup"); - new Expect(nodes[0].body).toBeTruthy(); - new Expect(nodes[0].semisimple).toBe(true); - - assertion = "An implicit group parser should work" - new Expect(r`\Large x`).toParse(); - new Expect(r`abc {abc \Large xyz} abc`).toParse(); - nodes = parse(r`\Large abc`) - new Expect(nodes).toHaveLength(1); - new Expect(nodes[0].type).toBe("sizing"); - new Expect(nodes[0].body).toBeTruthy(); - nodes = parse(r`a \Large abc`) - new Expect(nodes).toHaveLength(2); - new Expect(nodes[1].type).toBe("sizing"); - new Expect(nodes[1].body).toHaveLength(3); - nodes = parse(r`a { b \Large c } d`) - new Expect(nodes[1].body[1].type).toBe("sizing"); - new Expect(nodes[1].body[1].body).toHaveLength(1); - - assertion = "An implicit group parser should work within optional groups" - new Expect(r`\sqrt[\small 3]{x}`).toParse(); - new Expect(r`\sqrt[\color{red} 3]{x}`).toParse() - new Expect(r`\sqrt[\textstyle 3]{x}`).toParse() - new Expect(r`\sqrt[\tt 3]{x}`).toParse() - - assertion = "An implicit group parser should work within environment arrays" - node = parse(r`\begin{array}{l}\color{red}a\\ b \\ c \end{array}`)[0]; - new Expect(node.type).toBe("array") - new Expect(node.body.length).toBe(3) - - assertion = "A semi-simple group builder should not affect spacing of operators" - markup = temml.renderToString(r`1\begingroup + 2 *\endgroup 3`) - new Expect(markup).toNotContain("lspace") - new Expect(markup).toNotContain("rspace") - assertion = "A braced group builder should change spacing of operators at ends of group" - markup = temml.renderToString(r`1{+ 2 *}3`) - new Expect(markup).toContain("lspace") - new Expect(markup).toContain("rspace") - - assertion = "A function parser should work" - new Expect(r`\div`).toParse(); - new Expect(r`\blue x`).toParse(); - new Expect(r`\frac 1 2`).toParse(); - new Expect(r`\tilde`).toNotParse(); - new Expect(r`\frac`).toNotParse(); - new Expect(r`\frac 1`).toNotParse(); - new Expect(parse(r`\tildex`)[0].color).toBe("#b22222"); - new Expect(r`\frac12`).toParse(); - new Expect(r`\;x`).toParse(); - - assertion = "A frac parser should work" - const expression = r`\frac{x}{y}`; - const dfracExpression = r`\dfrac{x}{y}`; - const tfracExpression = r`\tfrac{x}{y}`; - const cfracExpression = r`\cfrac{x}{y}`; - const genfrac1 = r`\genfrac ( ] {0.06em}{0}{a}{b+c}`; - const genfrac2 = r`\genfrac ( ] {0.8pt}{}{a}{b+c}`; - new Expect(expression).toParse(); - node = parse(expression)[0]; - new Expect(node.type).toBe("genfrac"); - new Expect(node.numer).toBeDefined(); - new Expect(node.denom).toBeDefined(); - new Expect(cfracExpression).toParse(); - new Expect(dfracExpression).toParse(); - new Expect(tfracExpression).toParse(); - new Expect(genfrac1).toParse(); - new Expect(genfrac2).toParse(); - const dfracParse = parse(dfracExpression)[0]; - new Expect(dfracParse.type).toBe("genfrac"); - new Expect(dfracParse.numer).toBeDefined(); - new Expect(dfracParse.denom).toBeDefined(); - const tfracParse = parse(tfracExpression)[0]; - new Expect(tfracParse.type).toBe("genfrac"); - new Expect(tfracParse.numer).toBeDefined(); - new Expect(tfracParse.denom).toBeDefined(); - const cfracParse = parse(cfracExpression)[0]; - new Expect(cfracParse.type).toBe("genfrac"); - new Expect(cfracParse.numer).toBeDefined(); - new Expect(cfracParse.denom).toBeDefined(); - const genfracParse = parse(genfrac1)[0]; - new Expect(genfracParse.type).toBe("genfrac"); - new Expect(genfracParse.numer).toBeDefined(); - new Expect(genfracParse.denom).toBeDefined(); - new Expect(genfracParse.leftDelim).toBeDefined(); - new Expect(genfracParse.rightDelim).toBeDefined(); - let badGenFrac = r`\genfrac ( ] {b+c}{0}{a}{b+c}`; - new Expect(badGenFrac).toNotParse(); - badGenFrac = r`\genfrac ( ] {0.06em}{0}{a}`; - new Expect(badGenFrac).toNotParse(); - node = parse(r`x \atop y`)[0]; - new Expect(node.type).toBe("genfrac"); - new Expect(node.numer).toBeDefined(); - new Expect(node.denom).toBeDefined(); - new Expect(node.hasBarLine).toBe(false); - - assertion = "An over/brace/brack parser should work" - const simpleOver = r`1 \over x`; - const complexOver = r`1+2i \over 3+4i`; - const braceFrac = r`a+b \brace c+d`; - const brackFrac = r`a+b \brack c+d`; - new Expect(simpleOver).toParse(); - new Expect(complexOver).toParse(); - new Expect(braceFrac).toParse(); - new Expect(brackFrac).toParse(); - - node = parse(simpleOver)[0]; - new Expect(node.type).toBe("genfrac"); - new Expect(node.numer).toBeDefined(); - new Expect(node.denom).toBeDefined(); - - node = parse(complexOver)[0]; - new Expect(node.type).toBe("genfrac"); - new Expect(node.numer).toBeDefined(); - new Expect(node.denom).toBeDefined(); - - const parseBraceFrac = parse(braceFrac)[0]; - new Expect(parseBraceFrac.type).toBe("genfrac"); - new Expect(parseBraceFrac.numer).toBeDefined(); - new Expect(parseBraceFrac.denom).toBeDefined(); - new Expect(parseBraceFrac.leftDelim).toBeDefined(); - new Expect(parseBraceFrac.rightDelim).toBeDefined(); - - const parseBrackFrac = parse(brackFrac)[0]; - new Expect(parseBrackFrac.type).toBe("genfrac"); - new Expect(parseBrackFrac.numer).toBeDefined(); - new Expect(parseBrackFrac.denom).toBeDefined(); - new Expect(parseBrackFrac.leftDelim).toBeDefined(); - new Expect(parseBrackFrac.rightDelim).toBeDefined(); - node = parse(complexOver)[0]; - - const numer = node.numer; - new Expect(numer.body).toHaveLength(4); - node = parse(complexOver)[0]; - - const denom = node.denom; - new Expect(denom.body).toHaveLength(4); - const emptyNumerator = r`\over x`; - node = parse(emptyNumerator)[0]; - new Expect(node.type).toBe("genfrac"); - new Expect(node.numer).toBeDefined(); - new Expect(node.denom).toBeDefined(); - const emptyDenominator = r`1 \over`; - node = parse(emptyDenominator)[0]; - new Expect(node.type).toBe("genfrac"); - new Expect(node.numer).toBeDefined(); - new Expect(node.denom).toBeDefined(); - const displaystyleExpression = r`\displaystyle 1 \over 2`; - node = parse(displaystyleExpression)[0]; - new Expect(node.type).toBe("genfrac"); - new Expect(node.numer.body[0].type).toBe("styling"); - new Expect(node.denom).toBeDefined(); - new Expect(r`\textstyle 1 \over 2`).toParseLike(r`\frac{\textstyle 1}{2}`); - new Expect(r`{\textstyle 1} \over 2`).toParseLike(r`\frac{\textstyle 1}{2}`); - const nestedOverExpression = r`{1 \over 2} \over 3`; - node = parse(nestedOverExpression)[0]; - new Expect(node.type).toBe("genfrac"); - new Expect(node.numer.body[0].type).toBe("genfrac"); - new Expect(node.numer.body[0].numer.body[0].text).toBe("1"); - new Expect(node.numer.body[0].denom.body[0].text).toBe("2"); - new Expect(node.denom).toBeDefined(); - new Expect(node.denom.body[0].text).toBe("3"); - const badMultipleOvers = r`1 \over 2 + 3 \over 4`; - new Expect(badMultipleOvers).toNotParse(); - const badOverChoose = r`1 \over 2 \choose 3`; - new Expect(badOverChoose).toNotParse(); - - assertion = `A genfrac builder should work` - new Expect(r`\frac{x}{y}`).toParse(); - new Expect(r`\dfrac{x}{y}`).toParse(); - new Expect(r`\tfrac{x}{y}`).toParse(); - new Expect(r`\cfrac{x}{y}`).toParse(); - new Expect(r`\genfrac ( ] {0.06em}{0}{a}{b+c}`).toParse(); - new Expect(r`\genfrac ( ] {0.8pt}{}{a}{b+c}`).toParse(); - new Expect(r`\genfrac {} {} {0.8pt}{}{a}{b+c}`).toParse(); - new Expect(r`\genfrac [ {} {0.8pt}{}{a}{b+c}`).toParse(); - new Expect(r`\frac{x}{y}`).toBuild(); - new Expect(r`\dfrac{x}{y}`).toBuild(); - new Expect(r`\tfrac{x}{y}`).toBuild(); - new Expect(r`\cfrac{x}{y}`).toBuild(); - new Expect(r`\genfrac ( ] {0.06em}{0}{a}{b+c}`).toBuild(); - new Expect(r`\genfrac ( ] {0.8pt}{}{a}{b+c}`).toBuild(); - new Expect(r`\genfrac {} {} {0.8pt}{}{a}{b+c}`).toBuild(); - new Expect(r`\genfrac [ {} {0.8pt}{}{a}{b+c}`).toBuild(); - - assertion = `A infix builder should not fail` - new Expect(r`a \over b`).toParse(); - new Expect(r`a \atop b`).toParse(); - new Expect(r`a \choose b`).toParse(); - new Expect(r`a \brace b`).toParse(); - new Expect(r`a \brack b`).toParse(); - new Expect(r`a \over b`).toBuild(); - new Expect(r`a \atop b`).toBuild(); - new Expect(r`a \choose b`).toBuild(); - new Expect(r`a \brace b`).toBuild(); - new Expect(r`a \brack b`).toBuild(); - - assertion = "A sizing parser should work" - const sizeExpression = r`\Huge{x}\small{x}`; - new Expect(sizeExpression).toParse(); - node = parse(sizeExpression)[0]; - new Expect(node.type).toBe("sizing"); - new Expect(node.body).toBeDefined(); - - assertion = "A text parser should work" - const textExpression = r`\text{a b}`; - const noBraceTextExpression = r`\text x`; - const nestedTextExpression = r`\text{a {b} \blue{c} \textcolor{#fff}{x} \llap{x}}`; - const spaceTextExpression = r`\text{ a \ }`; - const leadingSpaceTextExpression = r`\text {moo}`; - const badTextExpression = r`\text{a b%}`; - const badFunctionExpression = r`\text{\sqrt{x}}`; - const mathTokenAfterText = r`\text{sin}^2`; - new Expect(textExpression).toParse(); - node = parse(textExpression)[0]; - - new Expect(node.type).toBe("text"); - new Expect(node.body).toBeDefined(); - - new Expect(parse(textExpression)[0].body[0].type).toBe("textord"); - new Expect(badTextExpression).toNotParse(); - new Expect(badFunctionExpression).toNotParse(); - new Expect(noBraceTextExpression).toParse(); - new Expect(nestedTextExpression).toParse(); - node = parse(spaceTextExpression)[0]; - new Expect(node.body[0].type).toBe("spacing"); - new Expect(node.body[1].type).toBe("textord"); - new Expect(node.body[2].type).toBe("spacing"); - new Expect(node.body[3].type).toBe("spacing"); - new Expect(mathTokenAfterText).toParse(); - node = parse(leadingSpaceTextExpression)[0]; - // [m, o, o] - new Expect(node.body).toHaveLength(3); - new Expect(node.body.map(n => n.text).join("")).toBe("moo"); - new Expect(r`\text{graph: $y = mx + b$}`).toParse(); - new Expect(r`\text{graph: \(y = mx + b\)}`).toParse(); - new Expect(r`\text{hello $x + \text{world $y$} + z$}`).toParse(); - new Expect(r`\text{hello \(x + \text{world $y$} + z\)}`).toParse(); - new Expect(r`\text{hello $x + \text{world \(y\)} + z$}`).toParse(); - new Expect(r`\text{hello \(x + \text{world \(y\)} + z\)}`).toParse(); - new Expect(r`\(`).toNotParse(); - new Expect(r`\text{$\(x\)$}`).toNotParse(); - new Expect(r`$x$`).toNotParse(); - new Expect(r`\text{\($x$\)}`).toNotParse(); - new Expect(r`\)`).toNotParse(); - new Expect(r`\text{\)}`).toNotParse(); - new Expect(r`$`).toNotParse(); - new Expect(r`\text{$}`).toNotParse(); - new Expect(r`\text{$x\)}`).toNotParse(); - new Expect(r`\text{\(x$}`).toNotParse(); - new Expect(r`a b\, \; \! \: \> ~ \thinspace \medspace \quad \ `).toParse(); - new Expect(r`\enspace \thickspace \qquad \space \nobreakspace`).toParse(); - new Expect(r`a b\, \; \! \: \> ~ \thinspace \medspace \quad \ `).toBuild(); - new Expect(r`\enspace \thickspace \qquad \space \nobreakspace`).toBuild(); - new Expect(r`\text{\textellipsis !}`).toParseLike(r`\text{\textellipsis!}`); - new Expect(r`\:_*`).toParse(); - new Expect(r`\:_*`).toBuild(); - // Check for duplication of text. Prevent reoccurence of issue #9. - node = parse(r`\text{MMö}`)[0]; - new Expect(node.body[0].text).toBe("M") - - assertion = `A texvc builder should not fail` - new Expect(r`\lang\N\darr\R\dArr\Z\Darr\alef\rang`).toParse(); - new Expect(r`\alefsym\uarr\Alpha\uArr\Beta\Uarr\Chi`).toParse(); - new Expect(r`\clubs\diamonds\hearts\spades\cnums\Complex`).toParse(); - new Expect(r`\Dagger\empty\harr\Epsilon\hArr\Eta\Harr\exist`).toParse(); - new Expect(r`\image\larr\infin\lArr\Iota\Larr\isin\Kappa`).toParse(); - new Expect(r`\Mu\lrarr\natnums\lrArr\Nu\Lrarr\Omicron`).toParse(); - new Expect(r`\real\rarr\plusmn\rArr\reals\Rarr\Reals\Rho`).toParse(); - new Expect(r`\text{\sect}\sdot\sub\sube\supe`).toParse(); - new Expect(r`\Tau\thetasym\weierp\Zeta`).toParse(); - new Expect(r`\lang\N\darr\R\dArr\Z\Darr\alef\rang`).toBuild(); - new Expect(r`\alefsym\uarr\Alpha\uArr\Beta\Uarr\Chi`).toBuild(); - new Expect(r`\clubs\diamonds\hearts\spades\cnums\Complex`).toBuild(); - new Expect(r`\Dagger\empty\harr\Epsilon\hArr\Eta\Harr\exist`).toBuild(); - new Expect(r`\image\larr\infin\lArr\Iota\Larr\isin\Kappa`).toBuild(); - new Expect(r`\Mu\lrarr\natnums\lrArr\Nu\Lrarr\Omicron`).toBuild(); - new Expect(r`\real\rarr\plusmn\rArr\reals\Rarr\Reals\Rho`).toBuild(); - new Expect(r`\text{\sect}\sdot\sub\sube\supe`).toBuild(); - new Expect(r`\Tau\thetasym\weierp\Zeta`).toBuild(); - - assertion = "A tie parser should work" - const mathTie = "a~b"; - const textTie = r`\text{a~ b}`; - new Expect(mathTie).toParse(); - new Expect(textTie).toParse(); - new Expect(parse(mathTie)[1].type).toBe("spacing"); - node = parse(textTie)[0]; - new Expect(node.body[1].type).toBe("spacing"); - node = parse(textTie)[0]; - new Expect(node.body[2].type).toBe("spacing"); - - assertion = "A delimiter sizing parser should work" - const normalDelim = r`\bigl |`; - const notDelim = r`\bigl x`; - const bigDelim = r`\Biggr \langle`; - new Expect(normalDelim).toParse(); - new Expect(bigDelim).toParse(); - new Expect(notDelim).toNotParse(); - node = parse(normalDelim)[0]; - new Expect(node.type).toBe("delimsizing"); - const leftParse = parse(normalDelim)[0]; - const rightParse = parse(bigDelim)[0]; - new Expect(leftParse.mclass).toBe("mopen"); - new Expect(rightParse.mclass).toBe("mclose"); - const smallParse = parse(normalDelim)[0]; - const bigParse = parse(bigDelim)[0]; - new Expect(smallParse.size).toBe(1); - new Expect(bigParse.size).toBe(4); - - assertion = "An overline parser should work" - const overline = r`\overline{x}`; - new Expect(overline).toParse(); - node = parse(overline)[0]; - new Expect(node.type).toBe("enclose"); - - assertion = "A lap parser should work" - new Expect(r`\rlap{\,/}{=}`).toParse(); - new Expect(r`\mathrlap{\,/}{=}`).toParse(); - new Expect(r`{=}\llap{/\,}`).toParse(); - new Expect(r`{=}\mathllap{/\,}`).toParse(); - new Expect(r`\sum_{\clap{ABCDEFG}}`).toParse(); - new Expect(r`\sum_{\mathclap{ABCDEFG}}`).toParse(); - new Expect(r`\mathrlap{\frac{a}{b}}{=}`).toParse(); - new Expect(r`{=}\mathllap{\frac{a}{b}}`).toParse(); - new Expect(r`\sum_{\mathclap{\frac{a}{b}}}`).toParse(); - new Expect(r`\rlap{\frac{a}{b}}{=}`).toNotParse(strictSettings()); - new Expect(r`{=}\llap{\frac{a}{b}}`).toNotParse(strictSettings()); - new Expect(r`\sum_{\clap{\frac{a}{b}}}`).toNotParse(strictSettings()); - node = parse(r`\mathrlap{\,/}`)[0]; - new Expect(node.type).toBe("lap"); - - assertion = "A rule parser should work" - const emRule = r`\rule{1em}{2em}`; - const exRule = r`\rule{1ex}{2em}`; - let badUnitRule = r`\rule{1au}{2em}`; - let noNumberRule = r`\rule{1em}{em}`; - const incompleteRule = r`\rule{1em}`; - const hardNumberRule = r`\rule{ 01.24ex}{2.450 em }`; - new Expect(emRule).toParse(); - new Expect(exRule).toParse(); - new Expect(badUnitRule).toNotParse(); - new Expect(noNumberRule).toNotParse(); - new Expect(incompleteRule).toNotParse(); - node = parse(emRule)[0]; - new Expect(node.type).toBe("rule"); - let emParse = parse(emRule)[0]; - let exParse = parse(exRule)[0]; - new Expect(emParse.width.unit).toBe("em"); - new Expect(emParse.height.unit).toBe("em"); - new Expect(exParse.width.unit).toBe("ex"); - new Expect(exParse.height.unit).toBe("em"); - const hardNumberParse = parse(hardNumberRule)[0]; - new Expect(hardNumberParse.width.number).toBeCloseTo(1.24); - new Expect(hardNumberParse.height.number).toBeCloseTo(2.45); - node = parse(r`\rule{-1em}{- 0.2em}`)[0]; - new Expect(node.width.number).toBeCloseTo(-1); - new Expect(node.height.number).toBeCloseTo(-0.2); - - assertion = "A kern parser should work" - let emKern = r`\kern{1em}`; - let exKern = r`\kern{1ex}`; - let muKern = r`\mkern{1mu}`; - let abKern = r`a\kern{1em}b`; - badUnitRule = r`\kern{1au}`; - noNumberRule = r`\kern{em}`; - emParse = parse(emKern)[0]; - exParse = parse(exKern)[0]; - let muParse = parse(muKern)[0]; - let abParse = parse(abKern)[1]; - new Expect(emParse.dimension.unit).toBe("em"); - new Expect(exParse.dimension.unit).toBe("ex"); - new Expect(muParse.dimension.unit).toBe("mu"); - new Expect(abParse.dimension.unit).toBe("em"); - new Expect(badUnitRule).toNotParse(); - new Expect(noNumberRule).toNotParse(); - node = parse(r`\kern{-1em}`)[0]; - new Expect(node.dimension.number).toBeCloseTo(-1); - node = parse(r`\kern{+1em}`)[0]; - new Expect(node.dimension.number).toBeCloseTo(1); - - assertion = "A non-braced kern parser should work" - emKern = r`\kern1em`; - exKern = r`\kern 1 ex`; - muKern = r`\mkern 1mu`; - const abKern1 = r`a\mkern1mub`; - const abKern2 = r`a\mkern-1mub`; - const abKern3 = r`a\mkern-1mu b`; - badUnitRule = r`\kern1au`; - noNumberRule = r`\kern em`; - emParse = parse(emKern)[0]; - exParse = parse(exKern)[0]; - muParse = parse(muKern)[0]; - let abParse1 = parse(abKern1)[1]; - let abParse2 = parse(abKern2)[1]; - let abParse3 = parse(abKern3)[1]; - new Expect(emParse.dimension.unit).toBe("em"); - new Expect(exParse.dimension.unit).toBe("ex"); - new Expect(muParse.dimension.unit).toBe("mu"); - new Expect(abParse1.dimension.unit).toBe("mu"); - new Expect(abParse2.dimension.unit).toBe("mu"); - new Expect(abParse3.dimension.unit).toBe("mu"); - abParse1 = parse(abKern1); - abParse2 = parse(abKern2); - abParse3 = parse(abKern3); - new Expect(abParse1).toHaveLength(3); - new Expect(abParse1[0].text).toBe("a"); - new Expect(abParse1[2].text).toBe("b"); - new Expect(abParse2).toHaveLength(3); - new Expect(abParse2[0].text).toBe("a"); - new Expect(abParse2[2].text).toBe("b"); - new Expect(abParse3).toHaveLength(3); - new Expect(abParse3[0].text).toBe("a"); - new Expect(abParse3[2].text).toBe("b"); - new Expect(badUnitRule).toNotParse(); - new Expect(noNumberRule).toNotParse(); - node = parse(r`\kern-1em`)[0]; - new Expect(node.dimension.number).toBeCloseTo(-1); - node = parse(r`\kern+1em`)[0]; - new Expect(node.dimension.number).toBeCloseTo(1); - abKern = "a\\mkern\t-\r1 \n mu\nb"; - abParse = parse("a\\mkern\t-\r1 \n mu\nb"); - new Expect(abParse).toHaveLength(3); - new Expect(abParse[0].text).toBe("a"); - new Expect(abParse[1].dimension.unit).toBe("mu"); - new Expect(abParse[2].text).toBe("b"); - - assertion = "A left/right parser should work" - const normalLeftRight = r`\left( \dfrac{x}{y} \right)`; - const emptyRight = r`\left( \dfrac{x}{y} \right.`; - new Expect(normalLeftRight).toParse(); - node = parse(normalLeftRight)[0]; - new Expect(node.type).toBe("leftright"); - new Expect(node.left).toBe("("); - new Expect(node.right).toBe(")"); - const unmatchedLeft = r`\left( \dfrac{x}{y}`; - const unmatchedRight = r`\dfrac{x}{y} \right)`; - new Expect(unmatchedLeft).toNotParse(); - new Expect(unmatchedRight).toNotParse(); - const unmatched = r`{ \left( \dfrac{x}{y} } \right)`; - new Expect(unmatched).toNotParse(); - const nonDelimiter = r`\left$ \dfrac{x}{y} \right)`; - new Expect(nonDelimiter).toNotParse(); - new Expect(emptyRight).toParse(); - const normalEmpty = r`\Bigl .`; - new Expect(normalEmpty).toParse(); - const normalMiddle = r`\left( \dfrac{x}{y} \middle| \dfrac{y}{z} \right)`; - new Expect(normalMiddle).toParse(); - const multiMiddle = r`\left( \dfrac{x}{y} \middle| \dfrac{y}{z} \middle/ \dfrac{z}{q} \right)`; - new Expect(multiMiddle).toParse(); - const nestedMiddle = r`\left( a^2 \middle| \left( b \middle/ c \right) \right)`; - new Expect(nestedMiddle).toParse(); - const unmatchedMiddle = r`(\middle|\dfrac{x}{y})`; - new Expect(unmatchedMiddle).toNotParse(); - new Expect(r`\left\langle \right\rangle`).toBuildLike(r`\left< \right>`); - new Expect(r`\left\langle \right\rangle`).toBuildLike("\\left\u27e8 \\right\u27e9"); - new Expect(r`\left\lparen \right\rparen`).toBuildLike(r`\left( \right)`); - new Expect(temml.renderToString(r`\left\{a\over2\middle|b\right\}`)).toContain("a2") - - assertion = "A begin/end parser should work" - new Expect(r`\begin{matrix}a&b\\c&d\end{matrix}`).toParse(); - new Expect(r`\begin{array}{cc}a&b\\c&d\end{array}`).toParse(); - new Expect(r`\begin{aligned}\end{aligned}`).toParse(); - new Expect(r`\begin{matrix}\hline a&b\\ \hline c&d\end{matrix}`).toParse(); - new Expect(r`\begin{matrix}\hdashline a&b\\ \hdashline c&d\end{matrix}`).toParse(); - new Expect(r`\hline`).toNotParse(); - new Expect(r`\begin{matrix}a&b\\c&d\end{pmatrix}`).toNotParse(); - new Expect(r`\begin{matrix}a&b\\c&d\right{pmatrix}`).toNotParse(); - new Expect(r`\begin{matrix}a&b\\c&d`).toNotParse(); - new Expect(r`{\begin{matrix}a&b\\c&d}\end{matrix}`).toNotParse(); - new Expect(r`\begin{matrix}0&1\over2&3\\4&5&6\end{matrix}`).toParse(); - const m1 = `\\begin{pmatrix}1&2\\\\3&4\\end{pmatrix}`; - const m2 = `\\begin{array}{rl}${m1}&0\\\\0&${m1}\\end{array}`; - new Expect(m2).toParse(); - new Expect(r`\begin{matrix}a&b\cr c&d\end{matrix}`).toParse(); - new Expect(r`\begin{matrix}a&b\\c&d\end{matrix}`).toParse(); - new Expect(r`\begin{matrix}a&b\cr[c]&d\end{matrix}`).toParse(); - const m3 = parse(r`\begin{matrix}a&b\\ c&d \\ \end{matrix}`)[0]; - new Expect(m3.body).toHaveLength(2); - new Expect(r`\begin{matrix*}[r] a & -1 \\ -1 & d \end{matrix*}`).toParse(); - new Expect(r`\begin{pmatrix*}[r] a & -1 \\ -1 & d \end{pmatrix*}`).toParse(); - new Expect(r`\begin{bmatrix*}[r] a & -1 \\ -1 & d \end{bmatrix*}`).toParse(); - new Expect(r`\begin{Bmatrix*}[r] a & -1 \\ -1 & d \end{Bmatrix*}`).toParse(); - new Expect(r`\begin{vmatrix*}[r] a & -1 \\ -1 & d \end{vmatrix*}`).toParse(); - new Expect(r`\begin{Vmatrix*}[r] a & -1 \\ -1 & d \end{Vmatrix*}`).toParse(); - new Expect(r`\begin{matrix*} a & -1 \\ -1 & d \end{matrix*}`).toParse(); - new Expect(r`\begin{matrix*}[r] a & -1 \\ -1 & d \end{matrix*}`).toBuild(); - new Expect(r`\begin{pmatrix*}[r] a & -1 \\ -1 & d \end{pmatrix*}`).toBuild(); - new Expect(r`\begin{bmatrix*}[r] a & -1 \\ -1 & d \end{bmatrix*}`).toBuild(); - new Expect(r`\begin{Bmatrix*}[r] a & -1 \\ -1 & d \end{Bmatrix*}`).toBuild(); - new Expect(r`\begin{vmatrix*}[r] a & -1 \\ -1 & d \end{vmatrix*}`).toBuild(); - new Expect(r`\begin{Vmatrix*}[r] a & -1 \\ -1 & d \end{Vmatrix*}`).toBuild(); - new Expect(r`\begin{matrix*} a & -1 \\ -1 & d \end{matrix*}`).toBuild(); - new Expect(r`\begin{matrix*}[] a & -1 \\ -1 & d \end{matrix*}`).toNotParse(); - new Expect(r`\begin{matrix}a&b\\ [c]&d\end{matrix}`).toParse() - new Expect(r`a\\ [b]`).toParse() - - assertion = "A sqrt parser should work" - const sqrt = r`\sqrt{x}`; - const missingGroup = r`\sqrt`; - new Expect(sqrt).toParse(); - new Expect(missingGroup).toNotParse(); - new Expect(parse(sqrt)[0].type).toBe("sqrt"); - new Expect("\\Large\\sqrt[3]{x}").toParse(); - new Expect("\\sqrt\\foo").toParseLike("\\sqrt123", new Settings({ macros: { "\\foo": "123" } })); - new Expect("\\sqrt[2]\\foo").toParseLike("\\sqrt[2]{123}", new Settings({ macros: { "\\foo": "123" } })); - - assertion = "A TeX-compliant parser should work" - new Expect(r`\frac 2 3`).toParse(); - const missingGroups = [ - r`\frac{x}`, - r`\textcolor{#fff}`, - r`\rule{1em}`, - r`\llap`, - r`\bigl`, - r`\text` - ]; - for (let i = 0; i < missingGroups.length; i++) { - new Expect(missingGroups[i]).toNotParse(); - } - new Expect(r`x^`).toNotParse(); - new Expect(r`x_`).toNotParse(); - const badArguments = [ - r`\frac \frac x y z`, - r`\frac x \frac y z`, - r`\frac \sqrt x y`, - r`\frac x \sqrt y`, - r`\frac \mathllap x y`, - r`\frac x \mathllap y`, - // This actually doesn't work in real TeX, but it is suprisingly - // hard to get this to correctly work. So, we take hit of very small - // amounts of non-compatiblity in order for the rest of the tests to - // work - // r`\llap \frac x y`, - r`\mathllap \mathllap x`, - r`\sqrt \mathllap x` - ]; - for (let i = 0; i < badArguments.length; i++) { - new Expect(badArguments[i]).toNotParse(); - } - const goodArguments = [ - r`\frac {\frac x y} z`, - r`\frac x {\frac y z}`, - r`\frac {\sqrt x} y`, - r`\frac x {\sqrt y}`, - r`\frac {\mathllap x} y`, - r`\frac x {\mathllap y}`, - r`\mathllap {\frac x y}`, - r`\mathllap {\mathllap x}`, - r`\sqrt {\mathllap x}` - ]; - for (let i = 0; i < goodArguments.length; i++) { - new Expect(goodArguments[i]).toParse(); - } - const badSupSubscripts = [ - r`x^\sqrt x`, - r`x^\mathllap x`, - r`x_\sqrt x`, - r`x_\mathllap x` - ]; - for (let i = 0; i < badSupSubscripts.length; i++) { - new Expect(badSupSubscripts[i]).toNotParse(); - } - const goodSupSubscripts = [ - r`x^{\sqrt x}`, - r`x^{\mathllap x}`, - r`x_{\sqrt x}`, - r`x_{\mathllap x}` - ]; - for (let i = 0; i < goodSupSubscripts.length; i++) { - new Expect(goodSupSubscripts[i]).toParse(); - } - new Expect(r`x''''`).toParse(); - new Expect(r`x_2''`).toParse(); - new Expect(r`x''_2`).toParse(); - new Expect(r`\sqrt^23`).toNotParse(); - new Expect(r`\frac^234`).toNotParse(); - new Expect(r`\frac2^34`).toNotParse(); - new Expect(r`\sqrt2^3`).toParse(); - new Expect(r`\frac23^4`).toParse(); - new Expect(r`\sqrt \frac x y`).toParse(); - new Expect(r`\sqrt \text x`).toParse(); - new Expect(r`x^\frac x y`).toParse(); - new Expect(r`x_\text x`).toParse(); - const badLeftArguments = [ - r`\frac \left( x \right) y`, - r`\frac x \left( y \right)`, - r`\mathllap \left( x \right)`, - r`\sqrt \left( x \right)`, - r`x^\left( x \right)` - ]; - for (let i = 0; i < badLeftArguments.length; i++) { - new Expect(badLeftArguments[i]).toNotParse(); - } - const goodLeftArguments = [ - r`\frac {\left( x \right)} y`, - r`\frac x {\left( y \right)}`, - r`\mathllap {\left( x \right)}`, - r`\sqrt {\left( x \right)}`, - r`x^{\left( x \right)}` - ]; - for (let i = 0; i < goodLeftArguments.length; i++) { - new Expect(goodLeftArguments[i]).toParse(); - } - - assertion = "An op symbol builder should build" - new Expect(r`\int_i^n`).toParse(); - new Expect(r`\iint_i^n`).toParse(); - new Expect(r`\iiint_i^n`).toParse(); - new Expect(r`\int\nolimits_i^n`).toParse(); - new Expect(r`\iint\nolimits_i^n`).toParse(); - new Expect(r`\iiint\nolimits_i^n`).toParse(); - new Expect(r`\oint_i^n`).toParse(); - new Expect(r`\oiint_i^n`).toParse(); - new Expect(r`\oiiint_i^n`).toParse(); - new Expect(r`\oint\nolimits_i^n`).toParse(); - new Expect(r`\oiint\nolimits_i^n`).toParse(); - new Expect(r`\oiiint\nolimits_i^n`).toParse(); - new Expect(r`\int_i^n`).toBuild(); - new Expect(r`\iint_i^n`).toBuild(); - new Expect(r`\iiint_i^n`).toBuild(); - new Expect(r`\int\nolimits_i^n`).toBuild(); - new Expect(r`\iint\nolimits_i^n`).toBuild(); - new Expect(r`\iiint\nolimits_i^n`).toBuild(); - new Expect(r`\oint_i^n`).toBuild(); - new Expect(r`\oiint_i^n`).toBuild(); - new Expect(r`\oiiint_i^n`).toBuild(); - new Expect(r`\oint\nolimits_i^n`).toBuild(); - new Expect(r`\oiint\nolimits_i^n`).toBuild(); - new Expect(r`\oiiint\nolimits_i^n`).toBuild(); - - assertion = "A style change parser should work" - new Expect(r`\displaystyle x`).toParse(); - new Expect(r`\textstyle x`).toParse(); - new Expect(r`\scriptstyle x`).toParse(); - new Expect(r`\scriptscriptstyle x`).toParse(); - const displayParse = parse(r`\displaystyle x`)[0]; - new Expect(displayParse.scriptLevel).toBe("display"); - const scriptscriptParse = parse(r`\scriptscriptstyle x`)[0]; - new Expect(scriptscriptParse.scriptLevel).toBe("scriptscript"); - const text = r`a b { c d \displaystyle e f } g h`; - const displayNode = parse(text)[2].body[2]; - new Expect(displayNode.type).toBe("styling"); - const displayBody = displayNode.body; - new Expect(displayBody).toHaveLength(2); - new Expect(displayBody[0].text).toBe("e"); - - assertion = "A font parser should work" - new Expect(r`\mathrm x`).toParse(); - new Expect(r`\mathbb x`).toParse(); - new Expect(r`\mathit x`).toParse(); - new Expect(r`\mathnormal x`).toParse(); - new Expect(r`\mathrm {x + 1}`).toParse(); - new Expect(r`\mathbb {x + 1}`).toParse(); - new Expect(r`\mathit {x + 1}`).toParse(); - new Expect(r`\mathnormal {x + 1}`).toParse(); - new Expect(r`\mathcal{ABC123}`).toParse(); - new Expect(r`\mathfrak{abcABC123}`).toParse(); - const mathbbParse = parse(r`\mathbb x`)[0]; - new Expect(mathbbParse.font).toBe("mathbb"); - new Expect(mathbbParse.type).toBe("font"); - const mathrmParse = parse(r`\mathrm x`)[0]; - new Expect(mathrmParse.font).toBe("mathrm"); - new Expect(mathrmParse.type).toBe("font"); - const mathitParse = parse(r`\mathit x`)[0]; - new Expect(mathitParse.font).toBe("mathit"); - new Expect(mathitParse.type).toBe("font"); - const mathnormalParse = parse(r`\mathnormal x`)[0]; - new Expect(mathnormalParse.font).toBe("mathnormal"); - new Expect(mathnormalParse.type).toBe("font"); - const mathcalParse = parse(r`\mathcal C`)[0]; - new Expect(mathcalParse.font).toBe("mathcal"); - new Expect(mathcalParse.type).toBe("font"); - const mathfrakParse = parse(r`\mathfrak C`)[0]; - new Expect(mathfrakParse.font).toBe("mathfrak"); - new Expect(mathfrakParse.type).toBe("font"); - const nestedParse = parse(r`\mathbb{R \neq \mathrm{R}}`)[0]; - new Expect(nestedParse.font).toBe("mathbb"); - new Expect(nestedParse.type).toBe("font"); - const bbBody = nestedParse.body.body; - new Expect(bbBody).toHaveLength(3); - new Expect(bbBody[0].type).toBe("mathord"); - new Expect(bbBody[2].type).toBe("font"); - new Expect(bbBody[2].font).toBe("mathrm"); - new Expect(bbBody[2].type).toBe("font"); - const colorMathbbParse = parse(r`\textcolor{blue}{\mathbb R}`)[0]; - new Expect(colorMathbbParse.type).toBe("color"); - new Expect(colorMathbbParse.color).toBe("#0000FF"); - const cbody = colorMathbbParse.body; - new Expect(cbody).toHaveLength(1); - new Expect(cbody[0].type).toBe("font"); - new Expect(cbody[0].font).toBe("mathbb"); - const bf = parse(r`\mathbf{a\mathrm{b}c}`)[0]; - new Expect(bf.type).toBe("font"); - new Expect(bf.font).toBe("mathbf"); - new Expect(bf.body.body).toHaveLength(3); - new Expect(bf.body.body[0].text).toBe("a"); - new Expect(bf.body.body[1].type).toBe("font"); - new Expect(bf.body.body[1].font).toBe("mathrm"); - new Expect(bf.body.body[2].text).toBe("c"); - new Expect(r`e^\mathbf{x}`).toParse(); - new Expect(r`\rm xyz`).toParseLike(r`\mathrm{xyz}`); - new Expect(r`\sf xyz`).toParseLike(r`\mathsf{xyz}`); - new Expect(r`\tt xyz`).toParseLike(r`\mathtt{xyz}`); - new Expect(r`\bf xyz`).toParseLike(r`\mathbf{xyz}`); - new Expect(r`\it xyz`).toParseLike(r`\mathit{xyz}`); - new Expect(r`\cal xyz`).toParseLike(r`\mathcal{xyz}`); - new Expect(r`\uptheta\varDelta`).toParse(strictSettings()) - new Expect(r`\uptheta\varDelta`).toBuild() - - assertion = "A \\boldsymbol builder should work" - new Expect(temml.renderToString(r`\boldsymbol{A}`)).toContain("𝑨") - new Expect(temml.renderToString(r`\boldsymbol{\mathrm{b}}`)).toContain('style="font-weight:bold;"') - - assertion = "A \\pmb builder should work" - new Expect(r`\pmb{\mu}`).toParse(); - new Expect(r`\pmb{=}`).toParse(); - new Expect(r`\pmb{+}`).toParse(); - new Expect(r`\pmb{\frac{x^2}{x_1}}`).toParse(); - new Expect(r`\pmb{}`).toParse(); - new Expect(r`\pmb{\mu}`).toBuild(); - new Expect(r`\pmb{=}`).toBuild(); - new Expect(r`\pmb{+}`).toBuild(); - new Expect(r`\pmb{\frac{x^2}{x_1}}`).toBuild(); - new Expect(r`\pmb{}`).toBuild(); - new Expect(r`\def\x{1}\pmb{\x\def\x{2}}`).toParseLike(r`\pmb{1}`); - - assertion = `A raise parser should work` - new Expect(r`\raisebox{5pt}{text}`).toParse(strictSettings()); - new Expect(r`\raisebox{-5pt}{text}`).toParse(strictSettings()); - new Expect(r`\vcenter{\frac a b}`).toParse(); - new Expect(r`\raisebox{5pt}{text}`).toBuild(strictSettings()); - new Expect(r`\raisebox{-5pt}{text}`).toBuild(strictSettings()); - new Expect(r`\vcenter{\frac a b}`).toBuild(); - new Expect(r`\raisebox{5pt}{\frac a b}`).toNotParse(); - new Expect(r`\raisebox{-5pt}{\frac a b}`).toNotParse(); - new Expect(r`\hbox{\frac a b}`).toNotParse(); - new Expect(r`\raisebox5pt{text}`).toNotParse(); - new Expect(r`\raisebox5pt{text}`).toNotParse(); - new Expect(r`\raisebox-5pt{text}`).toNotParse(); - - assertion = "A comment parser should work" - new Expect("a^2 + b^2 = c^2 % Pythagoras' Theorem\n").toParse(); - new Expect("% comment\n").toParse(); - new Expect("% comment 1\n% comment 2\n").toParse(); - new Expect("x_3 %comment\n^2").toParseLike(`x_3^2`); - new Expect("x^ %comment\n{2}").toParseLike(`x^{2}`); - new Expect("x^ %comment\n\\frac{1}{2}").toParseLike(r`x^\frac{1}{2}`); - new Expect("\\kern{1 %kern\nem}").toParse(); - new Expect("\\kern1 %kern\nem").toParse(); - new Expect("\\color{#f00%red\n}").toParse(); - new Expect("%comment\n{2}").toParseLike(`{2}`); - new Expect("\\begin{matrix}a&b\\\\ %hline\n\\hline %hline\n\\hline c&d\\end{matrix}").toParse(); - new Expect("\\def\\foo{a %}\nb}\n\\foo").toParseLike(`ab`); - new Expect("\\def\\foo{1\n2}\nx %\\foo\n").toParseLike(`x`); - new Expect(`x%y`).toNotParse(strictSettings()); - new Expect(`x%y`).toParse(); - new Expect("\\text{hello% comment 1\nworld}").toParseLike(r`\text{helloworld}`); - new Expect("\\text{hello% comment\n\nworld}").toParseLike(r`\text{hello world}`); - new Expect("5 % comment\n").toParseLike(`5`); - - assertion = "A font tree-builder should work" - markup = temml.renderToString(r`\mathbb{R}`).replace(mathTagRegEx, ""); - new Expect(markup).toBe(''); - markup = temml.renderToString(r`\mathrm{R}`).replace(mathTagRegEx, ""); - new Expect(markup).toBe('R'); - markup = temml.renderToString(r`\nabla`).replace(mathTagRegEx, ""); - new Expect(markup).toBe(''); - markup = temml.renderToString(r`\mathord\nabla`).replace(mathTagRegEx, ""); - new Expect(markup).toBe(''); - markup = temml.renderToString(r`\mathcal{R}`).replace(mathTagRegEx, ""); - new Expect(markup).toBe(''); - markup = temml.renderToString(r`\mathfrak{R}`).replace(mathTagRegEx, ""); - new Expect(markup).toBe(''); - markup = temml.renderToString(r`\text{R}`).replace(mathTagRegEx, ""); - new Expect(markup).toBe('R'); - markup = temml.renderToString(r`\textit{R}`).replace(mathTagRegEx, ""); - new Expect(markup).toBe('𝑅'); - markup = temml.renderToString(r`\text{\textit{R}}`).replace(mathTagRegEx, ""); - new Expect(markup).toBe('𝑅'); - let markup1 = temml.renderToString(r`\textup{R}`).replace(mathTagRegEx, ""); - new Expect(markup1).toBe('R'); - let markup2 = temml.renderToString(r`\textit{\textup{R}}`).replace(mathTagRegEx, ""); - new Expect(markup2).toBe('R'); - let markup3 = temml.renderToString(r`\textup{\textit{R}}`).replace(mathTagRegEx, ""); - new Expect(markup3).toBe('𝑅'); - markup = temml.renderToString(r`\text{R\textit{S}T}`).replace(mathTagRegEx, ""); - new Expect(markup).toBe('R𝑆T'); - markup1 = temml.renderToString(r`\textmd{R}`).replace(mathTagRegEx, ""); - new Expect(markup1).toBe('R'); - markup2 = temml.renderToString(r`\textbf{\textmd{R}}`).replace(mathTagRegEx, ""); - new Expect(markup2).toBe('R'); - markup3 = temml.renderToString(r`\textmd{\textbf{R}}`).replace(mathTagRegEx, ""); - new Expect(markup3).toBe('𝐑'); - markup = temml.renderToString(r`\textsf{R}`).replace(mathTagRegEx, ""); - new Expect(markup).toBe('𝖱'); - markup = temml.renderToString(r`\textsf{\textit{R}G\textbf{B}}`).replace(mathTagRegEx, ""); - new Expect(markup).toBe('𝘙𝖦𝗕'); - markup = temml.renderToString(r`\texttt{R}`).replace(mathTagRegEx, ""); - new Expect(markup).toBe('𝚁'); - assertion = "A font tree-builder should render a combination of font and color changes" - markup = temml.renderToString(r`\textcolor{blue}{\mathbb R}`).replace(mathTagRegEx, ""); - new Expect(markup).toBe(''); - markup = temml.renderToString(r`\mathbb{\textcolor{blue}{R}}`).replace(mathTagRegEx, ""); - new Expect(markup).toBe(''); - assertion = "A font tree-builder should render wide characters with and with the correct font" - markup = temml.renderToString("𝐀").replace(mathTagRegEx, ""); - new Expect(markup).toBe('𝐀'); - - assertion = "A parser should throw an error when the expression is of the wrong type" - new Expect([1, 2]).toNotParse() - new Expect({ badInputType: "yes" }).toNotParse() - new Expect(undefined).toNotParse() - new Expect(null).toNotParse() - new Expect(1.234).toNotParse() - assertion = "A parser should work when the expression is of the correct type" - new Expect(r`\sqrt{123}`).toParse() - new Expect(new String(r`\sqrt{123}`)).toParse() - - assertion = "A font tree-builder should render the correct mathvariants" - markup = temml.renderToString(r`Ax2k\omega\Omega\imath+`).replace(mathTagRegEx, ""); - new Expect(markup).toContain("A"); - new Expect(markup).toContain("x"); - new Expect(markup).toContain("2"); - new Expect(markup).toContain("ω"); // \omega - new Expect(markup).toContain('Ω'); // \Omega - new Expect(markup).toContain('ı'); // \imath - new Expect(markup).toContain('+'); - markup = temml.renderToString(r`\mathbb{Ax2k\omega\Omega\imath+}`).replace(mathTagRegEx, ""); - new Expect(markup).toBe('𝔸𝕩𝟚𝕜ωΩı+'); - markup = temml.renderToString(r`\mathrm{Ax2k\omega\Omega\imath}`).replace(mathTagRegEx, ""); - new Expect(markup).toBe('Ax2kωΩı'); - markup = temml.renderToString(r`\mathrm{Ax2k\omega\Omega\imath+}`).replace(mathTagRegEx, ""); - new Expect(markup).toContain("A"); - new Expect(markup).toContain("x"); - new Expect(markup).toContain("2"); - new Expect(markup).toContain("ω"); // \omega - new Expect(markup).toContain("Ω"); // \Omega - new Expect(markup).toContain("ı"); // \imath - new Expect(markup).toContain('+'); - markup = temml.renderToString(r`\mathit{Ax2k\omega\Omega\imath+}`).replace(mathTagRegEx, ""); - new Expect(markup).toBe(`Ax2kωΩı+`); - markup = temml.renderToString(r`\mathnormal{Ax2k\omega\Omega\imath+}`).replace(mathTagRegEx, ""); - new Expect(markup).toContain("A"); - new Expect(markup).toContain("x"); - new Expect(markup).toContain("2"); - new Expect(markup).toContain("ω"); // \omega - new Expect(markup).toContain("Ω"); // \Omega - new Expect(markup).toContain("ı"); // \imath - new Expect(markup).toContain('+'); - markup = temml.renderToString(r`\mathbf{Ax2k\omega\Omega\imath+}`).replace(mathTagRegEx, ""); - new Expect(markup).toBe(`𝐀𝐱𝟐𝐤𝛚𝛀ı+`); - markup = temml.renderToString(r`\mathcal{Ax2k\omega\Omega\imath+}`).replace(mathTagRegEx, ""); - new Expect(markup).toBe(`𝒜𝓍2𝓀ωΩı+`); - markup = temml.renderToString(r`\mathfrak{Ax2k\omega\Omega\imath+}`).replace(mathTagRegEx, ""); - new Expect(markup).toBe(`𝔄𝔵2𝔨ωΩı+`); - markup = temml.renderToString(r`\mathscr{A}`).replace(mathTagRegEx, ""); - new Expect(markup).toBe(`𝒜`); - markup = temml.renderToString(r`\mathsf{Ax2k\omega\Omega\imath+}`).replace(mathTagRegEx, ""); - new Expect(markup).toBe(`𝖠𝗑𝟤𝗄𝞈𝝮ı+`); - - assertion = "A font tree-builder should render text as " - markup = temml.renderToString(r`\text{for }`); - new Expect(markup).toContain("for\u00a0"); - - assertion = "A font tree-builder should render math within text as side-by-side children" - markup = temml.renderToString(r`\text{graph: $y = mx + b$}`); - new Expect(markup).toContain("y=mx+b"); - - assertion = "An includegraphics builder should work" - const img = "\\includegraphics[height=0.9em, totalheight=0.9em, width=0.9em, alt=KA logo]{https://cdn.kastatic.org/images/apple-touch-icon-57x57-precomposed.new.png}"; - new Expect(img).toNotParse() // no trust - new Expect(img, trustSettings()).toNotBuild(); - new Expect(img).toParse(trustSettings()) // no trust - markup = temml.renderToString(img, trustSettings()).replace(mathTagRegEx, ""); - new Expect(markup).toBe(`KA logo`); - - assertion = "An HTML extension builder should work" - const html = r`\id{bar}{x}\class{foo}{x}\style{color: red;}{x}\data{foo=a, bar=b}{x}`; - new Expect(html).toParse(trustSettings()); - new Expect(html).toBuild(trustSettings()); - let built = build(html, trustSettings())[0].children[0].children; - new Expect(built[0].attributes.id).toBe("bar"); - new Expect(built[1].classes).toContain("foo"); - new Expect(built[2].attributes.style).toBe("color: red;"); - - assertion = "A bin parser should work" - new Expect(parse('x + y')[1].family).toBe("bin") - new Expect(parse('+ x')[0].family).toBe("bin") - new Expect(parse(r`x + + 2`)[3].type).toBe("textord"); - new Expect(parse(r`( + 2`)[2].type).toBe("textord"); - new Expect(parse(r`= + 2`)[2].type).toBe("textord"); - new Expect(parse(r`\sin + 2`)[2].type).toBe("textord"); - new Expect(parse(r`, + 2`)[2].type).toBe("textord"); - new Expect(parse(r`\textcolor{blue}{x}+y`)[1].family).toBe("bin"); - new Expect(parse(r`\textcolor{blue}{x+}+y`)[2].type).toBe("mathord"); - - assertion = "A phantom and smash parser should work" - new Expect(parse(r`\hphantom{a}`)[0].type).toBe("hphantom"); - new Expect(parse(r`a\hphantom{=}b`)[2].type).toBe("mathord"); - new Expect(parse(r`\smash{a}`)[0].type).toBe("smash"); - new Expect(parse(r`a\smash{+}b`)[2].type).toBe("mathord"); - - assertion = "A markup generator should work" - // Just a few quick sanity checks here... - markup = temml.renderToString(r`\sigma^2`); - new Expect(markup.indexOf("Max") - - assertion = "href and url commands should build their input" - new Expect(r`\href{http://example.com/}{\sin}`).toParse(trustSettings()) - new Expect("\\url{http://example.com/}").toParse(trustSettings()) - assertion = "href and url commands should allow empty URLs" - new Expect(r`\href{}{example here}`).toParse(trustSettings()) - new Expect("\\url{}").toParse(trustSettings()) - new Expect(r`\href{http://example.com/}{\sin}`).toBuild(trustSettings()) - new Expect("\\url{http://example.com/}").toBuild(trustSettings()) - assertion = "href and url commands should allow empty URLs" - new Expect(r`\href{}{example here}`).toBuild(trustSettings()) - new Expect("\\url{}").toBuild(trustSettings()) - assertion = "href and url commands should allow single-character URLs" - new Expect(r`\href%end`).toParseLike("\\href{%}end", trustSettings()) - new Expect("\\url%end").toParseLike("\\url{%}end", trustSettings()) - new Expect("\\url%%end\n").toParseLike("\\url{%}", trustSettings()) - new Expect("\\url end").toParseLike("\\url{e}nd", trustSettings()) - new Expect("\\url%end").toParseLike("\\url {%}end", trustSettings()) - assertion = "href and url commands should allow spaces ad single-character URLs" - new Expect(r`\href %end`).toParseLike("\\href{%}end", trustSettings()) - new Expect("\\url %end").toParseLike("\\url{%}end", trustSettings()) - assertion = "href and url commands should allow [#$%&~_^] without escaping" - let url = "http://example.org/~bar/#top?foo=$foo&bar=ba^r_boo%20baz"; - node = parse(`\\href{${url}}{\\alpha}`, trustSettings())[0]; - new Expect(node.href).toBe(url); - node = parse(`\\url{${url}}`, trustSettings())[0]; - new Expect(node.href).toBe(url); - assertion = "href and url commands should allow balanced braces in url" - node = parse(`\\href{${url}}{\\alpha}`, trustSettings())[0]; - new Expect(node.href).toBe(url); - url = "http://example.org/{{}t{oo}}"; - node = parse(`\\href{${url}}{\\alpha}`, trustSettings())[0]; - new Expect(node.href).toBe(url); - node = parse(`\\url{${url}}`, trustSettings())[0]; - new Expect(node.href).toBe(url); - assertion = "href and url commands should not allow balanced braces in url" - new Expect(r`\href{http://example.com/{a}{bar}`).toNotParse(trustSettings()) - new Expect(r`\href{http://example.com/}a}{bar}`).toNotParse(trustSettings()) - new Expect(`\\url{http://example.com/{a}`).toNotParse(trustSettings()) - new Expect(`\\url{http://example.com/}a}`).toNotParse(trustSettings()) - assertion = "href and url commands should allow for escapes in [#$%&~_^]" - url = "http://example.org/~bar/#top?foo=$}foo{&bar=bar^r_boo%20baz"; - url = url.replace(/([#$%&~_^{}])/g, '\\$1'); - new Expect(`\\href{${url}}{\\alpha}`).toParse(trustSettings()) - new Expect(`\\url{${url}}`).toParse(trustSettings()); - new Expect(`\\href{${url}}{\\alpha}`).toBuild(trustSettings()) - new Expect(`\\url{${url}}`).toBuild(trustSettings()); - assertion = "href and url commands should allow comments after URLs" - new Expect("\\url{http://example.com/}%comment\n").toParse(trustSettings()) - new Expect("\\url{http://example.com/}%comment\n").toBuild(trustSettings()) - - assertion = "href and url commands should allow relative URLs when trust option is false" - markup = temml.renderToString("\\href{relative}{foo}") - new Expect(markup).toContain("#b22222") // color of error message - - assertion = "href and url commands should not allow explicitly disallowed protocols" - new Expect("\\href{ftp://x}{foo}").toParse(new Settings({trust: (context) => context.protocol === "ftp"})) - new Expect("\\href{ftp://x}{foo}").toBuild(new Settings({trust: (context) => context.protocol === "ftp"})) - assertion = "href and url commands should allow all protocols when trust option is true" - new Expect("\\href{ftp://x}{foo}").toParse(trustSettings()) - new Expect("\\href{ftp://x}{foo}").toBuild(trustSettings()) - assertion = "href and url commands should not allow explicitly disallowed protocols" - new Expect("\\href{javascript:alert('x')}{foo}").toNotParse(new Settings({trust: context => context.protocol !== "javascript"})) - new Expect("\\href{JavaScript:alert('x')}{foo}").toNotParse(new Settings({trust: context => context.protocol !== "javascript"})) - new Expect("\\url{!:}").toNotParse() - new Expect("\\url{foo:}").toNotParse() - new Expect("\\url{://foo}").toNotParse() - - assertion = "href and url commands should get protocols correctly" - new Expect (getProtocolViaTrust("foo")).toBe("_relative") - new Expect (getProtocolViaTrust("Foo:")).toBe("foo") - new Expect (getProtocolViaTrust("Foo:bar")).toBe("foo") - new Expect (getProtocolViaTrust("JavaScript:")).toBe("javascript") - new Expect (getProtocolViaTrust("JavaScript:code")).toBe("javascript") - new Expect (getProtocolViaTrust("?query=string&colon=")).toBe("_relative") - new Expect (getProtocolViaTrust("#query=string&colon=")).toBe("_relative") - new Expect (getProtocolViaTrust("dir/file&colon")).toBe("_relative") - new Expect (getProtocolViaTrust("//foo")).toBe("_relative") - new Expect (getProtocolViaTrust(" \t http://")).toBe("http") - new Expect (getProtocolViaTrust(" \t http://foo")).toBe("http") - - assertion = "The symbol table integrity should treat certain symbols as synonyms" - new Expect(`<`).toBuildLike(r`\lt`) - new Expect(`>`).toBuildLike(r`\gt`) - new Expect(r`\left<\frac{1}{x}\right>`).toBuildLike(r`\left\lt\frac{1}{x}\right\gt`) - - assertion = "Symbols should support AMS symbols in both text and math mode" - new Expect(r`\yen\checkmark\circledR\maltese`).toBuild(strictSettings()) - new Expect(r`\text{\yen\checkmark\circledR\maltese}`).toBuild(strictSettings()) - new Expect(r`\yen\checkmark\circledR\maltese`).toParse(strictSettings()) - new Expect(r`\text{\yen\checkmark\circledR\maltese}`).toParse(strictSettings()) - - assertion = "A macro expander should produce individual tokens" - new Expect(r`e^\foo`).toParseLike("e^a 23", new Settings({macros: {"\\foo": "a23"}})) - new Expect(r`e^\foo`).toParseLike("e^1 23", new Settings({strict: true, macros: {"\\foo": "123"}})) - assertion = "A macro expander should preserve leading spaces inside macro definition" - new Expect(r`\text{\foo}`).toParseLike(r`\text{ x}`, new Settings({macros: {"\\foo": " x"}})) - assertion = "A macro expander should preserve leading spaces inside macro argument" - new Expect(r`\text{\foo{ x}}`).toParseLike(r`\text{ x}`, new Settings({macros: {"\\foo": "#1"}})) - assertion = "A macro expander should ignore expanded spaces in math mode" - new Expect(r`\foo`).toParseLike("x", new Settings({macros: {"\\foo": " x"}})) - assertion = "A macro expander should consume spaces after control-word macro" - new Expect(r`\text{\foo }`).toParseLike(r`\text{x}`, new Settings({macros: {"\\foo": "x"}})) - assertion = "A macro expander should consume spaces after macro with \\relax" - new Expect(r`\text{\foo }`).toParseLike(r`\text{}`, new Settings({macros: {"\\foo": "\\relax"}})) - assertion = "A macro expander not should consume spaces after control-word expansion" - new Expect(r`\text{\\ }`).toParseLike(r`\text{ }`, new Settings({macros: {"\\\\": "\\relax"}})) - assertion = "A macro expander should consume spaces after \\relax" - new Expect(r`\text{\relax }`).toParseLike(r`\text{}`) - assertion = "A macro expander should consume spaces after control-word function" - new Expect(r`\text{\yen }`).toParseLike(r`\text{\yen}`) - assertion = "A macro expander should preserve spaces after control-symbol macro" - new Expect(r`\text{\% y}`).toParseLike(r`\text{x y}`, new Settings({macros: {"\\%": "x"}})) - assertion = "A macro expander should preserve spaces after control-symbol function" - new Expect(r`\text{\' }`).toParse() - assertion = "A macro expander should consume spaces between arguments" - new Expect(r`\text{\foo a 2}`).toParseLike(r`\text{a2end}`, new Settings({macros: {"\\foo": "#1#2end"}})) - new Expect(r`\text{\foo {a} {2}}`).toParseLike(r`\text{a2end}`, new Settings({macros: {"\\foo": "#1#2end"}})) - assertion = "A macro expander should allow for multiple expansion" - new Expect(r`1\foo2`).toParseLike("1aa2", new Settings({macros: { - "\\foo": "\\bar\\bar", - "\\bar": "a", - }})) - assertion = "A macro expander should allow for multiple expansion with argument" - new Expect(r`1\foo2`).toParseLike("1 2 2 2 2", new Settings({macros: { - "\\foo": "\\bar{#1}\\bar{#1}", - "\\bar": "#1#1", - }})) - assertion = "A macro expander should allow for macro argument" - new Expect(r`\foo\bar`).toParseLike("(xyz)", new Settings({macros: { - "\\foo": "(#1)", - "\\bar": "xyz", - }})) - assertion = "A macro expander should allow properly nested group for macro argument" - new Expect(r`\foo{e^{x_{12}+3}}`).toParseLike("(e^{x_{12}+3})", new Settings({macros: {"\\foo": "(#1)"}})) - - assertion = "A macro expander should delay expansion if preceded by \\expandafter" - new Expect(r`\expandafter\foo\bar`).toParseLike("x+y", new Settings({macros: { - "\\foo": "#1+#2", - "\\bar": "xy", - }})) - // \def is not expandable, i.e., \expandafter doesn't define the macro - new Expect(r`\def\foo{x}\def\bar{\def\foo{y}}\expandafter\bar\foo`).toParseLike(`x`) - - assertion = "A macro expander should not expand if preceded by \\noexpand" - // \foo is not expanded and interpreted as if its meaning were \relax - new Expect(r`\noexpand\foo y`).toParseLike(r`y`, new Settings({macros: {"\\foo": "x"}})) - new Expect(r`\expandafter\foo\noexpand\foo`).toParseLike("x", new Settings({macros: {"\\foo": "x"}})) - new Expect(r`\noexpand\frac xy`).toParseLike(`xy`) - new Expect(r`\noexpand\def\foo{xy}\foo`).toParseLike(`xy`) - - assertion = "A macro expander should allow for space macro argument (text version)" - new Expect(r`\text{\foo\bar}`).toParseLike(r`\text{( )}`, new Settings({macros: { - "\\foo": "(#1)", - "\\bar": " ", - }})) - - assertion = "A macro expander should allow for space macro argument (math version)" - new Expect(r`\foo\bar`).toParseLike("()", new Settings({macros: { - "\\foo": "(#1)", - "\\bar": " ", - }})) - - assertion = "A macro expander should allow for second argument (text version)" - new Expect(r`\text{\foo\bar\bar}`).toParseLike(r`\text{( , )}`, new Settings({macros: { - "\\foo": "(#1,#2)", - "\\bar": " ", - }})) - - assertion = "A macro expander should allow for second argument (math version)" - new Expect(r`\foo\bar\bar`).toParseLike("(,)", new Settings({macros: { - "\\foo": "(#1,#2)", - "\\bar": " ", - }})) - - assertion = "A macro expander should allow for empty macro argument" - new Expect(r`\foo\bar`).toParseLike("()", new Settings({macros: { - "\\foo": "(#1)", - "\\bar": "", - }})) - - assertion = "A macro expander should allow for space function arguments" - new Expect(r`\frac\bar\bar`).toParseLike(r`\frac{}{}`, new Settings({macros: { "\\bar": " " }})) - - assertion = "A macro expander should allow aliasing characters" - new Expect(r`x’=c`).toParseLike("x'=c", new Settings({macros: { "’": "'" }})) - - assertion = "In a macro expander, \\@firstoftwo should consume both, and avoid errors" - new Expect(r`\@firstoftwo{yes}{no}`).toParseLike("yes") - new Expect(r`\@firstoftwo{yes}{1'_2^3}`).toParseLike("yes") - - assertion = "In a macro expander, \\@ifstar should consume star but nothing else" - new Expect(r`\@ifstar{yes}{no}*!`).toParseLike("yes!") - new Expect(r`\@ifstar{yes}{no}?!`).toParseLike("no?!") - - assertion = "In a macro expander, \\@ifnextchar should not consume nonspaces" - new Expect(r`\@ifnextchar!{yes}{no}!!`).toParseLike("yes!!") - new Expect(r`\@ifnextchar!{yes}{no}?!`).toParseLike("no?!") - - assertion = "In a macro expander, \\@ifnextchar should consume spaces" - new Expect(r`\def\x#1{\@ifnextchar x{yes}{no}}\x{}x\x{} x`).toParseLike("yesxyesx") - - assertion = "In a macro expander, \\@ifstar should consume star but nothing else" - new Expect(r`\@ifstar{yes}{no}*!`).toParseLike("yes!") - new Expect(r`\@ifstar{yes}{no}?!`).toParseLike("no?!") - - assertion = "In a macro expander, \\def defines macros" - new Expect(r`\def\foo{x^2}\foo+\foo`).toParseLike(`x^2+x^2`) - new Expect(r`\def\foo{hi}\foo+\text\foo`).toParseLike(r`hi+\text{hi}`) - new Expect(r`\def\foo#1{hi #1}\text{\foo{Alice}, \foo{Bob}}`).toParseLike(r`\text{hi Alice, hi Bob}`) - new Expect(r`\def\foo#1#2{(#1,#2)}\foo 1 2+\foo 3 4`).toParseLike(r`(1, 2)+(3, 4)`) - new Expect(r`\def\foo#a{}`).toNotParse() - new Expect(r`\def\foo#1#2#3#4#5#6#7#8#9{}`).toParse() - new Expect(r`\def\foo#2{}`).toNotParse() - new Expect(r`\def\foo#1#2#3#4#5#6#7#8#9#10{}`).toNotParse() - new Expect(r`\def\foo1`).toNotParse() - new Expect(r`\def{\foo}{}`).toNotParse() - new Expect(r`\def\foo\bar`).toNotParse() - new Expect(r`\def{\foo\bar}{}`).toNotParse() - new Expect(r`\def{}{}`).toNotParse() - - assertion = "In a macro expander, \\gdef defines macros" - new Expect(r`\gdef\foo{x^2}\foo+\foo`).toParseLike(`x^2+x^2`) - new Expect(r`\gdef\foo{hi}\foo+\text\foo`).toParseLike(r`hi+\text{hi}`) - new Expect(r`\gdef\foo#1{hi #1}\text{\foo{Alice}, \foo{Bob}}`).toParseLike(r`\text{hi Alice, hi Bob}`) - new Expect(r`\gdef\foo#1#2{(#1,#2)}\foo 1 2+\foo 3 4`).toParseLike(r`(1, 2)+(3, 4)`) - new Expect(r`\gdef\foo#a{}`).toNotParse() - new Expect(r`\gdef\foo#1#2#3#4#5#6#7#8#9{}`).toParse() - new Expect(r`\gdef\foo#2{}`).toNotParse() - new Expect(r`\gdef\foo#1#2#3#4#5#6#7#8#9#10{}`).toNotParse() - new Expect(r`\gdef\foo1`).toNotParse() - new Expect(r`\gdef{\foo}{}`).toNotParse() - new Expect(r`\gdef\foo\bar`).toNotParse() - new Expect(r`\gdef{\foo\bar}{}`).toNotParse() - new Expect(r`\gdef{}{}`).toNotParse() - - assertion = "In a macro expander, \\def defines macros with delimited parameter" - new Expect(r`\def\foo|#1||{#1}\text{\foo| x y ||}`).toParseLike(r`\text{ x y }`) - new Expect(r`\def\foo#1|#2{#1+#2}\foo a 2 |34`).toParseLike(r`a2+34`) - new Expect(r`\def\foo#1#{#1}\foo1^{23}`).toParseLike(r`1^{23}`) - new Expect(r`\def\foo|{}\foo`).toNotParse() - new Expect(r`\def\foo#1|{#1}\foo1`).toNotParse() - new Expect(r`\def\foo#1|{#1}\foo1}|`).toNotParse() - - assertion = "In a macro expander, \\gdef defines macros with delimited parameter" - new Expect(r`\gdef\foo|#1||{#1}\text{\foo| x y ||}`).toParseLike(r`\text{ x y }`) - new Expect(r`\gdef\foo#1|#2{#1+#2}\foo a 2 |34`).toParseLike(r`a2+34`) - new Expect(r`\gdef\foo#1#{#1}\foo1^{23}`).toParseLike(r`1^{23}`) - new Expect(r`\gdef\foo|{}\foo`).toNotParse() - new Expect(r`\gdef\foo#1|{#1}\foo1`).toNotParse() - new Expect(r`\gdef\foo#1|{#1}\foo1}|`).toNotParse() - - assertion = "In a macro expander, \\edef should expand definition" - new Expect(r`\def\foo{a}\edef\bar{\foo}\def\foo{}\bar`).toParseLike(`a`) - // \def\noexpand\foo{} expands into \def\foo{} - new Expect(r`\def\foo{a}\edef\bar{\def\noexpand\foo{}}\foo\bar\foo`).toParseLike(r`a`) - // \foo\noexpand\foo expands into a\foo - new Expect(r`\def\foo{a}\edef\bar{\foo\noexpand\foo}\def\foo{b}\bar`).toParseLike(r`ab`) - // \foo is not defined - new Expect(r`\edef\bar{\foo}`).toNotParse(strictSettings()) - - assertion = "\\def should be handled in Parser" - new Expect(r`\gdef\foo{1}`).toParse(new Settings({maxExpand: 0})) - new Expect(r`2^\def\foo{1}2`).toNotParse() - - assertion = "\\def works locally" - new Expect("\\def\\x{1}\\x{\\def\\x{2}\\x{\\def\\x{3}\\x}\\x}\\x").toParseLike(`1{2{3}2}1`) - - assertion = "\\gdef overrides at all levels" - new Expect("\\def\\x{1}\\x{\\def\\x{2}\\x{\\gdef\\x{3}\\x}\\x}\\x").toParseLike(`1{2{3}3}3`) - new Expect("\\def\\x{1}\\x{\\def\\x{2}\\x{\\global\\def\\x{3}\\x}\\x}\\x").toParseLike(`1{2{3}3}3`) - - assertion = "\\global needs to followed by macro prefixes, \\def or \\edef" - new Expect(r`\global\def\foo{}\foo`).toParseLike("") - new Expect(r`\global\edef\foo{}\foo`).toParseLike("") - new Expect(r`\def\DEF{\def}\global\DEF\foo{}\foo`).toParseLike("") - new Expect(r`\global\global\def\foo{}\foo`).toParseLike("") - new Expect(r`\global\long\def\foo{}\foo`).toParseLike("") - new Expect(r`\global\foo`).toNotParse() - new Expect(r`\global\bar x`).toNotParse() - - assertion = "\\gdef changes settings.macros" - let macros = {}; - new Expect(r`\gdef\foo{1}`).toParse(new Settings({macros})) - new Expect(macros["\\foo"]).toBeTruthy() - - assertion = "\\def doesn't change settings.macros" - macros = {} - new Expect(r`\def\foo{1}`).toParse(new Settings({macros})) - new Expect(macros["\\foo"]).toBeFalsy() - - assertion = "In a macro expander, \\long needs to be followed by macro prefixes, \\def or \\edef" - new Expect(r`\long\def\foo{}\foo`).toParseLike("") - new Expect(r`\long\edef\foo{}\foo`).toParseLike("") - new Expect(r`\long\foo`).toNotParse() - - assertion = "In a macro expander, \\let copies the definition" - new Expect(r`\let\foo=\frac\def\frac{}\foo1a`).toParseLike(r`\frac1a`) - new Expect(r`\def\foo{1}\let\bar\foo\def\foo{2}\bar`).toParseLike(r`1`) - new Expect(r`\let\foo=\kern\edef\bar{\foo1em}\let\kern=\relax\bar`).toParseLike(r`\kern1em`) - // \foo = { (left brace) - new Expect(r`\let\foo{\sqrt\foo1}`).toParseLike(r`\sqrt{1}`) - // \equals = = (equal sign) - new Expect(r`\let\equals==a\equals b`).toParseLike(r`a=b`) - // \foo should not be expandable and not affected by \noexpand or \edef - new Expect(r`\let\foo=x\noexpand\foo`).toParseLike(r`x`) - new Expect(r`\let\foo=x\edef\bar{\foo}\def\foo{y}\bar`).toParseLike(r`y`) - - assertion = "In a macro expander, \\let should consume one optional space after equals sign" - // https://tex.stackexchange.com/questions/141166/let-foo-bar-vs-let-foo-bar-let-with-equals-sign - new Expect(r`\def\:{\let\space= }\: \text{\space}`).toParseLike(r`\text{ }`) - - assertion = "In a macro expander, \\futurelet should parse correctly" - new Expect(r`\futurelet\foo\frac1{2+\foo}`).toParseLike(r`\frac1{2+1}`) - - assertion = "In a macro expander, \\newcommand defines new macros" - new Expect(r`\newcommand\foo{x^2}\foo+\foo`).toParseLike(`x^2+x^2`, strictSettings()) - new Expect(r`\newcommand{\foo}{x^2}\foo+\foo`).toParseLike(`x^2+x^2`, strictSettings()) - // Function detection - new Expect(r`\newcommand\bar{x^2}\bar+\bar`).toNotParse() - new Expect(r`\newcommand{\bar}{x^2}\bar+\bar`).toNotParse() - // Symbol detection - new Expect(r`\newcommand\lambda{x^2}\lambda`).toNotParse() - new Expect(r`\newcommand\textdollar{x^2}\textdollar`).toNotParse() - // Macro detection - new Expect(r`\newcommand{\foo}{1}\foo\newcommand{\foo}{2}\foo`).toNotParse() - // Implicit detection - new Expect(r`\newcommand\limits{}`).toNotParse() - - assertion = "In a macro expander, \\renewcommand redefines macro" - new Expect(r`\renewcommand\foo{x^2}\foo+\foo`).toNotParse(strictSettings()) - new Expect(r`\renewcommand{\foo}{x^2}\foo+\foo`).toNotParse(strictSettings()) - new Expect(r`\renewcommand\bar{x^2}\bar+\bar`).toParseLike(r`x^2+x^2`, strictSettings()) - new Expect(r`\renewcommand{\bar}{x^2}\bar+\bar`).toParseLike(r`x^2+x^2`, strictSettings()) - new Expect(r`\newcommand{\foo}{1}\foo\renewcommand{\foo}{a}\foo`).toParseLike(r`1a`, strictSettings()) - - assertion = "In a macro expander, \\providecommand (re)defines macros" - new Expect(r`\providecommand\foo{x^2}\foo+\foo`).toParseLike(r`x^2+x^2`, strictSettings()) - new Expect(r`\providecommand{\foo}{x^2}\foo+\foo`).toParseLike(r`x^2+x^2`, strictSettings()) - new Expect(r`\providecommand\bar{x^2}\bar+\bar`).toParseLike(r`x^2+x^2`, strictSettings()) - new Expect(r`\providecommand{\bar}{x^2}\bar+\bar`).toParseLike(r`x^2+x^2`, strictSettings()) - new Expect(r`\newcommand{\foo}{1}\foo\providecommand{\foo}{b}\foo`).toParseLike(r`1b`, strictSettings()) - new Expect(r`\providecommand{\foo}{1}\foo\renewcommand{\foo}{b}\foo`).toParseLike(r`1b`, strictSettings()) - new Expect(r`\providecommand{\foo}{1}\foo\providecommand{\foo}{b}\foo`).toParseLike(r`1b`, strictSettings()) - - assertion = "In a macro expander, \\newcommand accepts number of arguments" - new Expect(r`\newcommand\foo[1]{#1^2}\foo x+\foo{y}`).toParseLike(r`x^2+y^2`, strictSettings()) - new Expect(r`\newcommand\foo[9]{#1^2}\foo abcdefghi`).toParseLike(r`a^2`, strictSettings()) - new Expect(r`\newcommand\foo[x]{}`).toNotParse(strictSettings()) - new Expect(r`\newcommand\foo[1.5]{}`).toNotParse(strictSettings()) - - // This may change in the future, if we support the extra features of \hspace. - assertion = "A macro expander should treat \\hspace, \\hskip like \\kern" - new Expect(r`\hspace{1em}`).toParseLike(r`\kern1em`) - new Expect(r`\hskip{1em}`).toParseLike(r`\kern1em`) - - assertion = "A macro expander should expand \\limsup and \\liminf as expected" - new Expect(r`\limsup`).toParseLike(r`\operatorname*{lim\,sup}`) - new Expect(r`\liminf`).toParseLike(r`\operatorname*{lim\,inf}`) - - assertion = "A macro expander should expand AMS log-like symbols as expected" - new Expect(r`\injlim`).toParseLike(r`\operatorname*{inj\,lim}`) - new Expect(r`\projlim`).toParseLike(r`\operatorname*{proj\,lim}`) - new Expect(r`\varlimsup`).toParseLike(r`\operatorname*{\overline{\text{lim}}}`) - new Expect(r`\varliminf`).toParseLike(r`\operatorname*{\underline{\text{lim}}}`) - new Expect(r`\varinjlim`).toParseLike(r`\operatorname*{\underrightarrow{\text{lim}}}`) - new Expect(r`\varinjlim`).toParseLike(r`\operatorname*{\underrightarrow{\text{lim}}}`) - new Expect(r`\varprojlim`).toParseLike(r`\operatorname*{\underleftarrow{\text{lim}}}`) - - assertion = "A macro expander should expand \\plim and \\argmin and \\argmax as expected" - new Expect(r`\plim`).toParseLike(r`\operatorname*{plim}`) - new Expect(r`\argmin`).toParseLike(r`\operatorname*{arg\,min}`) - new Expect(r`\argmax`).toParseLike(r`\operatorname*{arg\,max}`) - - assertion = "A macro expander should expand \\bra and \ket as expected" - new Expect(r`\bra{\phi}`).toParseLike(r`\mathinner{\langle{\phi}|}`) - new Expect(r`\ket{\psi}`).toParseLike(r`\mathinner{|{\psi}\rangle}`) - new Expect(r`\braket{\phi|\psi}`).toParseLike(r`\mathinner{\langle{\phi|\psi}\rangle}`) - new Expect(r`\Bra{\phi}`).toParseLike(r`\left\langle\phi\right|`) - new Expect(r`\Ket{\psi}`).toParseLike(r`\left|\psi\right\rangle`) - new Expect(temml.renderToString(r`\Set{\color{red}222|11111}`)).toContain('222|') - new Expect(temml.renderToString(r`\Set{a\over b}`)).toContain('ab') - new Expect(temml.renderToString(r`\Set{a\over b | c}`)).toContain('ab') - new Expect(temml.renderToString(r`\Set{a\over b || c}`)).toContain('‖') - - assertion = "Macro arguments do not generate groups" - new Expect("\\def\\x{a}\\x\\def\\foo#1{#1}\\foo{\\x\\def\\x{b}\\x}\\x").toParseLike(`aabb`) - - assertion = "\\gdef or \\xdef should produce an error" - new Expect(temml.renderToString("\gdef\foo{Nope}")).toContain("#b22222") // color of error message - new Expect(temml.renderToString("\xdef\foo{Nope}")).toContain("#b22222") - - assertion = "A preamble should capture viable macros and definecolor." - macros = temml.definePreamble(r`\definecolor{sortaGreen}{RGB}{128,128,0}`) - new Expect(r`\color{sortaGreen} F=ma`).toParse(new Settings({macros})) - macros = temml.definePreamble(r`\def\foo{x^2}`) - markup = temml.renderToString(r`\foo + \foo`, new Settings({macros})) - new Expect(markup).toContain(``) - macros = temml.definePreamble(r`\newcommand\d[0]{\operatorname{d}\!}`) - markup = temml.renderToString(r`\d x`, new Settings({macros})) - new Expect(markup).toContain(``) - - assertion = "\\textbf arguments do generate groups" - new Expect("\\def\\x{a}\\x\\textbf{\\x\\def\\x{b}\\x}\\x").toParseLike(r`a\textbf{ab}a`) - - assertion = "\\sqrt optional arguments generate groups" - new Expect("\\def\\x{a}\\def\\y{a}\\x\\y" + "\\sqrt[\\def\\x{b}\\x]{\\def\\y{b}\\y}\\x\\y").toParseLike(r`aa\sqrt[b]{b}aa`) - - assertion = "Array cells generate groups" - new Expect(r`\def\x{a}\begin{matrix}\x&\def\x{b}\x&\x\end{matrix}\x`).toParseLike(r`\begin{matrix}a&b&a\end{matrix}a`) - new Expect(r`\def\x{1}\begin{matrix}\def\x{2}\x&\x\end{matrix}\x`).toParseLike(r`\begin{matrix}2&1\end{matrix}1`) - - assertion = "\\char produces literal characters" - new Expect("\\char`a").toParseLike("\\char`\\a"); - new Expect("\\char`\\%").toParseLike("\\char37"); - new Expect("\\char`\\%").toParseLike("\\char'45"); - new Expect("\\char`\\%").toParseLike('\\char"25'); - new Expect("\\char").toNotParse(); - new Expect("\\char`").toNotParse(); - new Expect("\\char'").toNotParse(); - new Expect('\\char"').toNotParse(); - new Expect("\\char'a").toNotParse(); - new Expect('\\char"g').toNotParse(); - new Expect('\\char"g').toNotParse(); - - assertion = "Unicode private area characters should build" - new Expect(r`\gvertneqq\lvertneqq\ngeqq\ngeqslant\nleqq`).toParse() - new Expect(r`\nleqslant\nshortmid\nshortparallel\varsubsetneq`).toParse() - new Expect(r`\varsubsetneqq\varsupsetneq\varsupsetneqq`).toParse() - new Expect(r`\gvertneqq\lvertneqq\ngeqq\ngeqslant\nleqq`).toBuild() - new Expect(r`\nleqslant\nshortmid\nshortparallel\varsubsetneq`).toBuild() - new Expect(r`\varsubsetneqq\varsupsetneq\varsupsetneqq`).toBuild() - - assertion = "\\overset and \\underset should work" - new Expect(r`\overset{f}{\rightarrow} Y`).toParse() - new Expect("\\underset{f}{\\rightarrow} Y").toParse() - new Expect(r`\overset{f}{\rightarrow} Y`).toBuild() - new Expect("\\underset{f}{\\rightarrow} Y").toBuild() - - assertion = "\\iff, \\implies, and \\impliedby should work" - new Expect(r`X \iff Y`).toParse() - new Expect(r`X \implies Y`).toParse() - new Expect(r`X \impliedby Y`).toParse() - new Expect(r`X \iff Y`).toBuild() - new Expect(r`X \implies Y`).toBuild() - new Expect(r`X \impliedby Y`).toBuild() - - assertion = "\\tag support should fail outside display mode" - new Expect(r`\tag{hi}x+y`).toNotParse() - assertion = "\\tag support should fail with multiple tags" - new Expect(r`\tag{1}\tag{2}x+y`).toNotParse(displayMode()) - assertion = "\\tag should build" - new Expect(r`\tag{hi}x+y`).toParse(displayMode()); - new Expect(r`\tag{hi}x+y`).toBuild(displayMode()); - assertion = "\\tag support should ignore location of \\tag" - new Expect(r`\tag{hi}x+y`).toParseLike(r`x+y\tag{hi}`, displayMode()); - assertion = "\\tag support should handle \\tag* like \\tag" - new Expect(r`\tag{hi}x+y`).toParseLike(r`\tag*{({hi})}x+y`, displayMode()); - assertion = "\\tag support should add tml-tageqn class" - new Expect(temml.renderToString(r`\tag{hi}x+y`, displayMode())).toContain("tml-tageqn") - assertion = "leqno rendering option should differ from default" - new Expect(temml.renderToString(r`\tag{hi}x+y`, new Settings({ displayMode: true, leqno: true }))).toContain('class="tml-left"') - new Expect(temml.renderToString(r`\tag{hi}x+y`,displayMode())).toNotContain("rspace") - - assertion = "\\@binrel automatic bin/rel/ord should generate proper class" - new Expect(parse("L\\@binrel+xR")[1].mclass).toBe("mbin") - new Expect(parse("L\\@binrel=xR")[1].mclass).toBe("mrel") - new Expect(parse("L\\@binrel xxR")[1].mclass).toBe("mord") - new Expect(parse("L\\@binrel=xR")[1].mclass).toBe("mrel") - new Expect(parse("L\\@binrel{+}{x}R")[1].mclass).toBe("mbin") - new Expect(parse("L\\@binrel{=}{x}R")[1].mclass).toBe("mrel") - new Expect(parse("L\\@binrel{z}{x}R")[1].mclass).toBe("mord") - assertion = "\\@binrel automatic bin/rel/ord should base on just first character in group" - new Expect(parse("L\\@binrel{+x}xR")[1].mclass).toBe("mbin") - new Expect(parse("L\\@binrel{=x}xR")[1].mclass).toBe("mrel") - new Expect(parse("L\\@binrel{xx}xR")[1].mclass).toBe("mord") - - assertion = "A parser taking String objects should not fail on an empty String object" - new Expect(new String("")).toParse() - new Expect(new String("")).toBuild() - assertion = "A parser taking String objects should parse the same as a regular string" - new Expect(new String("xy")).toParseLike(`xy`) - new Expect(new String(r`\div`)).toParseLike(r`\div`) - new Expect(new String(r`\frac 1 2`)).toParseLike(r`\frac 1 2`) - - assertion = "Unicode accents should parse Latin-1 letters in math mode" - new Expect(`ÀÁÂÃÄÅÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝàáâãäåèéêëìíîïñòóôõöùúûüýÿ`).toBuildLike( - r`\grave A\acute A\hat A\tilde A\ddot A\mathring A` + - r`\grave E\acute E\hat E\ddot E` + - r`\grave I\acute I\hat I\ddot I` + - r`\tilde N` + - r`\grave O\acute O\hat O\tilde O\ddot O` + - r`\grave U\acute U\hat U\ddot U` + - r`\acute Y` + - r`\grave a\acute a\hat a\tilde a\ddot a\mathring a` + - r`\grave e\acute e\hat e\ddot e` + - r`\grave ı\acute ı\hat ı\ddot ı` + - r`\tilde n` + - r`\grave o\acute o\hat o\tilde o\ddot o` + - r`\grave u\acute u\hat u\ddot u` + - r`\acute y\ddot y` - ) - - assertion = "Unicode accents should parse Latin-1 letters in text mode" - new Expect(`\\text{ÀÁÂÃÄÅÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝàáâãäåèéêëìíîïñòóôõöùúûüýÿ}`).toBuildLike( - r`\text{\`A\'A\^A\~A\"A\r A` + - r`\`E\'E\^E\"E` + - r`\`I\'I\^I\"I` + - r`\~N` + - r`\`O\'O\^O\~O\"O` + - r`\`U\'U\^U\"U` + - r`\'Y` + - r`\`a\'a\^a\~a\"a\r a` + - r`\`e\'e\^e\"e` + - r`\`ı\'ı\^ı\"ı` + - r`\~n` + - r`\`o\'o\^o\~o\"o` + - r`\`u\'u\^u\"u` + - r`\'y\"y}` - ) - - assertion = "Unicode accents should parse combining characters" - new Expect("A\u0301C\u0301").toBuildLike(r`Á\acute C`); - new Expect("\\text{A\u0301C\u0301}").toBuildLike(r`\text{Á\'C}`, strictSettings()); - - assertion = "Unicode accents should build multi-accented characters" - new Expect(`ấā́ắ\text{ấā́ắ}`).toParse() - new Expect(`ấā́ắ\text{ấā́ắ}`).toBuild() - - assertion = "Unicode accents should parse accented i's and j's" - new Expect(`íȷ́`).toBuildLike(r`\acute ı\acute ȷ`); - new Expect(`ấā́ắ\text{ấā́ắ}`).toParse(); - new Expect(`ấā́ắ\text{ấā́ắ}`).toBuild(); - - assertion = "Temml should build Unicode relations" - new Expect(`∈∋∝∼∽≂≃≅≈≊≍≎≏≐≑≒≓≖⩵≗≜≡≤≥≦≧≪≫≬≳≷≺≻≼≽≾≿∴∵∣≔≕⩴⋘⋙⟂⊨∌⊶⊷⊂⊃⊆⊇⊏⊐⊑⊒⊢⊣⊩⊪⊸⋈⋍⋐⋑⋔⋛⋞⋟⌢⌣⩾⪆⪌⪕⪖⪯⪰⪷⪸⫅⫆≘≙≚≛≝≞≟≲⩽⪅≶⋚⪋`).toParse() - new Expect(`∈∋∝∼∽≂≃≅≈≊≍≎≏≐≑≒≓≖⩵≗≜≡≤≥≦≧≪≫≬≳≷≺≻≼≽≾≿∴∵∣≔≕⩴⋘⋙⟂⊨∌⊶⊷⊂⊃⊆⊇⊏⊐⊑⊒⊢⊣⊩⊪⊸⋈⋍⋐⋑⋔⋛⋞⋟⌢⌣⩾⪆⪌⪕⪖⪯⪰⪷⪸⫅⫆≘≙≚≛≝≞≟≲⩽⪅≶⋚⪋`).toBuild() - assertion = "Temml should build Unicode negated relations" - new Expect(`∉∤∦≁≆≠≨≩≮≯≰≱⊀⊁⊈⊉⊊⊋⊬⊭⊮⊯⋠⋡⋦⋧⋨⋩⋬⋭⪇⪈⪉⪊⪵⪶⪹⪺⫋⫌`).toParse() - new Expect(`∉∤∦≁≆≠≨≩≮≯≰≱⊀⊁⊈⊉⊊⊋⊬⊭⊮⊯⋠⋡⋦⋧⋨⋩⋬⋭⪇⪈⪉⪊⪵⪶⪹⪺⫋⫌`).toBuild() - assertion = "Temml should build Unicode big operators" - new Expect(`∏∐∑∫∬∭∮⋀⋁⋂⋃⨀⨁⨂⨄⨆`).toParse() - new Expect(`∏∐∑∫∬∭∮⋀⋁⋂⋃⨀⨁⨂⨄⨆`).toBuild() - assertion = "Temml should build Unicode symbols" - new Expect(`£¥ℂℍℑℎℓℕ℘ℙℚℜℝℤℲℵðℶℷℸ⅁∀∁∂∃∇∞∠∡∢♠♡♢♣♭♮♯✓°¬‼⋮\u00B7\u00A9\\text{£¥ℂℍℎ\u00A9\u00AE\uFE0F}`).toParse() - new Expect(`£¥ℂℍℑℎℓℕ℘ℙℚℜℝℤℲℵðℶℷℸ⅁∀∁∂∃∇∞∠∡∢♠♡♢♣♭♮♯✓°¬‼⋮\u00B7\u00A9\\text{£¥ℂℍℎ\u00A9\u00AE\uFE0F}`).toBuild() - new Expect(temml.renderToString("ℓ")).toContain("ℓ") - assertion = "Temml should build capital Greek letters" - new Expect(`\u0391\u0392\u0395\u0396\u0397\u0399\u039A\u039C\u039D\u039F\u03A1\u03A4\u03A7\u03DD`).toParse(strictSettings()) - new Expect(`\u0391\u0392\u0395\u0396\u0397\u0399\u039A\u039C\u039D\u039F\u03A1\u03A4\u03A7\u03DD`).toBuild(strictSettings()) - assertion = "Temml should build Unicode arrows" - new Expect(`←↑→↓↔↕↖↗↘↙↚↛↞↠↢↣↦↩↪↫↬↭↮↰↱↶↷↼↽↾↾↿⇀⇁⇂⇃⇄⇆⇇⇈⇉⇊⇋⇌⇍⇎⇏⇐⇑⇒⇓⇔⇕⇚⇛⇝⟵⟶⟷⟸⟹⟺⟼`).toParse() - new Expect(`←↑→↓↔↕↖↗↘↙↚↛↞↠↢↣↦↩↪↫↬↭↮↰↱↶↷↼↽↾↾↿⇀⇁⇂⇃⇄⇆⇇⇈⇉⇊⇋⇌⇍⇎⇏⇐⇑⇒⇓⇔⇕⇚⇛⇝⟵⟶⟷⟸⟹⟺⟼`).toBuild() - assertion = "Temml should build Unicode binary operators" - new Expect(`±×÷∓∔∧∨∩∪≀⊎⊓⊔⊕⊖⊗⊘⊙⊚⊛⊝◯⊞⊟⊠⊡⊺⊻⊼⋇⋉⋊⋋⋌⋎⋏⋒⋓⩞\u22C5\u2216\u2218\u2219`).toParse() - new Expect(`±×÷∓∔∧∨∩∪≀⊎⊓⊔⊕⊖⊗⊘⊙⊚⊛⊝◯⊞⊟⊠⊡⊺⊻⊼⋇⋉⋊⋋⋌⋎⋏⋒⋓⩞\u22C5\u2216\u2218\u2219`).toBuild() - assertion = "Temml should build Unicode delimiters" - new Expect("\\left\u230A\\frac{a}{b}\\right\u230B").toParse() - new Expect("\\left\u2308\\frac{a}{b}\\right\u2308").toParse() - new Expect("\\left\u27ee\\frac{a}{b}\\right\u27ef").toParse() - new Expect("\\left\u27e8\\frac{a}{b}\\right\u27e9").toParse() - new Expect("\\left\u23b0\\frac{a}{b}\\right\u23b1").toParse() - new Expect(`┌x┐ └x┘`).toParse() - new Expect("\u231Cx\u231D \u231Ex\u231F").toParse() - new Expect("\u27E6x\u27E7").toParse() - new Expect("\\llbracket \\rrbracket").toParse() - new Expect("\\lBrace \\rBrace").toParse() - new Expect("\\left\u230A\\frac{a}{b}\\right\u230B").toBuild() - new Expect("\\left\u2308\\frac{a}{b}\\right\u2308").toBuild() - new Expect("\\left\u27ee\\frac{a}{b}\\right\u27ef").toBuild() - new Expect("\\left\u27e8\\frac{a}{b}\\right\u27e9").toBuild() - new Expect("\\left\u23b0\\frac{a}{b}\\right\u23b1").toBuild() - new Expect(`┌x┐ └x┘`).toBuild() - new Expect("\u231Cx\u231D \u231Ex\u231F").toBuild() - new Expect("\u27E6x\u27E7").toBuild() - new Expect("\\llbracket \\rrbracket").toBuild() - new Expect("\\lBrace \\rBrace").toBuild() - assertion = "Temml should build some Unicode surrogate pairs" - let wideCharStr = ""; - wideCharStr += String.fromCharCode(0xD835, 0xDC00); // bold A - wideCharStr += String.fromCharCode(0xD835, 0xDC68); // bold italic A - wideCharStr += String.fromCharCode(0xD835, 0xDD04); // Fraktur A - wideCharStr += String.fromCharCode(0xD835, 0xDD38); // double-struck - wideCharStr += String.fromCharCode(0xD835, 0xDC9C); // script A - wideCharStr += String.fromCharCode(0xD835, 0xDDA0); // sans serif A - wideCharStr += String.fromCharCode(0xD835, 0xDDD4); // bold sans A - wideCharStr += String.fromCharCode(0xD835, 0xDE08); // italic sans A - wideCharStr += String.fromCharCode(0xD835, 0xDE70); // monospace A - wideCharStr += String.fromCharCode(0xD835, 0xDFCE); // bold zero - wideCharStr += String.fromCharCode(0xD835, 0xDFE2); // sans serif zero - wideCharStr += String.fromCharCode(0xD835, 0xDFEC); // bold sans zero - wideCharStr += String.fromCharCode(0xD835, 0xDFF6); // monospace zero - new Expect(wideCharStr).toParse(strictSettings()); - new Expect(wideCharStr).toBuild(strictSettings()); - let wideCharText = "\text{"; - wideCharText += String.fromCharCode(0xD835, 0xDC00); // bold A - wideCharText += String.fromCharCode(0xD835, 0xDC68); // bold italic A - wideCharText += String.fromCharCode(0xD835, 0xDD04); // Fraktur A - wideCharText += String.fromCharCode(0xD835, 0xDD38); // double-struck - wideCharText += String.fromCharCode(0xD835, 0xDC9C); // script A - wideCharText += String.fromCharCode(0xD835, 0xDDA0); // sans serif A - wideCharText += String.fromCharCode(0xD835, 0xDDD4); // bold sans A - wideCharText += String.fromCharCode(0xD835, 0xDE08); // italic sans A - wideCharText += String.fromCharCode(0xD835, 0xDE70); // monospace A - wideCharText += String.fromCharCode(0xD835, 0xDFCE); // bold zero - wideCharText += String.fromCharCode(0xD835, 0xDFE2); // sans serif zero - wideCharText += String.fromCharCode(0xD835, 0xDFEC); // bold sans zero - wideCharText += String.fromCharCode(0xD835, 0xDFF6); // monospace zero - wideCharText += "}"; - new Expect(wideCharText).toParse(strictSettings()); - new Expect(wideCharText).toBuild(strictSettings()); - assertion = "Unicode script characters should parse correctly." - wideCharText = String.fromCharCode(0xD835, 0xdcaa); // Script O - markup = temml.renderToString(wideCharText) - new Expect(markup).toContain('class="mathcal"') - wideCharText = String.fromCharCode(0xD835, 0xdcaa, 0xfe01); // Trailing U_FE01 per Unicode 14 - markup = temml.renderToString(wideCharText) - new Expect(markup).toContain('class="mathscr"') - - assertion = "The maxSize setting should clamp size when set" - const rule = r`\rule{999em}{999em}` - markup = temml.renderToString(rule, new Settings({ maxSize: [5, 80] })) - new Expect(markup).toContain(`width="5em"`) - new Expect(markup).toContain(`height="5em"`) - assertion = "The maxSize setting should not clamp size when not set" - markup = temml.renderToString(rule) - new Expect(markup).toNotContain(`width="5em"`) - new Expect(markup).toNotContain(`height="5em"`) - assertion = "The maxSize setting should make zero-width rules if a negative maxSize is passed" - markup = temml.renderToString(rule, new Settings({ maxSize: [-5, -80] })) - new Expect(markup).toContain(`width="0em"`) - new Expect(markup).toContain(`height="0em"`) - - assertion = "The maxExpand setting should prevent expansion" - new Expect(r`\def\foo{1}\foo`).toParse() - new Expect(r`\def\foo{1}\foo`).toBuild() - new Expect(r`\def\foo{1}\foo`).toParse(new Settings({maxExpand: 1})) - new Expect(r`\def\foo{1}\foo`).toNotParse(new Settings({maxExpand: 0})) - assertion = "The maxExpand setting should prevent infinite loops" - new Expect(r`\def\foo{\foo}\foo`).toNotParse(new Settings({maxExpand: 10})) - new Expect(r`\edef0{x}\edef0{00}\edef0{00}\edef0{00}\edef0{00}`).toNotParse(new Settings({maxExpand: 10})) - - assertion = "The \\mathchoice function should render as if there is nothing other in display math" - const cmd = r`\sum_{k = 0}^{\infty} x^k` - new Expect(`\\displaystyle\\mathchoice{${cmd}}{T}{S}{SS}`).toBuildLike(`\\displaystyle${cmd}`) - assertion = "The \\mathchoice function should render as if there is nothing other in text" - new Expect(`\\textstyle\\mathchoice{D}{${cmd}}{S}{SS}`).toBuildLike(`\\textstyle${cmd}`) - assertion = "The \\mathchoice function should render as if there is nothing other in scriptstyle" - new Expect(`\\scriptstyle\\mathchoice{D}{T}{${cmd}}{SS}`).toBuildLike(`\\scriptstyle${cmd}`) - assertion = "The \\mathchoice function should render as if there is nothing other in scriptscriptstyle" - new Expect(`\\scriptscriptstyle\\mathchoice{D}{T}{S}{${cmd}}`).toBuildLike(`\\scriptscriptstyle${cmd}`) - - assertion = "Newlines via \\\\ and \\newline should build \\\\ without the optional argument and \\newline the same" - new Expect(r`hello \\ world`).toBuildLike(r`hello \newline world`) - assertion = "Newlines via \\\\ and \\newline should not allow \\newline to scan for an optional size argument" - new Expect(r`hello \newline[w]orld`).toParse() - new Expect(r`hello \newline[w]orld`).toBuild() - assertion = "Newlines via \\\\ and \\newline should not allow \\cr at top level" - new Expect(temml.renderToString(r`hello \cr world`)).toContain("#b22222") // color of error message - assertion = "Newlines via \\\\ and \\newline: \\\\ causes newline, even after mrel and mop" - markup = temml.renderToString(r`M = \\ a + \\ b \\ c`) - new Expect(markup).toMatch(/=.+mo linebreak.+\+.+mo linebreak.+b.+mo linebreak/) - assertion = "Newlines should cause left-justified lines." - markup = temml.renderToString(r`a + b \\ c + d`) - new Expect([...markup.matchAll(/text-align:left/g)].length).toBe(2) - - assertion = "Symbols should build" - new Expect(r`\text{\i\j}`).toParse(strictSettings()) - new Expect(r`A\;B\,C\nobreakspace \text{A\;B\,C\nobreakspace}`).toParse(strictSettings()) - new Expect(r`\standardstate`).toParse(strictSettings()) - new Expect(r`\text{\i\j}`).toBuild(strictSettings()) - new Expect(r`A\;B\,C\nobreakspace \text{A\;B\,C\nobreakspace}`).toBuild(strictSettings()) - new Expect(r`\standardstate`).toBuild(strictSettings()) - new Expect(r`\text{\ae\AE\oe\OE\o\O\ss}`).toBuildLike(r`\text{æÆœŒøØß}`, strictSettings()) - - assertion = "\\AA should render upright in text mode and italic in math mode" - new Expect(temml.renderToString(r`\text{\AA}`)).toContain("Å") - new Expect(temml.renderToString(r`\AA`)).toContain("A") - - assertion = "Settings should allow unicode text when not strict" - new Expect(`é`).toParse() - new Expect(`試`).toParse() - - assertion = "Settings should forbid math-mode unicode text when strict" - new Expect(`é`).toNotParse(strictSettings()) - new Expect(`試`).toNotParse(strictSettings()); - - assertion = "Unicode characters inside \\text{} should parse" - new Expect(`\text{é}`).toParse() - new Expect(`\text{試}`).toParse() - - assertion = "Line-wrapping should work" - const wrapExpression = r`x = a \textcolor{blue}{+ a + a} = b + b + b`; - new Expect(wrapExpression).toParse() - new Expect(wrapExpression).toBuild(); - new Expect(wrapExpression).toBuild(wrapSettings("none")); - new Expect(wrapExpression).toBuild(wrapSettings("tex")); - new Expect(wrapExpression).toBuild(wrapSettings("=")); - // Line wrapping works by creating a series of elements. - // We check for regression by counting the number of elements. - new Expect(build(wrapExpression, wrapSettings("tex"))[0].children.length).toBe(7) - new Expect(build(wrapExpression, wrapSettings("="))[0].children.length).toBe(2) - new Expect(build(r`x^{\textcolor{red}{-yz}}`)[0].children.length).toBe(2) - - console.log("Number of tests: " + numTests) - console.log("Number of failures: " + numFailures) -} - -test() diff --git a/test/wiki-tests.md b/test/wiki-tests.md deleted file mode 100644 index 7fbfad90..00000000 --- a/test/wiki-tests.md +++ /dev/null @@ -1,945 +0,0 @@ - - - - - - Temml Wiki Tests - - - - - - - - -# Wiki Test - -Rows 1 thru 261 on this page reproduce the math examples from \ -https://en.wikipedia.org/wiki/Help:Displaying\_a\_formula - -A few of the functions on this page require Temml’s _texvc_ extension. - -
    - -+-----+--------------------------------------------+------------------------------------------------+ -| | Source | Temml | -+=====+============================================+================================================+ -| 1 | \alpha | $\alpha$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 2 | f(x) = x^2 | $f(x) = x^2$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 3 | \\{1,e,\pi\\} | $\{1,e,\pi\}$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 4 | |z + 1| \leq 2 | $|z + 1| \leq 2$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 5 | `\# \$ \% \wedge \& \_ \{ \} \sim` \ | $\# \$ \% \wedge \& \_ \{ \} \sim | -| | `\backslash` | \backslash$ | -+-----+--------------------------------------------+------------------------------------------------+ -| **Accents** | -+-----+--------------------------------------------+------------------------------------------------+ -| 6 | \dot{a}, \ddot{a}, \acute{a}, \grave{a} | $\dot{a}, \ddot{a}, \acute{a}, \grave{a}$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 7 | \dot{a}, \ddot{a}, \acute{a}, \grave{a} | $\dot{a}, \ddot{a}, \acute{a}, \grave{a}$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 8 | \check{a}, \breve{a}, \tilde{a}, \bar{a} | $\check{a}, \breve{a}, \tilde{a}, \bar{a}$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 9 | \hat{a}, \widehat{a}, \vec{a} | $\hat{a}, \widehat{a}, \vec{a}$ | -+-----+--------------------------------------------+------------------------------------------------+ -| **Functions** | -+-----+--------------------------------------------+------------------------------------------------+ -| 10 | \exp_a b = a^b, \exp b = e^b, 10^m | $\exp_a b = a^b, \exp b = e^b, 10^m$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 11 | \ln c, \lg d = \log e, \log_{10} f | $\ln c, \lg d = \log e, \log_{10} f$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 12 | \sin a, \cos b, \tan c, \cot d, \sec e, \ | $\sin a, \cos b, \tan c, \cot d, \sec e, | -| | \csc f | \csc f$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 13 | \arcsin h, \arccos i, \arctan j | $\arcsin h, \arccos i, \arctan j$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 14 | \sinh k, \cosh l, \tanh m, \coth n | $\sinh k, \cosh l, \tanh m, \coth n$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 15 | \operatorname{sh}k, \operatorname{ch}l, \ | $\operatorname{sh}k, \operatorname{ch}l, | -| | \operatorname{th}m, \operatorname{coth}n | \operatorname{th}m, \operatorname{coth}n$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 16 | \sgn r, \left\vert s \right\vert | $\sgn r, \left\vert s \right\vert$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 17 | \min(x,y), \max(x,y) | $\min(x,y), \max(x,y)$ | -+-----+--------------------------------------------+------------------------------------------------+ -| **Bounds** | -+-----+--------------------------------------------+------------------------------------------------+ -| 18 | \min x, \max y, \inf s, \sup t | $\min x, \max y, \inf s, \sup t$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 19 | \lim u, \liminf v, \limsup w | $\lim u, \liminf v, \limsup w$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 20 | \dim p, \deg q, \det m, \ker\phi | $\dim p, \deg q, \det m, \ker\phi$ | -+-----+--------------------------------------------+------------------------------------------------+ -| **Projections** | -+-----+--------------------------------------------+------------------------------------------------+ -| 21 | \Pr j, \hom l, \lVert z \rVert, \arg z | $\Pr j, \hom l, \lVert z \rVert, \arg z$ | -+-----+--------------------------------------------+------------------------------------------------+ -| **Differentials and derivatives** | -+-----+--------------------------------------------+------------------------------------------------+ -| 22 | dt, \mathrm{d}t, \partial t, \nabla\psi | $dt, \mathrm{d}t, \partial t, \nabla\psi$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 23 | dy/dx, \mathrm{d}y/\mathrm{d}x, \ | $dy/dx, \mathrm{d}y/\mathrm{d}x, | -| | \frac{dy}{dx}, \ | \frac{dy}{dx}, | -| | \frac{\mathrm{d}y}{\mathrm{d}x}, \ | \frac{\mathrm{d}y}{\mathrm{d}x}, | -| | \frac{\partial^2}\ | \frac{\partial^2} | -| | {\partial x\_1\partial x\_2}y | {\partial x_1\partial x_2}y$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 24 | \prime, \backprime, f^\prime, f', f'', \ | $\prime, \backprime, f^\prime, f', f'', | -| | f^{(3)}, \dot y, \ddot y | f^{(3)}, \dot y, \ddot y$ | -+-----+--------------------------------------------+------------------------------------------------+ -| **Letter-like symbols or constants** | -+-----+--------------------------------------------+------------------------------------------------+ -| 25 | \infty, \aleph, \complement,\backepsilon,\ | $\infty, \aleph, \complement,\backepsilon, | -| | \eth, \Finv, \hbar | \eth, \Finv, \hbar$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 26 | \Im, \imath, \jmath, \Bbbk, \ell, \mho, \ | $\Im, \imath, \jmath, \Bbbk, \ell, \mho, | -| | \wp, \Re, \circledS, \S, \P, \AA | \wp, \Re, \circledS, \S, \P, \AA$ | -+-----+--------------------------------------------+------------------------------------------------+ -| **Modular arithmetic** | -+-----+--------------------------------------------+------------------------------------------------+ -| 27 | s_k \equiv 0 \pmod{m} | $s_k \equiv 0 \pmod{m}$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 28 | a \bmod b | $a \bmod b$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 29 | \gcd(m, n), \operatorname{lcm}(m, n) | $\gcd(m, n), \operatorname{lcm}(m, n)$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 30 | \mid, \nmid, \shortmid, \nshortmid | $\mid, \nmid, \shortmid, \nshortmid$ | -+-----+--------------------------------------------+------------------------------------------------+ -| **Radicals** | -+-----+--------------------------------------------+------------------------------------------------+ -| 31 | \surd, \sqrt{2}, \sqrt[n]{2}, \ | $\surd, \sqrt{2}, \sqrt[n]{2}, | -| | \sqrt[3]{\frac{x^3+y^3}{2}} | \sqrt[3]{\frac{x^3+y^3}{2}}$ | -+-----+--------------------------------------------+------------------------------------------------+ -| **Operators** | -+-----+--------------------------------------------+------------------------------------------------+ -| 32 | +, -, \pm, \mp, \dotplus | $+, -, \pm, \mp, \dotplus$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 33 | \times, \div, \divideontimes, /,\backslash | $\times, \div, \divideontimes, /, \backslash$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 34 | \cdot, * \ast, \star, \circ, \bullet | $\cdot, * \ast, \star, \circ, \bullet$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 35 | \boxplus, \boxminus, \boxtimes, \boxdot | $\boxplus, \boxminus, \boxtimes, \boxdot$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 36 | \oplus, \ominus, \otimes, \oslash, \odot | $\oplus, \ominus, \otimes, \oslash, \odot$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 37 | \circleddash, \circledcirc, \circledast | $\circleddash, \circledcirc, \circledast$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 38 | \bigoplus, \bigotimes, \bigodot | $\bigoplus, \bigotimes, \bigodot$ | -+-----+--------------------------------------------+------------------------------------------------+ -| **Sets** | -+-----+--------------------------------------------+------------------------------------------------+ -| 39 | \{ \}, \O \empty \emptyset, \varnothing | $\{ \}, \O \empty \emptyset, \varnothing$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 40 | \in, \notin \not\in, \ni, \not\ni | $\in, \notin \not\in, \ni, \not\ni$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 41 | \cap, \Cap, \sqcap, \bigcap | $\cap, \Cap, \sqcap, \bigcap$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 42 | \cup, \Cup, \sqcup, \bigcup, \bigsqcup, \ | $\cup, \Cup, \sqcup, \bigcup, \bigsqcup, | -| | \uplus, \biguplus | \uplus, \biguplus$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 43 | \setminus, \smallsetminus, \times | $\setminus, \smallsetminus, \times$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 44 | \subset, \Subset, \sqsubset | $\subset, \Subset, \sqsubset$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 45 | \supset, \Supset, \sqsupset | $\supset, \Supset, \sqsupset$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 46 | \subseteq, \nsubseteq, \subsetneq, \ | $\subseteq, \nsubseteq, \subsetneq, | -| | \varsubsetneq, \sqsubseteq | \varsubsetneq, \sqsubseteq$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 47 | \supseteq, \nsupseteq, \supsetneq, \ | $\supseteq, \nsupseteq, \supsetneq, | -| | \varsupsetneq, \sqsupseteq | \varsupsetneq, \sqsupseteq$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 48 | \subseteqq, \nsubseteqq, \subsetneqq, \ | $\subseteqq, \nsubseteqq, \subsetneqq, | -| | \varsubsetneqq | \varsubsetneqq$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 49 | \supseteqq, \nsupseteqq, \supsetneqq, \ | $\supseteqq, \nsupseteqq, \supsetneqq, | -| | \varsupsetneqq | \varsupsetneqq$ | -+-----+--------------------------------------------+------------------------------------------------+ -| **Relations** | -+-----+--------------------------------------------+------------------------------------------------+ -| 50 | =, \ne, \neq, \equiv, \not\equiv | $=, \ne, \neq, \equiv, \not\equiv$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 51 | \doteq, \doteqdot, \ | $\doteq, \doteqdot, | -| | \overset{\underset{\mathrm{def}}{}}{=}, := | \overset{\underset{\mathrm{def}}{}}{=}, :=$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 52 | \sim, \nsim, \backsim, \thicksim, \simeq,\ | $\sim, \nsim, \backsim, \thicksim, \simeq, | -| | \backsimeq, \eqsim, \cong, \ncong | \backsimeq, \eqsim, \cong, \ncong$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 53 | \approx, \thickapprox, \approxeq, \asymp,\ | $\approx, \thickapprox, \approxeq, \asymp, | -| | \propto, \varpropto | \propto, \varpropto$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 54 | <, \nless, \ll, \not\ll, \lll, \not\lll, \ | $<, \nless, \ll, \not\ll, \lll, \not\lll, | -| | \lessdot | \lessdot$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 55 | \le, \leq, \lneq, \leqq, \nleq, \nleqq, \ | $\le, \leq, \lneq, \leqq, \nleq, \nleqq, | -| | \lneqq, \lvertneqq | \lneqq, \lvertneqq$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 56 | \ge, \geq, \gneq, \geqq, \ngeq, \ngeqq, \ | $\ge, \geq, \gneq, \geqq, \ngeq, \ngeqq, | -| | \gneqq, \gvertneqq | \gneqq, \gvertneqq$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 57 | \lessgtr, \lesseqgtr, \lesseqqgtr, \ | $\lessgtr, \lesseqgtr, \lesseqqgtr, | -| | \gtrless, \gtreqless, \gtreqqless | \gtrless, \gtreqless, \gtreqqless$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 58 | \leqslant, \nleqslant, \eqslantless | $\leqslant, \nleqslant, \eqslantless$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 59 | \geqslant, \ngeqslant, \eqslantgtr | $\geqslant, \ngeqslant, \eqslantgtr$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 60 | \lesssim, \lnsim, \lessapprox, \lnapprox | $\lesssim, \lnsim, \lessapprox, \lnapprox$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 61 | \gtrsim, \gnsim, \gtrapprox, \gnapprox | $\gtrsim, \gnsim, \gtrapprox, \gnapprox$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 62 | \prec, \nprec, \preceq, \npreceq,\precneqq | $\prec, \nprec, \preceq, \npreceq, \precneqq$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 63 | \succ, \nsucc, \succeq, \nsucceq,\succneqq | $\succ, \nsucc, \succeq, \nsucceq, \succneqq$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 64 | \preccurlyeq, \curlyeqprec | $\preccurlyeq, \curlyeqprec$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 65 | \succcurlyeq, \curlyeqsucc | $\succcurlyeq, \curlyeqsucc$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 66 | \precsim, \precnsim, \precapprox, \ | $\precsim, \precnsim, \precapprox, | -| | \precnapprox | \precnapprox$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 67 | \succsim, \succnsim, \succapprox, \ | $\succsim, \succnsim, \succapprox, | -| | \succnapprox | \succnapprox$ | -+-----+--------------------------------------------+------------------------------------------------+ -| **Geometric** | -+-----+--------------------------------------------+------------------------------------------------+ -| 68 | \parallel, \nparallel, \shortparallel, \ | $\parallel, \nparallel, \shortparallel, | -| | \nshortparallel | \nshortparallel$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 69 | \perp, \angle, \sphericalangle, \ | $\perp, \angle, \sphericalangle, | -| | \measuredangle, 45^\circ | \measuredangle, 45^\circ$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 70 | \Box, \square, \blacksquare, \diamond, \ | $\Box, \square, \blacksquare, \diamond, | -| | \Diamond, \lozenge, \blacklozenge,\bigstar | \Diamond, \lozenge, \blacklozenge,\bigstar$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 71 | \bigcirc, \triangle, \bigtriangleup, \ | $\bigcirc, \triangle, \bigtriangleup, | -| | \bigtriangledown | \bigtriangledown$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 72 | \vartriangle, \triangledown | $\vartriangle, \triangledown$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 73 | \blacktriangle, \blacktriangledown, \ | $\blacktriangle, \blacktriangledown, | -| | \blacktriangleleft, \blacktriangleright | \blacktriangleleft, \blacktriangleright$ | -+-----+--------------------------------------------+------------------------------------------------+ -| **Logic** | -+-----+--------------------------------------------+------------------------------------------------+ -| 74 | \forall, \exists, \nexists | $\forall, \exists, \nexists$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 75 | \therefore, \because, \And | $\therefore, \because, \And$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 76 | \lor \vee, \curlyvee, \bigvee | $\lor \vee, \curlyvee, \bigvee$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 77 | \land \wedge, \curlywedge, \bigwedge | $\land \wedge, \curlywedge, \bigwedge$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 78 | \bar{q}, \bar{abc}, \overline{q}, \ | $\bar{q}, \bar{abc}, \overline{q}, | -| | \overline{abc},\\\\ \ | \overline{abc}, \\ | -| | \lnot \neg, \not\operatorname{R},\bot,\top | \lnot \neg, \not\operatorname{R},\bot,\top$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 79 | \vdash \dashv, \vDash, \Vdash, \models | $\vdash \dashv, \vDash, \Vdash, \models$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 80 | \Vvdash \nvdash \nVdash \nvDash \nVDash | $\Vvdash \nvdash \nVdash \nvDash \nVDash$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 81 | \ulcorner \urcorner \llcorner \lrcorner | $\ulcorner \urcorner \llcorner \lrcorner$ | -+-----+--------------------------------------------+------------------------------------------------+ -| **Arrows** | -+-----+--------------------------------------------+------------------------------------------------+ -| 82 | \Rrightarrow, \Lleftarrow | $\Rrightarrow, \Lleftarrow$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 83 | \Rightarrow, \nRightarrow, \ | $\Rightarrow, \nRightarrow, | -| | \Longrightarrow, \implies | \Longrightarrow, \implies$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 84 | \Leftarrow, \nLeftarrow, \Longleftarrow | $\Leftarrow, \nLeftarrow, \Longleftarrow$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 85 | \Leftrightarrow, \nLeftrightarrow, \ | $\Leftrightarrow, \nLeftrightarrow, | -| | \Longleftrightarrow, \iff | \Longleftrightarrow, \iff$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 86 | \Uparrow, \Downarrow, \Updownarrow | $\Uparrow, \Downarrow, \Updownarrow$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 87 | \rightarrow \to, \nrightarrow, \ | $\rightarrow \to, \nrightarrow, | -| | \longrightarrow | \longrightarrow$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 88 | \leftarrow \gets, \nleftarrow, \ | $\leftarrow \gets, \nleftarrow, | -| | \longleftarrow | \longleftarrow$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 89 | \leftrightarrow, \nleftrightarrow, \ | $\leftrightarrow, \nleftrightarrow, | -| | \longleftrightarrow | \longleftrightarrow$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 90 | \uparrow, \downarrow, \updownarrow | $\uparrow, \downarrow, \updownarrow$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 91 | \nearrow, \swarrow, \nwarrow, \searrow | $\nearrow, \swarrow, \nwarrow, \searrow$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 92 | \mapsto, \longmapsto | $\mapsto, \longmapsto$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 93 | \rightharpoonup \rightharpoondown \ | $\rightharpoonup \rightharpoondown | -| | \leftharpoonup \leftharpoondown \ | \leftharpoonup \leftharpoondown | -| | \upharpoonleft \upharpoonright \ | \upharpoonleft \upharpoonright | -| | \downharpoonleft \downharpoonright \ | \downharpoonleft \downharpoonright | -| | \rightleftharpoons \leftrightharpoons | \rightleftharpoons \leftrightharpoons$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 94 | \curvearrowleft \circlearrowleft \Lsh \ | $\curvearrowleft \circlearrowleft \Lsh | -| | \upuparrows \rightrightarrows \ | \upuparrows \rightrightarrows | -| | \rightleftarrows \rightarrowtail \ | \rightleftarrows \rightarrowtail | -| | \looparrowright | \looparrowright$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 95 | \curvearrowright \circlearrowright \Rsh \ | $\curvearrowright \circlearrowright \Rsh | -| | \downdownarrows \leftleftarrows \ | \downdownarrows \leftleftarrows | -| | \leftrightarrows \leftarrowtail \ | \leftrightarrows \leftarrowtail | -| | \looparrowleft | \looparrowleft$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 96 | \hookrightarrow \hookleftarrow \multimap \ | $\hookrightarrow \hookleftarrow \multimap | -| | \leftrightsquigarrow \rightsquigarrow \ | \leftrightsquigarrow \rightsquigarrow | -| | \twoheadrightarrow \twoheadleftarrow | \twoheadrightarrow \twoheadleftarrow$ | -+-----+--------------------------------------------+------------------------------------------------+ -| **Special** | -+-----+--------------------------------------------+------------------------------------------------+ -| 97 | \amalg \P \S \%\dagger\ddagger\ldots\cdots | $\amalg \P \S \% \dagger\ddagger\ldots\cdots$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 98 | \smile \frown \wr \triangleleft \ | $\smile \frown \wr \triangleleft | -| | \triangleright | \triangleright$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 99 | \diamondsuit, \heartsuit, \clubsuit, \ | $\diamondsuit, \heartsuit, \clubsuit, | -| | \spadesuit, \Game, \flat, \natural, \sharp | \spadesuit, \Game, \flat, \natural, \sharp$ | -+-----+--------------------------------------------+------------------------------------------------+ -| **Unsorted** | -+-----+--------------------------------------------+------------------------------------------------+ -| 100 | \diagup \diagdown \centerdot \ltimes \ | $\diagup \diagdown \centerdot \ltimes | -| | \rtimes \leftthreetimes \rightthreetimes | \rtimes \leftthreetimes \rightthreetimes$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 101 | \eqcirc \circeq \triangleq \bumpeq\Bumpeq\ | $\eqcirc \circeq \triangleq \bumpeq\Bumpeq | -| | \doteqdot \risingdotseq \fallingdotseq | \doteqdot \risingdotseq \fallingdotseq$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 102 | \intercal \barwedge \veebar \ | $\intercal \barwedge \veebar | -| | \doublebarwedge \between \pitchfork | \doublebarwedge \between \pitchfork$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 103 | \vartriangleleft \ntriangleleft \ | $\vartriangleleft \ntriangleleft | -| | \vartriangleright \ntriangleright | \vartriangleright \ntriangleright$ | -+-----+--------------------------------------------+------------------------------------------------+ -| 104 | \trianglelefteq \ntrianglelefteq \ | $\trianglelefteq \ntrianglelefteq | -| | \trianglerighteq \ntrianglerighteq | \trianglerighteq \ntrianglerighteq$ | -+-----+--------------------------------------------+------------------------------------------------+ - -
    - -+-----+----------------------------------------------+------------------------------------------------+ -| Larger expressions | -+-----+----------------------------------------------+------------------------------------------------+ -| | Source | Temml | -+=====+==============================================+================================================+ -| 105 | a^2, a^{x+3} | $a^2, a^{x+3}$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 106 | a\_2 | $a_2$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 107 | 10^{30} a^{2+2} \ | $10^{30} a^{2+2} \\ | -| | a\_{i,j} b\_{f'} | a_{i,j} b_{f'}$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 108 | x\_2^3 \ | $x_2^3 \\ | -| | {x\_2}^3 | {x_2}^3$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 109 | 10^{10^{8}} | $10^{10^{8}}$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 110 | \sideset{\_1^2}{\_3^4}\prod\_a^b \ | $$\sideset{_1^2}{_3^4}\prod_a^b$$ | -| | {}\_1^2\\!\Omega\_3^4 | $${}_1^2\!\Omega_3^4$$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 111 | \overset{\alpha}{\omega} \ | $\overset{\alpha}{\omega} \\ | -| | \underset{\alpha}{\omega} \ | \underset{\alpha}{\omega} \\ | -| | \overset{\alpha}{\underset{\gamma}{\omega}}\ | \overset{\alpha}{\underset{\gamma}{\omega}}\\ | -| | \stackrel{\alpha}{\omega} | \stackrel{\alpha}{\omega}$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 112 | x', y'', f', f'' \ | $x', y'', f', f'' \\ | -| | x^\prime, y^{\prime\prime} | x^\prime, y^{\prime\prime}$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 113 | \dot{x}, \ddot{x} | $\dot{x}, \ddot{x}$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 114 | \hat a \\ \bar b \\ \vec c \ | $\hat a \ \bar b \ \vec c \\ | -| | \overrightarrow{a b} \\ \overleftarrow{c d}\ | \overrightarrow{a b} \ \overleftarrow{c d}\\ | -| | \widehat{d e f} \ | \widehat{d e f} \\ | -| | \overline{g h i} \\ \underline{j k l} | \overline{g h i} \ \underline{j k l}$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 115 | \overset{\frown} {AB} | $\overset{\frown} {AB}$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 116 | A \xleftarrow{n+\mu-1} B \ | $A \xleftarrow{n+\mu-1} B | -| | \xrightarrow[T]{n\pm i-1} C | \xrightarrow[T]{n\pm i-1} C$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 117 | \overbrace{ 1+2+\cdots+100 }^{5050} | $\overbrace{ 1+2+\cdots+100 }^{5050}$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 118 | \underbrace{ a+b+\cdots+z }\_{26} | $\underbrace{ a+b+\cdots+z }_{26}$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 119 | \sum\_{k=1}^N k^2 | $$\sum_{k=1}^N k^2$$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 120 | \textstyle \sum\_{k=1}^N k^2 | $$\textstyle \sum_{k=1}^N k^2$$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 121 | \frac{\sum\_{k=1}^N k^2}{a} | $$\frac{\sum_{k=1}^N k^2}{a}$$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 122 | \frac{\sum\limits^{^N}\_{k=1} k^2}{a} | $$\frac{\sum\limits^{^N}_{k=1} k^2}{a}$$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 123 | \prod\_{i=1}^N x\_i | $$\prod_{i=1}^N x_i$$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 124 | \textstyle \prod\_{i=1}^N x\_i | $$\textstyle \prod_{i=1}^N x_i$$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 125 | \coprod\_{i=1}^N x\_i | $$\coprod_{i=1}^N x_i$$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 126 | \textstyle \coprod\_{i=1}^N x\_i | $$\textstyle \coprod_{i=1}^N x_i$$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 127 | \lim\_{n \to \infty}x\_n | $$\lim_{n \to \infty}x_n$$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 128 | \textstyle \lim\_{n \to \infty}x\_n | $$\textstyle \lim_{n \to \infty}x_n$$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 129 | \int\limits\_{1}^{3}\frac{e^3/x}{x^2}\\, dx | $$\int\limits_{1}^{3}\frac{e^3/x}{x^2}\, dx$$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 130 | \int\_{1}^{3}\frac{e^3/x}{x^2}\\, dx | $$\int_{1}^{3}\frac{e^3/x}{x^2}\, dx$$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 131 | \textstyle \int\limits\_{-N}^{N} e^x dx | $$\textstyle \int\limits_{-N}^{N} e^x dx$$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 132 | \textstyle \int\_{-N}^{N} e^x dx | $$\textstyle \int_{-N}^{N} e^x dx$$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 133 | \iint\limits\_D dx\\,dy | $$\iint\limits_D dx\,dy$$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 134 | \iiint\limits\_E dx\\,dy\\,dz | $$\iiint\limits_E dx\,dy\,dz$$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 135 | \iiiint\limits\_F dx\\,dy\\,dz\\,dt | $$\iiiint\limits_F dx\,dy\,dz\,dt$$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 136 | \int\_{(x,y)\in C} x^3\\, dx + 4y^2\\, dy | $$\int_{(x,y)\in C} x^3\, dx + 4y^2\, dy$$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 137 | \oint\_{(x,y)\in C} x^3\\, dx + 4y^2\\, dy | $$\oint_{(x,y)\in C} x^3\, dx + 4y^2\, dy$$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 138 | \bigcap\_{i=1}^n E\_i | $$\bigcap_{i=1}^n E_i$$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 139 | \bigcup\_{i=1}^n E\_i | $$\bigcup_{i=1}^n E_i$$ | -+-----+----------------------------------------------+------------------------------------------------+ -| **Fractions, matrices, multiline** | -+-----+----------------------------------------------+------------------------------------------------+ -| 140 | \frac{2}{4}=0.5 or {2 \over 4}=0.5 | $\frac{2}{4}=0.5$ or ${2 \over 4}=0.5$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 141 | \tfrac{2}{4} = 0.5 | $$\tfrac{2}{4} = 0.5$$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 142 | \dfrac{2}{4} = 0.5 \qquad \dfrac{2}{c + \ | $\dfrac{2}{4} = 0.5 \qquad \dfrac{2}{c + | -| | \dfrac{2}{d + \dfrac{2}{4}}} = a | \dfrac{2}{d + \dfrac{2}{4}}} = a$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 143 | \cfrac{2}{c +\cfrac{2}{d +\cfrac{2}{4}}} = a | $$\cfrac{2}{c+\cfrac{2}{d+\cfrac{2}{4}}} = a$$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 144 | \cfrac{x}{1 + \cfrac{\cancel{y}}\ | $\cfrac{x}{1 + \cfrac{\cancel{y}} | -| | {\cancel{y}}} = \cfrac{x}{2} | {\cancel{y}}} = \cfrac{x}{2}$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 145 | \binom{n}{k} | $\binom{n}{k}$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 146 | \tbinom{n}{k} | $$\tbinom{n}{k}$$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 147 | \dbinom{n}{k} | $\dbinom{n}{k}$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 148 | \begin{matrix} \ | $\begin{matrix} | -| | x & y \\\\ \ | x & y \\ | -| | z & v \ | z & v | -| | \end{matrix} | \end{matrix}$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 149 | \begin{vmatrix} \ | $\begin{vmatrix} | -| | x & y \\\\ \ | x & y \\ | -| | z & v \ | z & v | -| | \end{vmatrix} | \end{vmatrix}$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 150 | \begin{Vmatrix} \ | $\begin{Vmatrix} | -| | x & y \\\\ \ | x & y \\ | -| | z & v \ | z & v | -| | \end{Vmatrix} | \end{Vmatrix}$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 151 | \begin{bmatrix} \ | $\begin{bmatrix} | -| | 0 & \cdots & 0 \\\\ \ | 0 & \cdots & 0 \\ | -| | \vdots & \ddots & \vdots \\\\ \ | \vdots & \ddots & \vdots \\ | -| | 0 & \cdots & 0 \ | 0 & \cdots & 0 | -| | \end{bmatrix} | \end{bmatrix}$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 152 | \begin{Bmatrix} \ | $\begin{Bmatrix} | -| | x & y \\\\ \ | x & y \\ | -| | z & v \ | z & v | -| | \end{Bmatrix} | \end{Bmatrix}$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 153 | \begin{pmatrix} \ | $\begin{pmatrix} | -| | x & y \\\\ \ | x & y \\ | -| | z & v \ | z & v | -| | \end{pmatrix} | \end{pmatrix}$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 154 | \bigl( \begin{smallmatrix} \ | $\bigl( \begin{smallmatrix} | -| | a&b\\\\ c&d \ | a&b\\ c&d | -| | \end{smallmatrix} \bigr) | \end{smallmatrix} \bigr)$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 155 | f(n) = \begin{cases} \ | $f(n) = \begin{cases} | -| | n/2, & \text{if }n\text{ is even} \\\\ \ | n/2, & \text{if }n\text{ is even} \\ | -| | 3n+1, & \text{if }n\text{ is odd} | 3n+1, & \text{if }n\text{ is odd} | -| | \end{cases} | \end{cases}$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 156 | \begin{cases} \ | $\begin{cases} | -| | 3x + 5y + z \\\\ \ | 3x + 5y + z \\ | -| | 7x - 2y + 4z \\\\ \ | 7x - 2y + 4z \\ | -| | -6x + 3y + 2z | -6x + 3y + 2z | -| | \end{cases} | \end{cases}$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 157 | \begin{align} \ | $$\begin{align} | -| | f(x) & = (a+b)^2 \\\\ \ | f(x) & = (a+b)^2 \\ | -| | & = a^2+2ab+b^2 \\\\ \ | & = a^2+2ab+b^2 \\ | -| | \end{align} | \end{align}$$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 158 | \begin{alignat}{2} \ | $$\begin{alignat}{2} | -| | f(x) & = (a+b)^2 \\\\ \ | f(x) & = (a+b)^2 \\ | -| | & = a^2+2ab+b^2 \\\\ \ | & = a^2+2ab+b^2 \\ | -| | \end{alignat} | \end{alignat}$$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 159 | \begin{align} \ | $$\begin{align} | -| | f(a,b) & = (a+b)^2 && = (a+b)(a+b) \\\\ \ | f(a,b) & = (a+b)^2 && = (a+b)(a+b) \\ | -| | & = a^2+ab+ba+b^2 && = a^2+2ab+b^2 \\\\ \ | & = a^2+ab+ba+b^2 && = a^2+2ab+b^2 \\ | -| | \end{align} | \end{align}$$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 159 | \begin{alignat}{3} \ | $$\begin{alignat}{3} | -| | f(a,b) & = (a+b)^2 && = (a+b)(a+b) \\\\ \ | f(a,b) & = (a+b)^2 && = (a+b)(a+b) \\ | -| | & = a^2+ab+ba+b^2 && = a^2+2ab+b^2 \\\\ \ | & = a^2+ab+ba+b^2 && = a^2+2ab+b^2 \\ | -| | \end{alignat} | \end{alignat}$$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 160 | \begin{array}{lcl} \ | $$\begin{array}{lcl} | -| | z & = & a \\\\ \ | z & = & a \\ | -| | f(x,y,z) & = & x + y + z | f(x,y,z) & = & x + y + z | -| | \end{array} | \end{array}$$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 161 | \begin{array}{lcr} \ | $$\begin{array}{lcr} | -| | z & = & a \\\\ \ | z & = & a \\ | -| | f(x,y,z) & = & x + y + z | f(x,y,z) & = & x + y + z | -| | \end{array} | \end{array}$$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 162 | \begin{alignat}{4} \ | $$\begin{alignat}{4} | -| | F:\\; && C(X) && \\;\to\\; & C(X) \\\\ \ | F:\; && C(X) && \;\to\; & C(X) \\ | -| | && g && \\;\mapsto\\; & g^2 | && g && \;\mapsto\; & g^2 | -| | \end{alignat} | \end{alignat}$$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 163 | \begin{alignat}{4} \ | $$\begin{alignat}{4} | -| | F:\\; && C(X) && \\;\to\\; && C(X) \\\\ \ | F:\; && C(X) && \;\to\; && C(X) \\ | -| | && g && \\;\mapsto\\; && g^2 | && g && \;\mapsto\; && g^2 | -| | \end{alignat} | \end{alignat}$$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 164 | `f(x) \,\!` `=\sum_{n=0}^\infty a_n x^n` \ | $f(x) \,\!$ $= \sum_{n=0}^\infty a_n x^n$ | -| | `= a_0+a_1x+a_2x^2+\cdots` | $= a_0+a_1x+a_2x^2+\cdots$ | -+-----+----------------------------------------------+------------------------------------------------+ -| 165 | \begin{array}{|c|c|c|} \ | $\begin{array}{|c|c|c|} | -| | a & b & S \\\\ \ | a & b & S \\ | -| | \hline \ | \hline | -| | 0 & 0 & 1 \\\\ \ | 0 & 0 & 1 \\ | -| | 0 & 1 & 1 \\\\ \ | 0 & 1 & 1 \\ | -| | 1 & 0 & 1 \\\\ \ | 1 & 0 & 1 \\ | -| | 1 & 1 & 0 \\\\ \ | 1 & 1 & 0 \\ | -| | \end{array} | \end{array}$ | -+-----+----------------------------------------------+------------------------------------------------+ -{colWidths="null null 400"} - -+-----+-----------------------------------------------+--------------------------------------------------+ -| Delimiters | -+=====+===============================================+==================================================+ -| 166 | ( \frac{1}{2} )^n | $( \frac{1}{2} )^n$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 167 | \left ( \frac{1}{2} \right )^n | $\left ( \frac{1}{2} \right )^n$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 168 | \left ( \frac{a}{b} \right ) | $\left ( \frac{a}{b} \right )$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 169 | \left [ \frac{a}{b} \right ] \quad \ | $\left [ \frac{a}{b} \right ] \quad | -| | \left \lbrack \frac{a}{b} \right \rbrack | \left \lbrack \frac{a}{b} \right \rbrack$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 170 | \left \{ \frac{a}{b} \right \} \quad \ | $\left \{ \frac{a}{b} \right \} \quad | -| | \left \lbrace \frac{a}{b} \right \rbrace | \left \lbrace \frac{a}{b} \right \rbrace$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 171 | \left \langle \frac{a}{b} \right \rangle | $\left \langle \frac{a}{b} \right \rangle$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 172 | \left | \frac{a}{b} \right \vert \quad \ | $\left | \frac{a}{b} \right \vert \quad | -| | \left \Vert \frac{c}{d} \right \| | \left \Vert \frac{c}{d} \right \|$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 173 | \left \lfloor \frac{a}{b} \right \rfloor \ | $\left \lfloor \frac{a}{b} \right \rfloor | -| | \quad \left \lceil \frac{c}{d} \right \rceil | \quad \left \lceil \frac{c}{d} \right \rceil$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 174 | \left / \frac{a}{b} \right \backslash | $\left / \frac{a}{b} \right \backslash$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 175 | \left\uparrow\frac{a}{b}\right\downarrow\\; \ | $\left\uparrow\frac{a}{b}\right\downarrow\; | -| | \left\Uparrow\frac{a}{b}\right\Downarrow\\; \ | \left\Uparrow\frac{a}{b}\right\Downarrow\; | -| | \left \updownarrow \frac{a}{b} \right \ | \left \updownarrow \frac{a}{b} \right | -| | \Updownarrow | \Updownarrow$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 176 | \left [ 0,1 \right ) \ | $\left [ 0,1 \right ) | -| | \left \langle \psi \right | | \left \langle \psi \right |$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 177 | \left . \frac{A}{B} \right \} \to X | $\left . \frac{A}{B} \right \} \to X$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 178 | ( \bigl( \Bigl( \biggl( \Biggl( \dots \ | $( \bigl( \Bigl( \biggl( \Biggl( \dots | -| | \Biggr] \biggr] \Bigr] \bigr] ] | \Biggr] \biggr] \Bigr] \bigr] ]$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 179 | \{ \bigl\{ \Bigl\{ \biggl\{ \Biggl\{ \dots \ | $\{ \bigl\{ \Bigl\{ \biggl\{ \Biggl\{ \dots | -| | \Biggr\rangle \biggr\rangle \Bigr\rangle \ | \Biggr\rangle \biggr\rangle \Bigr\rangle | -| | \bigr\rangle \rangle | \bigr\rangle \rangle$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 180 | \| \big\| \Big\| \bigg\| \Bigg\| \dots \ | $\| \big\| \Big\| \bigg\| \Bigg\| \dots | -| | \Bigg| \bigg| \Big| \big| | | \Bigg| \bigg| \Big| \big| |$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 181 | \lfloor \bigl\lfloor \Bigl\lfloor \ | $\lfloor \bigl\lfloor \Bigl\lfloor | -| | \biggl\lfloor \Biggl\lfloor \dots \ | \biggl\lfloor \Biggl\lfloor \dots | -| | \Biggr\rceil \biggr\rceil \Bigr\rceil \ | \Biggr\rceil \biggr\rceil \Bigr\rceil | -| | \bigr\rceil \rceil | \bigr\rceil \rceil$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 182 | \uparrow \big\uparrow \Big\uparrow \ | $\uparrow \big\uparrow \Big\uparrow | -| | \bigg\uparrow \Bigg\uparrow \dots \ | \bigg\uparrow \Bigg\uparrow \dots | -| | \Bigg\Downarrow \bigg\Downarrow \ | \Bigg\Downarrow \bigg\Downarrow | -| | \Big\Downarrow \big\Downarrow \Downarrow | \Big\Downarrow \big\Downarrow \Downarrow$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 183 | \updownarrow\big\updownarrow\Big\updownarrow\ | $\updownarrow\big\updownarrow\Big\updownarrow | -| | \bigg\updownarrow \Bigg\updownarrow \dots \ | \bigg\updownarrow \Bigg\updownarrow \dots | -| | \Bigg\Updownarrow \bigg\Updownarrow \Big \ | \Bigg\Updownarrow \bigg\Updownarrow \Big | -| | \Updownarrow \big\Updownarrow \Updownarrow | \Updownarrow \big\Updownarrow \Updownarrow$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 184 | / \big/ \Big/ \bigg/ \Bigg/ \dots \ | $/ \big/ \Big/ \bigg/ \Bigg/ \dots | -| | \Bigg\backslash \bigg\backslash \Big \ | \Bigg\backslash \bigg\backslash \Big | -| | \backslash \big\backslash \backslash | \backslash \big\backslash \backslash$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| **Greek Alphabet** | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 185 | \Alpha \Beta \Gamma \Delta \Epsilon \Zeta \ | $\Alpha \Beta \Gamma \Delta \Epsilon \Zeta | -| | \Eta \Theta | \Eta \Theta$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 186 | \Iota \Kappa \Lambda \Mu \Nu \Xi \Omicron \Pi | $\Iota \Kappa \Lambda \Mu \Nu \Xi \Omicron \Pi$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 187 | \Rho \Sigma \Tau \Upsilon \Phi \Chi \Psi \ | $\Rho \Sigma \Tau \Upsilon \Phi \Chi \Psi | -| | \Omega | \Omega$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 188 | \alpha \beta \gamma \delta \epsilon \zeta \ | $\alpha \beta \gamma \delta \epsilon \zeta | -| | \eta \theta | \eta \theta$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 189 | \iota \kappa \lambda \mu \nu \xi \omicron \pi | $\iota \kappa \lambda \mu \nu \xi \omicron \pi$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 190 | \rho \sigma \tau \upsilon \phi \chi \psi \ | $\rho \sigma \tau \upsilon \phi \chi \psi | -| | \omega | \omega$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 191 | \varGamma \varDelta \varTheta \varLambda \ | $\varGamma \varDelta \varTheta \varLambda | -| | \varXi \varPi \varSigma \varPhi \varUpsilon \ | \varXi \varPi \varSigma \varPhi \varUpsilon | -| | \varOmega | \varOmega$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 192 | \varepsilon \digamma \varkappa \varpi \ | $\varepsilon \digamma \varkappa \varpi | -| | \varrho \varsigma \vartheta \varphi | \varrho \varsigma \vartheta \varphi$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| **Hebrew symbols** | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 193 | \aleph \beth \gimel \daleth | $\aleph \beth \gimel \daleth$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| **Blackboard bold** | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 194 | \mathbb{ABCDEFGHI} \ | $\mathbb{ABCDEFGHI} \\ | -| | \mathbb{JKLMNOPQR} \ | \mathbb{JKLMNOPQR} \\ | -| | \mathbb{STUVWXYZ} | \mathbb{STUVWXYZ}$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| **Boldface** | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 195 | \mathbf{ABCDEFGHI} \ | $\mathbf{ABCDEFGHI} \\ | -| | \mathbf{JKLMNOPQR} \ | \mathbf{JKLMNOPQR} \\ | -| | \mathbf{STUVWXYZ} \ | \mathbf{STUVWXYZ} \\ | -| | \mathbf{abcdefghijklm} \ | \mathbf{abcdefghijklm} \\ | -| | \mathbf{nopqrstuvwxyz} \ | \mathbf{nopqrstuvwxyz} \\ | -| | \mathbf{0123456789} | \mathbf{0123456789}$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| **Boldface Greek** | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 196 | \boldsymbol{\Alpha \Beta \Gamma \Delta \ | $\boldsymbol{\Alpha \Beta \Gamma \Delta | -| | \Epsilon \Zeta \Eta \Theta} | \Epsilon \Zeta \Eta \Theta}$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 197 | \boldsymbol{\Iota \Kappa \Lambda \Mu \Nu \Xi\ | $\boldsymbol{\Iota \Kappa \Lambda \Mu \Nu \Xi | -| | \Omicron \Pi} | \Omicron \Pi}$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 198 | \boldsymbol{\Rho \Sigma \Tau \Upsilon \Phi \ | $\boldsymbol{\Rho \Sigma \Tau \Upsilon \Phi | -| | \Chi \Psi \Omega} | \Chi \Psi \Omega}$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 199 | \boldsymbol{\alpha \beta \gamma \delta \ | $\boldsymbol{\alpha \beta \gamma \delta | -| | \epsilon \zeta \eta \theta} | \epsilon \zeta \eta \theta}$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 200 | \boldsymbol{\iota \kappa \lambda \mu \nu \xi\ | $\boldsymbol{\iota \kappa \lambda \mu \nu \xi | -| | \omicron \pi} | \omicron \pi}$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 201 | \boldsymbol{\rho \sigma \tau \upsilon \phi \ | $\boldsymbol{\rho \sigma \tau \upsilon \phi | -| | \chi \psi \omega} | \chi \psi \omega}$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 202 | \boldsymbol{\varepsilon\digamma\varkappa\ | $\boldsymbol{\varepsilon\digamma\varkappa | -| | \varpi} | \varpi}$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 203 | \boldsymbol{\varrho\varsigma\vartheta\varphi} | $\boldsymbol{\varrho\varsigma\vartheta\varphi}$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| **Italics** | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 204 | \mathit{0123456789} | $\mathit{0123456789}$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| **Greek Italics** | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 205 | \mathit{\Alpha \Beta \Gamma \Delta \Epsilon \ | $\mathit{\Alpha \Beta \Gamma \Delta \Epsilon | -| | \Zeta \Eta \Theta} | \Zeta \Eta \Theta}$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 206 | \mathit{\Iota \Kappa \Lambda \Mu \Nu \Xi \ | $\mathit{\Iota \Kappa \Lambda \Mu \Nu \Xi | -| | \Omicron \Pi} | \Omicron \Pi}$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 207 | \mathit{\Rho \Sigma \Tau \Upsilon \Phi \Chi \ | $\mathit{\Rho \Sigma \Tau \Upsilon \Phi \Chi | -| | \Psi \Omega} | \Psi \Omega}$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| **Greek uppercase boldface italics** | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 208 | \boldsymbol{\varGamma \varDelta \varTheta \ | $\boldsymbol{\varGamma \varDelta \varTheta | -| | \varLambda} | \varLambda}$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 209 | \boldsymbol{\varXi \varPi \varSigma \ | $\boldsymbol{\varXi \varPi \varSigma | -| | \varUpsilon \varOmega} | \varUpsilon \varOmega}$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| **Roman typeface** | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 210 | \mathrm{ABCDEFGHI} \ | $\mathrm{ABCDEFGHI} \\ | -| | \mathrm{JKLMNOPQR} \ | \mathrm{JKLMNOPQR} \\ | -| | \mathrm{STUVWXYZ} \ | \mathrm{STUVWXYZ} \\ | -| | \mathrm{abcdefghijklm} \ | \mathrm{abcdefghijklm} \\ | -| | \mathrm{nopqrstuvwxyz} \ | \mathrm{nopqrstuvwxyz} \\ | -| | \mathrm{0123456789} | \mathrm{0123456789}$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| **Sans serif** | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 211 | \mathsf{ABCDEFGHI} \ | $\mathsf{ABCDEFGHI} \\ | -| | \mathsf{JKLMNOPQR} \ | \mathsf{JKLMNOPQR} \\ | -| | \mathsf{STUVWXYZ} \ | \mathsf{STUVWXYZ} \\ | -| | \mathsf{abcdefghijklm} \ | \mathsf{abcdefghijklm} \\ | -| | \mathsf{nopqrstuvwxyz} \ | \mathsf{nopqrstuvwxyz} \\ | -| | \mathsf{0123456789} | \mathsf{0123456789}$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| **Sans serif Greek** | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 212 | \mathsf{\Alpha \Beta \Gamma \Delta \Epsilon \ | $\mathsf{\Alpha \Beta \Gamma \Delta \Epsilon | -| | \Zeta \Eta \Theta} | \Zeta \Eta \Theta}$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 213 | \mathsf{\Iota \Kappa \Lambda \Mu \Nu \Xi \ | $\mathsf{\Iota \Kappa \Lambda \Mu \Nu \Xi | -| | \Omicron \Pi} | \Omicron \Pi}$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 214 | \mathsf{\Rho \Sigma \Tau \Upsilon \Phi \Chi \ | $\mathsf{\Rho \Sigma \Tau \Upsilon \Phi \Chi | -| | \Psi \Omega} | \Psi \Omega}$ | -+-----+-----------------------------------------------+--------------------------------------------------+ - -Unicode has special code points for bold Greek sans-serif, but no code points for\ -regular-weight Greek sans-serif. I know of no servable math font that has glyphs\ -for regular-weight Greek sans-serif. Consequently, these bold Greek sans-serif\ -glyphs are the best approximation I can make to sans-serif Greek. - -
    - -+-----+-----------------------------------------------+--------------------------------------------------+ -| **Calligraphy** | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 215 | \mathcal{ABCDEFGHI} \ | $\mathcal{ABCDEFGHI} \\ | -| | \mathcal{JKLMNOPQR} \ | \mathcal{JKLMNOPQR} \\ | -| | \mathcal{STUVWXYZ} \ | \mathcal{STUVWXYZ} \\ | -| | \mathcal{abcdefghi} \ | \mathcal{abcdefghi} \\ | -| | \mathcal{jklmnopqr} \ | \mathcal{jklmnopqr} \\ | -| | \mathcal{stuvwxyz} | \mathcal{stuvwxyz}$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| **Fraktur** | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 216 | \mathfrak{ABCDEFGHI} \ | $\mathfrak{ABCDEFGHI} \\ | -| | \mathfrak{JKLMNOPQR} \ | \mathfrak{JKLMNOPQR} \\ | -| | \mathfrak{STUVWXYZ} \ | \mathfrak{STUVWXYZ} \\ | -| | \mathfrak{abcdefghi} \ | \mathfrak{abcdefghi} \\ | -| | \mathfrak{jklmnopqr} \ | \mathfrak{jklmnopqr} \\ | -| | \mathfrak{stuvwxyz} | \mathfrak{stuvwxyz}$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| **Scriptstyle text** | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 217 | {\scriptstyle\text{abcdefghijklm}} | ${\scriptstyle\text{abcdefghijklm}}$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| **Mixed text faces** | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 218 | x y z | $x y z$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 219 | \text{x y z} | $\text{x y z}$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 220 | \text{if} n \text{is even} | $\text{if} n \text{is even}$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 221 | \text{if }n\text{ is even} | $\text{if }n\text{ is even}$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 222 | \text{if}~n\ \text{is even} | $\text{if}~n\ \text{is even}$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| **Color** | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 223 | {\color{Blue}x^2}+{\color{Orange}2x}-\ | ${\color{Blue}x^2}+{\color{Orange}2x}- | -| | {\color{LimeGreen}1} | {\color{LimeGreen}1}$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 224 | x_{1,2}=\frac{{\color{Blue}-b}\pm\ | $x_{1,2}=\frac{{\color{Blue}-b}\pm | -| | \sqrt{\color{Red}b^2-4ac}}{\color{Green}2a } | \sqrt{\color{Red}b^2-4ac}}{\color{Green}2a }$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 225 | {\color{Blue}x^2}+{\color{Orange}2x}-\ | ${\color{Blue}x^2}+{\color{Orange}2x}- | -| | {\color{LimeGreen}1} | {\color{LimeGreen}1}$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 226 | \color{Blue}x^2\color{Black}+\color{Orange}\ | $\color{Blue}x^2\color{Black}+\color{Orange} | -| | 2x\color{Black}-\color{LimeGreen}1 | 2x\color{Black}-\color{LimeGreen}1$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 227 | \color{Blue}{x^2}+\color{Orange}{2x}-\ | $\color{Blue}{x^2}+\color{Orange}{2x}- | -| | \color{LimeGreen}{1} | \color{LimeGreen}{1}$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 228 | \definecolor{myorange}{rgb}{1,0.65,0.4}\ | $\definecolor{myorange}{rgb}{1,0.65,0.4} | -| | \color{myorange}e^{i \pi}\color{Black} + 1= 0 | \color{myorange}e^{i \pi}\color{Black} + 1= 0$ | -+-----+-----------------------------------------------+--------------------------------------------------+ - -For color names, see the [color section](https://temml.org/docs/en/supported.html#color) -in the Temml function support page. - -
    - -+-----+-----------------------------------------------+--------------------------------------------------+ -| **Spacing** | -+=====+===============================================+==================================================+ -| 229 | a \qquad b \ | $a \qquad b \\ | -| | a \quad b \ | a \quad b \\ | -| | a\ b \ | a\ b \\ | -| | a \text{ } b \ | a \text{ } b \\ | -| | a\\;b \ | a\;b \\ | -| | a\\,b \ | a\,b \\ | -| | ab \ | ab \\ | -| | a b \ | a b \\ | -| | \mathit{ab} \ | \mathit{ab} \\ | -| | a\\!b | a\!b$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 230 | | \uparrow \rangle | $| \uparrow \rangle$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 231 | \left| \uparrow \right\rangle | $\left| \uparrow \right\rangle$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 232 | | {\uparrow} \rangle | $| {\uparrow} \rangle$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 233 | | \mathord\uparrow \rangle | $| \mathord\uparrow \rangle$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| **Temml replacements for wiki workarounds** | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 234 | \oiint\limits\_D dx\\,dy \ | $$\oiint\limits_D dx\,dy$$ | -| | \oiiint\limits\_E dx\\,dy\\,dz | $$\oiiint\limits_E dx\,dy\,dz$$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 234 | \wideparen{AB} | $\wideparen{AB}$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 235 | \dddot{x} | $\dddot{x}$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 236 | \operatorname*{median}\_\ | $$\operatorname*{median}_{j\,\ne\,i} X_{i,j}$$ | -| | {j\\,\ne\\,i} X\_{i,j} | | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 237 | \sout{q} | $\sout{q}$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 238 | \mathrlap{\\,/}{=} | $\mathrlap{\,/}{=}$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 239 | \text{\textsf{textual description}} | $\text{\textsf{textual description}}$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 240 | α π | $α π$ | -+-----+-----------------------------------------------+--------------------------------------------------+ - -`mhchem` examples are displayed on their own [test page](https://temml.org/tests/mhchem-tests.html). - -
    - -+-----+-----------------------------------------------+--------------------------------------------------+ -| **Examples of implemented TeX formulas** | -+=====+===============================================+==================================================+ -| 241 | ax^2 + bx + c = 0 | $ax^2 + bx + c = 0$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 242 | x=\frac{-b\pm\sqrt{b^2-4ac}}{2a} | $x=\frac{-b\pm\sqrt{b^2-4ac}}{2a}$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 243 | \left( \frac{\left(3-x\right) \ | $\left( \frac{\left(3-x\right) | -| | \times 2}{3-x} \right) | \times 2}{3-x} \right)$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 244 | S\_{\text{new}} = S\_{\text{old}} - \ | $$S_{\text{new}} = S_{\text{old}} - | -| | \frac{ \left( 5-T \right) ^2} {2} | \frac{ \left( 5-T \right) ^2} {2}$$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 245 | \int\_a^x \int\_a^s f(y)\\,dy\\,ds = \ | $$\int_a^x \int_a^s f(y)\,dy\,ds = | -| | \int\_a^x f(y)(x-y)\\,dy | \int_a^x f(y)(x-y)\,dy$$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 246 | \int\_e^{\infty}\frac {1}{t(\ln t)^2}dt = \ | $$\int_e^{\infty}\frac {1}{t(\ln t)^2}dt = | -| | \left. \frac{-1}{\ln t}\right\vert\_e^\infty\ | \left. \frac{-1}{\ln t} \right\vert_e^\infty | -| | = 1 | = 1$$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 247 | \det(\mathsf{A}-\lambda\mathsf{I}) = 0 | $\det(\mathsf{A}-\lambda\mathsf{I}) = 0$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 248 | \sum\_{i=0}^{n-1} i | $$\sum_{i=0}^{n-1} i$$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 249 | \sum\_{m=1}^\infty\sum\_{n=1}^\infty \ | $$\sum_{m=1}^\infty\sum_{n=1}^\infty | -| | \frac{m^2 n}{3^m\left(m 3^n + n 3^m\right)} | \frac{m^2 n}{3^m\left(m 3^n + n 3^m\right)}$$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 250 | u'' + p(x)u' + q(x)u=f(x),\quad x>a | $u'' + p(x)u' + q(x)u=f(x),\quad x>a$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 251 | |\bar{z}| = |z|, |(\bar{z})^n| = |z|^n, \ | $|\bar{z}| = |z|, |(\bar{z})^n| = |z|^n, | -| | \arg(z^n) = n \arg(z) | \arg(z^n) = n \arg(z)$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 252 | \lim\_{z\to z\_0} f(z)=f(z\_0) | $$\lim_{z\to z_0} f(z)=f(z_0)$$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 253 | \phi_n(\kappa) = \ | $$\phi_n(\kappa) = | -| | \frac{1}{4\pi^2\kappa^2} \int\_0^\infty \ | \frac{1}{4\pi^2\kappa^2} \int_0^\infty | -| | \frac{\sin(\kappa R)}{\kappa R} \ | \frac{\sin(\kappa R)}{\kappa R} | -| | \frac{\partial}{\partial R} \ | \frac{\partial}{\partial R} | -| | \left [ R^2\frac{\partial D\_n(R)}\ | \left [ R^2\frac{\partial D_n(R)} | -| | {\partial R} \right ] \\,dR | {\partial R} \right ] \,dR$$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 254 | \phi\_n(\kappa) = 0.033C\_n^2\kappa^{-11/3},\ | $\phi_n(\kappa) = 0.033C_n^2\kappa^{-11/3}, | -| | \quad\frac{1}{L\_0}\ll\kappa\ll\frac{1}{l\_0} | \quad\frac{1}{L_0}\ll\kappa\ll\frac{1}{l_0}$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 255 | f(x) = \begin{cases} \ | $f(x) = \begin{cases} | -| | 1 & -1 \le x < 0 \\\\ \ | 1 & -1 \le x < 0 \\ | -| | \frac{1}{2} & x = 0 \\\\ \ | \frac{1}{2} & x = 0 \\ | -| | 1 - x^2 & \text{otherwise} \ | 1 - x^2 & \text{otherwise} | -| | \end{cases} | \end{cases}$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 256 | {}\_pF\_q(a\_1,\dots,a\_p;c\_1,\dots,c\_q;z)\ | ${}_pF_q(a_1,\dots,a_p;c_1,\dots,c_q;z) | -| | = \sum\_{n=0}^\infty \ | = \sum_{n=0}^\infty | -| | \frac{(a_1)\_n\cdots(a_p)\_n}\ | \frac{(a_1)_n\cdots(a_p)_n} | -| | {(c\_1)\_n\cdots(c\_q)_n}\frac{z^n}{n!} | {(c_1)_n\cdots(c_q)_n}\frac{z^n}{n!}$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 258 | \frac{a}{b}\ \tfrac{a}{b} | $$\frac{a}{b}\ \tfrac{a}{b}$$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 259 | S=dD\sin\alpha | $S=dD\sin\alpha$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 260 | V = \frac{1}{6} \pi h \left [ 3 \left \ | $V = \frac{1}{6} \pi h \left [ 3 \left | -| | ( r_1^2 + r_2^2 \right ) + h^2 \right ] | ( r_1^2 + r_2^2 \right ) + h^2 \right ]$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 261 | \begin{align} \ | $$\begin{align} | -| | u & = \tfrac{1}{\sqrt{2}}(x+y) \qquad & \ | u & = \tfrac{1}{\sqrt{2}}(x+y) \qquad & | -| | x &= \tfrac{1}{\sqrt{2}}(u+v) \\\\[0.6ex] \ | x &= \tfrac{1}{\sqrt{2}}(u+v) \\[0.6ex] | -| | v & = \tfrac{1}{\sqrt{2}}(x-y) \qquad & \ | v & = \tfrac{1}{\sqrt{2}}(x-y) \qquad & | -| | y &= \tfrac{1}{\sqrt{2}}(u-v) \ | y &= \tfrac{1}{\sqrt{2}}(u-v) | -| | \end{align} | \end{align}$$ | -+-----+-----------------------------------------------+--------------------------------------------------+ - -That concludes the tests from Wikipedia. Now a few more tests. - -
    - -+-----+-----------------------------------------------+--------------------------------------------------+ -| **Linear Logic** | -+=====+===============================================+==================================================+ -| 262 | A \with B \parr C | $A \with B \parr C$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 263 | a \coh \oc b \incoh \wn c \scoh d \sincoh e | $a \coh \oc b \incoh \wn c \scoh d \sincoh e$ | -+-----+-----------------------------------------------+--------------------------------------------------+ -| 264 | a \Perp \shpos b \multimapinv \shneg c | $a \Perp \shpos b \multimapinv \shneg c$ | -+-----+-----------------------------------------------+--------------------------------------------------+ - -+-----+----------------------------------------------+-------------------------------------------------+ -| **Nested font size** | -+=====+==============================================+=================================================+ -| 265 | \mathrm{f{\large f{\normalsize f{\tiny f}}}} | $\mathrm{f{\large f{\normalsize f{\tiny f}}}}$ | -+-----+----------------------------------------------+-------------------------------------------------+ - -The next line tests the length of an extensible arrow. Since Firefox does not\ -support the `minsize` attribute, Temml has a workaround. The middle arrow\ -should be as long at the bar between C & D. - -+=====+====================================+====================================+ -| 266 | A \rightarrow B \xrightarrow{i} C\ | $A \rightarrow B \xrightarrow{i} C | -| | \rule[0.3em]{1.75em}{0.05em} D | \rule[0.3em]{1.75em}{0.05em} D$ | -+-----+------------------------------------+------------------------------------+ - -The next line tests the fix for Temml issue #21. Firefox would ordinarily omit\ -the dot on the i below. It's fixed by a Temml CSS rule, so it renders properly. - -+=====+=================+===================+ -| 267 | \widetilde{U_i} | $\widetilde{U_i}$ | -+-----+-----------------+-------------------+ - - -
    - - diff --git a/utils/TeXZilla.js b/utils/TeXZilla.js deleted file mode 100644 index 84d96fa6..00000000 --- a/utils/TeXZilla.js +++ /dev/null @@ -1,4220 +0,0 @@ -/* THIS IS A GENERATED FILE. DO NOT EDIT THIS DIRECTLY. */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -"use strict"; -/* parser generated by jison 0.4.18 */ -/* - Returns a Parser object of the following structure: - - Parser: { - yy: {} - } - - Parser.prototype: { - yy: {}, - trace: function(), - symbols_: {associative list: name ==> number}, - terminals_: {associative list: number ==> name}, - productions_: [...], - performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$), - table: [...], - defaultActions: {...}, - parseError: function(str, hash), - parse: function(input), - - lexer: { - EOF: 1, - parseError: function(str, hash), - setInput: function(input), - input: function(), - unput: function(str), - more: function(), - less: function(n), - pastInput: function(), - upcomingInput: function(), - showPosition: function(), - test_match: function(regex_match_array, rule_index), - next: function(), - lex: function(), - begin: function(condition), - popState: function(), - _currentRules: function(), - topState: function(), - pushState: function(condition), - - options: { - ranges: boolean (optional: true ==> token location info will include a .range[] member) - flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match) - backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code) - }, - - performAction: function(yy, yy_, $avoiding_name_collisions, YY_START), - rules: [...], - conditions: {associative list: name ==> set}, - } - } - - - token location info (@$, _$, etc.): { - first_line: n, - last_line: n, - first_column: n, - last_column: n, - range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based) - } - - - the parseError function receives a 'hash' object with these members for lexer and parser errors: { - text: (matched text) - token: (the produced terminal token, if any) - line: (yylineno) - } - while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: { - loc: (yylloc) - expected: (string describing the set of expected tokens) - recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error) - } -*/ -var TeXZilla = (function(){ -var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,4],$V1=[1,6],$V2=[1,7],$V3=[1,8],$V4=[1,9],$V5=[68,195,198,200,202,204],$V6=[1,27],$V7=[1,124],$V8=[1,52],$V9=[1,48],$Va=[1,28],$Vb=[1,29],$Vc=[1,30],$Vd=[1,31],$Ve=[1,32],$Vf=[1,33],$Vg=[1,34],$Vh=[1,35],$Vi=[1,37],$Vj=[1,38],$Vk=[1,39],$Vl=[1,40],$Vm=[1,41],$Vn=[1,42],$Vo=[1,43],$Vp=[1,44],$Vq=[1,45],$Vr=[1,46],$Vs=[1,47],$Vt=[1,49],$Vu=[1,50],$Vv=[1,51],$Vw=[1,53],$Vx=[1,54],$Vy=[1,55],$Vz=[1,56],$VA=[1,57],$VB=[1,58],$VC=[1,59],$VD=[1,60],$VE=[1,61],$VF=[1,62],$VG=[1,63],$VH=[1,64],$VI=[1,65],$VJ=[1,66],$VK=[1,67],$VL=[1,68],$VM=[1,69],$VN=[1,70],$VO=[1,71],$VP=[1,72],$VQ=[1,73],$VR=[1,74],$VS=[1,75],$VT=[1,76],$VU=[1,77],$VV=[1,78],$VW=[1,79],$VX=[1,80],$VY=[1,81],$VZ=[1,82],$V_=[1,83],$V$=[1,84],$V01=[1,85],$V11=[1,86],$V21=[1,87],$V31=[1,88],$V41=[1,89],$V51=[1,90],$V61=[1,91],$V71=[1,92],$V81=[1,93],$V91=[1,94],$Va1=[1,95],$Vb1=[1,96],$Vc1=[1,97],$Vd1=[1,98],$Ve1=[1,99],$Vf1=[1,100],$Vg1=[1,101],$Vh1=[1,102],$Vi1=[1,103],$Vj1=[1,104],$Vk1=[1,105],$Vl1=[1,106],$Vm1=[1,107],$Vn1=[1,24],$Vo1=[1,108],$Vp1=[1,109],$Vq1=[1,110],$Vr1=[1,111],$Vs1=[1,112],$Vt1=[1,113],$Vu1=[1,114],$Vv1=[1,115],$Vw1=[1,116],$Vx1=[1,117],$Vy1=[1,118],$Vz1=[1,119],$VA1=[1,120],$VB1=[1,121],$VC1=[1,122],$VD1=[1,123],$VE1=[1,16],$VF1=[1,17],$VG1=[1,18],$VH1=[1,19],$VI1=[1,20],$VJ1=[1,21],$VK1=[1,22],$VL1=[6,10,53,64,65,66,144,146,148,150,152,154,156,158,160,162,164,189,192,199,201,203,205],$VM1=[8,49,50,51,56,57,58,59,60,61,62,63,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,139,141,142,145,147,149,151,153,155,157,159,161,163,165,166,173,174,179,180,181,182,183,184,185],$VN1=[1,134],$VO1=[6,8,10,49,50,51,53,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,139,141,142,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,173,174,189,192,199,201,203,205],$VP1=[1,137],$VQ1=[6,8,10,49,50,51,53,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,138,139,141,142,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,169,170,171,173,174,189,192,199,201,203,205],$VR1=[1,161],$VS1=[2,197],$VT1=[1,217],$VU1=[1,214],$VV1=[6,8,10,49,50,51,53,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,139,141,142,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,169,170,173,174,189,192,199,201,203,205],$VW1=[1,241],$VX1=[1,243],$VY1=[1,244],$VZ1=[1,259],$V_1=[4,8],$V$1=[1,275],$V02=[8,49,50,51,56,57,58,59,60,61,62,63,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,138,139,141,142,145,147,149,151,153,155,157,159,161,163,165,166],$V12=[1,286],$V22=[10,144,146,148,150,152,154,156,158,160,162,164,192],$V32=[1,288],$V42=[10,144,146,148,150,152,154,156,158,160,162,164,189,192],$V52=[164,189,192],$V62=[10,189,192],$V72=[1,343],$V82=[1,344],$V92=[1,352],$Va2=[1,353],$Vb2=[4,8,49,50,51,56,57,58,59,60,61,62,63,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,139,141,142,145,147,149,151,153,155,157,159,161,163,165,166],$Vc2=[10,21,23],$Vd2=[10,21,23,25,27],$Ve2=[1,399],$Vf2=[1,400],$Vg2=[1,401],$Vh2=[1,402],$Vi2=[1,403],$Vj2=[1,404],$Vk2=[1,405],$Vl2=[1,406],$Vm2=[10,19,21,23,25,27,29,31,33,35,37,39,41],$Vn2=[10,19,21,23,29,31,33,35,37,39,41]; -var parser = {trace: function trace () { }, -yy: {}, -symbols_: {"error":2,"textOptArg":3,"[":4,"TEXTOPTARG":5,"]":6,"textArg":7,"{":8,"TEXTARG":9,"}":10,"lengthOptArg":11,"lengthArg":12,"attrOptArg":13,"attrArg":14,"tokenContent":15,"arrayAlign":16,"columnAlign":17,"collayout":18,"COLLAYOUT":19,"colalign":20,"COLALIGN":21,"rowalign":22,"ROWALIGN":23,"rowspan":24,"ROWSPAN":25,"colspan":26,"COLSPAN":27,"align":28,"ALIGN":29,"eqrows":30,"EQROWS":31,"eqcols":32,"EQCOLS":33,"rowlines":34,"ROWLINES":35,"collines":36,"COLLINES":37,"frame":38,"FRAME":39,"padding":40,"PADDING":41,"cellopt":42,"celloptList":43,"rowopt":44,"arrayopt":45,"arrayoptList":46,"rowoptList":47,"left":48,"LEFT":49,"OPFS":50,".":51,"right":52,"RIGHT":53,"closedTerm":54,"styledExpression":55,"BIG":56,"BBIG":57,"BIGG":58,"BBIGG":59,"BIGL":60,"BBIGL":61,"BIGGL":62,"BBIGGL":63,"TEXATOP":64,"TEXOVER":65,"TEXCHOOSE":66,"NUM":67,"TEXT":68,"A":69,"AILL":70,"AIUL":71,"AILG":72,"AIUG":73,"F":74,"MI":75,"MN":76,"MO":77,"OP":78,"OPS":79,"OPAS":80,"MS":81,"MTEXT":82,"HIGH_SURROGATE":83,"LOW_SURROGATE":84,"BMP_CHARACTER":85,"OPERATORNAME":86,"MATHOP":87,"MATHBIN":88,"MATHREL":89,"FRAC":90,"ROOT":91,"SQRT":92,"UNDERSET":93,"OVERSET":94,"UNDEROVERSET":95,"XARROW":96,"MATHRLAP":97,"MATHLLAP":98,"MATHCLAP":99,"PHANTOM":100,"TFRAC":101,"BINOM":102,"TBINOM":103,"PMOD":104,"UNDERBRACE":105,"UNDERLINE":106,"OVERBRACE":107,"ACCENT":108,"ACCENTNS":109,"BOXED":110,"SLASH":111,"QUAD":112,"QQUAD":113,"NEGSPACE":114,"NEGMEDSPACE":115,"NEGTHICKSPACE":116,"THINSPACE":117,"MEDSPACE":118,"THICKSPACE":119,"SPACE":120,"MATHRAISEBOX":121,"MATHBB":122,"MATHBF":123,"MATHBIT":124,"MATHSCR":125,"MATHBSCR":126,"MATHSF":127,"MATHFRAK":128,"MATHIT":129,"MATHTT":130,"MATHRM":131,"HREF":132,"STATUSLINE":133,"TOOLTIP":134,"TOGGLE":135,"BTOGGLE":136,"closedTermList":137,"ETOGGLE":138,"TENSOR":139,"subsupList":140,"MULTI":141,"BMATRIX":142,"tableRowList":143,"EMATRIX":144,"BGATHERED":145,"EGATHERED":146,"BPMATRIX":147,"EPMATRIX":148,"BBMATRIX":149,"EBMATRIX":150,"BVMATRIX":151,"EVMATRIX":152,"BBBMATRIX":153,"EBBMATRIX":154,"BVVMATRIX":155,"EVVMATRIX":156,"BSMALLMATRIX":157,"ESMALLMATRIX":158,"BCASES":159,"ECASES":160,"BALIGNED":161,"EALIGNED":162,"BARRAY":163,"EARRAY":164,"SUBSTACK":165,"ARRAY":166,"ARRAYOPTS":167,"compoundTerm":168,"_":169,"^":170,"OPP":171,"opm":172,"OPM":173,"FM":174,"compoundTermList":175,"subsupTermScript":176,"subsupTerm":177,"textstyle":178,"DISPLAYSTYLE":179,"TEXTSTYLE":180,"TEXTSIZE":181,"SCRIPTSIZE":182,"SCRIPTSCRIPTSIZE":183,"COLOR":184,"BGCOLOR":185,"tableCell":186,"CELLOPTS":187,"tableCellList":188,"COLSEP":189,"tableRow":190,"ROWOPTS":191,"ROWSEP":192,"document":193,"documentItemList":194,"EOF":195,"documentItem":196,"mathItem":197,"STARTMATH0":198,"ENDMATH0":199,"STARTMATH1":200,"ENDMATH1":201,"STARTMATH2":202,"ENDMATH2":203,"STARTMATH3":204,"ENDMATH3":205,"$accept":0,"$end":1}, -terminals_: {2:"error",4:"[",5:"TEXTOPTARG",6:"]",8:"{",9:"TEXTARG",10:"}",19:"COLLAYOUT",21:"COLALIGN",23:"ROWALIGN",25:"ROWSPAN",27:"COLSPAN",29:"ALIGN",31:"EQROWS",33:"EQCOLS",35:"ROWLINES",37:"COLLINES",39:"FRAME",41:"PADDING",49:"LEFT",50:"OPFS",51:".",53:"RIGHT",56:"BIG",57:"BBIG",58:"BIGG",59:"BBIGG",60:"BIGL",61:"BBIGL",62:"BIGGL",63:"BBIGGL",64:"TEXATOP",65:"TEXOVER",66:"TEXCHOOSE",67:"NUM",68:"TEXT",69:"A",70:"AILL",71:"AIUL",72:"AILG",73:"AIUG",74:"F",75:"MI",76:"MN",77:"MO",78:"OP",79:"OPS",80:"OPAS",81:"MS",82:"MTEXT",83:"HIGH_SURROGATE",84:"LOW_SURROGATE",85:"BMP_CHARACTER",86:"OPERATORNAME",87:"MATHOP",88:"MATHBIN",89:"MATHREL",90:"FRAC",91:"ROOT",92:"SQRT",93:"UNDERSET",94:"OVERSET",95:"UNDEROVERSET",96:"XARROW",97:"MATHRLAP",98:"MATHLLAP",99:"MATHCLAP",100:"PHANTOM",101:"TFRAC",102:"BINOM",103:"TBINOM",104:"PMOD",105:"UNDERBRACE",106:"UNDERLINE",107:"OVERBRACE",108:"ACCENT",109:"ACCENTNS",110:"BOXED",111:"SLASH",112:"QUAD",113:"QQUAD",114:"NEGSPACE",115:"NEGMEDSPACE",116:"NEGTHICKSPACE",117:"THINSPACE",118:"MEDSPACE",119:"THICKSPACE",120:"SPACE",121:"MATHRAISEBOX",122:"MATHBB",123:"MATHBF",124:"MATHBIT",125:"MATHSCR",126:"MATHBSCR",127:"MATHSF",128:"MATHFRAK",129:"MATHIT",130:"MATHTT",131:"MATHRM",132:"HREF",133:"STATUSLINE",134:"TOOLTIP",135:"TOGGLE",136:"BTOGGLE",138:"ETOGGLE",139:"TENSOR",141:"MULTI",142:"BMATRIX",144:"EMATRIX",145:"BGATHERED",146:"EGATHERED",147:"BPMATRIX",148:"EPMATRIX",149:"BBMATRIX",150:"EBMATRIX",151:"BVMATRIX",152:"EVMATRIX",153:"BBBMATRIX",154:"EBBMATRIX",155:"BVVMATRIX",156:"EVVMATRIX",157:"BSMALLMATRIX",158:"ESMALLMATRIX",159:"BCASES",160:"ECASES",161:"BALIGNED",162:"EALIGNED",163:"BARRAY",164:"EARRAY",165:"SUBSTACK",166:"ARRAY",167:"ARRAYOPTS",169:"_",170:"^",171:"OPP",173:"OPM",174:"FM",179:"DISPLAYSTYLE",180:"TEXTSTYLE",181:"TEXTSIZE",182:"SCRIPTSIZE",183:"SCRIPTSCRIPTSIZE",184:"COLOR",185:"BGCOLOR",187:"CELLOPTS",189:"COLSEP",191:"ROWOPTS",192:"ROWSEP",195:"EOF",198:"STARTMATH0",199:"ENDMATH0",200:"STARTMATH1",201:"ENDMATH1",202:"STARTMATH2",203:"ENDMATH2",204:"STARTMATH3",205:"ENDMATH3"}, -productions_: [0,[3,3],[7,3],[11,3],[12,3],[13,1],[14,1],[15,1],[16,1],[17,1],[18,2],[20,2],[22,2],[24,2],[26,2],[28,2],[30,2],[32,2],[34,2],[36,2],[38,2],[40,2],[42,1],[42,1],[42,1],[42,1],[43,1],[43,2],[44,1],[44,1],[45,1],[45,1],[45,1],[45,1],[45,1],[45,1],[45,1],[45,1],[45,1],[45,1],[46,1],[46,2],[47,1],[47,2],[48,2],[48,2],[52,2],[52,2],[54,2],[54,3],[54,2],[54,2],[54,2],[54,2],[54,2],[54,2],[54,2],[54,2],[54,3],[54,5],[54,5],[54,5],[54,5],[54,5],[54,5],[54,1],[54,1],[54,1],[54,1],[54,1],[54,1],[54,1],[54,1],[54,2],[54,2],[54,2],[54,1],[54,1],[54,1],[54,1],[54,1],[54,2],[54,4],[54,2],[54,2],[54,1],[54,2],[54,2],[54,2],[54,2],[54,3],[54,3],[54,2],[54,5],[54,3],[54,3],[54,4],[54,5],[54,2],[54,2],[54,2],[54,2],[54,2],[54,3],[54,3],[54,3],[54,2],[54,2],[54,2],[54,2],[54,2],[54,2],[54,2],[54,2],[54,1],[54,1],[54,1],[54,1],[54,1],[54,1],[54,1],[54,1],[54,4],[54,5],[54,4],[54,3],[54,2],[54,2],[54,2],[54,2],[54,2],[54,2],[54,2],[54,2],[54,2],[54,2],[54,3],[54,3],[54,3],[54,3],[54,3],[54,5],[54,8],[54,7],[54,7],[54,3],[54,3],[54,3],[54,3],[54,3],[54,3],[54,3],[54,3],[54,3],[54,3],[54,5],[54,4],[54,4],[54,4],[54,8],[137,1],[137,2],[168,3],[168,5],[168,4],[168,5],[168,4],[168,3],[168,3],[168,2],[168,1],[168,5],[168,5],[168,3],[168,3],[168,1],[172,1],[172,1],[175,1],[175,2],[176,1],[176,1],[177,4],[177,2],[177,2],[177,3],[140,1],[140,2],[178,1],[178,1],[178,1],[178,1],[178,1],[178,2],[178,2],[55,2],[55,1],[186,0],[186,5],[186,1],[188,1],[188,3],[190,5],[190,1],[143,1],[143,3],[193,2],[194,1],[194,2],[196,1],[196,1],[197,2],[197,3],[197,2],[197,3],[197,3],[197,3]], -performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) { -/* this == yyval */ - -var $0 = $$.length - 1; -switch (yystate) { -case 1: - - /* Unescape \] and \\. */ - this.$ = $$[$0-1].replace(/\\[\\\]]/g, function(match) { return match.slice(1); }); - /* Escape some XML characters. */ - this.$ = escapeText(this.$); - -break; -case 2: - - /* Unescape \} and \\. */ - this.$ = $$[$0-1].replace(/\\[\\\}]/g, function(match) { return match.slice(1); }); - /* Escape some XML characters. */ - this.$ = escapeText(this.$); - -break; -case 3: case 4: - - this.$ = parseLength($$[$0-1]); - -break; -case 5: case 6: - this.$ = escapeQuote($$[$0]); -break; -case 7: - - /* The MathML specification indicates that trailing/leading whitespaces - should be removed and that inner whitespace should be collapsed. Let's - replace trailing/leading whitespace by no-break space so that people can - write e.g. \text{ if }. We also collapse internal whitespace here. - See https://github.com/fred-wang/TeXZilla/issues/25. */ - this.$ = $$[$0].replace(/\s+/g, " ").replace(/^ | $/g, "\u00A0"); - -break; -case 8: - - $$[$0] = $$[$0].trim(); - if ($$[$0] === "t") { - this.$ = "axis 1"; - } else if ($$[$0] === "c") { - this.$ = "center"; - } else if ($$[$0] === "b") { - this.$ = "axis -1"; - } else { - throw "Unknown array alignment"; - } - -break; -case 9: - - this.$ = ""; - $$[$0] = $$[$0].replace(/\s+/g, "");; - for (var i = 0; i < $$[$0].length; i++) { - if ($$[$0][i] === "c") { - this.$ += " center"; - } else if ($$[$0][i] === "l") { - this.$ += " left"; - } else if ($$[$0][i] === "r") { - this.$ += " right"; - } - } - if (this.$.length) { - this.$ = this.$.slice(1); - } else { - throw "Invalid column alignments"; - } - -break; -case 10: case 11: - this.$ = {"columnalign": $$[$0]}; -break; -case 12: - this.$ = {"rowalign": $$[$0]}; -break; -case 13: - this.$ = {"rowspan": $$[$0]}; -break; -case 14: - this.$ = {"colspan": $$[$0]}; -break; -case 15: - this.$ = {"align": $$[$0]}; -break; -case 16: - this.$ = {"equalrows": $$[$0]}; -break; -case 17: - this.$ = {"equalcolumns": $$[$0]}; -break; -case 18: - this.$ = {"rowlines": $$[$0]}; -break; -case 19: - this.$ = {"columnlines": $$[$0]}; -break; -case 20: - this.$ = {"frame": $$[$0]}; -break; -case 21: - this.$ = {"rowspacing": $$[$0], "columnspacing": $$[$0]}; -break; -case 22: case 23: case 24: case 25: case 26: case 28: case 29: case 30: case 31: case 32: case 33: case 34: case 35: case 36: case 37: case 38: case 39: case 40: case 42: case 170: case 175: case 180: case 181: case 186: case 196: case 207: case 209: - this.$ = $$[$0]; -break; -case 27: case 41: case 43: - this.$ = Object.assign($$[$0-1], $$[$0]); -break; -case 44: case 46: - - this.$ = newMo($$[$0]); - -break; -case 45: case 47: - - this.$ = ""; - -break; -case 48: - this.$ = newTag("mrow"); -break; -case 49: - this.$ = newMrow($$[$0-1]); -break; -case 50: case 54: - - this.$ = newTag("mo", $$[$0], {"maxsize": "1.2em", "minsize": "1.2em"}); - -break; -case 51: case 55: - - this.$ = newTag("mo", $$[$0], {"maxsize": "1.8em", "minsize": "1.8em"}); - -break; -case 52: case 56: - - this.$ = newTag("mo", $$[$0], {"maxsize": "2.4em", "minsize": "2.4em"}); - -break; -case 53: case 57: - - this.$ = newTag("mo", $$[$0], {"maxsize": "3em", "minsize": "3em"}); - -break; -case 58: - - this.$ = newTag("mrow", [$$[$0-2], newMrow($$[$0-1]), $$[$0]]); - -break; -case 59: - - this.$ = newTag("mfrac", [newMrow($$[$0-3]), newMrow($$[$0-1])], {"linethickness": "0px"}); - -break; -case 60: - - this.$ = newTag("mfrac", [newMrow($$[$0-3]), newMrow($$[$0-1])], {"linethickness": "0px"}); - this.$ = newTag("mrow", [$$[$0-4], this.$, $$[$0]]); - -break; -case 61: - - this.$ = newTag("mfrac", [newMrow($$[$0-3]), newMrow($$[$0-1])]); - -break; -case 62: - - this.$ = newTag("mfrac", [newMrow($$[$0-3]), newMrow($$[$0-1])]); - this.$ = newTag("mrow", [$$[$0-4], this.$, $$[$0]]); - -break; -case 63: - - this.$ = newTag("mfrac", [newMrow($$[$0-3]), newMrow($$[$0-1])], {"linethickness": "0px"}); - this.$ = newTag("mrow", [newMo("("), this.$, newMo(")")]); - -break; -case 64: - - this.$ = newTag("mfrac", [newMrow($$[$0-3]), newMrow($$[$0-1])], {"linethickness": "0px"}); - this.$ = newTag("mrow", [$$[$0-4], this.$, $$[$0]]); - this.$ = newTag("mrow", [newMo("("), this.$, newMo(")")]); - -break; -case 65: case 74: - this.$ = newTag("mn", $$[$0]); -break; -case 66: case 83: case 85: - this.$ = newTag("mtext", $$[$0]); -break; -case 67: case 68: case 69: case 70: - this.$ = newMi($$[$0]); -break; -case 71: - this.$ = newMi($$[$0], true); -break; -case 72: case 177: - this.$ = newMo($$[$0], 0, 0); -break; -case 73: - this.$ = newTag("mi", $$[$0]); -break; -case 75: case 76: case 77: case 176: - this.$ = newMo($$[$0]); -break; -case 78: case 79: case 80: - this.$ = newTag("mo", $$[$0], {"stretchy": "false"}); -break; -case 81: - this.$ = newTag("ms", $$[$0]); -break; -case 82: - - this.$ = newTag("ms", $$[$0], {"lquote": $$[$0-2], "rquote": $$[$0-1]}); - -break; -case 84: - this.$ = newTag("mtext", $$[$0-1] + $$[$0]); -break; -case 86: - - this.$ = newMo($$[$0], 0, namedSpaceToEm("thinmathspace")); - -break; -case 87: - - this.$ = newMo($$[$0], namedSpaceToEm("thinmathspace"), - namedSpaceToEm("thinmathspace")); - -break; -case 88: - - this.$ = newMo($$[$0], namedSpaceToEm("mediummathspace"), - namedSpaceToEm("mediummathspace")); - -break; -case 89: - - this.$ = newMo($$[$0], namedSpaceToEm("thickmathspace"), - namedSpaceToEm("thickmathspace")); - -break; -case 90: - this.$ = newTag("mfrac", [$$[$0-1], $$[$0]]); -break; -case 91: - this.$ = newTag("mroot", [$$[$0], $$[$0-1]]); -break; -case 92: - this.$ = newTag("msqrt", [$$[$0]]); -break; -case 93: - - this.$ = newTag("mroot", [$$[$0], newMrow($$[$0-2])]); - -break; -case 94: - this.$ = newTag("munder", [$$[$0], $$[$0-1]]); -break; -case 95: - this.$ = newTag("mover", [$$[$0], $$[$0-1]]); -break; -case 96: - - this.$ = newTag("munderover", [$$[$0], $$[$0-2], $$[$0-1]]); -break; -case 97: - - this.$ = (isEmptyMrow($$[$0]) ? - newTag("munder", [newMo($$[$0-4]), newMrow($$[$0-2])]) : - newTag("munderover", [newMo($$[$0-4]), newMrow($$[$0-2]), $$[$0]])); - -break; -case 98: - - this.$ = newTag("mover", [newMo($$[$0-1]), $$[$0]]); - -break; -case 99: - this.$ = newTag("mpadded", [$$[$0]], {"width": "0em"}); -break; -case 100: - - this.$ = newTag("mpadded", [$$[$0]], {"width": "0em", "lspace": "-100%width"}); - -break; -case 101: - - this.$ = newTag("mpadded", [$$[$0]], {"width": "0em", "lspace": "-50%width"}); - -break; -case 102: - this.$ = newTag("mphantom", [$$[$0]]); -break; -case 103: - - this.$ = newTag("mfrac", [$$[$0-1], $$[$0]]); - this.$ = newMrow([this.$], "mstyle", {"displaystyle": "false"}); - -break; -case 104: - - this.$ = newTag("mfrac", [$$[$0-1], $$[$0]], {"linethickness": "0px"}); - this.$ = newTag("mrow", [newMo("("), this.$, newMo(")")]); - -break; -case 105: - - this.$ = newTag("mfrac", [$$[$0-1], $$[$0]], {"linethickness": "0px"}); - this.$ = newMrow([this.$], "mstyle", {"displaystyle": "false"}); - this.$ = newTag("mrow", [newMo("("), this.$, newMo(")")]); - -break; -case 106: - - this.$ = newTag("mrow", - [newMo("(", namedSpaceToEm("mediummathspace")), - newMo("mod", undefined, namedSpaceToEm("thinmathspace")), $$[$0], - newMo(")", undefined, namedSpaceToEm("mediummathspace"))]); - -break; -case 107: - this.$ = newTag("munder", [$$[$0], newMo("\u23DF")]); -break; -case 108: - this.$ = newTag("munder", [$$[$0], newMo("_")]); -break; -case 109: - this.$ = newTag("mover", [$$[$0], newMo("\u23DE")]); -break; -case 110: - - this.$ = newTag("mover", [$$[$0], newMo($$[$0-1])]); - -break; -case 111: - - this.$ = newTag("mover", [$$[$0], newTag("mo", $$[$0-1], {"stretchy": "false"})]); - -break; -case 112: - this.$ = newTag("menclose", [$$[$0]], {"notation": "box"}); -break; -case 113: - - this.$ = newTag("menclose", [$$[$0]], {"notation": "updiagonalstrike"}); - -break; -case 114: - this.$ = newSpace(1); -break; -case 115: - this.$ = newSpace(2); -break; -case 116: - this.$ = newSpace(namedSpaceToEm("negativethinmathspace")); -break; -case 117: - this.$ = newSpace(namedSpaceToEm("negativemediummathspace")); -break; -case 118: - this.$ = newSpace(namedSpaceToEm("negativethickmathspace")); -break; -case 119: - this.$ = newSpace(namedSpaceToEm("thinmathspace")); -break; -case 120: - this.$ = newSpace(namedSpaceToEm("mediummathspace")); -break; -case 121: - this.$ = newSpace(namedSpaceToEm("thickmathspace")); -break; -case 122: - - this.$ = newTag("mspace", null, - {"height": "." + $$[$0-2] + "ex", - "depth": "." + $$[$0-1] + "ex", - "width": "." + $$[$0] + "em"}); - -break; -case 123: - - this.$ = newTag("mpadded", [$$[$0]], - {"voffset": $$[$0-3].l + $$[$0-3].u, - "height": $$[$0-2].l + $$[$0-2].u, - "depth": $$[$0-1].l + $$[$0-1].u}); - -break; -case 124: - - this.$ = newTag("mpadded", [$$[$0]], - {"voffset": $$[$0-2].l + $$[$0-2].u, - "height": $$[$0-1].l + $$[$0-1].u, - "depth": ($$[$0-2].l < 0 ? "+" + (-$$[$0-2].l) + $$[$0-2].u : "depth")}); - -break; -case 125: - - var attributes = {"voffset": $$[$0-1].l + $$[$0-1].u}; - if ($$[$0-1].l >= 0) - attributes.height = "+" + $$[$0-1].l + $$[$0-1].u; - else { - attributes.height = "0pt"; - attributes.depth = "+" + (-$$[$0-1].l) + $$[$0-1].u; - } - this.$ = newTag("mpadded", [$$[$0]], attributes); - -break; -case 126: - - this.$ = newMrow([$$[$0]], "mstyle", {"mathvariant": "double-struck"}); - -break; -case 127: - this.$ = newMrow([$$[$0]], "mstyle", {"mathvariant": "bold"}); -break; -case 128: - this.$ = newMrow([$$[$0]], "mstyle", - {"mathvariant": "bold-italic"}); -break; -case 129: - this.$ = newMrow([$$[$0]], "mstyle", - {"mathvariant": "script"}); -break; -case 130: - - this.$ = newMrow([$$[$0]], "mstyle", {"mathvariant": "bold-script"}); - -break; -case 131: - - this.$ = newMrow([$$[$0]], "mstyle", {"mathvariant": "sans-serif"}); - -break; -case 132: - this.$ = newMrow([$$[$0]], "mstyle", - {"mathvariant": "fraktur"}); -break; -case 133: - this.$ = newMrow([$$[$0]], "mstyle", - {"mathvariant": "italic"}); -break; -case 134: - this.$ = newMrow([$$[$0]], "mstyle", - {"mathvariant": "monospace"}); -break; -case 135: - this.$ = newMrow([$$[$0]], "mstyle", - {"mathvariant": "normal"}); -break; -case 136: - - this.$ = newTag("mrow", [$$[$0]], yy.mSafeMode ? null : {"href": $$[$0-1]}); - -break; -case 137: - - this.$ = yy.mSafeMode ? $$[$0] : - newTag("maction", - [$$[$0], newTag("mtext", $$[$0-1])], {"actiontype": "statusline"}); - -break; -case 138: - - this.$ = yy.mSafeMode ? $$[$0] : - newTag("maction", - [$$[$0], newTag("mtext", $$[$0-1])], {"actiontype": "tooltip"}); - -break; -case 139: - - /* Backward compatibility with itex2MML */ - this.$ = yy.mSafeMode ? $$[$0] : - newTag("maction", [$$[$0-1], $$[$0]], {"actiontype": "toggle", selection: "2"}); - -break; -case 140: - - this.$ = yy.mSafeMode ? newTag("mrow", $$[$0-1]) : - newTag("maction", $$[$0-1], {"actiontype": "toggle"}); - -break; -case 141: case 144: - - this.$ = newTag("mmultiscripts", [$$[$0-3]].concat($$[$0-1])); - -break; -case 142: - - this.$ = newTag("mmultiscripts", [$$[$0-3]].concat($$[$0-1]).concat(newTag("mprescripts")).concat($$[$0-5])); - -break; -case 143: - - this.$ = newTag("mmultiscripts", [$$[$0-2], newTag("mprescripts")].concat($$[$0-4])); - -break; -case 145: - - this.$ = newTag("mtable", $$[$0-1], {"displaystyle": "false", "rowspacing": "0.5ex"}); - -break; -case 146: - - this.$ = newTag("mtable", $$[$0-1], {"displaystyle": "true", "rowspacing": "1.0ex"}); - -break; -case 147: - - this.$ = newTag("mtable", $$[$0-1], {"displaystyle": "false", "rowspacing": "0.5ex"}); - this.$ = newTag("mrow", [newMo("("), this.$, newMo(")")]); - -break; -case 148: - - this.$ = newTag("mtable", $$[$0-1], {"displaystyle": "false", "rowspacing": "0.5ex"}); - this.$ = newTag("mrow", [newMo("["), this.$, newMo("]")]); - -break; -case 149: - - this.$ = newTag("mtable", $$[$0-1], {"displaystyle": "false", "rowspacing": "0.5ex"}); - this.$ = newTag("mrow", [newMo("|"), this.$, newMo("|")]); - -break; -case 150: - - this.$ = newTag("mtable", $$[$0-1], {"displaystyle": "false", "rowspacing": "0.5ex"}); - this.$ = newTag("mrow", [newMo("{"), this.$, newMo("}")]); - -break; -case 151: - - this.$ = newTag("mtable", $$[$0-1], {"displaystyle": "false", "rowspacing": "0.5ex"}); - this.$ = newTag("mrow", [newMo("\u2016"), this.$, newMo("\u2016")]); - -break; -case 152: - - this.$ = newTag("mtable", $$[$0-1], {"displaystyle": "false", "rowspacing": "0.5ex"}); - this.$ = newMrow([this.$], "mstyle", {"scriptlevel": "2"}); - -break; -case 153: - - this.$ = newTag("mtable", $$[$0-1], {"displaystyle": "false", - "columnalign": "left left"}); - this.$ = newTag("mrow", [newMo("{"), this.$]); - -break; -case 154: - - this.$ = newTag("mtable", $$[$0-1], {"displaystyle": "true", - "columnalign": "right left right left right left right left right left", - "columnspacing": "0em"}); - -break; -case 155: - - this.$ = newTag("mtable", $$[$0-1], - {"displaystyle": "false", "rowspacing": "0.5ex", "align": $$[$0-3], - "columnalign": $$[$0-2]}); - -break; -case 156: - - this.$ = newTag("mtable", $$[$0-1], - {"displaystyle": "false", "rowspacing": "0.5ex", - "columnalign": $$[$0-2]}); - -break; -case 157: - - this.$ = newTag("mtable", $$[$0-1], - {"displaystyle": "false", "columnalign": "center", - "rowspacing": "0.5ex"}); - -break; -case 158: - - this.$ = newTag("mtable", $$[$0-1], {"displaystyle": "false"}); - -break; -case 159: - - this.$ = newTag("mtable", $$[$0-1], Object.assign($$[$0-3], {"displaystyle": "false"})); - -break; -case 160: - - this.$ = [$$[$0]]; - -break; -case 161: - - this.$ = $$[$0-1].concat([$$[$0]]); - -break; -case 162: - - this.$ = newTag("mmultiscripts", [$$[$0-1]].concat($$[$0])); - -break; -case 163: - - this.$ = newTag("msubsup", [$$[$0-4], $$[$0-2], $$[$0]]); - -break; -case 164: - - this.$ = newTag("msubsup", [$$[$0-3], $$[$0-1], newMo($$[$0])]); - -break; -case 165: - - this.$ = newTag("msubsup", [$$[$0-4], $$[$0], $$[$0-2]]); - -break; -case 166: - - this.$ = newTag("msubsup", [$$[$0-3], $$[$0], newMo($$[$0-2])]); - -break; -case 167: - - this.$ = newTag("msub", [$$[$0-2], $$[$0]]); - -break; -case 168: - - this.$ = newTag("msup", [$$[$0-2], $$[$0]]); - -break; -case 169: - - this.$ = newTag("msup", [$$[$0-1], newMo($$[$0])]); - -break; -case 171: - - this.$ = newTag("munderover", [$$[$0-4], $$[$0-2], $$[$0]]); - -break; -case 172: - - this.$ = newTag("munderover", [$$[$0-4], $$[$0], $$[$0-2]]); - -break; -case 173: - - this.$ = newTag("munder", [$$[$0-2], $$[$0]]); - -break; -case 174: - - this.$ = newTag("mover", [$$[$0-2], $$[$0]]); - -break; -case 178: case 200: case 204: - this.$ = [$$[$0]]; -break; -case 179: - this.$ = $$[$0-1].concat([$$[$0]]); -break; -case 182: - this.$ = [$$[$0-2], $$[$0]]; -break; -case 183: - this.$ = [$$[$0], newTag("none")]; -break; -case 184: case 185: - this.$ = [newTag("none"), $$[$0]]; -break; -case 187: - this.$ = $$[$0-1].concat($$[$0]); -break; -case 188: - this.$ = {"displaystyle": "true"}; -break; -case 189: - this.$ = {"displaystyle": "false"}; -break; -case 190: - this.$ = {"scriptlevel": "0"}; -break; -case 191: - this.$ = {"scriptlevel": "1"}; -break; -case 192: - this.$ = {"scriptlevel": "2"}; -break; -case 193: - this.$ = {"mathcolor": $$[$0]}; -break; -case 194: - this.$ = {"mathbackground": $$[$0]}; -break; -case 195: - this.$ = [newMrow($$[$0], "mstyle", $$[$0-1])]; -break; -case 197: - this.$ = newTag("mtd", []); -break; -case 198: - - this.$ = newMrow($$[$0], "mtd", $$[$0-2]); - -break; -case 199: - this.$ = newMrow($$[$0], "mtd"); -break; -case 201: case 205: - this.$ = $$[$0-2].concat([$$[$0]]); -break; -case 202: - - this.$ = this.$ = newTag("mtr", $$[$0], $$[$0-2]); - -break; -case 203: - this.$ = newTag("mtr", $$[$0]); -break; -case 206: - - this.$ = $$[$0-1] - return this.$; - -break; -case 208: - this.$ = $$[$0-1] + $$[$0] -break; -case 210: - - this.$ = serializeTree($$[$0]); - -break; -case 211: - - // \( \) - this.$ = newMath([newTag("mrow")], false, false, yy.tex); - -break; -case 212: - - // \( ... \) - this.$ = newMath($$[$0-1], false, false, yy.tex); - -break; -case 213: - - // \[ \] - this.$ = newMath([newTag("mrow")], true, false, yy.tex); - -break; -case 214: - - // \[ ... \] - this.$ = newMath($$[$0-1], true, false, yy.tex); - -break; -case 215: - - // $ ... $ - this.$ = newMath($$[$0-1], false, false, yy.tex); - -break; -case 216: - - // this.$ ... this.$ - this.$ = newMath($$[$0-1], true, false, yy.tex); - -break; -} -}, -table: [{68:$V0,193:1,194:2,196:3,197:5,198:$V1,200:$V2,202:$V3,204:$V4},{1:[3]},{68:$V0,195:[1,10],196:11,197:5,198:$V1,200:$V2,202:$V3,204:$V4},o($V5,[2,207]),o($V5,[2,209]),o($V5,[2,210]),{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:25,55:13,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$Vn1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1,168:23,172:26,173:$VC1,174:$VD1,175:15,178:14,179:$VE1,180:$VF1,181:$VG1,182:$VH1,183:$VI1,184:$VJ1,185:$VK1,199:[1,12]},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:25,55:126,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$Vn1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1,168:23,172:26,173:$VC1,174:$VD1,175:15,178:14,179:$VE1,180:$VF1,181:$VG1,182:$VH1,183:$VI1,184:$VJ1,185:$VK1,201:[1,125]},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:25,55:127,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$Vn1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1,168:23,172:26,173:$VC1,174:$VD1,175:15,178:14,179:$VE1,180:$VF1,181:$VG1,182:$VH1,183:$VI1,184:$VJ1,185:$VK1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:25,55:128,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$Vn1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1,168:23,172:26,173:$VC1,174:$VD1,175:15,178:14,179:$VE1,180:$VF1,181:$VG1,182:$VH1,183:$VI1,184:$VJ1,185:$VK1},{1:[2,206]},o($V5,[2,208]),o($V5,[2,211]),{199:[1,129]},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:25,55:130,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$Vn1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1,168:23,172:26,173:$VC1,174:$VD1,175:15,178:14,179:$VE1,180:$VF1,181:$VG1,182:$VH1,183:$VI1,184:$VJ1,185:$VK1},o($VL1,[2,196],{54:25,172:26,48:36,168:131,8:$V6,49:$V7,50:$V8,51:$V9,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$Vn1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1,173:$VC1,174:$VD1}),o($VM1,[2,188]),o($VM1,[2,189]),o($VM1,[2,190]),o($VM1,[2,191]),o($VM1,[2,192]),{7:133,8:$VN1,14:132},{7:133,8:$VN1,14:135},o($VO1,[2,178]),{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:136,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},o($VO1,[2,170],{169:[1,138],170:[1,139],171:[1,140]}),o($VO1,[2,175],{169:[1,141],170:[1,142]}),{8:$V6,10:[1,143],48:36,49:$V7,50:$V8,51:$V9,54:25,55:144,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$Vn1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1,168:23,172:26,173:$VC1,174:$VD1,175:15,178:14,179:$VE1,180:$VF1,181:$VG1,182:$VH1,183:$VI1,184:$VJ1,185:$VK1},{50:[1,145]},{50:[1,146]},{50:[1,147]},{50:[1,148]},{50:[1,149]},{50:[1,150]},{50:[1,151]},{50:[1,152]},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:25,55:153,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$Vn1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1,168:23,172:26,173:$VC1,174:$VD1,175:15,178:14,179:$VE1,180:$VF1,181:$VG1,182:$VH1,183:$VI1,184:$VJ1,185:$VK1},o($VQ1,[2,65]),o($VQ1,[2,66]),o($VQ1,[2,67]),o($VQ1,[2,68]),o($VQ1,[2,69]),o($VQ1,[2,70]),o($VQ1,[2,71]),o($VQ1,[2,72]),{7:155,8:$VN1,15:154},{7:155,8:$VN1,15:156},{7:155,8:$VN1,15:157},o($VQ1,[2,76]),o($VQ1,[2,77]),o($VQ1,[2,78]),o($VQ1,[2,79]),o($VQ1,[2,80]),{3:160,4:$VR1,7:155,8:$VN1,13:159,15:158},{7:155,8:$VN1,15:162},{84:[1,163]},o($VQ1,[2,85]),{7:164,8:$VN1},{7:165,8:$VN1},{7:166,8:$VN1},{7:167,8:$VN1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:168,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:169,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{4:[1,171],8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:170,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:172,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:173,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:174,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{4:[1,175],8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:176,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:177,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:178,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:179,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:180,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:181,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:182,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:183,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:184,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:185,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:186,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:187,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:188,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:189,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:190,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:191,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},o($VQ1,[2,114]),o($VQ1,[2,115]),o($VQ1,[2,116]),o($VQ1,[2,117]),o($VQ1,[2,118]),o($VQ1,[2,119]),o($VQ1,[2,120]),o($VQ1,[2,121]),{7:192,8:$VN1},{8:[1,194],12:193},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:195,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:196,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:197,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:198,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:199,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:200,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:201,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:202,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:203,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:204,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{7:133,8:$VN1,14:205},{7:206,8:$VN1},{7:207,8:$VN1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:208,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:210,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,137:209,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:[1,211]},o([144,189,192],$VS1,{178:14,175:15,168:23,54:25,172:26,48:36,143:212,190:213,188:215,186:216,55:218,8:$V6,49:$V7,50:$V8,51:$V9,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$Vn1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1,173:$VC1,174:$VD1,179:$VE1,180:$VF1,181:$VG1,182:$VH1,183:$VI1,184:$VJ1,185:$VK1,187:$VT1,191:$VU1}),o([146,189,192],$VS1,{178:14,175:15,168:23,54:25,172:26,48:36,190:213,188:215,186:216,55:218,143:219,8:$V6,49:$V7,50:$V8,51:$V9,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$Vn1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1,173:$VC1,174:$VD1,179:$VE1,180:$VF1,181:$VG1,182:$VH1,183:$VI1,184:$VJ1,185:$VK1,187:$VT1,191:$VU1}),o([148,189,192],$VS1,{178:14,175:15,168:23,54:25,172:26,48:36,190:213,188:215,186:216,55:218,143:220,8:$V6,49:$V7,50:$V8,51:$V9,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$Vn1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1,173:$VC1,174:$VD1,179:$VE1,180:$VF1,181:$VG1,182:$VH1,183:$VI1,184:$VJ1,185:$VK1,187:$VT1,191:$VU1}),o([150,189,192],$VS1,{178:14,175:15,168:23,54:25,172:26,48:36,190:213,188:215,186:216,55:218,143:221,8:$V6,49:$V7,50:$V8,51:$V9,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$Vn1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1,173:$VC1,174:$VD1,179:$VE1,180:$VF1,181:$VG1,182:$VH1,183:$VI1,184:$VJ1,185:$VK1,187:$VT1,191:$VU1}),o([152,189,192],$VS1,{178:14,175:15,168:23,54:25,172:26,48:36,190:213,188:215,186:216,55:218,143:222,8:$V6,49:$V7,50:$V8,51:$V9,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$Vn1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1,173:$VC1,174:$VD1,179:$VE1,180:$VF1,181:$VG1,182:$VH1,183:$VI1,184:$VJ1,185:$VK1,187:$VT1,191:$VU1}),o([154,189,192],$VS1,{178:14,175:15,168:23,54:25,172:26,48:36,190:213,188:215,186:216,55:218,143:223,8:$V6,49:$V7,50:$V8,51:$V9,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$Vn1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1,173:$VC1,174:$VD1,179:$VE1,180:$VF1,181:$VG1,182:$VH1,183:$VI1,184:$VJ1,185:$VK1,187:$VT1,191:$VU1}),o([156,189,192],$VS1,{178:14,175:15,168:23,54:25,172:26,48:36,190:213,188:215,186:216,55:218,143:224,8:$V6,49:$V7,50:$V8,51:$V9,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$Vn1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1,173:$VC1,174:$VD1,179:$VE1,180:$VF1,181:$VG1,182:$VH1,183:$VI1,184:$VJ1,185:$VK1,187:$VT1,191:$VU1}),o([158,189,192],$VS1,{178:14,175:15,168:23,54:25,172:26,48:36,190:213,188:215,186:216,55:218,143:225,8:$V6,49:$V7,50:$V8,51:$V9,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$Vn1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1,173:$VC1,174:$VD1,179:$VE1,180:$VF1,181:$VG1,182:$VH1,183:$VI1,184:$VJ1,185:$VK1,187:$VT1,191:$VU1}),o([160,189,192],$VS1,{178:14,175:15,168:23,54:25,172:26,48:36,190:213,188:215,186:216,55:218,143:226,8:$V6,49:$V7,50:$V8,51:$V9,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$Vn1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1,173:$VC1,174:$VD1,179:$VE1,180:$VF1,181:$VG1,182:$VH1,183:$VI1,184:$VJ1,185:$VK1,187:$VT1,191:$VU1}),o([162,189,192],$VS1,{178:14,175:15,168:23,54:25,172:26,48:36,190:213,188:215,186:216,55:218,143:227,8:$V6,49:$V7,50:$V8,51:$V9,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$Vn1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1,173:$VC1,174:$VD1,179:$VE1,180:$VF1,181:$VG1,182:$VH1,183:$VI1,184:$VJ1,185:$VK1,187:$VT1,191:$VU1}),{3:230,4:$VR1,7:231,8:$VN1,16:228,17:229},{8:[1,232]},{8:[1,233]},o($VV1,[2,176]),o($VV1,[2,177]),{50:[1,234],51:[1,235]},o($V5,[2,213]),{201:[1,236]},{203:[1,237]},{205:[1,238]},o($V5,[2,212]),o($VL1,[2,195]),o($VO1,[2,179]),o($VM1,[2,193]),o([8,10,19,21,23,25,27,29,31,33,35,37,39,41,49,50,51,56,57,58,59,60,61,62,63,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,139,141,142,145,147,149,151,153,155,157,159,161,163,165,166,173,174,179,180,181,182,183,184,185],[2,6]),{9:[1,239]},o($VM1,[2,194]),{8:$VW1,140:240,169:$VX1,170:$VY1,177:242},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:245,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:246,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:247,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},o($VO1,[2,169],{169:[1,248]}),{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:249,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:250,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},o($VQ1,[2,48]),{10:[1,251],64:[1,252],65:[1,253],66:[1,254]},o($VQ1,[2,50]),o($VQ1,[2,51]),o($VQ1,[2,52]),o($VQ1,[2,53]),o($VQ1,[2,54]),o($VQ1,[2,55]),o($VQ1,[2,56]),o($VQ1,[2,57]),{52:255,53:$VZ1,64:[1,256],65:[1,257],66:[1,258]},o($VQ1,[2,73]),o($VQ1,[2,7]),o($VQ1,[2,74]),o($VQ1,[2,75]),o($VQ1,[2,81]),{3:160,4:$VR1,13:260},o($V_1,[2,5]),{5:[1,261]},o($VQ1,[2,83]),o($VQ1,[2,84]),o($VQ1,[2,86]),o($VQ1,[2,87]),o($VQ1,[2,88]),o($VQ1,[2,89]),{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:262,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:263,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},o($VQ1,[2,92]),{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:25,55:264,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$Vn1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1,168:23,172:26,173:$VC1,174:$VD1,175:15,178:14,179:$VE1,180:$VF1,181:$VG1,182:$VH1,183:$VI1,184:$VJ1,185:$VK1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:265,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:266,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:267,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:25,55:268,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$Vn1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1,168:23,172:26,173:$VC1,174:$VD1,175:15,178:14,179:$VE1,180:$VF1,181:$VG1,182:$VH1,183:$VI1,184:$VJ1,185:$VK1},o($VQ1,[2,98]),o($VQ1,[2,99]),o($VQ1,[2,100]),o($VQ1,[2,101]),o($VQ1,[2,102]),{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:269,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:270,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:271,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},o($VQ1,[2,106]),o($VQ1,[2,107]),o($VQ1,[2,108]),o($VQ1,[2,109]),o($VQ1,[2,110]),o($VQ1,[2,111]),o($VQ1,[2,112]),o($VQ1,[2,113]),{7:272,8:$VN1},{4:$V$1,8:$V6,11:273,48:36,49:$V7,50:$V8,51:$V9,54:274,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{9:[1,276]},o($VQ1,[2,126]),o($VQ1,[2,127]),o($VQ1,[2,128]),o($VQ1,[2,129]),o($VQ1,[2,130]),o($VQ1,[2,131]),o($VQ1,[2,132]),o($VQ1,[2,133]),o($VQ1,[2,134]),o($VQ1,[2,135]),{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:277,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:278,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:279,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:280,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:282,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,138:[1,281],139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},o($V02,[2,160]),{10:[1,284],140:283,169:$VX1,170:$VY1,177:242},{144:[1,285],192:$V12},o($V22,[2,204]),{8:[1,287]},o($V22,[2,203],{189:$V32}),o($V42,[2,200]),{8:[1,289]},o($V42,[2,199]),{146:[1,290],192:$V12},{148:[1,291],192:$V12},{150:[1,292],192:$V12},{152:[1,293],192:$V12},{154:[1,294],192:$V12},{156:[1,295],192:$V12},{158:[1,296],192:$V12},{160:[1,297],192:$V12},{162:[1,298],192:$V12},{7:231,8:$VN1,17:299},o($V52,$VS1,{178:14,175:15,168:23,54:25,172:26,48:36,190:213,188:215,186:216,55:218,143:300,8:$V6,49:$V7,50:$V8,51:$V9,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$Vn1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1,173:$VC1,174:$VD1,179:$VE1,180:$VF1,181:$VG1,182:$VH1,183:$VI1,184:$VJ1,185:$VK1,187:$VT1,191:$VU1}),{8:[2,8]},o([8,49,50,51,56,57,58,59,60,61,62,63,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,139,141,142,145,147,149,151,153,155,157,159,161,163,164,165,166,173,174,179,180,181,182,183,184,185,187,189,191,192],[2,9]),o($V62,$VS1,{178:14,175:15,168:23,54:25,172:26,48:36,190:213,188:215,186:216,55:218,143:301,8:$V6,49:$V7,50:$V8,51:$V9,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$Vn1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1,173:$VC1,174:$VD1,179:$VE1,180:$VF1,181:$VG1,182:$VH1,183:$VI1,184:$VJ1,185:$VK1,187:$VT1,191:$VU1}),o($V62,$VS1,{178:14,175:15,168:23,54:25,172:26,48:36,190:213,188:215,186:216,55:218,143:302,8:$V6,49:$V7,50:$V8,51:$V9,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$Vn1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1,167:[1,303],173:$VC1,174:$VD1,179:$VE1,180:$VF1,181:$VG1,182:$VH1,183:$VI1,184:$VJ1,185:$VK1,187:$VT1,191:$VU1}),o($VM1,[2,44]),o($VM1,[2,45]),o($V5,[2,214]),o($V5,[2,215]),o($V5,[2,216]),{10:[1,304]},o($VO1,[2,162],{177:305,169:$VX1,170:$VY1}),{140:306,169:$VX1,170:$VY1,177:242},o($VV1,[2,186]),{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:309,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1,170:[1,308],172:310,173:$VC1,174:$VD1,176:307},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:309,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1,172:310,173:$VC1,174:$VD1,176:311},{8:$VW1},o($VO1,[2,167],{170:[1,312],171:[1,313]}),o($VO1,[2,168],{169:[1,314]}),{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:315,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},o($VO1,[2,173],{170:[1,316]}),o($VO1,[2,174],{169:[1,317]}),o($VQ1,[2,49]),{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:25,55:318,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$Vn1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1,168:23,172:26,173:$VC1,174:$VD1,175:15,178:14,179:$VE1,180:$VF1,181:$VG1,182:$VH1,183:$VI1,184:$VJ1,185:$VK1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:25,55:319,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$Vn1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1,168:23,172:26,173:$VC1,174:$VD1,175:15,178:14,179:$VE1,180:$VF1,181:$VG1,182:$VH1,183:$VI1,184:$VJ1,185:$VK1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:25,55:320,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$Vn1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1,168:23,172:26,173:$VC1,174:$VD1,175:15,178:14,179:$VE1,180:$VF1,181:$VG1,182:$VH1,183:$VI1,184:$VJ1,185:$VK1},o($VQ1,[2,58]),{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:25,55:321,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$Vn1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1,168:23,172:26,173:$VC1,174:$VD1,175:15,178:14,179:$VE1,180:$VF1,181:$VG1,182:$VH1,183:$VI1,184:$VJ1,185:$VK1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:25,55:322,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$Vn1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1,168:23,172:26,173:$VC1,174:$VD1,175:15,178:14,179:$VE1,180:$VF1,181:$VG1,182:$VH1,183:$VI1,184:$VJ1,185:$VK1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:25,55:323,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$Vn1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1,168:23,172:26,173:$VC1,174:$VD1,175:15,178:14,179:$VE1,180:$VF1,181:$VG1,182:$VH1,183:$VI1,184:$VJ1,185:$VK1},{50:[1,324],51:[1,325]},{7:155,8:$VN1,15:326},{6:[1,327]},o($VQ1,[2,90]),o($VQ1,[2,91]),{6:[1,328]},o($VQ1,[2,94]),o($VQ1,[2,95]),{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:329,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{6:[1,330]},o($VQ1,[2,103]),o($VQ1,[2,104]),o($VQ1,[2,105]),{7:331,8:$VN1},{4:$V$1,8:$V6,11:332,48:36,49:$V7,50:$V8,51:$V9,54:333,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},o($VQ1,[2,125]),{5:[1,334]},{10:[1,335]},o($VQ1,[2,136]),o($VQ1,[2,137]),o($VQ1,[2,138]),o($VQ1,[2,139]),o($VQ1,[2,140]),o($V02,[2,161]),{10:[1,336],169:$VX1,170:$VY1,177:305},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:337,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},o($VQ1,[2,145]),o($V42,$VS1,{178:14,175:15,168:23,54:25,172:26,48:36,188:215,186:216,55:218,190:338,8:$V6,49:$V7,50:$V8,51:$V9,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$Vn1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1,173:$VC1,174:$VD1,179:$VE1,180:$VF1,181:$VG1,182:$VH1,183:$VI1,184:$VJ1,185:$VK1,187:$VT1,191:$VU1}),{20:341,21:$V72,22:342,23:$V82,44:340,47:339},o($V42,$VS1,{178:14,175:15,168:23,54:25,172:26,48:36,55:218,186:345,8:$V6,49:$V7,50:$V8,51:$V9,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$Vn1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1,173:$VC1,174:$VD1,179:$VE1,180:$VF1,181:$VG1,182:$VH1,183:$VI1,184:$VJ1,185:$VK1,187:$VT1}),{20:348,21:$V72,22:349,23:$V82,24:350,25:$V92,26:351,27:$Va2,42:347,43:346},o($VQ1,[2,146]),o($VQ1,[2,147]),o($VQ1,[2,148]),o($VQ1,[2,149]),o($VQ1,[2,150]),o($VQ1,[2,151]),o($VQ1,[2,152]),o($VQ1,[2,153]),o($VQ1,[2,154]),o($V52,$VS1,{178:14,175:15,168:23,54:25,172:26,48:36,190:213,188:215,186:216,55:218,143:354,8:$V6,49:$V7,50:$V8,51:$V9,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$Vn1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1,173:$VC1,174:$VD1,179:$VE1,180:$VF1,181:$VG1,182:$VH1,183:$VI1,184:$VJ1,185:$VK1,187:$VT1,191:$VU1}),{164:[1,355],192:$V12},{10:[1,356],192:$V12},{10:[1,357],192:$V12},{8:[1,358]},o([6,8,10,19,21,23,25,27,29,31,33,35,37,39,41,49,50,51,53,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,138,139,141,142,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,169,170,171,173,174,179,180,181,182,183,184,185,187,189,191,192,199,201,203,205],[2,2]),o($VV1,[2,187]),{10:[1,359],169:$VX1,170:$VY1,177:305},o([6,8,10,49,50,51,53,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,139,141,142,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,169,173,174,189,192,199,201,203,205],[2,183],{170:[1,360]}),{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:309,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1,172:310,173:$VC1,174:$VD1,176:361},o($VV1,[2,180]),o($VV1,[2,181]),o($VV1,[2,184]),{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:362,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},o($VO1,[2,164]),{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:363,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},o($VO1,[2,166]),{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:364,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:365,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{10:[1,366]},{10:[1,367]},{10:[1,368]},{52:369,53:$VZ1},{52:370,53:$VZ1},{52:371,53:$VZ1},o($VQ1,[2,46]),o($VQ1,[2,47]),o($VQ1,[2,82]),o($V_1,[2,1]),{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:372,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},o($VQ1,[2,96]),{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:373,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},o($VQ1,[2,122]),{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:374,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},o($VQ1,[2,124]),{6:[1,375]},o($Vb2,[2,4]),{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:376,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1},{8:[1,377]},o($V22,[2,205]),{10:[1,378],20:341,21:$V72,22:342,23:$V82,44:379},o($Vc2,[2,42]),o($Vc2,[2,28]),o($Vc2,[2,29]),{7:133,8:$VN1,14:380},{7:133,8:$VN1,14:381},o($V42,[2,201]),{10:[1,382],20:348,21:$V72,22:349,23:$V82,24:350,25:$V92,26:351,27:$Va2,42:383},o($Vd2,[2,26]),o($Vd2,[2,22]),o($Vd2,[2,23]),o($Vd2,[2,24]),o($Vd2,[2,25]),{7:133,8:$VN1,14:384},{7:133,8:$VN1,14:385},{164:[1,386],192:$V12},o($VQ1,[2,156]),o($VQ1,[2,157]),o($VQ1,[2,158]),{18:389,19:$Ve2,20:390,21:$V72,22:391,23:$V82,28:392,29:$Vf2,30:393,31:$Vg2,32:394,33:$Vh2,34:395,35:$Vi2,36:396,37:$Vj2,38:397,39:$Vk2,40:398,41:$Vl2,45:388,46:387},o($VQ1,[2,141]),{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:309,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$VP1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1,172:310,173:$VC1,174:$VD1,176:407},o($VV1,[2,185]),o($VO1,[2,163]),o($VO1,[2,165]),o($VO1,[2,171]),o($VO1,[2,172]),o($VQ1,[2,59]),o($VQ1,[2,61]),o($VQ1,[2,63]),o($VQ1,[2,60]),o($VQ1,[2,62]),o($VQ1,[2,64]),o($VQ1,[2,93]),o($VQ1,[2,97]),o($VQ1,[2,123]),o($Vb2,[2,3]),{8:[1,408]},{140:409,169:$VX1,170:$VY1,177:242},o($V42,$VS1,{178:14,175:15,168:23,54:25,172:26,48:36,186:216,55:218,188:410,8:$V6,49:$V7,50:$V8,51:$V9,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$Vn1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1,173:$VC1,174:$VD1,179:$VE1,180:$VF1,181:$VG1,182:$VH1,183:$VI1,184:$VJ1,185:$VK1,187:$VT1}),o($Vc2,[2,43]),o($Vm2,[2,11]),o($Vm2,[2,12]),{8:$V6,48:36,49:$V7,50:$V8,51:$V9,54:25,55:411,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$Vn1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1,168:23,172:26,173:$VC1,174:$VD1,175:15,178:14,179:$VE1,180:$VF1,181:$VG1,182:$VH1,183:$VI1,184:$VJ1,185:$VK1},o($Vd2,[2,27]),o($Vd2,[2,13]),o($Vd2,[2,14]),o($VQ1,[2,155]),{10:[1,412],18:389,19:$Ve2,20:390,21:$V72,22:391,23:$V82,28:392,29:$Vf2,30:393,31:$Vg2,32:394,33:$Vh2,34:395,35:$Vi2,36:396,37:$Vj2,38:397,39:$Vk2,40:398,41:$Vl2,45:413},o($Vn2,[2,40]),o($Vn2,[2,30]),o($Vn2,[2,31]),o($Vn2,[2,32]),o($Vn2,[2,33]),o($Vn2,[2,34]),o($Vn2,[2,35]),o($Vn2,[2,36]),o($Vn2,[2,37]),o($Vn2,[2,38]),o($Vn2,[2,39]),{7:133,8:$VN1,14:414},{7:133,8:$VN1,14:415},{7:133,8:$VN1,14:416},{7:133,8:$VN1,14:417},{7:133,8:$VN1,14:418},{7:133,8:$VN1,14:419},{7:133,8:$VN1,14:420},{7:133,8:$VN1,14:421},o($VV1,[2,182]),{10:[1,423],140:422,169:$VX1,170:$VY1,177:242},{10:[1,424],169:$VX1,170:$VY1,177:305},o($V22,[2,202],{189:$V32}),o($V42,[2,198]),o($V62,$VS1,{178:14,175:15,168:23,54:25,172:26,48:36,190:213,188:215,186:216,55:218,143:425,8:$V6,49:$V7,50:$V8,51:$V9,56:$Va,57:$Vb,58:$Vc,59:$Vd,60:$Ve,61:$Vf,62:$Vg,63:$Vh,67:$Vi,68:$Vj,69:$Vk,70:$Vl,71:$Vm,72:$Vn,73:$Vo,74:$Vp,75:$Vq,76:$Vr,77:$Vs,78:$Vt,79:$Vu,80:$Vv,81:$Vw,82:$Vx,83:$Vy,85:$Vz,86:$VA,87:$VB,88:$VC,89:$VD,90:$VE,91:$VF,92:$VG,93:$VH,94:$VI,95:$VJ,96:$VK,97:$VL,98:$VM,99:$VN,100:$VO,101:$VP,102:$VQ,103:$VR,104:$VS,105:$VT,106:$VU,107:$VV,108:$VW,109:$VX,110:$VY,111:$VZ,112:$V_,113:$V$,114:$V01,115:$V11,116:$V21,117:$V31,118:$V41,119:$V51,120:$V61,121:$V71,122:$V81,123:$V91,124:$Va1,125:$Vb1,126:$Vc1,127:$Vd1,128:$Ve1,129:$Vf1,130:$Vg1,131:$Vh1,132:$Vi1,133:$Vj1,134:$Vk1,135:$Vl1,136:$Vm1,139:$Vn1,141:$Vo1,142:$Vp1,145:$Vq1,147:$Vr1,149:$Vs1,151:$Vt1,153:$Vu1,155:$Vv1,157:$Vw1,159:$Vx1,161:$Vy1,163:$Vz1,165:$VA1,166:$VB1,173:$VC1,174:$VD1,179:$VE1,180:$VF1,181:$VG1,182:$VH1,183:$VI1,184:$VJ1,185:$VK1,187:$VT1,191:$VU1}),o($Vn2,[2,41]),o($Vn2,[2,10]),o($Vn2,[2,15]),o($Vn2,[2,16]),o($Vn2,[2,17]),o($Vn2,[2,18]),o($Vn2,[2,19]),o($Vn2,[2,20]),o($Vn2,[2,21]),{10:[1,426],169:$VX1,170:$VY1,177:305},o($VQ1,[2,143]),o($VQ1,[2,144]),{10:[1,427],192:$V12},o($VQ1,[2,142]),o($VQ1,[2,159])], -defaultActions: {10:[2,206],230:[2,8]}, -parseError: function parseError (str, hash) { - if (hash.recoverable) { - this.trace(str); - } else { - var error = new Error(str); - error.hash = hash; - throw error; - } -}, -parse: function parse(input) { - var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1; - var args = lstack.slice.call(arguments, 1); - var lexer = Object.create(this.lexer); - var sharedState = { yy: {} }; - for (var k in this.yy) { - if (Object.prototype.hasOwnProperty.call(this.yy, k)) { - sharedState.yy[k] = this.yy[k]; - } - } - lexer.setInput(input, sharedState.yy); - sharedState.yy.lexer = lexer; - sharedState.yy.parser = this; - if (typeof lexer.yylloc == 'undefined') { - lexer.yylloc = {}; - } - var yyloc = lexer.yylloc; - lstack.push(yyloc); - var ranges = lexer.options && lexer.options.ranges; - if (typeof sharedState.yy.parseError === 'function') { - this.parseError = sharedState.yy.parseError; - } else { - this.parseError = Object.getPrototypeOf(this).parseError; - } - function popStack(n) { - stack.length = stack.length - 2 * n; - vstack.length = vstack.length - n; - lstack.length = lstack.length - n; - } - _token_stack: - var lex = function () { - var token; - token = lexer.lex() || EOF; - if (typeof token !== 'number') { - token = self.symbols_[token] || token; - } - return token; - }; - var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected; - while (true) { - state = stack[stack.length - 1]; - if (this.defaultActions[state]) { - action = this.defaultActions[state]; - } else { - if (symbol === null || typeof symbol == 'undefined') { - symbol = lex(); - } - action = table[state] && table[state][symbol]; - } - if (typeof action === 'undefined' || !action.length || !action[0]) { - var errStr = ''; - expected = []; - for (p in table[state]) { - if (this.terminals_[p] && p > TERROR) { - expected.push('\'' + this.terminals_[p] + '\''); - } - } - if (lexer.showPosition) { - errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\''; - } else { - errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\''); - } - this.parseError(errStr, { - text: lexer.match, - token: this.terminals_[symbol] || symbol, - line: lexer.yylineno, - loc: yyloc, - expected: expected - }); - } - if (action[0] instanceof Array && action.length > 1) { - throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol); - } - switch (action[0]) { - case 1: - stack.push(symbol); - vstack.push(lexer.yytext); - lstack.push(lexer.yylloc); - stack.push(action[1]); - symbol = null; - if (!preErrorSymbol) { - yyleng = lexer.yyleng; - yytext = lexer.yytext; - yylineno = lexer.yylineno; - yyloc = lexer.yylloc; - if (recovering > 0) { - recovering--; - } - } else { - symbol = preErrorSymbol; - preErrorSymbol = null; - } - break; - case 2: - len = this.productions_[action[1]][1]; - yyval.$ = vstack[vstack.length - len]; - yyval._$ = { - first_line: lstack[lstack.length - (len || 1)].first_line, - last_line: lstack[lstack.length - 1].last_line, - first_column: lstack[lstack.length - (len || 1)].first_column, - last_column: lstack[lstack.length - 1].last_column - }; - if (ranges) { - yyval._$.range = [ - lstack[lstack.length - (len || 1)].range[0], - lstack[lstack.length - 1].range[1] - ]; - } - r = this.performAction.apply(yyval, [ - yytext, - yyleng, - yylineno, - sharedState.yy, - action[1], - vstack, - lstack - ].concat(args)); - if (typeof r !== 'undefined') { - return r; - } - if (len) { - stack = stack.slice(0, -1 * len * 2); - vstack = vstack.slice(0, -1 * len); - lstack = lstack.slice(0, -1 * len); - } - stack.push(this.productions_[action[1]][0]); - vstack.push(yyval.$); - lstack.push(yyval._$); - newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; - stack.push(newState); - break; - case 3: - return true; - } - } - return true; -}}; - -var MathMLNameSpace = "http://www.w3.org/1998/Math/MathML", - SVGNameSpace = "http://www.w3.org/2000/svg", - TeXMimeTypes = ["TeX", "LaTeX", "text/x-tex", "text/x-latex", - "application/x-tex", "application/x-latex"]; - -function escapeText(aString) { - /* Escape reserved XML characters for use as text nodes. */ - return aString.replace(/&/g, "&").replace(//g, ">"); -} - -function escapeQuote(aString) { - /* Escape the double quote characters for use as attribute. */ - return aString.replace(/"/g, """); -} - -function namedSpaceToEm(aString) { - var index = [ - "negativeveryverythinmathspace", - "negativeverythinmathspace", - "negativemediummathspace", - "negativethickmathspace", - "negativeverythickmathspace", - "negativeveryverythickmathspace", - "", - "veryverythinmathspace", - "verythinmathspace", - "thinmathspace", - "mediummathspace", - "thickmathspace", - "verythickmathspace", - "veryverythickmathspace" - ].indexOf(aString); - return (index === -1 ? 0 : index - 6) / 18.0; -} - -function parseLength(aString) { - /* See http://www.w3.org/TR/MathML3/appendixa.html#parsing_length */ - aString = aString.trim(); - var lengthRegexp = /(-?[0-9]*(?:[0-9]\.?|\.[0-9])[0-9]*)(e[mx]|in|cm|mm|p[xtc]|%)?/, result = lengthRegexp.exec(aString); - if (result) { - result[1] = parseFloat(result[1]); - if (!result[2]) { - /* Unitless values are treated as a percent */ - result[1] *= 100; - result[2] = "%"; - } - return { l: result[1], u: result[2] }; - } - return { l: namedSpaceToEm(aString), u: "em" }; -} - -function serializeTree(aTree) { - var output = "<" + aTree["tag"]; - for (var name in aTree["attributes"]) { - if (aTree["attributes"][name] !== undefined) - output += " " + name + "=\"" + aTree["attributes"][name] + "\""; - } - if (aTree["content"]) { - output += ">"; - if (Array.isArray(aTree["content"])) { - aTree["content"].forEach(function(child) { - output += serializeTree(child); - }); - } else - output += aTree["content"]; - output += ""; - } else { - output += "/>"; - } - return output; -} - -function newTag(aTag, aChildren, aAttributes) { - return { - "tag": aTag, - "content": aChildren, - "attributes": aAttributes - }; -} - -function isEmptyMrow(aTree) { - return aTree["tag"] === "mrow" && !aTree["content"] && !aTree["attributes"]; -} - -function newMo(aContent, aLeftSpace, aRightSpace) { - return newTag("mo", escapeText(aContent), { - "lspace": aLeftSpace !== undefined ? aLeftSpace + "em" : undefined, - "rspace": aRightSpace !== undefined ? aRightSpace + "em" : undefined - }); -} - -function newMi(aContent, aNormal) { - return newTag("mi", escapeText(aContent), - aNormal ? { "mathvariant": "normal" } : undefined); -} - -function newSpace(aWidth) { - return newTag("mspace", null, {"width": aWidth + "em"}); -} - -function applyMathVariantToCharacter(codePoint, aMathVariant) { - // FIXME: We should have LaTeX commmands for all these variants. - // See https://github.com/fred-wang/TeXZilla/issues/64 - var mathvariant = [ - "bold", - "italic", - "bold-italic", - "script", - "bold-script", - "fraktur", - "double-struck", - "bold-fraktur", - "sans-serif", - "bold-sans-serif", - "sans-serif-italic", - "sans-serif-bold-italic", - "monospace", - "initial", - "tailed", - "looped", - "stretched" - ].indexOf(aMathVariant); - var Bold = 0; - var Italic = 1; - var BoldItalic = 2; - var Script = 3; - var BoldScript = 4; - var Fraktur = 5; - var DoubleStruck = 6; - var BoldFraktur = 7; - var SansSerif = 8; - var BoldSansSerif = 9; - var SansSerifItalic = 10; - var SansSerifBoldItalic = 11; - var Monospace = 12; - var Initial = 13; - var Tailed = 14; - var Looped = 15; - var Stretched = 16; - - var greekUpperTheta = 0x03F4; - var holeGreekUpperTheta = 0x03A2; - var nabla = 0x2207; - var partialDifferential = 0x2202; - var greekUpperAlpha = 0x0391; - var greekUpperOmega = 0x03A9; - var greekLowerAlpha = 0x03B1; - var greekLowerOmega = 0x03C9; - var greekLunateEpsilonSymbol = 0x03F5; - var greekThetaSymbol = 0x03D1; - var greekKappaSymbol = 0x03F0; - var greekPhiSymbol = 0x03D5; - var greekRhoSymbol = 0x03F1; - var greekPiSymbol = 0x03D6; - var greekLetterDigamma = 0x03DC; - var greekSmallLetterDigamma = 0x03DD; - var mathBoldCapitalDigamma = 0x1D7CA; - var mathBoldSmallDigamma = 0x1D7CB; - - var latinSmallLetterDotlessI = 0x0131; - var latinSmallLetterDotlessJ = 0x0237; - - var mathItalicSmallDotlessI = 0x1D6A4; - var mathItalicSmallDotlessJ = 0x1D6A5; - - var digit0 = 0x30; - var digit9 = 0x39; - var upperA = 0x41; - var upperZ = 0x5A; - var smallA = 0x61; - var smallZ = 0x7A; - - var mathBoldUpperA = 0x1D400; - var mathItalicUpperA = 0x1D434; - var mathBoldSmallA = 0x1D41A; - var mathBoldUpperAlpha = 0x1D6A8; - var mathBoldSmallAlpha = 0x1D6C2; - var mathItalicUpperAlpha = 0x1D6E2; - var mathBoldDigitZero = 0x1D7CE; - var mathDoubleStruckZero = 0x1D7D8; - - var mathBoldUpperTheta = 0x1D6B9; - var mathBoldNabla = 0x1D6C1; - var mathBoldPartialDifferential = 0x1D6DB; - var mathBoldEpsilonSymbol = 0x1D6DC; - var mathBoldThetaSymbol = 0x1D6DD; - var mathBoldKappaSymbol = 0x1D6DE; - var mathBoldPhiSymbol = 0x1D6DF; - var mathBoldRhoSymbol = 0x1D6E0; - var mathBoldPiSymbol = 0x1D6E1; - - /* Exceptional characters with at most one possible transformation. */ - if (codePoint == holeGreekUpperTheta) - return codePoint; - if (codePoint == greekLetterDigamma) { - if (mathvariant == Bold) - return mathBoldCapitalDigamma; - return codePoint; - } - if (codePoint == greekSmallLetterDigamma) { - if (mathvariant == Bold) - return mathBoldSmallDigamma; - return codePoint; - } - if (codePoint == latinSmallLetterDotlessI) { - if (mathvariant == Italic) - return mathItalicSmallDotlessI; - return codePoint; - } - if (codePoint == latinSmallLetterDotlessJ) { - if (mathvariant == Italic) - return mathItalicSmallDotlessJ; - return codePoint; - } - - var baseChar, multiplier, map; - - /* Latin */ - if (upperA <= codePoint && codePoint <= upperZ || - smallA <= codePoint && codePoint <= smallZ) { - baseChar = codePoint <= upperZ ? codePoint - upperA : - mathBoldSmallA - mathBoldUpperA + codePoint - smallA; - multiplier = mathvariant; - if (mathvariant > Monospace) - return codePoint; // Latin doesn't support the Arabic mathvariants - var transformedChar = baseChar + mathBoldUpperA + - multiplier * (mathItalicUpperA - mathBoldUpperA); - map = { - 0x1D455: 0x210E, - 0x1D49D: 0x212C, - 0x1D4A0: 0x2130, - 0x1D4A1: 0x2131, - 0x1D4A3: 0x210B, - 0x1D4A4: 0x2110, - 0x1D4A7: 0x2112, - 0x1D4A8: 0x2133, - 0x1D4AD: 0x211B, - 0x1D4BA: 0x212F, - 0x1D4BC: 0x210A, - 0x1D4C4: 0x2134, - 0x1D506: 0x212D, - 0x1D50B: 0x210C, - 0x1D50C: 0x2111, - 0x1D515: 0x211C, - 0x1D51D: 0x2128, - 0x1D53A: 0x2102, - 0x1D53F: 0x210D, - 0x1D545: 0x2115, - 0x1D547: 0x2119, - 0x1D548: 0x211A, - 0x1D549: 0x211D, - 0x1D551: 0x2124 - }; - return map[transformedChar] ? map[transformedChar] : transformedChar; - } - - /* Digits */ - if (digit0 <= codePoint && codePoint <= digit9) { - baseChar = codePoint - digit0; - switch (mathvariant) { - case Bold: - multiplier = 0; - break; - case DoubleStruck: - multiplier = 1; - break; - case SansSerif: - multiplier = 2; - break; - case BoldSansSerif: - multiplier = 3; - break; - case Monospace: - multiplier = 4; - break; - default: - return codePoint; - } - return baseChar + multiplier * (mathDoubleStruckZero - mathBoldDigitZero) + - mathBoldDigitZero; - } - - // Arabic characters are defined within this range - if (0x0600 <= codePoint && codePoint <= 0x06FF) { - // The Arabic mathematical block is not continuous, nor does it have a - // monotonic mapping to the unencoded characters, requiring the use of a - // lookup table. - switch (mathvariant) { - case Initial: - map = { - 0x628: 0x1EE21, - 0x62A: 0x1EE35, - 0x62B: 0x1EE36, - 0x62C: 0x1EE22, - 0x62D: 0x1EE27, - 0x62E: 0x1EE37, - 0x633: 0x1EE2E, - 0x634: 0x1EE34, - 0x635: 0x1EE31, - 0x636: 0x1EE39, - 0x639: 0x1EE2F, - 0x63A: 0x1EE3B, - 0x641: 0x1EE30, - 0x642: 0x1EE32, - 0x643: 0x1EE2A, - 0x644: 0x1EE2B, - 0x645: 0x1EE2C, - 0x646: 0x1EE2D, - 0x647: 0x1EE24, - 0x64A: 0x1EE29 - }; - break; - case Tailed: - map = { - 0x62C: 0x1EE42, - 0x62D: 0x1EE47, - 0x62E: 0x1EE57, - 0x633: 0x1EE4E, - 0x634: 0x1EE54, - 0x635: 0x1EE51, - 0x636: 0x1EE59, - 0x639: 0x1EE4F, - 0x63A: 0x1EE5B, - 0x642: 0x1EE52, - 0x644: 0x1EE4B, - 0x646: 0x1EE4D, - 0x64A: 0x1EE49, - 0x66F: 0x1EE5F, - 0x6BA: 0x1EE5D - }; - break; - case Stretched: - map = { - 0x628: 0x1EE61, - 0x62A: 0x1EE75, - 0x62B: 0x1EE76, - 0x62C: 0x1EE62, - 0x62D: 0x1EE67, - 0x62E: 0x1EE77, - 0x633: 0x1EE6E, - 0x634: 0x1EE74, - 0x635: 0x1EE71, - 0x636: 0x1EE79, - 0x637: 0x1EE68, - 0x638: 0x1EE7A, - 0x639: 0x1EE6F, - 0x63A: 0x1EE7B, - 0x641: 0x1EE70, - 0x642: 0x1EE72, - 0x643: 0x1EE6A, - 0x645: 0x1EE6C, - 0x646: 0x1EE6D, - 0x647: 0x1EE64, - 0x64A: 0x1EE69, - 0x66E: 0x1EE7C, - 0x6A1: 0x1EE7E - }; - break; - case Looped: - map = { - 0x627: 0x1EE80, - 0x628: 0x1EE81, - 0x62A: 0x1EE95, - 0x62B: 0x1EE96, - 0x62C: 0x1EE82, - 0x62D: 0x1EE87, - 0x62E: 0x1EE97, - 0x62F: 0x1EE83, - 0x630: 0x1EE98, - 0x631: 0x1EE93, - 0x632: 0x1EE86, - 0x633: 0x1EE8E, - 0x634: 0x1EE94, - 0x635: 0x1EE91, - 0x636: 0x1EE99, - 0x637: 0x1EE88, - 0x638: 0x1EE9A, - 0x639: 0x1EE8F, - 0x63A: 0x1EE9B, - 0x641: 0x1EE90, - 0x642: 0x1EE92, - 0x644: 0x1EE8B, - 0x645: 0x1EE8C, - 0x646: 0x1EE8D, - 0x647: 0x1EE84, - 0x648: 0x1EE85, - 0x64A: 0x1EE89 - }; - break; - case DoubleStruck: - map = { - 0x628: 0x1EEA1, - 0x62A: 0x1EEB5, - 0x62B: 0x1EEB6, - 0x62C: 0x1EEA2, - 0x62D: 0x1EEA7, - 0x62E: 0x1EEB7, - 0x62F: 0x1EEA3, - 0x630: 0x1EEB8, - 0x631: 0x1EEB3, - 0x632: 0x1EEA6, - 0x633: 0x1EEAE, - 0x634: 0x1EEB4, - 0x635: 0x1EEB1, - 0x636: 0x1EEB9, - 0x637: 0x1EEA8, - 0x638: 0x1EEBA, - 0x639: 0x1EEAF, - 0x63A: 0x1EEBB, - 0x641: 0x1EEB0, - 0x642: 0x1EEB2, - 0x644: 0x1EEAB, - 0x645: 0x1EEAC, - 0x646: 0x1EEAD, - 0x648: 0x1EEA5, - 0x64A: 0x1EEA9 - }; - break; - default: - return codePoint; - } - return map[codePoint] ? map[codePoint] : codePoint; - } - - // Greek - if (greekUpperAlpha <= codePoint && codePoint <= greekUpperOmega) { - baseChar = codePoint - greekUpperAlpha; - } else if (greekLowerAlpha <= codePoint && codePoint <= greekLowerOmega) { - baseChar = mathBoldSmallAlpha - mathBoldUpperAlpha + codePoint - greekLowerAlpha; - } else { - switch (codePoint) { - case greekUpperTheta: - baseChar = mathBoldUpperTheta - mathBoldUpperAlpha; - break; - case nabla: - baseChar = mathBoldNabla - mathBoldUpperAlpha; - break; - case partialDifferential: - baseChar = mathBoldPartialDifferential - mathBoldUpperAlpha; - break; - case greekLunateEpsilonSymbol: - baseChar = mathBoldEpsilonSymbol - mathBoldUpperAlpha; - break; - case greekThetaSymbol: - baseChar = mathBoldThetaSymbol - mathBoldUpperAlpha; - break; - case greekKappaSymbol: - baseChar = mathBoldKappaSymbol - mathBoldUpperAlpha; - break; - case greekPhiSymbol: - baseChar = mathBoldPhiSymbol - mathBoldUpperAlpha; - break; - case greekRhoSymbol: - baseChar = mathBoldRhoSymbol - mathBoldUpperAlpha; - break; - case greekPiSymbol: - baseChar = mathBoldPiSymbol - mathBoldUpperAlpha; - break; - default: - return codePoint; - } - } - - switch (mathvariant) { - case Bold: - multiplier = 0; - break; - case Italic: - multiplier = 1; - break; - case BoldItalic: - multiplier = 2; - break; - case BoldSansSerif: - multiplier = 3; - break; - case SansSerifBoldItalic: - multiplier = 4; - break; - default: - // This mathvariant isn't defined for Greek or is otherwise normal. - return codePoint; - } - - return baseChar + mathBoldUpperAlpha + multiplier * (mathItalicUpperAlpha - mathBoldUpperAlpha); -} - -function applyMathVariant(aToken, aMathVariant) { - if (aMathVariant === "normal") - return; - var content = aToken["content"]; - var transformedText = ""; - for (var i = 0; i < content.length; i++) { - var c = content["codePointAt"](i); - if (c > 0xFFFF) { - transformedText += content[i]; i++; - transformedText += content[i]; - } else { - transformedText += String["fromCodePoint"]( - applyMathVariantToCharacter(c, aMathVariant) - ); - } - } - aToken["content"] = transformedText; -} - -function isToken(aTree) { - return ["mi", "mn", "mo", "mtext", "ms"].indexOf(aTree["tag"]) !== -1; -} - -function isSingleCharMi(aTree) { - if (aTree["tag"] !== "mi") - return false; - var content = aTree["content"]; - var c = content["codePointAt"](0); - return content.length === 1 && c <= 0xFFFF || - content.length === 2 && c > 0xFFFF; -} - -function isTokenAttribute(aAttribute) { - return ["mathcolor", "mathbackground", "mathvariant"].indexOf(aAttribute) !== -1; -} - -function applyTokenAttributes(aChildren, aAttributes) { - var allAttributesAppliedToAllChildren = true; - for (var name in aAttributes) { - // Only consider mstyle attributes that apply to token elements. - if (!isTokenAttribute(name)) { - allAttributesAppliedToAllChildren = false; - continue; - } - // In general, keep mstyle element if there are multiple children. - if (name !== "mathvariant" && aChildren.length != 1) { - allAttributesAppliedToAllChildren = false; - continue; - } - aChildren.forEach(function(child) { - if (!isToken(child)) { - allAttributesAppliedToAllChildren = false; - return; - } - if (!child["attributes"]) - child["attributes"] = {}; - if (child["attributes"][name]) - return; - if (name === "mathvariant") { - // Transform the text instead of using a mathvariant attribute. - // Explicit "normal" attribute is only needed on single-char 's. - if (aAttributes[name] !== "normal" || !isSingleCharMi(child)) - applyMathVariant(child, aAttributes[name]) - else - child["attributes"][name] = aAttributes[name]; - } else { - // Apply the token attribute to the child. - child["attributes"][name] = aAttributes[name]; - } - }); - } - return allAttributesAppliedToAllChildren; -} - -/* FIXME: try to restore the operator grouping when compoundTermList does not - contain any fences. - https://github.com/fred-wang/TeXZilla/issues/9 */ -function newMrow(aChildren, aTag, aAttributes) { - aTag = aTag || "mrow"; - if (aTag === "mstyle") { - // Mstyle with one mrow child that does not have any attribute. - if (aChildren.length == 1 && - aChildren[0]["tag"] === "mrow" && !aChildren[0]["attributes"]) - return newMrow(aChildren[0]["content"], aTag, aAttributes); - - // Try an apply all the attributes to chidren and replace mstyle with mrow. - if (applyTokenAttributes(aChildren, aAttributes)) - return newMrow(aChildren); - } - // Mrow with one child and no attributes: return the child. - if (aChildren.length == 1 && aTag === "mrow" && !aAttributes) - return aChildren[0]; - return newTag(aTag, aChildren, aAttributes); -} - -function newMath(aChildren, aDisplay, aRTL, aTeX) -{ - return newTag("math", [ - newTag("semantics", [ - newMrow(aChildren), - newTag("annotation", escapeText(aTeX), {"encoding": "TeX"}) - ]) - ], { - "xmlns": MathMLNameSpace, - "display": aDisplay ? "block" : undefined, - "dir": aRTL ? "rtl" : undefined - }); -} - -function getTeXSourceInternal(aMathMLElement) { - var child; - if (!aMathMLElement || - aMathMLElement.namespaceURI !== MathMLNameSpace) { - return null; - } - - if (aMathMLElement.tagName === "semantics") { - // Note: we can't use aMathMLElement.children on WebKit/Blink because of - // https://bugs.webkit.org/show_bug.cgi?id=109556. - for (child = aMathMLElement.firstElementChild; child; - child = child.nextElementSibling) { - if (child.namespaceURI === MathMLNameSpace && - child.localName === "annotation" && - TeXMimeTypes.indexOf(child.getAttribute("encoding")) !== -1) { - return child.textContent; - } - } - } else if (aMathMLElement.childElementCount === 1) { - return getTeXSourceInternal(aMathMLElement.firstElementChild); - } - - return null; -} - -try { - // Try to create a DOM Parser object if it exists (e.g. in a Web page, - // in a chrome script running in a window etc) - parser.mDOMParser = new DOMParser(); -} catch (e) { - // Make the DOMParser throw an exception if used. - parser.mDOMParser = { - parseFromString: function() { - throw "DOMParser undefined. Did you call TeXZilla.setDOMParser?"; - } - }; -} - -parser.setDOMParser = function(aDOMParser) -{ - this.mDOMParser = aDOMParser; -} - -try { - // Try to create a XMLSerializer object if it exists (e.g. in a Web page, - // in a chrome script running in a window etc) - parser.mXMLSerializer = new XMLSerializer(); -} catch (e) { - // Make the XMLSerializer throw an exception if used. - parser.mXMLSerializer = { - serializeToString: function() { - throw "XMLSerializer undefined. Did you call TeXZilla.setXMLSerializer?"; - } - }; -} - -parser.setXMLSerializer = function(aXMLSerializer) -{ - this.mXMLSerializer = aXMLSerializer; -} - -parser.parseMathMLDocument = function (aString) { - // Parse the string into a MathML document and return the root. - return this.mDOMParser. - parseFromString(aString, "application/xml").documentElement; -} - -parser.setSafeMode = function(aEnable) -{ - this.yy.mSafeMode = aEnable; -} - -parser.setItexIdentifierMode = function(aEnable) -{ - this.yy.mItexIdentifierMode = aEnable; -} - -parser.getTeXSource = function(aMathMLElement) { - if (typeof aMathMLElement === "string") { - aMathMLElement = this.parseMathMLDocument(aMathMLElement); - } - - return getTeXSourceInternal(aMathMLElement); -} - -parser.toMathMLString = function(aTeX, aDisplay, aRTL, aThrowExceptionOnError) { - var output, mathml; - /* Parse the TeX source and get the main MathML node. */ - try { - output = this.parse("\\(" + aTeX + "\\)"); - if (aRTL) { - /* Set the RTL mode if specified. */ - output = output.replace(/^ element. */ - return this.parseMathMLDocument(this.toMathMLString(aTeX, aDisplay, aRTL, aThrowExceptionOnError)); -} - -function escapeHTML(aString) -{ - var rv = "", code1, code2; - for (var i = 0; i < aString.length; i++) { - var code1 = aString.charCodeAt(i); - if (code1 < 0x80) { - rv += aString.charAt(i); - continue; - } - if (0xD800 <= code1 && code1 <= 0xDBFF) { - i++; - code2 = aString.charCodeAt(i); - rv += "&#x" + - ((code1-0xD800)*0x400 + code2-0xDC00 + 0x10000).toString(16) + ";"; - continue; - } - rv += "&#x" + code1.toString(16) + ";"; - } - return rv; -} - -parser.toImage = function(aTeX, aRTL, aRoundToPowerOfTwo, aSize, aDocument) { - var math, el, box, svgWidth, svgHeight, svg, image; - - // Set default values. - if (aSize === undefined) { - aSize = 64; - } - if (aDocument === undefined) { - aDocument = window.document; - } - - // Create the MathML element. - math = this.toMathML(aTeX, true, aRTL); - math.setAttribute("mathsize", aSize + "px"); - - // Temporarily insert the MathML element in the document to measure it. - el = document.createElement("div"); - el.style.visibility = "hidden"; - el.style.position = "absolute"; - el.appendChild(math); - aDocument.body.appendChild(el); - box = math.getBoundingClientRect(); - aDocument.body.removeChild(el); - el.removeChild(math); - - // Round up the computed sizes. - if (aRoundToPowerOfTwo) { - // Harmony's Math.log2() is not supported by all rendering engines and is - // removed by closure-compiler, so we use Math.log() / Math.LN2 instead. - svgWidth = Math.pow(2, Math.ceil(Math.log(box.width) / Math.LN2)); - svgHeight = Math.pow(2, Math.ceil(Math.log(box.height) / Math.LN2)); - } else { - svgWidth = Math.ceil(box.width); - svgHeight = Math.ceil(box.height); - } - - // Embed the MathML in an SVG element. - svg = document.createElementNS(SVGNameSpace, "svg"); - svg.setAttribute("width", svgWidth + "px"); - svg.setAttribute("height", svgHeight + "px"); - el = document.createElementNS(SVGNameSpace, "g"); - el.setAttribute("transform", "translate(" + - (svgWidth - box.width) / 2.0 + "," + (svgHeight - box.height) / 2.0 + ")"); - svg.appendChild(el); - el = document.createElementNS(SVGNameSpace, "foreignObject"); - el.setAttribute("width", box.width); - el.setAttribute("height", box.height); - el.appendChild(math); - svg.firstChild.appendChild(el); - - // Create the image element. - image = new Image(); - image.src = "data:image/svg+xml;base64," + - window.btoa(escapeHTML(this.mXMLSerializer.serializeToString(svg))); - image.width = svgWidth; - image.height = svgHeight; - image.alt = escapeText(aTeX); - - return image; -} - -parser.filterString = function(aString, aThrowExceptionOnError) { - try { - return this.parse(aString); - } catch (e) { - if (aThrowExceptionOnError) { - throw e; - } - return aString; - } -} - -parser.filterElement = function(aElement, aThrowExceptionOnError) { - var root, child, node; - for (var node = aElement.firstChild; node; node = node.nextSibling) { - switch(node.nodeType) { - case 1: // Node.ELEMENT_NODE - this.filterElement(node, aThrowExceptionOnError); - break; - case 3: // Node.TEXT_NODE - this.yy.escapeXML = true; - root = this.mDOMParser.parseFromString("" + - TeXZilla.filterString(node.data, aThrowExceptionOnError) + - "", "application/xml").documentElement; - this.yy.escapeXML = false; - while (child = root.firstChild) { - aElement.insertBefore(root.removeChild(child), node); - } - child = node.previousSibling; - aElement.removeChild(node); node = child; - break; - default: - } - } -} - -function parseError(aString, aHash) { - // We delete the last line, which contains token names that are obscure - // to the users. See issue #16 - throw new Error(aString.replace(/\nExpecting [^\n]*$/, "\n")); -} - -/* generated by jison-lex 0.3.4 */ -var lexer = (function(){ -var lexer = ({ - -EOF:1, - -parseError:function parseError(str, hash) { - if (this.yy.parser) { - this.yy.parser.parseError(str, hash); - } else { - throw new Error(str); - } - }, - -// resets the lexer, sets new input -setInput:function (input, yy) { - this.yy = yy || this.yy || {}; - this._input = input; - this._more = this._backtrack = this.done = false; - this.yylineno = this.yyleng = 0; - this.yytext = this.matched = this.match = ''; - this.conditionStack = ['INITIAL']; - this.yylloc = { - first_line: 1, - first_column: 0, - last_line: 1, - last_column: 0 - }; - if (this.options.ranges) { - this.yylloc.range = [0,0]; - } - this.offset = 0; - return this; - }, - -// consumes and returns one char from the input -input:function () { - var ch = this._input[0]; - this.yytext += ch; - this.yyleng++; - this.offset++; - this.match += ch; - this.matched += ch; - var lines = ch.match(/(?:\r\n?|\n).*/g); - if (lines) { - this.yylineno++; - this.yylloc.last_line++; - } else { - this.yylloc.last_column++; - } - if (this.options.ranges) { - this.yylloc.range[1]++; - } - - this._input = this._input.slice(1); - return ch; - }, - -// unshifts one char (or a string) into the input -unput:function (ch) { - var len = ch.length; - var lines = ch.split(/(?:\r\n?|\n)/g); - - this._input = ch + this._input; - this.yytext = this.yytext.substr(0, this.yytext.length - len); - //this.yyleng -= len; - this.offset -= len; - var oldLines = this.match.split(/(?:\r\n?|\n)/g); - this.match = this.match.substr(0, this.match.length - 1); - this.matched = this.matched.substr(0, this.matched.length - 1); - - if (lines.length - 1) { - this.yylineno -= lines.length - 1; - } - var r = this.yylloc.range; - - this.yylloc = { - first_line: this.yylloc.first_line, - last_line: this.yylineno + 1, - first_column: this.yylloc.first_column, - last_column: lines ? - (lines.length === oldLines.length ? this.yylloc.first_column : 0) - + oldLines[oldLines.length - lines.length].length - lines[0].length : - this.yylloc.first_column - len - }; - - if (this.options.ranges) { - this.yylloc.range = [r[0], r[0] + this.yyleng - len]; - } - this.yyleng = this.yytext.length; - return this; - }, - -// When called from action, caches matched text and appends it on next action -more:function () { - this._more = true; - return this; - }, - -// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. -reject:function () { - if (this.options.backtrack_lexer) { - this._backtrack = true; - } else { - return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), { - text: "", - token: null, - line: this.yylineno - }); - - } - return this; - }, - -// retain first n characters of the match -less:function (n) { - this.unput(this.match.slice(n)); - }, - -// displays already matched input, i.e. for error messages -pastInput:function () { - var past = this.matched.substr(0, this.matched.length - this.match.length); - return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, ""); - }, - -// displays upcoming input, i.e. for error messages -upcomingInput:function () { - var next = this.match; - if (next.length < 20) { - next += this._input.substr(0, 20-next.length); - } - return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, ""); - }, - -// displays the character position where the lexing error occurred, i.e. for error messages -showPosition:function () { - var pre = this.pastInput(); - var c = new Array(pre.length + 1).join("-"); - return pre + this.upcomingInput() + "\n" + c + "^"; - }, - -// test the lexed token: return FALSE when not a match, otherwise return token -test_match:function(match, indexed_rule) { - var token, - lines, - backup; - - if (this.options.backtrack_lexer) { - // save context - backup = { - yylineno: this.yylineno, - yylloc: { - first_line: this.yylloc.first_line, - last_line: this.last_line, - first_column: this.yylloc.first_column, - last_column: this.yylloc.last_column - }, - yytext: this.yytext, - match: this.match, - matches: this.matches, - matched: this.matched, - yyleng: this.yyleng, - offset: this.offset, - _more: this._more, - _input: this._input, - yy: this.yy, - conditionStack: this.conditionStack.slice(0), - done: this.done - }; - if (this.options.ranges) { - backup.yylloc.range = this.yylloc.range.slice(0); - } - } - - lines = match[0].match(/(?:\r\n?|\n).*/g); - if (lines) { - this.yylineno += lines.length; - } - this.yylloc = { - first_line: this.yylloc.last_line, - last_line: this.yylineno + 1, - first_column: this.yylloc.last_column, - last_column: lines ? - lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : - this.yylloc.last_column + match[0].length - }; - this.yytext += match[0]; - this.match += match[0]; - this.matches = match; - this.yyleng = this.yytext.length; - if (this.options.ranges) { - this.yylloc.range = [this.offset, this.offset += this.yyleng]; - } - this._more = false; - this._backtrack = false; - this._input = this._input.slice(match[0].length); - this.matched += match[0]; - token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]); - if (this.done && this._input) { - this.done = false; - } - if (token) { - return token; - } else if (this._backtrack) { - // recover context - for (var k in backup) { - this[k] = backup[k]; - } - return false; // rule action called reject() implying the next rule should be tested instead. - } - return false; - }, - -// return next match in input -next:function () { - if (this.done) { - return this.EOF; - } - if (!this._input) { - this.done = true; - } - - var token, - match, - tempMatch, - index; - if (!this._more) { - this.yytext = ''; - this.match = ''; - } - var rules = this._currentRules(); - for (var i = 0; i < rules.length; i++) { - tempMatch = this._input.match(this.rules[rules[i]]); - if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { - match = tempMatch; - index = i; - if (this.options.backtrack_lexer) { - token = this.test_match(tempMatch, rules[i]); - if (token !== false) { - return token; - } else if (this._backtrack) { - match = false; - continue; // rule action called reject() implying a rule MISmatch. - } else { - // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace) - return false; - } - } else if (!this.options.flex) { - break; - } - } - } - if (match) { - token = this.test_match(match, rules[index]); - if (token !== false) { - return token; - } - // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace) - return false; - } - if (this._input === "") { - return this.EOF; - } else { - return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), { - text: "", - token: null, - line: this.yylineno - }); - } - }, - -// return next match that has a token -lex:function lex () { - var r = this.next(); - if (r) { - return r; - } else { - return this.lex(); - } - }, - -// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) -begin:function begin (condition) { - this.conditionStack.push(condition); - }, - -// pop the previously active lexer condition state off the condition stack -popState:function popState () { - var n = this.conditionStack.length - 1; - if (n > 0) { - return this.conditionStack.pop(); - } else { - return this.conditionStack[0]; - } - }, - -// produce the lexer rule set which is active for the currently active lexer condition state -_currentRules:function _currentRules () { - if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) { - return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; - } else { - return this.conditions["INITIAL"].rules; - } - }, - -// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available -topState:function topState (n) { - n = this.conditionStack.length - 1 - Math.abs(n || 0); - if (n >= 0) { - return this.conditionStack[n]; - } else { - return "INITIAL"; - } - }, - -// alias for begin(condition) -pushState:function pushState (condition) { - this.begin(condition); - }, - -// return the number of states currently on the stack -stateStackSize:function stateStackSize() { - return this.conditionStack.length; - }, -options: {}, -performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) { -var YYSTATE=YY_START; -switch($avoiding_name_collisions) { -case 0: this.unput(yy_.yytext); this.pushState("DOCUMENT"); -break; -case 1: - this.pushState("MATH" + (0+!!yy.mItexIdentifierMode)); - yy.startMath = this.matched.length; - return "STARTMATH" + (2 * (yy_.yytext[0] == "$") + - (yy_.yytext[1] == "$" || yy_.yytext[1] == "[")); - -break; -case 2: this.popState(); return "EOF"; -break; -case 3: yy_.yytext = yy_.yytext[1]; return "TEXT"; -break; -case 4: - if (yy.escapeXML) { - yy_.yytext = escapeText(yy_.yytext); - } - return "TEXT"; - -break; -case 5:return "TEXT"; -break; -case 6: this.popState(); return "["; -break; -case 7: this.unput(yy_.yytext); this.popState(); this.popState(); -break; -case 8: return "TEXTOPTARG"; -break; -case 9: this.popState(); return "]"; -break; -case 10:return "{"; -break; -case 11:return "TEXTARG"; -break; -case 12: this.popState(); return "}"; -break; -case 13: this.popState(); return "]"; -break; -case 14:/* skip whitespace */ -break; -case 15: - this.popState(); - yy.endMath = this.matched.length - this.match.length; - yy.tex = this.matched.substring(yy.startMath, yy.endMath); - return "ENDMATH" + (2 * (yy_.yytext[0] == "$") + - (yy_.yytext[1] == "$" || yy_.yytext[1] == "]")); - -break; -case 16:return "{"; -break; -case 17:return "}"; -break; -case 18:return "^"; -break; -case 19:return "_"; -break; -case 20:return "."; -break; -case 21:return "COLSEP"; -break; -case 22:return "ROWSEP" -break; -case 23:return "NUM"; -break; -case 24: return "A"; -break; -case 25: yy_.yytext = "\u0396"; return "AIUG"; -break; -case 26: yy_.yytext = "\u03B6"; return "AILG"; -break; -case 27: this.pushState("OPTARG"); this.pushState("TRYOPTARG"); yy_.yytext = "\u21CC"; return "XARROW"; -break; -case 28: this.pushState("OPTARG"); this.pushState("TRYOPTARG"); yy_.yytext = "\u21D2"; return "XARROW"; -break; -case 29: this.pushState("OPTARG"); this.pushState("TRYOPTARG"); yy_.yytext = "\u2192"; return "XARROW"; -break; -case 30: this.pushState("OPTARG"); this.pushState("TRYOPTARG"); yy_.yytext = "\u21A6"; return "XARROW"; -break; -case 31: this.pushState("OPTARG"); this.pushState("TRYOPTARG"); yy_.yytext = "\u21CB"; return "XARROW"; -break; -case 32: this.pushState("OPTARG"); this.pushState("TRYOPTARG"); yy_.yytext = "\u21D4"; return "XARROW"; -break; -case 33: this.pushState("OPTARG"); this.pushState("TRYOPTARG"); yy_.yytext = "\u2194"; return "XARROW"; -break; -case 34: this.pushState("OPTARG"); this.pushState("TRYOPTARG"); yy_.yytext = "\u21D0"; return "XARROW"; -break; -case 35: this.pushState("OPTARG"); this.pushState("TRYOPTARG"); yy_.yytext = "\u2190"; return "XARROW"; -break; -case 36: yy_.yytext = "\u039E"; return "AIUG"; -break; -case 37: yy_.yytext = "\u03BE"; return "AILG"; -break; -case 38: this.pushState("OPTARG"); this.pushState("TRYOPTARG"); yy_.yytext = "\u21AA"; return "XARROW"; -break; -case 39: this.pushState("OPTARG"); this.pushState("TRYOPTARG"); yy_.yytext = "\u21A9"; return "XARROW"; -break; -case 40: yy_.yytext = "\u2240"; return "OP"; -break; -case 41: yy_.yytext = "\u2118"; return "A"; -break; -case 42: yy_.yytext = "\u21C0"; return "ACCENT"; -break; -case 43: yy_.yytext = "\u02DC"; return "ACCENT"; -break; -case 44: yy_.yytext = "\u005E"; return "ACCENT"; -break; -case 45: yy_.yytext = "\u02C7"; return "ACCENT"; -break; -case 46: yy_.yytext = "\u00AF"; return "ACCENT"; -break; -case 47: yy_.yytext = "\u2259"; return "OP"; -break; -case 48: yy_.yytext = "\u22C0"; return "OPM"; -break; -case 49: yy_.yytext = "\u2227"; return "OP"; -break; -case 50: yy_.yytext = "\u2980"; return "OPFS"; -break; -case 51: yy_.yytext = "\u22AA"; return "OP"; -break; -case 52: yy_.yytext = "\u2016"; return "OPFS"; -break; -case 53: yy_.yytext = "\u007C"; return "OPFS"; -break; -case 54: yy_.yytext = "\u22BB"; return "OP"; -break; -case 55: yy_.yytext = "\u22C1"; return "OPM"; -break; -case 56: yy_.yytext = "\u2228"; return "OP"; -break; -case 57: yy_.yytext = "\u21C0"; return "ACCENTNS"; -break; -case 58: yy_.yytext = "\u22EE"; return "OP"; -break; -case 59: yy_.yytext = "\u22AB"; return "OP"; -break; -case 60: yy_.yytext = "\u22A9"; return "OP"; -break; -case 61: yy_.yytext = "\u22A8"; return "OP"; -break; -case 62: yy_.yytext = "\u22A2"; return "OP"; -break; -case 63: yy_.yytext = "\u2AEB"; return "OP"; -break; -case 64: yy_.yytext = "\u22B3"; return "OP"; -break; -case 65: yy_.yytext = "\u22B2"; return "OP"; -break; -case 66: yy_.yytext = "\u25B5"; return "OP"; -break; -case 67: yy_.yytext = "\u03D1"; return "AILG"; -break; -case 68: yy_.yytext = "\u2ACC\uFE00"; return "OP"; -break; -case 69: yy_.yytext = "\u228B\uFE00"; return "OP"; -break; -case 70: yy_.yytext = "\u2ACB\uFE00"; return "OP"; -break; -case 71: yy_.yytext = "\u228A\uFE00"; return "OP"; -break; -case 72: yy_.yytext = "\u228A\uFE00"; return "OP"; -break; -case 73: yy_.yytext = "\u03C2"; return "A"; -break; -case 74: yy_.yytext = "\u03F1"; return "AILG"; -break; -case 75: yy_.yytext = "\u221D"; return "OP"; -break; -case 76: yy_.yytext = "\u03D6"; return "AILG"; -break; -case 77: yy_.yytext = "\u03C6"; return "AILG"; -break; -case 78: yy_.yytext = "\u2205"; return "A"; -break; -case 79: yy_.yytext = "\u03F0"; return "AILG"; -break; -case 80: yy_.yytext = "\u03B5"; return "AILG"; -break; -case 81: yy_.yytext = "\u290A"; return "OPS"; -break; -case 82: yy_.yytext = "\u21C8"; return "OPS"; -break; -case 83: yy_.yytext = "\u03D2"; return "A"; -break; -case 84: yy_.yytext = "\u03C5"; return "AILG"; -break; -case 85: yy_.yytext = "\u03D2"; return "A"; -break; -case 86: yy_.yytext = "\u228E"; return "OP"; -break; -case 87: yy_.yytext = "\u2A1B"; return "OP"; -break; -case 88: yy_.yytext = "\u21BF"; return "OPS"; -break; -case 89: yy_.yytext = "\u21BE"; return "OPS"; -break; -case 90: yy_.yytext = "\u21D5"; return "OPS"; -break; -case 91: yy_.yytext = "\u2195"; return "OPS"; -break; -case 92: yy_.yytext = "\u2195"; return "OPS"; -break; -case 93: yy_.yytext = "\u21D1"; return "OPS"; -break; -case 94: yy_.yytext = "\u2191"; return "OPS"; -break; -case 95: yy_.yytext = "\u2191"; return "OPS"; -break; -case 96: yy_.yytext = "\u22B5"; return "OP"; -break; -case 97: yy_.yytext = "\u22B4"; return "OP"; -break; -case 98: yy_.yytext = "\u22C3"; return "OPM"; -break; -case 99: yy_.yytext = "\u222A"; return "OP"; -break; -case 100:return "UNDERSET"; -break; -case 101:return "UNDEROVERSET"; -break; -case 102:return "UNDERLINE"; -break; -case 103:return "UNDERBRACE"; -break; -case 104: yy_.yytext = "\u22F0"; return "OP"; -break; -case 105:return "OP"; -break; -case 106:return "OP"; -break; -case 107:return "OP"; -break; -case 108:return "OP"; -break; -case 109:return "OP"; -break; -case 110:return "OP"; -break; -case 111:return "OP"; -break; -case 112:return "OP"; -break; -case 113:return "OP"; -break; -case 114:return "OP"; -break; -case 115:return "OP"; -break; -case 116:return "OP"; -break; -case 117:return "OP"; -break; -case 118:return "OP"; -break; -case 119:return "OP"; -break; -case 120:return "OP"; -break; -case 121:return "OP"; -break; -case 122:return "OP"; -break; -case 123:return "OP"; -break; -case 124:return "OP"; -break; -case 125:return "OP"; -break; -case 126:return "OP"; -break; -case 127:return "OP"; -break; -case 128:return "OP"; -break; -case 129:return "OP"; -break; -case 130:return "OP"; -break; -case 131:return "OP"; -break; -case 132:return "OP"; -break; -case 133:return "OP"; -break; -case 134:return "OP"; -break; -case 135:return "OP"; -break; -case 136:return "OP"; -break; -case 137:return "OP"; -break; -case 138:return "OPFS"; -break; -case 139:return "OPFS"; -break; -case 140:return "OP"; -break; -case 141:return "OP"; -break; -case 142:return "OP"; -break; -case 143:return "OP"; -break; -case 144:return "OP"; -break; -case 145:return "OP"; -break; -case 146:return "OP"; -break; -case 147:return "OP"; -break; -case 148:return "OP"; -break; -case 149:return "OP"; -break; -case 150:return "OP"; -break; -case 151:return "OP"; -break; -case 152:return "OP"; -break; -case 153:return "OP"; -break; -case 154:return "OP"; -break; -case 155:return "OP"; -break; -case 156:return "OP"; -break; -case 157:return "OP"; -break; -case 158:return "OP"; -break; -case 159:return "OP"; -break; -case 160:return "OP"; -break; -case 161: yy_.yytext = "\u2916"; return "OP"; -break; -case 162: yy_.yytext = "\u21A0"; return "OPS"; -break; -case 163: yy_.yytext = "\u219E"; return "OPS"; -break; -case 164: yy_.yytext = "\u222D"; return "OP"; -break; -case 165: yy_.yytext = "\u22B5"; return "OP"; -break; -case 166: yy_.yytext = "\u25B9"; return "OP"; -break; -case 167: yy_.yytext = "\u225C"; return "OP"; -break; -case 168: yy_.yytext = "\u22B4"; return "OP"; -break; -case 169: yy_.yytext = "\u25C3"; return "OP"; -break; -case 170: yy_.yytext = "\u25BF"; return "OP"; -break; -case 171: yy_.yytext = "\u25B5"; return "OP"; -break; -case 172: yy_.yytext = "\u292A"; return "OP"; -break; -case 173: yy_.yytext = "\u2929"; return "OP"; -break; -case 174: yy_.yytext = "\u22A4"; return "OP"; -break; -case 175: this.pushState("TEXTARG"); return "TOOLTIP"; -break; -case 176: yy_.yytext = "\u2927"; return "OP"; -break; -case 177: return "TOGGLE"; -break; -case 178: yy_.yytext = "\u2928"; return "OP"; -break; -case 179: yy_.yytext = "\u2192"; return "OPS"; -break; -case 180: yy_.yytext = "\u22A0"; return "OP"; -break; -case 181: yy_.yytext = "\u00D7"; return "OP"; -break; -case 182: yy_.yytext = "\u02DC"; return "ACCENTNS"; -break; -case 183:return "THINSPACE"; -break; -case 184:return "THICKSPACE"; -break; -case 185: yy_.yytext = "\u223C"; return "OP"; -break; -case 186: yy_.yytext = "\u2248"; return "OP"; -break; -case 187: yy_.yytext = "\u0398"; return "AIUG"; -break; -case 188: yy_.yytext = "\u03B8"; return "AILG"; -break; -case 189: yy_.yytext = "\u2234"; return "OP"; -break; -case 190:return "TFRAC"; -break; -case 191:return "TEXTSTYLE"; -break; -case 192:return "TEXTSIZE"; -break; -case 193: yy_.yytext = "\u201D"; return "OPF"; -break; -case 194: yy_.yytext = "\u201C"; return "OPF"; -break; -case 195: yy_.yytext = "\u007E"; return "OPS"; -break; -case 196: yy_.yytext = "\u0060"; return "OP"; -break; -case 197: yy_.yytext = "\u005E"; return "OPS"; -break; -case 198: yy_.yytext = "\u00B4"; return "OP"; -break; -case 199: this.begin("TEXTARG"); return "MTEXT"; -break; -case 200:return "TENSOR"; -break; -case 201:return "TBINOM"; -break; -case 202: yy_.yytext = "\u03A4"; return "AIUG"; -break; -case 203: yy_.yytext = "\u03C4"; return "AILG"; -break; -case 204: yy_.yytext = "\u21D9"; return "OPS"; -break; -case 205: yy_.yytext = "\u2199"; return "OPS"; -break; -case 206: yy_.yytext = "\u21D9"; return "OPS"; -break; -case 207: yy_.yytext = "\u2199"; return "OPS"; -break; -case 208: yy_.yytext = "\u221A"; return "OPS"; -break; -case 209: yy_.yytext = "\u2ACC"; return "OP"; -break; -case 210: yy_.yytext = "\u228B"; return "OP"; -break; -case 211: yy_.yytext = "\u2AC6"; return "OP"; -break; -case 212: yy_.yytext = "\u2287"; return "OP"; -break; -case 213: yy_.yytext = "\u22D1"; return "OP"; -break; -case 214: yy_.yytext = "\u2283"; return "OP"; -break; -case 215: yy_.yytext = "\u2211"; return "OPM"; -break; -case 216: yy_.yytext = "\u227F"; return "OP"; -break; -case 217: yy_.yytext = "\u22E9"; return "OP"; -break; -case 218: yy_.yytext = "\u2AB6"; return "OP"; -break; -case 219: yy_.yytext = "\u2ABA"; return "OP"; -break; -case 220: yy_.yytext = "\u2AB0"; return "OP"; -break; -case 221: yy_.yytext = "\u227D"; return "OP"; -break; -case 222: yy_.yytext = "\u2AB8"; return "OP"; -break; -case 223: yy_.yytext = "\u227B"; return "OP"; -break; -case 224:return "SUBSTACK"; -break; -case 225: yy_.yytext = "\u2ACB"; return "OP"; -break; -case 226: yy_.yytext = "\u228A"; return "OP"; -break; -case 227: yy_.yytext = "\u2AC5"; return "OP"; -break; -case 228: yy_.yytext = "\u2286"; return "OP"; -break; -case 229: yy_.yytext = "\u22D0"; return "OP"; -break; -case 230: yy_.yytext = "\u2282"; return "OP"; -break; -case 231: this.pushState("TEXTARG"); return "STATUSLINE"; -break; -case 232: yy_.yytext = "\u22C6"; return "OP"; -break; -case 233:return "OVERSET"; -break; -case 234: yy_.yytext = "\u2AFD"; return "OP"; -break; -case 235: yy_.yytext = "\u25A1"; return "OP"; -break; -case 236: yy_.yytext = "\u2292"; return "OP"; -break; -case 237: yy_.yytext = "\u2290"; return "OP"; -break; -case 238: yy_.yytext = "\u2291"; return "OP"; -break; -case 239: yy_.yytext = "\u228F"; return "OP"; -break; -case 240: this.pushState("OPTARG"); this.pushState("TRYOPTARG"); return "SQRT"; -break; -case 241: yy_.yytext = "\u2294"; return "OP"; -break; -case 242: yy_.yytext = "\u2293"; return "OP"; -break; -case 243: yy_.yytext = "\u2222"; return "OP"; -break; -case 244: yy_.yytext = "\u2660"; return "OP"; -break; -case 245: this.pushState("TEXTARG"); this.pushState("TEXTARG"); this.pushState("TEXTARG"); return "SPACE"; -break; -case 246: yy_.yytext = "\u2323"; return "OP"; -break; -case 247: yy_.yytext = "\u2323"; return "OP"; -break; -case 248: yy_.yytext = "\u2216"; return "OP"; -break; -case 249: yy_.yytext = "\u2322"; return "OP"; -break; -case 250:return "SLASH"; -break; -case 251: yy_.yytext = "\u2243"; return "OP"; -break; -case 252: yy_.yytext = "\u223C"; return "OP"; -break; -case 253: yy_.yytext = "\u03A3"; return "AIUG"; -break; -case 254: yy_.yytext = "\u03C3"; return "AILG"; -break; -case 255: yy_.yytext = "\u29E2"; return "OP"; -break; -case 256: yy_.yytext = "\u2225"; return "OP"; -break; -case 257: yy_.yytext = "\u2223"; return "OP"; -break; -case 258: yy_.yytext = "\u266F"; return "OP"; -break; -case 259: yy_.yytext = "\u2216"; return "OP"; -break; -case 260: yy_.yytext = "\u292D"; return "OP"; -break; -case 261: yy_.yytext = "\u21D8"; return "OPS"; -break; -case 262: yy_.yytext = "\u2198"; return "OPS"; -break; -case 263: yy_.yytext = "\u21D8"; return "OPS"; -break; -case 264: yy_.yytext = "\u2198"; return "OPS"; -break; -case 265:return "SCRIPTSIZE"; -break; -case 266:return "SCRIPTSCRIPTSIZE"; -break; -case 267: yy_.yytext = "\u22CA"; return "OP"; -break; -case 268: yy_.yytext = "\u21B1"; return "OPS"; -break; -case 269: yy_.yytext = "\u21DB"; return "OPS"; -break; -case 270: yy_.yytext = "\u27EB"; return "OPFS"; -break; -case 271: yy_.yytext = "\u2019"; return "OPF"; -break; -case 272: this.begin("TEXTARG"); return "ROWSPAN"; -break; -case 273:return "ROWOPTS"; -break; -case 274: this.pushState("TEXTARG"); return "ROWLINES"; -break; -case 275: this.begin("TEXTARG"); return "ROWALIGN"; -break; -case 276:return "ROOT"; -break; -case 277: yy_.yytext = "\u23B1"; return "OP"; -break; -case 278: yy_.yytext = "\u2253"; return "OP"; -break; -case 279: yy_.yytext = "\u27F2"; return "OP"; -break; -case 280: yy_.yytext = "\u22CC"; return "OP"; -break; -case 281: yy_.yytext = "\u219D"; return "OPS"; -break; -case 282: yy_.yytext = "\u21C9"; return "OPS"; -break; -case 283: yy_.yytext = "\u21CC"; return "OPS"; -break; -case 284: yy_.yytext = "\u21C4"; return "OPS"; -break; -case 285: yy_.yytext = "\u21C0"; return "OPS"; -break; -case 286: yy_.yytext = "\u21C1"; return "OPS"; -break; -case 287: yy_.yytext = "\u21FE"; return "OPS"; -break; -case 288: yy_.yytext = "\u21A3"; return "OPS"; -break; -case 289: yy_.yytext = "\u21D2"; return "OPS"; -break; -case 290: yy_.yytext = "\u2192"; return "OPS"; -break; -case 291:return "RIGHT"; -break; -case 292: yy_.yytext = "\u03A1"; return "AIUG"; -break; -case 293: yy_.yytext = "\u03C1"; return "AILG"; -break; -case 294: yy_.yytext = "\u22B3"; return "OP"; -break; -case 295: yy_.yytext = "\u230B"; return "OPFS"; -break; -case 296: yy_.yytext = "\u211C"; return "A"; -break; -case 297: yy_.yytext = "\u2930"; return "OP"; -break; -case 298: yy_.yytext = "\u292B"; return "OP"; -break; -case 299: yy_.yytext = "\u2309"; return "OPFS"; -break; -case 300: yy_.yytext = "\u005D"; return "OPFS"; -break; -case 301: yy_.yytext = "\u007D"; return "OPFS"; -break; -case 302: yy_.yytext = "\u27E9"; return "OPFS"; -break; -case 303: yy_.yytext = "\u27E9"; return "OPFS"; -break; -case 304: yy_.yytext = "\u225F"; return "OP"; -break; -case 305: yy_.yytext = "\u2A0C"; return "OP"; -break; -case 306:return "QUAD"; -break; -case 307:return "QQUAD"; -break; -case 308: yy_.yytext = "\u25AA"; return "OP"; -break; -case 309: yy_.yytext = "\u03A8"; return "AIUG"; -break; -case 310: yy_.yytext = "\u03C8"; return "AILG"; -break; -case 311: yy_.yytext = "\u221D"; return "OP"; -break; -case 312: yy_.yytext = "\u220F"; return "OPM"; -break; -case 313: yy_.yytext = "\u220F"; return "OPM"; -break; -case 314: yy_.yytext = "\u2032"; return "OPP"; -break; -case 315: yy_.yytext = "\u227E"; return "OP"; -break; -case 316: yy_.yytext = "\u22E8"; return "OP"; -break; -case 317: yy_.yytext = "\u2AB5"; return "OP"; -break; -case 318: yy_.yytext = "\u2AB9"; return "OP"; -break; -case 319: yy_.yytext = "\u2AAF"; return "OP"; -break; -case 320: yy_.yytext = "\u227C"; return "OP"; -break; -case 321: yy_.yytext = "\u2AB7"; return "OP"; -break; -case 322: yy_.yytext = "\u227A"; return "OP"; -break; -case 323:return "PMOD"; -break; -case 324: yy_.yytext = "\u00B1"; return "OP"; -break; -case 325: yy_.yytext = "\u2A25"; return "OP"; -break; -case 326: yy_.yytext = "\u229E"; return "OP"; -break; -case 327: yy_.yytext = "\u22D4"; return "OP"; -break; -case 328: yy_.yytext = "\u03A0"; return "AIUG"; -break; -case 329: yy_.yytext = "\u03C0"; return "AILG"; -break; -case 330: yy_.yytext = "\u03A6"; return "AIUG"; -break; -case 331: yy_.yytext = "\u03D5"; return "AILG"; -break; -case 332:return "PHANTOM"; -break; -case 333: yy_.yytext = "\u2AEB"; return "OP"; -break; -case 334: yy_.yytext = "\u22A5"; return "OP"; -break; -case 335: yy_.yytext = "\u2AA3"; return "OP"; -break; -case 336: yy_.yytext = "\u2202"; return "OP"; -break; -case 337: yy_.yytext = "\u214B"; return "OP"; -break; -case 338: yy_.yytext = "\u2225"; return "OP"; -break; -case 339: this.pushState("TEXTARG"); return "PADDING"; -break; -case 340:return "OVERSET"; -break; -case 341: yy_.yytext = "\u00AF"; return "ACCENT"; -break; -case 342:return "OVERBRACE"; -break; -case 343:return "TEXOVER"; -break; -case 344: yy_.yytext = "\u2A34"; return "OP"; -break; -case 345: yy_.yytext = "\u2297"; return "OP"; -break; -case 346: yy_.yytext = "\u2298"; return "OP"; -break; -case 347:return "OPS"; -break; -case 348:return "OPP"; -break; -case 349:return "OPM"; -break; -case 350: yy_.yytext = "\u2A2D"; return "OP"; -break; -case 351: yy_.yytext = "\u2295"; return "OP"; -break; -case 352:return "OPFS"; -break; -case 353:return "OPF"; -break; -case 354: this.begin("TEXTARG"); return "OPERATORNAME"; -break; -case 355:return "OP"; -break; -case 356: yy_.yytext = "\u2296"; return "OP"; -break; -case 357: yy_.yytext = "\u2134"; return "A"; -break; -case 358: yy_.yytext = "\u03A9"; return "AIUG"; -break; -case 359: yy_.yytext = "\u03C9"; return "AILG"; -break; -case 360: yy_.yytext = "\u222E"; return "OP"; -break; -case 361: yy_.yytext = "\u222F"; return "OP"; -break; -case 362: yy_.yytext = "\u2230"; return "OP"; -break; -case 363: yy_.yytext = "\u2299"; return "OP"; -break; -case 364: yy_.yytext = "\u229D"; return "OP"; -break; -case 365: yy_.yytext = "\u29B8"; return "OP"; -break; -case 366: yy_.yytext = "\u2932"; return "OP"; -break; -case 367: yy_.yytext = "\u21D6"; return "OPS"; -break; -case 368: yy_.yytext = "\u2196"; return "OPS"; -break; -case 369: yy_.yytext = "\u21D6"; return "OPS"; -break; -case 370: yy_.yytext = "\u2196"; return "OPS"; -break; -case 371: yy_.yytext = "\u22AF"; return "OP"; -break; -case 372: yy_.yytext = "\u22AE"; return "OP"; -break; -case 373: yy_.yytext = "\u22AD"; return "OP"; -break; -case 374: yy_.yytext = "\u22AC"; return "OP"; -break; -case 375:return "NUM"; -break; -case 376: yy_.yytext = "\u039D"; return "AIUG"; -break; -case 377: yy_.yytext = "\u03BD"; return "AILG"; -break; -case 378: yy_.yytext = "\u22ED"; return "OP"; -break; -case 379: yy_.yytext = "\u22EB"; return "OP"; -break; -case 380: yy_.yytext = "\u22EC"; return "OP"; -break; -case 381: yy_.yytext = "\u22EA"; return "OP"; -break; -case 382: yy_.yytext = "\u2289"; return "OP"; -break; -case 383: yy_.yytext = "\u2285"; return "OP"; -break; -case 384: yy_.yytext = "\u227F\u0338"; return "OP"; -break; -case 385: yy_.yytext = "\u2AB0\u0338"; return "OP"; -break; -case 386: yy_.yytext = "\u2281"; return "OP"; -break; -case 387: yy_.yytext = "\u2288"; return "OP"; -break; -case 388: yy_.yytext = "\u2288"; return "OP"; -break; -case 389: yy_.yytext = "\u2284"; return "OP"; -break; -case 390: yy_.yytext = "\u2244"; return "OP"; -break; -case 391: yy_.yytext = "\u2241"; return "OP"; -break; -case 392: yy_.yytext = "\u2226"; return "OP"; -break; -case 393: yy_.yytext = "\u2224"; return "OP"; -break; -case 394: yy_.yytext = "\u21CF"; return "OP"; -break; -case 395: yy_.yytext = "\u219B"; return "OP"; -break; -case 396: yy_.yytext = "\u2AAF\u0338"; return "OP"; -break; -case 397: yy_.yytext = "\u2280"; return "OP"; -break; -case 398: yy_.yytext = "\u2226"; return "OP"; -break; -case 399: yy_.yytext = "\u220C"; return "OP"; -break; -case 400: yy_.yytext = "\u2209"; return "OP"; -break; -case 401: yy_.yytext = "\u00AC"; return "OP"; -break; -case 402: yy_.yytext = "\u2224"; return "OP"; -break; -case 403: yy_.yytext = "\u226E"; return "OP"; -break; -case 404: yy_.yytext = "\u2A7D\u0338"; return "OP"; -break; -case 405: yy_.yytext = "\u2A7D\u0338"; return "OP"; -break; -case 406: yy_.yytext = "\u2270"; return "OP"; -break; -case 407: yy_.yytext = "\u21CE"; return "OP"; -break; -case 408: yy_.yytext = "\u21AE"; return "OP"; -break; -case 409: yy_.yytext = "\u21CD"; return "OP"; -break; -case 410: yy_.yytext = "\u219A"; return "OP"; -break; -case 411: yy_.yytext = "\u220B"; return "OP"; -break; -case 412: yy_.yytext = "\u226F"; return "OP"; -break; -case 413: yy_.yytext = "\u2A7E\u0338"; return "OP"; -break; -case 414: yy_.yytext = "\u2A7E\u0338"; return "OP"; -break; -case 415: yy_.yytext = "\u2271"; return "OP"; -break; -case 416: yy_.yytext = "\u2204"; return "OP"; -break; -case 417: yy_.yytext = "\u2262"; return "OP"; -break; -case 418: yy_.yytext = "\u2242\u0338"; return "OP"; -break; -case 419: yy_.yytext = "\u2260"; return "OP"; -break; -case 420: yy_.yytext = "\u292E"; return "OP"; -break; -case 421: yy_.yytext = "\u2931"; return "OP"; -break; -case 422:return "NEGTHICKSPACE"; -break; -case 423:return "NEGSPACE"; -break; -case 424:return "NEGMEDSPACE"; -break; -case 425: yy_.yytext = "\u00AC"; return "OP"; -break; -case 426: yy_.yytext = "\u21D7"; return "OPS"; -break; -case 427: yy_.yytext = "\u2197"; return "OPS"; -break; -case 428: yy_.yytext = "\u21D7"; return "OPS"; -break; -case 429: yy_.yytext = "\u2197"; return "OPS"; -break; -case 430: yy_.yytext = "\u2260"; return "OP"; -break; -case 431: yy_.yytext = "\u2247"; return "OP"; -break; -case 432: yy_.yytext = "\u224E\u0338"; return "OP"; -break; -case 433: yy_.yytext = "\u224F\u0338"; return "OP"; -break; -case 434: yy_.yytext = "\u266E"; return "OP"; -break; -case 435: yy_.yytext = "\u2249"; return "OP"; -break; -case 436: yy_.yytext = "\u2207"; return "OP"; -break; -case 437:return "MULTI"; -break; -case 438: yy_.yytext = "\u22B8"; return "OP"; -break; -case 439: yy_.yytext = "\u039C"; return "AIUG"; -break; -case 440: yy_.yytext = "\u03BC"; return "AILG"; -break; -case 441: this.begin("TEXTARG"); return "MTEXT"; -break; -case 442: this.pushState("TEXTARG"); this.pushState("TEXTOPTARG"); this.pushState("TRYOPTARG"); this.pushState("TEXTOPTARG"); this.pushState("TRYOPTARG"); return "MS"; -break; -case 443: yy_.yytext = "\u2213"; return "OP"; -break; -case 444: yy_.yytext = "\u22A7"; return "OP"; -break; -case 445: yy_.yytext = "mod"; return "MO"; -break; -case 446: this.pushState("TEXTARG"); return "MO"; -break; -case 447: this.pushState("TEXTARG"); return "MN"; -break; -case 448: yy_.yytext = "\u2ADB"; return "OP"; -break; -case 449: yy_.yytext = "\u2A2A"; return "OP"; -break; -case 450: yy_.yytext = "\u229F"; return "OP"; -break; -case 451: yy_.yytext = "\u2212"; return "OP"; -break; -case 452: yy_.yytext = yy_.yytext.slice(1); return "FM"; -break; -case 453: yy_.yytext = "\u2223"; return "OP"; -break; -case 454: this.pushState("TEXTARG"); return "MI"; -break; -case 455: yy_.yytext = "\u2127"; return "A"; -break; -case 456: yy_.yytext = "\u2127"; return "A"; -break; -case 457:return "MEDSPACE"; -break; -case 458: yy_.yytext = "\u2221"; return "OP"; -break; -case 459:return "MATHTT"; -break; -case 460:return "MATHSF"; -break; -case 461:return "MATHSCR"; -break; -case 462:return "MATHRM"; -break; -case 463:return "MATHRLAP"; -break; -case 464: this.begin("TEXTARG"); return "MATHREL"; -break; -case 465: this.pushState("TEXTOPTARG"); this.pushState("TRYOPTARG"); this.pushState("TEXTOPTARG"); this.pushState("TRYOPTARG"); this.pushState("TEXTARG"); return "MATHRAISEBOX"; -break; -case 466: this.begin("TEXTARG"); return "MATHOP"; -break; -case 467:return "MATHIT"; -break; -case 468:return "MATHLLAP"; -break; -case 469:return "MATHIT"; -break; -case 470:return "MATHFRAK"; -break; -case 471:return "MATHFRAK"; -break; -case 472:return "MATHCLAP"; -break; -case 473:return "MATHSCR"; -break; -case 474:return "MATHBSCR"; -break; -case 475:return "MATHBIT"; -break; -case 476: this.begin("TEXTARG"); return "MATHBIN"; -break; -case 477:return "MATHBF"; -break; -case 478:return "MATHBSCR"; -break; -case 479:return "MATHBB"; -break; -case 480: yy_.yytext = "\u2907"; return "OP"; -break; -case 481: yy_.yytext = "\u21A6"; return "OPS"; -break; -case 482: yy_.yytext = "\u2906"; return "OP"; -break; -case 483: yy_.yytext = "\u21A6"; return "OPS"; -break; -case 484: yy_.yytext = "\u2268\uFE00"; return "OP"; -break; -case 485: yy_.yytext = "\u2268\uFE00"; return "OP"; -break; -case 486: yy_.yytext = "\u22C9"; return "OP"; -break; -case 487: yy_.yytext = "\u003C"; return "OP"; -break; -case 488: yy_.yytext = "\u21B0"; return "OPS"; -break; -case 489: yy_.yytext = "\u2018"; return "OPF"; -break; -case 490: yy_.yytext = "\u25CA"; return "OP"; -break; -case 491: yy_.yytext = "\u2A1C"; return "OP"; -break; -case 492: yy_.yytext = "\u21AC"; return "OPS"; -break; -case 493: yy_.yytext = "\u21AB"; return "OPS"; -break; -case 494: yy_.yytext = "\u27F9"; return "OPS"; -break; -case 495: yy_.yytext = "\u27F6"; return "OPS"; -break; -case 496: yy_.yytext = "\u27FC"; return "OPS"; -break; -case 497: yy_.yytext = "\u27FA"; return "OPS"; -break; -case 498: yy_.yytext = "\u27F7"; return "OPS"; -break; -case 499: yy_.yytext = "\u27F8"; return "OPS"; -break; -case 500: yy_.yytext = "\u27F5"; return "OPS"; -break; -case 501: yy_.yytext = "\u22E6"; return "OP"; -break; -case 502: yy_.yytext = "\u2268"; return "OP"; -break; -case 503: yy_.yytext = "\u2A87"; return "OP"; -break; -case 504: yy_.yytext = "\u2A89"; return "OP"; -break; -case 505: yy_.yytext = "\u23B0"; return "OP"; -break; -case 506: yy_.yytext = "\u22D8"; return "OP"; -break; -case 507: yy_.yytext = "\u21DA"; return "OPS"; -break; -case 508: yy_.yytext = "\u27EA"; return "OPFS"; -break; -case 509: yy_.yytext = "\u226A"; return "OP"; -break; -case 510: yy_.yytext = "\u22B2"; return "OP"; -break; -case 511: yy_.yytext = "\u230A"; return "OPFS"; -break; -case 512: yy_.yytext = "\u2272"; return "OP"; -break; -case 513: yy_.yytext = "\u2276"; return "OP"; -break; -case 514: yy_.yytext = "\u2A8B"; return "OP"; -break; -case 515: yy_.yytext = "\u22DA"; return "OP"; -break; -case 516: yy_.yytext = "\u22D6"; return "OP"; -break; -case 517: yy_.yytext = "\u2A85"; return "OP"; -break; -case 518: yy_.yytext = "\u003C"; return "OP"; -break; -case 519: yy_.yytext = "\u2A7D"; return "OP"; -break; -case 520: yy_.yytext = "\u2266"; return "OP"; -break; -case 521: yy_.yytext = "\u2264"; return "OP"; -break; -case 522: yy_.yytext = "\u27F3"; return "OP"; -break; -case 523: yy_.yytext = "\u22CB"; return "OP"; -break; -case 524: yy_.yytext = "\u219C"; return "OPS"; -break; -case 525: yy_.yytext = "\u21AD"; return "OPS"; -break; -case 526: yy_.yytext = "\u21CB"; return "OPS"; -break; -case 527: yy_.yytext = "\u21FF"; return "OPS"; -break; -case 528: yy_.yytext = "\u21C6"; return "OPS"; -break; -case 529: yy_.yytext = "\u21D4"; return "OPS"; -break; -case 530: yy_.yytext = "\u2194"; return "OPS"; -break; -case 531: yy_.yytext = "\u21C7"; return "OPS"; -break; -case 532: yy_.yytext = "\u21BC"; return "OPS"; -break; -case 533: yy_.yytext = "\u21BD"; return "OPS"; -break; -case 534: yy_.yytext = "\u21FD"; return "OPS"; -break; -case 535: yy_.yytext = "\u21A2"; return "OPS"; -break; -case 536: yy_.yytext = "\u21D0"; return "OPS"; -break; -case 537: yy_.yytext = "\u2190"; return "OPS"; -break; -case 538:return "LEFT"; -break; -case 539: yy_.yytext = "\u2264"; return "OP"; -break; -case 540: yy_.yytext = "\u2026"; return "OP"; -break; -case 541: yy_.yytext = "\u2308"; return "OPFS"; -break; -case 542: yy_.yytext = "\u005B"; return "OPFS"; -break; -case 543: yy_.yytext = "\u007B"; return "OPFS"; -break; -case 544: yy_.yytext = "\u27E8"; return "OPFS"; -break; -case 545: yy_.yytext = "\u27E8"; return "OPFS"; -break; -case 546: yy_.yytext = "\u039B"; return "AIUG"; -break; -case 547: yy_.yytext = "\u03BB"; return "AILG"; -break; -case 548: yy_.yytext = "\u223B"; return "OP"; -break; -case 549: yy_.yytext = "\u039A"; return "AIUG"; -break; -case 550: yy_.yytext = "\u03BA"; return "AILG"; -break; -case 551: yy_.yytext = "\u0237"; return "AILL"; -break; -case 552: this.pushState("TEXTARG"); return "MN"; -break; -case 553: yy_.yytext = "\u0399"; return "AIUG"; -break; -case 554: yy_.yytext = "\u03B9"; return "AILG"; -break; -case 555: yy_.yytext = "\u214B"; return "OP"; -break; -case 556: yy_.yytext = "\u2A18"; return "OP"; -break; -case 557: yy_.yytext = "\u2A3D"; return "OP"; -break; -case 558: yy_.yytext = "\u2A3C"; return "OP"; -break; -case 559: yy_.yytext = "\u22C2"; return "OPM"; -break; -case 560: yy_.yytext = "\u2229"; return "OP"; -break; -case 561: yy_.yytext = "\u2AF4"; return "OP"; -break; -case 562: yy_.yytext = "\u22BA"; return "OP"; -break; -case 563: yy_.yytext = "\u222B"; return "OP"; -break; -case 564: yy_.yytext = "\u2A1A"; return "OP"; -break; -case 565: yy_.yytext = "\u2A19"; return "OP"; -break; -case 566: yy_.yytext = "\u2A0E"; return "OP"; -break; -case 567: yy_.yytext = "\u2A0D"; return "OP"; -break; -case 568: yy_.yytext = "\u222B"; return "OP"; -break; -case 569: yy_.yytext = "\u221E"; return "NUM"; -break; -case 570: yy_.yytext = "\u221E"; return "NUM"; -break; -case 571: yy_.yytext = yy_.yytext.slice(1); return "FM"; -break; -case 572: yy_.yytext = "\u220A"; return "OP"; -break; -case 573: yy_.yytext = "\u21D2"; return "OPS"; -break; -case 574: yy_.yytext = "\u21D0"; return "OPS"; -break; -case 575: yy_.yytext = "\u0131"; return "AILL"; -break; -case 576: yy_.yytext = "\u2111"; return "A"; -break; -case 577: yy_.yytext = "\u222C"; return "OP"; -break; -case 578: yy_.yytext = "\u222D"; return "OP"; -break; -case 579: yy_.yytext = "\u2A0C"; return "OP"; -break; -case 580: yy_.yytext = "\u27FA"; return "OPS"; -break; -case 581: yy_.yytext = "\u210F"; return "A"; -break; -case 582: this.pushState("TEXTARG"); return "HREF"; -break; -case 583: yy_.yytext = "\u21AA"; return "OPS"; -break; -case 584: yy_.yytext = "\u21A9"; return "OPS"; -break; -case 585: yy_.yytext = "\u2926"; return "OP"; -break; -case 586: yy_.yytext = "\u2925"; return "OP"; -break; -case 587: yy_.yytext = "\u2661"; return "OP"; -break; -case 588: yy_.yytext = "\u210F"; return "A"; -break; -case 589: yy_.yytext = "\u005E"; return "ACCENTNS"; -break; -case 590: yy_.yytext = "\u2269\uFE00"; return "OP"; -break; -case 591: yy_.yytext = "\u2269\uFE00"; return "OP"; -break; -case 592: yy_.yytext = "\u2273"; return "OP"; -break; -case 593: yy_.yytext = "\u2277"; return "OP"; -break; -case 594: yy_.yytext = "\u2A8C"; return "OP"; -break; -case 595: yy_.yytext = "\u22DB"; return "OP"; -break; -case 596: yy_.yytext = "\u22D7"; return "OP"; -break; -case 597: yy_.yytext = "\u2A86"; return "OP"; -break; -case 598: yy_.yytext = "\u003E"; return "OP"; -break; -case 599: yy_.yytext = "\u003E"; return "OP"; -break; -case 600: yy_.yytext = "\u22E7"; return "OP"; -break; -case 601: yy_.yytext = "\u2269"; return "OP"; -break; -case 602: yy_.yytext = "\u2A88"; return "OP"; -break; -case 603: yy_.yytext = "\u2A8A"; return "OP"; -break; -case 604: yy_.yytext = "\u2137"; return "A"; -break; -case 605: yy_.yytext = "\u22D9"; return "OP"; -break; -case 606: yy_.yytext = "\u226B"; return "OP"; -break; -case 607: yy_.yytext = "\u2A7E"; return "OP"; -break; -case 608: yy_.yytext = "\u2267"; return "OP"; -break; -case 609: yy_.yytext = "\u2265"; return "OP"; -break; -case 610: yy_.yytext = "\u2265"; return "OP"; -break; -case 611: yy_.yytext = "\u0393"; return "AIUG"; -break; -case 612: yy_.yytext = "\u03B3"; return "AILG"; -break; -case 613: yy_.yytext = "\u2322"; return "OP"; -break; -case 614: this.pushState("TEXTARG"); return "FRAME"; -break; -case 615:return "FRAC"; -break; -case 616: yy_.yytext = "\u2ADD"; return "OP"; -break; -case 617: yy_.yytext = "\u2ADD\u0338"; return "OP"; -break; -case 618: yy_.yytext = "\u2200"; return "OP"; -break; -case 619: yy_.yytext = "\u266D"; return "OP"; -break; -case 620: yy_.yytext = "\u292C"; return "OP"; -break; -case 621: yy_.yytext = "\u292F"; return "OP"; -break; -case 622: yy_.yytext = "\u2252"; return "OP"; -break; -case 623: yy_.yytext = "\u2203"; return "OP"; -break; -case 624: yy_.yytext = "\u00F0"; return "A"; -break; -case 625: yy_.yytext = "\u00F0"; return "A"; -break; -case 626: yy_.yytext = "\u0397"; return "AIUG"; -break; -case 627: yy_.yytext = "\u03B7"; return "AILG"; -break; -case 628: yy_.yytext = "\u2261"; return "OP"; -break; -case 629: this.pushState("TEXTARG"); return "EQROWS"; -break; -case 630: this.pushState("TEXTARG"); return "EQCOLS"; -break; -case 631: yy_.yytext = "\u2A95"; return "OP"; -break; -case 632: yy_.yytext = "\u2A96"; return "OP"; -break; -case 633: yy_.yytext = "\u2242"; return "OP"; -break; -case 634: yy_.yytext = "\u003D\u2237"; return "OP"; -break; -case 635: yy_.yytext = "\u2255"; return "OP"; -break; -case 636: yy_.yytext = "\u2212\u2237"; return "OP"; -break; -case 637: yy_.yytext = "\u003D\u2237"; return "OP"; -break; -case 638: yy_.yytext = "\u003D\u2237"; return "OP"; -break; -case 639: yy_.yytext = "\u003D\u2237"; return "OP"; -break; -case 640: yy_.yytext = "\u2255"; return "OP"; -break; -case 641: yy_.yytext = "\u2256"; return "OP"; -break; -case 642: yy_.yytext = "\u03F5"; return "AILG"; -break; -case 643:return "EVVMATRIX"; -break; -case 644:return "EVMATRIX"; -break; -case 645: return "ETOGGLE"; -break; -case 646:return "EALIGNED"; -break; -case 647:return "ESMALLMATRIX"; -break; -case 648:return "EPMATRIX"; -break; -case 649:return "EMATRIX"; -break; -case 650:return "EGATHERED"; -break; -case 651:return "ECASES"; -break; -case 652:return "EBBMATRIX"; -break; -case 653:return "EBMATRIX"; -break; -case 654:return "EARRAY"; -break; -case 655:return "EALIGNED"; -break; -case 656: yy_.yytext = "\u2205"; return "A"; -break; -case 657: yy_.yytext = "\u2205"; return "A"; -break; -case 658: yy_.yytext = "\u21AA"; return "OPS"; -break; -case 659: yy_.yytext = "\u2113"; return "A"; -break; -case 660: yy_.yytext = "\u2195"; return "OPS"; -break; -case 661: yy_.yytext = "\u29DF"; return "OP"; -break; -case 662: yy_.yytext = "\u2910"; return "OPS"; -break; -case 663: yy_.yytext = "\u2195"; return "OPS"; -break; -case 664: yy_.yytext = "\u21C2"; return "OPS"; -break; -case 665: yy_.yytext = "\u21C3"; return "OPS"; -break; -case 666: yy_.yytext = "\u21CA"; return "OPS"; -break; -case 667: yy_.yytext = "\u21D3"; return "OPS"; -break; -case 668: yy_.yytext = "\u2193"; return "OPS"; -break; -case 669: yy_.yytext = "\u222C"; return "OP"; -break; -case 670: yy_.yytext = "\u2A5E"; return "OP"; -break; -case 671: yy_.yytext = "\u2306"; return "OP"; -break; -case 672: yy_.yytext = "\u2026"; return "OP"; -break; -case 673: yy_.yytext = "\u2214"; return "OP"; -break; -case 674: yy_.yytext = "\u2238"; return "OP"; -break; -case 675: yy_.yytext = "\u2251"; return "OP"; -break; -case 676: yy_.yytext = "\u2251"; return "OP"; -break; -case 677: yy_.yytext = "\u2250"; return "OP"; -break; -case 678: yy_.yytext = "\u02D9"; return "ACCENT"; -break; -case 679: yy_.yytext = "\u22C7"; return "OP"; -break; -case 680: yy_.yytext = "\u00F7"; return "OP"; -break; -case 681:return "DISPLAYSTYLE"; -break; -case 682: yy_.yytext = "\u2A08"; return "OPM"; -break; -case 683: yy_.yytext = "\u03DD"; return "A"; -break; -case 684: yy_.yytext = "\u2662"; return "OP"; -break; -case 685: yy_.yytext = "\u22C4"; return "OP"; -break; -case 686: yy_.yytext = "\u22C4"; return "OP"; -break; -case 687: yy_.yytext = yy_.yytext.slice(1); return "FM"; -break; -case 688: yy_.yytext = "\u0394"; return "AIUG"; -break; -case 689: yy_.yytext = "\u03B4"; return "AILG"; -break; -case 690: yy_.yytext = "\u2207"; return "OP"; -break; -case 691: yy_.yytext = "\u00B0"; return "OP"; -break; -case 692: yy_.yytext = "\u290B"; return "OPS"; -break; -case 693: yy_.yytext = "\u2A77"; return "OP"; -break; -case 694: yy_.yytext = "\u22F1"; return "OP"; -break; -case 695: yy_.yytext = "\u0308"; return "ACCENT"; -break; -case 696: yy_.yytext = "\u20DB"; return "OP"; -break; -case 697: yy_.yytext = "\u20DB"; return "ACCENT"; -break; -case 698: yy_.yytext = "\u20DC"; return "OP"; -break; -case 699: yy_.yytext = "\u20DC"; return "ACCENT"; -break; -case 700: yy_.yytext = "\u2021"; return "OP"; -break; -case 701: yy_.yytext = "\u2237"; return "OP"; -break; -case 702: yy_.yytext = "\u290F"; return "OPS"; -break; -case 703: yy_.yytext = "\u2AE4"; return "OP"; -break; -case 704: yy_.yytext = "\u2AE3"; return "OP"; -break; -case 705: yy_.yytext = "\u22A3"; return "OP"; -break; -case 706: yy_.yytext = "\u290F"; return "OPS"; -break; -case 707: yy_.yytext = "\u290E"; return "OPS"; -break; -case 708: yy_.yytext = "\u2193"; return "OPS"; -break; -case 709: yy_.yytext = "\u2138"; return "A"; -break; -case 710: yy_.yytext = "\u2020"; return "OP"; -break; -case 711: yy_.yytext = "\u21B7"; return "OP"; -break; -case 712: yy_.yytext = "\u21B6"; return "OP"; -break; -case 713: yy_.yytext = "\u293B"; return "OP"; -break; -case 714: yy_.yytext = "\u22CF"; return "OP"; -break; -case 715: yy_.yytext = "\u22CE"; return "OP"; -break; -case 716: yy_.yytext = "\u22DF"; return "OP"; -break; -case 717: yy_.yytext = "\u22DE"; return "OP"; -break; -case 718: yy_.yytext = "\u228D"; return "OP"; -break; -case 719: yy_.yytext = "\u22D3"; return "OP"; -break; -case 720: yy_.yytext = "\u222A"; return "OP"; -break; -case 721: yy_.yytext = "\u2210"; return "OPM"; -break; -case 722: yy_.yytext = "\u2210"; return "OPM"; -break; -case 723: yy_.yytext = "\u222E"; return "OP"; -break; -case 724: yy_.yytext = "\u2A07"; return "OPM"; -break; -case 725: yy_.yytext = "\u222E"; return "OP"; -break; -case 726: yy_.yytext = "\u2245"; return "OP"; -break; -case 727: yy_.yytext = "\u2201"; return "OP"; -break; -case 728: this.begin("TEXTARG"); return "COLSPAN"; -break; -case 729: this.pushState("TEXTARG"); return "COLOR"; -break; -case 730: yy_.yytext = "\u2237\u223C"; return "OP"; -break; -case 731: yy_.yytext = "\u2236\u223C"; return "OP"; -break; -case 732: yy_.yytext = "\u2A74"; return "OP"; -break; -case 733: yy_.yytext = "\u2254"; return "OP"; -break; -case 734: yy_.yytext = "\u2237\u2212"; return "OP"; -break; -case 735: yy_.yytext = "\u2254"; return "OP"; -break; -case 736: yy_.yytext = "\u2237\u2248"; return "OP"; -break; -case 737: yy_.yytext = "\u2236\u2248"; return "OP"; -break; -case 738: yy_.yytext = "\u2237"; return "OP"; -break; -case 739: yy_.yytext = "\u003A"; return "OP"; -break; -case 740: this.pushState("TEXTARG"); return "COLLINES"; -break; -case 741: this.pushState("TEXTARG"); return "COLLAYOUT"; -break; -case 742: this.begin("TEXTARG"); return "COLALIGN"; -break; -case 743: yy_.yytext = "\u2663"; return "OP"; -break; -case 744: yy_.yytext = "\u00AF"; return "ACCENT"; -break; -case 745: yy_.yytext = "\u229D"; return "OP"; -break; -case 746: yy_.yytext = "\u229A"; return "OP"; -break; -case 747: yy_.yytext = "\u229B"; return "OP"; -break; -case 748: yy_.yytext = "\u2941"; return "OP"; -break; -case 749: yy_.yytext = "\u2940"; return "OP"; -break; -case 750: yy_.yytext = "\u2257"; return "OP"; -break; -case 751: yy_.yytext = "\u2218"; return "OP"; -break; -case 752:return "TEXCHOOSE"; -break; -case 753: yy_.yytext = "\u03C7"; return "AILG"; -break; -case 754: yy_.yytext = "\u02C7"; return "ACCENTNS"; -break; -case 755:return "CELLOPTS"; -break; -case 756: yy_.yytext = "\u22EF"; return "OP"; -break; -case 757: yy_.yytext = "\u00B7"; return "OP"; -break; -case 758: yy_.yytext = "\u22C5"; return "OP"; -break; -case 759: yy_.yytext = "\u22D2"; return "OP"; -break; -case 760: yy_.yytext = "\u2229"; return "OP"; -break; -case 761: yy_.yytext = "\u2AAE"; return "OP"; -break; -case 762: yy_.yytext = "\u224E"; return "OP"; -break; -case 763: yy_.yytext = "\u224F"; return "OP"; -break; -case 764: yy_.yytext = "\u2022"; return "OP"; -break; -case 765: yy_.yytext = "\u2A32"; return "OP"; -break; -case 766: yy_.yytext = "\u22A0"; return "OP"; -break; -case 767: yy_.yytext = "\u229E"; return "OP"; -break; -case 768: yy_.yytext = "\u229F"; return "OP"; -break; -case 769:return "BOXED"; -break; -case 770: yy_.yytext = "\u22A1"; return "OP"; -break; -case 771: yy_.yytext = "\u29C4"; return "OP"; -break; -case 772: yy_.yytext = "\u29C7"; return "OP"; -break; -case 773: yy_.yytext = "\u29C5"; return "OP"; -break; -case 774: yy_.yytext = "\u29C6"; return "OP"; -break; -case 775: yy_.yytext = "\u25A1"; return "OP"; -break; -case 776: yy_.yytext = "\u22C8"; return "OP"; -break; -case 777: yy_.yytext = "\u22A5"; return "OP"; -break; -case 778: yy_.yytext = "\u22A5"; return "OP"; -break; -case 779:return "MATHBF"; -break; -case 780: yy_.yytext = "\u25B8"; return "OP"; -break; -case 781: yy_.yytext = "\u25C2"; return "OP"; -break; -case 782: yy_.yytext = "\u25BE"; return "OP"; -break; -case 783: yy_.yytext = "\u25B4"; return "OP"; -break; -case 784: yy_.yytext = "\u25A0"; return "OP"; -break; -case 785: yy_.yytext = "\u29EB"; return "OP"; -break; -case 786: yy_.yytext = "\u290D"; return "OPS"; -break; -case 787:return "BINOM"; -break; -case 788: yy_.yytext = "\u22C0"; return "OPM"; -break; -case 789: yy_.yytext = "\u22C1"; return "OPM"; -break; -case 790: yy_.yytext = "\u2A04"; return "OPM"; -break; -case 791: yy_.yytext = "\u25B3"; return "OP"; -break; -case 792: yy_.yytext = "\u25BD"; return "OP"; -break; -case 793: yy_.yytext = "\u2A09"; return "OPM"; -break; -case 794: yy_.yytext = "\u2605"; return "OP"; -break; -case 795: yy_.yytext = "\u2A06"; return "OPM"; -break; -case 796: yy_.yytext = "\u2A05"; return "OPM"; -break; -case 797:return "BBIG"; -break; -case 798:return "BIG"; -break; -case 799: yy_.yytext = "\u2A02"; return "OPM"; -break; -case 800: yy_.yytext = "\u2A01"; return "OPM"; -break; -case 801: yy_.yytext = "\u2A00"; return "OPM"; -break; -case 802:return "BBIGL"; -break; -case 803:return "BIGL"; -break; -case 804: yy_.yytext = "\u2AFC"; return "OPM"; -break; -case 805:return "BBIGG"; -break; -case 806:return "BIGG"; -break; -case 807:return "BBIGGL"; -break; -case 808:return "BIGGL"; -break; -case 809:return "BBIGG"; -break; -case 810:return "BIGG"; -break; -case 811: yy_.yytext = "\u2A03"; return "OPM"; -break; -case 812: yy_.yytext = "\u22C3"; return "OPM"; -break; -case 813: yy_.yytext = "\u25CB"; return "OP"; -break; -case 814: yy_.yytext = "\u22C2"; return "OPM"; -break; -case 815:return "BBIG"; -break; -case 816:return "BIG"; -break; -case 817: this.pushState("TEXTARG"); return "BGCOLOR"; -break; -case 818: yy_.yytext = "\u226C"; return "OP"; -break; -case 819: yy_.yytext = "\u2136"; return "A"; -break; -case 820: yy_.yytext = "\u0392"; return "AIUG"; -break; -case 821: yy_.yytext = "\u03B2"; return "AILG"; -break; -case 822:return "BVVMATRIX"; -break; -case 823:return "BVMATRIX"; -break; -case 824: return "BTOGGLE"; -break; -case 825:return "BALIGNED"; -break; -case 826:return "BSMALLMATRIX"; -break; -case 827:return "BPMATRIX"; -break; -case 828:return "BMATRIX"; -break; -case 829:return "BGATHERED"; -break; -case 830:return "BCASES"; -break; -case 831:return "BBBMATRIX"; -break; -case 832:return "BBMATRIX"; -break; -case 833: this.pushState("TEXTARG"); this.pushState("TEXTOPTARG"); this.pushState("TRYOPTARG"); return "BARRAY"; -break; -case 834:return "BALIGNED"; -break; -case 835: yy_.yytext = "\u2235"; return "OP"; -break; -case 836: yy_.yytext = "\u213F"; return "A"; -break; -case 837: yy_.yytext = "\u2305"; return "OP"; -break; -case 838: yy_.yytext = "\u00AF"; return "ACCENTNS"; -break; -case 839: yy_.yytext = "\u005C"; return "OP"; -break; -case 840: yy_.yytext = "\u22CD"; return "OP"; -break; -case 841: yy_.yytext = "\u223D"; return "OP"; -break; -case 842: yy_.yytext = "\u2035"; return "OPP"; -break; -case 843: yy_.yytext = "\u03F6"; return "OP"; -break; -case 844:return "TEXATOP"; -break; -case 845: yy_.yytext = "\u224D"; return "OP"; -break; -case 846: yy_.yytext = "\u2217"; return "OP"; -break; -case 847:return "ARRAYOPTS"; -break; -case 848:return "ARRAY"; -break; -case 849: yy_.yytext = yy_.yytext.slice(1); return "F"; -break; -case 850: yy_.yytext = "\u224A"; return "OP"; -break; -case 851: yy_.yytext = "\u2248"; return "OP"; -break; -case 852: yy_.yytext = "\u2220"; return "OP"; -break; -case 853: yy_.yytext = "\u2A3F"; return "OP"; -break; -case 854: yy_.yytext = "\u0391"; return "AIUG"; -break; -case 855: yy_.yytext = "\u03B1"; return "AILG"; -break; -case 856: this.pushState("TEXTARG"); return "ALIGN"; -break; -case 857: yy_.yytext = "\u2135"; return "A"; -break; -case 858:return "AIUL"; -break; -case 859:return "AIUG"; -break; -case 860:return "AILL"; -break; -case 861:return "AILG"; -break; -case 862: yy_.yytext = "\u22F0"; return "OP"; -break; -case 863: yy_.yytext = "\u212B"; return "A"; -break; -case 864:return "A"; -break; -case 865: yy_.yytext = "\u0024"; return "A"; -break; -case 866: yy_.yytext = "\u007D"; return "OPFS"; -break; -case 867: yy_.yytext = "\u2016"; return "OPFS"; -break; -case 868: yy_.yytext = "\u007B"; return "OPFS"; -break; -case 869:return "THICKSPACE"; -break; -case 870:return "MEDSPACE"; -break; -case 871:return "THINSPACE"; -break; -case 872: yy_.yytext = "\u0026"; return "A"; -break; -case 873: yy_.yytext = "\u0025"; return "A"; -break; -case 874: yy_.yytext = "\u0023"; return "OP"; -break; -case 875:return "NEGSPACE"; -break; -case 876: yy_.yytext = "\u2212"; return "OP"; -break; -case 877: yy_.yytext = "\u2057"; return "OPP"; -break; -case 878: yy_.yytext = "\u2034"; return "OPP"; -break; -case 879: yy_.yytext = "\u2033"; return "OPP"; -break; -case 880: yy_.yytext = "\u2032"; return "OPP"; -break; -case 881:return "HIGH_SURROGATE"; -break; -case 882:return "LOW_SURROGATE"; -break; -case 883:return "BMP_CHARACTER"; -break; -} -}, -rules: [/^(?:.)/,/^(?:\$\$|\\\[|\$|\\\()/,/^(?:$)/,/^(?:\\[$\\])/,/^(?:[<&>])/,/^(?:[^])/,/^(?:\s*\[)/,/^(?:.)/,/^(?:([^\\\]]|(\\[\\\]]))+)/,/^(?:\])/,/^(?:\s*\{)/,/^(?:([^\\\}]|(\\[\\\}]))+)/,/^(?:\})/,/^(?:\])/,/^(?:\s+)/,/^(?:\$\$|\\\]|\$|\\\))/,/^(?:\{)/,/^(?:\})/,/^(?:\^)/,/^(?:_)/,/^(?:\.)/,/^(?:&)/,/^(?:\\\\)/,/^(?:[0-9]+(?:\.[0-9]+)?|[\u0660-\u0669]+(?:\u066B[\u0660-\u0669]+)?|(?:\uD835[\uDFCE-\uDFD7])+|(?:\uD835[\uDFD8-\uDFE1])+|(?:\uD835[\uDFE2-\uDFEB])+|(?:\uD835[\uDFEC-\uDFF5])+|(?:\uD835[\uDFF6-\uDFFF])+)/,/^(?:[a-zA-Z]+)/,/^(?:\\Zeta)/,/^(?:\\zeta)/,/^(?:\\xrightleftharpoons)/,/^(?:\\xRightarrow)/,/^(?:\\xrightarrow)/,/^(?:\\xmapsto)/,/^(?:\\xleftrightharpoons)/,/^(?:\\xLeftrightarrow)/,/^(?:\\xleftrightarrow)/,/^(?:\\xLeftarrow)/,/^(?:\\xleftarrow)/,/^(?:\\Xi)/,/^(?:\\xi)/,/^(?:\\xhookrightarrow)/,/^(?:\\xhookleftarrow)/,/^(?:\\wr)/,/^(?:\\wp)/,/^(?:\\widevec)/,/^(?:\\widetilde)/,/^(?:\\widehat)/,/^(?:\\widecheck)/,/^(?:\\widebar)/,/^(?:\\wedgeq)/,/^(?:\\Wedge)/,/^(?:\\wedge)/,/^(?:\\Vvert)/,/^(?:\\Vvdash)/,/^(?:\\Vert)/,/^(?:\\vert)/,/^(?:\\veebar)/,/^(?:\\Vee)/,/^(?:\\vee)/,/^(?:\\vec)/,/^(?:\\vdots)/,/^(?:\\VDash)/,/^(?:\\Vdash)/,/^(?:\\vDash)/,/^(?:\\vdash)/,/^(?:\\Vbar)/,/^(?:\\vartriangleright)/,/^(?:\\vartriangleleft)/,/^(?:\\vartriangle)/,/^(?:\\vartheta)/,/^(?:\\varsupsetneqq)/,/^(?:\\varsupsetneq)/,/^(?:\\varsubsetneqq)/,/^(?:\\varsubsetneqq)/,/^(?:\\varsubsetneq)/,/^(?:\\varsigma)/,/^(?:\\varrho)/,/^(?:\\varpropto)/,/^(?:\\varpi)/,/^(?:\\varphi)/,/^(?:\\varnothing)/,/^(?:\\varkappa)/,/^(?:\\varepsilon)/,/^(?:\\Uuparrow)/,/^(?:\\upuparrows)/,/^(?:\\Upsilon)/,/^(?:\\upsilon)/,/^(?:\\Upsi)/,/^(?:\\uplus)/,/^(?:\\upint)/,/^(?:\\upharpoonright)/,/^(?:\\upharpoonleft)/,/^(?:\\Updownarrow)/,/^(?:\\updownarrow)/,/^(?:\\updarr)/,/^(?:\\Uparrow)/,/^(?:\\uparrow)/,/^(?:\\uparr)/,/^(?:\\unrhd)/,/^(?:\\unlhd)/,/^(?:\\Union)/,/^(?:\\union)/,/^(?:\\underset)/,/^(?:\\underoverset)/,/^(?:\\underline)/,/^(?:\\underbrace)/,/^(?:\\udots)/,/^(?:\u2ADD\u0338)/,/^(?:\u2ACC\uFE00)/,/^(?:\u2ACB\uFE00)/,/^(?:\u2AB0\u0338)/,/^(?:\u2AAF\u0338)/,/^(?:\u2AA2\u0338)/,/^(?:\u2AA1\u0338)/,/^(?:\u2A7E\u0338)/,/^(?:\u2A7D\u0338)/,/^(?:\u29D0\u0338)/,/^(?:\u29CF\u0338)/,/^(?:\u2290\u0338)/,/^(?:\u228F\u0338)/,/^(?:\u228B\uFE00)/,/^(?:\u228A\uFE00)/,/^(?:\u2283\u20D2)/,/^(?:\u2282\u20D2)/,/^(?:\u227F\u0338)/,/^(?:\u226B\u0338)/,/^(?:\u226A\u0338)/,/^(?:\u2269\uFE00)/,/^(?:\u2268\uFE00)/,/^(?:\u2266\u0338)/,/^(?:\u224F\u0338)/,/^(?:\u224E\u0338)/,/^(?:\u2242\u0338)/,/^(?:\u223D\u0331)/,/^(?:\u2237\u2248)/,/^(?:\u2237\u223C)/,/^(?:\u2237\u2212)/,/^(?:\u2236\u2248)/,/^(?:\u2236\u223C)/,/^(?:\u2212\u2237)/,/^(?:\u007C\u007C\u007C)/,/^(?:\u007C\u007C)/,/^(?:\u003E\u003D)/,/^(?:\u003D\u2237)/,/^(?:\u003D\u2237)/,/^(?:\u003D\u003D)/,/^(?:\u003C\u003E)/,/^(?:\u003C\u003D)/,/^(?:\u003A\u003D)/,/^(?:\u002F\u003D)/,/^(?:\u002F\u002F)/,/^(?:\u002E\u002E\u002E)/,/^(?:\u002E\u002E)/,/^(?:\u002D\u003E)/,/^(?:\u002D\u003D)/,/^(?:\u002D\u002D)/,/^(?:\u002B\u003D)/,/^(?:\u002B\u002B)/,/^(?:\u002A\u003D)/,/^(?:\u002A\u002A)/,/^(?:\u0026\u0026)/,/^(?:\u0021\u003D)/,/^(?:\u0021\u0021)/,/^(?:\\twoheadrightarrowtail)/,/^(?:\\twoheadrightarrow)/,/^(?:\\twoheadleftarrow)/,/^(?:\\tripleintegral)/,/^(?:\\trianglerighteq)/,/^(?:\\triangleright)/,/^(?:\\triangleq)/,/^(?:\\trianglelefteq)/,/^(?:\\triangleleft)/,/^(?:\\triangledown)/,/^(?:\\triangle)/,/^(?:\\towa)/,/^(?:\\tosa)/,/^(?:\\top)/,/^(?:\\tooltip)/,/^(?:\\tona)/,/^(?:\\toggle)/,/^(?:\\toea)/,/^(?:\\to)/,/^(?:\\timesb)/,/^(?:\\times)/,/^(?:\\tilde)/,/^(?:\\thinspace)/,/^(?:\\thickspace)/,/^(?:\\thicksim)/,/^(?:\\thickapprox)/,/^(?:\\Theta)/,/^(?:\\theta)/,/^(?:\\therefore)/,/^(?:\\tfrac)/,/^(?:\\textstyle)/,/^(?:\\textsize)/,/^(?:\\textquotedblright)/,/^(?:\\textquotedblleft)/,/^(?:\\textasciitilde)/,/^(?:\\textasciigrave)/,/^(?:\\textasciicircumflex)/,/^(?:\\textasciiacute)/,/^(?:\\text)/,/^(?:\\tensor)/,/^(?:\\tbinom)/,/^(?:\\Tau)/,/^(?:\\tau)/,/^(?:\\swArrow)/,/^(?:\\swarrow)/,/^(?:\\swArr)/,/^(?:\\swarr)/,/^(?:\\surd)/,/^(?:\\supsetneqq)/,/^(?:\\supsetneq)/,/^(?:\\supseteqq)/,/^(?:\\supseteq)/,/^(?:\\Supset)/,/^(?:\\supset)/,/^(?:\\sum)/,/^(?:\\succsim)/,/^(?:\\succnsim)/,/^(?:\\succneqq)/,/^(?:\\succnapprox)/,/^(?:\\succeq)/,/^(?:\\succcurlyeq)/,/^(?:\\succapprox)/,/^(?:\\succ)/,/^(?:\\substack)/,/^(?:\\subsetneqq)/,/^(?:\\subsetneq)/,/^(?:\\subseteqq)/,/^(?:\\subseteq)/,/^(?:\\Subset)/,/^(?:\\subset)/,/^(?:\\statusline)/,/^(?:\\star)/,/^(?:\\stackrel)/,/^(?:\\sslash)/,/^(?:\\square)/,/^(?:\\sqsupseteq)/,/^(?:\\sqsupset)/,/^(?:\\sqsubseteq)/,/^(?:\\sqsubset)/,/^(?:\\sqrt)/,/^(?:\\sqcup)/,/^(?:\\sqcap)/,/^(?:\\sphericalangle)/,/^(?:\\spadesuit)/,/^(?:\\space)/,/^(?:\\smile)/,/^(?:\\smallsmile)/,/^(?:\\smallsetminus)/,/^(?:\\smallfrown)/,/^(?:\\slash)/,/^(?:\\simeq)/,/^(?:\\sim)/,/^(?:\\Sigma)/,/^(?:\\sigma)/,/^(?:\\shuffle)/,/^(?:\\shortparallel)/,/^(?:\\shortmid)/,/^(?:\\sharp)/,/^(?:\\setminus)/,/^(?:\\seovnearrow)/,/^(?:\\seArrow)/,/^(?:\\searrow)/,/^(?:\\seArr)/,/^(?:\\searr)/,/^(?:\\scriptsize)/,/^(?:\\scriptscriptsize)/,/^(?:\\rtimes)/,/^(?:\\Rsh)/,/^(?:\\Rrightarrow)/,/^(?:\\rrangle)/,/^(?:\\rq)/,/^(?:\\rowspan)/,/^(?:\\rowopts)/,/^(?:\\rowlines)/,/^(?:\\rowalign)/,/^(?:\\root)/,/^(?:\\rmoustache)/,/^(?:\\risingdotseq)/,/^(?:\\righttoleftarrow)/,/^(?:\\rightthreetimes)/,/^(?:\\rightsquigarrow)/,/^(?:\\rightrightarrows)/,/^(?:\\rightleftharpoons)/,/^(?:\\rightleftarrows)/,/^(?:\\rightharpoonup)/,/^(?:\\rightharpoondown)/,/^(?:\\rightarrowtriangle)/,/^(?:\\rightarrowtail)/,/^(?:\\Rightarrow)/,/^(?:\\rightarrow)/,/^(?:\\right)/,/^(?:\\Rho)/,/^(?:\\rho)/,/^(?:\\rhd)/,/^(?:\\rfloor)/,/^(?:\\Re)/,/^(?:\\rdiagovsearrow)/,/^(?:\\rdiagovfdiag)/,/^(?:\\rceil)/,/^(?:\\rbrack)/,/^(?:\\rbrace)/,/^(?:\\rangle)/,/^(?:\\rang)/,/^(?:\\questeq)/,/^(?:\\quadrupleintegral)/,/^(?:\\quad)/,/^(?:\\qquad)/,/^(?:\\qed)/,/^(?:\\Psi)/,/^(?:\\psi)/,/^(?:\\propto)/,/^(?:\\product)/,/^(?:\\prod)/,/^(?:\\prime)/,/^(?:\\precsim)/,/^(?:\\precnsim)/,/^(?:\\precneqq)/,/^(?:\\precnapprox)/,/^(?:\\preceq)/,/^(?:\\preccurlyeq)/,/^(?:\\precapprox)/,/^(?:\\prec)/,/^(?:\\pmod)/,/^(?:\\pm)/,/^(?:\\plusdot)/,/^(?:\\plusb)/,/^(?:\\pitchfork)/,/^(?:\\Pi)/,/^(?:\\pi)/,/^(?:\\Phi)/,/^(?:\\phi)/,/^(?:\\phantom)/,/^(?:\\Perp)/,/^(?:\\perp)/,/^(?:\\partialmeetcontraction)/,/^(?:\\partial)/,/^(?:\\parr)/,/^(?:\\parallel)/,/^(?:\\padding)/,/^(?:\\overset)/,/^(?:\\overline)/,/^(?:\\overbrace)/,/^(?:\\over)/,/^(?:\\Otimes)/,/^(?:\\otimes)/,/^(?:\\oslash)/,/^(?:[\u007E\u00AF\u02C6\u02C7\u02C9\u02CD\u02DC\u02F7\u0302\u203E\u2044\u2190-\u2199\u219C-\u21AD\u21AF-\u21B5\u21B9\u21BC-\u21CC\u21D0-\u21DD\u21E0-\u21F0\u21F3\u21F5\u21F6\u21FD-\u21FF\u2215\u221A\u23B4\u23B5\u23DC-\u23E1\u27F0\u27F1\u27F5-\u27FF\u290A-\u2910\u2912\u2913\u2921\u2922\u294E-\u2961\u296E\u296F\u2B45\u2B46])/,/^(?:[\u2032-\u2035\u2057])/,/^(?:[\u220F-\u2211\u22C0-\u22C3\u2A00-\u2A0A\u2A10-\u2A14\u2AFC\u2AFF])/,/^(?:\\Oplus)/,/^(?:\\oplus)/,/^(?:[\u0028\u0029\u005B\u005D\u007C\u2016\u2308-\u230B\u2329\u232A\u2772\u2773\u27E6-\u27EF\u2980\u2983-\u2998\u29FC\u29FD])/,/^(?:[\u2018\u2019\u201C\u201D])/,/^(?:\\operatorname)/,/^(?:[\u0021-\u0023\u002A-\u002C\u002F\u003A-\u0040\u0060\u00A8\u00AA\u00AC\u00B0-\u00B4\u00B7-\u00BA\u00D7\u00F7\u02CA\u02CB\u02D8-\u02DA\u02DD\u0311\u03F6\u201A\u201B\u201E-\u2022\u2026\u2036\u2037\u2043\u2061-\u2064\u20DB\u20DC\u2145\u2146\u214B\u219A\u219B\u21AE\u21B6-\u21B8\u21BA\u21BB\u21CD-\u21CF\u21DE\u21DF\u21F1\u21F2\u21F4\u21F7-\u21FC\u2200-\u2204\u2206-\u220E\u2212-\u2214\u2216-\u2219\u221B-\u221D\u221F-\u22BF\u22C4-\u22FF\u2305\u2306\u2322\u2323\u23B0\u23B1\u25A0\u25A1\u25AA\u25AB\u25AD-\u25B9\u25BC-\u25CF\u25D6\u25D7\u25E6\u2605\u2660-\u2663\u266D-\u266F\u2758\u27F2\u27F3\u2900-\u2909\u2911\u2914-\u2920\u2923-\u294D\u2962-\u296D\u2970-\u297F\u2981\u2982\u2999-\u29D9\u29DB-\u29FB\u29FE\u29FF\u2A0B-\u2A0F\u2A15-\u2ADB\u2ADD-\u2AFB\u2AFD\u2AFE])/,/^(?:\\ominus)/,/^(?:\\omicron)/,/^(?:\\Omega)/,/^(?:\\omega)/,/^(?:\\oint)/,/^(?:\\oiint)/,/^(?:\\oiiint)/,/^(?:\\odot)/,/^(?:\\odash)/,/^(?:\\obslash)/,/^(?:\\nwovnearrow)/,/^(?:\\nwArrow)/,/^(?:\\nwarrow)/,/^(?:\\nwArr)/,/^(?:\\nwarr)/,/^(?:\\nVDash)/,/^(?:\\nVdash)/,/^(?:\\nvDash)/,/^(?:\\nvdash)/,/^(?:\u221E)/,/^(?:\\Nu)/,/^(?:\\nu)/,/^(?:\\ntrianglerighteq)/,/^(?:\\ntriangleright)/,/^(?:\\ntrianglelefteq)/,/^(?:\\ntriangleleft)/,/^(?:\\nsupseteq)/,/^(?:\\nsupset)/,/^(?:\\nsuccsim)/,/^(?:\\nsucceq)/,/^(?:\\nsucc)/,/^(?:\\nsubseteqq)/,/^(?:\\nsubseteq)/,/^(?:\\nsubset)/,/^(?:\\nsime)/,/^(?:\\nsim)/,/^(?:\\nshortparallel)/,/^(?:\\nshortmid)/,/^(?:\\nRightarrow)/,/^(?:\\nrightarrow)/,/^(?:\\npreceq)/,/^(?:\\nprec)/,/^(?:\\nparallel)/,/^(?:\\notni)/,/^(?:\\notin)/,/^(?:\\not)/,/^(?:\\nmid)/,/^(?:\\nless)/,/^(?:\\nleqslant)/,/^(?:\\nleqq)/,/^(?:\\nleq)/,/^(?:\\nLeftrightarrow)/,/^(?:\\nleftrightarrow)/,/^(?:\\nLeftarrow)/,/^(?:\\nleftarrow)/,/^(?:\\ni)/,/^(?:\\ngtr)/,/^(?:\\ngeqslant)/,/^(?:\\ngeqq)/,/^(?:\\ngeq)/,/^(?:\\nexists)/,/^(?:\\nequiv)/,/^(?:\\neqsim)/,/^(?:\\neq)/,/^(?:\\neovsearrow)/,/^(?:\\neovnwarrow)/,/^(?:\\negthickspace)/,/^(?:\\negspace)/,/^(?:\\negmedspace)/,/^(?:\\neg)/,/^(?:\\neArrow)/,/^(?:\\nearrow)/,/^(?:\\neArr)/,/^(?:\\nearr)/,/^(?:\\ne)/,/^(?:\\ncong)/,/^(?:\\nBumpeq)/,/^(?:\\nbumpeq)/,/^(?:\\natural)/,/^(?:\\napprox)/,/^(?:\\nabla)/,/^(?:\\multiscripts)/,/^(?:\\multimap)/,/^(?:\\Mu)/,/^(?:\\mu)/,/^(?:\\mtext)/,/^(?:\\ms)/,/^(?:\\mp)/,/^(?:\\models)/,/^(?:\\mod)/,/^(?:\\mo)/,/^(?:\\mn)/,/^(?:\\mlcp)/,/^(?:\\minusdot)/,/^(?:\\minusb)/,/^(?:\\minus)/,/^(?:\\min)/,/^(?:\\mid)/,/^(?:\\mi)/,/^(?:\\mho)/,/^(?:\\mho)/,/^(?:\\medspace)/,/^(?:\\measuredangle)/,/^(?:\\mathtt)/,/^(?:\\mathsf)/,/^(?:\\mathscr)/,/^(?:\\mathrm)/,/^(?:\\mathrlap)/,/^(?:\\mathrel)/,/^(?:\\mathraisebox)/,/^(?:\\mathop)/,/^(?:\\mathmit)/,/^(?:\\mathllap)/,/^(?:\\mathit)/,/^(?:\\mathfrak)/,/^(?:\\mathfr)/,/^(?:\\mathclap)/,/^(?:\\mathcal)/,/^(?:\\mathbscr)/,/^(?:\\mathbit)/,/^(?:\\mathbin)/,/^(?:\\mathbf)/,/^(?:\\mathbcal)/,/^(?:\\mathbb)/,/^(?:\\Mapsto)/,/^(?:\\mapsto)/,/^(?:\\Mapsfrom)/,/^(?:\\map)/,/^(?:\\lvertneqq)/,/^(?:\\lvertneqq)/,/^(?:\\ltimes)/,/^(?:\\lt)/,/^(?:\\Lsh)/,/^(?:\\lq)/,/^(?:\\lozenge)/,/^(?:\\lowint)/,/^(?:\\looparrowright)/,/^(?:\\looparrowleft)/,/^(?:\\Longrightarrow)/,/^(?:\\longrightarrow)/,/^(?:\\longmapsto)/,/^(?:\\Longleftrightarrow)/,/^(?:\\longleftrightarrow)/,/^(?:\\Longleftarrow)/,/^(?:\\longleftarrow)/,/^(?:\\lnsim)/,/^(?:\\lneqq)/,/^(?:\\lneq)/,/^(?:\\lnapprox)/,/^(?:\\lmoustache)/,/^(?:\\lll)/,/^(?:\\Lleftarrow)/,/^(?:\\llangle)/,/^(?:\\ll)/,/^(?:\\lhd)/,/^(?:\\lfloor)/,/^(?:\\lesssim)/,/^(?:\\lessgtr)/,/^(?:\\lesseqqgtr)/,/^(?:\\lesseqgtr)/,/^(?:\\lessdot)/,/^(?:\\lessapprox)/,/^(?:\\less)/,/^(?:\\leqslant)/,/^(?:\\leqq)/,/^(?:\\leq)/,/^(?:\\lefttorightarrow)/,/^(?:\\leftthreetimes)/,/^(?:\\leftsquigarrow)/,/^(?:\\leftrightsquigarrow)/,/^(?:\\leftrightharpoons)/,/^(?:\\leftrightarrowtria\*)/,/^(?:\\leftrightarrows)/,/^(?:\\Leftrightarrow)/,/^(?:\\leftrightarrow)/,/^(?:\\leftleftarrows)/,/^(?:\\leftharpoonup)/,/^(?:\\leftharpoondown)/,/^(?:\\leftarrowtriangle)/,/^(?:\\leftarrowtail)/,/^(?:\\Leftarrow)/,/^(?:\\leftarrow)/,/^(?:\\left)/,/^(?:\\le)/,/^(?:\\ldots)/,/^(?:\\lceil)/,/^(?:\\lbrack)/,/^(?:\\lbrace)/,/^(?:\\langle)/,/^(?:\\lang)/,/^(?:\\Lambda)/,/^(?:\\lambda)/,/^(?:\\kernelcontraction)/,/^(?:\\Kappa)/,/^(?:\\kappa)/,/^(?:\\jmath)/,/^(?:\\itexnum)/,/^(?:\\Iota)/,/^(?:\\iota)/,/^(?:\\invamp)/,/^(?:\\intx)/,/^(?:\\intprodr)/,/^(?:\\intprod)/,/^(?:\\Intersection)/,/^(?:\\intersection)/,/^(?:\\interleave)/,/^(?:\\intercal)/,/^(?:\\integral)/,/^(?:\\intcup)/,/^(?:\\intcap)/,/^(?:\\intBar)/,/^(?:\\intbar)/,/^(?:\\int)/,/^(?:\\infty)/,/^(?:\\infinity)/,/^(?:\\inf)/,/^(?:\\in)/,/^(?:\\implies)/,/^(?:\\impliedby)/,/^(?:\\imath)/,/^(?:\\Im)/,/^(?:\\iint)/,/^(?:\\iiint)/,/^(?:\\iiiint)/,/^(?:\\iff)/,/^(?:\\hslash)/,/^(?:\\href)/,/^(?:\\hookrightarrow)/,/^(?:\\hookleftarrow)/,/^(?:\\hkswarow)/,/^(?:\\hksearow)/,/^(?:\\heartsuit)/,/^(?:\\hbar)/,/^(?:\\hat)/,/^(?:\\gvertneqq)/,/^(?:\\gvertneqq)/,/^(?:\\gtrsim)/,/^(?:\\gtrless)/,/^(?:\\gtreqqless)/,/^(?:\\gtreqless)/,/^(?:\\gtrdot)/,/^(?:\\gtrapprox)/,/^(?:\\gt)/,/^(?:\\greater)/,/^(?:\\gnsim)/,/^(?:\\gneqq)/,/^(?:\\gneq)/,/^(?:\\gnapprox)/,/^(?:\\gimel)/,/^(?:\\ggg)/,/^(?:\\gg)/,/^(?:\\geqslant)/,/^(?:\\geqq)/,/^(?:\\geq)/,/^(?:\\ge)/,/^(?:\\Gamma)/,/^(?:\\gamma)/,/^(?:\\frown)/,/^(?:\\frame)/,/^(?:\\frac)/,/^(?:\\forksnot)/,/^(?:\\forks)/,/^(?:\\forall)/,/^(?:\\flat)/,/^(?:\\fdiagovrdiag)/,/^(?:\\fdiagovnearrow)/,/^(?:\\fallingdotseq)/,/^(?:\\exists)/,/^(?:\\eth)/,/^(?:\\eth)/,/^(?:\\Eta)/,/^(?:\\eta)/,/^(?:\\equiv)/,/^(?:\\equalrows)/,/^(?:\\equalcols)/,/^(?:\\eqslantless)/,/^(?:\\eqslantgtr)/,/^(?:\\eqsim)/,/^(?:\\Eqqcolon)/,/^(?:\\eqqcolon)/,/^(?:\\Eqcolon)/,/^(?:\\Eqcolon)/,/^(?:\\Eqcolon)/,/^(?:\\Eqcolon)/,/^(?:\\eqcolon)/,/^(?:\\eqcirc)/,/^(?:\\epsilon)/,/^(?:\\end\{Vmatrix\})/,/^(?:\\end\{vmatrix\})/,/^(?:\\endtoggle)/,/^(?:\\end\{split\})/,/^(?:\\end\{smallmatrix\})/,/^(?:\\end\{pmatrix\})/,/^(?:\\end\{matrix\})/,/^(?:\\end\{gathered\})/,/^(?:\\end\{cases\})/,/^(?:\\end\{Bmatrix\})/,/^(?:\\end\{bmatrix\})/,/^(?:\\end\{array\})/,/^(?:\\end\{aligned\})/,/^(?:\\emptyset)/,/^(?:\\empty)/,/^(?:\\embedsin)/,/^(?:\\ell)/,/^(?:\\duparr)/,/^(?:\\dualmap)/,/^(?:\\drbkarrow)/,/^(?:\\downuparrow)/,/^(?:\\downharpoonright)/,/^(?:\\downharpoonleft)/,/^(?:\\downdownarrows)/,/^(?:\\Downarrow)/,/^(?:\\downarrow)/,/^(?:\\doubleintegral)/,/^(?:\\doublebarwedge)/,/^(?:\\doublebarwedge)/,/^(?:\\dots)/,/^(?:\\dotplus)/,/^(?:\\dotminus)/,/^(?:\\doteqdot)/,/^(?:\\Doteq)/,/^(?:\\doteq)/,/^(?:\\dot)/,/^(?:\\divideontimes)/,/^(?:\\div)/,/^(?:\\displaystyle)/,/^(?:\\disjquant)/,/^(?:\\digamma)/,/^(?:\\diamondsuit)/,/^(?:\\Diamond)/,/^(?:\\diamond)/,/^(?:\\det|\\gcd|\\liminf|\\limsup|\\lim|\\max|\\Pr|\\sup)/,/^(?:\\Delta)/,/^(?:\\delta)/,/^(?:\\Del)/,/^(?:\\degree)/,/^(?:\\Ddownarrow)/,/^(?:\\ddotseq)/,/^(?:\\ddots)/,/^(?:\\ddot)/,/^(?:\\dddot)/,/^(?:\\dddot)/,/^(?:\\ddddot)/,/^(?:\\ddddot)/,/^(?:\\ddagger)/,/^(?:\\dblcolon)/,/^(?:\\dbkarow)/,/^(?:\\Dashv)/,/^(?:\\dashV)/,/^(?:\\dashv)/,/^(?:\\dashrightarrow)/,/^(?:\\dashleftarrow)/,/^(?:\\darr)/,/^(?:\\daleth)/,/^(?:\\dagger)/,/^(?:\\curvearrowright)/,/^(?:\\curvearrowleft)/,/^(?:\\curvearrowbotright)/,/^(?:\\curlywedge)/,/^(?:\\curlyvee)/,/^(?:\\curlyeqsucc)/,/^(?:\\curlyeqprec)/,/^(?:\\cupdot)/,/^(?:\\Cup)/,/^(?:\\cup)/,/^(?:\\coproduct)/,/^(?:\\coprod)/,/^(?:\\contourintegral)/,/^(?:\\conjquant)/,/^(?:\\conint)/,/^(?:\\cong)/,/^(?:\\complement)/,/^(?:\\colspan)/,/^(?:\\color)/,/^(?:\\Colonsim)/,/^(?:\\colonsim)/,/^(?:\\Coloneqq)/,/^(?:\\coloneqq)/,/^(?:\\Coloneq)/,/^(?:\\coloneq)/,/^(?:\\Colonapprox)/,/^(?:\\colonapprox)/,/^(?:\\Colon)/,/^(?:\\colon)/,/^(?:\\collines)/,/^(?:\\collayout)/,/^(?:\\colalign)/,/^(?:\\clubsuit)/,/^(?:\\closure)/,/^(?:\\circleddash)/,/^(?:\\circledcirc)/,/^(?:\\circledast)/,/^(?:\\circlearrowright)/,/^(?:\\circlearrowleft)/,/^(?:\\circeq)/,/^(?:\\circ)/,/^(?:\\choose)/,/^(?:\\chi)/,/^(?:\\check)/,/^(?:\\cellopts)/,/^(?:\\cdots)/,/^(?:\\cdotp)/,/^(?:\\cdot)/,/^(?:\\Cap)/,/^(?:\\cap)/,/^(?:\\bumpeqq)/,/^(?:\\Bumpeq)/,/^(?:\\bumpeq)/,/^(?:\\bullet)/,/^(?:\\btimes)/,/^(?:\\boxtimes)/,/^(?:\\boxplus)/,/^(?:\\boxminus)/,/^(?:\\boxed)/,/^(?:\\boxdot)/,/^(?:\\boxdiag)/,/^(?:\\boxcircle)/,/^(?:\\boxbslash)/,/^(?:\\boxast)/,/^(?:\\Box)/,/^(?:\\bowtie)/,/^(?:\\bottom)/,/^(?:\\bot)/,/^(?:\\boldsymbol)/,/^(?:\\blacktriangleright)/,/^(?:\\blacktriangleleft)/,/^(?:\\blacktriangledown)/,/^(?:\\blacktriangle)/,/^(?:\\blacksquare)/,/^(?:\\blacklozenge)/,/^(?:\\bkarow)/,/^(?:\\binom)/,/^(?:\\bigwedge)/,/^(?:\\bigvee)/,/^(?:\\biguplus)/,/^(?:\\bigtriangleup)/,/^(?:\\bigtriangledown)/,/^(?:\\bigtimes)/,/^(?:\\bigstar)/,/^(?:\\bigsqcup)/,/^(?:\\bigsqcap)/,/^(?:\\Bigr)/,/^(?:\\bigr)/,/^(?:\\bigotimes)/,/^(?:\\bigoplus)/,/^(?:\\bigodot)/,/^(?:\\Bigl)/,/^(?:\\bigl)/,/^(?:\\biginterleave)/,/^(?:\\Biggr)/,/^(?:\\biggr)/,/^(?:\\Biggl)/,/^(?:\\biggl)/,/^(?:\\Bigg)/,/^(?:\\bigg)/,/^(?:\\bigcupdot)/,/^(?:\\bigcup)/,/^(?:\\bigcirc)/,/^(?:\\bigcap)/,/^(?:\\Big)/,/^(?:\\big)/,/^(?:\\bgcolor)/,/^(?:\\between)/,/^(?:\\beth)/,/^(?:\\Beta)/,/^(?:\\beta)/,/^(?:\\begin\{Vmatrix\})/,/^(?:\\begin\{vmatrix\})/,/^(?:\\begintoggle)/,/^(?:\\begin\{split\})/,/^(?:\\begin\{smallmatrix\})/,/^(?:\\begin\{pmatrix\})/,/^(?:\\begin\{matrix\})/,/^(?:\\begin\{gathered\})/,/^(?:\\begin\{cases\})/,/^(?:\\begin\{Bmatrix\})/,/^(?:\\begin\{bmatrix\})/,/^(?:\\begin\{array\})/,/^(?:\\begin\{aligned\})/,/^(?:\\because)/,/^(?:\\BbbPi)/,/^(?:\\barwedge)/,/^(?:\\bar)/,/^(?:\\backslash)/,/^(?:\\backsimeq)/,/^(?:\\backsim)/,/^(?:\\backprime)/,/^(?:\\backepsilon)/,/^(?:\\atop)/,/^(?:\\asymp)/,/^(?:\\ast)/,/^(?:\\arrayopts)/,/^(?:\\array)/,/^(?:\\arccos|\\arcsin|\\arctan|\\arg|\\cosh|\\cos|\\coth|\\cot|\\csc|\\deg|\\dim|\\exp|\\hom|\\ker|\\lg|\\ln|\\log|\\sec|\\sinh|\\sin|\\tanh|\\tan)/,/^(?:\\approxeq)/,/^(?:\\approx)/,/^(?:\\angle)/,/^(?:\\amalg)/,/^(?:\\Alpha)/,/^(?:\\alpha)/,/^(?:\\align)/,/^(?:\\aleph)/,/^(?:[\u0041-\u005A])/,/^(?:[\u0391-\u03A1\u03A3\u03A4\u03A6-\u03A9])/,/^(?:[\u0061-\u007A\u0131\u0237])/,/^(?:[\u03B1-\u03C1\u03C3-\u03C9\u03D1\u03D5\u03D6\u03F0\u03F1\u03F4\u03F5])/,/^(?:\\adots)/,/^(?:\\AA)/,/^(?:[\u00F0\u03C2\u03D0\u03D2\u03DA-\u03DD\u03E0\u03E1\u0428\u0608\u0627-\u063A\u2102\u210A-\u210D\u210F-\u2113\u2115\u2118-\u211D\u2124\u2127\u2128\u212B-\u212D\u212F-\u2131\u2133-\u2138\u213C\u213D\u213F\u2205]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB\uDEF0\uDEF1]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDFCB])/,/^(?:\\\$)/,/^(?:\\\})/,/^(?:\\\|)/,/^(?:\\\{)/,/^(?:\\;)/,/^(?:\\:)/,/^(?:\\,)/,/^(?:\\&)/,/^(?:\\%)/,/^(?:\\#)/,/^(?:\\!)/,/^(?:-)/,/^(?:'''')/,/^(?:''')/,/^(?:'')/,/^(?:')/,/^(?:[\uD800-\uDBFF])/,/^(?:[\uDC00-\uDFFF])/,/^(?:.)/], -conditions: {"MATH0":{"rules":[14,15,16,17,18,19,20,21,22,23,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883],"inclusive":true},"MATH1":{"rules":[14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883],"inclusive":true},"OPTARG":{"rules":[13,14,15,16,17,18,19,20,21,22,23,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883],"inclusive":true},"DOCUMENT":{"rules":[1,2,3,4,5],"inclusive":false},"TRYOPTARG":{"rules":[6,7],"inclusive":false},"TEXTOPTARG":{"rules":[8,9],"inclusive":false},"TEXTARG":{"rules":[10,11,12],"inclusive":false},"INITIAL":{"rules":[0,14,15,16,17,18,19,20,21,22,23,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883],"inclusive":true}} -}); -return lexer; -})(); -parser.lexer = lexer; -function Parser () { - this.yy = {}; -} -Parser.prototype = parser;parser.Parser = Parser; -return new Parser; -})(); -//////////////////////////////////////////////////////////////////////////////// -// Export the public API to commonJS programs. -//////////////////////////////////////////////////////////////////////////////// -if (typeof require !== "undefined" && typeof exports !== "undefined") { - exports.setDOMParser = function (aDOMParser) { - TeXZilla.setDOMParser(aDOMParser); - }; - exports.setXMLSerializer = function (aXMLSerializer) { - TeXZilla.setXMLSerializer(aXMLSerializer); - }; - exports.setSafeMode = function (aEnable) { - TeXZilla.setSafeMode(aEnable); - }; - exports.setItexIdentifierMode = function (aEnable) { - TeXZilla.setItexIdentifierMode(aEnable); - }; - exports.getTeXSource = function () { - return TeXZilla.getTeXSource.apply(TeXZilla, arguments); - }; - exports.toMathMLString = function () { - return TeXZilla.toMathMLString.apply(TeXZilla, arguments); - }; - exports.toMathML = function () { - return TeXZilla.toMathML.apply(TeXZilla, arguments); - }; - exports.toImage = function () { - return TeXZilla.toImage.apply(TeXZilla, arguments); - }; - exports.filterString = function () { - return TeXZilla.filterString.apply(TeXZilla, arguments); - }; - exports.filterElement = function () { - return TeXZilla.filterElement.apply(TeXZilla, arguments); - }; -} - -//////////////////////////////////////////////////////////////////////////////// -// Export the command-line API to commonJS programs. -//////////////////////////////////////////////////////////////////////////////// -if (typeof require !== "undefined") { - - // FIXME: This tries to work with slimerjs, phantomjs and nodejs. Ideally, - // we should have a standard commonJS interface. - // https://github.com/fred-wang/TeXZilla/issues/6 - - var exitCommonJS = function (aStatus) { - if (typeof process !== "undefined") { - process.exit(aStatus); - } else if (typeof slimer !== "undefined") { - slimer.exit(aStatus); - } else if (typeof phantom !== "undefined") { - phantom.exit(aStatus); - } - }; - - var usage = function () { - // Display the usage information. - console.log("\nUsage:\n"); - console.log("commonjs TeXZilla.js [help]"); - console.log(" Print this help message.\n"); - console.log("commonjs TeXZilla.js parser aTeX [aDisplay] [aRTL] [aThrowExceptionOnError]"); - console.log(" Print TeXZilla.toMathMLString(aTeX, aDisplay, aRTL, aThrowExceptionOnError)"); - console.log(" The interpretation of arguments and the default values are the same.\n"); - console.log("commonjs TeXZilla.js webserver [port] [safe] [itexId]"); - console.log(" Start a Web server on the specified port (default:3141)"); - console.log(" See the TeXZilla wiki for details.\n"); - console.log("cat input | commonjs TeXZilla.js streamfilter [safe] [itexId] > output"); - console.log(" Make TeXZilla behaves as a stream filter. The TeX fragments are"); - console.log(" converted into MathML."); - console.log(" See the TeXZilla wiki for details.\n"); - console.log(" where commonjs is slimerjs, nodejs or phantomjs."); - }; - - var setParamValue = function (aParam, aKey, aString) { - // Set the param value from the string value. - if (aKey === "tex") { - aParam[aKey] = aString; - } else if (aKey === "display" || aKey === "rtl" || aKey === "exception" || - aKey === "safe" || aKey === "itexId") { - aParam[aKey] = (aString === "true"); - } - }; - - var getMathMLString = function (aParam) { - // Call the TeXZilla parser with the specified parameters and - // return the MathML output. - return TeXZilla.toMathMLString(aParam.tex, aParam.display, - aParam.rtl, aParam.exception); - }; - - var getParametersFromURL = function (aURL) { - // Get the param values from the GET URL. - var param, query, vars, i, pair, key, value; - param = {}; - query = aURL.split("?")[1]; - if (query) { - vars = query.split("&"); - for (i = 0; i < vars.length; i++) { - pair = vars[i].split("="); - key = decodeURIComponent(pair[0]).toLowerCase(); - value = decodeURIComponent(pair[1]); - setParamValue(param, key, value); - } - } - return param; - }; - - var getParametersFromPOSTData = function (aPOSTData) { - // Get the param values from the POST JSON data. - var param = {}, json = JSON.parse(aPOSTData), key; - for (key in json) { - setParamValue(param, key, json[key]); - } - return param; - }; - - var getServerResponseFromParam = function (aParam) { - // Get the JSON data to send back. - var data = { tex: aParam.tex }; - try { - data.mathml = getMathMLString(aParam); - data.exception = null; - } catch (e) { - data.exception = e.message; - } - return JSON.stringify(data); - }; - - var webserverListener = function (aRequest, aResponse) { - // Listener for the "webserver" module (phantomjs, slimerjs). - var param = {}, json = {}, response; - if (aRequest.method === "GET") { - param = getParametersFromURL(aRequest.url); - } else if (aRequest.method === "POST") { - param = getParametersFromPOSTData(aRequest.post); - } - if (param.tex !== undefined) { - json = getServerResponseFromParam(param); - } - response = JSON.stringify(json); - aResponse.statusCode = 200; - aResponse.setHeader("Content-Type", "application/json"); - aResponse.write(response); - aResponse.close(); - }; - - var httpListener = function (aRequest, aResponse) { - // Listener for the "http" module (nodejs). - var param = {}, json = {}, response, body = ""; - aRequest.setEncoding("utf8"); - aRequest.on("data", function (aChunk) { - body += aChunk; - }); - aRequest.on("end", function () { - aResponse.writeHead(200, {"Content-Type": ""}); - if (aRequest.method === "GET") { - param = getParametersFromURL(aRequest.url); - } else if (aRequest.method === "POST") { - param = getParametersFromPOSTData(body); - } - if (param.tex !== undefined) { - json = getServerResponseFromParam(param); - } - response = JSON.stringify(json); - aResponse.writeHead(200, { "Content-Type": "application/json" }); - aResponse.write(response); - aResponse.end(); - }); - }; - - var startWebServer = function (aPort) - { - try { - require("webserver").create().listen(aPort, webserverListener); - } catch (e) { - require("http").createServer(httpListener).listen(aPort); - } - console.log("Web server started on http://localhost:" + aPort); - } - - var main = function (aArgs, aStdinContent) { - // Main command line function. - var param = {}; - if (aArgs.length >= 3 && aArgs[1] === "parser") { - // Parse the string and print the output. - setParamValue(param, "tex", aArgs[2]); - setParamValue(param, "display", aArgs[3]); - setParamValue(param, "rtl", aArgs[4]); - setParamValue(param, "exception", aArgs[5]); - try { - console.log(getMathMLString(param)); - exitCommonJS(0); - } catch (e) { - console.log(e); - exitCommonJS(1); - } - } else if (aArgs.length >= 2 && aArgs[1] === "webserver") { - setParamValue(param, "safe", aArgs[2]); - TeXZilla.setSafeMode(param.safe); - setParamValue(param, "itexId", aArgs[3]); - TeXZilla.setItexIdentifierMode(param.itexId); - // Run a Web server. - try { - startWebServer(aArgs.length >= 3 ? parseInt(aArgs[2], 10) : 3141); - } catch (e) { - console.log(e); - exitCommonJS(1); - } - } else if (aArgs.length >= 2 && aArgs[1] === "streamfilter") { - setParamValue(param, "safe", aArgs[2]); - TeXZilla.setSafeMode(param.safe); - setParamValue(param, "itexId", aArgs[3]); - TeXZilla.setItexIdentifierMode(param.itexId); - if (typeof process !== "undefined") { - var stdinContent = ""; - process.stdin.resume(); - process.stdin.setEncoding("utf-8"); - process.stdin.on("data", function(aData) { stdinContent += aData; }); - process.stdin.on("end", function() { - console.log(TeXZilla.filterString(stdinContent, true)); - exitCommonJS(0); - }); - } else { - // FIXME: Slimerjs does not seem to support stdin. - console.log(TeXZilla. - filterString(require("system").stdin.read(), true)); - exitCommonJS(0); - } - } else { - usage(); - exitCommonJS(0); - } - }; - - if (typeof exports === "undefined" || - (typeof module !== "undefined" && require.main === module)) { - // Process the command line arguments, the stdin content and execute the - // main program. - if (typeof process !== "undefined") { - main(process.argv.slice(1)); - } else { - main(require("system").args); - } - } -} diff --git a/utils/buildDocs.js b/utils/buildDocs.js deleted file mode 100644 index 9419041d..00000000 --- a/utils/buildDocs.js +++ /dev/null @@ -1,97 +0,0 @@ -const fs = require("fs") // Node.js file system -const hurmet = require('./hurmet.cjs'); -const temml = require('./temml.cjs'); -const katex = require('./katex.min.js'); -const TeXZilla = require("./TeXZilla.js"); -// eslint-disable-next-line no-undef -globalThis.temml = temml; - -// The main Hurmet function has to be async because it contains an 'await' statement. -(async function main() { - // Build supported.html. - let supported = fs.readFileSync('./docs/supported.md').toString('utf8') - // convert Markdown to HTML - supported = await hurmet.md2html(supported, "", true) - fs.writeFileSync('./site/docs/en/supported.html', supported) - - let table = fs.readFileSync('./docs/support_table.md').toString('utf8') - // convert Markdown to HTML - table = await hurmet.md2html(table, "", true) - table = table.replace(/\(Not supported\)/g, `Not supported`) - fs.writeFileSync('./site/docs/en/support_table.html', table) - - let admin = fs.readFileSync('./docs/administration.md').toString('utf8') - // convert Markdown to HTML - admin = await hurmet.md2html(admin, "", true) - fs.writeFileSync('./site/docs/en/administration.html', admin) -})(); - -// helper function for comparison page. -const arrayOfRegExMatches = (regex, text) => { - if (regex.constructor !== RegExp) { throw new Error('not RegExp') } - const result = [] - let match = null - // eslint-disable-next-line no-cond-assign - while (match = regex.exec(text)) { - result.push({ - value: match[0], - index: match.index, - lastindex: match.index + match[0].length - }) - } - return result -} - -// Comparison page -const temmlRegEx = /₮{1,2}[^₮]+₮{1,2}/g -let comp = fs.readFileSync('./docs/comparison.html').toString('utf8') -let macros = {}; -let matches = arrayOfRegExMatches(temmlRegEx, comp) -for (let i = matches.length - 1; i >= 0; i--) { - const displayMode = matches[i].value.charAt(1) === "₮" - let tex = displayMode - ? matches[i].value.slice(2, -2).trim() - : matches[i].value.slice(1, -1).trim(); - tex = tex.replace(/</g, "<").replace(/>/g, ">") - let math = temml.renderToString(tex, { displayMode, trust: true, macros }); - if (math.indexOf("#b22222") > -1) { - math = 'Not supported' - } - comp = comp.slice(0, matches[i].index) + math + comp.slice(matches[i].lastindex); -} - -const katexRegEx = /₭{1,2}[^₭]+₭{1,2}/g -macros = {}; -matches = arrayOfRegExMatches(katexRegEx, comp) -for (let i = matches.length - 1; i >= 0; i--) { - const displayMode = matches[i].value.charAt(1) === "₭" - let tex = displayMode - ? matches[i].value.slice(2, -2).trim() - : matches[i].value.slice(1, -1).trim(); - tex = tex.replace(/</g, "<").replace(/>/g, ">") - let math = katex.renderToString( - tex, - { displayMode, output: "mathml", trust: true, strict: false, throwOnError: false, macros } - ); - if (math.indexOf("#cc0000") > -1) { - math = 'Not supported' - } - comp = comp.slice(0, matches[i].index) + math + comp.slice(matches[i].lastindex); -} - -const texzillaRegEx = /₸{1,2}[^₸]+₸{1,2}/g -matches = arrayOfRegExMatches(texzillaRegEx, comp) -for (let i = matches.length - 1; i >= 0; i--) { - const displayMode = matches[i].value.charAt(1) === "₸" - let tex = displayMode - ? matches[i].value.slice(2, -2).trim() - : matches[i].value.slice(1, -1).trim(); - tex = tex.replace(/</g, "<").replace(/>/g, ">") - let math = TeXZilla.toMathMLString(tex) - if (math.indexOf("error") > -1) { - math = 'Not supported' - } - comp = comp.slice(0, matches[i].index) + math + comp.slice(matches[i].lastindex); -} - -fs.writeFileSync('./site/docs/en/comparison.html', comp) diff --git a/utils/buildTests.js b/utils/buildTests.js deleted file mode 100644 index 1666ccb1..00000000 --- a/utils/buildTests.js +++ /dev/null @@ -1,33 +0,0 @@ -const fs = require("fs") // Node.js file system -const temml = require('./temml.cjs'); -const hurmet = require("./hurmet.cjs"); -// eslint-disable-next-line no-undef -globalThis.temml = temml; - -// The main Hurmet function has to be async because it contains an 'await' statement. -(async function main() { - let katexTests = fs.readFileSync('./test/katex-tests.md').toString('utf8') - // convert Markdown to HTML - katexTests = await hurmet.md2html(katexTests, "", true) - fs.writeFileSync('./site/tests/katex-tests.html', katexTests) - - let mhchemTests = fs.readFileSync('./test/mhchem-tests.md').toString('utf8') - mhchemTests = await hurmet.md2html(mhchemTests, "", true) - fs.writeFileSync('./site/tests/mhchem-tests.html', mhchemTests) - - let mozillaTests = fs.readFileSync('./test/mozilla-tests.md').toString('utf8') - mozillaTests = await hurmet.md2html(mozillaTests, "", true) - fs.writeFileSync('./site/tests/mozilla-tests.html', mozillaTests) - - let wikiTests = fs.readFileSync('./test/wiki-tests.md').toString('utf8') - wikiTests = await hurmet.md2html(wikiTests, "", true) - fs.writeFileSync('./site/tests/wiki-tests.html', wikiTests) - - let latexmlTests = fs.readFileSync('./test/LaTeXML-tests.md').toString('utf8') - latexmlTests = await hurmet.md2html(latexmlTests, "", true) - fs.writeFileSync('./site/tests/LaTeXML-tests.html', latexmlTests) - - let environmentTests = fs.readFileSync('./test/environment-tests.md').toString('utf8') - environmentTests = await hurmet.md2html(environmentTests, "", true) - fs.writeFileSync('./site/tests/environment-tests.html', environmentTests) -})(); diff --git a/utils/copyfiles.js b/utils/copyfiles.js deleted file mode 100644 index 29cd092d..00000000 --- a/utils/copyfiles.js +++ /dev/null @@ -1,65 +0,0 @@ -const fs = require('fs'); - -// Populate the `dist` folder. - -fs.copyFile('site/assets/Temml-Local.css', 'dist/Temml-Local.css', (err) => { - if (err) { throw err } -}) - -fs.copyFile('site/assets/Temml-Latin-Modern.css', 'dist/Temml-Latin-Modern.css', (err) => { - if (err) { throw err } -}) - -fs.copyFile('site/assets/Temml-Asana.css', 'dist/Temml-Asana.css', (err) => { - if (err) { throw err } -}) - -fs.copyFile('site/assets/Temml-STIX2.css', 'dist/Temml-STIX2.css', (err) => { - if (err) { throw err } -}) - -fs.copyFile('site/assets/Temml-Libertinus.css', 'dist/Temml-Libertinus.css', (err) => { - if (err) { throw err } -}) - -fs.copyFile('site/assets/Temml-Fira.css', 'dist/Temml-Fira.css', (err) => { - if (err) { throw err } -}) - -fs.copyFile('site/assets/temml.min.js', 'dist/temml.min.js', (err) => { - if (err) { throw err } -}) - -fs.copyFile('test/temml.js', 'dist/temml.js', (err) => { - if (err) { throw err } -}) - -fs.copyFile('utils/temml.cjs', 'dist/temml.cjs', (err) => { - if (err) { throw err } -}) - -fs.copyFile('utils/temml.mjs', 'dist/temml.mjs', (err) => { - if (err) { throw err } -}) - -fs.copyFile('test/temmlPostProcess.js', 'dist/temmlPostProcess.js', (err) => { - if (err) { throw err } -}) - -fs.copyFile('site/assets/Temml.woff2', 'dist/Temml.woff2', (err) => { - if (err) { throw err } -}) - -fs.copyFile('site/assets/mhchem.min.js', 'contrib/mhchem/mhchem.min.js', (err) => { - if (err) { throw err } -}) - -fs.copyFile('contrib/auto-render/test/auto-render.js', 'contrib/auto-render/dist/auto-render.js', -(err) => { - if (err) { throw err } -}) - -fs.copyFile('temml.d.ts', 'dist/temml.d.ts', -(err) => { - if (err) { throw err } -}) diff --git a/utils/hurmet.cjs b/utils/hurmet.cjs deleted file mode 100644 index d3226305..00000000 --- a/utils/hurmet.cjs +++ /dev/null @@ -1,31088 +0,0 @@ -'use strict'; - -/* - * Hurmet, copyright (c) by Ron Kok - * Distributed under an MIT license: https://hurmet.org/LICENSE.txt - * - * Hurmet adds calculation cells to the ProseMirror rich text editor. - * See https://hurmet.org and https://hurmet.org/docs/en/manual.html - */ - -// utils.js - -const isValidIdentifier$1 = /^(?:[A-Za-zıȷ\u0391-\u03C9\u03D5\u210B\u210F\u2110\u2112\u2113\u211B\u212C\u2130\u2131\u2133]|(?:\uD835[\uDC00-\udc33\udc9c-\udcb5]))[A-Za-z0-9_\u0391-\u03C9\u03D5\u0300-\u0308\u030A\u030C\u0332\u20d0\u20d1\u20d6\u20d7\u20e1]*′*$/; -// Detect string interpolation ${varName} -const interpolateRegEx = /\$\{[^}\s]+\}/g; - -const clone = obj => { - // Clone a JavaScript object. - // That is, make a deep copy that does not contain any reference to the original object. - // This function works if the object contains only these types: - // boolean, number, bigint, string, null, undefined, date, array, object, Map - // Any other type, or non-tree structure (e.g., "this"), cannot be handled by this function. - // This is a modified version of https://stackoverflow.com/a/728694 - - // Handle boolean, number, bigint, string, null, or undefined - // eslint-disable-next-line eqeqeq - if (null == obj || "object" != typeof obj) { return obj } - - if (obj instanceof Date) { return new Date().setTime(obj.valueOf()) } - - if (Array.isArray(obj)) { - const copy = []; - for (let i = 0, len = obj.length; i < len; i++) { - copy[i] = clone(obj[i]); - } - return copy - } - - if (obj instanceof Map) { - const copy = new Map(); - for (const [key, value] of obj.entries()) { - copy.set(key, clone(value)); - } - return copy - } - - if (typeof obj === "object") { - const copy = Object.create(null); - Object.entries(obj).forEach(([key, value]) => { - copy[key] = clone(value); - }); - return copy - } - - throw new Error("Unable to clone obj! Its type isn't supported.") -}; - -// A function to return an array containing all matches to a RegEx pattern. -const arrayOfRegExMatches = (regex, text) => { - if (regex.constructor !== RegExp) { throw new Error('not RegExp') } - const result = []; - let match = null; - - /* eslint-disable no-cond-assign */ - if (regex.global) { - while (match = regex.exec(text)) { - result.push({ value: match[0], index: match.index, length: match[0].length }); - } - } else if (match = regex.exec(text)) { - result.push({ value: match[0], index: match.index, length: match[0].length }); - } - /* eslint-enable no-cond-assign */ - - return result -}; - -const textAccent = { - "\u0300": "`", - "\u0301": "'", - "\u0302": "^", - "\u0303": "~", - "\u0304": "=", - "\u0305": "=", - "\u0306": "u", - "\u0307": ".", - "\u0308": '"', - "\u030A": 'r', - "\u030c": "v" -}; - -const escapeRegEx = /[#$&%_~^]/g; -const accentRegEx$2 = /[\u0300-\u0308\u030A\u030c]/g; - -const addTextEscapes = str => { - // Insert escapes for # $ & % _ ~ ^ \ { } - // TODO: \textbackslash. - // TODO: How to escape { } without messing up Lex? - if (str.length > 1) { - let matches = arrayOfRegExMatches(escapeRegEx, str); - let L = matches.length; - if (L > 0) { - for (let i = L - 1; i >= 0; i--) { - const match = matches[i]; - const pos = match.index; - if (match.value === "~") { - str = str.slice(0, pos) + "\\textasciitilde " + str.slice(pos + 1); - } else if (match.value === "^") { - str = str.slice(0, pos) + "\\textasciicircum " + str.slice(pos + 1); - } else if (pos === 0) { - str = "\\" + str; - } else { - const pc = str.substr(pos - 1, 1); - if (pc !== "\\") { - str = str.slice(0, pos) + "\\" + str.slice(pos); - } - } - } - } - matches = arrayOfRegExMatches(accentRegEx$2, str); - L = matches.length; - if (L > 0) { - for (let i = L - 1; i >= 0; i--) { - const match = matches[i]; - const pos = match.index; - if (pos > 0) { - str = str.slice(0, pos - 1) + "\\" + textAccent[match.value] - + str.slice(pos - 1, pos) + str.slice(pos + 1); - } - } - } - } - return str -}; - -const numeralFromSuperScript = ch => { - // convert a superscript character, ⁰¹²³ etc, to the regular numeral equivalent. - switch (ch) { - case "²": - return "2" - case "³": - return "3" - case "⁻": - return "-" - case "¹": - return "1" - case "⁰": - return "0" - default: - return String.fromCharCode(ch.charCodeAt(0) - 0x2040) - } -}; - -// Trim spaces except for tabs. This is used to read tab-separated values (TSV). -const leadingSpaceRegEx$3 = /^[ \r\n\f]+/; -const trailingSpaceRegEx$1 = /[ \r\n\f]+$/; -const tablessTrim = str => { - return str.replace(leadingSpaceRegEx$3, "").replace(trailingSpaceRegEx$1, "") -}; - -const midDotRegEx = /^(\*|·|\.|-[A-Za-z])/; -const exponentRegEx = /[⁰¹²³\u2074-\u2079⁻]/; - -const unitTeXFromString = str => { - // I wrap a unit name with an extra pair of braces {}. - // Tt's a hint so that plugValsIntoEcho() can easily remove a unit name. - let unit = " {\\text{"; - let inExponent = false; - - for (let i = 0; i < str.length; i++) { - let ch = str.charAt(i); - if (exponentRegEx.test(ch)) { - ch = numeralFromSuperScript(ch); - } - if (midDotRegEx.test(str.slice(i))) { - unit += "}\\mkern1mu{\\cdot}\\mkern1mu\\text{"; - } else if (/[0-9-]/.test(ch)) { - ch = ch === "-" ? "\\text{-}" : ch; - if (inExponent) { - unit += ch; - } else { - unit += "}^{" + ch; - inExponent = true; - } - } else if (ch === "^") { - unit += "}^{"; - inExponent = true; - } else if (inExponent) { - unit += "}\\text{" + ch; - inExponent = false; - } else if (ch === "$") { - unit += "\\$"; - } else { - unit += ch; - } - } - - return unit + "}}" -}; - -// unit exponents of a number with no unit. -const allZeros = Object.freeze([0, 0, 0, 0, 0, 0, 0, 0]); - -// Data types -// Some operands will be two types at the same time, e.g. RATIONAL + MATRIX. -// So we'll enumerate data types in powers of two. -// That way, we can use a bit-wise "&" operator to test for an individual type. -const dt = Object.freeze({ - NULL: 0, - RATIONAL: 1, - COMPLEX: 2, - BOOLEAN: 4, - FROMCOMPARISON: 8, - BOOLEANFROMCOMPARISON: 12, // 4 + 8, useful for chained comparisons - STRING: 16, - QUANTITY: 32, // Contains both a magnitude and a unit-of-measure - DATE: 64, // Not currently used - RANGE: 128, // as in: 1:10 - TUPLE: 256, // Used for multiple assignment from a module. - MAP: 512, // A key:value store with all the same data type the same unit - ROWVECTOR: 1024, - COLUMNVECTOR: 2048, - MATRIX: 4096, // two dimensional - DATAFRAME: 8192, - MODULE: 16384, // contains user-defined functions - ERROR: 32768, - UNIT: 65536, // User-defined units. - DRAWING: 131072, - RICHTEXT: 262144, - DICTIONARY: 524288, - MACRO: 1048576 -}); - -const errorMessages = Object.freeze({ - EN: { - ERROR: "Error. Hurmet does not understand the expression.", - ERR_FUNC: "@", - BAD_FUN_NM:"Error. Unrecognized function name \"@\".", - DIV: "Error. Divide by zero.", - NAN: "Error. Value of $@$ is not a numeric.", - NANARG: "Error. Argument to function $@$ must be numeric.", - NULL: "Error. Missing value for $@$.", // $@$ will be italic in TeX - BAD_EQ: 'Error. Use "==" instead of "=" to check for equality.', - V_NAME: "Error. Variable $@$ not found.", - F_NAME: "Error. Function @ not found.", - NAN_OP: "Error. Arithmetic operation on a non-numeric value.", - UNIT_ADD: "Error. Adding incompatible units.", - UNIT_COMP: "Error. Comparing incompatible units.", - UNIT_APEND:"Error. Apppending incompatible units.", - UNIT_RES: "Error. Calculated units are not compatible with the desired result unit:", - UNIT_MISS: "Error. No units specified for the result.", - UNIT_IN: "Error. Incorrect unit for input to function @.", - UNIT_ARG: "Error. Unit mis-match between arguments to function @.", - UNIT_COL: "Error. Data frame column @ has no units. Do not make a unit-aware call to it.", - UNIT_AWARE: "Error. Calculation must be unit-aware in order to apply unit @", - DATE: "Error. Date required.", - LOGIC: "Error. Logic operation “@” on a non-boolean value.", - FACT: "Error. Factorial may be applied only to a unit-less non-negative integer.", - PER: "Error. Percentage may be applied only to a unit-less number.", - BINOM: "Error. Binomial may be applied only to unit-less numbers.", - LOGF: "Error. Argument to log!() must be a non-negative integer.", - Γ0: "Error. Γ(0) is infinite.", - ΓPOLE: "Error. Γ() of a negative integer is infinite.", - LOGΓ: "Error. Argument to Hurmet lgamma() must be a positive number.", - TAN90: "Error. tan($@$) is infinite.", - ATRIG: "Error. Input to @ must be between -1 and 1.", - COT: "Error. Input to @ must not be zero.", - ASEC: "Error. Absolute value of input to @ must be ≥ 1", - STRING: "Error. Text operand required.", - NUMARGS: "Error. Wrong number of arguments passed to function @.", - NONSQUARE: "Error. Only a square matrix can be inverted.", - SINGULAR: "Error. Matrix is singular and cannot be inverted.", - BAD_ROW_NAME: "Error. Data frame does not have a row named @.", - BAD_COLUMN_NAME: "Error. Data frame does not have a column named @.", - SINGLE_ARG:"Error. A call to a data frame must have two arguments in the brackets.", - BAD_TYPE: "Error. Unrecognized data type for $@$.", - CONCAT: "Error. Cannot add strings. Use \"&\" if concatenation is desired.", - MATRIX_DIV:"Error. Cannot divide one matrix by another.", - MATRIX_MOD:"Error. Cannot take the modulo of one matrix by another.", - BAD_INDEX: "Error. Index to a matrix must be numeric.", - FUNC_LINE: "Error in function @", - BAD_BREAK: "Error in function @. break called outside of a loop", - FETCH: "Error. A fetch() function must be the only item in its expression.", - STR_INDEX: "Error. The index to text may be only a real number or a range.", - UNIT_NAME: "Error. Unrecognized unit name: @", - INT_NUM: "Error. Number display type \"@\" must be an integer.", - TWO_MAPS: "Error. Both operands are maps. Hurmet accepts only one.", - BAD_FORMAT:"Error. Invalid format @.", - BAD_PREC: "Error. Significant digit specification must be between 1 and 15.", - ZERO_ROOT: "Error. Zeroth root.", - BAD_ROOT: "Error while taking root.", - UNREAL: "Error. Argument to function \"@\" must be a real number.", - BIGINDEX: "Error. Index too large.", - MIS_ELNUM: "Error. Mis-matched number of elements", - // eslint-disable-next-line max-len - CROSS: "Error. Cross product can be performed only on three-vectors. Use * if you want element-wise multiplication.", - QUANT_NUM: "Error. A Quantity must include a numeric magnitude.", - CURRENCY: "Error. Currency exchange rates must be defined before using a monetary unit.", - DF_UNIT: "Invalid unit \"&\" in data frame.", - FORM_FRAC: "Error. Hurmet can do binary or hexadecimal format only on integers.", - PRIVATE: "Error. Function @ is not private.", - INT_ARG: "Error. The @ function can take only integers as arguments.", - BAD_KEY: "Error. Data structure does not contain key \"@\".", - NUM_KEY: "Error. A key must be a string, not a number.", - IMMUT_UDF: `Error. Variable @ already contains a user-defined function. - Hurmet cannot assign a different value to @.`, - NO_PROP: `Error. Cannot call a property from variable "@" because it has no properties.`, - NOT_ARRAY: `Error. Cannot The second operand is not an array.`, - MULT_MIS: "Error. Mismatch in number of multiple assignment.", - COUNT: "Error. The count() function works only on strings.", - NOT_VECTOR:"Error. Arguments to @() must be vectors.", - BAD_DISPLAY:"Error. Result may not be suppressed. Use '?' display selector.", - NA_COMPL_OP:"Error. \"@\" cannot be performed on a complex number.", - NA_REAL: "Error. \"@\" can be performed only a complex number.", - ORIGIN: "Error. Function \"@\" is undefined at the origin.", - LOG_ZERO: "Error. Logarithm of zero is negative infinity.", - END_MISS: "Error. Too few END statments in function @.", - BAD_CONCAT: "Error. Unmatched dimensions.", - BAD_KEYSTR: "Error. The key in a key:value pair must be a string.", - BAD_APPEND: "Error. Can not append a @", - MAP_APPEND: "Error. Can not append. Wrong data type.", - BAD_TRANS: "Error. Only a matrix can be transposed.", - BAD_ARGS: "Error. Wrong number of arguments to function @", - BAD_SUM: "Error. Second argument to sum function must be 1 or 2.", - ZERO_STEP: "Error. Step value must be > zero." - } -}); - -const errorOprnd = (errorCode, messageInsert) => { - if (errorCode === "") { return { value: "Error", unit: null, dtype: dt.ERROR } } - let msg = errorMessages["EN"][errorCode]; - if (msg === undefined) { return { value: "Error", unit: null, dtype: dt.ERROR } } - if (messageInsert) { - messageInsert = addTextEscapes(messageInsert); - msg = msg.replace(/@/g, messageInsert); - } else { - msg = msg.replace(/@ ?/, ""); - } - return { value: msg, unit: null, dtype: dt.ERROR } -}; - -/* - * This file implements a rational number data type. - * Each rational number, r, is held as an array containing two BigInts. - * r[0] is the numerator and r[1] is the denominator. - * Negative rationals have a negative numerator, not a negative denominator. - * - * The code in this file is heavily influenced by Chapter 5 of - * __How JavaScript Works__ by Douglas Crockford - */ - -const iZero = BigInt(0); -const iOne = BigInt(1); -const iTwo = BigInt(2); -const zero = [iZero, iOne]; -const one = [iOne, iOne]; -const two = [iTwo, iOne]; -const pi$1 = [BigInt(31415926535897932384626433832795028841971693993751), - BigInt(10000000000000000000000000000000000000000000000000)]; -const e$1 = [BigInt(2718281828459045235360287471352662497757247093699959574966), - BigInt(1000000000000000000000000000000000000000000000000000000000)]; -// reduced Planck constant -const hbar = [BigInt(1054571817), - BigInt(10000000000000000000000000000000000000000000)]; - -const intAbs$1 = i => i >= iZero ? i : BigInt(-1) * i; // absolute value of a BigInt - -// eslint-disable-next-line max-len -const numberPattern = "^(-?)(?:(0x[0-9A-Fa-f]+)|([0-9]+)(?: ([0-9]+)\\/([0-9]+)|(?:\\.([0-9]+))?(?:e([+-]?[0-9]+)|(%))?))"; -const numberRegEx$6 = new RegExp(numberPattern); -// Capturing groups: -// [1] sign -// [2] hexadecimal integer -// [3] integer part -// [4] numerator of a mixed fraction -// [5] denominator of a mixed fraction -// [6] decimal fraction of significand, not including decimal point -// [7] exponent of a number in scientific notation -// [8] percentage sign - -const fromNumber = num => { - // Convert a JavaScript Number to a rational. - if (Number.isInteger(num)) { - return [BigInt(num), iOne] - } else { - const parts = num.toExponential().match(numberRegEx$6); - const decimalFrac = parts[6] || ""; - const exp = BigInt(parts[7]) - BigInt(decimalFrac.length); - if (exp < 0) { - return [BigInt(parts[1] + parts[3] + decimalFrac), BigInt(10) ** -exp] - } else if (parts[5]) { - const denominator = BigInt(parts[5]); - return normalize( - [BigInt(parts[1] + parts[3]) * denominator + BigInt(parts[4]) ]) - } else { - return normalize([BigInt(parts[1] + parts[3] + decimalFrac) * BigInt(10) ** exp, iOne]) - } - } -}; - -const fromString = str => { - // Convert an author's input string to a number. - const parts = str.match(numberRegEx$6); - let r; - if (parts[5]) { - // mixed fraction - const denominator = BigInt(parts[5]); - const numerator = BigInt(parts[1] + parts[3]) * denominator + BigInt(parts[4]); - r = normalize([numerator, denominator]); - - } else if (parts[2]) { - // hexadecimal - r = [BigInt(parts[2]), iOne]; - - } else { - // decimal - const decimalFrac = parts[6] || ""; - const numerator = BigInt(parts[3] + decimalFrac); - const exp = parts[7] - ? BigInt(parts[7]) - BigInt(decimalFrac.length) // scientific notation. - : parts[8] - ? BigInt(-2) - BigInt(decimalFrac.length) // percentage. - : BigInt(0) - BigInt(decimalFrac.length); - r = (exp < 0) - ? [numerator, BigInt(10) ** -exp] - : normalize([numerator * BigInt(10) ** exp, iOne]); - } - if (parts[1]) { r = negate$1(r); } - return r -}; - -const gcdi = (a, b) => { - // Greatest common divisor of two big integers - a = intAbs$1(a); - b = intAbs$1(b); - while (b !== iZero) { - const remainder = a % b; - a = b; - b = remainder; - } - return a -}; - -const gcd = (m, n) => { - // Greatest common divisor of two rationals - if (!Rnl.isInteger(m) || !Rnl.isInteger(n)) { return errorOprnd("INT_ARG", "gcd") } - return [gcdi(m[0] / m[1], n[0] / n[1]), iOne] -}; - -const normalize = r => { - const [numerator, denominator] = r; - if (denominator === iOne) { return r } - const gcD = gcdi(numerator, denominator); - return gcD === iOne ? r : [numerator / gcD, denominator / gcD] -}; - -const isRational = a => { - return Array.isArray(a) && a.length === 2 - && typeof a[0] === "bigint" && typeof a[1] === "bigint" -}; - -const isInteger = r => r[1] === iOne || (r[0] % r[1]) === iZero; - -const isZero = r => r[0] === iZero; - -const isNegative = r => r[0] < iZero; -const isPositive = r => r[0] > iZero; -const sign = r => isPositive(r) ? one : isZero(r) ? zero : negate$1(one); - -const negate$1 = r => [BigInt(-1) * r[0], r[1]]; - -const abs$1 = r => { - const numerator = r[0] < iZero ? BigInt(-1) * r[0] : r[0]; - return [numerator, r[1]] -}; - -const increment$1 = r => [r[0] + r[1], r[1]]; - -const decrement$1 = r => [r[0] - r[1], r[1]]; - -const floor = r => { - if (r[0] % r[1] === iZero) { return [r[0] / r[1], iOne] } - return (r[0] >= iZero) - ? [r[0] / r[1], iOne] - : [r[0] / r[1] - iOne, iOne] -}; - -const ceil = r => { - if (r[0] % r[1] === iZero) { return [r[0] / r[1], iOne] } - return (r[0] >= iZero) - ? [r[0] / r[1] + iOne, iOne] - : [r[0] / r[1], iOne] -}; - -const add$1 = (a, b) => { - return a[1] === b[1] - ? [a[0] + b[0], a[1]] - : normalize([a[0] * b[1] + b[0] * a[1], a[1] * b[1]]) -}; - -const subtract$1 = (a, b) => { - return (a[1] === b[1]) - ? [a[0] - b[0], a[1]] - : normalize([a[0] * b[1] - b[0] * a[1], a[1] * b[1]]) -}; - -const multiply$1 = (a, b) => [a[0] * b[0], a[1] * b[1]]; - -const divide$1 = (a, b) => { - let numerator = a[0] * b[1]; - let denominator = a[1] * b[0]; - if (denominator < 0) { - // Move the negative from the denominator to the numerator. - numerator *= BigInt(-1); - denominator *= BigInt(-1); - } - return [numerator, denominator] -}; - -const power$1 = (a, b) => { - if (b[0] === iZero) { - return [iOne, iOne] - } else { - b = normalize(b); - let result; - try { - result = isInteger(b) && isNegative(b) - ? [a[1] ** (BigInt(-1) * b[0]), a[0] ** (BigInt(-1) * b[0])] - : isInteger(b) - ? [a[0] ** b[0], a[1] ** b[0]] - : isPositive(a) || greaterThan(b, one) || lessThan(b, negate$1(one)) - ? fromNumber(toNumber(a) ** toNumber(b)) - : areEqual(mod(b, two), one) - ? fromNumber(-1 * (-1 * toNumber(a)) ** toNumber(b)) - : errorOprnd("BAD_ROOT"); - } catch (err) { - result = fromNumber(toNumber(a) ** toNumber(b)); - } - return result - } -}; - -const sqrt$1 = r => fromNumber(Math.sqrt(toNumber(r))); - -const exp$1 = r => fromNumber(Math.exp(toNumber(r))); - -const reciprocal = r => { - let numerator = r[1]; - let denominator = r[0]; - if (denominator < 0) { - numerator *= BigInt(-1); - denominator *= BigInt(-1); - } - return [numerator, denominator] -}; - -const hypot = (a, b) => { - // Ref: https://www.johndcook.com/blog/2010/06/02/whats-so-hard-about-finding-a-hypotenuse/ - const absA = abs$1(a); - const absB = abs$1(b); - const maximum = max(absA, absB); - const minimum = min(absA, absB); - const r = Rnl.divide(minimum, maximum); - return Rnl.multiply(maximum, sqrt$1(Rnl.increment(Rnl.multiply(r, r)))) -}; - -const mod = (a, b) => { - const quotient = divide$1(normalize(a), normalize(b)); - return [intAbs$1(quotient[0] % quotient[1]), iOne] -}; - -const rem = (a, b) => { - const quotient = divide$1(normalize(a), normalize(b)); - return [quotient[0] % quotient[1], iOne] -}; - -const areEqual = (a, b) => { - return (a[1] === b[1]) - ? a[0] === b[0] - : a[0] * b[1] === a[1] * b[0] -}; - -const lessThan = (a, b) => { - return (isNegative(a) !== isNegative(b)) - ? isNegative(a) - : isNegative(subtract$1(a, b)) -}; - -const greaterThan = (a, b) => { - return (isPositive(a) !== isPositive(b)) - ? isPositive(a) - : isPositive(subtract$1(a, b)) -}; - -const lessThanOrEqualTo = (a, b) => lessThan(a, b) || areEqual(a, b); - -const greaterThanOrEqualTo = (a, b) => greaterThan(a, b) || areEqual(a, b); - -const max = (a, b) => greaterThan(a, b) ? [a[0], a[1]] : [b[0], b[1]]; - -const min = (a, b) => lessThan(a, b) ? [a[0], a[1]] : [b[0], b[1]]; - -const cos$1 = x => { - return areEqual(x, divide$1(pi$1, two)) - ? zero - : fromNumber(Math.cos(toNumber(x))) -}; - -const sin$1 = x => fromNumber(Math.sin(toNumber(x))); - -const tan = x => { - if (areEqual(x, divide$1(pi$1, two))) { - return errorOprnd("TAN90", "π/2") - } - return fromNumber(Math.tan(toNumber(x))) -}; - -const cosh = x => { - // cosh(n) = (eⁿ + e⁻ⁿ) / 2 - const num = toNumber(x); - return fromNumber((Math.exp(num) + Math.exp(-num)) / 2) -}; - -const sinh = x => { - // sinh(n) = (eⁿ - e⁻ⁿ) / 2 - const num = toNumber(x); - return fromNumber((Math.exp(num) - Math.exp(-num)) / 2) -}; - -const tanh = x => { - // tanh(n) = (eⁿ - e⁻ⁿ) / (eⁿ + e⁻ⁿ) - const num = toNumber(x); - return fromNumber( - (Math.exp(num) - Math.exp(-num)) / (Math.exp(num) + Math.exp(-num)) - ) -}; - -const toNumber = r => { - // Return a JavaScript Number - const num = Number(r[0]) / Number(r[1]); // May be imprecise. - if (!isNaN(num) && num !== Infinity ) { return num } - const numStr = toStringSignificant(r, 20); - return Number(numStr) -}; - -const toStringSignificant = (r, numSignificantDigits) => { - // Return a string rounded to numSignificantDigits. - if (isZero(r)) { - return "0" - } else { - const quotient = intAbs$1(r[0] / r[1]); - if (quotient > 0) { - return toString(r, numSignificantDigits - String(quotient).length) - } else { - const inverseQuotientLength = String(intAbs$1(r[1] / r[0])).length; - return toString(r, inverseQuotientLength + numSignificantDigits - 1) - } - } -}; - -const toString = (r, numDigitsAfterDecimal) => { - // Return a string rounded to numDigitsAfterDecimal. - if (isZero(r)) { - return "0" - } else if (numDigitsAfterDecimal < 0) { - const N = -numDigitsAfterDecimal; - const significand = toString(divide$1(r, [BigInt(10) ** BigInt(N), iOne]), 0); - return significand + "0".repeat(N) - } else { - const [numerator, denominator] = normalize(r); - const quotient = numerator / denominator; - let remainder = numerator % denominator; - let result = String(quotient); - if (remainder === iZero && numDigitsAfterDecimal > 0) { - result += "." + "0".repeat(numDigitsAfterDecimal); - } else if (remainder !== iZero) { - remainder = intAbs$1(remainder); - const newNumerator = remainder * (BigInt(10) ** BigInt(numDigitsAfterDecimal)); - let fractus = newNumerator / denominator; - const residue = newNumerator % denominator; - if (numDigitsAfterDecimal === 0) { - return (intAbs$1(iTwo * residue) >= intAbs$1(denominator)) - ? String(quotient + iOne) - : result - } - if (intAbs$1(iTwo * residue) >= intAbs$1(denominator)) { - fractus = fractus + iOne; - } - result += "." + String(fractus).padStart(numDigitsAfterDecimal, "0"); - } - return result - } -}; - -// eslint-disable-next-line max-len -const preComputedFactorials = ["1", "1", "2", "6", "24", "120", "720", "5040", "40320", "362880", "3628800", "39916800", "479001600", "6227020800", "87178291200", "1307674368000", "20922789888000", "355687428096000", "6402373705728000", "121645100408832000", "2432902008176640000", "51090942171709440000", "1124000727777607680000", "25852016738884976640000", "620448401733239439360000", "15511210043330985984000000", "403291461126605635584000000", "10888869450418352160768000000", "304888344611713860501504000000", "8841761993739701954543616000000", "265252859812191058636308480000000", "8222838654177922817725562880000000", "263130836933693530167218012160000000", "8683317618811886495518194401280000000", "295232799039604140847618609643520000000", "10333147966386144929666651337523200000000", "371993326789901217467999448150835200000000", "13763753091226345046315979581580902400000000", "523022617466601111760007224100074291200000000", "20397882081197443358640281739902897356800000000", "815915283247897734345611269596115894272000000000", "33452526613163807108170062053440751665152000000000", "1405006117752879898543142606244511569936384000000000", "60415263063373835637355132068513997507264512000000000", "2658271574788448768043625811014615890319638528000000000", "119622220865480194561963161495657715064383733760000000000", "5502622159812088949850305428800254892961651752960000000000", "258623241511168180642964355153611979969197632389120000000000", "12413915592536072670862289047373375038521486354677760000000000", "608281864034267560872252163321295376887552831379210240000000000", "30414093201713378043612608166064768844377641568960512000000000000", "1551118753287382280224243016469303211063259720016986112000000000000", "80658175170943878571660636856403766975289505440883277824000000000000", "4274883284060025564298013753389399649690343788366813724672000000000000", "230843697339241380472092742683027581083278564571807941132288000000000000", "12696403353658275925965100847566516959580321051449436762275840000000000000", "710998587804863451854045647463724949736497978881168458687447040000000000000", "40526919504877216755680601905432322134980384796226602145184481280000000000000", "2350561331282878571829474910515074683828862318181142924420699914240000000000000", "138683118545689835737939019720389406345902876772687432540821294940160000000000000", "8320987112741390144276341183223364380754172606361245952449277696409600000000000000", "507580213877224798800856812176625227226004528988036003099405939480985600000000000000", "31469973260387937525653122354950764088012280797258232192163168247821107200000000000000", "1982608315404440064116146708361898137544773690227268628106279599612729753600000000000000", "126886932185884164103433389335161480802865516174545192198801894375214704230400000000000000", "8247650592082470666723170306785496252186258551345437492922123134388955774976000000000000000", "544344939077443064003729240247842752644293064388798874532860126869671081148416000000000000000", "36471110918188685288249859096605464427167635314049524593701628500267962436943872000000000000000", "2480035542436830599600990418569171581047399201355367672371710738018221445712183296000000000000000", "171122452428141311372468338881272839092270544893520369393648040923257279754140647424000000000000000", "11978571669969891796072783721689098736458938142546425857555362864628009582789845319680000000000000000", "850478588567862317521167644239926010288584608120796235886430763388588680378079017697280000000000000000", "61234458376886086861524070385274672740778091784697328983823014963978384987221689274204160000000000000000", "4470115461512684340891257138125051110076800700282905015819080092370422104067183317016903680000000000000000", "330788544151938641225953028221253782145683251820934971170611926835411235700971565459250872320000000000000000", "24809140811395398091946477116594033660926243886570122837795894512655842677572867409443815424000000000000000000", "1885494701666050254987932260861146558230394535379329335672487982961844043495537923117729972224000000000000000000", "145183092028285869634070784086308284983740379224208358846781574688061991349156420080065207861248000000000000000000", "11324281178206297831457521158732046228731749579488251990048962825668835325234200766245086213177344000000000000000000", "894618213078297528685144171539831652069808216779571907213868063227837990693501860533361810841010176000000000000000000", "71569457046263802294811533723186532165584657342365752577109445058227039255480148842668944867280814080000000000000000000", "5797126020747367985879734231578109105412357244731625958745865049716390179693892056256184534249745940480000000000000000000", "475364333701284174842138206989404946643813294067993328617160934076743994734899148613007131808479167119360000000000000000000", "39455239697206586511897471180120610571436503407643446275224357528369751562996629334879591940103770870906880000000000000000000", "3314240134565353266999387579130131288000666286242049487118846032383059131291716864129885722968716753156177920000000000000000000", "281710411438055027694947944226061159480056634330574206405101912752560026159795933451040286452340924018275123200000000000000000000", "24227095383672732381765523203441259715284870552429381750838764496720162249742450276789464634901319465571660595200000000000000000000", "2107757298379527717213600518699389595229783738061356212322972511214654115727593174080683423236414793504734471782400000000000000000000", "185482642257398439114796845645546284380220968949399346684421580986889562184028199319100141244804501828416633516851200000000000000000000", "16507955160908461081216919262453619309839666236496541854913520707833171034378509739399912570787600662729080382999756800000000000000000000", "1485715964481761497309522733620825737885569961284688766942216863704985393094065876545992131370884059645617234469978112000000000000000000000", "135200152767840296255166568759495142147586866476906677791741734597153670771559994765685283954750449427751168336768008192000000000000000000000", "12438414054641307255475324325873553077577991715875414356840239582938137710983519518443046123837041347353107486982656753664000000000000000000000", "1156772507081641574759205162306240436214753229576413535186142281213246807121467315215203289516844845303838996289387078090752000000000000000000000", "108736615665674308027365285256786601004186803580182872307497374434045199869417927630229109214583415458560865651202385340530688000000000000000000000", "10329978488239059262599702099394727095397746340117372869212250571234293987594703124871765375385424468563282236864226607350415360000000000000000000000", "991677934870949689209571401541893801158183648651267795444376054838492222809091499987689476037000748982075094738965754305639874560000000000000000000000", "96192759682482119853328425949563698712343813919172976158104477319333745612481875498805879175589072651261284189679678167647067832320000000000000000000000", "9426890448883247745626185743057242473809693764078951663494238777294707070023223798882976159207729119823605850588608460429412647567360000000000000000000000", "933262154439441526816992388562667004907159682643816214685929638952175999932299156089414639761565182862536979208272237582511852109168640000000000000000000000", "93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000"]; -// eslint-disable-next-line max-len -const preComputedDoubleFactorials = ["1", "1", "2", "3", "8", "15", "48", "105", "384", "945", "3840", "10395", "46080", "135135", "645120", "2027025", "10321920", "34459425", "185794560", "654729075", "3715891200", "13749310575", "81749606400", "316234143225", "1961990553600", "7905853580625", "51011754393600", "213458046676875", "1428329123020800"]; - -const factorial = (n) => { - if (lessThan(n, [BigInt(101), iOne])) { - return fromString(preComputedFactorials[toNumber(n)]) - } else { - return lanczos$1(increment$1(n)) - } -}; - -const doubleFactorial = n => { - if (lessThan(n, [BigInt(29), iOne])) { - return fromString(preComputedDoubleFactorials[toNumber(n)]) - } else { - let r = n; - for (let i = Rnl.toNumber(n) - 2; i > 0; i -= 2) { - r = multiply$1(r, fromNumber(i)); - } - return r - } -}; - -const lanczos$1 = xPlusOne => { - // Lanczos approximation of Gamma function. - // Coefficients are from 2004 PhD thesis by Glendon Pugh. - // *An Analysis of the Lanczos Gamma Approximation* - // The following equation is from p. 116 of the Pugh thesis: - // Γ(x+1) ≈ 2 * √(e / π) * ((x + 10.900511 + 0.5) / e) ^ (x + 0.5) * sum - const x = subtract$1(xPlusOne, one); - const term1 = multiply$1(two, sqrt$1(divide$1(e$1, pi$1))); - const term2 = power$1(divide$1(add$1(x, fromNumber(11.400511)), e$1), add$1(x, [iOne, iTwo])); - - // Coefficients from Pugh, Table 8.5 - const d = ["2.48574089138753565546e-5", "1.05142378581721974210", - "-3.45687097222016235469", "4.51227709466894823700", "-2.98285225323576655721", - "1.05639711577126713077", "-0.195428773191645869583", "0.0170970543404441224307", - "-0.000571926117404305781283", "0.00000463399473359905636708", - "-0.00000000271994908488607703910"]; - - // sum = d_0 + ∑_(k=1)^10 d_k/(x+k) - let sum = fromString(d[0]); - for (let k = 1; k <= 10; k++) { - sum = add$1(sum, divide$1(fromString(d[k]), add$1(x, fromNumber(k)))); - } - - return multiply$1(multiply$1(term1, term2), sum) -}; - -const Rnl = Object.freeze({ - fromNumber, - fromString, - normalize, - isRational, - isInteger, - isZero, - isNegative, - isPositive, - sign, - negate: negate$1, - abs: abs$1, - increment: increment$1, - decrement: decrement$1, - exp: exp$1, - floor, - ceil, - add: add$1, - subtract: subtract$1, - multiply: multiply$1, - divide: divide$1, - reciprocal, - gcd, - hbar, - mod, - rem, - hypot, - one, - pi: pi$1, - power: power$1, - sqrt: sqrt$1, - two, - cos: cos$1, - sin: sin$1, - tan, - cosh, - sinh, - tanh, - areEqual, - lessThan, - greaterThan, - lessThanOrEqualTo, - greaterThanOrEqualTo, - factorial, - doubleFactorial, - lanczos: lanczos$1, - max, - min, - numberPattern, - toNumber, - toString, - toStringSignificant, - zero -}); - -const siPrefixes = ["y", "z", "a", "f", "p", "n", "µ", "m", "", "k", - "M", "G", "T", "P", "E", "Z", "Y"]; - -const groupByThreeRegEx = /\B(?=(\d{3})+$)/g; -const groupByFourRegEx = /\B(?=(\d{4})+$)/g; // use sometimes in China -// Grouping as common in south Asia: 10,10,000 -const groupByLakhCroreRegEx = /(\d)(?=(\d\d)+\d$)/g; - -const formatRegEx = /^([beEfhkmprsStx%])?(-?[\d]+)?([∠°]{0,2})?$/; - -const superscript = str => { - // Convert a numeral string to Unicode superscript characters. - // Used for denominator in mixed fractions/ - let result = ""; - for (let i = 0; i < str.length; i++) { - const charCode = str.charCodeAt(i); - result += (charCode === 0x31) - ? "¹" - : charCode === 0x32 - ? "²" - : charCode === 0x33 - ? "³" - : String.fromCharCode(charCode + 0x2040); - } - return result -}; - -const subscript = str => { - // Convert a numeral string to Unicode subscript characters. - // Used for mixed fraction denominators. - let result = ""; - for (let i = 0; i < str.length; i++) { - result += String.fromCharCode(str.charCodeAt(i) + 0x2050); - } - return result -}; - -const texFromMixedFraction = (numParts) => { - return (numParts[1] ? "-" : "") + - numParts[3] + "\\,\\class{special-fraction}{\\text{" + - superscript(numParts[4]) + "\u2044" + subscript(numParts[5]) + "}}" -}; - -const intAbs = i => i >= BigInt(0) ? i : BigInt(-1) * i; // absolute value of a BigInt - -const roundedString = (r, spec) => { - // Return a string rounded to the correct number of digits - const N = spec.numDigits; - - switch (spec.ftype) { - case "h": { - // Round a fraction, but not an integer, to N significant digits. - const integerStr = String(Rnl.toString(r, 0)); - if (integerStr.replace("-", "").length >= N) { return integerStr } - if (N < 1 || N > 15) { return errorOprnd("BAD_PREC") } - return Rnl.toNumber(r).toPrecision(N) - } - - case "f": - case "%": - // Exactly N digits after the decimal. - return Rnl.toString(r, N) - - case "r": - case "p": { - // Round to N significant digits - if (N < 1 || N > 15) { return errorOprnd("BAD_PREC") } - const numStr = Rnl.toNumber(r).toPrecision(N); - return numStr.indexOf("e") > -1 ? Number(numStr).toPrecision() : numStr - } - - case "s": - case "S": - case "e": - case "E": - case "n": - case "N": - case "k": - // Some variety of scientific notation. - if (N < 1 || N > 15) { return errorOprnd("BAD_PREC") } - return Rnl.toNumber(r).toExponential(N - 1).replace("+", "") - - default: { - r = Rnl.normalize(r); - const sign = Rnl.isNegative(r) ? "-" : ""; - const numerator = intAbs(r[0]); - const denominator = r[1]; - - switch (spec.ftype) { - case "m": { - // Mixed fraction - const quotientStr = String(numerator / denominator); - const remainder = numerator % denominator; - return sign + quotientStr + "\u00a0" + superscript(remainder) + - "⁄" + subscript(denominator) - } - - case "t": - // Truncate to integer - return sign + String(numerator / denominator) - - case "b": - case "x": - case "X": - // binary or hexadecimal integer - if (denominator !== BigInt(1)) { return errorOprnd("INT_NUM", spec.ftype) } - if (numerator <= Number.MAX_SAFE_INTEGER) { - return (spec.ftype === "b") - ? sign + "0b" + Number(numerator).toString(2) - : spec.ftype === "x" - ? sign + "0x" + Number(numerator).toString(16) - : sign + "0x" + Number(numerator).toString(16).toUpperCase() - } else { - // TODO: display large hex or binary. - return "" - } - } - } - } -}; - -const formattedInteger = (intStr, decimalFormat) => { - const thousandsSeparator = decimalFormat.charAt(1); - if (thousandsSeparator === "0") { - return intStr - } else if (decimalFormat === "1,00,000.") { - return intStr.replace(groupByLakhCroreRegEx, "$1{,}") - } else if (decimalFormat === "1,0000,0000.") { - return intStr.replace(groupByFourRegEx, "$1{,}") - } else { - return intStr.replace(groupByThreeRegEx, - (thousandsSeparator === ",") - ? "{,}" - : (thousandsSeparator === " ") - ? "\\:" - : (thousandsSeparator === "’") - ? "’" - : "." - ) - } -}; - -const formattedDecimal = (numStr, decimalFormat, truncateTrailingZeros) => { - const pos = numStr.indexOf("."); - if (pos === -1) { - return formattedInteger(numStr, decimalFormat) - } else { - const intStr = numStr.slice(0, pos); - const decimalSeparator = decimalFormat.slice(-1); - let frac = (decimalSeparator === "." ? "." : "{,}") + numStr.slice(pos + 1); - if (truncateTrailingZeros) { frac = frac.replace(/(\.|{,})?0+$/, ""); } - return formattedInteger(intStr, decimalFormat) + frac - } -}; - -const parseFormatSpec = str => { - // Do the RegEx once, at compile time, not every time a number is formatted. - // - // str ≔ "Tn", where: - // T = type, [bEefhkmNnprSstx%], default: "h" - // n = number of digits, [0-9]+, default: 15 - // - // Possible future additions: complex number format [∠°] - - const match = formatRegEx.exec(str); - if (!match) { - const message = errorOprnd("BAD_FORMAT", str).value; - return [str, undefined, dt.ERROR, "\\text{" + message + "}"] - } - - let ftype = match[1] || "h"; - let N = Number(match[2] || "15"); - const ctype = match[3] || ""; - - // Check the specified number of digits - switch (ftype) { - case "b": - case "x": - case "X": - return [str, undefined, dt.STRING, "\\text{" + ftype + ctype + "}" ] - case "t": - N = 0; - break - case "f": - case "%": - break - default: - if (N < 1 || N > 15) { - const message = "\\text{" + errorOprnd("BAD_PREC").value + "}"; - return [str, undefined, dt.ERROR, message] - } - } - - if (ftype === "%") { ftype = "\\%"; } - return [str, undefined, dt.STRING, "\\text{" + ftype + String(N) + ctype + "}" ] -}; - -const angleRegEx = /[∠°]+$/; - -const format = (num, specStr = "h3", decimalFormat = "1,000,000.") => { - if (Rnl.isZero(num)) { return "0" } - - const spec = { ftype: specStr.charAt(0) }; - specStr = specStr.replace(angleRegEx, ""); - if (specStr.length > 1) { spec.numDigits = Number(specStr.slice(1)); } - - if (spec.ftype === "%" || spec.ftype === "p") { num[0] = num[0] * BigInt(100); } - - if ((spec .ftype === "b" || spec.ftype === "x") && !Rnl.isInteger(num)) { - return errorOprnd("FORM_FRAC") - } - - // Round the number - const numStr = roundedString(num, spec); - - // Add separators - switch (spec.ftype) { - case "f": - case "r": - case "h": - return formattedDecimal(numStr, decimalFormat, spec.ftype === "h") - case "t": - return formattedInteger(numStr, decimalFormat) - case "%": - case "p": - return formattedDecimal(numStr, decimalFormat) + "\\%" - case "m": - case "b": - case "x": - case "X": - return numStr - default: { - // Some sort of scientific notation. - const pos = numStr.indexOf("e"); - let significand = numStr.slice(0, pos); - if (decimalFormat.slice(-1) === ",") { significand = significand.replace(".", "{,}"); } - - switch (spec.ftype) { - case "e": - case "E": { - const result = significand + "\\text{" + spec.ftype; - if (numStr.charAt(pos + 1) === "-") { - return result + "-}" + numStr.slice(pos + 2) - } else { - return result + "}" + numStr.slice(pos + 1) - } - } - - case "s": - case "S": - case "n": - case "N": { - const op = spec.ftype === "S" ? "×" : "\\mkern2mu{\\cdot}\\mkern1mu"; - return significand + op + "10^{" + numStr.slice(pos + 1) + "}" - } - - case "k": { - const exponent = Number(numStr.slice(pos + 1)); - const quotient = exponent / 3; - const q = quotient >= 0 ? Math.floor(quotient) : Math.ceil(quotient); - const modulo = exponent % 3; - if (modulo !== 0) { - significand = String(Number(significand) * Math.pow(10, modulo)); - } - return significand + siPrefixes[8 + q] - } - } - } - } -}; - -/* - * Hurmet operands often have numeric values. Sometimes they are the numbers originally - * input by the writer, henceforward known as "plain". Sometimes we work instead with - * values that have been converted to SI base units. It turns out that operands inside - * evalRpn() can often get by with less information than in the original cell assignment attrs. - * Some details for various data types: - * - * RATIONAL operand: { value: plain, unit: allZeros, dtype: RATIONAL } - * RATIONAL cell attrs: ditto. - * Note: "allZeros" is the array of unit-checking exponents for a number: [0,0,0,0,0,0,0,0,0] - * - * RATIONAL + QUANTITY unit-unaware operand: same as RATIONAL. - * RATIONAL + QUANTITY unit-AWARE oprnd: { - * value: inBaseUnits, unit: expos, dtype: RATIONAL + QUANTITY - * } - * RATIONAL + QUANTITY cell attrs include both of the above and also a `resultdisplay` string. - * - * RATIONAL + ROWVECTOR is the same as RATIONAL except the value is an array of plains. - * RATIONAL + ROWVECTOR + QUANTITY is the same as RATIONAL + QUANTITY except values are arrays. - * COLUMNVECTOR is the same as ROWVECTOR exept that they are treated differently by operators. - * MATRIX indicates that values are each an array of row vectors. - * * - * A MAP's values are all the same data type and all have the same unit of measure. - * MAP oprnd: {name, value: see below, unit: {name, factor, gauge, expos}, dtype: dMAP + ...} - * where: value is: {name1: value, name2: value} or - * where value is: {plain: {name1: value, name2: value}, - * inBaseUnits: {name1: value, name2: value}, - * etc} - * A `resultdisplay` string is always in a MAP's cell attrs and sometimes in an operand. - * - * ERROR operand: { value: error message, unit: undefined, dtype: ERROR } - * - * When this module creates Hurmet operands, it does not make defensive copies of - * cell attributes. The deep data is referenced. So Hurmet evaluate.js must copy whenever - * operators or functions might change a cell attribute. - * - */ - -const fromAssignment = (cellAttrs, unitAware) => { - // Get the value that was assigned to a variable. Load it into an operand. - if (cellAttrs.value === null) { - // Return an error message. - const insert = (cellAttrs.name) ? cellAttrs.name : "?"; - return errorOprnd("NULL", insert) - } - - const oprnd = Object.create(null); - oprnd.dtype = cellAttrs.dtype; - oprnd.name = cellAttrs.name; - - // Get the unit data. - const dtype = cellAttrs.dtype; - if (dtype === dt.STRING || dtype === dt.BOOLEAN || dtype === dt.DRAWING || - dtype === dt.MODULE || dtype === dt.NULL) { - oprnd.unit = null; - } else if (cellAttrs.unit) { - oprnd.unit = clone(cellAttrs.unit); - } else { - oprnd.unit = null; - } - - // Get the value. - if (cellAttrs.dtype & dt.QUANTITY) { - // Here we discard some of the cellAttrs information. In a unit-aware calculation, - // number, matrix, and map operands contain only the value.inBaseUnits. - if (cellAttrs.dtype & dt.MAP) { - oprnd.value = clone(cellAttrs.value); - oprnd.value.data = unitAware - ? oprnd.value.data.inBaseUnits - : oprnd.value.data.plain; - } else { - oprnd.value = Object.freeze(unitAware - ? clone(cellAttrs.value.inBaseUnits) - : clone(cellAttrs.value.plain) - ); - } - oprnd.dtype = cellAttrs.dtype - dt.QUANTITY; - - } else if (cellAttrs.dtype === dt.STRING) { - const str = cellAttrs.value; - const ch = str.charAt(0); - const chEnd = str.charAt(str.length - 1); - oprnd.value = ch === '"' && chEnd === '"' ? str.slice(1, -1).trim() : str.trim(); - - } else if (cellAttrs.dtype === dt.DATAFRAME) { - // For data frames, Hurmet employs copy-on-write tactics. - // So at this point, we can pass a reference to the value - oprnd.value = cellAttrs.value; - - // Note the only operations on data frames are: (1) access, and (2) concatenate. - // That's where the copy-on-write takes place. - - } else { - // For all other data types, we employ copy-on-read. So we return a deep copy from here. - oprnd.value = clone(cellAttrs.value); - } - - return Object.freeze(oprnd) -}; - -// units.js - -/* - * Unit-aware calculation is a core feature of Hurmet. - * Dimensional analysis is used to verify that a calculation contains compatible units. - * Example: Check unit compatibility for: L = '145 N·m'/'15.2 lbf' = ?? feet - * Analysis step 1: first operand: N·m → mass¹·length²·time⁻² - * 2nd operand: lbf → mass¹·length¹·time⁻² - * Note the exponents of those two operands. When terms multiply, we add exponents. - * When terms divide, we subtract exponents. As in step 2, next line: - * mass^(1-1)∙length^(2-1)∙time^(-2-(-2)) = mass⁰·length¹·time⁰ = length¹ - * In the example, the exponents for mass and time both zero'd out. - * Only length has a non-zero exponent. In fact, the result dimension = length¹. - * This matches the desired result dimension (feet is a length), so this example checks out. - * - * Hurmet automates this process of checking unit compatibility. - * Each instance of a Hurmet quantity operand contains an array of unit-checking exponents. - * Each element of that array contains an exponent of one of the Hurmet base dimensions. - * Those exponent values come from the unitTable, below. - * - * The Hurmet base dimensions and standard units are, in order of array values: - * length (meter) - * mass (kg) - * time (second) - * electrical current (ampere) - * temperature (Kelvin) - * finite amount (1 unit) (Yes, I know that SI uses a mole. That's just silly.) - * luminous intensity (cd) - * money (Euro) (A user can redefine the default to some other currency) - */ - -const unitsAreCompatible = (a, b) => { - // Do a compatibility check on the unit-checking exponents a and b. - if (a == null && b == null) { return true } - if (a == null || b == null) { return false } - if (!Array.isArray(a) || !Array.isArray(b)) { return false } - // Compare the exponents in the arrays. - if (a.length !== b.length) { return false } - for (let i = 0; i < a.length; ++i) { - if (a[i] !== b[i]) { return false } - } - return true -}; - -// JSON.parse() is faster than a big object literal -// eslint-disable-next-line max-len -const prefixFactor = JSON.parse('{"Y":1e24,"yotta":1e24,"Z":1e21,"zetta":1e21,"E":1e18,"exa":1e18,"P":1e15,"peta":1e15,"T":1e12,"tera":1e12,"G":1e9,"giga":1e9,"M":1e6,"mega":1e6,"k":1000,"kilo":1000,"h":100,"hecto":100,"deka":10,"d":0.1,"deci":0.1,"c":0.01,"centi":0.01,"m":0.001,"milli":0.001,"µ":1e-6,"\u00B5":1e-6,"micro":1e-6,"n":1e-9,"nano":1e-9,"p":1e-12,"pico":1e-12,"f":1e-15,"femto":1e-15,"a":1e-18,"atto":1e-18,"z":1e-21,"zepto":1e-21,"y":1e-24,"yocto":1e-24,"Ki":1024,"kibi":1024,"Mi":1048576,"mebi":1048576,"Gi":1073741824,"gibi":1073741824,"Ti":1099511627776,"tebi":1099511627776}'); - - // factor, numerator, denominator, gauge, prefix|logarithm|currency, exponents - // exponent break-down: length, mass, time, elect, temp, amount, lum inten, money - // Each money factor is a revised weekly with data from the European Central Bank. -const unitTable = Object.freeze(JSON.parse(`{ -"#":["0.45359237", "1","0","0",[0,1,0,0,0,0,0,0]], -"$":["1","1","0","USD",[0,0,0,0,0,0,0,1]], -"£":["1","1","0","GBP",[0,0,0,0,0,0,0,1]], -"'":["0.3048","1","0","0",[1,0,0,0,0,0,0,0]], -"A":["1","1","0","siSymbol",[0,0,0,1,0,0,0,0]], -"AUD":["1.6601","1","0","AUD",[0,0,0,0,0,0,0,1]], -"Adobe point":["0.0254","72","0","0",[1,0,0,0,0,0,0,0]], -"At":["1","1","0","siSymbol",[0,0,0,0,1,0,1,0]], -"Australian dollar":["1","1","0","AUD",[0,0,0,0,0,0,0,1]], -"BRL":["5.4099","1","0","BRL",[0,0,0,0,0,0,0,1]], -"BTU":["1055.056","1","0","0",[2,1,-2,0,0,0,0,0]], -"BThU":["1055.056","1","0","0",[2,1,-2,0,0,0,0,0]], -"Bq":["1","1","0","siSymbol",[0,0,-1,0,0,0,0,0]], -"Brazilian Real":["1","1","0","BRL",[0,0,0,0,0,0,0,1]], -"British Pound":["1","1","0","GBP",[0,0,0,0,0,0,0,1]], -"Btu":["1055.056","1","0","0",[2,1,-2,0,0,0,0,0]], -"C":["1","1","0","siSymbol",[0,0,1,1,0,0,0,0]], -"C$":["1","1","0","CAD",[0,0,0,0,0,0,0,1]], -"CAD":["1.4688","1","0","CAD",[0,0,0,0,0,0,0,1]], -"CCF":["1","1","0","0",[3,0,0,0,0,0,0,0]], -"CHF":["0.9729","1","0","CHF",[0,0,0,0,0,0,0,1]], -"CNY":["7.8245","1","0","CNY",[0,0,0,0,0,0,0,1]], -"CY":["0.764554857984","1","0","0",[3,0,0,0,0,0,0,0]], -"Calorie":["4186.8","1","0","0",[2,1,-2,0,0,0,0,0]], -"Canadian dollar":["1","1","0","CAD",[0,0,0,0,0,0,0,1]], -"Celsius":["1","1","273.15","0",[0,0,0,0,1,0,0,0]], -"Chinese Yuan":["1","1","0","CNY",[0,0,0,0,0,0,0,1]], -"Ci":["37000000000","1","0","siSymbol",[0,0,-1,0,0,0,0,0]], -"Ckm":["100000","1","0","siSymbol",[1,0,0,0,0,0,0,0]], -"Da":["1.66053872e-24","1","0","siSymbol",[0,1,0,0,0,0,0,0]], -"Dalton":["1.66053872e-24","1","0","0",[0,1,0,0,0,0,0,0]], -"Didot point":["15.625","41559","0","0",[1,0,0,0,0,0,0,0]], -"EB":["9223372036854770000","1","0","0",[0,0,0,0,0,1,0,0]], -"EMU":["0.01","360000","0","0",[1,0,0,0,0,0,0,0]], -"EUR":["1","1","0","EUR",[0,0,0,0,0,0,0,1]], -"EiB":["9223372036854770000","1","0","0",[0,0,0,0,0,1,0,0]], -"Euro":["1","1","0","EUR",[0,0,0,0,0,0,0,1]], -"F":["1","1","0","siSymbol",[-2,-1,4,2,0,0,0,0]], -"Fahrenheit":["5","9","459","0",[0,0,0,0,1,0,0,0]], -"G":["0.0001","1","0","siSymbol",[-2,-2,-2,-1,0,0,0,0]], -"GB":["8589934592","1","0","0",[0,0,0,0,0,1,0,0]], -"GBP":["0.85795","1","0","GBP",[0,0,0,0,0,0,0,1]], -"Gal":["0.01","1","0","siSymbol",[1,0,-2,0,0,0,0,0]], -"Gi":["10","12.5663706143592","0","siWord",[0,0,0,0,1,0,1,0]], -"GiB":["8589934592","1","0","0",[0,0,0,0,0,1,0,0]], -"Gregorian year":["31556952","1","0","0",[0,0,1,0,0,0,0,0]], -"Gy":["1","1","0","siSymbol",[2,0,-2,0,0,0,0,0]], -"H":["1","1","0","siSymbol",[2,1,-2,-2,0,0,0,0]], -"HK$":["1","1","0","HKD",[0,0,0,0,0,0,0,1]], -"HKD":["8.4645","1","0","HKD",[0,0,0,0,0,0,0,1]], -"HP":["745.69987158227","1","0","0",[2,1,-3,0,0,0,0,0]], -"Hong Kong dollar":["1","1","0","HKD",[0,0,0,0,0,0,0,1]], -"Hz":["1","1","0","siSymbol",[0,0,-1,0,0,0,0,0]], -"ILS":["3.9265","1","0","ILS",[0,0,0,0,0,0,0,1]], -"INR":["90.4090","1","0","INR",[0,0,0,0,0,0,0,1]], -"Indian Rupee":["1","1","0","INR",[0,0,0,0,0,0,0,1]], -"Israeli New Shekel":["1","1","0","ILS",[0,0,0,0,0,0,0,1]], -"J":["1","1","0","siSymbol",[2,1,-2,0,0,0,0,0]], -"JPY":["163.74","1","0","JPY",[0,0,0,0,0,0,0,1]], -"Japanese Yen":["1","1","0","JPY",[0,0,0,0,0,0,0,1]], -"Joule":["1","1","0","0",[2,1,-2,0,0,0,0,0]], -"Julian year":["31557600","1","0","0",[0,0,1,0,0,0,0,0]], -"Jy":["1e-26","1","0","siSymbol",[0,1,-2,0,0,0,0,0]], -"K":["1","1","0","0",[0,0,0,0,1,0,0,0]], -"KiB":["8192","1","0","0",[0,0,0,0,0,1,0,0]], -"KRW":["1453.62","1","0","KRW",[0,0,0,0,0,0,0,1]], -"L":["0.001","1","0","siSymbol",[3,0,0,0,0,0,0,0]], -"Lego stud":["0.008","1","0","siSymbol",[1,0,0,0,0,0,0,0]], -"MB":["8388608","1","0","0",[0,0,0,0,0,1,0,0]], -"MCM":["5.06707479097497e-07","1","0","0",[2,0,0,0,0,0,0,0]], -"MMBtu":["1055056000","1","0","0",[2,1,-2,0,0,0,0,0]], -"MMbbl":["158987.294928","1","0","0",[3,0,0,0,0,0,0,0]], -"MMbblpd":["158987.294928","86400","0","0",[3,0,-1,0,0,0,0,0]], -"MMscf":["28316.846592","1","0","0",[3,0,0,0,0,0,0,0]], -"MMscfd":["0.32774128","1","0","0",[3,0,0,0,0,0,0,0]], -"MT":["1000","1","0","0",[0,1,0,0,0,0,0,0]], -"MXN":["18.1372","1","0","MXN",[0,0,0,0,0,0,0,1]], -"Mach":["331.6","1","0","0",[1,0,-1,0,0,0,0,0]], -"Mbbl":["158.987294928","1","0","0",[3,0,0,0,0,0,0,0]], -"Mexican Peso":["1","1","0","MXN",[0,0,0,0,0,0,0,1]], -"MiB":["8388608","1","0","0",[0,0,0,0,0,1,0,0]], -"Mscfd":["0.00032774128","1","0","0",[3,0,0,0,0,0,0,0]], -"Mscfh":["0.00786579072","1","0","0",[3,0,0,0,0,0,0,0]], -"N":["1","1","0","siSymbol",[1,1,-2,0,0,0,0,0]], -"NM":["1852","1","0","0",[1,0,0,0,0,0,0,0]], -"PB":["9007199254740990","1","0","0",[0,0,0,0,0,1,0,0]], -"PS":["735.49875","1","0","0",[2,1,-3,0,0,0,0,0]], -"Pa":["1","1","0","siSymbol",[-1,1,-2,0,0,0,0,0]], -"Pascal":["1","1","0","siWord",[-1,1,-2,0,0,0,0,0]], -"Pferdestärke":["735.49875","1","0","0",[2,1,-3,0,0,0,0,0]], -"PiB":["9007199254740990","1","0","0",[0,0,0,0,0,1,0,0]], -"R":["0.000258","1","0","siSymbol",[0,-1,1,1,0,0,0,0]], -"R$":["1","1","0","BRL",[0,0,0,0,0,0,0,1]], -"RT":["3516.8532","1","0","0",[2,1,-3,0,0,0,0,0]], -"RUB":["1","1","0","RUB",[0,0,0,0,0,0,0,1]], -"S":["1","1","0","siSymbol",[-2,-1,3,2,0,0,0,0]], -"SF":["0.09290304","1","0","0",[2,0,0,0,0,0,0,0]], -"SY":["0.83612736","1","0","0",[2,0,0,0,0,0,0,0]], -"Sv":["1","1","0","siSymbol",[2,0,-2,0,0,0,0,0]], -"Swiss Franc":["1","1","0","CHF",[0,0,0,0,0,0,0,1]], -"T":["1","1","0","siSymbol",[-2,-2,-2,-1,0,0,0,0]], -"TB":["8796093022208","1","0","0",[0,0,0,0,0,1,0,0]], -"TWD":["1","1","0","TWD",[0,0,0,0,0,0,0,1]], -"TeX point":["0.0003515","1","0","0",[1,0,0,0,0,0,0,0]], -"TiB":["8796093022208","1","0","0",[0,0,0,0,0,1,0,0]], -"US$":["1","1","0","USD",[0,0,0,0,0,0,0,1]], -"USD":["1.0823","1","0","USD",[0,0,0,0,0,0,0,1]], -"V":["1","1","0","siSymbol",[2,1,-3,-1,0,0,0,0]], -"VA":["1","1","0","siSymbol",[2,1,-3,0,0,0,0,0]], -"W":["1","1","0","siSymbol",[2,1,-3,0,0,0,0,0]], -"Wb":["1","1","0","siSymbol",[2,1,-2,-1,0,0,0,0]], -"Wh":["3600","1","0","siSymbol",[2,1,-2,0,0,0,0,0]], -"Won":["1","1","0","KRW",[0,0,0,0,0,0,0,1]], -"Yen":["1","1","0","JPY",[0,0,0,0,0,0,0,1]], -"a":["31556925.9747","1","0","siSymbol",[0,0,1,0,0,0,0,0]], -"ac":["4046.8564224","1","0","0",[2,0,0,0,0,0,0,0]], -"acre":["4046.8564224","1","0","0",[2,0,0,0,0,0,0,0]], -"admiralty mile":["1853.188","1","0","0",[1,0,0,0,0,0,0,0]], -"af":["1233.48183754752","1","0","0",[3,0,0,0,0,0,0,0]], -"amp":["1","1","0","0",[0,0,0,1,0,0,0,0]], -"ampere":["1","1","0","siWord",[0,0,0,1,0,0,0,0]], -"ampere turn":["1","1","0","siWord",[0,0,0,0,1,0,1,0]], -"amu":["1.66053872e-24","1","0","0",[0,1,0,0,0,0,0,0]], -"angstrom":["0.0000000001","1","0","0",[1,0,0,0,0,0,0,0]], -"angstrom star":["0.00000000010000015","1","0","0",[1,0,0,0,0,0,0,0]], -"apostilb":["1","3.14159265358979","0","0",[-2,0,0,0,0,0,1,0]], -"arcminute":["3.14159265358979","10800","0","0",[0,0,0,0,0,0,0,0]], -"arcsecond":["3.14159265358979","648000","0","0",[0,0,0,0,0,0,0,0]], -"are":["100","1","0","0",[2,0,0,0,0,0,0,0]], -"as":["4.3.14159265358979","648000","0","0",[0,0,0,0,0,0,0,0]], -"asb":["1","3.14159265358979","0","0",[-2,0,0,0,0,0,1,0]], -"assay ton":["0.0875","3","0","0",[0,1,0,0,0,0,0,0]], -"astronomical unit":["149597870691","1","0","0",[1,0,0,0,0,0,0,0]], -"atmosphere":["101325","1","0","siSymbol",[-1,1,-2,0,0,0,0,0]], -"au":["149597870691","1","0","0",[1,0,0,0,0,0,0,0]], -"bar":["100000","1","0","siWord",[-1,1,-2,0,0,0,0,0]], -"barg":["100000","1","0","0",[-1,1,-2,0,0,0,0,0]], -"barleycorn":["0.0254","3","0","0",[1,0,0,0,0,0,0,0]], -"barrel":["0.158987294928","1","0","0",[3,0,0,0,0,0,0,0]], -"barrel bulk":["0.14158423296","1","0","0",[3,0,0,0,0,0,0,0]], -"basis point":["0.0001","1","0","0",[0,0,0,0,0,0,0,0]], -"baud":["1","1","0","siSymbol",[0,0,-1,0,0,1,0,0]], -"bbl":["0.158987294928","1","0","0",[3,0,0,0,0,0,0,0]], -"becquerel":["1","1","0","siWord",[0,0,-1,0,0,0,0,0]], -"beer barrel":["0.119240471196","1","0","0",[3,0,0,0,0,0,0,0]], -"bit":["1","1","0","0",[0,0,0,0,0,1,0,0]], -"blink":["0.864","1","0","0",[0,0,1,0,0,0,0,0]], -"bo":["0.158987294928","1","0","0",[3,0,0,0,0,0,0,0]], -"boe":["6119000000","1","0","0",[2,1,-2,0,0,0,0,0]], -"boiler horsepower":["9812.5","1","0","0",[2,1,-3,0,0,0,0,0]], -"bpd":["0.158987294928","86400","0","0",[3,0,-1,0,0,0,0,0]], -"bph":["0.158987294928","3600","0","0",[3,0,-1,0,0,0,0,0]], -"breadth":["0.2286","1","0","0",[1,0,0,0,0,0,0,0]], -"bushel":["0.03523907016688","1","0","0",[3,0,0,0,0,0,0,0]], -"byte":["8","1","0","0",[0,0,0,0,0,1,0,0]], -"caballo de vapor":["735.49875","1","0","0",[2,1,-3,0,0,0,0,0]], -"cal":["4.1868","1","0","0",[2,1,-2,0,0,0,0,0]], -"calorie":["4.1868","1","0","siWord",[2,1,-2,0,0,0,0,0]], -"candela":["1","1","0","siWord",[0,0,0,0,0,0,1,0]], -"candlepower":["1","1","0","siWord",[0,0,0,0,0,0,1,0]], -"carat":["0.00002","1","0","0",[0,1,0,0,0,0,0,0]], -"cc":["0.000001","1","0","0",[3,0,0,0,0,0,0,0]], -"cd":["1","1","0","siSymbol",[0,0,0,0,0,0,1,0]], -"centipoise":["0.001","1","0","0",[-1,1,-1,0,0,0,0,0]], -"centistoke":["0.000001","1","0","0",[2,0,-1,0,0,0,0,0]], -"cfm":["0.0004719474432","1","0","0",[3,0,-1,0,0,0,0,0]], -"cfs":["0.028316846592","1","0","0",[3,0,-1,0,0,0,0,0]], -"ch":["735.49875","1","0","0",[2,1,-3,0,0,0,0,0]], -"chain":["20.116","1","0","0",[1,0,0,0,0,0,0,0]], -"cheval vapeur":["735.49875","1","0","0",[2,1,-3,0,0,0,0,0]], -"cmil":["5.06707479097497e-10","1","0","0",[2,0,0,0,0,0,0,0]], -"cmm":["0.00001","1","0","0",[1,0,0,0,0,0,0,0]], -"constant":["1","1","0","0",[0,0,0,0,0,0,0,0]], -"coulomb":["1","1","0","siWord",[0,0,1,1,0,0,0,0]], -"cp":["1","1","0","siWord",[0,0,0,0,0,0,1,0]], -"cps":["1","1","0","0",[0,0,-1,0,0,0,0,0]], -"cu ft":["0.028316846592","1","0","0",[3,0,0,0,0,0,0,0]], -"cu in":["0.000016387064","1","0","0",[3,0,0,0,0,0,0,0]], -"cu yd":["0.764554857984","1","0","0",[3,0,0,0,0,0,0,0]], -"cubic meter":["1","1","0","0",[3,0,0,0,0,0,0,0]], -"cubic metre":["1","1","0","0",[3,0,0,0,0,0,0,0]], -"cup":["0.0002365882365","1","0","0",[3,0,0,0,0,0,0,0]], -"curie":["37000000000","1","0","siWord",[0,0,-1,0,0,0,0,0]], -"cv":["735.49875","1","0","0",[2,1,-3,0,0,0,0,0]], -"cy":["0.764554857984","1","0","0",[3,0,0,0,0,0,0,0]], -"d":["86400","1","0","0",[0,0,1,0,0,0,0,0]], -"daN":["10","1","0","0",[1,1,-2,0,0,0,0,0]], -"darcy":["0.0000000000009869233","1","0","0",[2,0,0,0,0,0,0,0]], -"day":["86400","1","0","0",[0,0,1,0,0,0,0,0]], -"deg":["3.14159265358979","180","0","0",[0,0,0,0,0,0,0,0]], -"degree":["3.14159265358979","180","0","0",[0,0,0,0,0,0,0,0]], -"dekan":["31.4159265358979","180","0","0",[0,0,0,0,0,0,0,0]], -"diopter":["1","1","0","0",[-1,0,0,0,0,0,0,0]], -"dioptre":["1","1","0","0",[-1,0,0,0,0,0,0,0]], -"dollar":["1","1","0","USD",[0,0,0,0,0,0,0,1]], -"drum":["0.20819764812","1","0","0",[3,0,0,0,0,0,0,0]], -"dscf":["0.028316846592","1","0","0",[3,0,0,0,0,0,0,0]], -"dyn":["0.00001","1","0","0",[1,1,-2,0,0,0,0,0]], -"dyne":["0.00001","1","0","0",[1,1,-2,0,0,0,0,0]], -"eV":["1.602176462e-19","1","0","siSymbol",[2,1,-2,0,0,0,0,0]], -"electric horsepower":["746","1","0","0",[2,1,-3,0,0,0,0,0]], -"electrical horsepower":["746","1","0","0",[2,1,-3,0,0,0,0,0]], -"electron volt":["1.602176462e-19","1","0","0",[2,1,-2,0,0,0,0,0]], -"erg":["0.0000001","1","0","0",[2,1,-2,0,0,0,0,0]], -"euro":["1","1","0","EUR",[0,0,0,0,0,0,0,1]], -"exabyte":["9223372036854770000","1","0","0",[0,0,0,0,0,1,0,0]], -"exbibyte":["9223372036854770000","1","0","0",[0,0,0,0,0,1,0,0]], -"farad":["1","1","0","siWord",[-2,-1,4,2,0,0,0,0]], -"faraday":["96485.339924","1","0","0",[0,0,1,1,0,0,0,0]], -"fathom":["1.8288","1","0","0",[1,0,0,0,0,0,0,0]], -"fc":["10.7639104167097","1","0","0",[-2,0,0,0,0,0,1,0]], -"feet":["0.3048","1","0","0",[1,0,0,0,0,0,0,0]], -"fermi":["0.000000000000001","1","0","siWord",[1,0,0,0,0,0,0,0]], -"fl oz":["0.003785411784","128","0","0",[3,0,0,0,0,0,0,0]], -"flop":["1","1","0","0",[0,0,-1,0,0,0,0,0]], -"fluid ounce":["0.003785411784","128","0","0",[3,0,0,0,0,0,0,0]], -"food calorie":["4186.8","1","0","0",[2,1,-2,0,0,0,0,0]], -"foot":["0.3048","1","0","0",[1,0,0,0,0,0,0,0]], -"footcandle":["10.7639104167097","1","0","0",[-2,0,0,0,0,0,1,0]], -"footlambert":["1","3.14159265358979","0","0",[-2,0,0,0,0,0,1,0]], -"fortnight":["1209600","1","0","0",[0,0,1,0,0,0,0,0]], -"fps":["0.3048","1","0","0",[1,0,-1,0,0,0,0,0]], -"franklin":["0.00000000033356","1","0","siWord",[0,0,1,1,0,0,0,0]], -"ft":["0.3048","1","0","0",[1,0,0,0,0,0,0,0]], -"ft water":["2988.874","1","0","0",[-1,1,-2,0,0,0,0,0]], -"ftc":["10.7639104167097","1","0","0",[-2,0,0,0,0,0,1,0]], -"ftl":["3.426259","1","0","0",[-2,0,0,0,0,0,1,0]], -"furlong":["201.168","1","0","0",[1,0,0,0,0,0,0,0]], -"g":["0.001","1","0","siSymbol",[0,1,0,0,0,0,0,0]], -"gal":["0.003785411784","1","0","0",[3,0,0,0,0,0,0,0]], -"galileo":["0.01","1","0","siWord",[1,0,-2,0,0,0,0,0]], -"gallon":["0.003785411784","1","0","0",[3,0,0,0,0,0,0,0]], -"gauss":["0.0001","1","0","siSymbol",[-2,-2,-2,-1,0,0,0,0]], -"gigabyte":["8589934592","1","0","0",[0,0,0,0,0,1,0,0]], -"gilbert":["10","12.5663706143592","0","siWord",[0,0,0,0,1,0,1,0]], -"gill":["0.003785411784","32","0","0",[3,0,0,0,0,0,0,0]], -"gon":["3.14159265358979","200","0","0",[0,0,0,0,0,0,0,0]], -"gongjin":["1","1","0","siSymbol",[0,1,0,0,0,0,0,0]], -"gongli":["1000","1","0","siSymbol",[1,0,0,0,0,0,0,0]], -"gpd":["0.003785411784","86400","0","0",[3,0,-1,0,0,0,0,0]], -"gph":["0.003785411784","3600","0","0",[3,0,-1,0,0,0,0,0]], -"gpm":["0.003785411784","60","0","0",[3,0,-1,0,0,0,0,0]], -"gps":["0.003785411784","1","0","0",[3,0,-1,0,0,0,0,0]], -"gr":["0.00006479891","1","0","0",[0,1,0,0,0,0,0,0]], -"grad":["3.14159265358979","200","0","0",[0,0,0,0,0,0,0,0]], -"grain":["0.00006479891","1","0","0",[0,1,0,0,0,0,0,0]], -"gram":["0.001","1","0","0",[0,1,0,0,0,0,0,0]], -"gramme":["0.001","1","0","0",[0,1,0,0,0,0,0,0]], -"gray":["1","1","0","0",[2,0,-2,0,0,0,0,0]], -"great year":["814000000000","1","0","0",[0,0,1,0,0,0,0,0]], -"gsm":["0.001","1","0","0",[-2,1,0,0,0,0,0,0]], -"gutenberg":["0.0254","7200","0","0",[1,0,0,0,0,0,0,0]], -"gōngjin":["1","1","0","siSymbol",[0,1,0,0,0,0,0,0]], -"gōngli":["1000","1","0","siSymbol",[1,0,0,0,0,0,0,0]], -"h":["3600","1","0","0",[0,0,1,0,0,0,0,0]], -"ha":["10000","1","0","siSymbol",[2,0,0,0,0,0,0,0]], -"hand":["0.1016","1","0","0",[1,0,0,0,0,0,0,0]], -"hectare":["10000","1","0","siWord",[2,0,0,0,0,0,0,0]], -"helek":["10","3","0","0",[0,0,1,0,0,0,0,0]], -"hemisphere":["6.28318530717959","1","0","0",[0,0,0,0,0,0,0,0]], -"henrie":["1","1","0","siWord",[2,1,-2,-2,0,0,0,0]], -"henry":["1","1","0","siWord",[2,1,-2,-2,0,0,0,0]], -"hertz":["1","1","0","siWord",[0,0,-1,0,0,0,0,0]], -"hk":["735.49875","1","0","0",[2,1,-3,0,0,0,0,0]], -"horsepower":["745.69987158227","1","0","0",[2,1,-3,0,0,0,0,0]], -"hour":["3600","1","0","0",[0,0,1,0,0,0,0,0]], -"hp":["745.69987158227","1","0","0",[2,1,-3,0,0,0,0,0]], -"hpE":["746","1","0","0",[2,1,-3,0,0,0,0,0]], -"hpI":["745.69987158227","1","0","0",[2,1,-3,0,0,0,0,0]], -"hpM":["735.49875","1","0","0",[2,1,-3,0,0,0,0,0]], -"hpS":["9812.5","1","0","0",[2,1,-3,0,0,0,0,0]], -"hr":["3600","1","0","0",[0,0,1,0,0,0,0,0]], -"in":["0.0254","1","0","0",[1,0,0,0,0,0,0,0]], -"in Hg":["3863.8","1","0","0",[-1,1,-2,0,0,0,0,0]], -"inch":["0.0254","1","0","0",[1,0,0,0,0,0,0,0]], -"inche":["0.0254","1","0","0",[1,0,0,0,0,0,0,0]], -"jansky":["1e-26","1","0","0",[0,1,-2,0,0,0,0,0]], -"jar":["1","900000000","0","0",[-2,-1,4,2,0,0,0,0]], -"joule":["1","1","0","0",[2,1,-2,0,0,0,0,0]], -"k":["4448.2216152605","1","0","0",[1,1,-2,0,0,0,0,0]], -"kB":["8192","1","0","0",[0,0,0,0,0,1,0,0]], -"kB":["8192","1","0","0",[0,0,0,0,0,1,0,0]], -"kairi":["1852","1","0","0",[1,0,0,0,0,0,0,0]], -"kanal":["505.8570528","1","0","0",[2,0,0,0,0,0,0,0]], -"katal":["6.02214179e+23","1","0","siWord",[0,0,-1,0,0,1,0,0]], -"kcal":["4186.8","1","0","0",[2,1,-2,0,0,0,0,0]], -"kcmil":["5.06707479097497e-07","1","0","0",[2,0,0,0,0,0,0,0]], -"keg":["0.058673882652","1","0","0",[3,0,0,0,0,0,0,0]], -"kelvin":["1","1","0","0",[0,0,0,0,1,0,0,0]], -"kgf":["9.80665","1","0","0",[1,1,-2,0,0,0,0,0]], -"kilo":["1","1","0","0",[0,1,0,0,0,0,0,0]], -"kilobyte":["8192","1","0","0",[0,0,0,0,0,1,0,0]], -"kilogram":["1","1","0","0",[0,1,0,0,0,0,0,0]], -"kilogramme":["1","1","0","0",[0,1,0,0,0,0,0,0]], -"kilopond":["9.80665","1","0","0",[1,1,-2,0,0,0,0,0]], -"kip":["4448.2216152605","1","0","0",[1,1,-2,0,0,0,0,0]], -"klf":["4448.2216152605","0.3048","0","0",[0,1,-2,0,0,0,0,0]], -"kn":["1852","3600","0","0",[1,0,-1,0,0,0,0,0]], -"knot":["1852","3600","0","0",[1,0,-1,0,0,0,0,0]], -"kp":["9.80665","1","0","0",[1,1,-2,0,0,0,0,0]], -"kpf":["4448.2216152605","0.3048","0","0",[0,1,-2,0,0,0,0,0]], -"kph":["1000/3600","1","0","0",[1,0,-1,0,0,0,0,0]], -"kpph":["1000/3600","1","0","0",[-1,1,-3,0,0,0,0,0]], -"ks":["735.49875","1","0","0",[2,1,-3,0,0,0,0,0]], -"ksf":["47880.2589803358","1","0","0",[-1,1,-2,0,0,0,0,0]], -"ksi":["6894757.29316836","1","0","0",[-1,1,-2,0,0,0,0,0]], -"kwh":["3600000","1","0","0",[2,1,-2,0,0,0,0,0]], -"l":["0.001","1","0","siSymbol",[3,0,0,0,0,0,0,0]], -"lambert":["10000","3.14159265358979","0","0",[-2,0,0,0,0,0,1,0]], -"lb":["0.45359237","1","0","0",[0,1,0,0,0,0,0,0]], -"lbf":["4.4482216152605","1","0","0",[1,1,-2,0,0,0,0,0]], -"lbm":["0.45359237","1","0","0",[0,1,0,0,0,0,0,0]], -"league":["5556","1","0","0",[1,0,0,0,0,0,0,0]], -"lf":["0.3048","1","0","0",[1,0,0,0,0,0,0,0]], -"li":["500","1","0","0",[1,0,0,0,0,0,0,0]], -"light year":["9460730472580800","1","0","0",[1,0,0,0,0,0,0,0]], -"link":["0.201168","1","0","0",[1,0,0,0,0,0,0,0]], -"liter":["0.001","1","0","siWord",[3,0,0,0,0,0,0,0]], -"litre":["0.001","1","0","siWord",[3,0,0,0,0,0,0,0]], -"lm":["1","1","0","siSymbol",[0,0,0,0,0,0,1,0]], -"long ton":["1016.0469088","1","0","0",[0,1,0,0,0,0,0,0]], -"lt":["1016.0469088","1","0","0",[0,1,0,0,0,0,0,0]], -"ltpd":["0.0117598021851852","1","0","0",[0,1,-1,0,0,0,0,0]], -"lumen":["1","1","0","siWord",[0,0,0,0,0,0,1,0]], -"lunar day":["89416.32","1","0","0",[0,0,1,0,0,0,0,0]], -"lunar month":["2551442.976","1","0","0",[0,0,1,0,0,0,0,0]], -"lux":["1","1","0","siWord",[-2,0,0,0,0,0,1,0]], -"lx":["1","1","0","siSymbol",[-2,0,0,0,0,0,1,0]], -"m":["1","1","0","siSymbol",[1,0,0,0,0,0,0,0]], -"mD":["9.869233e-16","1","0","0",[2,0,0,0,0,0,0,0]], -"marathon":["42195","1","0","0",[1,0,0,0,0,0,0,0]], -"marla":["25.29285264","1","0","0",[2,0,0,0,0,0,0,0]], -"mas":["3.14159265358979","648000000","0","0",[0,0,0,0,0,0,0,0]], -"maxwell":["0.00000001","1","0","siSymbol",[2,1,-2,-1,0,0,0,0]], -"mb":["100","1","0","0",[-1,1,-2,0,0,0,0,0]], -"megabyte":["8388608","1","0","0",[0,0,0,0,0,1,0,0]], -"megaton TNT":["4184000000000000","1","0","0",[2,1,-2,0,0,0,0,0]], -"megatons TNT":["4184000000000000","1","0","0",[2,1,-2,0,0,0,0,0]], -"megohm":["1000000","1","0","0",[2,1,-3,-2,0,0,0,0]], -"meter":["1","1","0","siWord",[1,0,0,0,0,0,0,0]], -"metre":["1","1","0","siWord",[1,0,0,0,0,0,0,0]], -"metric horsepower":["735.49875","1","0","0",[2,1,-3,0,0,0,0,0]], -"metric ton":["1000","1","0","0",[0,1,0,0,0,0,0,0]], -"mgd":["3785.411784","86400","0","0",[3,0,-1,0,0,0,0,0]], -"mho":["1","1","0","0",[-2,-1,3,2,0,0,0,0]], -"mi":["1609.344","1","0","0",[1,0,0,0,0,0,0,0]], -"mil":["0.0000254","1","0","0",[1,0,0,0,0,0,0,0]], -"mile":["1609.344","1","0","0",[1,0,0,0,0,0,0,0]], -"min":["60","1","0","0",[0,0,1,0,0,0,0,0]], -"minute":["60","1","0","0",[0,0,1,0,0,0,0,0]], -"moa":["3.14159265358979","10800","0","0",[0,0,0,0,0,0,0,0]], -"mol":["6.02214179e+23","1","0","0",[0,0,0,0,0,1,0,0]], -"mole":["6.02214179e+23","1","0","0",[0,0,0,0,0,1,0,0]], -"mpg":["1609.344","0.003785411784","0","0",[-2,0,0,0,0,0,0,0]], -"mph":["0.44704","1","0","0",[1,0,-1,0,0,0,0,0]], -"mt":["1000","1","0","0",[0,1,0,0,0,0,0,0]], -"nautical mile":["1852","1","0","0",[1,0,0,0,0,0,0,0]], -"newton":["1","1","0","0",[1,1,-2,0,0,0,0,0]], -"nit":["1","1","0","0",[-2,0,0,0,0,0,1,0]], -"ohm":["1","1","0","siWord",[2,1,-3,-2,0,0,0,0]], -"ounce":["0.45359237","16","0","0",[0,1,0,0,0,0,0,0]], -"oz":["0.45359237","16","0","0",[0,1,0,0,0,0,0,0]], -"oz t":["0.0311034768","1","0","0",[0,1,0,0,0,0,0,0]], -"parsec":["30856780000000000","1","0","0",[1,0,0,0,0,0,0,0]], -"pc":["0.0254","6","0","0",[1,0,0,0,0,0,0,0]], -"pcf":["4.4482216152605","0.028316846592","0","0",[-2,1,-2,0,0,0,0,0]], -"pci":["4.4482216152605","0.000016387064","0","0",[-2,1,-2,0,0,0,0,0]], -"pebibyte":["9007199254740990","1","0","0",[0,0,0,0,0,1,0,0]], -"peck":["0.00880976754172","1","0","0",[3,0,0,0,0,0,0,0]], -"perfect ream":["516","1","0","0",[0,0,0,0,0,1,0,0]], -"person":["1","1","0","0",[0,0,0,0,0,1,0,0]], -"petabyte":["9007199254740990","1","0","0",[0,0,0,0,0,1,0,0]], -"pfd":["0.5","1","0","0",[0,1,0,0,0,0,0,0]], -"pferdestärke":["735.49875","1","0","0",[2,1,-3,0,0,0,0,0]], -"pfund":["0.5","1","0","0",[0,1,0,0,0,0,0,0]], -"phot":["10000","1","0","0",[-2,0,0,0,0,0,1,0]], -"pica":["0.0254","6","0","0",[1,0,0,0,0,0,0,0]], -"pied du roi":["9000","27706","0","0",[1,0,0,0,0,0,0,0]], -"pieze":["1000","1","0","0",[-1,1,-2,0,0,0,0,0]], -"pint":["0.000473176473","1","0","0",[3,0,0,0,0,0,0,0]], -"pk":["735.49875","1","0","0",[2,1,-3,0,0,0,0,0]], -"platonic year":["814000000000","1","0","0",[0,0,1,0,0,0,0,0]], -"plf":["4.4482216152605","0.3048","0","0",[0,1,-2,0,0,0,0,0]], -"point":["0.0254","72","0","0",[1,0,0,0,0,0,0,0]], -"poise":["0.1","1","0","siWord",[-1,1,-1,0,0,0,0,0]], -"pound":["0.45359237","1","0","0",[0,1,0,0,0,0,0,0]], -"poundal":["4.4482216152605","32.174","0","0",[1,1,-2,0,0,0,0,0]], -"ppm":["0.000001","1","0","0",[0,0,0,0,0,0,0,0]], -"ppmdv":["0.000001","1","0","0",[0,0,0,0,0,0,0,0]], -"ppmv":["0.000001","1","0","0",[0,0,0,0,0,0,0,0]], -"ppmw":["0.000001","1","0","0",[0,0,0,0,0,0,0,0]], -"printer's point":["0.0003515","1","0","0",[1,0,0,0,0,0,0,0]], -"printer's ream":["516","1","0","0",[0,0,0,0,0,1,0,0]], -"ps":["735.49875","1","0","0",[2,1,-3,0,0,0,0,0]], -"psf":["4.4482216152605","0.09290304","0","0",[-1,1,-2,0,0,0,0,0]], -"psi":["4.4482216152605","0.00064516","0","0",[-1,1,-2,0,0,0,0,0]], -"psia":["6894.75729316836","1","0","0",[-1,1,-2,0,0,0,0,0]], -"psig":["6894.75729316836","1","14.6959","0",[-1,1,-2,0,0,0,0,0]], -"px":["0.0254","96","0","0",[1,0,0,0,0,0,0,0]], -"pz":["1000","1","0","0",[-1,1,-2,0,0,0,0,0]], -"quart":["0.003785411784","4","0","0",[3,0,0,0,0,0,0,0]], -"quire":["25","1","0","0",[0,0,0,0,0,1,0,0]], -"rad":["1","1","0","0",[0,0,0,0,0,0,0,0]], -"radian":["1","1","0","0",[0,0,0,0,0,0,0,0]], -"rankin":["5","9","0","0",[0,0,0,0,1,0,0,0]], -"rd":["0.01","1","0","siSymbol",[2,0,-2,0,0,0,0,0]], -"real":["1","1","0","BRL",[0,0,0,0,0,0,0,1]], -"ream":["500","1","0","0",[0,0,0,0,0,1,0,0]], -"rem":["0.01","1","0","siSymbol",[2,0,-2,0,0,0,0,0]], -"rev":["6.28318530717959","1","0","0",[0,0,0,0,0,0,0,0]], -"rod":["5.0292","1","0","0",[1,0,0,0,0,0,0,0]], -"roentgen":["0.000258","1","0","siWord",[0,-1,1,1,0,0,0,0]], -"rpm":["6.28318530717959","3600","0","0",[0,0,-1,0,0,0,0,0]], -"ruble":["1","1","0","RUB",[0,0,0,0,0,0,0,1]], -"röntgen":["0.000258","1","0","siWord",[0,-1,1,1,0,0,0,0]], -"s":["1","1","0","siSymbol",[0,0,1,0,0,0,0,0]], -"saltspoon":["0.003785411784","3072","0","0",[3,0,0,0,0,0,0,0]], -"scf":["0.028316846592","1","0","0",[3,0,0,0,0,0,0,0]], -"scfd":["0.028316846592","86400","0","0",[3,0,-1,0,0,0,0,0]], -"scfh":["0.028316846592","3600","0","0",[3,0,-1,0,0,0,0,0]], -"scfm":["0.028316846592","60","0","0",[3,0,-1,0,0,0,0,0]], -"sea mile":["1852","1","0","0",[1,0,0,0,0,0,0,0]], -"sec":["1","1","0","0",[0,0,1,0,0,0,0,0]], -"second":["1","1","0","0",[0,0,1,0,0,0,0,0]], -"section":["2589988.110336","1","0","0",[2,0,0,0,0,0,0,0]], -"sennight":["604800","1","0","0",[0,0,1,0,0,0,0,0]], -"sheet":["1","1","0","0",[0,0,0,0,0,1,0,0]], -"short ream":["480","1","0","0",[0,0,0,0,0,1,0,0]], -"short ton":["907.18474","1","0","0",[0,1,0,0,0,0,0,0]], -"siemen":["1","1","0","siWord",[-2,-1,3,2,0,0,0,0]], -"sievert":["1","1","0","siWord",[2,0,-2,0,0,0,0,0]], -"slinch":["175.126835246477","1","0","0",[0,1,0,0,0,0,0,0]], -"slug":["14.5939029372064","1","0","0",[0,1,0,0,0,0,0,0]], -"smoot":["1.7018","1","0","0",[0,1,0,0,0,0,0,0]], -"span":["0.2286","1","0","0",[1,0,0,0,0,0,0,0]], -"sphere":["12.5663706143592","1","0","0",[0,0,0,0,0,0,0,0]], -"sq ft":["0.09290304","1","0","0",[2,0,0,0,0,0,0,0]], -"sq in":["0.00064516","1","0","0",[2,0,0,0,0,0,0,0]], -"sq km":["1000000","1","0","0",[2,0,0,0,0,0,0,0]], -"sq mi":["2589988.110336","1","0","0",[2,0,0,0,0,0,0,0]], -"sq yd":["0.83612736","1","0","0",[2,0,0,0,0,0,0,0]], -"square degree":["0.000304617419786709","1","0","0",[0,0,0,0,0,0,0,0]], -"square meter":["1","1","0","0",[2,0,0,0,0,0,0,0]], -"square metre":["1","1","0","0",[2,0,0,0,0,0,0,0]], -"square mi":["2589988.110336","1","0","0",[2,0,0,0,0,0,0,0]], -"sr":["1","1","0","siSymbol",[0,0,0,0,0,0,0,0]], -"ssp":["0.003785411784","3072","0","0",[3,0,0,0,0,0,0,0]], -"standard volume":["22.414","1","0","0",[3,0,0,0,0,0,0,0]], -"statampere":["0.00000000033356","1","0","0",[0,0,0,1,0,0,0,0]], -"statcoulomb":["0.00000000033356","1","0","0",[0,0,1,1,0,0,0,0]], -"statfarad":["0.0000000000011126","1","0","0",[-2,-1,4,2,0,0,0,0]], -"stathenrie":["898760000000","1","0","0",[2,1,-2,-2,0,0,0,0]], -"stathenry":["898760000000","1","0","0",[2,1,-2,-2,0,0,0,0]], -"statohm":["898760000000","1","0","0",[2,1,-3,-2,0,0,0,0]], -"statvolt":["299.79","1","0","0",[2,1,-3,-1,0,0,0,0]], -"statwatt":["0.0000001","1","0","0",[2,1,-3,0,0,0,0,0]], -"steam horsepower":["9812.5","1","0","0",[2,1,-3,0,0,0,0,0]], -"steradian":["1","1","0","0",[0,0,0,0,0,0,0,0]], -"stere":["1","1","0","0",[3,0,0,0,0,0,0,0]], -"stoke":["0.0001","1","0","0",[2,0,-1,0,0,0,0,0]], -"stone":["6.35029318","1","0","0",[0,1,0,0,0,0,0,0]], -"stpd":["0.0104998233796296","1","0","0",[0,1,-1,0,0,0,0,0]], -"stunde":["3600","1","0","0",[0,0,1,0,0,0,0,0]], -"survey feet":["1200","3937","0","0",[1,0,0,0,0,0,0,0]], -"survey foot":["1200","3937","0","0",[1,0,0,0,0,0,0,0]], -"Sv":["1","1","0","siSymbol",[2,0,-2,0,0,0,0,0]], -"sverdrup":["1000000","1","0","0",[3,0,-1,0,0,0,0,0]], -"sym":["1","1","0","siSymbol",[0,0,0,0,0,1,0,0]], -"tablespoon":["0.003785411784","256","0","0",[3,0,0,0,0,0,0,0]], -"tbsp":["0.003785411784","256","0","0",[3,0,0,0,0,0,0,0]], -"teaspoon":["0.003785411784","768","0","0",[3,0,0,0,0,0,0,0]], -"tebibyte":["8796093022208","1","0","0",[0,0,0,0,0,1,0,0]], -"terabyte":["8796093022208","1","0","0",[0,0,0,0,0,1,0,0]], -"tesla":["1","1","0","siSymbol",[-2,-2,-2,-1,0,0,0,0]], -"therm":["105480400","1","0","0",[2,1,-2,0,0,0,0,0]], -"tidal day":["89416.32","1","0","0",[0,0,1,0,0,0,0,0]], -"ton":["907.18474","1","0","0",[0,1,0,0,0,0,0,0]], -"tonf":["8896.443230521","1","0","0",[1,1,-2,0,0,0,0,0]], -"ton TNT":["4184000000","1","0","0",[2,1,-2,0,0,0,0,0]], -"ton refrigeration":["3516.8532","1","0","0",[2,1,-3,0,0,0,0,0]], -"tonne":["1000","1","0","0",[0,1,0,0,0,0,0,0]], -"tons TNT":["4184000000","1","0","0",[2,1,-2,0,0,0,0,0]], -"tons refrigeration":["3516.8532","1","0","0",[2,1,-3,0,0,0,0,0]], -"township":["93239571.972096","1","0","0",[2,0,0,0,0,0,0,0]], -"toz":["0.0311034768","1","0","0",[0,1,0,0,0,0,0,0]], -"tpy":["0.0000287475400032297","1","0","0",[0,1,-1,0,0,0,0,0]], -"tropical year":["31556925.9747","1","0","0",[0,0,1,0,0,0,0,0]], -"troy ounce":["0.0311034768","1","0","0",[0,1,0,0,0,0,0,0]], -"tsp":["0.003785411784","768","0","0",[3,0,0,0,0,0,0,0]], -"turn":["6.28318530717958","1","0","0",[0,0,0,0,0,0,0,0]], -"twip":["0.0254","1440","0","0",[1,0,0,0,0,0,0,0]], -"unit":["1","1","0","0",[0,0,0,0,0,1,0,0]], -"vapeur":["735.49875","1","0","0",[2,1,-3,0,0,0,0,0]], -"var":["1","1","0","siSymbol",[2,1,-3,0,0,0,0,0]], -"varistor":["1","1","0","siWord",[2,1,-3,0,0,0,0,0]], -"volt":["1","1","0","siWord",[2,1,-3,-1,0,0,0,0]], -"watt":["1","1","0","siWord",[2,1,-3,0,0,0,0,0]], -"weber":["1","1","0","siSymbol",[2,1,-2,-1,0,0,0,0]], -"week":["604800","1","0","0",[0,0,1,0,0,0,0,0]], -"won":["1","1","0","KRW",[0,0,0,0,0,0,0,1]], -"wppm":["0.000001","1","0","0",[0,0,0,0,0,0,0,0]], -"yard":["0.9144","1","0","0",[1,0,0,0,0,0,0,0]], -"yd":["0.9144","1","0","0",[1,0,0,0,0,0,0,0]], -"year":["31556952","1","0","0",[0,0,1,0,0,0,0,0]], -"yen":["1","1","0","JPY",[0,0,0,0,0,0,0,1]], -"£":["1","1","0","GBP",[0,0,0,0,0,0,0,1]], -"¥":["1","1","0","JPY",[0,0,0,0,0,0,0,1]], -"°":["3.14159265358979","180","0","0",[0,0,0,0,0,0,0,0]], -"°C":["1","1","273.15","0",[0,0,0,0,1,0,0,0]], -"°F":["5","9","459","0",[0,0,0,0,1,0,0,0]], -"°K":["1","1","0","0",[0,0,0,0,1,0,0,0]], -"°R":["5","9","0","0",[0,0,0,0,1,0,0,0]], -"°R":["5","9","0","0",[0,0,0,0,1,0,0,0]], -"Å":["0.0000000001","1","0","0",[1,0,0,0,0,0,0,0]], -"Ω":["1","1","0","siSymbol",[2,1,-3,-2,0,0,0,0]], -"”":["0.0254","1","0","0",[1,0,0,0,0,0,0,0]], -"₨":["1","1","0","INR",[0,0,0,0,0,0,0,1]], -"₪":["1","1","0","ILS",[0,0,0,0,0,0,0,1]], -"€":["1","1","0","EUR",[0,0,0,0,0,0,0,1]], -"℃":["1","1","273.15","0",[0,0,0,0,1,0,0,0]], -"℉":["5","9","459","0",[0,0,0,0,1,0,0,0]], -"Ω":["1","1","0","siSymbol",[2,1,-3,-2,0,0,0,0]], -"K":["1","1","0","0",[0,0,0,0,1,0,0,0]], -"Å":["0.0000000001","1","0","0",[1,0,0,0,0,0,0,0,0]] -}`)); - -const synonyms = Object.freeze({ - "$": "USD", - "US$": "USD", - "dollar": "USD", - "A$": "AUD", - "Australian dollar": "AUD", - "Brazilian Real": "BRL", - "real": "BRL", - "R$": "BRL", - "British Pound": "GBP", - "£": "GBP", - "C$": "CAD", - "Canadian dollar": "CAD", - "Chinese Yuan": "CNY", - "€": "EUR", - "Euro": "EUR", - "euro": "EUR", - "HK$": "HKD", - "Hong Kong dollar":"HKD", - "Indian Rupee": "IDR", - "₨": "IDR", - "Israeli New Shekel": "ILS", - "₪": "ILS", - "Mexican Peso": "MXN", - "Swiss Franc": "CHF", - "Won": "KRW", - "won": "KRW", - "yen": "JPY", - "Yen": "JPY", - "Japanese Yen": "JPY", - "¥": "JPY" -}); - -const unitFromWord = (inputStr) => { - const str = inputStr.trim(); - const L = str.length; - const u = { - name: str, - factor: Rnl.one, - gauge: Rnl.zero, - log: "", - expos: [0, 0, 0, 0, 0, 0, 0, 0] - }; - if (inputStr === "") { return u } - let word = ""; - let unitArray; - let doTheSearch = false; - let prefix = ""; - let gotSiPrefixUnit = false; - let gotMatch = false; - - for (let iPass = 1; iPass < 3; iPass++) { - if (iPass === 1) { - // The first pass will search with the assumption of no short-form SI prefix. - // We will, however, check for a long form SI prefix if the word is long enough. - - doTheSearch = true; - word = str; - - // Translate plural to signular - if (L > 2) { - if (word.charAt(word.length - 1) === "s") { - if (!(word === "cfs" || (L === 3 & word.charAt(1) === "p"))) { - word = word.slice(0, -1); - } - } - } - - let prefix = ""; - if (L > 3) { - const match = /^(yotta|zetta|exa|peta|tera|giga|mega|kilo|hecto|deka|deci|centi|milli|micro|nano|pico|femto|atto|zepto|yocto)/.exec(word); - if (match) { - prefix = match[0].value; - doTheSearch = true; - word = word.slice(prefix.length); - } - } - } else { - // We're in the second pass. Try an SI short-form prefix. - doTheSearch = false; - prefix = word.charAt(0); - if ("YZEPTGMkhdcmnpfazyµμ".indexOf(prefix) > -1) { - doTheSearch = true; - word = word.substring(1); - } - } - - if (doTheSearch) { - unitArray = unitTable[word]; - if (unitArray) { gotMatch = true; } - if (iPass === 1 && gotMatch && prefix === "") { - break - } else if (gotMatch) { - if (iPass === 1) { - gotMatch = (unitArray[3] === "siWord"); - gotSiPrefixUnit = true; - break - } else { - gotMatch = (unitArray[3] === "siSymbol"); - gotSiPrefixUnit = true; - } - } - } - } - - if (gotMatch) { - u.gauge = Rnl.fromString(unitArray[2]); - u.expos = Object.freeze(unitArray[4]); - if (u.expos[7] === 1) { - const currencyCode = (synonyms[word] ? synonyms[word] : word); - // Read the line whose key is the standard 3-letter currency code. - unitArray = unitTable[currencyCode]; - if (unitArray[0] === "0") { - return errorOprnd("CURRENCY") - } else { - u.factor = Rnl.reciprocal(Rnl.fromString(unitArray[0])); - } - } else { - // TODO: Change factor table to integers and use BigInt() instead of Rnl.fromString - u.factor = Rnl.divide(Rnl.fromString(unitArray[0]), Rnl.fromString(unitArray[1])); - } - - if (gotSiPrefixUnit) { - u.factor = Rnl.multiply(u.factor, Rnl.fromNumber(prefixFactor[prefix])); - } - - // TODO: Logarithmic units like dB or EMM -// const misc = unitArray[3] // SI prefix, or logarithm data, or 3-letter currency code -// if (misc === "10") { -// u.log = "°" -// } else if (misc === "10+") { -// u.log = "10+" + " " + u.gauge + " " + u.factor -// } - - } else { - return errorOprnd("UNIT_NAME", str) - } - - return Object.freeze(u) -}; - -const opOrNumRegEx = /[0-9·\-⁰¹²³\u2074-\u2079⁻/^()]/; -const numeralRegEx = /[0-9-]/; -const opRegEx = /^[·/\-^]$/; - -const unitFromUnitName = (inputStr) => { - - // TODO: Handle ° ʹ ″ - - if (!inputStr) { return { name: null, factor: null, gauge: null, log: "", expos: null } } - - let str = inputStr.trim(); - // Replace dashes & bullets with half-high dot - str = str.replace(/[*.•×\-−](?![0-9.])/g, "·"); - - // Create a unit object with default values. - const u = { name: str, factor: Rnl.one, gauge: Rnl.zero, log: "", expos: allZeros }; - - if (str === "") { - return u - } else if (str === "°" || str === "°ʹ" || str === "degMinSec") { - u.factor = Rnl.fromString("0.0174532925199433"); - return u - } else if (str === "feetInch") { - u.unitExpos = [1, 0, 0, 0, 0, 0, 0, 0]; - u.factor = Rnl.fromString("0.3048"); - return u - } else if (str === "″" || str === "ʹʹ") { - // TODO: Move to unitTable - u.unitExpos = [1, 0, 0, 0, 0, 0, 0, 0]; - u.factor = Rnl.fromString("0.0254"); - return u - } - - // Parse str for compound units - const tokenSep = ";"; - let inExponent = false; - let ch = ""; - let word = ""; - let rpnString = ""; - let expoRpnString = ""; - const expoQueue = []; - let iQueue = 0; - const opStack = [{ symbol: "", prec: -1 }]; - let simpleUnit = ""; - - // Operator Precedence for shunting yard algorithm - // 0 ( ) parentheses - // 1 · / multiplication or division - // 2 - unary minus operator - // 3 ^ exponentiation, right-to-left - - for (let i = 0; i < str.length; i++) { - ch = str.charAt(i); - - if (numeralRegEx.test(ch)) { - if (!inExponent) { - rpnString += tokenSep; - expoRpnString += tokenSep; - opStack.push({ symbol: "^", prec: 3 }); - inExponent = true; - } - rpnString += ch; // Append numbers directly to the RPN string. - expoRpnString += ch; - - } else if (exponentRegEx.test(ch)) { - if (!inExponent) { - rpnString += tokenSep; - expoRpnString += tokenSep; - opStack.push({ symbol: "^", prec: 3 }); - inExponent = true; - } - const asciiCh = numeralFromSuperScript(ch); - rpnString += asciiCh; // Append numbers directly to the RPN string. - expoRpnString += asciiCh; - - } else if (ch === "^") { - // The "^" character is not required, but it is permitted. - rpnString += tokenSep; - expoRpnString += tokenSep; - opStack.push({ symbol: "^", prec: 3 }); - inExponent = true; - - } else if (ch === "·" || ch === "/") { - inExponent = false; - rpnString += tokenSep; - expoRpnString += tokenSep; - while (opStack[opStack.length - 1].prec >= 1) { - const symbol = opStack.pop().symbol; - rpnString += symbol + tokenSep; - expoRpnString += symbol + tokenSep; - } - opStack.push({ symbol: ch, prec: 1 }); - - } else if (ch === "(") { - opStack.push({ symbol: "(", prec: 0 }); - - } else if (ch === ")") { - while (opStack[opStack.length - 1].prec > 0) { - const symbol = opStack.pop().symbol; - rpnString += symbol + tokenSep; - expoRpnString += symbol + tokenSep; - } - opStack.pop(); // Discard the opening parenthesis. - inExponent = false; - - } else if (ch === "-") { // Negative unary operator at the start of an exponent. - inExponent = true; - opStack.push({ symbol: "^", prec: 3 }); - opStack.push({ symbol: "-", prec: 2 }); - rpnString += tokenSep; - expoRpnString += tokenSep; - - } else { - inExponent = false; - let j; - for (j = i + 1; j < str.length; j++) { - if (opOrNumRegEx.test(str.charAt(j))) { break } - } - word = str.substring(i, j); // May actually be two words, as in "nautical miles" - simpleUnit = unitFromWord(word); - - if (simpleUnit.dtype && simpleUnit.dtype === dt.ERROR) { return simpleUnit } - - if (simpleUnit.factor === 0) { - u.name = ""; - return u - } - - rpnString += String(simpleUnit.factor[0]) + "," + String(simpleUnit.factor[1]); - expoRpnString += "¿" + iQueue; - expoQueue.push(simpleUnit.expos); - iQueue += 1; - - i = j - 1; - } - - } - - if (word === u.name) { - return Object.freeze(simpleUnit) - } - - // All the input characters have been addresssed. Clear the opStack. - while (opStack.length > 1) { - const symbol = opStack.pop().symbol; - rpnString += tokenSep + symbol; - expoRpnString += tokenSep + symbol; - } - - // Now, resolve the RPN string - const factors = []; - const expoStack = []; - const rpnArray = rpnString.split(tokenSep); - const expoRpnArray = expoRpnString.split(tokenSep); - let val2 = 1; - let e2; - iQueue = 0; - - for (let i = 0; i < rpnArray.length; i++) { - if (opRegEx.test(rpnArray[i])) { - val2 = factors.pop(); - e2 = expoStack.pop(); - } - - switch (rpnArray[i]) { - case "·": - factors[factors.length - 1] = Rnl.multiply(factors[factors.length - 1], val2); - expoStack[expoStack.length - 1] = expoStack[expoStack.length - 1].map((el, j) => { - return el + e2[j] - }); - break - - case "/": - // TODO: Rewrite next line. - if (Rnl.isZero(val2)) { return errorOprnd("DIV") } - factors[factors.length - 1] = Rnl.divide(factors[factors.length - 1], val2); - expoStack[expoStack.length - 1] = expoStack[expoStack.length - 1].map((el, j) => { - return el - e2[j] - }); - break - - case "^": - factors[factors.length - 1] = Rnl.power(factors[factors.length - 1], val2); - expoStack[expoStack.length - 1] = expoStack[expoStack.length - 1].map((el) => el * e2); - break - - case "-": // Negative unary operator - factors[factors.length - 1] = Rnl.negate(factors[factors.length - 1]); - break - - default: - if (rpnArray[i].indexOf(",") > -1) { - const ints = rpnArray[i].split(","); - factors.push([BigInt(ints[0]), BigInt(ints[1])]); - } else { - factors.push([BigInt(rpnArray[i]), BigInt(1)]); - } - if (expoRpnArray[i].charAt(0) === "¿") { - expoStack.push(expoQueue[iQueue]); - iQueue += 1; - } else { - expoStack.push(expoRpnArray[i]); - } - } - } - - u.factor = Object.freeze(factors.pop()); - u.expos = Object.freeze(expoStack.pop()); - return Object.freeze(u) -}; - -/* eslint-disable */ - -/* - * This file implements a complex number data type. - * Each complex number, z, is held as an array containing two rational number. - * z[0] is the real part and z[1] is the imaginary part. - * - * This module is a work in progress. - */ - -const j = [Rnl.zero, Rnl.one]; - -const isComplex = a => { - return Array.isArray(a) && a.length === 2 - && Rnl.isRational(a[0]) && Rnl.isRational(a[1]) -}; - -const real = z => z[0]; -const imag = z => z[1]; -const abs = z => Rnl.hypot(z[0], z[1]); -const negate = z => [Rnl.negate(z[0]), Rnl.negate(z[1])]; -const conjugate = z => [z[0], Rnl.negate(z[1])]; - -const angle = (z) => { - // For a complex number z, the angle (in radians) from - // the positive real axis to the vector representing z. + implies counter-clockwise. - // Electrical engineers call this the phase angle of the complex number. - if (Rnl.isZero(z[0]) && Rnl.isZero(z[1])) { - return errorOprnd("ORIGIN", "angle") - } else if (Rnl.isZero(z[1])) { - return Rnl.isPositive(z[0]) ? Rnl.zero : Rnl.pi - } else if (Rnl.isZero(z[0])) { - return Rnl.isPositive(z[1]) - ? Rnl.divide(Rnl.pi, Rnl.two) - : Rnl.negate(Rnl.divide(Rnl.pi, Rnl.two)) - } else { - return Rnl.fromNumber(Math.atan2(Rnl.toNumber(z[1]), Rnl.toNumber(z[0]))) - } -}; - -const add = (x, y) => [Rnl.add(x[0], y[0]), Rnl.add(x[1], y[1])]; -const subtract = (x, y) => [Rnl.subtract(x[0], y[0]), Rnl.subtract(x[1], y[1])]; - -const multiply = (x, y) => { - return [ - Rnl.subtract(Rnl.multiply(x[0], y[0]), Rnl.multiply(x[1], y[1])), - Rnl.add(Rnl.multiply(x[0], y[1]), Rnl.multiply(x[1], y[0])) - ] -}; - -const divide = (x, y) => { - if (!Rnl.isZero(x[1]) && !Rnl.isZero(y[1])) { - if (Rnl.lessThan(Rnl.abs(y[1]), Rnl.abs(y[0]))) { - const ratio = Rnl.divide(y[1], y[0]); - const denom = Rnl.add(y[0], Rnl.multiply(y[1], ratio)); - return [ - Rnl.divide(Rnl.add(x[0], Rnl.multiply(x[1], ratio)), denom), - Rnl.divide(Rnl.subtract(x[1], Rnl.multiply(x[0], ratio)), denom), - ] - } else { - const ratio = Rnl.divide(y[0], y[1]); - const denom = Rnl.add(y[1], Rnl.multiply(y[0], ratio)); - return [ - Rnl.divide(Rnl.add(x[1], Rnl.multiply(x[0], ratio)), denom), - Rnl.divide(Rnl.add(Rnl.negate(x[0]), Rnl.multiply(x[1], ratio)), denom), - ] - } - } else if (Rnl.isZero(x[1])) { - // real x divided by complex y - if (Rnl.lessThan(Rnl.abs(y[1]), Rnl.abs(y[0]))) { - const ratio = Rnl.divide(y[1], y[0]); - const denom = Rnl.add(y[0], Rnl.multiply(y[1], ratio)); - return [ - Rnl.divide(x[0], denom), - Rnl.negate(Rnl.multiply(x[0], Rnl.divide(ratio, denom))), - ] - } else { - const ratio = Rnl.divide(y[0], y[1]); - const denom = Rnl.add(y[1], Rnl.multiply(y[0], ratio)); - return [ - Rnl.divide(Rnl.multiply(x[0], ratio), denom), - Rnl.negate(Rnl.divide(x[0], denom)), - ] - } - } else if (Rnl.isZero(y[1])) { - // Complex x divided by real y - if (Rnl.isZero(y[0])) ; else { - return [Rnl.divide(x[0], y[0]), Rnl.divide(x[1], y[0])] - } - } else { - // both x and y are reals - if (Rnl.isZero(y[0])) { - return errorOprnd("DIV") - } else { - return [Rnl.divide(x[0], y[0]), Rnl.zero ] - } - } -}; - -const increment = z => [Rnl.increment(z[0]), z[1]]; -const decrement = z => [Rnl.decrement(z[0]), z[1]]; - -const inverse = z => { - // Complex inverse 1 / z - if (Rnl.isZero(z[1])) { - if (Rnl.isZero((z[0]))) { return errorOprnd("DIV") } - return [Rnl.inverse(z[0]), 0] - } else { - return divide([Rnl.one, Rnl.zero], z) - } -}; - -const cos = z => { - const real = Rnl.multiply(Rnl.cos(z[0]), Rnl.cosh(z[1])); - const imPart = Rnl.multiply(Rnl.negate(Rnl.sin(z[0])), Rnl.sinh(z[1])); - return [real, imPart] -}; - -const sin = z => { - const real = Rnl.multiply(Rnl.sin(z[0]), Rnl.cosh(z[1])); - const imPart = Rnl.multiply(Rnl.cos(z[0]), Rnl.sinh(z[1])); - return [real, imPart] -}; - -const log = x => { - let z = [Rnl.zero, Rnl.zero]; - // Natural (base e) logarithm of a complex number, x - if (Rnl.isZero(x[0]) && Rnl.isZero(x[1])) { - return errorOprnd("ORIGIN", "log") - } else { - z[0] = Rnl.fromNumber(Math.log(Rnl.toNumber(Rnl.hypot(x[0], x[1])))); - z[1] = angle(x); // phase angle, in radians - } - return z -}; - -const isSmall = x => Rnl.lessThan(Rnl.abs(x), [BigInt(1), BigInt(100000000000000)]); - -const exp = x => { - // Complex exponentiation - let z = [Rnl.zero, Rnl.zero]; - if (isSmall(x[1])) { - z[1] = Rnl.zero; - z[0] = Rnl.exp(x[0]); - } else { - if (Rnl.isZero(x[0])) { - z[0] = Rnl.cos(x[1]); - if (isSmall(z[0])) { z[0] = Rnl.zero; } - z[1] = Rnl.sin(x[1]); - if (isSmall(z[1])) { z[1] = Rnl.zero; } - } else { - const realExp = Rnl.exp(x[0]); - z[0] = Rnl.multiply(realExp, Rnl.cos(x[1])); - z[1] = Rnl.multiply(realExp, Rnl.sin(x[1])); - } - } - return z -}; - -const power = (x, y) =>{ - let z = [Rnl.zero, Rnl.zero]; - // powers: z = e^(log(x) × y) - if (!isComplex(y)) { - z = log(x); - z[0] = Rnl.multiply(z[0], y); - z[1] = Rnl.multiply(z[1], y); - } else if (Rnl.isZero(y[1])) { - z = log(x); - z[0] = Rnl.multiply(z[0], y[0]); - z[1] = Rnl.multiply(z[1], y[0]); - } else if (Rnl.isZero(x[1]) && !Rnl.isNegative(x[0])) { - x[0] = Rnl.fromNumber(Math.log(Rnl.toNumber(x[0]))); - z[0] = Rnl.multiply(x[0], y[0]); - z[1] = Rnl.multiply(x[0], y[1]); - } else { - x = log(x); - z[0] = Rnl.subtract(Rnl.multiply(x[0], y[0]), Rnl.multiply(x[1], y[1])); - z[1] = Rnl.add(Rnl.multiply(x[1], y[0]), Rnl.multiply(x[0], y[1])); - } - - z = exp(z); - if (isSmall(z[1])) { z[1] = Rnl.zero; } - if (isSmall(z[0])) { z[0] = Rnl.zero; } - return z -}; - -const acosh = z => { - // acosh(z) = log( z + √(z - 1) × √(z + 1) ) - return log(add(z, multiply(sqrt(decrement(z)), sqrt(increment(z))))) -}; - -const asinh = z => { - // Log(z + Sqrt(z * z + 1)) - const s = sqrt(add(multiply(z, z), [Rnl.one, Rnl.zero])); - return log(add(z, s)) -}; - -const atanh = z => { - // atanh(z) = [ log(1+z) - log(1-z) ] / 2 - return divide(subtract(log(increment(z)), log(subtract([Rnl.one, Rnl.zero], z))), [Rnl.two, Rnl.zero]) -}; - -const asin = z => { - // arcsinh (i * z) / i - return divide(asinh(multiply(j, z)), j) -}; - -const atan = z => { - // (Log(1 + iz) - Log(1 - iz)) / (2 * i) cf Kahan - const term1 = log(increment(multiply(j, z))); - const term2 = log(subtract([Rnl.one, Rnl.zero],(multiply(j, z)))); - return divide(subtract(term1, term2), [Rnl.zero, Rnl.two]) -}; - -const sqrt = x => { - const z = log(x); - z[0] = Rnl.divide(z[0], Rnl.two); - z[1] = Rnl.divide(z[1], Rnl.two); - return exp(z) -}; - -const lanczos = zPlusOne => { - // Lanczos approximation of Gamma function. - // Coefficients are from 2004 PhD thesis by Glendon Pugh. - // *An Analysis of the Lanczos Gamma Approximation* - // The following equation is from p. 116 of the Pugh thesis: - // Γ(z+1) ≈ 2 * √(e / π) * ((z + 10.900511 + 0.5) / e) ^ (z + 0.5) * sum - const z = subtract(zPlusOne, [Rnl.one, Rnl.zero]); - const sqr = Rnl.sqrt(Rnl.divide(e, pi)); - const term1 = multiply([Rnl.two, Rnl.zero], [sqr, Rnl.zero]); - const k = Rnl.fromNumber(11.400511); - const oneHalf = [[BigInt(1), BigInt(2)], Rnl.zero]; - const term2 = power(divide(add(z, [k, Rnl.zero]), [e, Rnl.zero]), add(z, oneHalf)); - - // Coefficients from Pugh, Table 8.5 - const d = ["2.48574089138753565546e-5", "1.05142378581721974210", - "-3.45687097222016235469", "4.51227709466894823700", "-2.98285225323576655721", - "1.05639711577126713077", "-0.195428773191645869583", "0.0170970543404441224307", - "-0.000571926117404305781283", "0.00000463399473359905636708", - "-0.00000000271994908488607703910"]; - - // sum = d_0 + ∑_(k=1)^10 d_k/(z+k) - let sum = [Rnl.fromString(d[0]), Rnl.zero]; - for (let k = 1; k <= 10; k++) { - const d = [Rnl.fromString(d[k]), Rnl.zero]; - const complexK = [Rnl.fromNumber(k), Rnl.zero]; - sum = add(sum, divide(d, add(z, complexK))); - } - - return multiply(multiply(term1, term2), sum) -}; - -const display$3 = (z, formatSpec, decimalFormat) => { - const complexSpec = /[∠°]/.test(formatSpec) ? formatSpec.slice(-1) : "j"; - let resultDisplay = ""; - let altResultDisplay = ""; - if (complexSpec === "j") { - const real = format(z[0], formatSpec, decimalFormat); - let imPart = format(z[1], formatSpec, decimalFormat); - if (imPart.charAt(0) === "-") { - resultDisplay = real + " - j\\," + -imPart; - altResultDisplay = real + " - j " + -imPart; - } else { - resultDisplay = real + " + j\\, " + imPart; - altResultDisplay = real + " + j " + imPart; - } - } else { - const mag = Rnl.hypot(z[0], z[1]); - let angle = Cpx.angle(z); - const inDegrees = complexSpec.indexOf("°") > -1; - if (inDegrees) { - angle = Rnl.divide(Rnl.multiply(angle, Rnl.fromNumber(180)), Rnl.pi); - } - resultDisplay = format(mag, formatSpec, decimalFormat) + "∠" + - format(angle, formatSpec, decimalFormat) + (inDegrees ? "°" : ""); - altResultDisplay = resultDisplay; - } - return [resultDisplay, altResultDisplay] -}; - -const Cpx = Object.freeze({ - j, - real, - imag, - abs, - conjugate, - angle, - inverse, - increment, - decrement, - isComplex, - add, - subtract, - divide, - multiply, - negate, - power, - exp, - log, - sqrt, - sin, - cos, - asin, - atan, - acosh, - asinh, - atanh, - lanczos, - display: display$3 -}); - -// Two helper functions -const isMatrix = oprnd => { - return ( - (oprnd.dtype & dt.ROWVECTOR) || - (oprnd.dtype & dt.COLUMNVECTOR) || - (oprnd.dtype & dt.MATRIX) - ) -}; -const isVector = oprnd => { - return (((oprnd.dtype & dt.ROWVECTOR) || (oprnd.dtype & dt.COLUMNVECTOR)) > 0) -}; - -const transpose = oprnd => { - const result = { unit: oprnd.unit }; - if (isVector(oprnd)) { - result.value = oprnd.value; - const delta = ((oprnd.dtype & dt.ROWVECTOR) ? 1 : -1 ) * (dt.COLUMNVECTOR - dt.ROWVECTOR); - result.dtype = oprnd.dtype + delta; - } else if (oprnd.dtype & dt.MATRIX) { - result.value = oprnd.value[0].map((x, i) => oprnd.value.map(y => y[i])); - result.dtype = oprnd.dtype; - } else { - return errorOprnd("BAD_TRANS") - } - return result -}; - -const convertFromBaseUnits$1 = (oprnd, gauge, factor) => { - let conversion = (isVector(oprnd)) - ? oprnd.value.map((e) => Rnl.divide(e, factor)) - : oprnd.value.map(row => row.map(e => Rnl.divide(e, factor))); - if (!Rnl.isZero(gauge)) { - conversion = (isVector(oprnd)) - ? oprnd.value.map((e) => Rnl.subtract(e, gauge)) - : oprnd.value.map(row => row.map(e => Rnl.subtract(e, gauge))); - } - return Object.freeze(conversion) -}; - -const convertToBaseUnits$1 = (oprnd, gauge, factor) => { - let conversion = clone(oprnd.value); - if (!Rnl.isZero(gauge)) { - conversion = (isVector(oprnd)) - ? oprnd.value.map((e) => Rnl.add(e, gauge)) - : oprnd.value.map(row => row.map(e => Rnl.add(e, gauge))); - } - conversion = (isVector(oprnd)) - ? conversion.map((e) => Rnl.multiply(e, factor)) - : conversion.map(row => row.map(e => Rnl.multiply(e, factor))); - return Object.freeze(conversion) -}; - -const elementDisplay = (value, dtype, formatSpec, decimalFormat, isAlt = false) => { - let display = value === undefined - ? "" - : (dtype & dt.RATIONAL) - ? format(value, formatSpec, decimalFormat) - : (dtype & dt.COMPLEX) - ? Cpx.display(value, formatSpec, decimalFormat)[0] - : (dtype & dt.BOOLEAN) || (dtype & dt.STRING) - ? (isAlt ? value : "\\text{" + value + "}") - : value; - if (isAlt && ((dtype & dt.RATIONAL) || (dtype & dt.COMPLEX))) { - display = display.replace(/{,}/g, ","); - } - return display -}; - -const display$2 = (m, formatSpec, decimalFormat) => { - let str = ""; - if (m.dtype & dt.MATRIX) { - str += "\\begin{pmatrix}"; - const numRows = m.value.length; - const numCols = m.value[0].length; - for (let i = 0; i < numRows; i++) { - for (let j = 0; j < numCols; j++) { - str += elementDisplay(m.value[i][j], m.dtype, formatSpec, decimalFormat) + " &"; - } - str = str.slice(0, -1) + " \\\\ "; - } - str = str.slice(0, -3).trim(); - str += "\\end{pmatrix}"; - } else { - const numArgs = m.value.plain ? m.value.plain.length : m.value.length; - if (numArgs === 0) { - str += "[\\,]"; - } else { - str += "\\begin{bmatrix}"; - const argSep = (m.dtype & dt.ROWVECTOR) ? " & " : " \\\\ "; - if (m.value.plain) { - for (let i = 0; i < numArgs; i++) { - str += elementDisplay(m.value.plain[i], m.dtype, formatSpec, decimalFormat) + - ((i < numArgs - 1) ? argSep : ""); - } - } else { - for (let i = 0; i < numArgs; i++) { - str += elementDisplay(m.value[i], m.dtype, formatSpec, decimalFormat) + - ((i < numArgs - 1) ? argSep : ""); - } - } - str += "\\end{bmatrix}"; - } - } - return str -}; - -const displayAlt$2 = (m, formatSpec, decimalFormat) => { - let str = ""; - if (m.dtype & dt.MATRIX) { - str += "("; - const numRows = m.value.length; - const numCols = m.value[0].length; - for (let i = 0; i < numRows; i++) { - for (let j = 0; j < numCols; j++) { - str += elementDisplay(m.value[i][j], m.dtype, formatSpec, decimalFormat, true) + ", "; - } - str = str.slice(0, -2) + "; "; - } - str = str.slice(0, -2).trim(); - str += ")"; - } else { - str += "["; - const argSep = (m.dtype & dt.ROWVECTOR) ? ", " : "; "; - if (m.value.plain) { - const numArgs = m.value.plain.length; - for (let i = 0; i < numArgs; i++) { - str += elementDisplay(m.value.plain[i], m.dtype, formatSpec, decimalFormat, true) + - ((i < numArgs - 1) ? argSep : ""); - } - } else { - const numArgs = m.value.length; - for (let i = 0; i < numArgs; i++) { - str += elementDisplay(m.value[i], m.dtype, formatSpec, decimalFormat, true) + - ((i < numArgs - 1) ? argSep : ""); - } - } - str += "]"; - } - return str -}; - -const findfirst$1 = (el, array) => { - if (!isVector(array)) { return errorOprnd("NOT_VECTOR", "findfirst") } - const isNumeric = Rnl.isRational(el); - for (let i = 0; i < array.value.length; i++) { - const val = array.value[i]; - if ((isNumeric & Rnl.areEqual(val, el)) || val === el ) { - return Rnl.fromNumber(i + 1) - } - } - return Rnl.zero -}; - -const identity = (num, mutable) => { - const n = Rnl.isRational(num) ? Rnl.toNumber(num) : num; - if (n === 1) { - return [Rnl.one] - } else { - const M = []; - for (let i = 0; i < n; i++) { - M.push(new Array(n).fill(Rnl.zero)); - M[i][i] = Rnl.one; - } - return mutable ? M : Object.freeze(M) - } -}; - -const invert = (matrix, returnDeterminant) => { - // Invert a square matrix via Gaussian elimination. - // A lightly editied copy of http://blog.acipo.com/matrix-inversion-in-javascript/ - - if (matrix.length !== matrix[0].length) { - return errorOprnd("NONSQUARE") - } - const dim = matrix.length; - let i = 0; - let ii = 0; - let j = 0; - let temp = Rnl.zero; - let determinant = Rnl.one; - - const C = clone(matrix); - const I = identity(dim, true); - - for (i = 0; i < dim; i += 1) { - // get the element temp on the diagonal - temp = C[i][i]; - - // if we have a 0 on the diagonal (we'll need to swap with a lower row) - if (Rnl.isZero(temp)) { - //look through every row below the i'th row - for (ii = i + 1; ii < dim; ii++) { - //if the ii'th row has a non-0 in the i'th col - if (!Rnl.isZero(C[ii][i])) { - //it would make the diagonal have a non-0 so swap it - for (j = 0; j < dim; j++) { - temp = C[i][j]; // temp store i'th row - C[i][j] = C[ii][j]; // replace i'th row by ii'th - C[ii][j] = temp; // repace ii'th by temp - temp = I[i][j]; // temp store i'th row - I[i][j] = I[ii][j]; // replace i'th row by ii'th - I[ii][j] = temp; // repace ii'th by temp - } - //don't bother checking other rows since we've swapped - break - } - } - //get the new diagonal - temp = C[i][i]; - //if it's still 0, not invertable (error) - if (Rnl.isZero(temp)) { return errorOprnd("SINGULAR") } - } - - if (returnDeterminant) { - determinant = Rnl.divide(determinant, temp); - if (i === dim - 1) { - return determinant - } - } - - // Scale this row down by temp (so we have a 1 on the diagonal) - for (j = 0; j < dim; j++) { - C[i][j] = Rnl.divide(C[i][j], temp); //apply to original matrix - I[i][j] = Rnl.divide(I[i][j], temp); //apply to identity - } - - // Subtract this row (scaled appropriately for each row) from ALL of - // the other rows so that there will be 0's in this column in the - // rows above and below this one - for (ii = 0; ii < dim; ii++) { - // Only apply to other rows (we want a 1 on the diagonal) - if (ii === i) { continue } - - // We want to change this element to 0 - temp = C[ii][i]; - - // Subtract (the row above(or below) scaled by temp) from (the - // current row) but start at the i'th column and assume all the - // stuff left of diagonal is 0 (which it should be if we made this - // algorithm correctly) - for (j = 0; j < dim; j++) { - C[ii][j] = Rnl.subtract(C[ii][j], Rnl.multiply(temp, C[i][j])); // original matrix - I[ii][j] = Rnl.subtract(I[ii][j], Rnl.multiply(temp, I[i][j])); // identity - } - } - } - - // We've finished. C should be the identity matrix. - // Matrix I should be the inverse. - return Object.freeze(I) -}; - - -const submatrix = (oprnd, index, colIndex) => { - if (!((index.dtype & dt.RATIONAL) || (index.dtype & dt.RANGE))) { - return errorOprnd("BAD_INDEX") - } - let value = []; - let dtype = oprnd.dtype; - - // Get the row index - let start = 0; - let step = 1; - let end = 0; - if (index.dtype & dt.RANGE) { - start = Rnl.toNumber(index.value[0]); - step = Rnl.toNumber(index.value[1]); - end = index.value[2] === "∞" - ? oprnd.value.length - : Rnl.toNumber(index.value[2]); - } else if (Rnl.areEqual(index.value, Rnl.zero)) { - // Return all the rows - start = 1; - end = oprnd.value.length; - } else { - start = Rnl.toNumber(index.value); - end = start; - } - - if (isVector(oprnd)) { - // Skip the column index. Proceed directly to load values into the result. - if (start === end) { - // return a scalar - value = oprnd.value[start - 1]; - dtype = oprnd.dtype - (oprnd.dtype & dt.ROWVECTOR) - - (oprnd.dtype & dt.COLUMNVECTOR); - } else if (step === 1) { - value = oprnd.value.slice(start - 1, end); - } else { - for (let i = start - 1; i < end; i += step) { - value.push(oprnd.value[i]); - } - } - Object.freeze(value); - return Object.freeze({ value, unit: oprnd.unit, dtype }) - } - - // Get the column index - let colStart = 0; - let colStep = 1; - let colEnd = 0; - if (colIndex) { - if (colIndex.dtype & dt.RANGE) { - colStart = Rnl.toNumber(colIndex.value[0]); - colStep = Rnl.toNumber(colIndex.value[1]); - colEnd = colIndex.value[2] === "∞" - ? oprnd.value[0].length - : Rnl.toNumber(colIndex.value[2]); - } else if (Rnl.areEqual(colIndex.value, Rnl.zero)) { - // Return an entire row. - colStart = 1; - colEnd = oprnd.value[0].length; - } else { - colStart = Rnl.toNumber(colIndex.value); - colEnd = colStart; - } - } - - // Now load values into the result - if (start === end && colStart === colEnd) { - // return a scalar - value = oprnd.value[start - 1][colStart - 1]; - dtype -= dt.MATRIX; - - } else if (start === end) { - // return a row vector - if (colStep === 1) { - value = oprnd.value[start - 1].slice(colStart - 1, colEnd); - } else { - for (let j = colStart - 1; j < colEnd; j += colStep) { - value.push(oprnd.value[start - 1][j]); - } - } - dtype = dtype - dt.MATRIX + dt.ROWVECTOR; - - } else if (colStart === colEnd) { - // return a column vector - for (let i = start - 1; i < end; i += step) { - value.push(oprnd.value[i][colStart - 1]); - } - dtype = dtype - dt.MATRIX + dt.COLUMNVECTOR; - - } else if (colStep === 1) { - for (let i = start - 1; i < end; i += step) { - value.push([]); - value[value.length - 1] = oprnd.value[i].slice(colStart - 1, colEnd); - } - - } else { - for (let i = start - 1; i < end; i += step) { - value.push([]); - for (let j = colStart - 1; j < colEnd; j += colStep) { - value[value.length - 1].push(oprnd[i][j]); - } - } - } - Object.freeze(value); - return Object.freeze({ value, unit: oprnd.unit, dtype }) -}; - -const multResultType = (o1, o2) => { - // o1 and o2 are to undergo matrix multiplication. - // The value is found elsewhere. - // Here we find the resulting data type. - if ((o1.dtype & dt.ROWVECTOR) && (o2.dtype & dt.COLUMNVECTOR)) { - return dt.RATIONAL - } else if ((o1.dtype & dt.MATRIX) && (o2.dtype & dt.COLUMNVECTOR)) { - return o2.dtype - } else if ((o1.dtype & dt.ROWVECTOR) && (o2.dtype & dt.MATRIX)) { - return o1.dtype - } else { - return dt.MATRIX + dt.RATIONAL - } -}; - -const operandFromRange = range => { - // Input was [start:step:end...] - // Populate a vector with values from a range - if (Rnl.isZero(range[1])) { return errorOprnd("ZERO_STEP") } - if (!Rnl.areEqual(Rnl.sign(Rnl.subtract(range[2], range[0])), Rnl.sign(range[1]))) { - range[1] = Rnl.negate(range[1]); - } - const array = []; - if (Rnl.greaterThan(range[2], range[0])) { - for (let j = range[0]; Rnl.lessThan(j, range[2]); j = Rnl.add(j, range[1])) { - array.push(j); - } - } else { - for (let j = range[0]; Rnl.greaterThanOrEqualTo(j, range[2]); j = Rnl.add(j, range[1])) { - array.push(j); - } - } - if (!Rnl.areEqual(array[array.length - 1], range[2])) { - array.push(range[2]); - } - Object.freeze(array); - return Object.freeze({ - value: array, - unit: { expos: allZeros }, - dtype: dt.RATIONAL + dt.COLUMNVECTOR - }) -}; - -const operandFromTokenStack = (tokenStack, numRows, numCols) => { - // TODO: Get dtype correct for matrices that contain strings or booleans. - if (numRows === 0 && numCols === 0) { - return Object.freeze({ value: new Array(0), unit: null, dtype: dt.COLUMNVECTOR }) - } else if (numRows === 1 && numCols === 1) { - // One element. Return a scalar. - return tokenStack.pop() - - } else if (numRows === 1 || numCols === 1) { - const numArgs = Math.max(numRows, numCols); - let array; - let dtype = tokenStack[tokenStack.length - 1].dtype; - if (numRows === 1 && (dtype & dt.COLUMNVECTOR)) { - // Matrix composed of column vectors appended side by side - dtype = dtype - dt.COLUMNVECTOR + dt.MATRIX; - array = new Array(tokenStack[0].value.length); - for (let i = 0; i < tokenStack[0].value.length; i++) { - array[i] = []; - for (let j = 0; j < numArgs; j++) { - array[i][j] = tokenStack[j].value[i]; - } - } - for (let i = 0; i < numArgs; i++) { tokenStack.pop(); } - } else { - // Vector - array = new Array(numArgs); - dtype += numRows === 1 ? dt.ROWVECTOR : dt.COLUMNVECTOR; - for (let j = numArgs - 1; j >= 0; j--) { - array[j] = tokenStack.pop().value; - } - } - Object.freeze((array)); - return Object.freeze({ - value: array, - unit: (dtype & dt.RATIONAL) ? { expos: allZeros } : null, - dtype - }) - - } else { - // 2D matrix - const array = new Array(numRows); - const dtype = tokenStack[tokenStack.length - 1].dtype + dt.MATRIX; - for (let j = 0; j < numRows; j++) { - array[j] = new Array(numCols); - } - for (let k = numRows - 1; k >= 0; k--) { - for (let j = numCols - 1; j >= 0; j--) { - array[k][j] = tokenStack.pop().value; - } - } - Object.freeze((array)); - return Object.freeze({ - value: array, - unit: (dtype & dt.RATIONAL) ? { expos: allZeros } : null, - dtype - }) - } -}; - -const ones = (m, n) => { - if (m === 1 || n === 1) { - return { - value: new Array(n).fill(Rnl.one), - unit: allZeros, - dtype: dt.RATIONAL + (m === 1 ? dt.ROWVECTOR : dt.COLUMNVECTOR) - } - } else { - const value = []; - for (let i = 0; i < m; i++) { - value.push(new Array(n).fill(Rnl.one)); - } - Object.freeze(value); - return Object.freeze({ - value: value, - unit: { expos: allZeros }, - dtype: dt.RATIONAL + dt.MATRIX - }) - } -}; - -const zeros = (m, n) => { - if (m === 1 || n === 1) { - return { - value: new Array(n).fill(Rnl.zero), - unit: allZeros, - dtype: dt.RATIONAL + (m === 1 ? dt.ROWVECTOR : dt.COLUMNVECTOR) - } - } else { - const value = []; - for (let i = 0; i < m; i++) { - value.push(new Array(n).fill(Rnl.zero)); - } - Object.freeze(value); - return Object.freeze({ - value: value, - unit: { expos: allZeros }, - dtype: dt.RATIONAL + dt.MATRIX - }) - } -}; - -const Matrix = Object.freeze({ - convertFromBaseUnits: convertFromBaseUnits$1, - convertToBaseUnits: convertToBaseUnits$1, - display: display$2, - displayAlt: displayAlt$2, - elementDisplay, - findfirst: findfirst$1, - identity, - invert, - multResultType, - ones, - operandFromRange, - operandFromTokenStack, - submatrix, - transpose, - zeros -}); - -const columnListFromRange = (start, end) => { - const columnList = []; - for (let i = start; i <= end; i++) { - columnList.push(i); - } - return columnList -}; - -const valueFromDatum = datum => { - return datum === "true" - ? true - : datum === "false" - ? false - : numberRegEx$5.test(datum) - ? Rnl.fromString(datum) - : datum === "" - ? undefined - : datum -}; - -const datumFromValue = (value, dtype, formatSpec) => { - return value === true - ? "true" - : value === false - ? "false" - : value = (dtype === dt.RATIONAL) - ? format(value, formatSpec, "1000000.") - : value -}; - -const identifyRange = (df, args) => { - // A helper function for range(). Also used by map.range() - - let iStart; - let iEnd; - let rowList = []; - let columnList = []; - - // Find what must be returned. I.e. populate rowList and columnList - if (df.value.data[0].length === 1) { - // The source is a single-row data frame. Each argument calls a column. - iStart = 0; - iEnd = 0; - if (df.dtype === dt.DATAFRAME) { df.value.usedRows.add(0); } - for (let i = 0; i < args.length; i++) { - if (args[i].dtype === dt.STRING) { - columnList.push(df.value.columnMap[args[i].value]); - } else if (args[i].dtype === dt.RATIONAL) { - columnList.push(Rnl.toNumber(args[i].value)); - } else if (args[i].dtype === dt.RANGE) { - const jStart = Rnl.toNumber(args[i].value[0]); - const jEnd = Rnl.toNumber(args[i].value[1]); - for (let j = jStart; j <= jEnd; j++) { - columnList.push(j); - } - } - } - } else if (args.length === 1 && args[0].dtype === dt.RATIONAL) { - // Return a column vector - iStart = 0; - iEnd = df.value.data[0].length - 1; - columnList.push(Rnl.toNumber(args[0].value) - 1); - } else if (args.length === 1 && args[0].dtype === dt.RANGE) { - iStart = Rnl.toNumber(args[0].value[0]) - 1; - iEnd = Rnl.toNumber(args[0].value[1]) - 1; - if (df.dtype === dt.DATAFRAME) { - for (let i = iStart; i <= iEnd; i++) { df.value.usedRows.add(i); } - } - columnList = columnListFromRange(0, df.value.data.length - 1); - } else if (args.length === 1 && args[0].dtype === dt.STRING) { - // Only one indicator has been given. - // Check both the rowMap and the columnMap. - if (df.value.rowMap && args[0].value in df.value.rowMap) { - // Return a row - iStart = df.value.rowMap[args[0].value]; - iEnd = iStart; - if (df.dtype === dt.DATAFRAME) { df.value.usedRows.add(iStart); } - columnList = columnListFromRange(0, df.value.data.length - 1); - } else if (df.value.columnMap && args[0].value in df.value.columnMap) { - // Return a column vector - iStart = 0; - iEnd = df.value.data[0].length - 1; - columnList.push(df.value.columnMap[args[0].value]); - } else { - return [errorOprnd("BAD_ROW_NAME", args[0].value), null, null, null] - } - } else if (args.length === 1 && args[0].dtype === dt.STRING + dt.COLUMNVECTOR) { - // A vector of row names - for (const rowName of args[0].value) { - rowList.push(rowName); - if (df.dtype === dt.DATAFRAME) { df.value.usedRows.add(df.value.rowMap[rowName]); } - } - columnList = columnListFromRange(0, df.value.data.length - 1); // All the columns. - } else if (args.length === 1 && args[0].dtype === dt.STRING + dt.ROWVECTOR) { - // A vector of column names - iStart = 0; - iEnd = df.value.data[0].length; - for (const colName of args[0].value) { - columnList.push(df.columnIndicator[colName]); - } - } else if (args.length === 2 && args[0].dtype === dt.STRING && df.value.rowMap - && args[0].value in df.value.rowMap && args[1].dtype === dt.STRING && - df.value.columnMap && args[0].value in df.value.columnMap) { - // Return a single cell value - iStart = df.value.rowMap[args[0].value]; - iEnd = iStart; - if (df.dtype === dt.DATAFRAME) { df.value.usedRows.add(iStart); } - columnList.push(df.value.columnMap[args[0].value]); - } else { - // Default for args is a list of (row|column) names - iStart = 0; - iEnd = args.length; - if (df.value.rowMap && df.value.rowMap[args[iEnd - 1].value]) { - // A row list - rowList = args.map(arg => arg.value); - columnList = columnListFromRange(0, df.value.data.length - 1); // All the columns. - } else { - // A column list - columnList = args.map(arg => df.value.columnMap[arg.value]); - } - } - return [rowList, columnList, iStart, iEnd] -}; - -const range$1 = (df, args, unitAware) => { - let unit = Object.create(null); - const [rowList, columnList, iStart, iEnd] = identifyRange(df, args); - if (rowList.dtype && rowList.dtype === dt.ERROR) { return rowList } - if (rowList.length === 0 && iStart === iEnd && columnList.length === 1) { - // Return one value. - let dtype = df.value.dtype[columnList[0]]; - if (dtype & dt.QUANTITY) { dtype -= dt.QUANTITY; } - const j = columnList[0]; - let value = valueFromDatum(df.value.data[j][iStart]); - unit.expos = (dtype & dt.RATIONAL) ? allZeros : null; - if (unitAware && df.value.units[j]) { - const unitName = df.value.units[j] ? df.value.units[j] : undefined; - const unitObj = unitFromUnitName(unitName); - value = Rnl.multiply(Rnl.add(value, unitObj.gauge), unitObj.factor); - unit.expos = unitObj.expos; - } - return { value, unit, dtype } - - } else if (columnList.length === 1) { - // Return data from one column, in a column vector or a quantity - const j = columnList[0]; - const unitName = df.value.units[j] ? df.value.units[j] : {}; - unit = (df.unit && df.unit[unitName]) ? df.unit[unitName] : { expos: null }; - const value = df.value.data[j].slice(iStart, iEnd + 1).map(e => valueFromDatum(e)); - const dtype = df.value.dtype[j] + dt.COLUMNVECTOR; - const newdf = { value, name: df.value.headings[j], unit, dtype }; - if (unitAware && unit.gauge) { - return { - value: Matrix.convertToBaseUnits(newdf, unit.gauge, unit.factor), - name: df.value.headings[j], - unit: { expos: clone(unit.expos) }, - dtype: dt.RATIONAL + dt.COLUMNVECTOR - } - } else { - return newdf - } - - } else { - // Return a data frame. - const headings = []; - const units = []; - const dtype = []; - const data = []; - const columnMap = Object.create(null); - const unitMap = Object.create(null); - const rowMap = rowList.length === 0 ? false : Object.create(null); - for (let j = 0; j < columnList.length; j++) { - headings.push(df.value.headings[columnList[j]]); - const unitName = df.value.units[columnList[j]]; - units.push(unitName); - if (unitName && !unitMap[unitName]) { unitMap[unitName] = df.unit[unitName]; } - dtype.push(df.value.dtype[columnList[j]]); - columnMap[df.value.headings[j]] = j; - if (rowList.length > 0) { - const elements = []; - for (let i = 0; i < rowList.length; i++) { - const rowName = rowList[i]; - elements.push(df.value.data[columnList[j]][df.value.rowMap[rowName]]); - rowMap[rowName] = i; - } - data.push(elements); - } else { - data.push(df.value.data[columnList[j]].slice(iStart, iEnd + 1)); - } - } - return { - value: { - data, - headings, - columnMap, - rowMap, - units, - usedRows: new Set(), - dtype - }, - unit: clone(unitMap), - dtype: dt.DATAFRAME - } - } -}; - -// const numberRegEx = new RegExp(Rnl.numberPattern + "$") -const numberRegEx$5 = new RegExp("^(?:=|" + Rnl.numberPattern.slice(1) + "$)"); -const mixedFractionRegEx = /^-?(?:[0-9]+(?: [0-9]+\/[0-9]+))$/; -const escRegEx = /^\\#/; - -const hasUnitRow = lines => { - // Determine if there is a row for unit names. - if (lines.length < 3) { return false } - const units = lines[1].split("\t").map(el => el.trim()); - for (const unitName of units) { - if (numberRegEx$5.test(unitName)) { return false } - } - const firstDataLine = lines[2].split("\t").map(el => el.trim()); - for (const datum of firstDataLine) { - if (numberRegEx$5.test(datum)) { return true } - } - return false -}; - -const dataFrameFromTSV = (str, vars) => { - // Load a TSV string into a data frame. - // Data frames are loaded column-wise. The subordinate data structures are: - let data = []; // where the main data lives, not including column names or units. - const headings = []; // An array containing the column names - const columnMap = Object.create(null); // map of column names to column index numbers - let rowMap = false; // ditto for rows. - const units = []; // array of unit names, one for each column - const dtype = []; // each column's Hurmet operand type - const unitMap = Object.create(null); // map from unit names to unit data - const usedRows = new Set(); - - if (str.charAt(0) === "`") { str = str.slice(1); } - - if (vars) { - // Substitute values in for string interpolation, ${…} - const matches = arrayOfRegExMatches(interpolateRegEx, str); - for (let i = matches.length - 1; i >= 0; i--) { - const mch = matches[i]; - const varName = mch.value.slice(2, -1); - let value = ""; - if (varName === "undefined") { - value = ""; - } else if (varName === "j" && !vars.j) { - value = "j"; - } else { - const cellAttrs = vars[varName]; - if (!cellAttrs) { return errorOprnd("V_NAME", varName) } - const oprnd = fromAssignment(cellAttrs, false); - if (oprnd.dtype === dt.ERROR) { return oprnd } - value = Rnl.isRational(oprnd.value) ? String(Rnl.toNumber(oprnd.value)) : oprnd.value; - } - str = str.slice(0, mch.index) + value + str.slice(mch.index + mch.length); - } - } - - // It's tab-separated values, so we can use splits to load in the data. - const lines = str.split(/\r?\n/g); - const gotUnits = hasUnitRow(lines); - - // Read in the column headings. - const cols = lines[0].split('\t'); - if (cols[0].length > 0 && cols[0].charAt(0) === "#") { - // Create a rowMap. The first datum in each row is a key to the row. - rowMap = Object.create(null); - cols[0] = cols[0].slice(1); - } else if (escRegEx.test(cols[0])) { - cols[0] = cols[0].slice(1); - } - cols.forEach((datum, col) => { - datum = datum.trim(); - headings.push(datum); - columnMap[datum] = col; - data.push([]); - }); - - // Units - if (gotUnits) { - const unitNames = lines[1].split('\t'); - unitNames.forEach(unitName => { - unitName = unitName.trim(); - units.push(unitName); - if (unitName.length > 0 && !unitMap[unitName]) { - const unit = unitFromUnitName(unitName); - if (unit) { - unitMap[unitName] = unit; - } else { - return errorOprnd("DF_UNIT", unitName) - } - } - }); - } - - // Data - let row = -1; - for (let i = (gotUnits ? 2 : 1); i < lines.length; i++) { - const line = lines[i]; - row += 1; - line.split('\t').forEach((datum, col) => { - datum = datum.trim(); - if (datum === "sumAbove()") { - let sum = Rnl.zero; - for (const num of data[col]) { - if (!isNaN(num)) { - sum = Rnl.add(sum, Rnl.fromString(num)); - } - } - datum = String(Rnl.toNumber(sum)); - } - data[col].push(datum); - if (rowMap && col === 0) { - rowMap[datum] = row; - } - }); - } - - // Data is loaded in. Finish by determining the operand type of each column - for (let j = 0; j < data.length; j++) { - for (let i = 0; i < data[0].length; i++) { - const datum = data[j][i]; - if (datum === "") { continue } // undefined datum. - dtype.push( - numberRegEx$5.test(datum) - ? dt.RATIONAL + ((units.length > 0 && units[j].length > 0) ? dt.QUANTITY : 0) - : (datum === "true" || datum === "false") - ? dt.BOOLEAN - : dt.STRING - ); - break - } - } - - // Check if this data qualifies as a Hurmet Map. - let isMap = false; - let iStart = 0; - if (Object.keys(unitMap).length === 0) { - isMap = true; - iStart = (rowMap) ? 1 : 0; - for (let i = iStart + 1; i < dtype.length; i++) { - if (dtype[i] !== dtype[iStart]) { isMap = false; break } - } - } - - if (isMap) { - if (dtype[iStart] === dt.RATIONAL) { - data = data.map((col, i) => dtype[i] === dt.RATIONAL - ? col.map(el => Rnl.fromString(el)) - : col - ); - } - return { - value: { data, headings, columnMap, rowMap, usedRows }, - unit: (dtype[0] === dt.RATIONAL ? { expos: allZeros } : null), - dtype: dt.MAP + dtype[iStart] - } - } else { - return { - value: { data, headings, columnMap, rowMap, units, usedRows, dtype }, - unit: unitMap, - dtype: dt.DATAFRAME - } - } -}; - -const dataFrameFromVectors = (vectors, formatSpec) => { - // Take an array of vectors and return a dataframe. - const data = []; - const headings = []; - const columnMap = Object.create(null); - const units = []; - const dtype = []; - const unitMap = Object.create(null); - const rowMap = (vectors[0].name && vectors[0].name === "name") ? Object.create(null) : false; - for (let j = 0; j < vectors.length; j++) { - const vector = vectors[j]; - const vectorType = (vector.dtype & dt.ROWVECTOR) - ? dt.ROWVECTOR - : (vector.dtype & dt.COLUMNVECTOR) - ? dt.COLUMNVECTOR - : dt.ERROR; - if (vectorType === dt.ERROR) { return errorOprnd("NOT_VECTOR", "dataframe") } - headings.push(vector.name); - columnMap[vector.name] = j; - const colDtype = vector.dtype - vectorType; - data.push(vector.value.map(e => datumFromValue(e, colDtype, formatSpec))); - dtype.push(colDtype); - if (vector.unit.name) { - units.push(vector.unit.name); - if (!unitMap[vector.unit.name]) { - const unit = unitFromUnitName(vector.unit.name); - unitMap[vector.unit.name] = unit; - } - } else { - units.push(null); - } - if (rowMap) { - const nameVector = vectors[0].value; - for (let i = 0; i < nameVector.length; i++) { - rowMap[nameVector[i]] = i; - } - } - } - return { - value: { - data: data, - headings: headings, - columnMap: columnMap, - rowMap: rowMap, - units: units, - usedRows: new Set(), - dtype: dtype - }, - unit: unitMap, - dtype: dt.DATAFRAME - } -}; - -const matrix2table = (matrix, headings, rowHeadings) => { - // Use the contents of a matrix to create a dataframe. - if (rowHeadings.length > 0) { headings = [""].concat(headings); } - const columnMap = Object.create(null); - for (let i = 0; i < headings.length; i++) { - columnMap[headings[i]] = i; - } - let rowMap = false; - if (rowHeadings.length > 0) { - rowMap = Object.create(null); - for (let i = 0; i < rowHeadings.length; i++) { - rowMap[rowHeadings[i]] = i; - } - } - const data = new Array(headings.length); - let delta = 0; - if (rowHeadings.length > 0) { - data[0] = rowHeadings; - delta = 1; - } - for (let j = 0; j < matrix.value[0].length; j++) { - const k = j + delta; - data[k] = []; - for (let i = 0; i < matrix.value.length; i++) { - data[k].push(matrix.value[i][j]); - } - } - return { - value: { data, headings, columnMap, rowMap }, - unit: matrix.unit, - dtype: matrix.dtype - dt.MATRIX + dt.MAP - } -}; - -const append$1 = (o1, o2, formatSpec, unitAware) => { - // Append a vector or single value to a dataframe. - // We use copy-on-write for dataframes, so copy it here. - const oprnd = o1.dtype === dt.DATAFRAME ? clone(o1) : clone(o2); - const addend = o1.dtype === dt.DATAFRAME ? o2 : o1; - if (o1.dtype === dt.DATAFRAME) { - oprnd.value.columnMap[addend.name] = oprnd.value.headings.length; - oprnd.value.headings.push(addend.name); - } else { - for (const [key, value] of Object.entries(oprnd.value.columnMap)) { - oprnd.value.columnMap[key] = value + 1; - } - oprnd.value.columnMap[addend.name] = 0; - oprnd.value.headings.unshift(addend.name); - } - let unit; - if (addend.unit && addend.unit.name && addend.unit.name.length > 0) { - if (o1.dtype === dt.DATAFRAME) { - oprnd.value.units.push(addend.unit.name); - } else { - oprnd.value.units.unshift(addend.unit.name); - } - unit = unitFromUnitName(addend.unit.name); - if (!oprnd.unit[addend.unit.name]) { - oprnd.unit[addend.unit.name] = unit; - } - } - const dtype = addend.dype === dt.RATIONAL && unit - ? dt.RATIONAL + dt.QUANTITY - : !isMatrix(addend) - ? addend.dtype - : (addend.dtype & dt.COLUMNVECTOR) - ? addend.dtype - dt.COLUMNVECTOR - : addend.dtype - dt.ROWVECTOR; - const numRows = oprnd.value.data[0].length; - if (numRows === 1 && !isMatrix(addend)) { - const v = unitAware && dtype === dt.RATIONAL && unit - ? Rnl.subtract(Rnl.divide(addend.value, unit.factor), unit.gauge) - : addend.value; - if (o1.dtype === dt.DATAFRAME) { - oprnd.value.data.push([datumFromValue(v, dtype, formatSpec)]); - } else { - oprnd.value.data.unshift([datumFromValue(v, dtype, formatSpec)]); - } - } else { - if (unitAware && dtype === dt.RATIONAL && unit) { - const v = Matrix.convertFromBaseUnits(addend, unit.gauge, unit.factor); - if (o1.dtype === dt.DATAFRAME) { - oprnd.value.data.push(v.map(e => datumFromValue(e, dtype, formatSpec))); - } else { - oprnd.value.data.unshift(v.map(e => datumFromValue(e, dtype, formatSpec))); - } - } else { - if (o1.dtype === dt.DATAFRAME) { - oprnd.value.data.push(addend.value.map( - e => datumFromValue(e, dtype, formatSpec) - )); - } else { - oprnd.value.data.unshift(addend.value.map( - e => datumFromValue(e, dtype, formatSpec) - )); - } - } - } - if (o1.dtype === dt.DATAFRAME) { - oprnd.value.dtype.push(dtype); - } else { - oprnd.value.dtype.unshift(dtype); - } - return oprnd -}; - -const quickDisplay = str => { - // This is called from the lexer for a display that changes with every keystroke. - if (str === "") { return "" } - str = str.trim(); - let arrayFormat = ""; - if (str.charAt(0) === "#") { - str = str.slice(1).trim(); - arrayFormat = "l|cccccccccccccccccccccccc"; - } else { - arrayFormat = "c"; - } - str = addTextEscapes(str); - const sepRegEx = / *\t */g; - const lines = str.split(/\r?\n/g); - let tex = ""; - if (lines.length < 3) { - tex = "\\begin{matrix}\\text{"; - for (let i = 0; i < lines.length; i++) { - tex += tablessTrim(lines[i]).replace(sepRegEx, "} & \\text{") + "} \\\\ \\text{"; - } - tex = tex.slice(0, -10) + "\\end{matrix}"; - } else { - tex = `\\begin{array}{${arrayFormat}}\\text{`; - const cells = new Array(lines.length); - for (let i = 0; i < lines.length; i++) { - cells[i] = tablessTrim(lines[i]).split(sepRegEx); - } - - let gotUnits = false; - let gotAnswer = false; - for (let j = 0; j < cells[1].length; j++) { - if (numberRegEx$5.test(cells[1][j])) { gotAnswer = true; break } - } - if (!gotAnswer) { - // line[1] had no numbers. If any numbers are in line[2] then line[1] is units. - for (let j = 0; j < cells[2].length; j++) { - if (numberRegEx$5.test(cells[2][j])) { gotUnits = true; break } - } - } - - for (let i = 0; i < lines.length; i++) { - tex += tablessTrim(lines[i]).replace(sepRegEx, "} & \\text{"); - tex += ((gotUnits && i === 1) || (!gotUnits && i === 0)) - ? "} \\\\ \\hline \\text{" - : "} \\\\ \\text{"; - } - - tex = tex.slice(0, -10) + "\\end{array}"; - } - tex = tex.replace(/·/g, "$·$"); - return tex -}; - -// The next 40 lines contain helper functions for display(). -const accentRegEx$1 = /^([^\u0300-\u0308\u030A\u030C\u0332\u20d0\u20d1\u20d6\u20d7\u20e1]+)([\u0300-\u0308\u030A\u030C\u0332\u20d0\u20d1\u20d6\u20d7\u20e1])(.+)?/; -const subscriptRegEx = /([^_]+)(_[^']+)?(.*)?/; -const accentFromChar$1 = Object.freeze({ - "\u0300": "\\grave", - "\u0301": "\\acute", - "\u0302": "\\hat", - "\u0303": "\\tilde", - "\u0304": "\\bar", - "\u0305": "\\bar", - "\u0307": "\\dot", - "\u0308": "\\ddot", - "\u030A": "\\mathring", - "\u030C": "\\check", - "\u0332": "\\underline", - "\u20d0": "\\overleftharpoon", - "\u20d1": "\\overrightharpoon", - "\u20d6": "\\overleftarrow", - "\u20d7": "\\vec", - "\u20e1": "\\overleftrightarrow" -}); -const formatColumnName = str => { - // We can't call parse(str) because that would be a circular dependency. - // So this module needs its own function to format dataframe column names. - if (!isValidIdentifier$1.test(str)) { - return "\\text{" + addTextEscapes(str) + "}" - } else { - // Format it like a Hurmet identifier. - str = str.replace(/′/g, "'"); // primes - let parts = str.match(accentRegEx$1); - if (parts) { - str = accentFromChar$1[parts[2]] + "{" + parts[1] + "}"; - return str + (parts[3] ? parts[3] : "") - } else { - parts = str.match(subscriptRegEx); - let result = parts[1].length > 1 ? `\\text{${parts[1]}}` : parts[1]; - if (parts[2]) { - result += "_" + `\\text{${parts[2].slice(1)}}`; - } - return result + (parts[3] ? parts[3] : "") - } - } -}; - -const isNotEmpty = row => { - if (!row) { return false } - for (let i = 0; i < row.length; i++) { - if (row[i] !== "" && row[i] !== null) { return true } - } - return false -}; - -const getNumInfo = df => { - // Gather info for in setting numbers on a decimal tab. - const data = df.data.plain ? df.data.plain : df.data; - const numCols = data.length; - const colInfo = new Array(numCols); - const cellInfo = new Array(numCols); - const DFisRational = !df.dtype && Rnl.isRational(data[0][0]); - for (let j = 0; j < numCols; j++) { - if (DFisRational || (df.dtype && df.dtype[j] & dt.RATIONAL)) { - colInfo[j] = { hasAlignChar: false, maxLenAfterAlignChar: 0 }; - cellInfo[j] = []; - for (let i = 0; i < data[0].length; i++) { - const datum = data[j][i]; - const pos = datum.indexOf("."); - const hasAlignChar = pos > -1; - const lenAfterAlignChar = hasAlignChar ? datum.length - pos - 1 : 0; - cellInfo[j].push({ hasAlignChar, lenAfterAlignChar }); - if (hasAlignChar) { - colInfo[j].hasAlignChar = true; - if (lenAfterAlignChar > colInfo[j].maxLenAfterAlignChar) { - colInfo[j].maxLenAfterAlignChar = lenAfterAlignChar; - } - } - } - } - } - return [colInfo, cellInfo] -}; - -const displayNum = (datum, colInfo, cellInfo, decimalFormat) => { - let str = formattedDecimal(datum, decimalFormat); - const n = colInfo.maxLenAfterAlignChar - cellInfo.lenAfterAlignChar; - if (colInfo.hasAlignChar && (n > 0 || !cellInfo.hasAlignChar)) { - str += "\\phantom{"; - if (colInfo.hasAlignChar && !cellInfo.hasAlignChar) { - str += decimalFormat.slice(-1) === "." ? "." : "{,}"; - } - if (n > 0) { str += "0".repeat(n); } - str += "}"; - } - return str -}; - -const totalRegEx = /^(?:total|sum)/i; - -const display$1 = (df, formatSpec = "h3", decimalFormat = "1,000,000.", omitHeading = false) => { - const data = df.data.plain ? df.data.plain : df.data; - if (data.length === 0) { return "" } - const numRows = data[0].length; - const numCols = data.length; - const writeRowNums = numRows > 5 && !df.rowMap; - const isMap = !df.dtype; - let str = "\\begin{array}{"; - str += df.rowMap - ? "l|" - : writeRowNums - ? "r|" - : ""; - for (let j = 1; j < numCols; j++) { - str += isMap - ? "c " - : numRows === 1 - ? "c " - : Rnl.isRational(data[j][0]) - ? "r " - : "l "; - } - str = str.slice(0, -1) + "}"; - - if (!omitHeading) { - // Write the column names - if (writeRowNums) { str += "&"; } - for (let j = 0; j < numCols; j++) { - str += "{" + formatColumnName(df.headings[j]) + "}&"; - } - str = str.slice(0, -1) + " \\\\ "; - } - - // Write the unit names - if (isNotEmpty(df.units)) { - if (writeRowNums) { str += "&"; } - for (let j = 0; j < numCols; j++) { - let rowTex = ""; - if (df.units[j] && df.units[j].length > 0) { - const unitTex = unitTeXFromString(df.units[j]); - rowTex = unitTex.replace("\\;\\, ", ""); - } else { - rowTex = ""; - } - str += rowTex + "&"; - } - str = str.slice(0, -1) + " \\\\ "; - } - str += "\\hline "; - - const [colInfo, cellInfo] = getNumInfo(df); - - // Write the data - for (let i = 0; i < numRows; i++) { - if (i === numRows - 1 && totalRegEx.test(data[0][i])) { str += "\\hline "; } - if (writeRowNums) { str += String(i + 1) + " & "; } - for (let j = 0; j < numCols; j++) { - const datum = data[j][i]; - if (isMap) { - str += datum === undefined - ? " & " - : Rnl.isRational(datum) - ? format(datum, formatSpec, decimalFormat) + "&" - : Cpx.isComplex(datum) - ? Cpx.display(datum, formatSpec, decimalFormat)[0] + "&" - : "\\text{" + addTextEscapes(datum) + "} &"; - } else { - str += mixedFractionRegEx.test(datum) - ? format(Rnl.fromString(datum), formatSpec, decimalFormat) + "&" - : numberRegEx$5.test(datum) - ? displayNum(datum, colInfo[j], cellInfo[j][i], decimalFormat) + "&" - : datum === "" - ? "&" - : "\\text{" + addTextEscapes(datum) + "}&"; - } - } - str = str.slice(0, -1) + " \\\\ "; - } - - str = str.slice(0, -3).trim(); - str += "\\end{array}"; - return str -}; - -const displayAlt$1 = (df, formatSpec = "h3", decimalFormat = "1,000,000.", - omitHeading = false) => { - const data = df.data.plain ? df.data.plain : df.data; - if (data.length === 0) { return "" } - const numRows = data[0].length; - const numCols = data.length; - const writeRowNums = numRows > 5 && !df.rowMap; - let str = "``"; - - if (!omitHeading) { - // Write the column names - if (writeRowNums) { str += "\t"; } - str += ( (df.headings[0] === "name" || df.headings[0] === "item") - ? "" - : df.headings[0]) + "\t"; - for (let j = 1; j < numCols; j++) { - str += df.headings[j] + "\t"; - } - str = str.slice(0, -1) + "\n"; - } - - // Write the unit names - if (isNotEmpty(df.units)) { - if (writeRowNums) { str += "\t"; } - for (let j = 0; j < numCols; j++) { - str += df.units[j] + "\t"; - } - str = str.slice(0, -1) + "\n"; - } - - // Write the data - const isMap = !df.dtype; - for (let i = 0; i < numRows; i++) { - if (writeRowNums) { str += String(i + 1) + "\t"; } - for (let j = 0; j < numCols; j++) { - const datum = data[j][i]; - if (isMap) { - str += datum === undefined - ? "\t" - : Rnl.isRational(datum) - ? format(datum, formatSpec, decimalFormat).replace(/{,}/g, ",") + "\t" - : Cpx.isComplex(datum) - ? Cpx.display(datum, formatSpec, decimalFormat)[1].replace(/{,}/g, ",") + "\t" - : datum + "\t"; - } else { - if (mixedFractionRegEx.test(datum)) { - str += format(Rnl.fromString(datum), formatSpec, "100000.") + "\t"; - } else { - str += datum + "\t"; - } - } - } - str = str.slice(0, -1) + "\n"; - } - - str = str.slice(0, -1).trim(); - str += "``"; - return str -}; - -const DataFrame = Object.freeze({ - append: append$1, - dataFrameFromTSV, - dataFrameFromVectors, - matrix2table, - display: display$1, - displayAlt: displayAlt$1, - quickDisplay, - range: range$1 -}); - -/* - * lexer.js - * This file supports parser.js. - */ - -// Define constants for token types. -const tt = Object.freeze({ - UNARY: 0, // unary TeX function, e.g. \sqrt - BINARY: 1, // binary TeX function, e.g. \xrightarrow, differs from tt.BIN - SUB: 2, - SUP: 3, - ACCENT: 4, - // A left paren or bracket, ( or [], will be made invisible if located - // directly after a token whose token type < 5. - UNARYMINUS: 5, - DIV: 6, // stacked division: / \atop - PRIME: 7, - CURRENCY: 8, // currency symbol: $,£,¥,€, etc. Precedes its number. - ORD: 9, - VAR: 10, // variable name, one letter long - NUM: 11, - SPACE: 12, - LONGVAR: 13, - LEFTBRACKET: 14, - RIGHTBRACKET: 15, - BIG_OPERATOR: 16, - LEFTRIGHT: 17, // | - STRING: 18, - UNIT: 19, // unit-of-measure, e.g., 'meters' or ° - BIN: 20, // binary infix operators that render but don't calculate, e.g., ± \cdots - ADD: 21, // binary infix addition or subtraction operator: + - - MULT: 22, // binary infix multiplication or division operator: × * · // ÷ - REL: 23, // relational operator: ≟ > < ≤ ≥ etc. - LOGIC: 24, // if and or xor else otherwise - SEP: 25, // argument separators, cell separators and row separators: , ; - FUNCTION: 26, - ACCESSOR: 28, // dot between a data frame name and a property, as in r.prop - ENVIRONMENT: 29, - FACTORIAL: 30, - SUPCHAR: 31, - ANGLE: 32, - RANGE: 33, // separator for ranges (1:n) - KEYWORD: 34, // keywords: for in while - PROPERTY: 36, // property name after a dot accessor - COMMENT: 37, - RETURN: 38, // A return statement inside a user-defined function. - TO: 39, - DATAFRAME: 40, - RICHTEXT: 41, - BOOLEAN: 42, - MACRO: 43 -}); - -const minusRegEx = /^-(?![-=<>:])/; -const numberRegEx$4 = new RegExp(Rnl.numberPattern); -const unitRegEx = /^(?:'[^']+'|[°ΩÅK])/; - -const texFromNumStr = (numParts, decimalFormat) => { - let num = ""; - if (numParts[2]) { - // Hexadecimal - num = "\\mathrm{" + numParts[2] + "}"; - } else if (numParts[5]) { - return texFromMixedFraction(numParts) - } else { - // Decimal - num = numParts[3]; - if (numParts[6]) { num += "." + numParts[6]; } - num = formattedDecimal(num, decimalFormat); - if (numParts[8]) { - num += "\\%"; - } else if (numParts[7]) { - if (numParts[7].charAt(0) === "-") { - num += "\\text{e-}" + numParts[7].slice(1); - } else { - num += "\\text{e}" + numParts[7]; - } - } - } - if (numParts[1]) { - num = "\\text{-}" + num; - } - return num -}; - -const isUnary = (prevToken) => { - switch (prevToken.ttype) { - case tt.NUM: - case tt.ORD: - case tt.VAR: - case tt.RIGHTBRACKET: - case tt.LONGVAR: - case tt.UNIT: - case tt.CURRENCY: - case tt.SUPCHAR: - case tt.PRIME: - case tt.FACTORIAL: - return false - default: - return true - } -}; - -const wordRegEx = /^(?:(?:[A-Za-zıȷ\u0391-\u03C9\u03D5\u212C\u2130\u2131\u210B\u2110\u2112\u2133\u211B\u212F\u210A\u2113\u2134]|(?:\uD835[\uDC00-\udc33\udc9c-\udccf\udd38-\udd50]))[A-Za-z0-9_\u0391-\u03C9\u03D5\u0300-\u0308\u030A\u030C\u0332\u20d0\u20d1\u20d6\u20d7\u20e1]*|!in|-->|->|left\.|right\.|log10|log2)/; - -const words = Object.freeze({ - // input, tex output, type, closeDelim - "true": ["true", "\\mathord{\\text{true}}", tt.BOOLEAN, ""], - "false": ["false", "\\mathord{\\text{false}}", tt.BOOLEAN, ""], - cos: ["cos", "\\cos", tt.FUNCTION, ""], - cosd: ["cosd", "\\operatorname{\\cos_d}", tt.FUNCTION, ""], - if: ["if", "\\mathrel{\\mathrm{if}}", tt.LOGIC, ""], - else: ["else", "\\mathrel{\\mathrm{else}}", tt.LOGIC, ""], - elseif: ["elseif", "\\mathrel{\\mathrm{elseif}}", tt.LOGIC, ""], - and: ["and", "\\mathrel{\\mathrm{and}}", tt.LOGIC, ""], - or: ["or", "\\mathrel{\\mathrm{or}}", tt.LOGIC, ""], - for: ["for", "\\mathrel{\\mathrm{for}}", tt.KEYWORD, ""], - while: ["while", "\\mathrel{\\mathrm{while}}", tt.KEYWORD, ""], - in: ["in", "\\mathrel{\\mathrm{in}}", tt.REL, ""], - "!in": ["!in", "\\mathrel{\\mathrm{!in}}", tt.REL, ""], - break: ["break", "\\mathrel{\\mathrm{break}}", tt.KEYWORD, ""], - to: ["to", "\\mathbin{\\mathrm{to}}", tt.TO, "" ], - throw: ["throw", "\\mathrel{\\mathrm{throw}}", tt.UNARY, ""], - print: ["print", "\\mathrel{\\mathrm{print}}", tt.UNARY, ""], - return: ["return", "\\mathrel{\\mathrm{return}}", tt.RETURN, ""], - sqrt: ["sqrt", "\\sqrt", tt.UNARY, ""], - otherwise: ["otherwise", "\\mathrel{\\mathrm{otherwise}}", tt.LOGIC, ""], - root: ["root", "\\sqrt", tt.BINARY, ""], - sin: ["sin", "\\sin", tt.FUNCTION, ""], - sind: ["sind", "\\operatorname{\\sin_d}", tt.FUNCTION, ""], - tan: ["tan", "\\tan", tt.FUNCTION, ""], - tand: ["tand", "\\operatorname{\\tan_d}", tt.FUNCTION, ""], - cotd: ["cotd", "\\operatorname{\\cot_d}", tt.FUNCTION, ""], - secd: ["secd", "\\operatorname{\\sec_d}", tt.FUNCTION, ""], - cscd: ["cscd", "\\operatorname{\\csc_d}", tt.FUNCTION, ""], - log: ["log", "\\log", tt.FUNCTION, ""], - ln: ["ln", "\\ln", tt.FUNCTION, ""], - log10: ["log10", "\\log_{10}", tt.FUNCTION, ""], - log2: ["log2", "\\log_{2}", tt.FUNCTION, ""], - "log!": ["log!", "\\operatorname{log!}", tt.FUNCTION, ""], - pi: ["pi", "\\mathrm{pi}", tt.ORD, ""], - π: ["π", "π", tt.ORD, ""], - "ℓ": ["ℓ", "ℓ", tt.VAR, ""], - // A few arrows are placed here to give them priority over other arrows - "->": ["->", "\u2192", tt.REL, ""], // right arrow - "-->": ["-->", "\\xrightarrow", tt.UNARY, ""], - "<-->": ["<-->", "\\xrightleftarrows", tt.UNARY, ""] -}); - -const miscRegEx = /^([/÷\u2215_:,;\t^+\\\-–−*∗×∘⊗⦼⊙√∛∜·.%|╏‖¦><=≈≟≠≡≤≥≅∈∉∋∌⊂⊄⊆⊈⊃⊇⊉!¡‼¬∧∨⊻~#?⇒⟶⟵→←&@′″∀∃∫∬∮∑([{⟨⌊⎿⌈⎾〖〗⏋⌉⏌⌋⟩}\])˽∣ℂℕℚℝℤℓℏ∠¨ˆˉ˙˜▪✓\u00A0\u20D7$£¥€₨₩₪]+)/; - -const miscSymbols = Object.freeze({ - // input, output, type, closeDelim - "#": ["#", "#", tt.COMMENT, ""], - "/": ["/", "\\dfrac{", tt.DIV, ""], // displaystyle fraction - "//": ["//", "\\tfrac{", tt.DIV, ""], // textstyle fraction - "///": ["///", "/", tt.MULT, ""], // inline (shilling) fraction - "\u2215": ["\u2215", "\u2215", tt.MULT, ""], // inline (shilling) fraction - "÷": ["÷", "÷", tt.MULT, ""], - "./": ["./", "\\mathbin{.'}", tt.MULT, ""], - "_": ["_", "_", tt.SUB, ""], - "^": ["^", "^", tt.SUP, ""], - ".^": [".^", "\\mathbin{.^}", tt.SUP, ""], - "+": ["+", "+", tt.ADD, ""], - "-": ["-", "-", tt.ADD, ""], - "–": ["-", "-", tt.ADD, ""], // \u2013 en dash - "−": ["-", "-", tt.ADD, ""], // \u2212 math minus - ".+": [".+", "\\mathbin{.+}", tt.ADD, ""], - ".-": [".-", "\\mathbin{.-}", tt.ADD, ""], - "*": ["*", "*", tt.MULT, ""], - "∗": ["∗", "∗", tt.MULT, ""], - "×": ["×", "×", tt.MULT, ""], - "∘": ["∘", "∘", tt.MULT, ""], // U+2218 - "⊗": ["⊗", "⊗", tt.MULT, ""], - ".*": [".*", "\\mathbin{.*}", tt.MULT, ""], - "√": ["√", "\\sqrt", tt.UNARY, ""], - "\u221B": ["\u221B", "\\sqrt[3]", tt.UNARY, ""], - "\u221C": ["\u221C", "\\sqrt[4]", tt.UNARY, ""], - "+-": ["+-", "\u00B1", tt.BIN, ""], - "**": ["**", "\\star", tt.BIN, ""], - "·": ["·", "\u22C5", tt.MULT, ""], // dot operator - "...": ["...", "\\dots", tt.RANGE, ""], - "%": ["%", "\\%", tt.FACTORIAL, ""], - "-:": ["-:", "÷", tt.MULT, ""], - "=": ["=", "=", tt.REL, ""], - "≈": ["≈", "≈", tt.REL, ""], - "==": ["==", "⩵", tt.REL, ""], - "≡": ["≡", "≡", tt.REL, ""], - ">": [">", "\\gt", tt.REL, ""], - "\u226f": ["\u226f", "\\ngtr", tt.REL, ""], - "<": ["<", "\\lt", tt.REL, ""], - "\u226e": ["\u226e", "\\nless", tt.REL, ""], - "?=": ["?=", "\u225F", tt.REL, ""], - "≟": ["≟", "\u225F", tt.REL, ""], - "≠": ["≠", "≠", tt.REL, ""], - "!=": ["!=", "≠", tt.REL, ""], - "<>": ["<>", "≠", tt.REL, ""], - ":=": [":=", "\u2254", tt.REL, ""], - "<=": ["<=", "≤", tt.REL, ""], - "≤": ["≤", "≤", tt.REL, ""], - ">=": [">=", "\u2265", tt.REL, ""], - "≥": ["≥", "≥", tt.REL, ""], - "-=": ["-=", "\u2261", tt.REL, ""], - "~=": ["~=", "\u2245", tt.REL, ""], - "≅": ["≅", "≅", tt.REL, ""], - "~~": ["~~", "\u2248", tt.REL, ""], - "~": ["~", "\\sim", tt.REL, ""], - "=>": ["=>", "\u21D2", tt.REL, ""], - "⟶": ["⟶", "\\xrightarrow", tt.UNARY, ""], - "⟵": ["⟵", "\\xleftarrow", tt.UNARY, ""], - "⇒": ["⇒", "\u21D2", tt.REL, ""], - "<=>": ["<=>", "\u21D4", tt.REL, ""], - "-<": ["-<", "\u227A", tt.REL, ""], - ">-": [">-", "\u227B", tt.REL, ""], - "-<=": ["-<=", "\u2AAF", tt.REL, ""], - ">-=": [">-=", "\u2AB0", tt.REL, ""], - "_|_": ["_|_", "\\bot", tt.REL, ""], - "|--": ["|--", "\u22A2", tt.REL, ""], - "|==": ["|==", "\\models", tt.REL, ""], - "∈": ["∈", "∈", tt.REL, ""], - "∉": ["∉", "∉", tt.REL, ""], - "∋": ["∋", "∋", tt.REL, ""], - "∌": ["∌", "∌", tt.REL, ""], - "⊂": ["⊂", "⊂", tt.REL, ""], - "⊃": ["⊃", "⊃", tt.REL, ""], - "⊄": ["⊄", "⊄", tt.REL, ""], - "⊅": ["⊅", "⊅", tt.REL, ""], - "⊆": ["⊆", "⊆", tt.REL, ""], - "⊈": ["⊈", "⊈", tt.REL, ""], - "⊇": ["⊇", "⊇", tt.REL, ""], - "⊉": ["⊉", "⊉", tt.REL, ""], - "▪": ["▪", "\\mathrel{▪}", tt.REL, ""], - - "!": ["!", "!", tt.FACTORIAL, ""], - "‼": ["‼", "!!", tt.FACTORIAL, ""], - "!!": ["!!", "!!", tt.FACTORIAL, ""], - "¡": ["¡", "¡", tt.FACTORIAL, ""], - "&": ["&", "\\mathbin{\\&}", tt.ADD, ""], // string concatenator - "&_": ["&_", "\\mathbin{\\underline{\\&}}", tt.ADD, ""], // concatenate to bottom - "′": ["′", "'", tt.PRIME, ""], - "″": ["″", "''", tt.PRIME, ""], - "′′": ["′′", "''", tt.PRIME, ""], - "′′′": ["′′′", "'''", tt.PRIME, ""], - - "∀": ["∀", "∀", tt.LOGIC, ""], - "∃": ["∃", "∃", tt.LOGIC, ""], - "∧": ["∧", "∧", tt.LOGIC, ""], - "∨": ["∨", "∨", tt.LOGIC, ""], - "⊻": ["⊻", "⊻", tt.LOGIC, ""], // xor - "¬": ["¬", "¬", tt.UNARY, ""], // logical not - "&&": ["&&", "{\\;\\&\\&\\;}", tt.LOGIC, ""], - - "\u222B": ["\u222B", "\\displaystyle\u222B", tt.BIG_OPERATOR, ""], // \int - "\u222C": ["\u222C", "\\displaystyle\u222C", tt.BIG_OPERATOR, ""], // \iint - "\u222E": ["\u222E", "\\displaystyle\u222E", tt.BIG_OPERATOR, ""], // \oint - "\u2211": ["\u2211", "\\displaystyle\u2211", tt.BIG_OPERATOR, ""], // \sum - - "(": ["(", "(", tt.LEFTBRACKET, ")"], - "[": ["[", "[", tt.LEFTBRACKET, "]"], - "{": ["{", "\\{", tt.LEFTBRACKET, "\\}"], - "{:": ["{:", "{", tt.LEFTBRACKET, "}"], - "⟨": ["⟨", "⟨", tt.LEFTBRACKET, "⟩"], - ")": [")", ")", tt.RIGHTBRACKET, ""], - "]": ["]", "]", tt.RIGHTBRACKET, ""], - "}": ["}", "\\}", tt.RIGHTBRACKET, ""], - "⟩": ["⟩", "⟩", tt.RIGHTBRACKET, ""], - ":}": [":}", "}", tt.RIGHTBRACKET, ""], - "|": ["|", "|", tt.LEFTRIGHT, ""], - "||": ["||", "\\mathbin{||}", tt.BIN, ""], - "\\|": ["\\|", "‖", tt.LEFTRIGHT, ""], - "‖": ["‖", "‖", tt.LEFTRIGHT, ""], - "<<": ["<<", "\u27E8", tt.LEFTBRACKET, "\u27E9"], - ">>": [">>", "\u27E9", tt.RIGHTBRACKET, ""], - "\u23BF": ["\u23BF", "\\lfloor ", tt.LEFTBRACKET, "\\rfloor "], - "\u230B": ["\u230B", "\\rfloor ", tt.RIGHTBRACKET, ""], - "\u23CC": ["\u23CC", "\\rfloor ", tt.RIGHTBRACKET, ""], - "\u2308": ["\u2308", "\\lceil ", tt.LEFTBRACKET, "\\rceil "], - "\u23BE": ["\u23BE", "\\lceil ", tt.LEFTBRACKET, "\\rceil "], - "\u2309": ["\u2309", "\\rceil ", tt.RIGHTBRACKET, ""], - "\u23CB": ["\u23CB", "\\rceil ", tt.RIGHTBRACKET, ""], - "\u3016": ["\u3016", "{", tt.LEFTBRACKET, "}"], - "\u3017": ["\u3017", "}", tt.RIGHTBRACKET, ""], - "¦": ["¦", "\\mid ", tt.REL, ""], - - // double-struck, i.e. blackboard bold - "ℂ": ["ℂ", "\u2102", tt.ORD, ""], - "ℕ": ["ℕ", "\u2115", tt.ORD, ""], - "ℚ": ["ℚ", "\u211A", tt.ORD, ""], - "ℝ": ["ℝ", "\u211D", tt.ORD, ""], - "ℤ": ["ℤ", "\u2124", tt.ORD, ""], - - "ℏ": ["ℏ", "ℏ", tt.ORD, ""], - - //arrows - "\u2192": ["\u2192", "\u2192", tt.REL, ""], - "\u2190": ["\u2190", "\u2190", tt.REL, ""], // left arrow - ">->": [">->", "\u21a3", tt.REL, ""], // \rightarrowtail - "->>": ["->>", "\u21a0", tt.REL, ""], // \twoheadrightarrow - "|->": ["|->", "\u21a6", tt.REL, ""], // \mapsto - - // extensible arrows - "<--": ["<--", "\\xleftarrow", tt.UNARY, ""], - "==>": ["==>", "\\xRightarrow", tt.UNARY, ""], - "<==": ["<==", "\\xLeftarrow", tt.UNARY, ""], - "<-->": ["<-->", "\\xleftrightarrow", tt.UNARY, ""], - "<==>": ["<==>", "\\xLeftrightarrow", tt.UNARY, ""], - - "\u2220": ["\u2220", "\u2220", tt.ANGLE, ""], - "✓": ["✓", "✓", tt.ORD, ""], - "˽": ["˽", "~", tt.SPACE, ""], // "~" is a no-break space in LaTeX. - "\\;": ["\\;", ";\\:", tt.SEP, ""], - "…": ["…", "…", tt.ORD, ""], - - ":": [":", "{:}", tt.RANGE, ""], // range separator - ",": [",", ",\\:", tt.SEP, ""], // function argument or vector row separator - "\t": ["\t", " & ", tt.SEP, ""], // matrix element separator - ";": [";", " \\\\ ", tt.SEP, ""], // row separator - - "$": ["$", "\\$", tt.CURRENCY, ""], - "£": ["£", "£", tt.CURRENCY, ""], - "¥": ["¥", "¥", tt.CURRENCY, ""], - "€": ["€", "€", tt.CURRENCY, ""], - "₨": ["₨", "₨", tt.CURRENCY, ""], - "₩": ["₩", "₩", tt.CURRENCY, ""], - "₪": ["₪", "₪", tt.CURRENCY, ""] -}); - -const texFunctionRegEx = /^(\\[A-Za-z]+\.?|\\([:.!\u0020]|'+))/; - -const texFunctions = Object.freeze({ - // input, output, type, closeDelim - "\\aleph": ["\\aleph", "\u2135", tt.VAR, ""], - "\\beth": ["\\beth", "\u2136", tt.VAR, ""], - "\\gimel": ["gimel", "\u2137", tt.VAR, ""], - "\\daleth": ["daleth", "\u2138", tt.VAR, ""], - "\\atop": ["\\atop", "\\atop{", tt.DIV, ""], - "\\cdots": ["\\cdots", "\u22ef", tt.BIN, ""], - "\\vdots": ["\\vdots", "\u22ee", tt.BIN, ""], - "\\ddots": ["\\ddots", "\u22f1", tt.BIN, ""], - "\\iff": ["\\iff", "\\iff", tt.LOGIC, ""], - "\\land": ["\\land", "\\land", tt.BIN, ""], - "\\lor": ["\\lor", "\\lor", tt.BIN, ""], - "\\ngtr": ["\\ngtr", "\\ngtr", tt.REL, ""], - "\\nless": ["\\nless", "\\nless", tt.REL, ""], - "\\nleq": ["\\nleq", "\\nleq", tt.REL, ""], - "\\ngeq": ["\\ngeq", "\\ngeq", tt.REL, ""], - "\\in": ["\\in", "∈", tt.REL, ""], - "\\notin": ["\\notin", "∉", tt.REL, ""], - "\\subset": ["\\subset", "⊂", tt.REL, ""], - "\\subseteq": ["\\subseteq", "⊆", tt.REL, ""], - "\\nsubset": ["\\nsubset", "⊄", tt.REL, ""], - "\\nsubseteq": ["\\nsubseteq", "⊈", tt.REL, ""], - "\\supset": ["\\subset", "⊃", tt.REL, ""], - "\\left.": ["\\left.", "\\left.", tt.LEFTBRACKET, "\\right."], - "\\right.": ["\\right.", "\\right.", tt.RIGHTBRACKET, ""], - "\\mod": ["\\mod", "\\mod", tt.BIN, ""], - "\\diamond": ["\\diamond", "\\diamond", tt.ORD, ""], - "\\square": ["\\square", "\\square", tt.ORD, ""], - "\\int": ["\\int", "\\displaystyle\\int", tt.BIG_OPERATOR, ""], - "\\iint": ["\\iint", "\\displaystyle\\iint", tt.BIG_OPERATOR, ""], - "\\iiint": ["\\iiint", "\\displaystyle\\iiint", tt.BIG_OPERATOR, ""], - "\\oint": ["\\oint", "\\displaystyle\\oint", tt.BIG_OPERATOR, ""], - "\\oiint": ["\\oiint", "\\displaystyle\\oiint", tt.BIG_OPERATOR, ""], - "\\oiiint": ["\\oiiint", "\\displaystyle\\oiiint", tt.BIG_OPERATOR, ""], - "\\over": ["\\over", "\\dfrac{", tt.DIV], - "\\sum": ["\\sum", "\\displaystyle\\sum", tt.BIG_OPERATOR, ""], - "\\prod": ["\\prod", "\\displaystyle\\prod", tt.BIG_OPERATOR, ""], - "\\quad": ["\\quad", "\\quad", tt.SPACE, ""], - "\\qquad": ["\\qquad", "\\qquad", tt.SPACE, ""] -}); - -const accents = new Set([ - "Bbb", - "Overrightarrow", - "acute", - "bar", - "bm", - "bold", - "boldsymbol", - "breve", - "check", - "ddot", - "dot", - "frak", - "grave", - "hat", - "mathbb", - "mathbf", - "mathcal", - "mathfrak", - "mathit", - "mathnormal", - "mathring", - "mathrm", - "mathscr", - "mathsf", - "mathtt", - "overbrace", - "overgroup", - "overleftarrow", - "overleftharpoon", - "overleftrightarrow", - "overline", - "overrightarrow", - "overrightharpoon", - "tilde", - "underbrace", - "undergroup", - "underleftarrow", - "underleftrightarrow", - "underline", - "underrightarrow", - "utilde", - "vec", - "widecheck", - "widehat", - "widetilde" -]); - -// Avoid "operatorname" for functions that are already math operators. -const mathOperators = new Set([ - "arccos", - "arcsin", - "arctan", - "arctg", - "arcctg", - "cos", - "cosec", - "cosh", - "cot", - "cotg", - "coth", - "csc", - "ctg", - "cth", - "det", - "dim", - "exp", - "gcd", - "lg", - "lim", - "ln", - "log", - "max", - "min", - "sec", - "sin", - "sinh", - "sh", - "sqrt", - "sup", - "tan", - "tanh", - "tg", - "th" -]); - -const colors = new Set([ - "blue", - "firebrick", - "gray", - "green", - "orange", - "pink", - "purple", - "red" -]); - -const unaries = new Set([ - "bcancel", - "boxed", - "cancel", - // Hurmet does not support \ce. - "clap", - "color", - "llap", - "mathclap", - "not", - "operatorname", - "phantom", - "pu", - "rlap", - "sout", - "sqrt", - "tag", - "textbf", - "textit", - "textmd", - "textnormal", - "textrm", - "textsc", - "textsf", - "texttt", - "textup", - "xLeftarrow", - "xLeftrightarrow", - "xRightarrow", - "xcancel", - "xleftarrow", - "xleftrightarrow", - "xleftharpoondown", - "xleftharpoons", - "xleftharpoonup", - "xlongequal", - "xmapsto", - "xrightarrow", - "xrightharpoondown", - "xrightharpoonup", - "xrightleftarrows", - "xrightleftharpoons", - "xtofrom", - "xtwoheadleftarrow", - "xtwoheadrightarrow" -]); - -const binaries = new Set([ - "dfrac", - "frac", - "lower", - "overset", - "raisebox", - "stackrel", - "tag", - "tfrac", - "underset" -]); - -const texREL = new Set([ - "Bumpeq", "Colonapprox", "Coloneq", "Coloneqq", "Colonsim", "Darr", "Doteq", "Downarrow", - "Eqcolon", "Eqqcolon", "Harr", "Larr", "Leftarrow", "Leftrightarrow", "Lleftarrow", - "Longleftarrow", "Longleftrightarrow", "Longrightarrow", "Lrarr", "Lsh", "Rarr", - "Rightarrow", "Rrightarrow", "Rsh", "Supset", "Subset", "Uarr", "Uparrow", "Updownarrow", - "Vdash", "Vvdash", "approx", "approxeq", "asymp", "backepsilon", "backsim", "backsimeq", - "between", "bowtie", "bumpeq", "circeq", "circlearrowleft", "circlearrowright", - "colonapprox", "coloneq", "coloneqq", "colonsim", "cong", "curlyeqprec", "curlyeqsucc", - "curvearrowleft", "curvearrowright", "dArr", "darr", "dashleftarrow", "dashrightarrow", - "dashv", "dblcolon", "doteq", "doteqdot", "downarrow", "downdownarrows", "downharpoonleft", - "downharpoonright", "eqcirc", "eqcolon", "eqqcolon", "eqsim", "eqslantgtr", "eqslantless", - "equiv", "fallingdotseq", "frown", "ge", "geq", "geqq", "geqslant", "gets", "gg", "ggg", - "gggtr", "gnapprox", "gneq", "gneqq", "gnsim", "gt", "gtrapprox", "gtreqless", "gtreqqless", - "gtrless", "gtrsim", "gvertneqq", "hArr", "harr", "hookleftarrow", "hookrightarrow", "iff", - "impliedby", "implies", "in", "isin", "Join", "gets", "impliedby", "implies", "in", - "lArr", "larr", "le", "leadsto", "leftarrow", "leftarrowtail", "leftharpoondown", - "leftharpoonup", "leftleftarrows", "leftrightarrow", "leftrightarrows", "leftrightharpoons", - "leftrightsquigarrow", "leq", "leqq", "leqslant", "lessapprox", "lesseqgtr", "lesseqqgtr", - "lessgtr", "lesssim", "ll", "lll", "llless", "lnapprox", "lneq", "lneqq", "lnsim", - "longleftarrow", "longleftrightarrow", "longmapsto", "longrightarrow", "looparrowleft", - "looparrowright", "lrArr", "lrarr", "lt", "lvertneqq", "mapsto", "mid", "models", - "multimap", "nLeftarrow", "nLeftrightarrow", "nRightarrow", "nVDash", "nVdash", "ncong", - "ne", "nearrow", "neq", "nexists", "ngeq", "ngeqq", "ngeqslant", "ngtr", "ni", "nleftarrow", - "nleftrightarrow", "nleq", "nleqq", "nleqslant", "nless", "nmid", "notin", "notni", - "nparallel", "nprec", "npreceq", "nrightarrow", "nshortmid", "nshortparallel", "nsim", - "nsubseteq", "nsubseteqq", "nsucc", "nsucceq", "nsupseteq", "nsupseteqq", "ntriangleleft", - "ntrianglelefteq", "ntriangleright", "ntrianglerighteq", "nvDash", "nvdash", "nwarrow", - "owns", "parallel", "perp", "pitchfork", "prec", "precapprox", "preccurlyeq", "preceq", - "precnapprox", "precneqq", "precnsim", "precsim", "propto", "rArr", "rarr", "restriction", - "rightarrow", "rightarrowtail", "rightharpoondown", "rightharpoonup", "rightleftarrows", - "rightleftharpoons", "rightrightarrows", "rightsquigarrow", "risingdotseq", "searrow", - "shortmid", "shortparallel", "sim", "simeq", "smallfrown", "smallsmile", "smile", - "sqsubset", "sqsubseteq", "sqsupset", "sqsupseteq", "sub", "sube", - "subseteqq", "subsetneq", "subsetneqq", "succ", "succapprox", "succcurlyeq", "succeq", - "succnapprox", "succneqq", "succnsim", "succsim", "supe", "supset", "supseteq", "supseteqq", - "supsetneq", "supsetneqq", "swarrow", "thickapprox", "thicksim", "to", "trianglelefteq", - "triangleq", "trianglerighteq", "twoheadleftarrow", "twoheadrightarrow", "uArr", "uarr", - "uparrow", "updownarrow", "upharpoonleft", "upharpoonright", "upuparrows", "varpropto", - "varsubsetneq", "varsubsetneqq", "varsupsetneq", "varsupsetneqq", "vartriangle", - "vartriangleleft", "vartriangleright", "vcentcolon", "vdash", "vDash" -]); - -const superRegEx = /^⁻?[²³¹⁰⁴⁵⁶⁷⁸⁹]+/; - -const cloneToken$1 = tkn => [tkn[0], tkn[1], tkn[2], tkn[3]]; - -const accentFromChar = Object.freeze({ - "\u0300": "\\grave", - "\u0301": "\\acute", - "\u0302": "\\hat", - "\u0303": "\\tilde", - "\u0304": "\\bar", - "\u0305": "\\bar", - "\u0307": "\\dot", - "\u0308": "\\ddot", - "\u030A": "\\mathring", - "\u030C": "\\check", - "\u0332": "\\underline", - "\u20d0": "\\overleftharpoon", - "\u20d1": "\\overrightharpoon", - "\u20d6": "\\overleftarrow", - "\u20d7": "\\vec", - "\u20e1": "\\overleftrightarrow" -}); - -const wideAccentFromChar = Object.freeze({ - "\u0300": "\\grave", - "\u0301": "\\acute", - "\u0302": "\\widehat", - "\u0303": "\\widetilde", - "\u0304": "\\overline", - "\u0305": "\\overline", - "\u0307": "\\dot", - "\u0308": "\\ddot", - "\u030A": "\\mathring", - "\u030C": "\\check", - "\u0332": "\\underline", - "\u20d0": "\\overleftharpoon", - "\u20d1": "\\overrightharpoon", - "\u20d6": "\\overleftarrow", - "\u20d7": "\\overrightarrow", - "\u20e1": "\\overleftrightarrow" -}); - -const groupSubscript = word => { - const pos = word.indexOf("_"); - return pos === -1 - ? word - : word.slice(0, pos + 1) + "{" + word.slice(pos + 1) + "}" -}; - -const checkForTrailingAccent = word => { - const ch = word.slice(-1); - if (/[\u0300-\u0308\u030A\u030C\u0332\u20d0\u20d1\u20d6\u20d7\u20e1]/.test(ch)) { - word = word.slice(0, -1); - return word === "i" - ? accentFromChar[ch] + "{ı}" // dotless i - : word === "j" - ? accentFromChar[ch] + "{ȷ}" // dotless j - : word.length === 1 - ? accentFromChar[ch] + "{" + word + "}" - : wideAccentFromChar[ch] + "{" + word + "}" - } else { - return word - } -}; - -const lexOneWord = (str, prevToken) => { - const matchObj = wordRegEx.exec(str); - if (matchObj) { - let match = matchObj[0].replace(/_*$/, ""); // drop trailing underscores - - // Get the immediately following character - const fc = str.charAt(match.length); - - const word = words[match]; - if (word && fc !== "′") { - return word - } else if (/^\(/.test(fc)) { - // word is followed by an open paren. Treat it as a function name - return (prevToken.ttype === tt.ACCENT) - ? [match, match + "}{", tt.FUNCTION, ""] - : match === "sqrt" - ? [match, "\\sqrt", tt.UNARY, ""] - : match === "f" - ? [match, match, tt.FUNCTION, ""] - : mathOperators.has(match) - ? [match, "\\" + match, tt.FUNCTION, ""] - : [match, "\\operatorname{" + groupSubscript(match) + "}", tt.FUNCTION, ""] - } else if (prevToken.ttype === tt.ACCESSOR) { - return [match, match, tt.PROPERTY, ""] - } else if (/[_\u0300-\u0308\u030A\u030C\u0332\u20d0\u20d1\u20d6\u20d7\u20e1]/.test(match)) { - let identifier = ""; - if (match.indexOf("_") === -1) { - identifier = checkForTrailingAccent(match); - return [match, identifier, (match.length > 2) ? tt.LONGVAR : tt.VAR, ""] - } else { - const segments = match.split("_"); - for (let i = segments.length - 1; i >= 0; i--) { - segments[i] = checkForTrailingAccent(segments[i]); - if (i > 0) { - segments[i] = "_\\text{" + segments[i] + "}"; - } - } - identifier = segments.join(""); - const primes = /^′*/.exec(str.slice(match.length)); - if (primes) { - match += primes[0]; - identifier += "'".repeat(primes[0].length); - } - const pos = identifier.indexOf("_"); - if (pos > -1) { - // Cramp subscript placement by wrapping it with braces. - // This helps Cambria Math to supply the correct size radical. - identifier = identifier.slice(0, pos) + "{" + identifier.slice(pos) + "}"; - } - return [match, identifier, (segments[0].length > 1) ? tt.LONGVAR : tt.VAR, ""] - } - } else if (match.length === 2 & match.charAt(0) === "\uD835") { - return [match, match, tt.VAR, ""] - } else if (match.length > 1) { - return [match, match, tt.LONGVAR, ""] - } else { - // Return a single character variable name - if (match.charAt(0) === "\uD835") { - return [match.substring(0, 2), match.substring(0, 2), tt.VAR, ""] - } else { - return [match.charAt(0), match.charAt(0), tt.VAR, ""] - } - } - } -}; - -const lex = (str, decimalFormat, prevToken, inRealTime = false) => { - // Get the next token in str. Return an array with the token's information: - // [input, TeX output, type, associated close delimiter] - let pos = 0; - let st = ""; - let matchObj; - - if (str.length > 3 && str.slice(0, 3) === "===") { - // A macro between triple-double quotation marks. - pos = str.indexOf('"""', 3); - if (pos > 0) { - st = str.slice(3, pos); - return ['"""' + st + '"""', st, tt.MACRO, ""] - } else { - return [str, str.slice(3), tt.MACRO, ""] - } - } - - if (str.charAt(0) === '"') { - // String between double quotation marks. Parser will convert it to \text{…} - pos = str.indexOf('"', 1); - if (pos > 0) { - // Disallow \r or \n by truncating the string. - st = str.substring(1, pos).replace(/\r?\n.*/, ""); - return ['"' + st + '"', st, tt.STRING, ""] - } else { - return [str, str.replace(/\r?\n.*/, ""), tt.STRING, ""] - } - } - - if (/^#/.test(str)) { - // comment - st = str.slice(2); - pos = st.indexOf("\n"); - if (pos > -1) { - const posReturn = st.indexOf("\n"); - if (posReturn > -1 && posReturn < pos) { pos = posReturn; } - } - if (pos > -1) { - st = st.slice(0, pos); - } - return [`#${st}`, `\\text{\\texttt{ \\#${st}}}`, tt.COMMENT, ""] - } - - if (/^``/.test(str)) { - // inline TSV string between double back ticks, a data frame literal. - pos = str.indexOf("`", (str.charAt(2) === "`" ? 3 : 2)); - const inputStr = (pos > 0 ? str.slice(2, pos) : str.slice(2)); - const st = tablessTrim(inputStr); - let tex = ""; - if (inRealTime) { - tex = DataFrame.quickDisplay(st); - } else { - const dataStructure = DataFrame.dataFrameFromTSV(st); - tex = DataFrame.display(dataStructure.value, "h3", decimalFormat); - } - return ["``" + inputStr + "``", tex, tt.DATAFRAME, ""] - } - - if (str.charAt(0) === '`') { - // Rich text string. Usually a return from a calculation. - // String between double quotation marks. Parser will convert it to \text{…} - pos = str.indexOf('`', 1); - if (pos > 0) { - // Disallow \r or \n by truncating the string. - st = str.substring(1, pos).replace(/\r?\n.*/, ""); - return ['`' + st + '`', st, tt.RICHTEXT, ""] - } else { - return [str, str.replace(/\r?\n.*/, ""), tt.RICHTEXT, ""] - } - } - - if (unitRegEx.test(str)) { - // String between single quotation marks. That signals a tt.UNIT. - pos = str.indexOf("'", 1); - if (pos > 0) { - st = str.substring(1, pos); - return ["'" + st + "'", unitTeXFromString(st), tt.UNIT, ""] - } else { - // One of the unambiguous unit symbols, like ° or Å - return [str.charAt(0), str.charAt(0), tt.UNIT, ""] - } - } - - // Strings beginning with "\" are passed through as a TeX control word. - matchObj = texFunctionRegEx.exec(str); - if (matchObj) { - // TeX control word, starting with backslash. e.g. \, or \circ - const match = matchObj[0]; - st = match.substring(1); - if (accents.has(st)) { - return [match, match, tt.ACCENT, ""] - } - if (unaries.has(st)) { - return [match, match, tt.UNARY, ""] - } - if (colors.has(st)) { - return [match, "\\textcolor{" + st + "}", tt.UNARY, ""] - } - if (binaries.has(st)) { - return [match, match, tt.BINARY, ""] - } - if (texREL.has(st)) { - return [match, match, tt.REL, ""] - } - const texFunc = texFunctions[match]; - if (texFunc) { - return cloneToken$1(texFunc) - } - // default case is a mathord. So I have not enumerated any ORDs - return [match, match, tt.ORD, ""] - } - - if (minusRegEx.test(str)) { - if (isUnary(prevToken)) { - // Check if the unary minus is part of a number - const numParts = str.match(numberRegEx$4); - if (numParts) { - // numbers - st = texFromNumStr(numParts, decimalFormat); - return [numParts[0], st, tt.NUM, ""] - } - } - return ["-", "-", tt.ADD, ""] - } - - const numParts = str.match(numberRegEx$4); - if (numParts) { - // numbers - st = texFromNumStr(numParts, decimalFormat); - return [numParts[0], st, tt.NUM, ""] - } - - // Before lexing for a word, find underscores before a group - if (/^_[([{]/.test(str)) { - return ["_", "_", tt.SUB, ""] - } - - const word = lexOneWord(str, prevToken); - if (word) { return cloneToken$1(word) } - - const nums = superRegEx.exec(str); - if (nums) { - return [nums[0], nums[0], tt.SUPCHAR, ""] - } - - //return maximal initial substring of str that appears in misc names - matchObj = miscRegEx.exec(str); - if (matchObj) { - const match = matchObj[0]; - for (let i = match.length; i >= 1; i--) { - st = match.substr(0, i); - if (miscSymbols[st]) { return cloneToken$1(miscSymbols[st]) } - } - } - - // No keywords were matched. Return 1 character. - const c1 = str.charAt(0); - if (c1 === "." && (prevToken.ttype === tt.VAR || prevToken.ttype === tt.LONGVAR || - prevToken.ttype === tt.STRING || prevToken.input === "]" || prevToken.input === ")" || - prevToken.ttype === tt.PROPERTY)) { - // Suppress the spacing of the accessor dot. - return [".", "{.}", tt.ACCESSOR, ""] - } - return [c1, addTextEscapes(c1), tt.VAR, ""] -}; - -/* - * parser.js - * - * This file takes a text string and compiles it to TeX. - * If the isCalc flag is set, then parse() also compiles the text to an RPN string - * used elsewhere for further Hurmet computation. - * -*/ - -const builtInFunctions = new Set([ - "Char", "Int", "abs", "acos", "acosd", "acosh", "acot", "acotd", "acoth", "acsc", "acscd", - "acsch", "angle", "asec", "asecd", "asech", "asin", "asind", "asinh", "atan", "atan2", - "atand", "atanh", "binomial", "ceil", "conj", "cos", "cosd", "cosh", - "cosh", "cot", "cotd", "coth", "coth", "count", "csc", "cscd", "csch", "csch", "exp", - "factorial", "fetch", "findmax", "floor", "format", "gamma", "gcd", "hcat", - "hypot", "imag", "isnan", "length", "lerp", "ln", "log", "log10", "log2", "lfact", "lgamma", - "logn", "mod", "number", "ones", "real", "rem", "rms", "round", "roundSig", "roundn", "sec", - "secd", "sech", "sech", "sign", "sin", "sind", "sinh", "startSvg", "string", "tan", "tand", - "tanh", "tanh", "trace", "transpose", "vcat", "zeros", "Γ" -]); - -const builtInReducerFunctions = new Set(["accumulate", "beamDiagram", "dataframe", - "findfirst", "matrix2table", "max", "mean", "median", "min", "product", "rand", "range", - "stddev", "sum", "variance" -]); - -const trigFunctions = new Set(["cos", "cosd", "cot", "cotd", "csc", "cscd", "sec", "secd", - "sin", "sind", "tand", "tan"]); - -const rationalRPN = numStr => { - // Return a representation of a rational number that is recognized by evalRPN(). - const num = Rnl.fromString(numStr); - return "®" + String(num[0]) + "/" + String(num[1]) -}; - -const checkForUnaryMinus = (token, prevToken) => { - switch (prevToken.ttype) { - case tt.NUM: - case tt.ORD: - case tt.VAR: - case tt.RIGHTBRACKET: - case tt.LONGVAR: - case tt.PROPERTY: - case tt.UNIT: - case tt.SUPCHAR: - case tt.PRIME: - case tt.FACTORIAL: - return token - // do nothing - } - if (token.output === "-") { - return { input: "~", output: "\\text{-}", ttype: tt.UNARYMINUS } - } else { - return { input: "+", output: "~+", ttype: tt.UNARYMINUS } - } -}; - -const numFromSuperChar = { - "⁻": "-", - "²": "2", - "³": "3", - "¹": "1", - "⁰": "0", - "⁴": "4", - "⁵": "5", - "⁶": "6", - "⁷": "7", - "⁸": "8", - "⁹": "9" -}; - -const numFromSupChars = str => { - let num = ""; - for (const ch of str) { - num += numFromSuperChar[ch]; - } - return num -}; - -const colorSpecRegEx = /^(#([a-f0-9]{6}|[a-f0-9]{3})|[a-z]+|\([^)]+\))/i; -const accentRegEx = /^(?:.|\uD835.)[\u0300-\u0308\u030A\u030C\u0332\u20d0\u20d1\u20d6\u20d7\u20e1]_/; - -const factors = /^[A-Za-zıȷ\u0391-\u03C9\u03D5\u210B\u210F\u2110\u2112\u2113\u211B\u212C\u2130\u2131\u2133\uD835[({√∛∜]/; - -const setUpIf = (rpn, tokenInput, exprStack, delim) => { - // The Hurmet CASES expression acts lazily. To accommodate that, push the - // sub-expression onto a stack of expressions. At the closing brace, - // we'll pop all the expressions off the stack and place them after the conditions. - // Later, evaluate.js will evaluate the conditions and then pick the correct expression. - const expression = rpn.replace(/^.*\xa0/, "").replace(/§$/, "\xa0"); - exprStack.push(expression); - rpn = rpn.length === expression.length ? "" : rpn.slice(0, rpn.length - expression.length); - delim.numArgs += 1; - if (tokenInput === "otherwise") { rpn += "true"; } - return rpn -}; - -const functionExpoRegEx = /^[\^⁻⁰¹²³\u2074-\u2079]/; - -const openParenRegEx$1 = /^ *\(/; - -const exponentOfFunction = (str, decimalFormat, isCalc) => { - // As in: sin²() - let expoInput = ""; - if (str.charAt(0) !== "^") { - expoInput = /^⁻?[⁰¹²³\u2074-\u2079⁻]+/.exec(str)[0]; - expoInput = expoInput.split("").map(ch => numeralFromSuperScript(ch)).join(""); - } else if (!openParenRegEx$1.test(str.slice(1))) { - expoInput = lex(str.slice(1), decimalFormat, { input: "", output: "", ttype: 50 })[0]; - } else { - // The exponent is in parens. Find its extent. - expoInput = "("; - let level = 1; - for (let i = 2; i < str.length; i++) { - const ch = str.charAt(i); - expoInput += ch; - if ("\"'`".indexOf(ch) > -1) { - const pos = str.indexOf(ch, i + 1); - expoInput += str.slice(i + 1, pos + 1); - i = pos; - } else if ("([{⟨\u2308\u23BF\u23BE\u3016".indexOf(ch) > -1) { - level += 1; - } else if (")]}⟩\u2309\u230B\u23CC\u3017".indexOf(ch) > -1) { - level -= 1; - } - if (level === 0) { break } - } - } - - const parseInput = (expoInput.charAt(0) === "(") - ? expoInput.slice(1, -1).trim() - : expoInput; - - if (isCalc) { - const expoOutput = parse$1(parseInput, decimalFormat, true); - return [expoInput, "{" + expoOutput[0] + "}", expoOutput[1]] - } else { - const expoTex = parse$1(parseInput, decimalFormat, false); - return [expoInput, "{" + expoTex + "}", ""] - } -}; - -const testForImplicitMult = (prevToken, texStack, str) => { - // Some math expressions imply a multiplication without writing an explicit operator token. - // Examples: e = m c², y = 3(2+5), n = (a+5)x, z = 5 + 2i - // Hurmet writes the echo expression with a more explicit written form of multiplication. - // The echo shows each multiplication in one of three ways: a x b, a · b, or (a)(b) - // This sub is going to determine if such an adjustment is required for the current position. - - if (texStack.length > 0) { - // Test for a tex unary function or a function w/ tt.SUP or tt.SUB - const topType = texStack[texStack.length - 1].ttype; - if (topType === tt.UNARY || topType === tt.BINARY) { return false } - if (topType === tt.SUB || topType === tt.SUP) { - if (texStack[texStack.length - 1].isOnFunction) { return false } - } - } - - let isPreceededByFactor = false; - if (prevToken.output) { - const pc = prevToken.output.charAt(prevToken.length - 1); - if (")]}".indexOf(pc) > -1) { - if ((pc === ")" || pc === "]") && /^[([]/.test(str)) { - // This was already handled by the tt.RIGHTBRACKET case - return false - } else { - isPreceededByFactor = true; - } - } else { - switch (prevToken.ttype) { - case tt.ORD: - case tt.NUM: - case tt.VAR: - case tt.LONGVAR: - case tt.PRIME: - case tt.SUP: - case tt.SUPCHAR: - case tt.SUB: - case tt.PROPERTY: - case tt.UNIT: - case tt.RIGHTBRACKET: - case tt.FACTORIAL: - isPreceededByFactor = true; - break - default: - isPreceededByFactor = false; - } - } - } - if (isPreceededByFactor && nextCharIsFactor(str, prevToken.ttype)) { return true } - return false -}; - -const multiplicands = new Set([tt.ORD, tt.VAR, tt.NUM, tt.LONGVAR, tt.RIGHTBRACKET, - tt.CURRENCY, tt.SUPCHAR, tt.BIG_OPERATOR]); - -const nextCharIsFactor = (str, tokenType) => { - const st = str.replace(leadingLaTeXSpaceRegEx, ""); - const fc = st.charAt(0); - - let fcMeetsTest = false; - if (st.length > 0) { - if (fc === "|" || fc === "‖") ; else if (/^[({[√∛∜∑0-9]/.test(st) && multiplicands.has(tokenType)) { - return true - } else { - if (factors.test(fc)) { - fcMeetsTest = !/^(if|and|atop|or|else|elseif|otherwise|not|for|in|while|end)\b/.test(st); - } - } - } - return fcMeetsTest -}; - -const cloneToken = token => { - return { - input: token.input, - output: token.output, - ttype: token.ttype, - closeDelim: token.closeDelim - } -}; - -const endOfOrd = new Set([tt.ORD, tt.VAR, tt.NUM, tt.LONGVAR, tt.RIGHTBRACKET, tt.SUPCHAR]); - -// The RegEx below is equal to /^\s+/ except it omits \n, \t, and the no-break space \xa0. -// I use \xa0 to precede the combining arrow accent character \u20D7. -const leadingSpaceRegEx$2 = /^[ \f\r\v\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]+/; -const leadingLaTeXSpaceRegEx = /^(˽|\\quad|\\qquad)+/; -const sumRegEx = /\\∑_¿([^\xa0]+)([^=]+)\xa0=(\xa0[^^]+)\xa0\^\xa0([^∑]+)\xa0∑/; - -/* eslint-disable indent-legacy */ -const rpnPrecFromType = [ - 13, 13, 16, 14, 17, 10, - 8, 10, 13, -1, -1, - -1, 1, -1, 0, 0, - 7, 0, -1, 15, 0, - 6, 8, 5, 4, 1, - 13, 17, 16, -1, 15, - 14, 10, 3, 2, 11, - -1, -1, 4, 3, -1, - -1, -1, -1 -]; - -const texPrecFromType = [ - 12, 12, 15, 13, 16, 10, - 2, 10, 12, 2, 2, - 2, 1, 2, 2, 0, - 2, 1, 2, 14, 1, - 2, 2, 1, 1, 1, - 2, -1, 15, 2, 14, - 13, 9, -1, 1, -1, - 15, -1, 1, -1, 2, - 2, 2, 2 -]; -/* eslint-enable indent-legacy */ - -/* Operator Precedence -TeX RPN - 0 0 ( [ { delimiters - 1 1 , ; : separators for arguments, elements, rows, and ranges - 1 2 for in while loop keywords - 1 3 : range separator - 1 4 if ∧ ∨ logical operators, return - 1 5 < > ≤ ≥ comparisons - 2 6 + - addition and subtraction - 2 7 ∑ big operators - 2 8 * (x)(y) / multiplication, division - 9 10 ∠ \angle. Used as a separator for complex numbers in polar notation - 10 11 - unary minus - 12 13 sqrt sin unary functions, math functions, and binary functions (e.g. root 3 x) - 13 14 ^ superscript, i.e. exponent - 14 15 ! % ‰ ° factorial, percent, permil, degree - 15 16 _ ' . subscript, prime, dot notation property accessor - 16 17 hat bb accent and font -*/ - -// Delimiter types -const dNOTHING = 0; -const dPAREN = 1; // () or [] or {}, but not one of the use cases below -const dFUNCTION = 2; // sin(x) -const dACCESSOR = 3; // identifier[index] or identifier[start:step:end] -const dMATRIX = 4; // [1; 2] or (1 \t 2; 3 \t 4) -const dVECTORFROMRANGE = 5; // [start:end] or [start:step:end] -const dDICTIONARY = 6; // {key => value, key => value} -const dCASES = 7; // { a if b; c otherwise } -const dBINOMIAL = 8; -const dSUBSCRIPT = 9; // Parens around a subscript do not get converted into matrices. -const dDISTRIB = 10; // A probability distribution defined by a confidence interval. - -const parse$1 = ( - str, - decimalFormat = "1,000,000.", - isCalc = false, // true when parsing the blue echo of an expression - inRealTime = false // true when updating a rendering with every keystroke in the editor. -) => { - // Variable definitions - let tex = ""; - let rpn = ""; - let token = {}; - let prevToken = { input: "", output: "", ttype: 50 }; - const dependencies = []; - let mustLex = true; - let mustAlign = false; - let posOfPrevRun = 0; - let isPrecededBySpace = false; - let isFollowedBySpace = false; - let isFollowedBySpaceOrNewline = false; - let isImplicitMult = false; - let followedByFactor = false; - let op; - const texStack = []; // operator stack for TeX rendering - const rpnStack = []; // operator stack for RPN - const delims = [{ delimType: dNOTHING, isTall: false }]; // delimiter stack - let okToAppend = true; - let fc = ""; - let pendingFunctionName = ""; - let tokenSep = "\xa0"; // no break space - let rpnPrec = -1; - const exprStack = []; // Use for lazy evalulation of ternary (If) expressions - let numFreeCommas = 0; // # of items in a tuple - let posArrow = 0; - - // This function, parse(), is the main function for this module. - // Before we get to the start line, we write two enclosed functions, - // popRpnTokens() and popTexTokens(). - // They are placed here in order to share variable scope with parse(). - - const popRpnTokens = rpnPrec => { - if (isCalc && rpnPrec >= 0) { - // Pop operators off the rpnStack and append them to the rpn string - while (rpnStack.length > 0) { - const topPrec = rpnStack[rpnStack.length - 1].prec; - // exponents, from right to left. - if (topPrec < rpnPrec || (topPrec === 13 && rpnPrec === 13)) { break } - const symbol = rpnStack.pop().symbol; - if (symbol === "→") { - rpn = rpn.slice(0, posArrow + 1) + '"' - + rpn.slice(posArrow + 1, -1).replace(/\u00a0/g, "§") + '"' + tokenSep; - posArrow = 0; - } - rpn += symbol + tokenSep; - } - } - }; - - const popTexTokens = (texPrec, okToAppend) => { - - if (!okToAppend) { return } - - // Pop tokens off the texStack. Append closing delimiters to the tex string. - // When necessary, insert an opening brace before a fraction numerator. - if (texStack.length === 0) { - if (prevToken.ttype !== tt.RIGHTBRACKET && prevToken.ttype !== tt.LEFTRIGHT) { - // The purpose of op.pos in general is to let some possible - // upcoming division know where to insert a "\frac{" before the numerator. - // If we've gotten here, then no operators are on the texStack, so set op.pos - // at the beginning of the previous token. - op = { pos: posOfPrevRun, ttype: prevToken.ttype, closeDelim: "" }; - } - return - } - - const topOp = texStack[texStack.length - 1]; - if ( - (texPrec === 2 || texPrec === 12 || texPrec === 14 || texPrec === 15) && - (prevToken.ttype !== tt.RIGHTBRACKET && prevToken.ttype !== tt.LEFTRIGHT) && - topOp.prec < texPrec - ) { - op = { pos: posOfPrevRun, ttype: prevToken.ttype, closeDelim: "" }; - return - } - - // Pop operators whose precedence ≥ texPrec. Append a close delimiter for each. - let delim = {}; - while (texStack[texStack.length - 1].prec >= texPrec && - // Also handle exponents, from right to left, as in 3^4^5 - !(texStack[texStack.length - 1].prec === 13 && texPrec === 13)) { - op = texStack.pop(); - - // Before we append braces, check if we must hide a pair of parens. - if (op.prec === 0) { - // We just popped a delimiter operator. - delim = delims[delims.length - 1]; - if ((op.ttype === tt.LEFTBRACKET || op.ttype === tt.LEFTRIGHT) && - op.closeDelim.length > 0) { - if (texStack.length > 0) { - if ( - op.ttype === tt.LEFTRIGHT && - token.output === ")" && - texStack[texStack.length - 1].closeDelim === ")" - ) { - // op is a middle |, as in P(A|B). Check if it's tall. - if (delim.isTall) { - tex = tex.substring(0, op.pos) + "\\middle" + tex.substring(op.pos); - delims[delims.length - 1].isTall = true; - } - // Pop another delim. - op = texStack.pop(); - delims.pop(); - delim = delims[delims.length - 1]; - } - } - - if (delim.delimType === dDICTIONARY && delim.open.length > 3) { - tex = tex.slice(0, op.pos) + delim.open + tex.slice(op.pos + 2); - op.closeDelim = delim.close; - } else if (delim.delimType === dMATRIX || delim.delimType === dACCESSOR) { - const inc = tex.slice(op.pos, op.pos + 1) === "\\" ? 2 : 1; - tex = tex.slice(0, op.pos) + delim.open + tex.slice(op.pos + inc); - op.closeDelim = delim.close; - } else if (delim.delimType === dCASES) { - tex = tex.slice(0, op.pos) + delim.open + tex.slice(op.pos + 2); - op.closeDelim = delim.close; - } else if (delim.delimType === dPAREN && - delim.name === "(" && /^(\/|\\atop\s)/.test(str)) { - // The parens surround a numerator. Delete them. - tex = tex.substring(0, op.pos) + tex.substring(op.pos + 1); - op.closeDelim = ""; - } else if (delim.isPrecededByDiv && delim.delimType === dPAREN && - delim.name === "(" && (/^[^^_!%°⁻²³¹⁰⁴⁵⁶⁷⁸⁹]/.test(str) || str.length === 0)) { - // The parens surround a denominator. Delete them. - tex = tex.substring(0, op.pos) + tex.substring(op.pos + 1); - op.closeDelim = ""; - } else if (delim.isTall) { - // Make the delims tall. - if (/^\\left/.test(tex.substring(op.pos)) === false) { - tex = tex.substring(0, op.pos) + "\\left" + tex.substring(op.pos); - } - if (/\\right/.test(op.closeDelim) === false) { - op.closeDelim = "\\right" + token.output; - } - } - } - } - - tex = tex.replace(/\\, *$/, ""); // Remove an implicit multiplication space. - tex += op.closeDelim; - - if (op.closeDelim.slice(-1) === "{") { - // We just closed the first part of a binary function, e.g. root()(), - // or a function exponent (sin^2 θ) or function subscript (log_10) - if (op.ttype === tt.BINARY) { - texStack.push({ prec: 12, pos: op.pos, ttype: tt.UNARY, closeDelim: "}" }); - if (isCalc) { - rpn += tokenSep; - if (rpnStack[rpnStack.length - 1].symbol === "\\sqrt") { - rpnStack[rpnStack.length - 1].symbol = "root"; - } - } - } - op.ttype = tt.UNARY; - prevToken = { input: "", output: "", ttype: tt.UNARY }; - return - } - - if (texStack.length === 0 || op.prec === 0) { - return - } - } - }; - - // With the closed functions out of the way, execute the main parse loop. - str = str.replace(leadingSpaceRegEx$2, ""); // trim leading white space from string - str = str.replace(/\s+$/, ""); // trim trailing white space - - while (str.length > 0) { - // Get the next token. - if (str.charAt(0) === "\n") { - str = str.slice(1); - const prevChar = prevToken ? prevToken.input.slice(-1) : "0"; - if ( - prevToken.ttype === tt.COMMENT || - ("{[(,;+-".indexOf(prevChar) === -1 && !/^ *[)}\]]/.test(str)) - ) { - popTexTokens(0, true); - tex += "\\\\ "; - const matchObj = /^ +/.exec(str); - str = str.replace(/^ */, ""); - if (str.length > 0 && str.charAt(0) === "=" & tex.indexOf("=") > -1) { - mustAlign = true; // We'll use the TeX {aligned} environment to align = signs. - tex += "&"; - } else if (matchObj) { - tex += "\\quad ".repeat(matchObj[0].length - 1); - } - } - str = str.trim(); - } - - mustLex = true; // default - - isImplicitMult = isPrecededBySpace && okToAppend && - testForImplicitMult(prevToken, texStack, str); - if (isCalc) { - if (prevToken.input === "⌧" && rpnStack.length > 1 - && rpnStack[rpnStack.length - 2].symbol === "∑" - && rpn.charAt(rpn.length - 2) === "^" - ) { - // This is the space after a ∑_(i=0)^n symbol. Do not treat as implicit multiplication. - rpnStack.pop(); - } - } - - if (isImplicitMult) { - const prevType = prevToken.ttype; - token = { - input: "⌧", - output: [tt.LONGVAR, tt.NUM, tt.UNIT].includes(prevType) ? "\\," : "", - ttype: tt.MULT - }; - isFollowedBySpace = false; - isFollowedBySpaceOrNewline = false; - mustLex = false; - } - - if (mustLex) { - const tkn = lex(str, decimalFormat, prevToken, inRealTime); - token = { input: tkn[0], output: tkn[1], ttype: tkn[2], closeDelim: tkn[3] }; - str = str.substring(token.input.length); - isFollowedBySpace = leadingSpaceRegEx$2.test(str) || /^(˽|\\quad|\\qquad)+/.test(str); - isFollowedBySpaceOrNewline = /^[ \n]/.test(str); - str = str.replace(leadingSpaceRegEx$2, ""); - followedByFactor = nextCharIsFactor(str, token.ttype); - } - - if (token.input === "!" && (isPrecededBySpace || !endOfOrd.has(prevToken.ttype))) { - // Redefine ! as logical not in certain contexts, to match Julia syntax. - token.ttype = tt.UNARY; - token.input = "¬"; - } - - switch (token.ttype) { - case tt.SPACE: // spaces and newlines - case tt.BIN: // infix math operators that render but don't calc, e.g. \bowtie - case tt.ADD: // infix add/subtract operators, + - - case tt.MULT: // infix mult/divide operators, × * · // ÷ - case tt.REL: // relational operators, e.g < == → - case tt.BIG_OPERATOR: { // int, sum, lim, etc - if (token.output.length > 0 && "- +".indexOf(token.output) > -1) { - token = checkForUnaryMinus(token, prevToken); - } - - if (isCalc && token.output === "→") { - // This arrow is used for anonymous functions, e.g., x → cos x. - rpn = rpn.replace(/¿([^\u00a0]+)$/, '"$1"'); - posArrow = rpn.length; - const posBracket = tex.lastIndexOf("〖"); - tex = tex.slice(0, posBracket) + tex.slice(posBracket + 1); - } - - if (isCalc && token.ttype !== tt.SPACE) { - if (token.output !== "\\text{-}" && token.ttype !== tt.BIG_OPERATOR) { - rpn += tokenSep; - } - popRpnTokens(rpnPrecFromType[token.ttype === tt.BIG_OPERATOR ? tt.VAR : token.ttype]); - } - - const texPrec = texPrecFromType[token.ttype]; - popTexTokens(texPrec, okToAppend); - tex += token.output + " "; - posOfPrevRun = tex.length; - - if (token.ttype === tt.BIG_OPERATOR && delims.length > 1) { - delims[delims.length - 1].isTall = true; - } - if (isCalc) { - if (token.input === "∑" || token.input === "\\sum") { - rpn += "\\∑"; - token.input === "∑"; - } - rpnStack.push({ prec: rpnPrecFromType[token.ttype], symbol: token.input }); - } - - okToAppend = true; - break - } - - case tt.ACCESSOR: // dot between a map name and a property, as in r.PROPERTY - case tt.ANGLE: // \angle. Used as a separator for complex numbers in polar notation - token = checkForUnaryMinus(token, prevToken); - if (isCalc) { - rpn += tokenSep; - rpnPrec = rpnPrecFromType[token.ttype]; - popRpnTokens(rpnPrec); - rpnStack.push({ prec: rpnPrec, symbol: token.input }); - } - popTexTokens(texPrecFromType[token.ttype], okToAppend); - tex += isCalc ? token.input : token.output + " "; - okToAppend = true; - break - - case tt.BOOLEAN: - popTexTokens(2, okToAppend); - if (isCalc) { - popRpnTokens(-1); - rpn += token.input; - } - if (isPrecededBySpace) { posOfPrevRun = tex.length; } - tex += token.output; - okToAppend = true; - break - - case tt.NUM: - case tt.ORD: - popTexTokens(2, okToAppend); - if (isCalc) { - // Numbers and ORDs get appended directly onto rpn. Pass -1 to suppress an rpn pop. - popRpnTokens(-1); - rpn += token.ttype === tt.NUM ? rationalRPN(token.input) : token.input; - } - if (isPrecededBySpace) { posOfPrevRun = tex.length; } - if (isCalc && - (prevToken.ttype === tt.MULT || (followedByFactor && prevToken.ttype !== tt.DIV))) { - token.output = "(" + token.output + ")"; - } - tex += token.output + " "; - okToAppend = true; - - if (!isFollowedBySpace && followedByFactor) { - // We've encountered something like the expression "2a". - popTexTokens(2, okToAppend); - if (isCalc) { - rpnPrec = rpnPrecFromType[tt.MULT]; - rpn += tokenSep; - popRpnTokens(rpnPrec); - rpnStack.push({ prec: rpnPrec, symbol: "⌧" }); - } - } - break - - case tt.STRING: { - popTexTokens(2, okToAppend); - const ch = token.input.charAt(0); - if (isCalc) { rpn += ch + token.output + ch; } // Keep before addTextEscapes() - if (isPrecededBySpace) { posOfPrevRun = tex.length; } - token.output = addTextEscapes(token.output); - token.output = token.output.replace(/ +$/, "\\,"); // Prevent loss of trailing space - tex += "\\text{" + token.output + "}"; - okToAppend = true; - break - } - - case tt.RICHTEXT: { - popTexTokens(2, okToAppend); - const ch = token.input.charAt(0); - if (isCalc) { rpn += ch + token.output + ch; } - if (isPrecededBySpace) { posOfPrevRun = tex.length; } - token.output = token.output === "`" ? "`" : parse$1(token.output, decimalFormat, false); - tex += "{" + token.output + "}"; - okToAppend = true; - break - } - - case tt.MACRO: { - popTexTokens(2, okToAppend); - if (isCalc) { rpn += '"""' + token.output + '"""'; } // Keep before addTextEscapes() - if (isPrecededBySpace) { posOfPrevRun = tex.length; } - token.output = addTextEscapes(token.output); - tex += "\\text{" + token.output + "}"; - okToAppend = true; - break - } - - case tt.DATAFRAME: - popTexTokens(2, okToAppend); - posOfPrevRun = tex.length; - tex += token.output; - if (isCalc) { - rpn += token.input; - // Identify string interpolation - const matches = arrayOfRegExMatches(interpolateRegEx, token.input); - for (const match of matches) { - dependencies.push(match.value.slice(2, -1)); - } - } - okToAppend = true; - break - - case tt.VAR: // variable name, one letter long - case tt.LONGVAR: { // multi-letter variable name - if (token.ttype === tt.LONGVAR && prevToken.input === "⌧") { - tex += "\\,"; // Place a space before a long variable name. - } - // variables get appended directly onto rpn. - popTexTokens(7, okToAppend); - if (isPrecededBySpace) { posOfPrevRun = tex.length; } - - if (!isCalc) { - if (token.ttype === tt.LONGVAR) { - if (!accentRegEx.test(token.input)) { - token.output = "\\mathrm{" + token.output + "}"; - } - } - } else if (prevToken.input === "for") { - rpn += '"' + token.input + '"'; // a loop index variable name. - } else { - // We're in the echo of a Hurmet calculation. - if (/^(\.[^.]|\[)/.test(str) || token.input === "im") { - // When the blue echo has an index in a bracket, e.g., varName[index], it renders - // the name of the variable, not the value. The value of the value of the index. - token.output = token.ttype === tt.LONGVAR - ? "\\mathrm{" + token.output + "}" - : token.output; - } else { - token.output = token.input; - token.output = (posArrow > 0 ? "" : "〖") + token.output; - } - rpn += token.input === "im" ? "im" : "¿" + token.input; - if (token.input !== "im") { dependencies.push(token.input); } - } - - tex += token.output + (str.charAt(0) === "." ? "" : " "); - if (isCalc) { - // The variable's value may be tall. We don't know. - delims[delims.length - 1].isTall = true; - } - okToAppend = true; - break - } - - case tt.UNIT: { // e.g. 'meters' - if (delims.length > 1 && delims[delims.length - 1].delimType === dMATRIX) { - token.output = "\\text{Error. Write a unit name outside a matrix, not inside. " - + "Apply one unit to the entire matrix.}"; - } - popTexTokens(14, true); - texStack.push({ prec: 14, pos: op.pos, ttype: tt.UNIT, closeDelim: "" }); - if (isCalc) { - popRpnTokens(rpnPrecFromType[tt.UNIT]); - rpn += tokenSep + "applyUnit" + tokenSep + token.input.replace(/'/g, ""); - } - if (!/^'?°'?$/.test(token.input)) { tex += "\\;"; } - tex += token.output; - okToAppend = true; - break - } - - case tt.PROPERTY: { - // A word after a dot ACCESSOR operator. I.e., A property in dot notation - // Treat somewhat similarly to tt.STRING - popTexTokens(15, okToAppend); - const pos = token.input.indexOf("_"); - if (isCalc) { - rpn += '"' + token.output + '"'; - tex += `\\mathrm{${token.output}}`; - if (str.charAt(0) !== ".") { tex += " "; } - } else if (pos > -1) { - tex += token.input.substring(0, pos) + "_\\mathrm{" + - token.input.substring(pos + 1) + "}"; - } else { - token.output = addTextEscapes(token.output); - token.output = token.output.replace(/ +$/, "\\,"); // Prevent loss of trailing space - tex += "\\text{" + token.output + "}"; - } - okToAppend = true; - break - } - - case tt.TO: { - // A probability distribution defined by its low and high values. - // As in: (2 to 3) or [2 to 3] or {2 to 3} - delims[delims.length - 1].delimType = dDISTRIB; - popTexTokens(1, okToAppend); - posOfPrevRun = tex.length; - tex += token.output; - if (isCalc) { - rpn += tokenSep; - popRpnTokens(3); - const symbol = delims[delims.length - 1].symbol; - const distribution = symbol === "(" - ? "normal" - : symbol === "[" - ? "uniform" - : "lognormal"; - rpnStack.push({ prec: 3, symbol: distribution }); - } - break - } - - case tt.RANGE: { - // range separator, as in 1:n - popTexTokens(1, okToAppend); - posOfPrevRun = tex.length; - if (isCalc && token.input !== "...") { - rpn += tokenSep; - popRpnTokens(3); - rpnStack.push({ prec: 3, symbol: ":" }); - if (["[", ","].includes(prevToken.input) && /^[,\]]/.test(str)) { - // A bare colon in a accessor, e.g., M[:, 2] - rpn += `®1/1${tokenSep}"∞"`; - } else if (/^end[,\]]/.test(str)) { - rpn += '"∞"'; // slice of the form: identifier[n:end] - str = str.slice(3); - } - } - const topDelim = delims[delims.length - 1]; - tex += topDelim.delimType === dPAREN && topDelim.symbol === "{" - ? "\\colon" - : token.output; - break - } - - case tt.DIV: { // / or \atop - if (isCalc) { rpn += tokenSep; } - popTexTokens(2, true); - rpnPrec = rpnPrecFromType[tt.DIV]; - popRpnTokens(rpnPrec); - if (token.input === "//") { - // case fraction - texStack.push({ prec: 2, pos: op.pos, ttype: tt.DIV, closeDelim: "}" }); - tex = tex.substring(0, op.pos) + "\\tfrac{" + tex.substring(op.pos) + "}{"; - } else if (token.input === "/" || token.input === "\\over") { - // displaystyle fraction - texStack.push({ prec: 2, pos: op.pos, ttype: tt.DIV, closeDelim: "}" }); - tex = tex.substring(0, op.pos) + "\\dfrac{" + tex.substring(op.pos) + "}{"; - } else { - // atop, for binomials - texStack.push({ prec: 2, pos: op.pos, ttype: tt.DIV, closeDelim: "}}" }); - tex = tex.substring(0, op.pos) + "{{" + tex.substring(op.pos) + "}\\atop{"; - if (delims[delims.length - 1].name === "(") { - delims[delims.length - 1].delimType = dBINOMIAL; - } - } - if (isCalc) { - if (token.input === "\\atop") { - if (delims[delims.length - 1].delimType === dBINOMIAL) { - rpnStack.push({ prec: rpnPrec, symbol: "()" }); - } - } else { - rpnStack.push({ prec: rpnPrec, symbol: token.input }); - } - } - delims[delims.length - 1].isTall = true; - posOfPrevRun = tex.length; - okToAppend = false; - break - } - - case tt.SUB: { // _ - popTexTokens(15, true); - const subCD = prevToken.ttype === tt.FUNCTION ? "}{" : "}"; - texStack.push({ prec: 15, pos: op.pos, ttype: tt.SUB, closeDelim: subCD }); - tex += "_{"; - if (isCalc) { rpn += "_"; } - okToAppend = false; - break - } - - case tt.SUP: // ^ - if (isCalc) { - if (/¿e$/.test(rpn)) { - // e^3. Replace e with 2.7182818284590452353602874713527 - // eslint-disable-next-line max-len - rpn = rpn.slice(0, -2) + "®27182818284590452353602874713527/10000000000000000000000000000000"; - } - rpn += tokenSep; - popRpnTokens(rpnPrecFromType[tt.SUP]); - } - popTexTokens(13, true); - if (prevToken.ttype === tt.RIGHTBRACKET) { - texStack.push({ prec: 13, pos: op.pos, ttype: tt.SUP, closeDelim: "}" }); - } else { - texStack.push({ prec: 13, pos: posOfPrevRun, ttype: tt.SUP, closeDelim: "}" }); - } - if (isCalc) { rpnStack.push({ prec: rpnPrecFromType[tt.SUP], symbol: "^" }); } - if (delims.length > 0 && str.charAt(0) === "(") { - delims[delims.length - 1].isTall = true; - } - tex += "^{"; - okToAppend = false; - break - - case tt.SUPCHAR: { // ²³¹⁰⁴⁵⁶⁷⁸⁹⁻ - if (isCalc) { - if (/¿e$/.test(rpn)) { - // e^3. Replace e with 2.7182818284590452353602874713527 - // eslint-disable-next-line max-len - rpn = rpn.slice(0, -2) + "®27182818284590452353602874713527/10000000000000000000000000000000"; - } - rpn += tokenSep; - popRpnTokens(rpnPrecFromType[tt.SUPCHAR]); - } - popTexTokens(13, true); - const supNum = numFromSupChars(token.output); - if (prevToken.ttype === tt.RIGHTBRACKET) { - texStack.push({ prec: 13, pos: op.pos, ttype: tt.SUP, closeDelim: "}" }); - } else { - texStack.push({ prec: 13, pos: posOfPrevRun, ttype: tt.SUP, closeDelim: "}" }); - } - tex += "^{" + supNum; - if (isCalc) { - rpnStack.push({ prec: rpnPrecFromType[tt.SUPCHAR], symbol: "^" }); - rpn += rationalRPN(supNum); - } - okToAppend = true; - break - } - - case tt.FUNCTION: { // e.g. sin or tan, shows parens - popTexTokens(2, okToAppend); - posOfPrevRun = tex.length; - // Is there an exponent on the function name? - if (functionExpoRegEx.test(str)) { - const [expoInput, expoTex, expoRPN] = exponentOfFunction(str, decimalFormat, isCalc); - if (isCalc && expoRPN === `®-1/1` && trigFunctions.has(token.input)) { - // Inverse trig function. - token.input = "a" + token.input; - token.output = "\\a" + token.output.slice(1); - } else { - if (isCalc) { token.input += tokenSep + expoRPN + tokenSep + "^"; } - token.output += "^" + expoTex; - } - const L = expoInput.length + (str.charAt(0) === "^" ? 1 : 0); - str = str.slice(L).trim(); - } - if (isCalc) { - rpnStack.push({ prec: rpnPrecFromType[tt.FUNCTION], symbol: token.input }); - if (prevToken.input === "⌧") { tex += "×"; } - } - fc = str.charAt(0); - texStack.push({ - prec: 12, - pos: tex.length, - ttype: tt.FUNCTION, - closeDelim: fc === "(" ? "" : "}" - }); - tex += token.output; - tex += fc === "(" ? "" : "{"; - pendingFunctionName = token.input; - okToAppend = false; - break - } - - case tt.ACCENT: - if (isCalc) { - rpn += tokenSep; - popRpnTokens(rpnPrecFromType[tt.ACCENT]); - } - popTexTokens(1, okToAppend); - - if (isCalc) { - texStack.push({ prec: 16, pos: tex.length, ttype: tt.ACCENT, closeDelim: "〗" }); - tex += (posArrow > 0 ? "" : "〖") + token.input; - rpn += "¿" + token.input; - dependencies.push(token.input); - } else { - texStack.push({ prec: 16, pos: tex.length, ttype: tt.ACCENT, closeDelim: "}" }); - tex += token.output + "{"; - } - - delims[delims.length - 1].isTall = true; - okToAppend = false; - break - - case tt.PRIME: - popTexTokens(15, true); - if (isCalc) { - rpn += token.input; - dependencies.push(prevToken.input + token.input); - } - tex = tex.trim() + token.output + " "; - okToAppend = true; - break - - case tt.BINARY: { // e.g. root(3)(x) - popTexTokens(1, okToAppend); - posOfPrevRun = tex.length; - const binCD = token.input === "root" ? "]{" : "}{"; - texStack.push({ prec: 12, pos: tex.length, ttype: tt.BINARY, closeDelim: binCD }); - if (isCalc) { - rpnStack.push({ prec: rpnPrecFromType[tt.BINARY], symbol: token.output }); - } - tex += token.output + (token.input === "root" ? "[" : "{"); - delims[delims.length - 1].isTall = true; - okToAppend = false; - break - } - - case tt.CURRENCY: { // e.g. $, £, etc - popTexTokens(1, okToAppend); - posOfPrevRun = tex.length; - texStack.push({ prec: 12, pos: tex.length, ttype: tt.CURRENCY, closeDelim: "" }); - if (isCalc) { - rpnStack.push({ - prec: rpnPrecFromType[tt.CURRENCY], - symbol: "applyUnit" + tokenSep + token.input - }); - if (prevToken.input === "⌧") { tex += "×"; } - } - tex += token.output; - okToAppend = false; - break - } - - case tt.UNARY: // e.g. bb, hat, or sqrt, or xrightarrow, hides parens - popTexTokens(1, okToAppend); - posOfPrevRun = tex.length; - texStack.push({ prec: 12, pos: tex.length, ttype: tt.UNARY, closeDelim: "}" }); - if (isCalc) { - rpnStack.push({ prec: rpnPrecFromType[tt.UNARY], symbol: token.input }); - if (prevToken.input === "⌧") { tex += "×"; } - } - tex += token.output; - - if (/det|inf/.test(token.input) && str.charAt(0) === "_") { - texStack.push({ prec: 15, pos: tex.length, ttype: tt.SUB, closeDelim: "}" }); - token = { input: "_", output: "_", ttype: tt.SUB }; - tex += "_{"; - str = str.substring(1); - str = str.replace(/^\s+/, ""); - } else if (token.input === "\\color") { - const colorMatch = colorSpecRegEx.exec(str); - if (colorMatch) { - tex += "{" + colorMatch[0].replace(/[()]/g, "") + "}"; - texStack.pop(); - str = str.slice(colorMatch[0].length).trim(); - } else { - // User is in the middle of writing a color spec. Avoid an error message. - tex += "{"; - } - } else { - tex += "{"; - } - delims[delims.length - 1].isTall = true; - okToAppend = false; - break - - case tt.FACTORIAL: - popTexTokens(14, true); - texStack.push({ prec: 14, pos: op.pos, ttype: tt.FACTORIAL, closeDelim: "" }); - if (isCalc) { - popRpnTokens(rpnPrecFromType[tt.FACTORIAL]); - rpn += tokenSep + token.output; - } - tex += token.output; - okToAppend = true; - break - - case tt.RETURN: - // Special treatment in order to enable user-defined functions. - popTexTokens(1, okToAppend); - posOfPrevRun = tex.length; - if (isCalc) { - popRpnTokens(4); - rpnStack.push({ prec: 4, symbol: "return" }); - } - tex += token.output + " "; - break - - case tt.KEYWORD: - // Either "for", "while", or "break" - popTexTokens(1, true); - posOfPrevRun = tex.length; - if (isCalc) { popRpnTokens(2); } - tex += token.output + " "; - break - - case tt.LOGIC: { - // logic words: if and or otherwise - popTexTokens(1, okToAppend); - if (isCalc) { rpn += tokenSep; } - popRpnTokens(4); - const topDelim = delims[delims.length - 1]; - if (token.input === "if" || token.input === "otherwise") { - if (topDelim.delimType === dPAREN && topDelim.name === "{") { - // Change the enclosing delim pair to a CASES expression. - topDelim.delimType = dCASES; - topDelim.close = "\\end{cases}"; - topDelim.open = "\\begin{cases}"; - // In order to get lazy evaluation of a CASES, we will have to move the - // expressions after the conditions. Temporarily change the token separator. - if (isCalc && tokenSep === "\xa0" && token.input === "if") { - // Change the token separators in the preceding RPN. - rpn = rpn.slice(0, topDelim.rpnPos) + - rpn.slice(topDelim.rpnPos).replace(/\xa0/g, "§"); - } - } - } - if (topDelim.delimType === dCASES && ["if", "otherwise"].includes(token.input)) { - tex += "&"; - } - tex += token.output; - if (isCalc) { - if (topDelim.delimType === dCASES && - (token.input === "if" || token.input === "otherwise")) { - // We're in an If Expression and we just reached the end of an expression. - rpn = setUpIf(rpn, token.input, exprStack, topDelim); - tokenSep = "\xa0"; - } else { - rpnStack.push({ prec: 4, symbol: token.input }); - } - } - posOfPrevRun = tex.length; - okToAppend = true; - break - } - - case tt.LEFTBRACKET: { - popTexTokens(2, okToAppend); - const isPrecededByDiv = prevToken.ttype === tt.DIV; - let isFuncParen = false; - - const texStackItem = { - prec: 0, - pos: tex.length, - ttype: tt.LEFTBRACKET, - closeDelim: token.closeDelim - }; - - if ((token.input === "(" || token.input === "[") && prevToken.ttype < 5) { - // The delimiters are here to delimit a TeX function extent. - // Make the delimiters invisible. - texStackItem.closeDelim = ""; - } else if (token.input === "(" && op.ttype === tt.BINARY) { - texStackItem.closeDelim = ""; - } else { - texStackItem.closeDelim = token.closeDelim; - isFuncParen = (token.input === "(" || token.input === "[") && - prevToken.ttype === tt.FUNCTION; - tex += token.output; - } - texStack.push(texStackItem); - - if (isCalc) { - while (rpnStack.length > 0 && rpnStack[rpnStack.length - 1].symbol === ".") { - rpn += tokenSep + rpnStack.pop().symbol; - } - rpnStack.push({ prec: 0, symbol: token.output.trim() }); - } - - const numArgs = /^\s*[)}\]]/.test(str) ? 0 : 1; - - const delim = { - name: token.input, - isTall: false, - open: token.output, - close: texStackItem.closeDelim, - numArgs, - numRows: numArgs, - rpnPos: rpn.length, - isPrecededByDiv, - isFuncParen, - isControlWordParen: prevToken.ttype < 5 - }; - - if (isFuncParen) { - delim.delimType = dFUNCTION; - delim.name = pendingFunctionName; - } else if (prevToken.ttype === tt.SUB) { - delim.delimType = dSUBSCRIPT; - delim.name = "("; - } else if (token.input === "{") { - // This may change to a CASES. - delim.delimType = dPAREN; - delim.rpnLength = rpn.length; - } else if (token.input === "[" && - ([tt.VAR, tt.LONGVAR, tt.STRING, tt.PROPERTY].includes(prevToken.ttype) || - prevToken.input === "]" || (prevToken.input === ")" && !isPrecededBySpace))) { - rpn += tokenSep; - delim.delimType = dACCESSOR; - } else { - // This may change to a MATRIX, but for now we'll say it's a paren. - delim.delimType = dPAREN; - delim.name = token.input; - } - delims.push(delim); - - pendingFunctionName = ""; - posOfPrevRun = tex.length; - okToAppend = false; - break - } - - case tt.SEP: { - // Either a comma or a tab or a semi-colon. Colons are handled elsewhere. - popTexTokens(1, okToAppend); - posOfPrevRun = tex.length; - const delim = delims[delims.length - 1]; - if ((delim.delimType === dPAREN || delim.delimType === dACCESSOR) - && ([";", "\t"].includes(token.input) - || token.input === "," && isFollowedBySpaceOrNewline)) { - delim.delimType = delim.delimType === dPAREN ? dMATRIX : dACCESSOR; - const ch = delim.name === "[" - ? "b" - : delim.name === "(" - ? "p" - : delim.name === "{:" - ? "" - : "B"; - delim.open = `\\begin{${ch}matrix}`; - delim.close = `\\end{${ch}matrix}`; - delim.isTall = true; - } - if (isCalc) { - if (prevToken.ttype === tt.LEFTBRACKET && delim.delimType === dACCESSOR) { - rpn += "®0/1"; - } - rpn += tokenSep; - popRpnTokens(1); - } - if (delim.delimType === dMATRIX && token.input === ",") { - token.output = " & "; - } - - tex += token.output + " "; - - if (isCalc) { - if (delims.length === 1) { - if (token.input === ",") { - numFreeCommas += 1; // item in a tuple - } - } else { - if (token.input === ";") { - delim.numRows += 1; - if (delims.length > 0 && delim.delimType === dCASES) { - // We're about to begin an expression inside an If Expression. - // Temporarily change the token separator. - tokenSep = "§"; - } - } - - if (delim.numRows === 1) { - if ([",", "\t"].includes(token.input) && (str.charAt(0) === "]")) { - rpn += "®0/1"; - } - if (token.input === "," && delim.delimType === dFUNCTION) { - if (delim.numArgs === 2 && delim.name === "plot" ) { - // The literal function for a plot() statement inside a draw() - // Wrap the rpn in quotation marks. - rpn = rpn.slice(0, delim.rpnPos + 5) + '"' - + rpn.slice(delim.rpnPos + 5, -1).replace(/\u00a0/g, "§") + '"' + tokenSep; - } - } - } - delim.numArgs += 1; - } - } - - okToAppend = true; - break - } - - case tt.RIGHTBRACKET: { - popTexTokens(0, true, token.output); - const topDelim = delims.pop(); - - if (topDelim.delimType === dPAREN && (!topDelim.isControlWordParen) - && topDelim.close !== token.output) { - // Enable unmatched delims, such as (1.2] or |ϕ⟩ - tex = tex.slice(0, -1 * topDelim.close.length) + token.output; - } - - if (topDelim.isTall && delims.length > 1) { - // If the inner parens are tall, then the outer parens must also be tall. - delims[delims.length - 1].isTall = true; - } - - if (isCalc) { - while (rpnStack.length > 0 && rpnStack[rpnStack.length - 1].prec > 0) { - rpn += tokenSep + rpnStack.pop().symbol; - } - if (topDelim.delimType === dCASES && prevToken.input !== "otherwise") { - // "otherwise" is optional. We've just found a case where it is omitted. - // So run function setUpIf as if "otherwise" were present. - rpn = setUpIf(rpn, "otherwise", exprStack, topDelim); - tokenSep = "\xa0"; - } - const rpnOp = rpnStack.pop(); - const numArgs = topDelim.numArgs; - const numRows = topDelim.numRows; - const numCols = topDelim.numArgs / topDelim.numRows; - - const firstSep = numArgs === 0 ? "" : tokenSep; - - switch (topDelim.delimType) { - case dFUNCTION: { - let symbol = rpnStack.pop().symbol; - const regEx = new RegExp(tokenSep + '!$'); - if (numArgs === 2) { - if (symbol === "log") { symbol = "logn"; } - if (symbol === "round") { symbol = "roundn"; } - if (symbol === "atan") { symbol = "atan2"; } - if (symbol === "plot") { - rpn = rpn.slice(0, 6) + '"' + rpn.slice(6).replace(/\u00a0/g, "§") + '"'; - } - } else if (symbol === "log" && regEx.test(rpn)) { - rpn = rpn.slice(0, rpn.length - 1) + "lfact"; - break - } - rpn += (symbol.slice(-1) === "^") - ? firstSep + symbol - : builtInFunctions.has(symbol) - ? firstSep + symbol - : builtInReducerFunctions.has(symbol) - ? firstSep + symbol + tokenSep + numArgs - : firstSep + "function" + tokenSep + symbol + tokenSep + numArgs; - break - } - - case dACCESSOR: - // This is the end of a […] following a variable name. - rpn += firstSep + "[]" + tokenSep + numArgs; - break - - case dMATRIX: - rpn += firstSep + "matrix" + tokenSep + numRows + tokenSep + numCols; - break - - case dCASES: - tokenSep = "\xa0"; - rpn += tokenSep + "cases" + tokenSep + numRows + tokenSep; - while (exprStack.length > 0) { - // Append the expressions that correspond to each condition. - rpn += exprStack.shift(); - } - rpn = rpn.slice(0, -1); - break - - case dVECTORFROMRANGE: - // [start:step:end] - rpn += tokenSep + "matrix" + tokenSep + "1" + tokenSep + "1"; - break - - case dDISTRIB: - // (bottom to top) - // Do nothing. This is handled by tt.TO above. - break - - default: - if (numArgs === 0 && topDelim.open === "[") { - // Treat as an empty matrix - rpn += "matrix" + tokenSep + 0 + tokenSep + 0; - } else if (numArgs === 1 && topDelim.open === "[") { - rpn += tokenSep + "matrix" + tokenSep + 1 + tokenSep + 1; - } - if (rpnOp.symbol === "\\lfloor") { rpn += tokenSep + "⎿⏌"; } - if (rpnOp.symbol === "\\lceil") { rpn += tokenSep + "⎾⏋"; } - } - if ((token.input === ")" && - // eslint-disable-next-line max-len - !(topDelim.delimType === dFUNCTION && str.charAt(0) === "[" && !isFollowedBySpace) && - nextCharIsFactor(str, tt.RIGHTBRACKET)) || - (token.input === "]" && /^\(/.test(str) || - topDelim.delimType === dMATRIX && /^\[/.test(str))) { - // Implicit multiplication between parens, as in (2)(3) - rpn += tokenSep; - popRpnTokens(rpnPrecFromType[tt.MULT]); - rpnStack.push({ prec: rpnPrecFromType[tt.MULT], symbol: "⌧" }); - isFollowedBySpace = false; - token = { input: "⌧", output: "⌧", ttype: tt.MULT }; - } - } - - posOfPrevRun = tex.length; - okToAppend = op.ttype !== tt.BINARY; - break - } - - case tt.LEFTRIGHT: { - // A "|" or "‖" character, which are used as |x|, ‖M‖, P(A|B), {x|x ∈ℝ}, |ϕ⟩ - popTexTokens(1, okToAppend); - const topDelim = delims[delims.length - 1]; - - let isRightDelim = false; - if (texStack.length > 0) { - isRightDelim = - texStack[texStack.length - 1].ttype === tt.LEFTRIGHT || - texStack[texStack.length - 1].closeDelim === "\u27E9" || // Dirac ket - texStack[texStack.length - 1].closeDelim === "\\right." || - texStack[texStack.length - 1].closeDelim === "\\end{vmatrix}"; - } - if (isRightDelim) { - // Treat as a right delimiter - topDelim.close = token.input === "|" ? "|" : "‖"; - texStack[texStack.length - 1].closeDelim = topDelim.close; - popTexTokens(0, okToAppend); - delims.pop(); - if (isCalc) { - while (rpnStack.length > 0 && rpnStack[rpnStack.length - 1].prec > 0) { - rpn += tokenSep + rpnStack.pop().symbol; - } - rpn += tokenSep + rpnStack.pop().symbol; - } - okToAppend = op.ttype !== tt.BINARY; - } else if (topDelim.delimType === dPAREN && topDelim.name === "{") { - tex += "\\mid "; - posOfPrevRun = tex.length; - okToAppend = true; - } else { - // Treat as a left delimiter - texStack.push({ - prec: 0, - pos: tex.length, - ttype: tt.LEFTRIGHT, - closeDelim: token.input === "|" ? "|" : "‖" - }); - - delims.push({ - delimType: dPAREN, - name: token.input, - isTall: false, - open: token.input === "|" ? "|" : "‖", - close: token.input === "|" ? "|" : "‖", - numArgs: 1, - numRows: 1, - rpnPos: rpn.length, - isPrecededByDiv: prevToken.ttype === tt.DIV - }); - - if (isCalc) { - rpnStack.push({ prec: 0, symbol: token.output }); - } - - tex += token.input === "|" ? "|" : "‖"; - posOfPrevRun = tex.length; - okToAppend = false; - } - break - } - - case tt.COMMENT: - popTexTokens(0, true); - tex += token.output + " "; - break - - default: - if (isCalc) { - rpn += tokenSep; - popRpnTokens(rpnPrecFromType[tt.ORD]); - } - popTexTokens(1, okToAppend); - texStack.push({ prec: 1, pos: tex.length, ttype: tt.ORD, closeDelim: "" }); - if (isCalc) { rpnStack.push({ prec: rpnPrecFromType[tt.ORD], symbol: token.output }); } - tex += token.output + " "; - posOfPrevRun = tex.length; - okToAppend = true; - } - - prevToken = cloneToken(token); - isPrecededBySpace = isFollowedBySpace || token.input === "⌧"; - } - - popTexTokens(0, true); // Pop all the remaining close delimiters off the stack. - - let indexVariable = ""; - if (isCalc) { - while (rpnStack.length > 0) { - rpn += tokenSep + rpnStack.pop().symbol; - } - let sum = sumRegEx.exec(rpn); - while (sum) { - // We've matched a ∑_(i=0)^n … term. Edit the index variable and the local RPN. - indexVariable = sum[1]; - rpn = rpn.slice(0, sum.index) + '"' + sum[1] + '"' + sum[2] + sum[3] + tokenSep - + '"' + sum[4].replace(/\u00a0/g, "§") + '"\xa0∑' + rpn.slice(sum.index + sum[0].length); - sum = sumRegEx.exec(rpn); - } - if (numFreeCommas > 0) { - rpn += tokenSep + "tuple" + tokenSep + String(numFreeCommas + 1); - } - const varRegEx = /〖[^ ().\\,;]+/g; - let arr; - while ((arr = varRegEx.exec(tex)) !== null) { - if ("¨ˆˉ˙˜".indexOf(arr[0][1]) === -1) { - const pos = arr.index + arr[0].length; - if (tex.length > pos && tex.charAt(pos) === "(") { - // We found a method, not a data index. Delete the 〖 - tex = tex.slice(0, arr.index) + tex.slice(arr.index + 1); - } else { - tex = tex.substring(0, pos) + "〗" + tex.substring(pos); - } - } - } - } - - tex = tex.replace(/ {2,}/g, " "); // Replace multiple spaces with single space. - tex = tex.replace(/\s+(?=[_^'!)}\]〗])/g, ""); // Delete spaces before right delims - tex = tex.replace(/\s+$/, ""); // Delete trailing space - if (indexVariable.length > 0) { - tex = tex.replace(new RegExp(`〖${indexVariable}〗`, "g"), indexVariable); - } - - if (mustAlign) { - const pos = tex.indexOf("="); - tex = "\\begin{aligned}" + tex.slice(0, pos) + "&" + tex.slice(pos) + "\\end{aligned}"; - } - - return isCalc ? [tex, rpn, dependencies] : tex -}; - -function insertOneHurmetVar(hurmetVars, attrs, changedVars, decimalFormat) { - // hurmetVars is a key:value store of variable names and attributes. - // This function is called to insert an assignment into hurmetVars. - const formatSpec = hurmetVars.format ? hurmetVars.format.value : "h15"; - - if (!Array.isArray(attrs.name)) { - // This is the typical case. - hurmetVars[attrs.name] = attrs; - if (changedVars) { - changedVars.add(attrs.name); - } - - } else if (attrs.value === null) { - for (let i = 0; i < attrs.name.length; i++) { - hurmetVars[attrs.name[i]] = { value: null }; - } - - } else if (isMatrix(attrs)) { - // Assign to a matrix of names - const isQuantity = Boolean(attrs.dtype & dt.QUANTITY); - let resultDisplay = attrs.resultdisplay; - resultDisplay = resultDisplay.replace(/\\(begin|end){[bp]matrix}/g, "").trim(); - const displays = resultDisplay.split(/&|\\\\/); - if (attrs.dtype & dt.MATRIX) { - // A 2 dimensional matrix. - const dtype = attrs.dtype - dt.MATRIX; - const numRows = isQuantity ? attrs.value.plain.length : attrs.value.length; - const numCols = attrs.name.length / numRows; - let iName = 0; - for (let i = 0; i < numRows; i++) { - for (let j = 0; j < numCols; j++) { - const value = isQuantity - ? { plain: attrs.value.plain[i][j], inBaseUnits: attrs.value.inBaseUnits[i][j] } - : attrs.value[i][j]; - hurmetVars[attrs.name[i]] = { - name: attrs.name[iName], - value, - resultdisplay: isQuantity - ? parse$1(displays[iName].trim() + " '" + attrs.unit + "'") - : displays[iName].trim(), - expos: attrs.expos, - unit: isQuantity ? attrs.unit : undefined, - dtype - }; - if (changedVars) { changedVars.add(attrs.name[i]); } - iName += 1; - } - } - } else { - // Assign to a vector of names. - const isColumn = Boolean(attrs.dtype & dt.COLUMNVECTOR); - const dtype = attrs.dtype - (isColumn ? dt.COLUMNVECTOR : dt.ROWVECTOR); - for (let i = 0; i < attrs.name.length; i++) { - const value = isQuantity - ? { plain: attrs.value.plain[i], inBaseUnits: attrs.value.inBaseUnits[i] } - : attrs.value[i]; - hurmetVars[attrs.name[i]] = { - name: attrs.name[i], - value, - resultdisplay: isQuantity - ? parse$1(displays[i].trim() + " '" + attrs.unit + "'") - : displays[i].trim(), - expos: attrs.expos, - unit: isQuantity ? attrs.unit : undefined, - dtype - }; - if (changedVars) { changedVars.add(attrs.name[i]); } - } - } - - // From this point forward, we're dealing with multiple assignment - } else if (attrs.dtype & dt.MAP) { - const unit = attrs.unit; - const unitName = unit && unit.name ? unit.name : undefined; - const dtype = attrs.dtype - dt.MAP; - let i = 0; - if (attrs.dtype & dt.QUANTITY) { - for (const value of attrs.value.data.plain) { - const result = { - value: { plain: value }, - expos: attrs.expos, - factor: attrs.factor, - dtype - }; - result.resultdisplay = format(value, formatSpec, decimalFormat); - if (unitName) { result.resultdisplay += " " + unitTeXFromString(unitName); } - hurmetVars[attrs.name[i]] = result; - if (changedVars) { changedVars.add(attrs.name[i]); } - i += 1; - } - i = 0; - for (const value of attrs.value.data.inBaseUnits) { - hurmetVars[attrs.name[i]].value.inBaseUnits = value; - i += 1; - } - } else { - for (const value of attrs.value.data) { - const result = { value, expos: attrs.expos, factor: attrs.factor, dtype }; - result.resultdisplay = Rnl.isRational(value) - ? format(value, formatSpec, decimalFormat) - : String(value); - if (unitName) { result.resultdisplay += " " + unitTeXFromString(unitName); } - hurmetVars[attrs.name[i]] = result; - if (changedVars) { changedVars.add(attrs.name[i]); } - i += 1; - } - } - } else if (attrs.dtype === dt.DATAFRAME) { - const isSingleRow = attrs.value.data[0].length === 1; - for (let i = 0; i < attrs.name.length; i++) { - let dtype = attrs.value.dtype[i]; - let value = isSingleRow ? undefined : []; - for (let j = 0; j < attrs.value.data[0].length; j++) { - const datum = attrs.value.data[i][j]; - const val = (dtype & dt.RATIONAL) ? Rnl.fromString(datum) : datum; - if (isSingleRow) { - value = val; - } else { - value.push(val); - } - } - if (!isSingleRow) { dtype += dt.COLUMNVECTOR; } - const result = { - value, - unit: attrs.unit[attrs.value.units[i]], - dtype - }; - if ((dtype & dt.RATIONAL) && isSingleRow) { - result.resultdisplay = parse$1(format(value)); - if (result.unit && result.unit.name) { - result.resultdisplay += " " + parse$1(`'${result.unit.name}'`); - } - } else if (dtype & dt.RATIONAL) { - result.resultdisplay = Matrix.display({ value, dtype }, formatSpec, decimalFormat) - + parse$1(`'${attrs.value.units[i]}'`); - } else { - result.resultdisplay = parse$1(value); - } - if (attrs.value.units[i]) { - result.value = { plain: result.value }; - const unit = attrs.unit[attrs.value.units[i]]; - result.value.inBaseUnits = isSingleRow - ? Rnl.multiply(Rnl.add(result.value.plain, unit.gauge), unit.factor) - : result.value.plain.map(e => Rnl.multiply(Rnl.add(e, unit.gauge), unit.factor)); - result.expos = unit.expos; - } - - hurmetVars[attrs.name[i]] = result; - if (changedVars) { changedVars.add(attrs.name[i]); } - } - } else if (attrs.dtype === dt.TUPLE) { - let i = 0; - for (const value of attrs.value.values()) { - hurmetVars[attrs.name[i]] = value; - if (changedVars) { changedVars.add(attrs.name[i]); } - i += 1; - } - } else if (attrs.dtype === dt.MODULE) { - if (attrs.name.length !== attrs.value.length) { - return errorOprnd("MULT_MIS") - } else { - let i = 0; - for (const value of attrs.value.values()) { - const result = clone(value); - hurmetVars[attrs.name[i]] = result; - if (changedVars) { changedVars.add(attrs.name[i]); } - i += 1; - } - } - } else ; -} - -/* - * This file deals with Hurmet maps, which are similar to hash maps. - * In a map, every value is of the same data type and has the same unit-of-measure. - */ - -const checkUnitEquality = (u1, u2) => { - let x; - let y; - if (u1.expos && u2.expos) { - x = u1.expos; - y = u2.expos; - } else { - x = u1; - y = u2; - } - if (Array.isArray(x)) { - if (Array.isArray(y)) { - if (x.length !== y.length) { return false } - x.forEach((e, i) => { if (e !== y[i]) { return false } }); - return true - } else { - return false - } - } else { - return x === y - } -}; - -const append = (o1, o2, shape1, shape2) => { - let map; - let scalar; - if (o1.dtype & dt.MAP) { - if (shape2 !== "scalar") { return errorOprnd("BAD_APPEND", shape2) } - map = o1; - scalar = o2; - } else { - if (shape1 !== "scalar") { return errorOprnd("BAD_APPEND", shape1) } - map = o2; - scalar = o1; - } - if (!(map.dtype & scalar.dtype)) { errorOprnd("MAP_APPEND"); } - if (!checkUnitEquality(map.unit, scalar.unit)) { errorOprnd("UNIT_APEND"); } - map.value.set(scalar.name, scalar.value); - return map -}; - -const convertFromBaseUnits = (data, gauge, factor) => { - data = data.map(column => Rnl.isRational(column[0]) - ? column.map(e => Rnl.divide(e, factor)) - : column - ); - if (!Rnl.isZero(gauge)) { - data = data.map(column => Rnl.isRational(column[0]) - ? column.map(e => Rnl.subtract(e, gauge)) - : column - ); - } - return data -}; - -const convertToBaseUnits = (data, gauge, factor) => { - if (!Rnl.isZero(gauge)) { - data = data.map(column => Rnl.isRational(column[0]) - ? column.map(e => Rnl.add(e, gauge)) - : column - ); - } - data = data.map(column => Rnl.isRational(column[0]) - ? column.map(e => Rnl.multiply(e, factor)) - : column - ); - return data -}; - -const range = (map, keys) => { - let unit = clone(map.unit); - const [rowList, columnList, iStart, iEnd] = identifyRange(map, keys); - if (rowList.length === 0 && iStart === iEnd && columnList.length === 1) { - // Return one value. - const value = map.value.data[columnList[0]][iStart]; - return { value, unit, dtype: map.dtype - dt.MAP } - - } else if (columnList.length === 1) { - // Return data from one column, in a column vector or a quantity - const value = map.value.data[columnList[0]].slice(iStart, iEnd + 1); - const dtype = columnList[0] === 0 - ? dt.COLUMNVECTOR + (typeof value[0] === "string" ? dt.STRING : map.dtype - dt.MAP) - : map.dtype - dt.MAP + dt.COLUMNVECTOR; - if (columnList[0] === -1) { unit = null; } - return { value, unit, dtype } - - } else { - // Return a map. - const headings = []; - const data = []; - const columnMap = Object.create(null); - const rowMap = rowList.length === 0 ? false : Object.create(null); - for (let j = 0; j < columnList.length; j++) { - headings.push(map.value.headings[columnList[j]]); - columnMap[map.value.headings[j]] = j; - if (rowList.length > 0) { - const elements = []; - for (let i = 0; i < rowList.length; i++) { - const rowName = rowList[i]; - elements.push(map.value.data[columnList[j]][map.value.rowMap[rowName]]); - rowMap[rowName] = i; - } - data.push(elements); - } else { - data.push(map.value.data[columnList[j]].slice(iStart, iEnd + 1)); - } - } - return { - value: { data, headings, columnMap, rowMap }, - unit, - dtype: map.dtype - } - } -}; - -const map = Object.freeze({ - append, - convertFromBaseUnits, - convertToBaseUnits, - range -}); - -function propertyFromDotAccessor(parent, index, unitAware) { - const property = Object.create(null); - if (parent.dtype & dt.MAP) { - return map.range(parent, [index], unitAware) - - } else if (parent.dtype & dt.DATAFRAME) { - return DataFrame.range(parent, [index], unitAware) - - } else if ((parent.dtype === dt.STRING || (parent.dtype & dt.ARRAY)) && - index.dtype === dt.RATIONAL) { - const indexVal = Rnl.toNumber(index.value); - property.value = parent.value.slice(indexVal - 1, indexVal); - property.unit = parent.unit; - property.dtype = parent.dtype; - return property - - } else if ((parent.dtype === dt.STRING || (parent.dtype & dt.ARRAY)) && - index.dtype === dt.RANGE) { - const start = index.value[0] - 1; - const step = index.value[1]; - const end = (index.value[2] === "∞") ? parent.value.length : index.value[2]; - property.unit = parent.unit; - property.dtype = parent.dtype; - if (step === 1) { - property.value = parent.value.slice(start, end); - } else { - property.value = []; - for (let j = start; j < end; j += step) { - property.value.push(parent.value[j]); - } - } - return property - - } else if (parent.dtype === dt.MODULE) { - // parent is a module and index has a value assigned to it. - return fromAssignment(parent.value[index.value], unitAware) - - } else { - return errorOprnd("NO_PROP", parent.name) - } -} - -const display = (tuple, formatSpec = "h3", decimalFormat = "1,000,000.") => { - if (tuple.size === 0) { return "" } - let str = "\\begin{array}{c}"; - - let haveUnits = false; - for (const attrs of tuple.values()) { - if (attrs.unit && attrs.unit.name) { haveUnits = true; break } - } - - // Write the unit names - if (haveUnits) { - let rowTex = ""; - for (const attrs of tuple.values()) { - if (attrs.unit && attrs.unit.name) { - rowTex += unitTeXFromString(attrs.unit.name).replace("\\;\\, ", ""); - } - rowTex += "&"; - } - str += rowTex.slice(0, -1) + " \\\\ "; - str += "\\hline "; - } - - // Write the data - let botRow = ""; - for (const attrs of tuple.values()) { - botRow += format(attrs.value, formatSpec, decimalFormat) + " & "; - } - str += botRow.slice(0, -1); - str += "\\end{array}"; - return str -}; - -const displayAlt = (tuple, formatSpec = "h3") => { - if (tuple.size === 0) { return "" } - let str = "``"; - - let haveUnits = false; - for (const attrs of tuple.values()) { - if (attrs.unit && attrs.unit.name) { haveUnits = true; break } - } - - // Write the unit names - if (haveUnits) { - let rowTex = ""; - for (const attrs of tuple.values()) { - if (attrs.unit && attrs.unit.name) { - rowTex += attrs.unit.name; - } - rowTex += "\t"; - } - str += rowTex.slice(0, -1) + "\n"; - } - - // Write the data - let botRow = ""; - for (const attrs of tuple.values()) { - botRow += format(attrs.value, formatSpec, "100000.") + "\t"; - } - str += botRow.slice(0, -1); - return str + "``" -}; - -const Tuple = Object.freeze({ - display, - displayAlt -}); - -// A result has been sent here from evaluate.js or updateCalculations.js. -// Format the result for display. - -const numMisMatchError = _ => { - const str = "Error. Mismatch in number of multiple assignment."; - return [`\\textcolor{firebrick}{\\text{${str}}}`, str] -}; -const testRegEx$1 = /^@{1,2}test /; -const compRegEx = /\u00a0([⩵≠><>≤≥∋∈∉∌⊂⊃⊄⊅]|==|in|!in|!=|=>|<=)$/; -const negatedComp = { - "⩵": ["≠", "≠"], - "==": ["≠", "≠"], - "≠": ["==", "=="], - ">": ["\\ngtr", "!>"], - "<": ["\\nless", "!<"], - "≤": ["\\nleq", "!≤"], - "≥": ["\\ngeq", "!≥"], - "∋": ["∌", "∌"], - "∈": ["∉", "∉"], - "⊂": ["⊄", "⊄"], - "⊃": ["⊅", "⊅"], - "∉": ["∈", "∈"], - "∌": ["∋", "∋"], - "⊄": ["⊂", "⊂"], - "⊅": ["⊃", "⊃"], - "in": ["∉", "∉"], - "!in": ["in", "in"], - "!=": ["==", "=="], - "=>": ["\\ngeq", "!≥"], - "<=": ["\\ngeq", "!≥"] -}; - -const formatResult = (stmt, result, formatSpec, decimalFormat, assert, isUnitAware) => { - if (!result) { return stmt } - - if (result.dtype === dt.DRAWING) { - stmt.resultdisplay = result.value; - delete stmt.resultdisplay.temp; - return stmt - } - - const numNames = !stmt.name - ? 0 - : !Array.isArray(stmt.name) - ? 1 - : stmt.name.length; - - if (stmt.resulttemplate.indexOf("?") > -1 || - stmt.resulttemplate.indexOf("!") > -1 || - stmt.resulttemplate.indexOf("@") > -1 || - stmt.resulttemplate.indexOf("%") > -1) { - stmt.value = result.value; - let resultDisplay = ""; - let altResultDisplay = ""; - if (stmt.resulttemplate.indexOf("!") > -1) { - // Suppress display of the result - resultDisplay = ""; - altResultDisplay = ""; - return stmt - - } else if (result.dtype & dt.BOOLEAN && testRegEx$1.test(stmt.entry) && - compRegEx.test(stmt.rpn)) { - if (testValue(result) === true) { - resultDisplay = parse$1(stmt.entry.replace(testRegEx$1, "")) + - ",\\text{ ok }✓"; - altResultDisplay = stmt.entry.replace(testRegEx$1, "") + ", ok ✓"; - } else { - const op = compRegEx.exec(stmt.rpn).slice(1); - const negOp = negatedComp[op]; - if (assert) { - const assertStr = assert.value.replace(/\.$/, ""); - resultDisplay = "\\colorbox{Salmon}{" + assertStr + ", but $" + - parse$1(stmt.entry.replace(testRegEx$1, "").replace(op, negOp[0])) + "$}"; - altResultDisplay = assertStr + ", but " + - stmt.entry.replace(testRegEx$1, "").replace(op, negOp[1]); - } else { - resultDisplay = parse$1(stmt.entry.replace(testRegEx$1, "").replace(op, negOp[0])) + - ",\\colorbox{Salmon}{ n.g.}"; - altResultDisplay = stmt.entry.replace(testRegEx$1, "").replace(op, negOp[1]) + - ", n.g."; - } - // eslint-disable-next-line no-console - console.log(altResultDisplay); - } - - } else if (isMatrix(result)) { - resultDisplay = Matrix.display((isUnitAware || result.value.plain) - ? { value: result.value.plain, dtype: result.dtype } - : result, - formatSpec, - decimalFormat - ); - altResultDisplay = Matrix.displayAlt((isUnitAware || result.value.plain) - ? { value: result.value.plain, dtype: result.dtype } - : result, - formatSpec, - decimalFormat - ); - - } else if (result.dtype === dt.DATAFRAME) { - if (numNames > 1 && numNames !== result.value.data.length) { - [resultDisplay, altResultDisplay] = numMisMatchError(); - } else { - const omitHeading = stmt.name && Array.isArray(stmt.name) && stmt.name.length > 1; - resultDisplay = DataFrame.display(result.value, formatSpec, - decimalFormat, omitHeading); - altResultDisplay = DataFrame.displayAlt(result.value, formatSpec, omitHeading); - } - - } else if (result.dtype & dt.MAP) { - let localValue; - if (isUnitAware || result.value.data.plain) { - localValue = clone(result.value); - localValue.data = result.value.data.plain; - } else { - localValue = result.value; - } - const omitHeading = stmt.name && Array.isArray(stmt.name) && stmt.name.length > 1; - resultDisplay = DataFrame.display(localValue, formatSpec, decimalFormat, omitHeading); - altResultDisplay = DataFrame.displayAlt(localValue, formatSpec, - decimalFormat, omitHeading); - - } else if (result.dtype === dt.TUPLE) { - if (numNames > 1 && numNames !== result.value.size) { - [resultDisplay, altResultDisplay] = numMisMatchError(); - } else { - resultDisplay = Tuple.display(result.value, formatSpec, decimalFormat); - altResultDisplay = Tuple.displayAlt(result.value, formatSpec); - } - - } else if (result.dtype & dt.STRING) { - resultDisplay = "\\text{" + addTextEscapes(result.value) + "}"; - if (result.unit) { - // This is a hack to return a color - resultDisplay = `\\textcolor{${result.unit}}{${resultDisplay}}`; - } - altResultDisplay = result.value; - - } else if (result.dtype & dt.RICHTEXT) { - resultDisplay = parse$1(result.value, decimalFormat, false); - altResultDisplay = result.value; - - } else if (result.dtype & dt.BOOLEAN) { - resultDisplay = "\\text{" + result.value + "}"; - altResultDisplay = String(result.value); - - } else if (result.dtype === dt.COMPLEX) { - const z = result.value; - [resultDisplay, altResultDisplay] = Cpx.display(z, formatSpec, decimalFormat); - - } else if (result.value.plain) { - resultDisplay = format(result.value.plain, formatSpec, decimalFormat); - if (resultDisplay.dtype && resultDisplay.dtype === dt.ERROR) { - resultDisplay = "\textcolor{firebrick}{\\text{" + resultDisplay.value + "}}"; - altResultDisplay = resultDisplay.value; - } else { - altResultDisplay = resultDisplay.replace(/{,}/g, ",").replace("\\", ""); - } - - } else if (Rnl.isRational(result.value)) { - resultDisplay = format(result.value, formatSpec, decimalFormat); - if (resultDisplay.dtype && resultDisplay.dtype === dt.ERROR) { - resultDisplay = "\\textcolor{firebrick}{\\text{" + resultDisplay.value + "}}"; - altResultDisplay = resultDisplay.value; - } else { - altResultDisplay = resultDisplay.replace(/{,}/g, ",").replace("\\", ""); - } - - } else if (result.dtype === dt.IMAGE) { - return stmt - - } else { - resultDisplay = result.value; - altResultDisplay = resultDisplay; - - } - - // Write the string to be plugged into echos of dependent nodes - stmt.resultdisplay = stmt.resulttemplate.replace(/(\? *\??|@ *@?|%%?)/, resultDisplay); - - // Write the TeX for this node - if (stmt.resulttemplate.indexOf("@") > -1) { - stmt.tex = stmt.resultdisplay; - stmt.displaySelector = stmt.altresulttemplate.indexOf("@@") > -1 ? "@@" : "@"; - if (!testRegEx$1.test(stmt.entry)) { - const pos = stmt.entry.lastIndexOf(stmt.displaySelector); - stmt.md = stmt.entry.slice(0, pos) + `〔${altResultDisplay}〕` - + stmt.entry.slice(pos + stmt.displaySelector.length); - } - stmt.alt = stmt.altresulttemplate.replace(/@@?/, altResultDisplay); - } else if (stmt.resulttemplate.indexOf("?") > -1) { - let pos = stmt.tex.lastIndexOf("?"); - stmt.tex = stmt.tex.slice(0, pos).replace(/\? *$/, "") + resultDisplay + stmt.tex.slice(pos + 1); - stmt.displaySelector = stmt.altresulttemplate.indexOf("??") > -1 ? "??" : "?"; - pos = stmt.alt.lastIndexOf(stmt.displaySelector); - stmt.md = stmt.alt.slice(0, pos) + `〔${altResultDisplay}〕` - + stmt.alt.slice(pos + stmt.displaySelector.length); - stmt.alt = stmt.alt.slice(0, pos) + altResultDisplay - + stmt.alt.slice(pos + stmt.displaySelector.length); - } else if (stmt.resulttemplate.indexOf("%") > -1) { - let pos = stmt.tex.lastIndexOf("%"); - stmt.tex = stmt.tex.slice(0, pos).replace(/% *$/, "") + resultDisplay + stmt.tex.slice(pos + 1); - stmt.displaySelector = stmt.altresulttemplate.indexOf("%%") > -1 ? "%%" : "%"; - pos = stmt.alt.lastIndexOf(stmt.displaySelector); - stmt.md = stmt.alt.slice(0, pos) + `〔${altResultDisplay}〕` - + stmt.alt.slice(pos + stmt.displaySelector.length); - stmt.alt = stmt.alt.slice(0, pos) + altResultDisplay - + stmt.alt.slice(pos + stmt.displaySelector.length); - } - } - return stmt -}; - -const testValue = oprnd => { - if (isVector(oprnd)) { - for (let i = 0; i < oprnd.value.length; i++) { - if (!oprnd.value[i]) { return false } - } - } else if (isMatrix(oprnd)) { - for (let i = 0; i < oprnd.value.length; i++) { - for (let j = 0; j < oprnd.value[0].length; j++) { - if (!oprnd.value[i][j]) { return false } - } - } - } else if (oprnd.dtype & dt.MAP) { - for (let j = 0; j < oprnd.value.data.length; j++) { - for (let i = 0; i < oprnd.value.data[0].length; i++) { - if (!oprnd.value.data[j][i]) { return false } - } - } - } else { - return oprnd.value - } - return true -}; - -/* - * This module receives a TeX template string and a object containing Hurmet variables. - * At each location where the template contains a variable, this module plugs in a TeX string - * of the variable's value, for display in the Hurmet blue echo.. - */ - -const varRegEx = /〖[^〗]*〗/; -const openParenRegEx = /(?:[([{|‖]|[^\\][,;:](?:\\:)?)$/; - -const plugValsIntoEcho = (str, vars, unitAware, formatSpec, decimalFormat) => { - // For each variable name in the echo string, substitute a value. - // The parser surrounded those names with 〖〗 delimiters. - let match; - while ((match = varRegEx.exec(str)) !== null) { - const varName = match[0].replace(/[〖〗()]/g, "").trim().replace(/'/g, "′"); - const matchLength = match[0].length; - const pos = match.index; - let hvar; - let display = ""; - - if (varName.indexOf(".") > -1) { - // Object with a dot accessor. - const names = varName.split("."); - const parentName = names[0]; - if (!vars[parentName]) { return errorOprnd("V_NAME", parentName) } - hvar = vars[parentName]; - if (hvar.dtype === dt.DATAFRAME && names.length === 2) { - // This is a dataframe.dict. I don't want to write an entire dictionary into - // a blue echo, so display just the names. - display = "\\mathrm{" + vars[names[0]].name + "{.}\\mathrm{" + names[1] + "}"; - return str.substring(0, pos) + display + str.substring(pos + matchLength) - } else { - // we want to display the property value. - for (let i = 1; i < names.length; i++) { - const propName = names[i].replace("}", "").replace("\\mathrm{", "").trim(); - const indexOprnd = { value: propName, unit: null, dtype: dt.STRING }; - hvar = propertyFromDotAccessor(hvar, indexOprnd, vars); - if (!hvar) { return errorOprnd("V_NAME", propName) } - const stmt = { resulttemplate: "@", altresulttemplate: "@" }; - hvar.resultdisplay = formatResult(stmt, hvar, formatSpec, null, - decimalFormat).resultdisplay; - } - } - } else if (!vars[varName] && varName === "T") { - // Transposed matrix - hvar = { dtype: dt.RATIONAL, resultdisplay: "\\text{T}" }; - } else if (varName === "e" && /^\^/.test(str.slice(pos + 3).trim())) { - // e^x - str = str.substring(0, pos) + "e" + str.substring(pos + matchLength); - continue - } else if (varName === "j") { - // √(-1) - str = str.substring(0, pos) + "j" + str.substring(pos + matchLength); - continue - } else if (!vars[varName]) { - return errorOprnd("V_NAME", varName) - } else { - // Get a clone in order to avoid mutating the inner properties of vars. - hvar = { - dtype: vars[varName].dtype, - resultdisplay: vars[varName].resultdisplay - }; - } - - if (!hvar || !hvar.resultdisplay) { - const insert = (varName) ? varName : "?"; - return errorOprnd("NULL", insert) - } else if (hvar.error) { - return errorOprnd("NULL", varName) - } - - let needsParens = true; // default - if (isMatrix(hvar) || (hvar.dtype & dt.DATAFRAME)) { needsParens = false; } - if (unitAware && (hvar.dtype & dt.QUANTITY)) { needsParens = true; } - - let isParened = false; // Is the match already nested inside parens? - if (pos > 0) { - const pStr = str.slice(0, pos).trim(); - if (openParenRegEx.test(pStr)) { - const fStr = str.slice(pos + varName.length + 2).trim(); - isParened = fStr.length > 0 && /^([)|‖\]},;:]|\\right)/.test(fStr); - } else if (/^\\begin{[bp]matrix}/.test(hvar.resultdisplay)) { - isParened = /\\end{[bp]matrix}$/.test(hvar.resultdisplay); - } - } - needsParens = needsParens && !isParened; - - if (hvar.dtype === dt.DATAFRAME || (hvar.dtype & dt.MAP)) { - display = "\\mathrm{" + parse$1(vars[varName].name) + "}"; - } else { - display = hvar.resultdisplay; - if (!unitAware) { - const posUnit = display.lastIndexOf("{\\text{"); - if (posUnit > -1) { - display = display.slice(0, posUnit).trim() - .replace(/\\; *$/, "").trim(); - } - } - if (needsParens) { - display = hvar.dtype > 256 ? "\\left(" + display + "\\right)" : "(" + display + ")"; - } - } - str = str.substring(0, pos) + display + str.substring(pos + matchLength); - } - return str -}; - -const negativeOne = Object.freeze(Rnl.negate(Rnl.one)); -const oneHalf = [BigInt(1), BigInt(2)]; -const thirty = [BigInt(30), BigInt(1)]; -const fortyFive = [BigInt(45), BigInt(1)]; -const sixty = [BigInt(60), BigInt(1)]; -const ninety = [BigInt(90), BigInt(1)]; -const halfPi = Object.freeze(Rnl.divide(Rnl.pi, Rnl.two)); - -const functionExpos = (functionName, args) => { - const numArgs = args.length; - - const expos = numArgs === 1 ? args[0].unit.expos : null; - - switch (functionName) { - case "abs": - case "round": - case "roundn": - case "sign": - case "trace": - case "fetch": - return expos - - case "cos": - case "sin": - case "tan": - case "sec": - case "csc": - case "cot": - case "acos": - case "arccos": - case "asin": - case "arcsin": - case "atan": - case "arctan": - case "asec": - case "arcsec": - case "acsc": - case "arccsc": - case "acot": - case "arccot": - case "cosd": - case "sind": - case "tand": - case "secd": - case "cscd": - case "cotd": - case "acosd": - case "asind": - case "atand": - case "asecd": - case "acscd": - case "acotd": - case "gud": - if (!unitsAreCompatible(expos, allZeros)) { - return errorOprnd("UNIT_IN", functionName) - } - return allZeros - - case "exp": - case "log": - case "ln": - case "log10": - case "log2": - case "logn": - case "cosh": - case "sinh": - case "tanh": - case "sech": - case "csch": - case "coth": - case "acosh": - case "asinh": - case "atanh": - case "asech": - case "acsch": - case "acoth": - case "binomial": - case "gamma": - case "Γ": - case "lgamma": - case "lfact": - case "factorial": - if (!unitsAreCompatible(expos, allZeros)) { - return errorOprnd("UNIT_IN", functionName) - } - return allZeros - - case "sqrt": - return expos.map(e => e / 2) - - case "gcd": - case "mht": - if (!unitsAreCompatible(expos, allZeros)) { - return errorOprnd("UNIT_IN", functionName) - } - return functionName === "hmt" ? [1, 0, 0, 0, 0, 0, 0, 0] : allZeros - - case "atan2": - case "hypot": - case "rms": - case "ceil": - case "floor": - case "sum": - case "mean": - case "median": - case "min": - case "max": - case "range": - case "stddev": - case "variance": { - const x = args[0].unit.expos; - for (let i = 1; i < args.length; i++) { - const y = args[i].unit.expos; - if (x.length !== y.length) { return errorOprnd("UNIT_ARG", functionName) } - for (let j = 0; j < x.length; j++) { - if (x[j] !== y[j]) { return errorOprnd("UNIT_ARG", functionName) } - } - } - return functionName === "atan2" ? allZeros : x - } - - case "real": - case "imag": - case "angle": - case "conj": - return allZeros - - case "product": { - const expos = clone(args[0].unit.expos); - for (let i = 1; i < args.length; i++) { - const p = args[i].unit.expos; - expos.map((e, j) => e + p[j]); - } - return expos - } - - default: - return errorOprnd("F_NAME", functionName) - } -}; - -const gamma = x => { - if (Rnl.isZero(x)) { - return errorOprnd("Γ0") - } else if (Rnl.isPositive(x) && Rnl.isInteger(x) && Rnl.lessThan(x, Rnl.fromNumber(101))) { - return Rnl.factorial(Rnl.subtract(x, Rnl.one)) - } else if (Rnl.isNegative(x) && Rnl.isInteger(x)) { - return errorOprnd("ΓPOLE") - } else if (Rnl.lessThan(x, oneHalf)) { - // reflection formula - return Rnl.fromNumber(Math.PI / (Math.sin(Math.PI * Rnl.toNumber(x))) - * Rnl.toNumber(gamma(Rnl.subtract(Rnl.one, x)))) - } else { - return Rnl.lanczos(x) - } -}; - -const lgamma = r => { - // Returns natural logarithm of the Gamma function. - // Ref: https://www.johndcook.com/blog/2010/08/16/how-to-compute-log-factorial/ - if (Rnl.isZero(r)) { return errorOprnd("Γ0") } - if (Rnl.isNegative(r)) { return errorOprnd("LOGΓ") } - if (Rnl.areEqual(r, Rnl.one) || Rnl.areEqual(r, Rnl.two)) { return Rnl.zero } - if (Rnl.lessThanOrEqualTo(r, Rnl.fromNumber(14))) { - return Rnl.fromNumber(Math.log(Rnl.toNumber(gamma(r)))) - } else { - const x = Rnl.toNumber(r); - // eslint-disable-next-line max-len - const y = (x - 0.5) * Math.log(x) - x + 0.5 * Math.log(2 * Math.PI) + 1 / (12 * x) - 1 / (360 * x ** 3) + 1 / (1260 * x ** 5) - 1 / (1680 * x ** 7) + 5 / (540 * x ** 9); - // Error bounded by: -691/(360360 * x^11), 16 significant digits - return Rnl.fromNumber(y) - } -}; - -const binomial = (n, k) => { - // (n \atop k) = n! / (k! (n - k)!) - // = exp(log!(n) - [log!(k) + log!(n - k)]) - if (Rnl.areEqual(n, k)) { return Rnl.one } - if (Rnl.isZero(n)) { return Rnl.zero } - if (Rnl.isNegative(k)) { return Rnl.zero } - if (Rnl.lessThan(n, k)) { return Rnl.zero } - - if (Rnl.isInteger(n) && Rnl.isInteger(k) && Rnl.isPositive(n) && Rnl.isPositive(k)) { - // positive integers -// if (Rnl.lessThan(n, twenty)) { - return Rnl.divide(Rnl.factorial(n), - Rnl.multiply(Rnl.factorial(k), Rnl.factorial(Rnl.subtract(n, k)))) -// } else { -// return Rnl.fromNumber(Math.round(Math.exp(Rnl.toNumber( -// Rnl.subtract(lfact(n), -// Rnl.add(lfact(k), lfact(Rnl.subtract(n, k)))))))) -// } - - } else if (Rnl.isInteger(n) && Rnl.isInteger(k) && Rnl.isPositive(k)) { - // negative integer n - // (-n \atop k) = (-1)^k * multiset(n, k) - return Rnl.multiply(Rnl.power(negativeOne, k), multiset(Rnl.negate(n), k)) - - } else { - // generalized for real or complex arguments - // (x \atop y) = Γ(x+1) / ( Γ(y+1) Γ(x-y+1) ) - return Rnl.divide( - gamma(Rnl.increment(n)), - Rnl.multiply(gamma(Rnl.increment(k)), gamma(Rnl.increment(Rnl.subtract(n, k)))) - ) - - } -}; - -const multiset = (n, k) => { - // ((n \atop k)) = ((n+k-1) \atop k) - // multiset(n, k) = binomial(n+k-1, k) - return binomial(Rnl.add(n, Rnl.decrement(k)), k) -}; - -const piOver180 = Rnl.divide(Rnl.pi, [BigInt(180), BigInt(1)]); - -const unary$1 = { - scalar: { - // Functions that take one real argument. - abs(x) { return Rnl.abs(x) }, - angle(x) { return errorOprnd("NA_REAL", "angle") }, - real(x) { return errorOprnd("NA_REAL", "real") }, - imag(x) { return errorOprnd("NA_REAL", "imag") }, - conj(x) { return errorOprnd("NA_REAL", "conj") }, - cos(x) { return Rnl.cos(x) }, - sin(x) { return Rnl.sin(x) }, - tan(x) { return Rnl.tan(x) }, - cosh(x) { return Rnl.cosh(x) }, - sinh(x) { return Rnl.sinh(x) }, - tanh(x) { return Rnl.tanh(x) }, - acos(x) { - if (Rnl.greaterThan(Rnl.abs(x), Rnl.one)) { return errorOprnd("ATRIG", "acos") } - return Rnl.fromNumber(Math.acos(Rnl.toNumber(x))) - }, - asin(x) { - if (Rnl.greaterThan(Rnl.abs(x), Rnl.one)) { return errorOprnd("ATRIG", "asin") } - return Rnl.fromNumber(Math.asin(Rnl.toNumber(x))) - }, - atan(x) { - return Rnl.fromNumber(Math.atan(Rnl.toNumber(x))) - }, - sec(x) { - return Rnl.fromNumber(1 / Math.cos(Rnl.toNumber(x))) - }, - csc(x) { - return Rnl.fromNumber(1 / Math.sin(Rnl.toNumber(x))) - }, - cot(x) { - if (Rnl.isZero(x)) { return errorOprnd("COT", "cotangent") } - return Rnl.fromNumber(1 / Math.tan(Rnl.toNumber(x))) - }, - asec(x) { - if (Rnl.greaterThanOrEqualTo(Rnl.abs(x), Rnl.one)) { - return errorOprnd("ASEC", "arcecant") - } - const temp = Math.atn(Math.sqrt(Rnl.toNumber(Rnl.decrement(Rnl.multiply(x, x))))); - return (Rnl.isPositive(x)) - ? Rnl.fromNumber(temp) - : Rnl.fromNumber(temp - Math.PI) - }, - acot(x) { - if (Rnl.greaterThanOrEqualTo(Rnl.abs(x), Rnl.one)) { - return errorOprnd("ASEC", "acot") - } - const temp = Math.atn(1 / (Math.sqrt(Rnl.toNumber(Rnl.decrement(Rnl.multiply(x, x)))))); - return (Rnl.isPositive(x)) - ? Rnl.fromNumber(temp) - : Rnl.fromNumber(temp - Math.PI) - }, - acsc(x) { - return Rnl.fromNumber(Math.atn(-Rnl.toNumber(x)) + Math.PI) - }, - exp(x) { - return Rnl.exp(x) - }, - log(x) { - return Rnl.isZero(x) ? errorOprnd("LOG_ZERO") : Rnl.fromNumber(Math.log(Rnl.toNumber(x))) - }, - ln(x) { - return Rnl.isZero(x) ? errorOprnd("LOG_ZERO") : Rnl.fromNumber(Math.log(Rnl.toNumber(x))) - }, - log10(x) { - return Rnl.isZero(x) - ? errorOprnd("LOG_ZERO") - : Rnl.fromNumber(Math.log10(Rnl.toNumber(x))) - }, - log2(x) { - return Rnl.isZero(x) - ? errorOprnd("LOG_ZERO") - : Rnl.fromNumber(Math.log2(Rnl.toNumber(x))) - }, - sech(x) { - // sech(n) = 2 / (eⁿ + e⁻ⁿ) - const num = Rnl.toNumber(x); - return Rnl.fromNumber(2 / (Math.exp(num) + Math.exp(-num))) - }, - csch(x) { - // csch(n) = 2 / (eⁿ - e⁻ⁿ) - const num = Rnl.toNumber(x); - return Rnl.fromNumber(2 / (Math.exp(num) - Math.exp(-num))) - }, - coth(x) { - // coth(n) = (eⁿ + e⁻ⁿ) / (eⁿ - e⁻ⁿ) - const num = Rnl.toNumber(x); - return Rnl.fromNumber( - (Math.exp(num) + Math.exp(-num)) / (Math.exp(num) - Math.exp(-num)) - ) - }, - acosh(x) { - // acosh(x) = log( x + sqrt(x - 1) × sqrt(x + 1) ) - const num = Rnl.toNumber(x); - return Rnl.fromNumber(Math.log( num + Math.sqrt(num - 1) * Math.sqrt(num + 1) )) - }, - asinh(x) { - // asinh(x) = log(x + sqrt(x² + 1)) - const num = Rnl.toNumber(x); - return Rnl.fromNumber(Math.log(num + Math.sqrt(Math.pow(num, 2) + 1))) - }, - atanh(x) { - // atanh(x) = [ log(1+x) - log(1-x) ] / 2 - const num = Rnl.toNumber(x); - return Rnl.fromNumber((Math.log(1 + num) - Math.log(1 - num) ) / 2) - }, - asech(x) { - // asech(x) = log( [sqrt(-x * x + 1) + 1] / x ) - if (Rnl.isZero(x)) { return errorOprnd("DIV") } - const num = Rnl.toNumber(x); - return Rnl.fromNumber(Math.log((Math.sqrt(-num * num + 1) + 1) / num)) - }, - ascsh(x) { - // acsch(x) = log( sqrt(1 + 1/x²) + 1/x ) - if (Rnl.isZero(x)) { return errorOprnd("DIV") } - const num = Rnl.toNumber(x); - return Rnl.fromNumber(Math.log(Math.sqrt(1 + 1 / Math.pow(num, 2)) + 1 / num)) - }, - acoth(x) { - // acoth(x) = [ log(1 + 1/x) - log(1 - 1/x) ] / 2 - if (Rnl.isZero(x)) { return errorOprnd("DIV") } - const num = Rnl.toNumber(x); - return Rnl.fromNumber((Math.log(1 + 1 / num) - Math.log(1 - 1 / num)) / 2) - }, - ceil(x) { - return Rnl.ceil(x) - }, - floor(x) { - return Rnl.floor(x) - }, - gamma(x) { - return gamma(x) - }, - Γ(x) { - return gamma(x) - }, - lgamma(x) { - if (Rnl.isNegative(x) || Rnl.isZero(x)) { return errorOprnd("LOGΓ") } - return lgamma(x) - }, - lfact(x) { - if (Rnl.isNegative(x) || !Rnl.isInteger(x)) { return errorOprnd("FACT") } - return lgamma(Rnl.add(x, Rnl.one)) - }, - factorial(x) { - return Rnl.factorial(x) - }, - sign(x) { - return Rnl.isPositive(x) ? Rnl.one : Rnl.isZero(x) ? Rnl.zero : negativeOne - }, - cosd(x) { - if (Rnl.areEqual(x, ninety)) { return Rnl.zero } - if (Rnl.areEqual(x, sixty)) { return oneHalf } - return this.cos(Rnl.multiply(x, piOver180)) - }, - sind(x) { - if (Rnl.areEqual(x, thirty)) { return oneHalf } - return this.sin(Rnl.multiply(x, piOver180)) - }, - tand(x) { - if (Rnl.areEqual(x, fortyFive)) { return Rnl.one } - if (Rnl.areEqual(x, ninety)) { return errorOprnd("TAN90", "90°") } - return this.tan(Rnl.multiply(x, piOver180)) - }, - cotd(x) { - return this.cot(Rnl.multiply(x, piOver180)) - }, - cscd(x) { - return this.csc(Rnl.multiply(x, piOver180)) - }, - secd(x) { - return this.sec(Rnl.multiply(x, piOver180)) - }, - acosd(x) { - const y = this.acos(x); - return y.dtype ? y : Rnl.divide(y, piOver180) - }, - asind(x) { - const y = this.asin(x); - return y.dtype ? y : Rnl.divide(y, piOver180) - }, - atand(x) { - return Rnl.divide(this.atan(x), piOver180) - }, - acotd(x) { - const y = this.acot(x); - return y.dtype ? y : Rnl.divide(y, piOver180) - }, - acscd(x) { - const y = this.acsc(x); - return y.dtype ? y : Rnl.divide(y, piOver180) - }, - asecd(x) { - const y = this.asec(x); - return y.dtype ? y : Rnl.divide(y, piOver180) - }, - Char(x) { - return String.fromCodePoint(Rnl.toNumber(x)) - }, - sqrt(x) { - const y = [BigInt(1), BigInt(2)]; - return Cpx.isComplex(x) || (Rnl.isNegative(x)) - ? Cpx.power([x, Rnl.zero], y) - : Rnl.power(x, y) - }, - round(x) { - return Rnl.fromString(Rnl.toString(x, 0)) - } - }, - complex: { - // Functions that take one complex argument. - abs(z) { return Cpx.abs(z) }, - angle(z) { return Cpx.angle(z) }, - real(z) { return z[0] }, - imag(z) { return z[1] }, - conj(z) { return Cpx.conjugate(z) }, - cos(z) { return Cpx.cos(z) }, - sin(z) { return Cpx.sin(z) }, - asin(z) { return Cpx.asin(z) }, - atan(z) { return Cpx.atan(z) }, - acos(z) { return Cpx.subtract([halfPi, Rnl.zero], Cpx.asin(z))}, // π/2 - arcsin(z) - tan(z) { return Cpx.divide(Cpx.sin(z), Cpx.cos(z)) }, - cot(z) { return Cpx.divide(Cpx.cos(z), Cpx.sin(z)) }, - sec(z) { - const c = Cpx.cos(z); - return c.dtype ? c : Cpx.inverse(c) - }, - csc(z) { - const s = Cpx.sin(z); - return s.dtype ? s : Cpx.inverse(s) - }, - asec(z) { - // acos(inverse(z)) - const inv = Cpx.inverse(z); - return Cpx.subtract([halfPi, Rnl.zero], Cpx.asin(inv)) - }, - acot(z) { return Cpx.atan(Cpx.inverse(z)) }, - acsc(z) { - return Cpx.asin(Cpx.inverse(z)) - }, - exp(z) { - return Cpx.exp(z) - }, - log(z) { - return Cpx.log(z) - }, - ln(z) { - return Cpx.log(z) - }, - log10(z) { - return Rnl.fromNumber(Math.log10(Rnl.toNumber(z))) - }, - log2(z) { - return Rnl.fromNumber(Math.log2(Rnl.toNumber(z))) - }, - cosh(z) { - // cosh(z) = (eᶻ + e⁻ᶻ) / 2 - return Cpx.divide(Cpx.add(Cpx.exp(z), Cpx.exp(Cpx.negate(z))), [Rnl.two, Rnl.zero]) - }, - sinh(z) { - // sinh(z) = (eᶻ - e⁻ᶻ) / 2 - return Cpx.divide(Cpx.subtract(Cpx.exp(z), Cpx.exp(Cpx.negate(z))), [Rnl.two, Rnl.zero]) - }, - tanh(z) { - // tanh(z) = (eᶻ - e⁻ᶻ) / (eᶻ + e⁻ᶻ) - const ez = Cpx.exp(z); - const eMinuxZ = Cpx.exp(Cpx.negate(z)); - return Cpx.divide(Cpx.subtract(ez, eMinuxZ), Cpx.add(ez, eMinuxZ)) - }, - sech(z) { - // sech(z) = 2 / (eᶻ + e⁻ᶻ) - return Cpx.divide([Rnl.two, Rnl.zero], Cpx.add(Cpx.exp(z), Cpx.exp(Cpx.negate(z)))) - }, - csch(z) { - // csch(z) = 2 / (eᶻ - e⁻ᶻ) - return Cpx.divide([Rnl.two, Rnl.zero], Cpx.subtract(Cpx.exp(z), Cpx.exp(Cpx.negate(z)))) - }, - coth(z) { - // coth(z) = (eᶻ + e⁻ᶻ) / (eᶻ - e⁻ᶻ) - const ez = Cpx.exp(z); - const eMinuxZ = Cpx.exp(Cpx.negate(z)); - return Cpx.divide(Cpx.add(ez, eMinuxZ), Cpx.subtract(ez, eMinuxZ)) - }, - acosh(z) { - return Cpx.acosh(z) - }, - asinh(z) { - return Cpx.asinh(z) - }, - atanh(z) { - return Cpx.atanh(z) - }, - asech(z) { - return Cpx.acosh(Cpx.inverse(z)) - }, - acsch(z) { - return Cpx.asinh(Cpx.inverse(z)) - }, - acoth(z) { - return Cpx.atanh(Cpx.inverse(z)) - }, - ceil(z) { - return errorOprnd("NA_COMPL_OP", "ceil") - }, - floor(z) { - return errorOprnd("NA_COMPL_OP", "ceil") - }, - gamma(z) { - return Cpx.gamma(z) - }, - Γ(z) { - return Cpx.gamma(z) - }, - lgamma(z) { - // TODO: complex log of gamma() - return errorOprnd("NA_COMPL_OP", "lgamma") - }, - factorial(z) { - return errorOprnd("NA_COMPL_OP", "factorial") - }, - sign(z) { - if (Rnl.isZero(z[1]) && Rnl.isPositive(z[0])) { - return Rnl.one - } else if (Rnl.isZero(z[1]) && Rnl.isNegative(z[0])) { - return Rnl.negate(Rnl.one) - } else { - return Cpx.divide(z, [Cpx.abs(z), Rnl.zero]) - } - }, - round(z) { - // TODO: complex round function - return errorOprnd("NA_COMPL_OP", "round") - } - } -}; - -const binary$1 = { - logn([n, x]) { - return Rnl.fromNumber(Math.log(Rnl.toNumber(x)) / Math.log(Rnl.toNumber(n))) - }, - roundFixed([x, n]) { - return Rnl.fromString(Rnl.toString(x, n)) - }, - roundSignificant([x, n]) { - return Rnl.fromString(Rnl.toStringSignificant(x, n)) - }, - stringFixed([x, n]) { - return Rnl.toString(x, n) - }, - stringSignificant([x, n]) { - return Rnl.toStringSignificant(x, n) - }, - atan2([x, y]) { - return Rnl.fromNumber(Math.atan2(Rnl.toNumber(y), Rnl.toNumber(x))) - }, - hypot([x, y]) { - // sqrt(x^2) - // https://www.johndcook.com/blog/2010/06/02/whats-so-hard-about-finding-a-hypotenuse/ - const max = Rnl.max(x, y); - const r = Rnl.divide(Rnl.min(x, y), max); - return Rnl.multiply(max, Rnl.sqrt(Rnl.increment(Rnl.multiply(r, r)))) - }, - gcd([m, n]) { - return Rnl.gcd(m, n) - }, - rms([x, y]) { - return this.hypot(x, y) - }, - binomial([x, y]) { - return binomial(x, y) - }, - ones([m, n]) { - return Matrix.ones(Rnl.toNumber(m), Rnl.toNumber(n)) - }, - zeros([m, n]) { - return Matrix.zeros(Rnl.toNumber(m), Rnl.toNumber(n)) - }, - mod([x, y]) { - return Rnl.mod(x, y) - }, - rem([x, y]) { - return Rnl.rem(x, y) - } -}; - -const reduce = { - max(list) { - return list.reduce((max, e) => Rnl.max(max, e)) - }, - min(list) { - return list.reduce((min, e) => Rnl.min(min, e)) - }, - sum(list) { - return list.reduce((sum, e) => Rnl.add(sum, e)) - }, - product(list) { - return list.reduce((sum, e) => Rnl.multiply(sum, e)) - }, - mean(list) { - const sum = this.sum(list); - return Rnl.divide(sum, Rnl.fromNumber(list.length)) - }, - median(list) { - const max = this.max(list); - const min = this.min(list); - return Rnl.divide(Rnl.add(max, min), Rnl.two) - }, - range(list) { - return Rnl.subtract(this.max(list), this.min(list)) - }, - variance(list) { - const sum = this.sum(list); - const mean = Rnl.divide(sum, Rnl.fromNumber(list.length)); - const num = list.reduce((num, e) => Rnl.add(num, Rnl.pow(Rnl.subtract(e, mean), Rnl.two))); - return Rnl.divide(num, Rnl.subtract(Rnl.fromNumber(list.length), Rnl.one)) - }, - stddev(list) { - const variance = this.variance(list); - return Rnl.power(variance, oneHalf) - }, - accumulate(list) { - const v = new Array(list.length).fill(0); - v[0] = list[0]; - for (let i = 1; i < list.length; i++) { - v[i] = Rnl.add(v[i - 1], list[i]); - } - return v - } -}; - -const lerp = (args, unitAware) => { - // linear interpolation - for (let i = 0; i < 3; i++) { - if (!(args[i].dtype & dt.RATIONAL)) { return errorOprnd("") } - } - let expos = allZeros; - if (unitAware) { - if (args[0].expos !== args[1].expos) { return errorOprnd("") } - if (args[1].expos !== args[2].expos) { return errorOprnd("") } - expos = args[0].expos; - } - const output = Object.create(null); - output.unit = Object.create(null); - output.unit.expos = expos; - output.dtype = dt.RATIONAL; - - const v0 = args[0].value; // a vector - const v1 = args[1].value; // another vector - const x = args[2].value; // the input value - // TODO: Use binary search - for (let i = 0; i < v0.length - 1; i++) { - if (Rnl.lessThanOrEqualTo(v0[i], x) & Rnl.lessThanOrEqualTo(x, v0[i + 1])) { - const slope = Rnl.divide((Rnl.subtract(v1[i + 1], v1[i])), - (Rnl.subtract(v0[i + 1], v0[i]))); - output.value = Rnl.add(v1[i], Rnl.multiply(slope, (Rnl.subtract(x, v0[i])))); - return Object.freeze(output) - } - } -}; - -const Functions = Object.freeze({ - functionExpos, - unary: unary$1, - binary: binary$1, - reduce, - lerp -}); - -const multivarFunction = (arity, functionName, args) => { - // Deal with a function that may have multiple arguments. - - if (args.length === 1) { - const list = isVector(args[0]) - ? args[0].value - : (args.dtype & dt.MATRIX) - // TODO: fix the next line. - ? args[0].value.flat() - : args[0].value; - - const value = Functions[arity][functionName](list); - - let dtype = args[0].dtype; - if (arity === "reduce" && functionName !== "accumulate") { - // Mask off any matrix or vector indicator from the dtype - if (dtype & dt.MATRIX) { dtype -= dt.MATRIX; } - if (dtype & dt.ROWVECTOR) { dtype -= dt.ROWVECTOR; } - if (dtype & dt.COLUMNVECTOR) { dtype -= dt.COLUMNVECTOR; } - } - - return [value, dtype] - - } else if (functionName === "sum" && args.length === 2 && isMatrix(args[0]) - && args[1].dtype === dt.RATIONAL) { - if (Rnl.areEqual(args[1].value, Rnl.two)) { - const dtype = dt.COLUMNVECTOR + dt.RATIONAL; - const result = args[0].value.map(row => row.reduce((sum, e) => Rnl.add(sum, e))); - return [ result, dtype ] - } else if (Rnl.areEqual(args[1].value, Rnl.one)) { - const dtype = dt.ROWVECTOR + dt.RATIONAL; - const result = Matrix.transpose(args[0]).value.map( - row => row.reduce((sum, e) => Rnl.add(sum, e)) - ); - return [ result, dtype ] - } else { - return [errorOprnd("BAD_SUM"), dt.ERROR] - } - } else { - // We have multiple arguments. - // Is one of them a vector or a matrix? - let iArg = 0; - let gotVector = false; - let gotMatrix = false; - let dtype = args[0].dtype; - - for (iArg = 0; iArg < args.length; iArg++) { - if (isVector(args[iArg])) { - gotVector = true; - dtype = args[iArg].dtype; - break - } else if (isMatrix(args[iArg])) { - gotMatrix = true; - dtype = args[iArg].dtype; - break - } - } - const list = args.map(e => e.value); - if (!(gotVector || gotMatrix)) { - const result = Functions[arity][functionName](list); - return functionName === "zeros" || functionName === "ones" - ? [result.value, result.dtype] - : [result, args[0].dtype] - - } else { - const result = []; - if (gotVector) { - const listClone = clone(list); - for (let i = 0; i < list[iArg].length; i++) { - listClone[iArg] = list[iArg][i]; - result.push(Functions[arity][functionName](listClone)); - } - } else { - const listClone = clone(list); - for (let i = 0; i < list[iArg].length; i++) { - result.push([]); - for (let j = 0; j < list[iArg][0].length; j++) { - listClone[iArg] = list[iArg][i][j]; - result[i].push(Functions[arity][functionName](listClone)); - } - } - } - return [ result, dtype ] - } - } -}; - -// compare.js - -const equals = (x, y) => { - if (Rnl.isRational(x) && Rnl.isRational(y)) { - return Rnl.areEqual(x, y) - } else { - return x === y - } -}; - -const compare = (op, x, y, yPrev) => { - // If yPrev is defined, then this is part of a chained comparison, e.g.: a < b < c - if (x === false && yPrev) { return false } // The chain is false if any part is false. - if (x === true && yPrev) { x = yPrev; } // Compare this link in the chain. - - switch (op) { - case "=": - return errorOprnd("BAD_EQ") - - case "==": - case "⩵": - return equals(x, y) - - case "≠": - case "!=": - case "/=": - if (Rnl.isRational(x) && Rnl.isRational(y)) { - return !Rnl.areEqual(x, y) - } else { - return x !== y - } - - case ">": - if (Rnl.isRational(x) && Rnl.isRational(y)) { - return Rnl.greaterThan(x, y) - } else { - return x > y - } - - case "<": - if (Rnl.isRational(x) && Rnl.isRational(y)) { - return Rnl.lessThan(x, y) - } else { - return x < y - } - - case "≥": - case ">=": - if (Rnl.isRational(x) && Rnl.isRational(y)) { - return Rnl.greaterThanOrEqualTo(x, y) - } else { - return x >= y - } - - case "≤": - case "<=": - if (Rnl.isRational(x) && Rnl.isRational(y)) { - return Rnl.lessThanOrEqualTo(x, y) - } else { - return x <= y - } - - case "∈": - case "in": - if (typeof x === "string" && typeof y === "string") { - if (Array.from(x).length > 1) { return false } - return y.indexOf(x) > -1 - } else if (Array.isArray(y) && Rnl.isRational(y[0]) && Rnl.isRational(x)) { - for (let i = 0; i < y.length; i++) { - if (Rnl.areEqual(x, y[i])) { return true } - } - return false - } else if (Array.isArray(y) && !Array.isArray(x)) { - for (let i = 0; i < y.length; i++) { - if (equals(x, y[i])) { return true } - } - return false - } else if (y instanceof Map) { - return y.has(x) - } else if (typeof x === "string" && typeof y === "object" && - Object.hasOwnProperty.call(y, "headings")) { - // Is x a property of dataframe y? - return Boolean(y.headings.includes(x) || - (y.rowMap && Object.hasOwnProperty.call(y.rowMap, x))) - } else { - return errorOprnd("NOT_ARRAY") - } - - case "∋": - if (typeof x === "string" && typeof y === "string") { - if (Array.from(x).length > 1) { return false } - return y.indexOf(x) > -1 - } else if (x instanceof Map) { - return x.has(y) - } else if (typeof x === "object" && typeof y === "string" && - Object.hasOwnProperty.call(x, "headings")) { - // Is y a property of dataframe x? - return Boolean(x.headings.includes(y) || - (x.rowMap && Object.hasOwnProperty.call(x.rowMap, y))) - } else { - return errorOprnd("NO_PROP", x.name) - } - - case "⊃": - if (typeof x === "string" && typeof y === "string") { - return x.indexOf(y) > -1 - } else if (Array.isArray(x) && Array.isArray(y)) { - for (let i = 0; i < x.length; i++) { - // We test for a contiguous subset - if (equals(y[0], x[i])) { - if (i + y.length > x.length) { return false } - for (let j = 1; j < y.length; j++) { - if (!equals(y[j], x[i + j])) { return false } - } - return true - } - } - return false - } else { - return errorOprnd("NOT_ARRAY") - } - - case "∉": - case "!in": - if (typeof x === "string" && typeof y === "string") { - if (Array.from(x).length === 1) { return false } - return y.indexOf(x) === -1 - } else if (Array.isArray(y) && Rnl.isRational(y[0]) && Rnl.isRational(x)) { - for (let i = 0; i < y.length; i++) { - if (Rnl.areEqual(x, y[i])) { return false } - } - return true - } else if (Array.isArray(y)) { - for (let i = 0; i < y.length; i++) { - if (x === y[i]) { return false } - } - return true - } else if (y instanceof Map) { - return !y.has(x) - } else if (typeof x === "string" && typeof y === "object" && - Object.hasOwnProperty.call(y, "headings")) { - // Is x a property of dataframe x? - return !(y.headings.includes(x) || - (y.rowMap && Object.hasOwnProperty.call(y.rowMap, x))) - } else { - return errorOprnd("NOT_ARRAY") - } - - case "∌": - if (typeof x === "string" && typeof y === "string") { - if (Array.from(y).length === 1) { return false } - return x.indexOf(y) === -1 - } else if (x instanceof Map) { - return !x.has(y) - } else if (typeof x === "object" && typeof y === "string" && - Object.hasOwnProperty.call(x, "headings")) { - // Is y a property of dataframe x? - return !(x.headings.includes(y) || - (x.rowMap && Object.hasOwnProperty.call(x.rowMap, y))) - } else { - return errorOprnd("NO_PROP", x.name) - } - - case "⊄": - if (typeof x === "string" && typeof y === "string") { - return y.indexOf(x) === -1 - } else if (Array.isArray(x) && Array.isArray(y)) { - // We test for a contiguous subset - for (let i = 0; i < y.length; i++) { - if (equals(x[0], y[i])) { - if (i + x.length > y.length) { continue } - let provisional = true; - for (let j = 1; j < x.length; j++) { - if (!equals(x[j], y[i + j])) { - provisional = false; - continue - } - } - if (!provisional) { continue } - return true - } - } - return false - } else { - return errorOprnd("NOT_ARRAY") - } - - case "⊅": - if (typeof x === "string" && typeof y === "string") { - return x.indexOf(y) === -1 - } else if (Array.isArray(x) && Array.isArray(y)) { - // We test for a contiguous subset - for (let i = 0; i < x.length; i++) { - if (equals(y[0], x[i])) { - if (i + y.length > x.length) { continue } - let provisional = true; - for (let j = 1; j < y.length; j++) { - if (!equals(y[j], x[i + j])) { - provisional = false; - continue - } - } - if (!provisional) { continue } - return true - } - } - return false - } else { - return errorOprnd("NOT_ARRAY") - } - } -}; - -// Hurmet math operators are overloaded to handle operands of various shapes. -// Those shapes being scalars, vectors, matrices, and maps. -// This file implements the overloading. - -// Some helper functions -const dotProduct$1 = (a, b) => { - return a.map((e, j) => Rnl.multiply(e, b[j])).reduce((m, n) => Rnl.add(m, n)) -}; -const sumOfSquares = vector => { - return vector.map((e) => Rnl.multiply(e, e)).reduce((m, n) => Rnl.add(m, n)) -}; -const oneTenth = [BigInt(1), BigInt(100)]; - -// From the object below, calculations.js will call operators using statements -// that look like this: -// resultValue = Operations.unary[shape][operator](inputValue) - -const unary = { - scalar: { - abs(x) { return Rnl.abs(x) }, - norm(x) { return Rnl.abs(x) }, - negate(x) { return Rnl.negate(x) }, - exp(x) { return Rnl.exp(x) }, - floor(x) { return Rnl.floor(x) }, - ceil(x) { return Rnl.ceil(x) }, - percent(x) { return Rnl.multiply(oneTenth, x) }, - factorial(x) { return Rnl.factorial(x) }, - doubleFactorial(x) { return Rnl.doubleFactorial(x) }, - not(x) { return !x } - }, - - complex: { - abs(z) { return Cpx.abs(z) }, - norm(z) { return Cpx.abs(z) }, - conjugate(z) { return Cpx.conjugate(z) }, - negate(z) { return Cpx.negate(z) }, - exp(z) { return Cpx.exp(z) }, - floor(z) { return errorOprnd("NA_COMPL_OP", "floor") }, - ceil(z) { return errorOprnd("NA_COMPL_OP", "ceil") }, - percent(z) { return errorOprnd("NA_COMPL_OP", "percent") }, - factorial(z) { return errorOprnd("NA_COMPL_OP", "factorial") }, - doubleFactorial(z) { return errorOprnd("NA_COMPL_OP", "factorial") }, - not(z) { return errorOprnd("NA_COMPL_OP", "not") } - }, - - vector: { - abs(v) { return Rnl.sqrt(sumOfSquares(v)) }, // magnitude of a vector - norm(v) { return Rnl.sqrt(sumOfSquares(v)) }, // ditto - negate(v) { return v.map(e => Rnl.negate(e)) }, - exp(v) { return v.map(e => Rnl.exp(e)) }, - floor(v) { return v.map(e => Rnl.floor(e)) }, - ceil(v) { return v.map(e => Rnl.ceil(e)) }, - percent(v) { return v.map(e => Rnl.multiply(oneTenth, e)) }, - factorial(v) { return v.map(e => Rnl.factorial(e)) }, - doubleFactorial(v) { return v.map(e => Rnl.doubleFactorial(e)) }, - not(v) { return v.map(e => !e) } - }, - - matrix: { - abs(m) { return Matrix.invert(m, true) }, - norm(m) { - if (m.length === m[0].length) { - let sum = Rnl.zero; - for (let i = 0; i < m.length; i++) { - sum = Rnl.add(sum, sumOfSquares(m[i])); - } - return sum.sqrt() - } - }, - negate(m) { return m.map(row => row.map(e => Rnl.negate(e))) }, - exp(m) { return m.map(row => row.map(e => Rnl.exp(e))) }, - floor(m) { return m.map(row => row.map(e => Rnl.floor(e))) }, - ceil(m) { return m.map(row => row.map(e => Rnl.ceil(e))) }, - percent(m) { return m.map(row => row.map(e => Rnl.multiply(oneTenth, e))) }, - factorial(m) { return m.map(row => row.map(e => Rnl.factorial(e))) }, - doubleFactorial(m) { return m.map(row => row.map(e => Rnl.doubleFactorial(e))) }, - not(m) { return m.map(row => row.map(e => !e)) } - }, - - map: { - abs(map) { - map.data = map.data.map(column => Rnl.isRational(column[0]) - ? column.map(e => Rnl.abs(e)) - : column - ); - return map - }, - negate(map) { - map.data = map.data.map(column => Rnl.isRational(column[0]) - ? column.map(e => Rnl.negate(e)) - : column - ); - return map - }, - exp(map) { - map.data = map.data.map(column => Rnl.isRational(column[0]) - ? column.map(e => Rnl.exp(e)) - : column - ); - return map - }, - floor(map) { - map.data = map.data.map(column => Rnl.isRational(column[0]) - ? column.map(e => Rnl.floor(e)) - : column - ); - return map - }, - ceil(map) { - map.data = map.data.map(column => Rnl.isRational(column[0]) - ? column.map(e => Rnl.ceil(e)) - : column); - return map - }, - percent(map) { - map.data = map.data.map(column => Rnl.isRational(column[0]) - ? column.map(e => Rnl.multiply(oneTenth, e)) - : column - ); - return map - }, - factorial(map) { - map.data = map.data.map(column => Rnl.isRational(column[0]) - ? column.map(e => Rnl.factorial(e)) - : column - ); - return map - }, - doubleFactorial(map) { - map.data = map.data.map(column => Rnl.isRational(column[0]) - ? column.map(e => Rnl.doubleFactorial(e)) - : column - ); - return map - }, - not(map) { - map.data = map.data.map(column => typeof column[0] === "boolean" - ? column.map(e => !e) - : column - ); - return map - } - } -}; - -const condition = { - // Deal with booleans. Return a single value, true or false. - // If a vector or matrix is received, all elements must be - // true in order to return a true. Otherwise return a false. - scalar(x) { return x }, - vector(v) { return v.reduce((prev, curr) => prev && curr, true) }, - matrix(m) { - const row = new Array(m.length); - for (let i = 0; i < m.length; i++) { - row[i] = m[i].reduce((prev, curr) => prev && curr, true); - } - return row.reduce((prev, curr) => prev && curr, true) - } -}; - -const dtype = { - // Given the shapes which are operands to a binary operator, - // return the resulting data type. - scalar: { - scalar(t0, t1, tkn) { - return (tkn === "&" || tkn === "hcat" || tkn === "hcat") - ? t0 + ((tkn === "&" || tkn === "hcat") ? dt.ROWVECTOR : dt.COLUMNVECTOR ) - : t0 - }, - complex(t0, t1, tkn) { return t1 }, - vector(t0, t1, tkn) { return t1 }, - matrix(t0, t1, tkn) { return t1 }, - dataFrame(t0, t1, tkn) { return t1 }, - map(t0, t1, tkn) { return t1 } - }, - complex: { - scalar(t0, t1, tkn) { return t0 }, - complex(t0, t1, tkn) { return t0 } - }, - vector: { - scalar(t0, t1, tkn) { return t0 }, - map(t0, t1, tkn) { return t1 + (t0 & dt.ROWVECTOR) + (t0 & dt.COLUMNVECTOR) } - }, - rowVector: { - rowVector(t0, t1, tkn) { return tkn === "vcat" ? t0 - dt.ROWVECTOR + dt.MATRIX : t0 }, - columnVector(t0, t1, tkn) { return t0 }, - matrix(t0, t1, tkn) { return tkn === "multiply" ? t0 : t1 } - }, - columnVector: { - rowVector(t0, t1, op) { - return op === "dot" - ? dt.RATIONAL - : op === "cross" - ? t0 - : t0 - dt.COLUMNVECTOR + dt.MATRIX - }, - columnVector(t0, t1, tkn) { return tkn === "&" ? t0 - dt.COLUMNVECTOR + dt.MATRIX : t0 }, - matrix(t0, t1, tkn) { return t1 } - }, - matrix: { - scalar(t0, t1, tkn) { return t0 }, - rowVector(t0, t1, tkn) { return t0 }, - columnVector(t0, t1, tkn) { return tkn === "*" || tkn === "⌧" ? t1 : t0 }, - matrix(t0, t1, tkn) { return t0 }, - map(t0, t1, tkn) { return 0 } - }, - dataFrame: { - scalar(t0, t1, tkn) { return t0 } - }, - map: { - scalar(t0, t1, tkn) { return t0 }, - vector(t0, t1, tkn) { return t0 }, - matrix(t0, t1, tkn) { return 0 }, - map(t0, t1, tkn) { return t0 } - } -}; - - -// The binary operators below are called like this: -// resultValue = Operations.binary[shape_0][shape_1][operator](input_0, input_1) - -const binary = { - scalar: { - scalar: { - // Binary operations on two scalars - add(x, y) { return Rnl.add(x, y) }, - subtract(x, y) { return Rnl.subtract(x, y) }, - multiply(x, y) { return Rnl.multiply(x, y) }, - divide(x, y) { return Rnl.divide(x, y) }, - power(x, y) { - // eslint-disable-next-line max-len - return Cpx.isComplex(x) || (Rnl.isNegative(x) && Rnl.isPositive(y) && Rnl.lessThan(y, Rnl.one)) - ? Cpx.power([x, Rnl.zero], y) - : Rnl.power(x, y) - }, - hypot(x, y) { return Rnl.hypot(x, y) }, - rem(x, y) { return Rnl.rem(x, y) }, - and(x, y) { return x && y }, - or(x, y) { return x || y }, - xor(x, y) { return x !== y }, - concat(x, y) { return [x, y] }, - unshift(x, y) { return [x, y] } - }, - complex: { - add(x, z) { return [Rnl.add(x, z[0]), z[1]] }, - subtract(x, z) { return [Rnl.subtract(x, z[0]), Rnl.negate(z[1])] }, - multiply(x, z) { return [Rnl.multiply(x, z[0]), Rnl.multiply(x, z[1])] }, - divide(x, z) { return Cpx.divide([x, Rnl.zero], z) }, - power(x, z) { return Cpx.power([x, Rnl.zero], z) }, - rem(x, z) { return errorOprnd("NA_COMPL_OP", "rem") }, - and(x, z) { return errorOprnd("NA_COMPL_OP", "and") }, - or(x, z) { return errorOprnd("NA_COMPL_OP", "or") }, - xor(x, z) { return errorOprnd("NA_COMPL_OP", "xor") } - }, - vector: { - // Binary operations with a scalar and a vector. - // Perform element-wise operations. - add(x, v) { return v.map(e => Rnl.add(x, e)) }, - subtract(x, v) { return v.map(e => Rnl.subtract(x, e)) }, - multiply(x, v) { return v.map(e => Rnl.multiply(x, e)) }, - divide(x, v) { return v.map(e => Rnl.divide(x, e)) }, - power(x, v) { return v.map(e => Rnl.power(x, e)) }, - rem(x, v) { return v.map(e => Rnl.rem(x, e)) }, - and(x, v) { return v.map(e => x && e) }, - or(x, v) { return v.map(e => x || e) }, - xor(x, v) { return v.map(e => x !== e) }, - concat(x, v) { return [x, ...v] } - }, - matrix: { - // Binary operations with a scalar and a matrix. - // Perform element-wise operations. - add(x, m) { return m.map(row => row.map(e => Rnl.add(x, e))) }, - subtract(x, m) { return m.map(row => row.map(e => Rnl.subtract(x, e))) }, - multiply(x, m) { return m.map(row => row.map(e => Rnl.multiply(x, e))) }, - divide(x, m) { return m.map(row => row.map(e => Rnl.divide(x, e))) }, - power(x, m) { return m.map(row => row.map(e => Rnl.power(x, e))) }, - rem(x, m) { return m.map(row => row.map(e => Rnl.rem(x, e))) }, - and(x, m) { return m.map(row => row.map(e => x && e)) }, - or(x, m) { return m.map(row => row.map(e => x || e)) }, - xor(x, m) { return m.map(row => row.map(e => x !== e)) }, - concat(x, m) { return errorOprnd("BAD_CONCAT") } - }, - dataFrame: { - multiply(x, df) { - df.data = df.data.map(col => isNaN(col[0]) ? col : col.map(e => { - let L = e.length; - if (e.indexOf(".")) { L -= 1; } - return Rnl.toStringSignificant(Rnl.multiply(x, Rnl.fromString(e)), L) - })); - return df - }, - divide(x, df) { - df.data = df.data.map(col => isNaN(col[0]) ? col : col.map(e => { - let L = e.length; - if (e.indexOf(".")) { L -= 1; } - return Rnl.toStringSignificant(Rnl.divide(x, Rnl.fromString(e)), L) - })); - return df - } - }, - map: { - // Binary operations with a scalar and a map. - // Perform element-wise operations. - add(scalar, map) { - map.data = map.data.map(col => Rnl.isRational(col[0]) - ? col.map(e => Rnl.add(scalar, e)) - : col - ); - return map - }, - subtract(scalar, map) { - map.data = map.data.map(col => Rnl.isRational(col[0]) - ? col.map(e => Rnl.subtract(scalar, e)) - : col - ); - return map - }, - multiply(scalar, map) { - map.data = map.data.map(col => Rnl.isRational(col[0]) - ? col.map(e => Rnl.multiply(scalar, e)) - : col - ); - return map - }, - divide(scalar, map) { - map.data = map.data.map(col => Rnl.isRational(col[0]) - ? col.map(e => Rnl.divide(scalar, e)) - : col - ); - return map - }, - power(scalar, map) { - map.data = map.data.map(col => Rnl.isRational(col[0]) - ? col.map(e => Rnl.power(scalar, e)) - : col - ); - return map - }, - rem(scalar, map) { - map.data = map.data.map(col => Rnl.isRational(col[0]) - ? col.map(e => Rnl.rem(scalar, e)) - : col - ); - return map - }, - and(scalar, map) { - map.data = map.data.map(col => typeof col[0] === "boolean" - ? col.map(e => scalar && e) - : col - ); - return map - }, - or(scalar, map) { - map.data = map.data.map(col => typeof col[0] === "boolean" - ? col.map(e => scalar || e) - : col - ); - return map - }, - xor(scalar, map) { - map.data = map.data.map(col => typeof col[0] === "boolean" - ? col.map(e => scalar !== e) - : col - ); - return map - } - } - }, - - complex: { - scalar: { - add(z, y) { return [Rnl.add(z[0], y), z[1]] }, - subtract(z, y) { return [Rnl.subtract(z[0], y), z[1]] }, - multiply(z, y) { return [Rnl.multiply(z[0], y), Rnl.multiply(z[1], y) ] }, - divide(z, y) { return Cpx.divide(z, [y, Rnl.zero]) }, - power(z, y) { return Cpx.power(z, [y, Rnl.zero]) }, - rem(z, y) { return errorOprnd("NA_COMPL_OP", "rem") }, - and(z, y) { return errorOprnd("NA_COMPL_OP", "and") }, - or(z, y) { return errorOprnd("NA_COMPL_OP", "or") }, - xor(z, y) { return errorOprnd("NA_COMPL_OP", "xor") } - }, - complex: { - add(x, y) { return [Rnl.add(x[0], y[0]), Rnl.add(x[1], y[1])] }, - subtract(x, y) { return [Rnl.subtract(x[0], y[0]), Rnl.subtract(x[1], y[1])] }, - multiply(x, y) { return Cpx.multiply(x, y) }, - divide(x, y) { return Cpx.divide(x, y) }, - power(x, y) { return Cpx.power(x, y) }, - rem(x, y) { return errorOprnd("NA_COMPL_OP", "rem") }, - and(x, y) { return errorOprnd("NA_COMPL_OP", "and") }, - or(x, y) { return errorOprnd("NA_COMPL_OP", "or") }, - xor(x, y) { return errorOprnd("NA_COMPL_OP", "xor") } - - } - }, - - vector: { - scalar: { - // Binary operations with a vector and a scalar. - // Perform element-wise operations. - add(v, x) { return v.map(e => Rnl.add(e, x)) }, - subtract(v, x) { return v.map(e => Rnl.subtract(e, x)) }, - multiply(v, x) { return v.map(e => Rnl.multiply(e, x)) }, - divide(v, x) { return v.map(e => Rnl.divide(e, x)) }, - power(v, x) { return v.map(e => Rnl.power(e, x)) }, - rem(v, x) { return v.map(e => Rnl.rem(e, x)) }, - and(v, x) { return v.map(e => e && x) }, - or(v, x) { return v.map(e => e || x) }, - xor(v, x) { return v.map(e => e !== x) }, - concat(v, x) { return [...v, x]} - } - }, - - rowVector: { - rowVector: { - // Binary operations on two row vectors. - add(x, y) { - // element-wise addition - if (x.length !== y.length) { return errorOprnd("MIS_ELNUM") } - return x.map((e, i) => Rnl.add(e, y[i])) - }, - subtract(x, y) { - if (x.length !== y.length) { return errorOprnd("MIS_ELNUM") } - return x.map((e, i) => Rnl.subtract(e, y[i])) - }, - divide(x, y) { - if (x.length !== y.length) { return errorOprnd("MIS_ELNUM") } - return x.map((e, i) => Rnl.divide(e, y[i])) - }, - dot(x, y) { - if (x.length !== y.length) { return errorOprnd("MIS_ELNUM") } - return dotProduct$1(x, y) - }, - cross(x, y) { - if (x.length !== 3 || y.length !== 3) { return errorOprnd("CROSS") } - const v = [Rnl.zero, Rnl.zero, Rnl.zero]; - v[0] = Rnl.subtract(Rnl.multiply(x[1], y[2]), Rnl.multiply(x[2], y[1])); - v[1] = Rnl.subtract(Rnl.multiply(x[2], y[0]), Rnl.multiply(x[0], y[2])); - v[2] = Rnl.subtract(Rnl.multiply(x[0], y[1]), Rnl.multiply(x[1], y[0])); - return v - }, - multiply(x, y) { - if (x.length === 1 && y.length === 1) { return [Rnl.multiply(x[0], y[0])] } - return errorOprnd("MIS_ELNUM") - }, - circ(x, y) { - // Element-wise multiplication - if (x.length !== y.length) { return errorOprnd("MIS_ELNUM") } - return x.map((e, i) => Rnl.multiply(e, y[i])) - }, - power(x, y) { - if (x.length !== y.length) { return errorOprnd("MIS_ELNUM") } - return x.map((e, i) => Rnl.power(e, y[i])) - }, - modulo(x, y) { - if (x.length !== y.length) { return errorOprnd("MIS_ELNUM") } - return x.map((e, i) => Rnl.modulo(e, y[i])) - }, - and(x, y) { - if (x.length !== y.length) { return errorOprnd("MIS_ELNUM") } - return x.map((e, i) => e && y[i]) - }, - or(x, y) { - if (x.length !== y.length) { return errorOprnd("MIS_ELNUM") } - return x.map((e, i) => e || y[i]) - }, - xor(x, y) { - if (x.length !== y.length) { return errorOprnd("MIS_ELNUM") } - return x.map((e, i) => e !== y[i]) - }, - concat(x, y) { return x.concat(y) }, - unshift(x, y) { return [x, y] } - }, - columnVector: { - // Binary operations on a row vector and a column vector. - // Except for multiplication, these work only if both vectors have only one element. - add(x, y) { - if (x.length === 1 && y.length === 1) { return [Rnl.add(x[0], y[0])] } - return errorOprnd("MIS_ELNUM") - }, - subtract(x, y) { - if (x.length === 1 && y.length === 1) { return [Rnl.subtract(x[0], y[0])] } - return errorOprnd("MIS_ELNUM") - }, - dot(x, y) { - if (x.length !== y.length) { return errorOprnd("MIS_ELNUM") } - return dotProduct$1(x, y) - }, - cross(x, y) { - if (x.length !== 3 || y.length !== 3) { return errorOprnd("CROSS") } - const v = [Rnl.zero, Rnl.zero, Rnl.zero]; - v[0] = Rnl.subtract(Rnl.multiply(x[1], y[2]), Rnl.multiply(x[2], y[1])); - v[1] = Rnl.subtract(Rnl.multiply(x[2], y[0]), Rnl.multiply(x[0], y[2])); - v[2] = Rnl.subtract(Rnl.multiply(x[0], y[1]), Rnl.multiply(x[1], y[0])); - return v - }, - multiply(x, y) { - if (x.length !== y.length) { return errorOprnd("MIS_ELNUM") } - return dotProduct$1(x, y) - }, - circ(x, y) { - if (x.length !== y.length) { return errorOprnd("MIS_ELNUM") } - return x.map((e, i) => Rnl.multiply(e, y[i])) - }, - power(x, y) { - if (x.length === 1 && y.length === 1) { return [Rnl.power(x[0], y[0])] } - return errorOprnd("MIS_ELNUM") - }, - modulo(x, y) { - if (x.length === 1 && y.length === 1) { return [Rnl.modulo(x[0], y[0])] } - return errorOprnd("MIS_ELNUM") - }, - and(x, y) { - if (x.length === 1 && y.length === 1) { return [x[0] && y[0]] } - return errorOprnd("MIS_ELNUM") - }, - or(x, y) { - if (x.length === 1 && y.length === 1) { return [x[0] || y[0]] } - return errorOprnd("MIS_ELNUM") - }, - xor(x, y) { - if (x.length === 1 && y.length === 1) { return [x[0] !== y[0]] } - return errorOprnd("MIS_ELNUM") - }, - concat(x, y) { return "BAD_CONCAT" }, - unshift(x, y) { return "BAD_CONCAT" } - }, - matrix: { - // Binary operations on a row vector and a 2-D matrix. - add(v, m) { - // Add the row vector to each row in the matrix - if (v.length !== m[0].length) { return errorOprnd("MIS_ELNUM") } - return m.map(row => row.map((e, i) => Rnl.add(v[i], e))) - }, - subtract(v, m) { - if (v.length !== m[0].length) { return errorOprnd("MIS_ELNUM") } - return m.map(row => row.map((e, i) => Rnl.subtract(v[i], e))) - }, - multiply(v, m) { - if (v.length !== m[0].length) { return errorOprnd("MIS_ELNUM") } - m = m[0].map((x, i) => m.map(y => y[i])); // Transpose m - return m.map(row => dotProduct$1(v, row)) - }, - circ(v, m) { - if (v.length !== m[0].length) { return errorOprnd("MIS_ELNUM") } - return m.map(row => row.map((e, i) => Rnl.multiply(v[i], e))) - }, - divide(v, m) { - if (v.length !== m[0].length) { return errorOprnd("MIS_ELNUM") } - return m.map(row => row.map((e, i) => Rnl.divide(v[i], e))) - }, - power(v, m) { - if (v.length !== m[0].length) { return errorOprnd("MIS_ELNUM") } - return m.map(row => row.map((e, i) => Rnl.power(v[i], e))) - }, - concat(v, m) { - if (v.length !== m[0].length) { return errorOprnd("BAD_CONCAT") } - return m.map((row, i) => [v[i], ...row]) - }, - unshift(v, m) { - if (v.length !== m[0].length) { return errorOprnd("BAD_CONCAT") } - return [v, ...m] - } - } - }, - - columnVector: { - rowVector: { - // Binary operations on a column vector and a row vector. - // Except for multiplication, these work only if both vectors have only one element. - add(x, y) { - if (x.length === 1 && y.length === 1) { return [Rnl.add(x[0], y[0])] } - return errorOprnd("MIS_ELNUM") - }, - subtract(x, y) { - if (x.length === 1 && y.length === 1) { return [Rnl.subtract(x[0], y[0])] } - return errorOprnd("MIS_ELNUM") - }, - dot(x, y) { - if (x.length !== y.length) { return errorOprnd("MIS_ELNUM") } - return dotProduct$1(x, y) - }, - cross(x, y) { - if (x.length !== 3 || y.length !== 3) { return errorOprnd("CROSS") } - const v = [Rnl.zero, Rnl.zero, Rnl.zero]; - v[0] = Rnl.subtract(Rnl.multiply(x[1], y[2]), Rnl.multiply(x[2], y[1])); - v[1] = Rnl.subtract(Rnl.multiply(x[2], y[0]), Rnl.multiply(x[0], y[2])); - v[2] = Rnl.subtract(Rnl.multiply(x[0], y[1]), Rnl.multiply(x[1], y[0])); - return v - }, - multiply(x, y) { - if (x[0].length !== y.length) { return errorOprnd("MIS_ELNUM") } - return x.map(row => y.map(e => Rnl.multiply(row, e))) - }, - divide(x, y) { - return x.map(m => y.map(e => Rnl.divide(m, e))) - }, - circ(x, y) { - if (x.length !== y.length) { return errorOprnd("MIS_ELNUM") } - return x.map((e, i) => Rnl.multiply(e, y[i])) - }, - power(x, y) { - if (x.length === 1 && y.length === 1) { return [Rnl.power(x[0], y[0])] } - return errorOprnd("MIS_ELNUM") - }, - modulo(x, y) { - if (x.length === 1 && y.length === 1) { return [Rnl.modulo(x[0], y[0])] } - return errorOprnd("MIS_ELNUM") - }, - and(x, y) { - if (x.length === 1 && y.length === 1) { return [x[0] && y[0]] } - return errorOprnd("MIS_ELNUM") - }, - or(x, y) { - if (x.length === 1 && y.length === 1) { return [x[0] || y[0]] } - return errorOprnd("MIS_ELNUM") - }, - xor(x, y) { - if (x.length === 1 && y.length === 1) { return [x[0] !== y[0]] } - return errorOprnd("MIS_ELNUM") - }, - concat(x, y) { return "BAD_CONCAT" }, - unshift(x, y) { return "BAD_CONCAT" } - }, - columnVector: { - // Binary operations on two column vectors. - add(x, y) { - // element-wise addition - if (x.length !== y.length) { return errorOprnd("MIS_ELNUM") } - return x.map((e, i) => Rnl.add(e, y[i])) - }, - subtract(x, y) { - if (x.length !== y.length) { return errorOprnd("MIS_ELNUM") } - return x.map((e, i) => Rnl.subtract(e, y[i])) - }, - divide(x, y) { - if (x.length !== y.length) { return errorOprnd("MIS_ELNUM") } - return x.map((e, i) => Rnl.divide(e, y[i])) - }, - dot(x, y) { - if (x.length !== y.length) { return errorOprnd("MIS_ELNUM") } - return dotProduct$1(x, y) - }, - cross(x, y) { - if (x.length !== 3 || y.length !== 3) { return errorOprnd("CROSS") } - const v = [Rnl.zero, Rnl.zero, Rnl.zero]; - v[0] = Rnl.subtract(Rnl.multiply(x[1], y[2]), Rnl.multiply(x[2], y[1])); - v[1] = Rnl.subtract(Rnl.multiply(x[2], y[0]), Rnl.multiply(x[0], y[2])); - v[2] = Rnl.subtract(Rnl.multiply(x[0], y[1]), Rnl.multiply(x[1], y[0])); - return v - }, - multiply(x, y) { - if (x.length === 1 && y.length === 1) { return [Rnl.multiply(x[0], y[0])] } - return errorOprnd("MIS_ELNUM") - }, - circ(x, y) { - // Element-wise multiplication - if (x.length !== y.length) { return errorOprnd("MIS_ELNUM") } - return x.map((e, i) => Rnl.multiply(e, y[i])) - }, - power(x, y) { - if (x.length !== y.length) { return errorOprnd("MIS_ELNUM") } - return x.map((e, i) => Rnl.power(e, y[i])) - }, - rem(x, y) { - if (x.length !== y.length) { return errorOprnd("MIS_ELNUM") } - return x.map((e, i) => Rnl.rem(e, y[i])) - }, - and(x, y) { - if (x.length !== y.length) { return errorOprnd("MIS_ELNUM") } - return x.map((e, i) => e && y[i]) - }, - or(x, y) { - if (x.length !== y.length) { return errorOprnd("MIS_ELNUM") } - return x.map((e, i) => e || y[i]) - }, - xor(x, y) { - if (x.length !== y.length) { return errorOprnd("MIS_ELNUM") } - return x.map((e, i) => e !== y[i]) - }, - concat(x, y) { - if (x.length !== y.length) { return errorOprnd("MIS_ELNUM") } - return x.map((e, i) => [e, y[i]]) - }, - unshift(x, y) { return x.concat(y) } - }, - matrix: { - // Binary operations on a column vector and a 2-D matrix. - add(v, m) { - if (v.length !== m.length) { return errorOprnd("MIS_ELNUM") } - return m.map((row, i) => row.map(e => Rnl.add(v[i], e))) - }, - subtract(v, m) { - if (v.length !== m.length) { return errorOprnd("MIS_ELNUM") } - return m.map((row, i) => row.map(e => Rnl.subtract(v[i], e))) - }, - multiply(v, m) { - if (m.length !== 1) { return errorOprnd("MIS_ELNUM") } - return m.map((row, i) => row.map(e => Rnl.multiply(v[i], e))) - }, - circ(v, m) { - if (v.length !== m.length) { return errorOprnd("MIS_ELNUM") } - return m.map((row, i) => row.map(e => Rnl.multiply(v[i], e))) - }, - divide(v, m) { - if (v.length !== m.length) { return errorOprnd("MIS_ELNUM") } - return m.map((row, i) => row.map(e => Rnl.divide(v[i], e))) - }, - power(v, m) { - if (v.length !== m.length) { return errorOprnd("MIS_ELNUM") } - return m.map((row, i) => row.map(e => Rnl.power(v[i], e))) - }, - concat(v, m) { - if (v.length !== m.length) { return errorOprnd("MIS_ELNUM") } - return m.map((row, i) => [v[i], ...row]) - }, - unshift(x, y) { return "BAD_CONCAT" } - }, - map: { - // Binary operations between a column vector and a map - add(vector, map) { - map.data = map.data.map(col => Rnl.isRational(col[0]) - ? col.map((e, i) => Rnl.add(vector[i], e)) - : col - ); - return map - }, - subtract(vector, map) { - map.data = map.data.map(col => Rnl.isRational(col[0]) - ? col.map((e, i) => Rnl.subtract(vector[i], e)) - : col - ); - return map - }, - multiply(vector, map) { - map.data = map.data.map(col => Rnl.isRational(col[0]) - ? col.map((e, i) => Rnl.multiply(vector[i], e)) - : col - ); - return map - }, - divide(vector, map) { - map.data = map.data.map(col => Rnl.isRational(col[0]) - ? col.map((e, i) => Rnl.divide(vector[i], e)) - : col - ); - return map - }, - power(vector, map) { - map.data = map.data.map(col => Rnl.isRational(col[0]) - ? col.map((e, i) => Rnl.power(vector[i], e)) - : col - ); - return map - }, - rem(vector, map) { - map.data = map.data.map(col => Rnl.isRational(col[0]) - ? col.map((e, i) => Rnl.rem(vector[i], e)) - : col - ); - return map - }, - and(vector, map) { - map.data = map.data.map(col => typeof col[0] === "boolean" - ? col.map((e, i) => vector[i] && e) - : col - ); - return map - }, - or(vector, map) { - map.data = map.data.map(col => typeof col[0] === "boolean" - ? col.map((e, i) => vector[i] || e) - : col - ); - return map - }, - xor(vector, map) { - map.data = map.data.map(col => typeof col[0] === "boolean" - ? col.map((e, i) => vector[i] !== e) - : col - ); - return map - } - } - }, - - matrix: { - scalar: { - // Binary operations with a matrix and a scalar. - // Perform element-wise operations. - add(m, x) { return m.map(row => row.map(e => Rnl.add(e, x))) }, - subtract(m, x) { return m.map(row => row.map(e => Rnl.subtract(e, x))) }, - multiply(m, x) { return m.map(row => row.map(e => Rnl.multiply(e, x))) }, - divide(m, x) { return m.map(row => row.map(e => Rnl.divide(e, x))) }, - power(m, x) { - if (m.length === m[0].length && Rnl.areEqual(x, [BigInt(-1), BigInt(1)])) { - return Matrix.invert(m) - } - return m.map(row => row.map(e => Rnl.power(e, x))) - }, - rem(m, x) { return m.map(row => row.map(e => Rnl.rem(e, x))) } - }, - rowVector: { - add(m, v) { return m.map(row => row.map((e, i) => Rnl.add(e, v[i]) )) }, - subtract(m, v) { return m.map(row => row.map((e, i) => Rnl.subtract(e, v[i]) )) }, - multiply(m, v) { return m.map(row => row.map((e, i) => Rnl.multiply(e, v[i]) )) }, - circ(m, v) { return m.map(row => row.map((e, i) => Rnl.multiply(e, v[i]) )) }, - divide(m, v) { return m.map(row => row.map((e, i) => Rnl.divide(e, v[i]) )) }, - power(m, v) { return m.map(row => row.map((e, i) => Rnl.power(e, v[i]) )) }, - modulo(m, v) { return m.map(row => row.map((e, i) => Rnl.modulo(e, v[i]) )) }, - unshift(m, v) { - if (m[0].length !== v.length) { return errorOprnd("MIS_ELNUM") } - return [...m, v] - } - }, - columnVector: { - add(m, v) { return m.map((row, i) => row.map(e => Rnl.add(e, v[i]) )) }, - subtract(m, v) { return m.map((row, i) => row.map(e => Rnl.subtract(e, v[i]) )) }, - multiply(m, v) { - // Multiply a matrix times a column vector - if (m[0].length !== v.length) { return errorOprnd("MIS_ELNUM") } - return m.map(row => dotProduct$1(row, v)) - }, - circ(m, v) { return m.map((row, i) => row.map(e => Rnl.multiply(e, v[i]) )) }, - divide(m, v) { return m.map((row, i) => row.map(e => Rnl.divide(e, v[i]) )) }, - power(m, v) { return m.map((row, i) => row.map(e => Rnl.power(e, v[i]) )) }, - rem(m, v) { return m.map((row, i) => row.map(e => Rnl.rem(e, v[i]) )) }, - concat(m, v) { - if (m.length !== v.length) { return errorOprnd("MIS_ELNUM") } - return m.map((row, i) => [...row, v[i]]) - } - }, - matrix: { - // Binary operations on two 2-D matrices. - add(x, y) { - if (x.length !== y.length) { return errorOprnd("MIS_ELNUM") } - if (x[0].length !== y[0].length) { return errorOprnd("MIS_ELNUM") } - return x.map((m, i) => m.map((n, j) => Rnl.add(n, y[i][j]))) - }, - subtract(x, y) { - if (x.length !== y.length) { return errorOprnd("MIS_ELNUM") } - if (x[0].length !== y[0].length) { return errorOprnd("MIS_ELNUM") } - return x.map((m, i) => m.map((n, j) => Rnl.subtract(n, y[i][j]))) - }, - dot(x, y) { - if (x.length !== y.length) { return errorOprnd("MIS_ELNUM") } - if (x[0].length !== y[0].length) { return errorOprnd("MIS_ELNUM") } - return x.map((row, i) => dotProduct$1(row, y[i])).reduce((m, n) => Rnl.add(m, n)) - }, - cross(x, y) { - return errorOprnd("CROSS") - }, - multiply(x, y) { - - }, - circ(x, y) { - // Element-wise multiplication - if (x.length !== y.length) { return errorOprnd("MIS_ELNUM") } - if (x[0].length !== y[0].length) { return errorOprnd("MIS_ELNUM") } - return x.map((m, i) => m.map((n, j) => Rnl.multiply(n, y[i][j]))) - }, - divide(x, y) { - if (x.length !== y.length) { return errorOprnd("MIS_ELNUM") } - if (x[0].length !== y[0].length) { return errorOprnd("MIS_ELNUM") } - return x.map((m, i) => m.map((n, j) => Rnl.divide(n, y[i][j]))) - }, - power(x, y) { - if (x.length !== y.length) { return errorOprnd("MIS_ELNUM") } - if (x[0].length !== y[0].length) { return errorOprnd("MIS_ELNUM") } - return x.map((m, i) => m.map((n, j) => Rnl.power(n, y[i][j]))) - }, - rem(x, y) { - if (x.length !== y.length) { return errorOprnd("MIS_ELNUM") } - if (x[0].length !== y[0].length) { return errorOprnd("MIS_ELNUM") } - return x.map((m, i) => m.map((n, j) => Rnl.rem(n, y[i][j]))) - }, - and(x, y) { - if (x.length !== y.length) { return errorOprnd("MIS_ELNUM") } - if (x[0].length !== y[0].length) { return errorOprnd("MIS_ELNUM") } - return x.map((m, i) => m.map((n, j) => n && y[i][j])) - }, - or(x, y) { - if (x.length !== y.length) { return errorOprnd("MIS_ELNUM") } - if (x[0].length !== y[0].length) { return errorOprnd("MIS_ELNUM") } - return x.map((m, i) => m.map((n, j) => n || y[i][j])) - }, - xor(x, y) { - if (x.length !== y.length) { return errorOprnd("MIS_ELNUM") } - if (x[0].length !== y[0].length) { return errorOprnd("MIS_ELNUM") } - return x.map((m, i) => m.map((n, j) => n !== y[i][j])) - }, - concat(x, y) { - if (x.length !== y.length) { return errorOprnd("MIS_ELNUM") } - return x.map((row, i) => row.concat(y[i])) - }, - unshift(x, y) { - if (x[0].length !== y[0].length) { return errorOprnd("MIS_ELNUM") } - return x.concat(y) - } - }, - map: { - - } - }, - - dataFrame: { - multiply(df, scalar) { - df.data = df.data.map(col => isNaN(col[0]) ? col : col.map(e => { - let L = e.length; - if (e.indexOf(".")) { L -= 1; } - return Rnl.toStringSignificant(Rnl.multiply(scalar, Rnl.fromString(e)), L) - })); - return df - }, - divide(df, scalar) { - df.data = df.data.map(col => isNaN(col[0]) ? col : col.map(e => { - let L = e.length; - if (e.indexOf(".")) { L -= 1; } - return Rnl.toStringSignificant(Rnl.divide(scalar, Rnl.fromString(e)), L) - })); - return df - } - }, - - map: { - scalar: { - // Binary opertions on a map and a scalar - add(map, scalar) { - map.data = map.data.map(col => Rnl.isRational(col[0]) - ? col.map(e => Rnl.add(e, scalar)) - : col - ); - return map - }, - subtract(map, scalar) { - map.data = map.data.map(col => Rnl.isRational(col[0]) - ? col.map(e => Rnl.subtract(e, scalar)) - : col - ); - return map - }, - multiply(map, scalar) { - map.data = map.data.map(col => Rnl.isRational(col[0]) - ? col.map(e => Rnl.multiply(e, scalar)) - : col - ); - return map - }, - divide(map, scalar) { - map.data = map.data.map(col => Rnl.isRational(col[0]) - ? col.map(e => Rnl.divide(e, scalar)) - : col - ); - return map - }, - power(map, scalar) { - map.data = map.data.map(col => Rnl.isRational(col[0]) - ? col.map(e => Rnl.power(e, scalar)) - : col - ); - return map - }, - rem(map, scalar) { - map.data = map.data.map(col => Rnl.isRational(col[0]) - ? col.map(e => Rnl.rem(e, scalar)) - : col - ); - return map - }, - and(map, scalar) { - map.data = map.data.map(col => typeof col[0] === "boolean" - ? col.map(e => e && scalar) - : col - ); - return map - }, - or(map, scalar) { - map.data = map.data.map(col => typeof col[0] === "boolean" - ? col.map(e => e || scalar) - : col - ); - return map - }, - xor(map, scalar) { - map.data = map.data.map(col => typeof col[0] === "boolean" - ? col.map(e => e !== scalar) - : col - ); - return map - } - }, - columnVector: { - add(map, vector) { - map.data = map.data.map(col => Rnl.isRational(col[0]) - ? col.map((e, i) => Rnl.add(e, vector[i])) - : col - ); - return map - }, - subtract(map, vector) { - map.data = map.data.map(col => Rnl.isRational(col[0]) - ? col.map((e, i) => Rnl.subtract(e, vector[i])) - : col - ); - return map - }, - multiply(map, vector) { - map.data = map.data.map(col => Rnl.isRational(col[0]) - ? col.map((e, i) => Rnl.multiply(e, vector[i])) - : col - ); - return map - }, - divide(map, vector) { - map.data = map.data.map(col => Rnl.isRational(col[0]) - ? col.map((e, i) => Rnl.divide(e, vector[i])) - : col - ); - return map - }, - power(map, vector) { - map.data = map.data.map(col => Rnl.isRational(col[0]) - ? col.map((e, i) => Rnl.power(e, vector[i])) - : col - ); - return map - }, - rem(map, vector) { - map.data = map.data.map(col => Rnl.isRational(col[0]) - ? col.map((e, i) => Rnl.rem(e, vector[i])) - : col - ); - return map - }, - and(map, vector) { - map.data = map.data.map(col => typeof col[0] === "boolean" - ? col.map((e, i) => e && vector[i]) - : col - ); - return map - }, - or(map, vector) { - map.data = map.data.map(col => typeof col[0] === "boolean" - ? col.map((e, i) => e || vector[i]) - : col - ); - return map - }, - xor(map, vector) { - map.data = map.data.map(col => typeof col[0] === "boolean" - ? col.map((e, i) => e !== vector[i]) - : col - ); - return map - } - }, - matrix: { - - }, - map: { - - } - } -}; - -// Binary relations get their own object, separate from other binary operations. -// That's because Hurmet allows chained comparisons, as in a < b < c. -// So we have to pass yPrev as well as the two current operands. - -const strOps = ["∈", "in", "∋", "⊇", "∉", "!in", "∌", "⊈", "⊉"]; - -const relations = { - scalar: { - scalar: { - relate(op, x, y, yPrev) { return compare(op, x, y, yPrev) } - }, - vector: { - relate(op, x, v, yPrev) { - if (yPrev === undefined) { - return v.map(e => compare(op, x, e, undefined)) - } else if (typeof yPrev !== "object") { - return v.map(e => compare(op, x, e, yPrev)) - } else if (Array.isArray(yPrev)) { - return v.map((e, i) => compare(op, x, e, yPrev[i])) - } else ; - } - }, - matrix: { - relate(op, x, m, yPrev) { - if (yPrev === undefined) { - return m.map(row => row.map(e => compare(op, x, e, undefined))) - } else if (typeof yPrev !== "object") { - return m.map(row => row.map(e => compare(op, x, e, yPrev))) - } else if (Array.isArray(yPrev)) { - return m.map((row, i) => row.map((e, j) => compare(op, x, e, yPrev[i][j]))) - } else ; - } - }, - map: { - relate(op, x, map, yPrev) { - if (yPrev === undefined) { - map.data = map.data.map((column, j) => - j > 0 || typeof column[0] !== "string" || strOps.includes(op) - ? column.map(e => compare(op, x, e, undefined)) - : column - ); - return map - } - } - } - }, - vector: { - scalar: { - relate(op, v, y, yPrev) { - if (yPrev === undefined) { - return v.map(e => compare(op, e, y, undefined)) - } else if (typeof yPrev !== "object") { - return v.map(e => compare(op, e, y, yPrev)) - } else if (Array.isArray(yPrev)) { - return v.map((e, i) => compare(op, e, y, yPrev[i])) - } else ; - } - } - }, - rowVector: { - rowVector: { - relate(op, x, y, yPrev) { - if (yPrev === undefined) { - return x.map((e, i) => compare(op, e, y[i], undefined)) - } - } - }, - matrix: { - relate(op, v, m, yPrev) { - if (yPrev === undefined) { - if (v.length !== m[0].length) { return errorOprnd("MIS_ELNUM") } - return m.map(row => row.map((e, i) => compare(op, v[i], e, undefined))) - } - } - } - }, - columnVector: { - columnVector: { - relate(op, x, y, yPrev) { - if (yPrev === undefined) { - return x.map((e, i) => compare(op, e, y[i], undefined)) - } - } - }, - map: { - relate(op, v, map, yPrev) { - if (yPrev === undefined) { - map.data = map.data.map((column, j) => - j > 0 || typeof column[0] !== "string" || strOps.includes(op) - ? column.map((e, i) => compare(op, v[i], e, undefined)) - : column - ); - return map - } - } - } - }, - matrix: { - scalar: { - relate(op, m, y, yPrev) { - if (yPrev === undefined) { - return m.map(row => row.map(e => compare(op, e, y, undefined))) - } else if (typeof yPrev !== "object") { - return m.map(row => row.map(e => compare(op, e, y, yPrev))) - } else if (Array.isArray(yPrev)) { - return m.map((row, i) => row.map((e, j) => compare(op, e, y, yPrev[i][j]))) - } else ; - } - }, - matrix: { - relate(op, m1, m2, yPrev) { - if (yPrev === undefined) { - return m1.map((e, i) => compare(op, e, m2[i], undefined)) - } - } - } - } -}; - -const isDivByZero = (quotient, shape) => { - switch (shape) { - case "scalar": - return quotient[1] === BigInt(0) - case "vector": - for (let i = 0; i < quotient.length; i++) { - if (quotient[i][1] === BigInt(0)) { return true } - } - return false - case "matrix": - for (let i = 0; i < quotient.length; i++) { - for (let j = 0; j < quotient[0].length; j++) { - if (quotient[i][j][1] === BigInt(0)) { return true } - } - } - return false - case "map": - for (let j = 0; j < quotient.data[0].length; j++) { - if (Rnl.isRational(quotient.data[j][0])) { - for (let i = 0; i < quotient.data.length; i++) { - if (quotient.data[i][j][1] === BigInt(0)) { return true } - } - } - } - return false - default: - return false - } -}; - -const Operators = Object.freeze({ - unary, - binary, - relations, - condition, - dtype -}); - -const wideCharRegEx = /[\uD800-\uDBFF][\uDC00-\uDFFF][\uFE00\uFE01]?/g; - -const findfirst = (searchString, str) => { - const index = str.value.indexOf(searchString.value); - const wideCharMatches = arrayOfRegExMatches(wideCharRegEx, str.value.slice(0, index)); - return Rnl.fromNumber(index + wideCharMatches.length + 1) -}; - -const textRange = (str, index) => { - // Find a range of the string str - if (index.dtype !== dt.RATIONAL && index.dtype !== dt.RANGE) { - return errorOprnd("STR_INDEX") - } - - const strArray = Array.from(str); - let value = ""; - if (index.dtype === dt.RATIONAL) { - const pos = Rnl.toNumber(index.value) - 1; - value = strArray.at(pos); - } else if (index.dtype === dt.RANGE) { - const start = Rnl.toNumber(index.value[0]); - const step = Rnl.toNumber(index.value[1]); - const end = index.value[2] === "∞" - ? str.length - : Rnl.toNumber(index.value[2]); - if (step === 1) { - value = strArray.slice(start - 1, end).join(""); - } else { - for (let i = start - 1; i < end; i += step) { - value += strArray.at(i); - } - - } - } - - return { value, unit: null, dtype: dt.STRING } -}; - -/** - * md2ast() returns an AST that matches the memory structure of a Hurmet.org document. - * Elsewhere, Hurmet uses the AST to create either a live Hurmet doc or a static HTML doc. - * - * ## Restrictions - * - * 1. **_bold-italic_** must use both * & _ delimiters. Hurmet will fail on ***wat***. - * 2. "Shortcut" reference links [ref] are not recognized. - * - * ## Extensions - * - * 1. Hurmet inline calculation is delimited ¢`…`. - * Hurmet display calculation is delimited ¢¢…¢¢. - * 2. LaTeX inline math is delimited $…$. - * No space allowed after 1st $ or before 2nd $. No digit after 2nd $. - * LaTeX display math is delimited $$ … $$. - * 3. ~subscript~ - * 4. ~~strikethrough~~ - * 5. Pipe tables as per Github Flavored Markdown (GFM). - * 6. Grid tables as per Pandoc and reStructuredText - * 7. Empty paragraphs: A line consisting only of "¶". - * 8. Attributes for reference link definitions - * [id]: target - * {.class #id width=number} - * 9. Figure/Caption for images. Format is a paragraph that consists entirely of: - * !![caption][id] - * 10. Table directives. They are placed on the line after the table. The format is: - * {.class #id width="num1 num2 …" caption} - * 11. Lists that allow the user to pick list ordering. - * 1. → 1. 2. 3. etc. - * A. → A. B. C. etc. (future) - * a) → (a) (b) (c) etc. (future) - * 12. Alerts per GFM - * > [!note] or [!tip] or [!important] or [!warning] or [!epigraph] - * > Content of note - * 13. Fenced divs, similar to Pandoc. - * ::: (centered|right_justified|comment|indented|boxed|header) - * Block elements - * ::: - * Nested divs are distinguished by number of colons. Minimum three. - * 14. Table of Contents - * {.toc start=N end=N} - * 15. Definition lists, per Pandoc. (future) - * 16. [^1] is a reference to a footnote. - * [^1]: The body of the footnote is deferred, similar to reference links. - * 17. [#1] is a reference to a citation. (future) - * [#1]: The body of the citation is deferred, similar to reference links. - * 18. Line blocks begin with "| ", as per Pandoc. (future) - * - * hurmetMark.js copyright (c) 2021 - 2023 Ron Kok - * - * This file has been adapted (and heavily modified) from Simple-Markdown. - * Simple-Markdown copyright (c) 2014-2019 Khan Academy & Aria Buckles. - * - * Portions of Simple-Markdown were adapted from marked.js copyright (c) 2011-2014 - * Christopher Jeffrey (https://github.com/chjj/). - * - * LICENSE (MIT): - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - - -const CR_NEWLINE_R = /\r\n?/g; -const FORMFEED_R = /\f/g; -const CLASS_R = /(?:^| )\.([a-z-]+)(?: |$)/; -const WIDTH_R = /(?:^| )width="?([\d.a-z]+"?)(?: |$)/; -const COL_WIDTHS_R = /(?:^| )colWidths="([^"]*)"/; -const ID_R = /(?:^| )#([a-z-]+)(?: |$)/; -const leadingSpaceRegEx$1 = /^ +/; -const trailingSpaceRegEx = / +$/; - -// Turn various whitespace into easy-to-process whitespace -const preprocess = function(source) { - return source.replace(CR_NEWLINE_R, "\n").replace(FORMFEED_R, ""); -}; - -// Creates a match function for an inline scoped element from a regex -const inlineRegex = function(regex) { - const match = function(source, state) { - return state.inline ? regex.exec(source) : null - }; - match.regex = regex; - return match; -}; - -// Creates a match function for a block scoped element from a regex -const blockRegex = function(regex) { - const match = function(source, state) { - return state.inline ? null : regex.exec(source) - }; - match.regex = regex; - return match; -}; - -// Creates a match function from a regex, ignoring block/inline scope -const anyScopeRegex = function(regex) { - const match = function(source, state) { - return regex.exec(source); - }; - match.regex = regex; - return match; -}; - -const UNESCAPE_URL_R = /\\([^0-9A-Za-z\s])/g; -const unescapeUrl = function(rawUrlString) { - return rawUrlString.replace(UNESCAPE_URL_R, "$1"); -}; - -const parseList = (str, state) => { - const items = str.replace(LIST_BLOCK_END_R, "\n").match(LIST_ITEM_R); - const isTight = !/\n\n/.test(str.replace(/\n*$/, "")); - const itemContent = items.map(function(item, i) { - // We need to see how far indented this item is: - const prefixCapture = LIST_ITEM_PREFIX_R.exec(item); - const space = prefixCapture ? prefixCapture[0].length : 0; - // And then we construct a regex to "unindent" the subsequent - // lines of the items by that amount: - const spaceRegex = new RegExp("^ {1," + space + "}", "gm"); - - // Before processing the item, we need a couple things - const contentStr = item - // remove indents on trailing lines: - .replace(spaceRegex, "") - // remove the bullet: - .replace(LIST_ITEM_PREFIX_R, ""); - - // backup our state for restoration afterwards. We're going to - // want to set state._list to true, and state.inline depending - // on our list's looseness. - const oldStateInline = state.inline; - const oldStateList = state._list; - state._list = true; - const oldStateTightness = state.isTight; - state.isTight = isTight; - - // Parse the list item - state.inline = isTight; - const adjustedContent = contentStr.replace(LIST_ITEM_END_R, ""); - const content = parse(adjustedContent, state); - const result = isTight - ? { type: "tight_list_item", content: [{ "type": "paragraph", "content": content }] } - : { type: "list_item", content }; - - // Restore our state before returning - state.inline = oldStateInline; - state._list = oldStateList; - state.isTight = oldStateTightness; - return result; - }); - - return itemContent -}; - -const TABLES = (function() { - const TABLE_ROW_SEPARATOR_TRIM = /^ *[|+] *| *[|+] *$/g; - const TABLE_RIGHT_ALIGN = /^[-=]+:$/; - const TABLE_CENTER_ALIGN = /^:[-=]+:$/; - - const parseTableAlign = function(source) { - // Inspect ":" characters to set column justification. - // Return class names that specify center or right justification on specific columns. - source = source.replace(TABLE_ROW_SEPARATOR_TRIM, ""); - const alignArr = source.trim().split(/[|+]/); - let alignStr = ""; - for (let i = 0; i < alignArr.length; i++) { - alignStr += TABLE_CENTER_ALIGN.test(alignArr[i]) - ? ` c${String(i + 1)}c` - : (TABLE_RIGHT_ALIGN.test(alignArr[i]) - ? ` c${String(i + 1)}r` - : ""); - } - return alignStr.trim() - }; - - const tableDirectives = (directives, align) => { - // Get CSS class, ID, and column widths, if any. - if (!directives && align === "") { return ["", "", null] } - const userDefClass = CLASS_R.exec(directives); - let myClass = (userDefClass) ? userDefClass[1] : ""; - if (align.length > 0) { myClass += (myClass.length > 0 ? " " : "") + align; } - const userDefId = ID_R.exec(directives); - const myID = (userDefId) ? userDefId[1] : ""; - const colWidthMatch = COL_WIDTHS_R.exec(directives); - const colWidths = (colWidthMatch) ? colWidthMatch[1].split(" ") : null; - return [myClass, myID, colWidths] - }; - - const pipeRegEx = /(? 0 && tableRow[i - 1].type === "tableSeparator") { - node.text = node.text.replace(leadingSpaceRegEx$1, ""); - } - if (i < tableRow.length - 1) { - node.text = node.text.replace(trailingSpaceRegEx, ""); - } - } - if (node.type === "tableSeparator") { - if (i !== tableRow.length - 1) { // Filter out the row's last table separator - // Create a new cell - j += 1; - row.content.push({ - "type": inHeader ? "table_header" : "table_cell", - "attrs": { - "colspan": 1, - "rowspan": 1, - "colwidth": (colWidths) ? [Number(colWidths[j])] : null, - "background": null - }, - content: (state.inHtml ? [] : [{ "type": "paragraph", "content": [] }]) - }); - } - } else if (state.inHtml) { - // For direct to HTML, write the inline contents directly into the element. - // row cell content text - row.content[j].content.push(node); - } else { - // Hurmet.app table cells always contain a paragraph. - // row cell paragraph content text - row.content[j].content[0].content.push(node); - } - }); - - return row; - }; - - const parsePipeTable = function() { - return function(capture, state) { - state.inline = true; - const align = parseTableAlign(capture[2]); - const [myClass, myID, colWidths] = tableDirectives(capture[4], align); - const table = { - type: "table", - attrs: {}, - content: [] - }; - if (myID) { table.attrs.id = myID; } - if (myClass) { table.attrs.class = myClass; } - if (colWidths && state.inHtml) { - let sum = 0; - colWidths.forEach(el => { sum += Number(el); } ); - table.attrs.style = `width: ${sum}px`; - const colGroup = { type: "colGroup", content: [] }; - for (const width of colWidths) { - colGroup.content.push({ type: "col", attrs: [{ style: `width: ${width}px` }] }); - } - table.content.push(colGroup); - } - if (!/^\|+$/.test(capture[1])) { - table.content.push(parsePipeTableRow(capture[1], parse, state, colWidths, true)); - } - const tableBody = capture[3].trim().split("\n"); - tableBody.forEach(row => { - table.content.push(parsePipeTableRow(row, parse, state, colWidths, false)); - }); - state.inline = false; - return table - }; - }; - - const headerRegEx = /^\+:?=/; - const gridSplit = / *\n/g; - const cellCornerRegEx = /^\+[-=:]+\+[+=:-]+\+$/g; - - const parseGridTable = function() { - return function(capture, state) { - const topBorder = capture[2]; - const lines = capture[1].slice(0, -1).split(gridSplit); - - // Does the grid table contain a line separating header from table body? - let headerExists = false; - let headerSepLine = lines.length + 10; - for (let i = 0; i < lines.length; i++) { - if (headerRegEx.test(lines[i])) { - headerExists = true; - headerSepLine = i; - break - } - } - - // Get column justification - const alignrow = headerExists ? lines[headerSepLine] : topBorder.slice(1); - const align = parseTableAlign(alignrow); - const [myClass, myID, colWidths] = tableDirectives(capture[3], align); - - // Read the top & left borders to find a first draft of cell corner locations. - const colSeps = [0]; - for (let j = 1; j < topBorder.length; j++) { - if (topBorder.charAt(j) === "+") { colSeps.push(j); } - } - const rowSeps = [0]; - for (let i = 1; i < lines.length; i++) { - if (lines[i].charAt(0) === "+") { rowSeps.push(i); } - } - - // Look for the cell corner locations that don't appear on top or left border - let rowSepIndex = 0; - while (rowSepIndex < rowSeps.length) { - // Find the next row separator - let nextRow = 0; - const isValid = new Array(colSeps.length).fill(true); - for (let i = rowSeps[rowSepIndex] + 1; i < lines.length; i++) { - for (let k = 0; k < colSeps.length; k++) { - if (!isValid[k]) { continue } - if ("+|".indexOf(lines[i][colSeps[k]]) === -1) { isValid[k] = false; continue } - if (lines[i][colSeps[k]] === "+") { - nextRow = i; - break - } - } - if (nextRow !== 0) { break } - } - if (!rowSeps.includes(nextRow)) { - rowSeps.splice(rowSepIndex + 1, 0, nextRow); - } - - // Check the next horizontal border for new cell corners - rowSepIndex += 1; - const border = lines[nextRow]; - for (let j = 0; j < colSeps.length - 1; j++) { - let cellBorder = border.slice(colSeps[j], colSeps[j + 1] + 1); - if (cellCornerRegEx.test(cellBorder)) { - cellBorder = cellBorder.slice(1, -1); - let pos = cellBorder.indexOf("+") + 1; - let k = 1; - while (pos > 0) { - colSeps.splice(j + k, 0, colSeps[j] + pos); - pos = cellBorder.indexOf("+", pos) + 1; - k += 1; - } - } - } - } - - const numCols = colSeps.length - 1; - const numRows = rowSeps.length - 1; - const gridTable = []; - - // Create default rows and cells. They may be merged later. - for (let i = 0; i < numRows; i++) { - const row = new Array(numCols); - for (let j = 0; j < numCols; j++) { row[j] = { rowspan: 1 }; } - gridTable.push(row); - } - - for (let i = 0; i < numRows; i++) { - const row = gridTable[i]; - // Determine the actual rowspan and colspan of each cell. - for (let j = 0; j < numCols; j++) { - const cell = row[j]; - if (cell.rowspan === 0) { continue } - cell.colspan = 1; - const lastTextRow = lines[rowSeps[i + 1] - 1]; - for (let k = j + 1; k < colSeps.length; k++) { - if (lastTextRow.charAt(colSeps[k]) === "|") { break } - cell.colspan += 1; - row[k].rowspan = 0; - } - for (let k = i + 1; k < rowSeps.length; k++) { - const ch = lines[rowSeps[k]].charAt(colSeps[j] + 1); - if ("-=:".indexOf(ch) > -1) { break } - cell.rowspan += 1; - for (let jj = 0; jj < cell.colspan; jj++) { - gridTable[k][j + jj].rowspan = 0; - } - } - // Now that we know the cell extents, get the cell contents. - const xStart = colSeps[j] + 2; - const xEnd = colSeps[j + cell.colspan] - 1; - const yStart = rowSeps[i] + 1; - const yEnd = rowSeps[i + cell.rowspan]; - let str = ""; - for (let ii = yStart; ii < yEnd; ii++) { - str += lines[ii].slice(xStart, xEnd).replace(/ +$/, "") + "\n"; - } - cell.blob = str.slice(0, -1).replace(/^\n+/, ""); - - cell.inHeader = (headerExists && yStart < headerSepLine); - - if (colWidths) { - // Set an attribute used by ProseMirror. - const cellWidth = cell.colspan === 0 ? null : []; - for (let k = 0; k < cell.colspan; k++) { - cellWidth.push(Number(colWidths[j + k])); - } - cell.width = cellWidth; - } - } - } - - const table = { - type: "table", - attrs: {}, - content: [] - }; - if (myID) { table.attrs.id = myID; } - if (myClass) { table.attrs.class = myClass; } - let k = 0; - if (colWidths && state.inHtml) { - let sum = 0; - colWidths.forEach(el => { sum += Number(el); } ); - table.attrs.style = `width: ${sum}px`; - const colGroup = { type: "colGroup", attrs: null, content: [] }; - for (const width of colWidths) { - colGroup.content.push({ type: "col", attrs: [{ style: `width: ${width}px` }] }); - } - table.content.push(colGroup); - k = 1; - } - for (let i = 0; i < numRows; i++) { - table.content.push({ type: "table_row", content: [] } ); - for (let j = 0; j < numCols; j++) { - if (gridTable[i][j].rowspan === 0) { continue } - const cell = gridTable[i][j]; - state.inline = false; - let content = parse(cell.blob, state); - if (state.inHtml && content.length === 1 && content[0].type === "paragraph") { - content = content[0].content; - } - if (content.length === 1 && content[0].type === "null") { - content = [{ type: "paragraph", content: [] }]; - } - table.content[i + k].content.push({ - "type": cell.inHeader ? "table_header" : "table_cell", - "attrs": { - "colspan": cell.colspan, - "rowspan": cell.rowspan, - "colwidth": (colWidths) ? cell.width : null, - "background": null - }, - content: content - }); - } - } - state.inline = false; - return table - }; - }; - - return { - parsePipeTable: parsePipeTable(), - PIPE_TABLE_REGEX: /^(\|.*)\n\|([-:]+[-| :]*)\n((?:\|.*(?:\n|$))*)(?:\{([^\n}]+)\}\n)?\n*/, - parseGridTable: parseGridTable(), - GRID_TABLE_REGEX: /^((\+(?:[-:=]+\+)+)\n(?:[+|][^\n]+[+|] *\n)+)(?:\{([^\n}]+)\}\n)?\n*/ - }; -})(); - -const LINK_INSIDE = "(?:\\[[^\\]]*\\]|[^\\[\\]]|\\](?=[^\\[]*\\]))*"; -const LINK_HREF_AND_TITLE = - "\\s*?(?:\\s+['\"]([\\s\\S]*?)['\"])?\\s*"; - -const linkIndex = marks => { - for (let i = 0; i < marks.length; i++) { - if (marks[i].type === "link") { return i } - } -}; - -// Pattern to find Hurmet calculation results. -// This will be replaced in the entry with the display selector. -const resultRegEx = /〔[^〕]*〕/; - -const parseRef = function(capture, state, refNode) { - // Handle implicit refs: [title][], ![alt or caption][] - let ref = capture[2] ? capture[2] : capture[1]; - ref = ref.replace(/\s+/g, " "); - - // We store defs in state._defs (_ to deconflict with client-defined state). - if (state._defs && state._defs[ref]) { - const def = state._defs[ref]; - if (refNode.type === "figure") { - refNode = { type: "figure", content: [ - { type: "figimg", attrs: def.attrs }, - { type: "figcaption", content: parseInline(refNode.attrs.alt, state) } - ] }; - refNode.content[0].attrs.src = def.target; - } else if (refNode.type === "image") { - if (def.target.indexOf("\n") > -1) { - refNode = { type: "calculation", attrs: { entry: def.target } }; - } else { - refNode.attrs = def.attrs; - refNode.attrs.src = def.target; - } - } else { - // refNode is a link - refNode.attrs.href = def.target; - } - } - return refNode; -}; - -const parseTextMark = (capture, state, mark) => { - const text = parseInline(capture, state); - if (Array.isArray(text) && text.length === 0) { return text } - consolidate(text); - for (const range of text) { - if (range.marks) { - range.marks.push({ type: mark }); - } else { - range.marks = [{ type: mark }]; - } - } - return text -}; - -const BLOCK_HTML = /^ *(?:<(head|h[1-6]|p|pre|script|style|table)[\s>][\s\S]*?(?:<\/\1>[^\n]*\n)|<(?:\/?(?:!DOCTYPE html|body|li|br|hr|(?:div|article|details|input|label|ul|ol|dl|main|nav)(?: (?:class|for|id|style|type)=(["'])[A-Za-z0-9_.:;\- ]+\2){0,2})|\/?html(?: lang=(["'])[a-z]+\3)?)>[^\n]*?(?:\n|$))/; - -// Rules must be applied in a specific order, so use a Map instead of an object. -const rules = new Map(); -rules.set("html", { - isLeaf: true, - match: blockRegex(BLOCK_HTML), - parse: function(capture, state) { - if (!state.inHtml) { return null } - return { type: "html", text: capture[0] } - } -}); -rules.set("htmlComment", { - isLeaf: true, - match: blockRegex(/^ *[^\n]*\n/), - parse: function(capture, state) { - return { type: "null" } - } -}), -rules.set("lheading", { - isLeaf: false, - match: blockRegex(/^([^\n]+)\n *(=|-){3,} *(?:\n *)+\n/), - parse: function(capture, state) { - return { - type: "heading", - attrs: { level: capture[2] === '=' ? 1 : 2 }, - content: parseInline(capture[1].trim(), state) - }; - } -}); -rules.set("heading", { - isLeaf: false, - match: blockRegex(/^ *(#{1,6})([^\n]+?)#* *(?:\n *)+\n/), - parse: function(capture, state) { - return { - attrs: { level: capture[1].length }, - content: parseInline(capture[2].trim(), state) - }; - } -}); -rules.set("dt", { // description term - isLeaf: false, - match: blockRegex(/^(([^\n]*)\n)(?=
    |\n: )/), - parse: function(capture, state) { - return { content: parseInline(capture[2].trim(), state) } - } -}); -rules.set("horizontal_rule", { - isLeaf: true, - match: blockRegex(/^( *[-*_]){3,} *(?:\n *)+\n/), - parse: function(capture, parse, state) { - return { type: "horizontal_rule" }; - } -}); -rules.set("codeBlock", { - isLeaf: true, - match: blockRegex(/^(?:(?:\t| {4})[^\n]+\n*)+(?:\n *)+\n/), - parse: function(capture, state) { - const content = capture[0].replace(/^(\t| {4})/gm, '').replace(/\n+$/, ''); - return { - type: "code_block", - content: [{ type: "text", text: content }] - }; - } -}); -rules.set("fence", { - isLeaf: true, - match: blockRegex(/^(```|~~~) *(?:(\S+) *)?\n([\s\S]+?)\n?\1 *(?:\n *)+\n/), - parse: function(capture, state) { - return { - type: "code_block", -// lang: capture[2] || undefined, - content: [{ type: "text", text: capture[3] }] - }; - } -}); -rules.set("alert", { - isLeaf: false, - match: blockRegex(/^(?: *> \[!(NOTE|TIP|IMPORTANT|WARNING|EPIGRAPH)\])((?:\n *>(?! *\[!)[^\n]*)+)(?:\n *)+\n/), - // Alert for note |tip | important | warning |epigraph - parse: function(capture, state) { - const cap = capture[2].replace(/\n *> ?/gm, "\n").replace(/^\n/, ""); - const content = parse(cap, state); - return { type: capture[1].toLowerCase(), content } - } -}); -rules.set("blockquote", { - isLeaf: false, - match: blockRegex(/^>([^\n]*(?:\n *>[^\n]*)*)(?:\n *)+\n/), - parse: function(capture, state) { - const content = capture[1].replace(/\n *> ?/gm, "\n"); - return { content: parse(content, state) }; - } -}); -rules.set("ordered_list", { - isLeaf: false, - // Hurmet accepts lists w/o a preceding blank line, so the list RegEx - // is an anyScopeRegex. parse() will test if a list is a the beginning of a line. - match: anyScopeRegex(/^( {0,3})(\d{1,9}[.)]) [\s\S]+?(?:\n{2,}(?! )(?!\1(?:\d{1,9}\.) )\n*|\s*$)/), - parse: function(capture, state) { - const start = Number(capture[2].replace(/\) *$/, "").trim()); - return { attrs: { order: start }, content: parseList(capture[0], state, capture[1]) } - } -}); -rules.set("bullet_list", { - isLeaf: false, - // See note above re: anyScopeRegex - match: anyScopeRegex(/^( {0,3})([*+-]) [\s\S]+?(?:\n{2,}(?! )(?!\1(?:[*+-]) )\n*|\s*$)/), - parse: function(capture, state) { - return { content: parseList(capture[0], state, capture[1]) } - } -}); -rules.set("dd", { // description details - isLeaf: false, - match: blockRegex(/^:( +)[\s\S]+?(?:\n{2,}(?! |:)(?!\1)\n*|\s*$)/), - parse: function(capture, state) { - let div = " " + capture[0].slice(1); - const indent = 1 + capture[1].length; - const spaceRegex = new RegExp("^ {" + indent + "," + indent + "}", "gm"); - div = div.replace(spaceRegex, ""); // remove indents on trailing lines: - return { content: parse(div, state) }; - } -}); -rules.set("special_div", { - isLeaf: false, - match: blockRegex(/^(:{3,}) ?(indented|comment|centered|right_justified|boxed|header|hidden) *\n([\s\S]+?)\n+\1 *(?:\n{2,}|\s*$)/), - // indented or centered or right-justified or boxed or comment div, or
    - parse: function(capture, state) { - const content = parse(capture[3], state); - return { type: capture[2], content }; - } -}); -rules.set("figure", { - isLeaf: true, - match: blockRegex(/^!!\[((?:(?:\\[\s\S]|[^\\])+?)?)\]\[([^\]]*)\] *(?:\n *)+\n/), - parse: function(capture, state) { - return parseRef(capture, state, { - type: "figure", - attrs: { alt: capture[1] } - }); - } -}); -rules.set("def", { - isLeaf: true, - match: blockRegex(/^\[([^\]\n]+)\]: *(?:¢(`+)([\s\S]*?[^`])\2(?!`)|]*)>? *(?:\n\{([^\n}]*)\})?)/), - // Link reference definitions were handled in md2ast(). - parse: function(capture, state) { return { type: "null" } } -}); -rules.set("toc", { - isLeaf: true, - match: blockRegex(/^{\.toc start=(\d) end=(\d)}\n/), - parse: function(capture, state) { - return { attrs: { start: Number(capture[1]), end: Number(capture[2]), body: [] } } - } -}); -rules.set("pipeTable", { - isLeaf: false, - match: blockRegex(TABLES.PIPE_TABLE_REGEX), - parse: TABLES.parsePipeTable -}); -rules.set("gridTable", { - isLeaf: false, - match: blockRegex(TABLES.GRID_TABLE_REGEX), - parse: TABLES.parseGridTable -}); -rules.set("displayTeX", { - isLeaf: true, - match: blockRegex(/^\$\$\n?((?:\\[\s\S]|[^\\])+?)\n?\$\$ *(?:\n|$)/), - parse: function(capture, state) { - const tex = capture[1].trim(); - return { type: "tex", attrs: { tex, displayMode: true } } - } -}); -rules.set("newline", { - isLeaf: true, - match: blockRegex(/^(?:\n *)*\n/), - parse: function() { return { type: "null" } } -}); -rules.set("emptyParagraph", { - isLeaf: true, - match: blockRegex(/^¶(?:\n *)+\n/), - parse: function(capture, state) { - return { type: "paragraph", content: [] } - } -}); -rules.set("paragraph", { - isLeaf: false, - match: blockRegex(/^((?:[^\n]|\n(?! *\n))+)(?:\n *)+\n/), - parse: function(capture, state) { - return { type: "paragraph", content: parseInline(capture[1], state) } - } -}); -rules.set("escape", { - // We don't allow escaping numbers, letters, or spaces here so that - // backslashes used in plain text still get rendered. But allowing - // escaping anything else provides a very flexible escape mechanism, - // regardless of how this grammar is extended. - isLeaf: true, - match: inlineRegex(/^\\([^0-9A-Za-z\s])/), - parse: function(capture, state) { - return { - type: "text", - text: capture[1] - }; - } -}); -rules.set("tableSeparator", { - isLeaf: true, - match: function(source, state) { - if (!state.inTable) { return null } - return /^ *\| */.exec(source); - }, - parse: function() { - return { type: "tableSeparator" }; - } -}); -rules.set("link", { - isLeaf: true, - match: inlineRegex( - new RegExp("^\\[(" + LINK_INSIDE + ")\\]\\(" + LINK_HREF_AND_TITLE + "\\)") - ), - parse: function(capture, state) { - const textNode = parseTextMark(capture[1], state, "link" )[0]; - const i = linkIndex(textNode.marks); - textNode.marks[i].attrs = { href: unescapeUrl(capture[2]) }; - return textNode - } -}); -rules.set("image", { - isLeaf: true, - match: inlineRegex( - new RegExp("^!\\[(" + LINK_INSIDE + ")\\]\\(" + LINK_HREF_AND_TITLE + "\\)") - ), - parse: function(capture, state) { - return { attrs: { alt: capture[1], src: unescapeUrl(capture[2]) } } - } -}); -rules.set("reflink", { - isLeaf: true, - match: inlineRegex(/^\[((?:(?:\\[\s\S]|[^\\])+?)?)\]\[([^\]]*)\]/), - parse: function(capture, state) { - const defIndex = capture[2] ? capture[2] : capture[1]; - const textNode = parseTextMark(capture[1], state, "link" )[0]; - const i = linkIndex(textNode.marks); - textNode.marks[i].attrs = { href: state._defs[defIndex].target }; - return textNode - } -}); -rules.set("footnote", { - isLeaf: true, - match: inlineRegex(/^\[\^(\d+)\]/), - parse: function(capture, state) { - const index = Number(capture[1]) - 1; - return { type: "footnote", content: parseInline(state.footnotes[index], state) } - } -}); -rules.set("refimage", { - isLeaf: true, - match: inlineRegex(/^!\[((?:(?:\\[\s\S]|[^\\])+?)?)\]\[([^\]]*)\]/), - parse: function(capture, state) { - return parseRef(capture, state, { - type: "image", - attrs: { alt: capture[1] } - }); - } -}); -rules.set("autolink", { - isLeaf: true, - match: inlineRegex(/^<([^: >]+:\/[^ >]+)>/), - parse: function(capture, state) { - const textNode = parseTextMark(capture[1], state, "link" )[0]; - const i = linkIndex(textNode.marks); - textNode.marks[i].attrs = { href: unescapeUrl(capture[1]) }; - return textNode - } -}); -rules.set("code", { - isLeaf: true, - match: inlineRegex(/^(`+)([\s\S]*?[^`])\1(?!`)/), - parse: function(capture, state) { - const text = capture[2].trim(); - return [{ type: "text", text, marks: [{ type: "code" }] }] - } -}); -rules.set("tex", { - isLeaf: true, - match: inlineRegex(/^(?:\$\$((?:\\[\s\S]|[^\\])+?)\$\$|\$(?!\s|$)((?:(?:\\[\s\S]|[^\\])+?)?)(?<=[^\s\\$])\$(?![0-9$]))/), - parse: function(capture, state) { - if (capture[1]) { - const tex = capture[1].trim(); - return { type: "tex", attrs: { tex, displayMode: true } } - } else { - const tex = capture[2].trim(); - return { type: "tex", attrs: { tex, displayMode: false } } - } - } -}); -rules.set("calculation", { - isLeaf: true, - match: anyScopeRegex(/^(?:¢(\?\?|\?|%%|%|@@|@)?(`+)([\s\S]*?[^`])\2(?!`)|¢¢(\?\?|\?|%%|%|@@|@)?\n?((?:\\[\s\S]|[^\\])+?)\n?¢¢)/), - parse: function(capture, state) { - if (capture[3]) { - let entry = capture[3].trim(); - if (capture[1]) { - entry = entry.replace(resultRegEx, capture[1]); - } - if (!/^(?:function|draw\()/.test(entry) && entry.indexOf("``") === -1) { - entry = entry.replace(/\n/g, " "); - } - return { attrs: { entry } } - } else { - let entry = capture[5].trim(); - if (capture[4]) { - entry = entry.replace(resultRegEx, capture[4]); - } - return { attrs: { entry, displayMode: true } } - } - } -}); -rules.set("em", { - isLeaf: true, - match: inlineRegex(/^([_*])(?!\s|\1)((?:\\[\s\S]|[^\\])+?)\1/), - parse: function(capture, state) { - return parseTextMark(capture[2], state, "em" ) - } -}); -rules.set("strong", { - isLeaf: true, - match: inlineRegex(/^(\*\*|__)(?=\S)((?:\\[\s\S]|[^\\])+?)\1/), - parse: function(capture, state) { - return parseTextMark(capture[2], state, "strong" ) - } -}); -rules.set("del", { - isLeaf: true, - match: inlineRegex(/^([\s\S]*?)<\/del>/), - parse: function(capture, state) { - return parseTextMark(capture[1], state, "strikethru" ) - } -}); -rules.set("strikethru", { - isLeaf: true, - match: inlineRegex(/^~~(?=\S)((?:\\[\s\S]|~(?!~)|[^\s~\\]|\s(?!~~))+?)~~/), - parse: function(capture, state) { - return parseTextMark(capture[1], state, "strikethru" ) - } -}); -rules.set("superscript", { - isLeaf: true, - match: inlineRegex(/^([\s\S]*?)<\/sup>/), - parse: function(capture, state) { - return parseTextMark(capture[1], state, "superscript" ) - } -}); -rules.set("subscript", { - isLeaf: true, - match: inlineRegex(/^([\s\S]*?)<\/sub>/), - parse: function(capture, state) { - return parseTextMark(capture[1], state, "subscript" ) - } -}); -rules.set("tilde", { - isLeaf: true, - match: inlineRegex(/^~((?:\\[\s\S]|[^\\])+?)~/), - parse: function(capture, state) { - return parseTextMark(capture[1], state, "subscript" ) - } -});rules.set("underline", { - isLeaf: true, - match: inlineRegex(/^([\s\S]*?)<\/u>/), - parse: function(capture, state) { - return parseTextMark(capture[1], state, "underline" ) - } -}); -rules.set("highlight", { - isLeaf: true, - match: inlineRegex(/^([\s\S]*?)<\/mark>/), - parse: function(capture, state) { - return parseTextMark(capture[1], state, "highlight" ) - } -}); -rules.set("hard_break", { - isLeaf: true, - match: anyScopeRegex(/^(\\| {2})\n/), - parse: function() { return { text: "\n" } } -}); -rules.set("inline_break", { - isLeaf: true, - match: anyScopeRegex(/^
    /), - parse: function() { return { type: "hard_break", text: "\n" } } -}); -rules.set("span", { - isLeaf: true, - match: inlineRegex(/^|\\\-+=![({$¢¶<~+:]|\n\n| {2,}\n|\d+[.)]|\w+:\S|$)/), - parse: function(capture, state) { - return { - text: capture[0].replace(/\n/g, " ") - }; - } -}); - -const lists = ["bullet_list", "ordered_list"]; -const LIST_LOOKBEHIND_R = /(?:\n)( *)$/; - -const parse = (source, state) => { - if (!state.inline) { source += "\n\n"; } - source = preprocess(source); - const result = []; - while (source) { - // store the best match and its rule: - let capture = null; - let ruleName = null; - let rule = null; - for (const [currRuleName, currRule] of rules) { - capture = currRule.match(source, state); - if (capture) { - rule = currRule; - ruleName = currRuleName; - - if (lists.includes(ruleName)) { - // Lists are complicated because we do not require a blank line before a list. - const prevCaptureStr = state.prevCapture == null ? "" : state.prevCapture; - const isStartOfLineCapture = LIST_LOOKBEHIND_R.test(prevCaptureStr); - if (isStartOfLineCapture) { - if (state.inline) { - // We matched a list that does not have a preceding blank line. - // Finish the current block element before beginning the list. - state.remainder = capture[0]; - return result - } else { - break - } - } - } else { - break - } - - } - } - const parsed = rule.parse(capture, state); - if (Array.isArray(parsed)) { - Array.prototype.push.apply(result, parsed); - } else { - if (parsed.type == null) { parsed.type = ruleName; } - result.push(parsed); - } - state.prevCapture = capture[0]; - source = source.substring(capture[0].length); - if (state.remainder) { - // Prepend a list. - source = state.remainder + "\n\n" + source; - state.remainder = ""; - } - } - return result -}; - - - -/** - * Parse some content with the parser `parse`, with state.inline - * set to true. Useful for block elements; not generally necessary - * to be used by inline elements (where state.inline is already true. - */ -const parseInline = function(content, state) { - const isCurrentlyInline = state.inline || false; - state.inline = true; - const result = parse(content, state); - state.inline = isCurrentlyInline; - return result; -}; - - -// recognize a `*` `-`, `+`, `1.`, `2.`... list bullet -const LIST_BULLET = "(?:[*+-]|\\d+[\\.\\)])"; -// recognize the start of a list item: -// leading space plus a bullet plus a space (` * `) -const LIST_ITEM_PREFIX = "( *)(" + LIST_BULLET + ") +"; -const LIST_ITEM_PREFIX_R = new RegExp("^" + LIST_ITEM_PREFIX); -// recognize an individual list item: -// * hi -// this is part of the same item -// -// as is this, which is a new paragraph in the same item -// -// * but this is not part of the same item -const LIST_ITEM_R = new RegExp( - LIST_ITEM_PREFIX + "[^\\n]*(?:\\n" + "(?!\\1" + LIST_BULLET + " )[^\\n]*)*(\n|$)", - "gm" -); -const BLOCK_END_R = /\n{2,}$/; -// recognize the end of a paragraph block inside a list item: -// two or more newlines at end end of the item -const LIST_BLOCK_END_R = BLOCK_END_R; -const LIST_ITEM_END_R = / *\n+$/; - -const consolidate = arr => { - if (Array.isArray(arr) && arr.length > 0) { - // Group any text nodes together into a single string output. - for (let i = arr.length - 1; i > 0; i--) { - const node = arr[i]; - const prevNode = arr[i - 1]; - if (node.type === 'text' && prevNode.type === 'text' && - !node.marks && !prevNode.marks) { - prevNode.text += node.text; - arr.splice(i, 1); - } else if ((node.type === 'indented' && prevNode.type === 'indented') || - (node.type === 'centered' && prevNode.type === 'centered')) { - prevNode.content = prevNode.content.concat(node.content); - arr.splice(i, 1); - } else if (node.type === "null") { - arr.splice(i, 1); - } else if (!rules.has(node.type) || !rules.get(node.type).isLeaf) { - consolidate(node.content); - } - } - - if (!rules.has(arr[0].type) || !rules.get(arr[0].type).isLeaf) { - consolidate(arr[0].content); - } - } -}; - -const populateTOC = ast => { - let tocNode; - for (const node of ast) { - if (node.type === "toc") { tocNode = node; break } - } - if (!tocNode) { return } - const start = tocNode.attrs.start; - const end = tocNode.attrs.end; - for (const node of ast) { - if (node.type === "heading") { - const level = node.attrs.level; - if (start <= level && level <= end) { - const tocEntry = []; - let str = ""; - for (const range of node.content) { str += range.text; } - tocEntry.push(str); - tocEntry.push(level); - tocEntry.push(0); // page number unknown - tocEntry.push(0); // element number unknown - tocNode.attrs.body.push(tocEntry); - } - } - } -}; - -const metadataRegEx = /^---+\n((?:[A-Za-z0-9][A-Za-z0-9 _-]*:[^\n]+\n(?:[ \t]+[^\n]+\n)*)+)---+\n/; -const metadataItemRegEx = /^[A-Za-z0-9][A-Za-z0-9 _-]*:[^\n]+\n(?:[ \t]+[^\n]+\n)*/; -const hurmetMetadataNames = ["decimalFormat", "fontSize", "pageSize"]; - -const parseMetadata = str => { - const metadata = {}; - let capture = str.match(metadataItemRegEx); - while (capture) { - const item = capture[0].split(":"); - const key = item[0].trim().replace(/ /g, ""); - if (hurmetMetadataNames.includes(key)) { - const value = item[1].slice(0, -1).trim().replace(/ *\n[ \t]*/g, " "); - metadata[key] = value; - } - str = str.slice(capture[0].length); - capture = str.match(metadataItemRegEx); - } - return metadata -}; - -const dateMessageRegEx = /^date:([^\n]+)\nmessage:([^\n]+)\n/; - -const inlineMd2ast = md => { - const state = { inline: true, _defs: {}, prevCapture: "", remainder: "", inHtml: false }; - const ast = parse(md, state); - if (Array.isArray(ast) && ast.length > 0 && ast[0].type === "null") { - ast.shift(); - } - consolidate(ast); - return ast -}; - -const md2ast = (md, inHtml = false) => { - // First, check for a metadata preamble - let metadata = false; - if (metadataRegEx.test(md)) { - const match = metadataRegEx.exec(md); - metadata = parseMetadata(match[1]); - md = md.slice(match[0].length); - } - - // Second, get all the link reference definitions - const state = { - inline: false, - _defs: {}, - footnotes: [], - prevCapture: "", - remainder: "", - inHtml - }; - const defRegEx = /\n *\[([^\]\n]+)\]: *(?:¢(`+)([\s\S]*?[^`])\2(?!`)|]*)>? *(?:\n\{([^\n}]*)\})?)(?=\n)/gm; - const footnoteDefRegEx = /\n *\[\^\d+\]: *([^\n]*)(?=\n)/gm; - let capture; - while ((capture = defRegEx.exec(md)) !== null) { - const def = capture[1].replace(/\s+/g, " "); - const target = capture[4] || capture[3].trim(); - const directives = capture[5] || ""; - - const attrs = { alt: def }; - if (directives) { - const matchClass = CLASS_R.exec(directives); - const matchWidth = WIDTH_R.exec(directives); - const matchID = ID_R.exec(directives); - if (matchClass) { attrs.class = matchClass[1]; } - if (matchWidth) { attrs.width = matchWidth[1]; } - if (matchID) { attrs.id = matchID[1]; } - } - state._defs[def] = { target, attrs }; - } - - // Next, get all the footnote definitions - capture = null; - while ((capture = footnoteDefRegEx.exec(md)) !== null) { - state.footnotes.push(capture[1].trim()); - } - - // Find out if there are any snapshots. - let snapshotStrings = []; - let gotSnapshot = false; - if (metadata) { - snapshotStrings = md.split("\n"); - if (snapshotStrings.length > 1) { - gotSnapshot = true; - md = snapshotStrings.shift(); - } - } - - // Find out if there are any fallbacks for fetched files - let fallbackStrings = []; - if (metadata) { - fallbackStrings = md.split("\n"); - if (fallbackStrings.length > 1) { - md = fallbackStrings.shift(); - } else { - fallbackStrings = null; - } - } - - // Proceed to parse the document. - const ast = parse(md, state); - if (Array.isArray(ast) && ast.length > 0 && ast[0].type === "null") { - ast.shift(); - } - consolidate(ast); - populateTOC(ast); - if (metadata) { - if (fallbackStrings) { - metadata.fallbacks = JSON.parse(fallbackStrings.pop().trim()); - } - if (gotSnapshot) { - const snapshots = []; - for (const str of snapshotStrings) { - const capture = dateMessageRegEx.exec(str); - snapshots.push({ - date: capture[1] ? Date.parse(capture[1].trim()) : undefined, - message: capture[2] ? capture[2].trim() : undefined, - content: capture ? str.slice(capture[0].length) : str - }); - } - metadata.snapshots = snapshots; - } - return { type: "doc", attrs: metadata, content: ast } - } else { - return ast - } -}; - -const startSvg = _ => { - return { - tag: 'svg', - children: [], - attrs: { - xmlns: "http://www.w3.org/2000/svg", - width: 250, - height: 250, - style: "display: inline;" - }, - temp: { - width: 250, - height: 250, - xmin: 0, - xmax: 5, - ymin: 0, - ymax: 5, - xunitlength: 20, // px - yunitlength: 20, // px - origin: [0, 0], // in px (default is bottom left corner) - stroke: "black", - strokewidth: 1, - strokedasharray: null, - fill: "none", - fontstyle: "normal", - fontfamily: "sans-serif", - fontsize: 13.33, // px, ~10 pt - fontweight: "normal", - markerstrokewidth: 1, - markerstroke: "black", - markerfill: "yellow", - markersize: 4, - marker: "none", - dotradius: 4, - axesstroke: "black", - gridstroke: "grey", - isDim: false - } - } -}; - -// Helpers -const setStrokeAndFill = (node, attrs) => { - node.attrs["stroke-width"] = attrs.strokewidth; - node.attrs.stroke = attrs.stroke; - node.attrs.fill = attrs.fill; - if (attrs.strokedasharray != null && attrs.strokedasharray !== "none") { - node.attrs["stroke-dasharray"] = attrs.strokedasharray; - } -}; - -const pointZeroRegEx = /\.0+$/; -const chopZ = str => { - const k = str.indexOf("."); - if (k === -1) { return str } - if (pointZeroRegEx.test(str)) { return str.replace(pointZeroRegEx, "") } - let i; - for (i = str.length - 1; i > k && str.charAt(i) === "0"; i--) { - if (i === k) { i--; } - } - return str.slice(0, i + 1) -}; - -const markerDot = (center, attrs, s, f) => { // coordinates in units, radius in pixel - if (s == null) { s = attrs.stroke; } - if (f == null) { f = attrs.fill; } - const node = { tag: "circle", attrs: {} }; - node.attrs.cx = center[0] * attrs.xunitlength + attrs.origin[0]; - node.attrs.cy = attrs.height - center[1] * attrs.yunitlength - attrs.origin[1]; - node.attrs.r = attrs.markersize; - node.attrs["stroke-width"] = attrs.strokewidth; - node.attrs.stroke = s; - node.attrs.fill = f; - return node -}; - -const rationals2numbers = array => { - const newArray = []; - for (let i = 0; i < array.length; i++) { - const element = array[i]; - if (element.dtype) { - newArray[i] = rationals2numbers(element.value); - } else if (Rnl.isRational(element)) { - newArray[i] = Rnl.toNumber(element); - } else { - newArray[i] = rationals2numbers(element); - } - } - return newArray -}; - -const arrowhead = (svg, p, q) => { // draw arrowhead at q (in units) - const attrs = svg.temp; - const v = [p[0] * attrs.xunitlength + attrs.origin[0], attrs.height - - p[1] * attrs.yunitlength - attrs.origin[1]]; - const w = [q[0] * attrs.xunitlength + attrs.origin[0], attrs.height - - q[1] * attrs.yunitlength - attrs.origin[1]]; - let u = [w[0] - v[0], w[1] - v[1]]; - const d = Math.sqrt(u[0] * u[0] + u[1] * u[1]); - if (d > 0.00000001) { - u = [u[0] / d, u[1] / d]; - const z = attrs.marker === "markerdot" ? 3 : attrs.isDim ? 0 : 1; - const up = [-u[1], u[0]]; - const L = d > 12 ? 12.5 : 7.8125; - const S = d > 12 ? 3 : 1.875; - const node = { tag: "path", attrs: {} }; - node.attrs.d = "M " + (w[0] - L * u[0] - S * up[0]) + "," + - (w[1] - L * u[1] - S * up[1]) + " L " + (w[0] - z * u[0]) + "," + (w[1] - z * u[1]) + - " L " + (w[0] - L * u[0] + S * up[0]) + "," + (w[1] - L * u[1] + S * up[1]) + " z"; - if (attrs.isDim) { - node.attrs.stroke = "none"; - } else { - node.attrs["stroke-width"] = attrs.markerstrokewidth; - node.attrs.stroke = attrs.stroke; - } - node.attrs.fill = attrs.stroke; - svg.children.push(node); - } -}; - -const markAttribute = { - em: ["font-style", "italic"], - strong: ["font-weight", "bold"], - code: ["font-family", "monospace"], - strikethru: ["text-decoration", "line-through"], - subscript: ["font-size", "0.8em"] -}; - -const textLocal = (svg, p, str, pos) => { - const attrs = svg.temp; - let textanchor = "middle"; - let dx = 0; - let dy = attrs.fontsize / 3; - if (pos != null) { - if (pos.slice(0, 5) === "above") { dy = -attrs.fontsize / 2; } - if (pos.slice(0, 5) === "below") { dy = 1.25 * attrs.fontsize; } - if (pos.slice(0, 5) === "right" || pos.slice(5, 10) === "right") { - textanchor = "start"; - dx = attrs.fontsize / 2; - } - if (pos.slice(0, 4) === "left" || pos.slice(5, 9) === "left") { - textanchor = "end"; - dx = -attrs.fontsize / 2; - } - } - const textNode = { tag: "text", children: [], attrs: {} }; - textNode.attrs["text"] = str; - textNode.attrs.x = p[0] * attrs.xunitlength + attrs.origin[0] + dx; - textNode.attrs.y = attrs.height - p[1] * attrs.yunitlength - attrs.origin[1] + dy; - textNode.attrs["font-family"] = attrs.fontfamily; - textNode.attrs["font-size"] = attrs.fontsize; - textNode.attrs["text-anchor"] = textanchor; - // Load Markdown into an AST - const ast = inlineMd2ast(str); - // Load content of AST into nodes. - if (Array.isArray(ast)) { - let prevNodeContainedSubscript = false; - for (const markNode of ast) { - const tspan = { tag: "tspan", text: markNode.text }; - let currentNodeContainsSubscript = false; - if (markNode.marks) { - tspan.attrs = {}; - for (const mark of markNode.marks) { - const markAttr = markAttribute[mark.type]; - tspan.attrs[markAttr[0]] = markAttr[1]; - if (mark.type === "subscript") { currentNodeContainsSubscript = true; } - } - } - if (currentNodeContainsSubscript) { - if (!prevNodeContainedSubscript) { tspan.attrs.dy = "2"; } - } else if (prevNodeContainedSubscript) { - if (!markNode.marks) { tspan.attrs = {}; } - tspan.attrs.dy = "-2"; - } - prevNodeContainedSubscript = currentNodeContainsSubscript; - textNode.children.push(tspan); - } - } - svg.children.push(textNode); - return svg -}; - -const pointText = (point, attrs) => { - return (point[0] * attrs.xunitlength + attrs.origin[0]).toFixed(4) + "," - + (attrs.height - point[1] * attrs.yunitlength - attrs.origin[1]).toFixed(4) -}; - -const functions$1 = { - // Set attributes - stroke(svgOprnd, color) { - svgOprnd.value.temp.stroke = color.value; - return svgOprnd - }, - - strokewidth(svgOprnd, num) { - svgOprnd.value.temp.strokewidth = Rnl.toNumber(num.value); - return svgOprnd - }, - - strokedasharray(svgOprnd, str) { - svgOprnd.value.temp.strokedasharray = str.value; - return svgOprnd - }, - - fill(svgOprnd, color) { - svgOprnd.value.temp.fill = color.value; - return svgOprnd - }, - - fontsize(svgOprnd, size) { - svgOprnd.value.temp.fontsize = Rnl.toNumber(size.value); - return svgOprnd - }, - - fontfamily(svgOprnd, str) { - svgOprnd.value.temp.fontfamily = str.value; // "sansserif"|"serif"|"fixed"|"monotype" - return svgOprnd - }, - - marker(svgOprnd, str) { - svgOprnd.value.temp.marker = str.value; // "none" | "dot" | "arrow" | "arrowdot" - return svgOprnd - }, - - // Initialize the svg. - - title(svgOprnd, strOprnd) { - svgOprnd.value.children.push( { tag: "title", attrs: { text: strOprnd.value } }); - return svgOprnd - }, - - frame(svgOprnd, width = 250, height = 250, position = "inline") { - const svg = svgOprnd.value; - const attrs = svg.temp; - attrs.width = typeof width === "number" ? width : Rnl.toNumber(width.value); - svg.attrs.width = attrs.width; - attrs.height = typeof height === "number" ? height : Rnl.toNumber(height.value); - svg.attrs.height = attrs.height; - if (typeof position !== "string") { position = position.value; } - if (position !== "inline") { svg.attrs.float = position; } - attrs.xunitlength = attrs.width / (attrs.xmax - attrs.xmin); - attrs.yunitlength = attrs.height / (attrs.ymax - attrs.ymin); - attrs.origin = [-attrs.xmin * attrs.xunitlength, -attrs.ymin * attrs.yunitlength]; - return { value: svg, unit: null, dtype: dt.DRAWING } - }, - - view(svgOprnd, xmin = 0, xmax = 5, ymin, ymax) { - const svg = svgOprnd.value; - const attrs = svg.temp; - attrs.xmin = typeof xmin === "number" ? xmin : Rnl.toNumber(xmin.value); - attrs.xmax = typeof xmax === "number" ? xmax : Rnl.toNumber(xmax.value); - attrs.xunitlength = attrs.width / (attrs.xmax - attrs.xmin); - attrs.yunitlength = attrs.xunitlength; // This may change below. - if (ymin == null) { - attrs.origin = [-attrs.xmin * attrs.xunitlength, attrs.height / 2]; - attrs.ymin = -attrs.height / (2 * attrs.yunitlength); - attrs.ymax = -attrs.ymin; - } else { - attrs.ymin = Rnl.toNumber(ymin.value); - if (ymax != null) { - attrs.ymax = Rnl.toNumber(ymax.value); - attrs.yunitlength = attrs.height / (attrs.ymax - attrs.ymin); - } else { - attrs.ymax = attrs.height / attrs.yunitlength + attrs.ymin; - } - attrs.origin = [-attrs.xmin * attrs.xunitlength, -attrs.ymin * attrs.yunitlength]; - } - return { value: svg, unit: null, dtype: dt.DRAWING } - }, - - // Draw things - - grid(svgOprnd, gdx, gdy, isLocal) { - const svg = svgOprnd.value; - const attrs = svg.temp; - gdx = gdx == null ? attrs.xunitlength : Rnl.toNumber(gdx.value) * attrs.xunitlength; - gdy = gdy == null ? gdx : Rnl.toNumber(gdy.value) * attrs.yunitlength; - const pnode = { tag: "path", attrs: {} }; - let str = ""; - for (let x = attrs.origin[0]; x < attrs.width; x += gdx) { - str += " M" + x + ",0 " + x + "," + attrs.height; - } - for (let x = attrs.origin[0] - gdx; x > 0; x -= gdx) { - str += " M" + x + ",0 " + x + "," + attrs.height; - } - for (let y = attrs.height - attrs.origin[1]; y < attrs.height; y += gdy) { - str += " M0," + y + " " + attrs.width + "," + y; - } - for (let y = attrs.height - attrs.origin[1] - gdy; y > 0; y -= gdy) { - str += " M0," + y + " " + attrs.width + "," + y; - } - pnode.attrs.d = str; - pnode.attrs["stroke-width"] = 0.5; - pnode.attrs.stroke = attrs.gridstroke; - pnode.attrs.fill = attrs.fill; - svg.children.push(pnode); - if (!isLocal) { - return { value: svg, unit: null, dtype: dt.DRAWING } - } - }, - - axes(svgOprnd, dx, dy, labels, gdx, gdy) { - let svg = svgOprnd.value; - const attrs = svg.temp; - dx = (dx == null ? attrs.xunitlength : Rnl.toNumber(dx.value) * attrs.xunitlength); - dy = (dy == null ? dx : Rnl.toNumber(dy.value) * attrs.yunitlength); - const parentFontsize = attrs.fontsize; - attrs.fontsize = Math.min(dx / 2, dy / 2, 10); - const ticklength = attrs.fontsize / 4; - if (gdx != null) { - this.grid(svgOprnd, gdx, gdy, true); - } - const pnode = { tag: "path", attrs: {} }; - let str = "M0," + (attrs.height - attrs.origin[1]) + " " + attrs.width + "," + - (attrs.height - attrs.origin[1]) + " M" + attrs.origin[0] + ",0 " + - attrs.origin[0] + "," + attrs.height; - for (let x = attrs.origin[0] + dx; x < attrs.width; x += dx) { - str += " M" + x + " " + (attrs.height - attrs.origin[1] + ticklength) + " " + x - + "," + (attrs.height - attrs.origin[1] - ticklength); - } - for (let x = attrs.origin[0] - dx; x > 0; x -= dx) { - str += " M" + x + "," + (attrs.height - attrs.origin[1] + ticklength) + " " + x - + "," + (attrs.height - attrs.origin[1] - ticklength); - } - for (let y = attrs.height - attrs.origin[1] + dy; y < attrs.height; y += dy) { - str += " M" + (attrs.origin[0] + ticklength) + "," + y + " " + - (attrs.origin[0] - ticklength) + "," + y; - } - for (let y = attrs.height - attrs.origin[1] - dy; y > 0; y -= dy) { - str += " M" + (attrs.origin[0] + ticklength) + "," + y + " " + - (attrs.origin[0] - ticklength) + "," + y; - } - if (labels != null) { - const ldx = dx / attrs.xunitlength; - const ldy = dy / attrs.yunitlength; - const lx = (attrs.xmin > 0 || attrs.xmax < 0 ? attrs.xmin : 0); - const ly = (attrs.ymin > 0 || attrs.ymax < 0 ? attrs.ymin : 0); - const lxp = (ly === 0 ? "below" : "above"); - const lyp = (lx === 0 ? "left" : "right"); - const ddx = Math.floor(1.1 - Math.log(ldx) / Math.log(10)) + 1; - const ddy = Math.floor(1.1 - Math.log(ldy) / Math.log(10)) + 1; - for (let x = ldx; x <= attrs.xmax; x += ldx) { - svg = textLocal(svg, [x, ly], chopZ(x.toFixed(ddx)), lxp); - } - for (let x = -ldx; attrs.xmin <= x; x -= ldx) { - svg = textLocal(svg, [x, ly], chopZ(x.toFixed(ddx)), lxp); - } - for (let y = ldy; y <= attrs.ymax; y += ldy) { - svg = textLocal(svg, [lx, y], chopZ(y.toFixed(ddy)), lyp); - } - for (let y = -ldy; attrs.ymin <= y; y -= ldy) { - svg = textLocal(svg, [lx, y], chopZ(y.toFixed(ddy)), lyp); - } - } - pnode.attrs.d = str; - pnode.attrs["stroke-width"] = 0.5; - pnode.attrs.stroke = attrs.axesstroke; - pnode.attrs.fill = attrs.fill; - svg.temp.fontsize = parentFontsize; - svg.children.push(pnode); - return { value: svg, unit: null, dtype: dt.DRAWING } - }, - - line(svgOprnd, m) { // segment connecting points p,q (coordinates in units) - const svg = svgOprnd.value; - const attrs = svg.temp; - const node = { tag: "path", attrs: {} }; - const p = [Rnl.toNumber(m.value[0][0]), Rnl.toNumber(m.value[0][1])]; - const q = [Rnl.toNumber(m.value[1][0]), Rnl.toNumber(m.value[1][1])]; - node.attrs.d = "M" + (p[0] * attrs.xunitlength + attrs.origin[0]) + "," + - (attrs.height - p[1] * attrs.yunitlength - attrs.origin[1]) + " " + - (q[0] * attrs.xunitlength + attrs.origin[0]) + "," + (attrs.height - - q[1] * attrs.yunitlength - attrs.origin[1]); - setStrokeAndFill(node, attrs); - svg.children.push(node); - if (attrs.marker === "dot" || attrs.marker === "arrowdot") { - svg.children.push(markerDot(p, attrs, attrs.markerstroke, attrs.markerfill)); - if (attrs.marker === "arrowdot") { arrowhead(svg, p, q); } - svg.children.push(markerDot(q, attrs, attrs.markerstroke, attrs.markerfill)); - } else if (attrs.marker === "arrow") { - arrowhead(svg, p, q); - } - return { value: svg, unit: null, dtype: dt.DRAWING } - }, - - path(svgOprnd, args) { - const svg = svgOprnd.value; - const attrs = svg.temp; - if (args[0].dtype !== dt.STRING) { - args = rationals2numbers(args); - } - const node = { tag: "path", attrs: {} }; - // Get the "d" attribute of a path - let str = ""; - for (let i = 0; i < args.length; i++) { - const el = args[i]; - if (i === 0) { - if (el.dtype && el.dtype === dt.STRING) { - str = args[i].value; - } else { - str += "M" + pointText(el, attrs); - } - } else if (typeof el[0] === "number") { - if (el.length === 2) { - str += " L" + pointText(el, attrs); - } else if (el.length === 3) { - str += " M" + pointText(el, attrs); - } else if (el.length === 5) { - const r = String(el[2] * attrs.xunitlength); - const sweep = String(el[3]); - str += ` A${r},${r} 0 0 ${sweep} ${pointText(el, attrs)}`; - } - } else if (el[0].length === 2) { - for (let j = 0; j < el.length; j++) { - str += " L" + pointText(el[j], attrs); - } - } else if (el[0].length === 5) { - for (let j = 0; j < el.length; j++) { - const r = String(el[j][2] * attrs.xunitlength); - const sweep = String(el[j][3]); - str += ` A${r},${r} 0 0 ${sweep} ${pointText(el[j], attrs)}`; - } - } - } - node.attrs.d = str; - node.attrs["stroke-width"] = attrs.strokewidth; - if (attrs.strokedasharray != null) { - node.attrs["stroke-dasharray"] = attrs.strokedasharray; - } - node.attrs.stroke = attrs.stroke; - node.attrs.fill = attrs.fill; - if (attrs.marker === "dot") { - for (let i = 0; i < args.length; i++) { - const el = args[i]; - if (typeof el[0] === "number") { - svg.children.push(markerDot(el, attrs, attrs.markerstroke, attrs.markerfill)); - } else { - for (const row of el) { - svg.children.push(markerDot(row, attrs, attrs.markerstroke, attrs.markerfill)); - } - } - } - } else if (attrs.marker === "arrow" || attrs.marker === "arrowdot") { - const lastEl = args[args.length - 1]; - if (typeof lastEl[0] !== "number") { - const end = lastEl[lastEl.length - 1]; - arrowhead(svg, lastEl[lastEl.length - 2], end); - if (attrs.marker === "arrowdot") { - svg.children.push(markerDot(end, attrs, attrs.markerstroke, attrs.markerfill)); - } - } else if (typeof lastEl[0] === "number") { - const prevEl = args[args.length - 2]; - const end = lastEl; - let start; - if (typeof prevEl[0] === "number") { - start = prevEl; - } else { - start = prevEl[prevEl.length - 1]; - } - arrowhead(svg, start, end); - if (attrs.marker === "arrowdot") { - svg.children.push(markerDot(end, attrs, attrs.markerstroke, attrs.markerfill)); - } - } - } - svg.children.push(node); - return { value: svg, unit: null, dtype: dt.DRAWING } - }, - - rect(svgOprnd, m, r) { // opposite corners in units, rounded by radius - const svg = svgOprnd.value; - const attrs = svg.temp; - const node = { tag: "rect", attrs: {} }; - const p = [Rnl.toNumber(m.value[0][0]), Rnl.toNumber(m.value[0][1])]; - const q = [Rnl.toNumber(m.value[1][0]), Rnl.toNumber(m.value[1][1])]; - node.attrs.x = Math.min(p[0], q[0]) * attrs.xunitlength + attrs.origin[0]; - node.attrs.y = attrs.height - Math.max(p[1], q[1]) * attrs.yunitlength - attrs.origin[1]; - node.attrs.width = Math.abs((q[0] - p[0]) * attrs.xunitlength); - node.attrs.height = Math.abs((q[1] - p[1]) * attrs.yunitlength); - if (r != null) { - const rNum = Rnl.toNumber(r.value) * attrs.xunitlength; - node.attrs.rx = rNum; - node.attrs.ry = rNum; - } - setStrokeAndFill(node, attrs); - svg.children.push(node); - return { value: svg, unit: null, dtype: dt.DRAWING } - }, - - circle(svgOprnd, center, radius) { // coordinates in units - const svg = svgOprnd.value; - const attrs = svg.temp; - const node = { tag: "circle", attrs: {} }; - node.attrs.cx = Rnl.toNumber(center.value[0]) * attrs.xunitlength + attrs.origin[0]; - node.attrs.cy = attrs.height - Rnl.toNumber(center.value[1]) * attrs.yunitlength - - attrs.origin[1]; - node.attrs.r = Rnl.toNumber(radius.value) * attrs.xunitlength; - setStrokeAndFill(node, attrs); - svg.children.push(node); - return { value: svg, unit: null, dtype: dt.DRAWING } - }, - - ellipse(svgOprnd, center, rx, ry) { // coordinates in units - const svg = svgOprnd.value; - const attrs = svg.temp; - const node = { tag: "ellipse", attrs: {} }; - node.attrs.cx = Rnl.toNumber(center.value[0]) * attrs.xunitlength + attrs.origin[0]; - node.attrs.cy = attrs.height - Rnl.toNumber(center.value[1]) * attrs.yunitlength - - attrs.origin[1]; - node.attrs.rx = Rnl.toNumber(rx.value) * attrs.xunitlength; - node.attrs.ry = Rnl.toNumber(ry.value) * attrs.yunitlength; - setStrokeAndFill(node, attrs); - svg.children.push(node); - return { value: svg, unit: null, dtype: dt.DRAWING } - }, - - arc(svgOprnd, m, radius) { // coordinates in units - const svg = svgOprnd.value; - const attrs = svg.temp; - const node = { tag: "path", attrs: {} }; - const start = [Rnl.toNumber(m.value[0][0]), Rnl.toNumber(m.value[0][1])]; - const end = [Rnl.toNumber(m.value[1][0]), Rnl.toNumber(m.value[1][1])]; - if (radius == null) { - const v = [end[0] - start[0], end[1] - start[1]]; - radius = (Math.sqrt(v[0] * v[0] + v[1] * v[1])) * attrs.yunitlength; - } else if (isVector(radius)) { - radius = radius.value.map(e => Rnl.toNumber(e) * attrs.yunitlength); - } else { - radius = Rnl.toNumber(radius.value) * attrs.yunitlength; - } - let str = "M" + (start[0] * attrs.xunitlength + attrs.origin[0]) + "," + - (attrs.height - start[1] * attrs.yunitlength - attrs.origin[1]) + " A"; - str += Array.isArray(radius) ? radius[0] + "," + radius[1] : radius + "," + radius; - str += " 0 0,0 " + (end[0] * attrs.xunitlength + attrs.origin[0]) + "," + - (attrs.height - end[1] * attrs.yunitlength - attrs.origin[1]); - node.attrs.d = str; - setStrokeAndFill(node, attrs); - let v = 0; - if (attrs.marker === "arrow" || attrs.marker === "arrowdot") { - const u = [(end[1] - start[1]) / 4, (start[0] - end[0]) / 4]; - v = [(end[0] - start[0]) / 2, (end[1] - start[1]) / 2]; - v = [start[0] + v[0] + u[0], start[1] + v[1] + u[1]]; - } else { - v = [start[0], start[1]]; - } - if (attrs.marker === "dot" || attrs.marker === "arrowdot") { - svg.children.push(markerDot(start, attrs, attrs.markerstroke, attrs.markerfill)); - if (attrs.marker === "arrowdot") { arrowhead(svg, v, end); } - svg.children.push(markerDot(end, attrs, attrs.markerstroke, attrs.markerfill)); - } else if (attrs.marker === "arrow") { - arrowhead(svg, v, end); - } - svg.children.push(node); - return { value: svg, unit: null, dtype: dt.DRAWING } - }, - - text(svgOprnd, p, str, pos) { - const svg = textLocal( - svgOprnd.value, - [Rnl.toNumber(p.value[0]), Rnl.toNumber(p.value[1])], - str.value, - pos == null ? null : pos.value - ); - return { value: svg, unit: null, dtype: dt.DRAWING } - }, - - dot(svgOprnd, center, typ, label, pos) { - let svg = svgOprnd.value; - const attrs = svg.temp; - let node; - const cx = Rnl.toNumber(center.value[0]) * attrs.xunitlength + attrs.origin[0]; - const cy = attrs.height - Rnl.toNumber(center.value[1]) * attrs.yunitlength - - attrs.origin[1]; - if (typ.value === "+" || typ.value === "-" || typ.value === "|") { - node = { tag: "path", attrs: {} }; - if (typ.value === "+") { - node.attrs.d = " M " + (cx - attrs.ticklength) + "," + cy - + " L " + ( cx + attrs.ticklength) + "," + cy - + " M " + cx + "," + (cy - attrs.ticklength) + " L " + cx - + "," + (cy + attrs.ticklength); - node.attrs["stroke-width"] = 0.5; - node.attrs.stroke = attrs.axesstroke; - } else { - if (typ.value === "-") { - node.attrs.d = " M " + (cx - attrs.ticklength) + "," + cy - + " L " + (cx + attrs.ticklength) + "," + cy; - } else { - node.attrs.d = " M " + cx + "," + (cy - attrs.ticklength) - + " L " + cx + "," + (cy + attrs.ticklength); - } - node.attrs["stroke-width"] = attrs.strokewidth; - node.attrs["stroke"] = attrs.stroke; - } - } else { - node = { tag: "circle", attrs: {} }; - node.attrs.cx = cx; - node.attrs.cy = cy; - node.attrs.r = attrs.dotradius; - node.attrs["stroke-width"] = attrs.strokewidth; - node.attrs.stroke = attrs.stroke; - node.attrs.fill = (typ.value === "open" ? "white" : attrs.stroke); - } - svg.children.push(node); - if (label != null) { - svg = textLocal( - svg, - [Rnl.toNumber(center.value[0]), Rnl.toNumber(center.value[1])], - label.value, - (pos == null ? "below" : pos.value) - ); - } - return { value: svg, unit: null, dtype: dt.DRAWING } - }, - - leader(svgOprnd, plistOprnd, label) { - const marker = svgOprnd.value.temp.marker; - svgOprnd.value.temp.marker = "arrow"; - svgOprnd.value.temp.isDim = true; - const startPoint = { - value: clone(plistOprnd.value[plistOprnd.value.length - 1]), - unit: null, - dtype: dt.RATIONAL + dt.ROWVECTOR - }; - const plistCopy = clone(plistOprnd); // Copy to an un-frozen object. - plistCopy.value.pop(); - plistCopy.value.reverse(); - svgOprnd = this.path(svgOprnd, [startPoint, plistCopy]); - const p = rationals2numbers(startPoint.value); - const q = rationals2numbers(plistCopy.value[0]); - let pos = "right"; - if (Math.abs(p[0] - q[0]) >= Math.abs(p[1] - q[1])) { - pos = p[0] >= q[0] ? "right" : "left"; - } else { - pos = p[1] < q[1] ? "below" : "above"; - } - const svg = textLocal(svgOprnd.value, p, label.value, pos); - svg.temp.marker = marker; - svg.temp.isDim = false; - return { value: svg, unit: null, dtype: dt.DRAWING } - }, - - dimension(svgOprnd, plistOprnd, label) { - const p = clone(plistOprnd.value); - const q = p.pop(); - const origstrokewidth = svgOprnd.value.temp.strokewidth; - svgOprnd.value.temp.strokewidth = 0.5; - svgOprnd.value.temp.isDim = true; // set small arrowhead - let six = Rnl.fromNumber(6 / svgOprnd.value.temp.xunitlength); - const pEnd = p[p.length - 1]; - let svg; - // Is the label y-coord between the y-coords of the end points? - if ((Rnl.lessThan(p[0][1], q[1]) && Rnl.lessThan(q[1], pEnd[1])) || - (Rnl.lessThan(pEnd[1], q[1]) && Rnl.lessThan(q[1], p[0][1]))) { - if (!Rnl.lessThan(pEnd[0], q[0])) { six = Rnl.negate(six); } - p.forEach(e => { - svgOprnd = this.line(svgOprnd, { value: [ - [Rnl.add(e[0], six), e[1]], - [Rnl.add(q[0], six), e[1]] - ] }); - }); - svgOprnd.value.temp.marker = "arrow"; - const pos = Rnl.lessThanOrEqualTo(pEnd[0], q[0]) ? "right" : "left"; - for (let i = 0; i < p.length - 1; i++) { - svgOprnd = this.line(svgOprnd, { value : [[q[0], p[i][1]], [q[0], p[i + 1][1]]], - unit: null, dtype: dt.MATRIX }); - svgOprnd = this.line(svgOprnd, { value : [[q[0], p[i + 1][1]], [q[0], p[i][1]]], - unit: null, dtype: dt.MATRIX }); - const p3 = [ - Rnl.toNumber(q[0]), - (Rnl.toNumber(p[i][1]) + Rnl.toNumber(p[i + 1][1])) / 2 - ]; - const str = p.length === 2 ? label.value : label.value[i]; - svg = textLocal(svgOprnd.value, p3, str, pos); - } - } else { - if (!Rnl.lessThan(pEnd[1], q[1])) { six = Rnl.negate(six); } - p.forEach(e => { - svgOprnd = this.line(svgOprnd, { value: [ - [e[0], Rnl.add(e[1], six)], - [e[0], Rnl.add(q[1], six)] - ] }); - }); - svgOprnd.value.temp.marker = "arrow"; - const pos = Rnl.lessThanOrEqualTo(pEnd[1], q[1]) ? "above" : "below"; - for (let i = 0; i < p.length - 1; i++) { - svgOprnd = this.line(svgOprnd, { value: [ [p[i][0], q[1]], [ p[i + 1][0], q[1]] ], - unit: null, dtype: dt.MATRIX }); - svgOprnd = this.line(svgOprnd, { value: [ [ p[i + 1][0], q[1]], [p[i][0], q[1]] ], - unit: null, dtype: dt.MATRIX }); - const p3 = [ - (Rnl.toNumber(p[i][0]) + Rnl.toNumber(p[i + 1][0])) / 2, - Rnl.toNumber(q[1]) - ]; - const str = p.length === 2 ? label.value : label.value[i]; - svg = textLocal(svgOprnd.value, p3, str, pos); - } - } - svg.temp.strokewidth = origstrokewidth; - svg.temp.marker = "none"; - svg.temp.isDim = false; - return { value: svg, unit: null, dtype: dt.DRAWING } - } - -}; - -const draw = Object.freeze({ - startSvg, - functions: functions$1 -}); - -// Some helper functions and objects. - -// Lengths and x-coordinates are written as rational numbers, not floating point. -// That way, we can make a lessThanOrEqualTo comparison w/o floating point errors. - -const ord = ["first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth"]; - -const loadTypesFromInput = factorInput => { - let doLiveLoadPatterns = false; - const headings = factorInput.headings || null; - const loadTypeMap = Object.create(null); - const getsPattern = new Array(9).fill(false); - if (factorInput === "service" || !factorInput) { - return [null, getsPattern, 1, doLiveLoadPatterns] - } - for (let i = 0; i < headings.length; i++) { - const loadName = headings[i].replace("*", ""); - loadTypeMap[loadName] = i + 1; - if (headings[i].indexOf("*") > -1) { - doLiveLoadPatterns = true; - getsPattern[i + 1] = true; - } - } - return [loadTypeMap, getsPattern, headings.length, doLiveLoadPatterns] -}; - -const combinationsFromInput = (factorInput, loadTypeMap) => { - const data = factorInput.data; - const headings = factorInput.headings; - const combinations = []; - for (let i = 0; i < data[0].length; i++) { - const factors = new Array(10).fill(0); - for (let j = 0; j < headings.length; j++) { - const type = loadTypeMap[headings[j].replace("*", "")]; - factors[type] = Rnl.toNumber(data[j][i]); - } - combinations.push(factors); - } - return combinations -}; - -const newNode = (fixity, k, xCoordinate) => { - return { - fixity, - k: (fixity === "spring" ? k : 0), - x: xCoordinate, - P: [0, 0, 0, 0, 0, 0, 0, 0, 0], - M: [0, 0, 0, 0, 0, 0, 0, 0, 0], - Pr: [0, 0, 0, 0, 0, 0, 0, 0, 0], // "r" stands for reaction - PrMin: [0, 0, 0, 0, 0, 0, 0, 0, 0], - Mr: [0, 0, 0, 0, 0, 0, 0, 0, 0], - MrMin: [0, 0, 0, 0, 0, 0, 0, 0, 0] - } -}; - -const incrementDegreesOfFreedom = fixity => { - switch (fixity) { - case "pinned": - return 1 - case "fixed": - return 0 - case "hinge": - return 3 - default: - return 2 - } -}; - -const newSegment = (length, xOfLeftEnd) => { - // A "segment" is a beam section between points of load discontinuity. - return { - length, - xOfLeftEnd, - // Point load applied at left end of segments. - // Array dim'ed to 9 for different load types, e.g., dead, live, wind, etc. - P: [0, 0, 0, 0, 0, 0, 0, 0, 0], - M: [0, 0, 0, 0, 0, 0, 0, 0, 0], // point moment - Pf: 0, // factored point load at left end - Mf: 0, - w1: [0, 0, 0, 0, 0, 0, 0, 0, 0], // distributed load at left end of segments. - w2: [0, 0, 0, 0, 0, 0, 0, 0, 0], // at right end. - Vmax: { - left: { value: 0, case: 0 }, - mid: { value: 0, case: 0, x: 0 }, - right: { value: 0, case: 0 } - }, - Vmin: { - left: { value: 0, case: 0 }, - mid: { value: 0, case: 0, x: 0 }, - right: { value: 0, case: 0 } - }, - Mmax: { - left: { value: 0, case: 0 }, - mid: { value: 0, case: 0, x: 0 }, - right: { value: 0, case: 0 } - }, - Mmin: { - left: { value: 0, case: 0 }, - mid: { value: 0, case: 0, x: 0 }, - right: { value: 0, case: 0 } - } - } -}; - -const identifySegment = (xGlobal, span) => { - // Which segment contains xGlobal? - for (let i = 0; i < span.segments.length; i++) { - const xSegEnd = Rnl.add(span.segments[i].xOfLeftEnd, span.segments[i].length); - if (Rnl.lessThanOrEqualTo(xGlobal, xSegEnd)) { return i } - } - return -1 -}; - -const splitSegment = (segments, iSeg, xGlobal) => { - // segments` is an array. - // We need to split the element at segments[iSeg] into two elements. - const length = Rnl.subtract(xGlobal, segments[iSeg].xOfLeftEnd); - if (iSeg === 0) { - segments.unshift(newSegment(length, segments[0].xOfLeftEnd)); - } else { - const s1 = segments.slice(0, iSeg); - s1.push(newSegment(length, segments[iSeg].xOfLeftEnd)); - segments = s1.concat(segments.slice(iSeg)); - } - const seg = segments[iSeg + 1]; - const newSeg = segments[iSeg]; - for (let i = 0; i < 9; i++) { - const slope = (seg.w2[i] - seg.w1[i]) / Rnl.toNumber(seg.length); - newSeg.w1[i] = seg.w1[i]; - newSeg.w2[i] = seg.w1[i]; - seg.w1[i] = seg.w1[i] + slope * Rnl.toNumber(length); - newSeg.P[i] = seg.P[i]; - seg.P[i] = 0; - newSeg.M[i] = seg.M[i]; - seg.M[i] = 0; - } - seg.xOfLeftEnd = xGlobal; - seg.length = Rnl.subtract(seg.length, newSeg.length); - return segments -}; - -// Here's the main function of this module. -// Take the raw input strings, validate them, and load them -// into data structures for use by the analyze function. -function populateData(input, factorInput) { - const errorMsg = ""; - const beam = { - E: 0, // modulus of elasticity - I: 0, // moment of inertia - k: 0, // spring constant - convention: input.convention - ? input.convention - : 1, // Plot + moment on comp or tension side. - SI: input.SI || false, // boolean. Are we using SI units? - doLiveLoadPatterns: input.patterns, - gotType: [false, false, false, false, false, false, false, false, false], - wMax: 0, // default line load maximum - x: 180, // x coordinate of the beam's left end inside the SVG, in px - allLoadsAreUniform: true // subject to change below - }; - - if (input.E === 1 || input.E === 0) { - // We don't know E or I, so we won't do a deflection diagram. - // But we will still do the shear and moment diagrams. - beam.E = 1; - beam.I = 1; - beam.k = 0; - } else { - beam.E = input.E; // Modulus of elasticity - beam.I = input.I; // Moment of inertia, I - beam.k = input.k; // Spring constant - } - if (beam.E === 1 && beam.I === 1 && input.k !== 0) { - return ["E and I are necessary for an analysis with spring supports."] - } - beam.EI = beam.E * beam.I; - - // Load in node data and span data. - // Definitions - // (1) A "span" is a section of beam between two user-defined nodes. - // (2) A "segment" is a section of beam between nodes or points of load discontinuity. - // Each span thus consists of one or more segments. - let i = 0; - let cummulativeLength = Rnl.zero; - const nodes = []; - const spans = []; - beam.numDegreesOfFreedom = 0; - // eslint-disable-next-line max-len - const [loadTypeMap, getsPattern, numLoadTypes, doLiveLoadPatterns] = loadTypesFromInput(factorInput); - beam.numLoadTypes = numLoadTypes; - beam.getsPattern = getsPattern; - beam.doLiveLoadPatterns = doLiveLoadPatterns; - - for (i = 0; i < input.nodes.length; i++) { - // Process node input. - const fixity = input.nodes[i]; - if (!fixity) { return [`The ${ord[i]} node designation is invalid.`] } - if (fixity === "spring" && input.k === 0) { - return ["Error. A model with a spring needs a spring constant, k."] - } - nodes.push(newNode(fixity, beam.k, cummulativeLength)); - beam.numDegreesOfFreedom += incrementDegreesOfFreedom(fixity); - if (i < input.spanLength.length) { - // Process span input. - const length = input.spanLength[i]; - spans.push({ - length, - segments: Array(1).fill(newSegment(length, cummulativeLength)) - }); - cummulativeLength = Rnl.add(cummulativeLength, length); - } - } - if (spans.length === 0) { return [`No span lengths.`] } - const numSpans = spans.length; - beam.numSegments = numSpans; - beam.length = nodes[nodes.length - 1].x; - - // Point Loads - for (i = 0; i < input.loads.length; i++) { - const load = input.loads[i]; - if (load.shape === "w") { - // Skip the distributed loads for now. We'll pick them up later. - continue - } - if (load.from === 0) { continue } - let type = load.type === "none" - ? 0 - : loadTypeMap - ? loadTypeMap[load.type] - : 1; - if (type === 0) { - if (beam.comboName !== "service") { - return [`The ${ord[i]} load must have a load type defined.`] - } else { - type = 1; // In a service load analysis, treat unlabled loads as Dead loads. - } - } - - const P = input.loads[i].P; - const M = input.loads[i].M; - const x = input.loads[i].from; - - let foundAHome = false; - for (let j = 0; j < nodes.length; j++) { - if (Rnl.areEqual(x, nodes[j].x)) { - nodes[j].P[0] += P; - nodes[j].M[0] += M; - if (type !== 0) { nodes[j].P[type] += P; } - foundAHome = true; - break - } - } - if (foundAHome) { continue } - - for (let j = 0; j < spans.length; j++) { - if (Rnl.greaterThan(x, nodes[j].x) && Rnl.lessThan(x, nodes[j + 1].x)) { - const span = spans[j]; - const iSeg = identifySegment(x, span); - if (Rnl.greaterThan(x, span.segments[iSeg].xOfLeftEnd)) { - span.segments = splitSegment(span.segments, iSeg, x); - beam.numSegments += 1; - } - beam.gotType[0] = true; - span.segments[iSeg + 1].P[0] += P; // add to sum of service loads - span.segments[iSeg + 1].M[0] += M; - if (type !== 0) { - beam.gotType[type] = true; - span.segments[iSeg + 1].P[type] += P; - span.segments[iSeg + 1].M[type] += M; - } - } - } - } - - // Distributed loads - beam.allLoadsAreUniform = true; // initialize the variable - for (i = 0; i < input.loads.length; i++) { - const load = input.loads[i]; - if (load.shape !== "w") { continue } - let type = load.type === "none" ? 0 : loadTypeMap ? loadTypeMap[load.type] : 1; - if (type === 0) { - if (beam.comboName !== "service") { - return [`The ${ord[i]} load must have a load type defined.`] - } else { - type = 1; // In a service load analysis, treat unlabled loads as Dead loads. - } - } - - const wStart = load.wStart; - const wEnd = load.wEnd; - - if (Math.abs(wStart) > beam.wMax) { beam.wMax = Math.abs(wStart); } - if (Math.abs(wEnd) > beam.wMax) { beam.wMax = Math.abs(wEnd); } - - const xStart = load.from; - const xEnd = Rnl.isZero(load.to) - ? cummulativeLength - : load.to; - - const slope = (wEnd - wStart) / Rnl.toNumber(Rnl.subtract(xEnd, xStart)); - if (slope !== 0) {beam.allLoadsAreUniform = false;} - - let iStartSpan = 0; - let iEndSpan = 0; - let iStartSeg = 0; - let iEndSeg = 0; - - // If necessary, split segments at points of load discontinuity. - for (let j = 0; j < spans.length; j++) { - if (Rnl.areEqual(xStart, nodes[j].x)) { - iStartSpan = j; - iStartSeg = 0; - break - } - if (Rnl.greaterThan(xStart, nodes[j].x) && Rnl.lessThan(xStart, nodes[j + 1].x)) { - for (let k = 0; k < spans[j].segments.length; k++) { - const seg = spans[j].segments[k]; - if (Rnl.areEqual(xStart, seg.xOfLeftEnd)) { - iStartSpan = j; - iStartSeg = k; - break - } - const segEnd = k < spans[j].segments.length - 1 - ? spans[j].segments[k + 1].xOfLeftEnd - : nodes[j + 1].x; - if (Rnl.greaterThan(xStart, seg.xOfLeftEnd) && Rnl.lessThan(xStart, segEnd)) { - spans[j].segments = splitSegment(spans[j].segments, k, xStart); - beam.numSegments += 1; - iStartSpan = j; - iStartSeg = k + 1; - break - } - } - } - } - - for (let j = 0; j < spans.length; j++) { - if (Rnl.areEqual(xEnd, nodes[j + 1].x)) { - iEndSpan = j; - iEndSeg = spans[j].segments.length - 1; - break - } - if (Rnl.greaterThan(xEnd, nodes[j].x) && Rnl.lessThan(xEnd, nodes[j + 1].x)) { - for (let k = 0; k < spans[j].segments.length; k++) { - const seg = spans[j].segments[k]; - const segEnd = k < spans[j].segments.length - 1 - ? spans[j].segments[k + 1].xOfLeftEnd - : nodes[j + 1].x; - if (Rnl.areEqual(xEnd, segEnd)) { - iEndSpan = j; - iEndSeg = k; - break - } - if (Rnl.greaterThan(xEnd, seg.xOfLeftEnd) && Rnl.lessThan(xEnd, segEnd)) { - spans[j].segments = splitSegment(spans[j].segments, k, xEnd); - beam.numSegments += 1; - iEndSpan = j; - iEndSeg = k; - break - } - } - } - } - - // Now apply distributed loads - for (let iSpan = iStartSpan; iSpan <= iEndSpan; iSpan++) { - const span = spans[iSpan]; - const startSeg = (iSpan === iStartSpan ? iStartSeg : 0); - const endSeg = (iSpan === iEndSpan ? iEndSeg : spans[iSpan].segments.length - 1); - for (let iSeg = startSeg; iSeg <= endSeg; iSeg++) { - const xLeft = span.segments[iSeg].xOfLeftEnd; - const w1 = wStart + slope * Rnl.toNumber(Rnl.subtract(xLeft, xStart)); - const xRight = Rnl.add(span.segments[iSeg].xOfLeftEnd, span.segments[iSeg].length); - const w2 = wStart + slope * Rnl.toNumber(Rnl.subtract(xRight, xStart)); - // add to sum of service loads - span.segments[iSeg].w1[0] += w1; - span.segments[iSeg].w2[0] += w2; - // add to specific load type, e.g., dead, live, etc. - span.segments[iSeg].w1[type] += w1; - span.segments[iSeg].w2[type] += w2; - } - } - - beam.gotType[0] = true; - if (type !== 0) { - beam.gotType[type] = true; - } - } - - // Henceforward there are no <= comparisons. - // Change lengths into floating point numbers. - for (let i = 0; i < nodes.length; i++) { - nodes[i].x = Rnl.toNumber(nodes[i].x); - } - for (let i = 0; i < spans.length; i++) { - spans[i].length = Rnl.toNumber(spans[i].length); - for (let j = 0; j < spans[i].segments.length; j++) { - spans[i].segments[j].length = Rnl.toNumber(spans[i].segments[j].length); - spans[i].segments[j].xOfLeftEnd = Rnl.toNumber(spans[i].segments[j].xOfLeftEnd); - } - } - beam.length = Rnl.toNumber(beam.length); - - const combinations = typeof factorInput === "string" - ? "service" - : combinationsFromInput(factorInput, loadTypeMap); - - return [errorMsg, beam, nodes, spans, combinations] - -} - -// Each of the methods in this module draws some item. - -const circle = (x, y, radius) => { - return { tag: "circle", attrs: { cx: x, cy: y, r: radius } } -}; - -const restraint = (node, beam) => { - const value = []; - const x = beam.xDiagram + beam.xScale * node.x; - if (node.fixity === "hinge" || node.fixity === "proppedHinge") { - value.push(circle(beam.xDiagram + beam.xScale * node.x, beam.yLoad, 4)); - } - const path = { tag: "path", attrs: { d: "" } }; - if (node.fixity === "pinned" || node.fixity === "proppedHinge") { - // draw a triangle - const y = node.fixity === "pinned" ? beam.yLoad + 0.75 : beam.yLoad + 4; - path.attrs.d = `M${x} ${y} l5 10 h-10 z`; - path.attrs.style = "fill:#fff; stroke:#000"; - } else if (node.fixity === "fixed") { - const xd = (node.x === 0 ? -1 : 1) * 7; - // eslint-disable-next-line max-len - path.attrs.d = `M${x} ${beam.yLoad - 7} v14 m0 -14 l${xd} 7 M${x} ${beam.yLoad} l${xd} 7 M${x} ${beam.yLoad + 7} l${xd} 7`; - } else if (node.fixity === "spring") { - const y = beam.yLoad + .75; - path.attrs.d = `M${x} ${y} v3 l6 1.5 -12 3 12 3 -12 3 6 1.5 v3 m-6 0 h12`; - } - value.push(path); - return value -}; - -const pointForce = (x, y, load, fixity, isReaction = false) => { - const sgn = (load < 0 ? -1 : 1); // -1 is down - const lengthAdjustment = fixity === "fixed" - ? 7 - : fixity === "pinned" && isReaction - ? 10 - : fixity === "proppedHinge" && isReaction - ? 18 - : fixity === "hinge" - ? 4 - : fixity === "spring" && isReaction - ? 18 - : 0; - const length = 40 - lengthAdjustment; - // Reactions are drawn below the beam line. Imposed loads are drawn above the beam line. - const yText = y + (isReaction ? 55 : -45); - // Set x and y at the tip of the arrowhead - if (isReaction) { y += lengthAdjustment + 0.75; } else { y -= 0.75; } - if (sgn === -1 && isReaction) { y += length; } - if (sgn === 1 && !isReaction) { y -= length; } - const arrow = { - tag: "path", - attrs: { - style: "fill: #000; fill-opacity:1.0", - // eslint-disable-next-line max-len - d: `M${x} ${y} l${sgn * 4} ${sgn * 8} h${-sgn * 3.5} v${sgn * (length - 8)} h${-sgn * 1} v${-sgn * (length - 8)} h${-sgn * 3}z` - } - }; - const text = textNode(String(Math.abs(load)), x, yText, "middle"); - return [arrow, text] -}; - -const pointMoment = (x, y, load, isReaction = false) => { - let isCounterClockwise = load >= 0; // = (load < 0 ? -1 : 1) // 1 is counter-clockwise - load = Math.abs(load); - let arrow; - let text; - if (!isReaction) { - arrow = momentArrow(x, y, (isCounterClockwise ? 165 : 15), 150, isCounterClockwise); - text = textNode(String(load), x, y - 25, "middle"); - } else { - // The moment is a reaction - isCounterClockwise = !isCounterClockwise; - if (x < 100) { // left end - arrow = momentArrow(x, y, (isCounterClockwise ? 260 : 100), 140, isCounterClockwise); - text = textNode(String(load), x - 15, y - 15, "end"); - } else { - arrow = momentArrow(x, y, (isCounterClockwise ? 80 : 280), 140, isCounterClockwise); - text = textNode(String(load), x + 16, y - 15); - } - } - return [...arrow, text] -}; - -const momentArrow = (xCtr, yCtr, thetaAtArrowPoint, subtendedAngle, isCounterClockwise) => { - // Draw a circular arc with an arrowhead. - // Find startAngle and endAngle: the begining and ending of the arc - // theta = 0 at 3 o'clock. theta is + for counterclockwise - const startAngle = thetaAtArrowPoint * (Math.PI / 180); - const sgn = isCounterClockwise ? 1 : -1; - const endAngle = startAngle - sgn * subtendedAngle * (Math.PI / 180); - // sgn = 1 for counterclockwise, -1 for clockwise - const diameter = 35; - const r = diameter / 2; // radius - const arrowHeadLength = 8; - const startAnglePrime = startAngle - sgn * (2 * 0.9 * arrowHeadLength / diameter); - const largeArcFlag = endAngle - startAngle <= 180 ? "0" : "1"; - - let xStart = 0; - let yStart = 0; - let xEnd = 0; - let yEnd = 0; - if (sgn > 0) { - xEnd = (xCtr + r * Math.cos(startAnglePrime)).toFixed(2); // arrow end - yEnd = (yCtr - r * Math.sin(startAnglePrime)).toFixed(2); - xStart = (xCtr + r * Math.cos(endAngle)).toFixed(2); - yStart = (yCtr - r * Math.sin(endAngle)).toFixed(2); - } else { - xStart = (xCtr + r * Math.cos(startAnglePrime)).toFixed(2); - yStart = (yCtr - r * Math.sin(startAnglePrime)).toFixed(2); - xEnd = (xCtr + r * Math.cos(endAngle)).toFixed(2); - yEnd = (yCtr - r * Math.sin(endAngle)).toFixed(2); - } - - const path = { - tag: "path", - attrs: { d: `M${xStart} ${yStart}A${r} ${r} 0 ${largeArcFlag} 0 ${xEnd} ${yEnd}` } - }; - - // Draw the arrow head - const xTip = xCtr + r * Math.cos(startAngle); - const yTip = yCtr - r * Math.sin(startAngle); - const alpha = startAngle - sgn * 100 / 180 * Math.PI; // rotate by 100° - const beta = 22.5 * Math.PI / 180; // angle subtended by half-arrowhead - const x = Array(3).fill(""); - const y = Array(3).fill(""); - x[0] = xTip.toFixed(2); - y[0] = yTip.toFixed(2); - x[1] = (xTip + arrowHeadLength * Math.cos(alpha - beta)).toFixed(2); - y[1] = (yTip - arrowHeadLength * Math.sin(alpha - beta)).toFixed(2); - x[2] = (xTip + arrowHeadLength * Math.cos(alpha + beta)).toFixed(2); - y[2] = (yTip - arrowHeadLength * Math.sin(alpha + beta)).toFixed(2); - - let points = ""; - for (let i = 0; i < x.length; i++) { - points += `${x[i]} ${y[i]} `; - } - const polygon = { tag: "polygon", attrs: { points } }; - return [path, polygon] -}; - -const polyline = (x, y) => { - let d = `M${x[0]} ${y[0]}`; - for (let i = 1; i < x.length; i++) { - d += ` L${x[i]} ${y[i]}`; - } - return { tag: "path", attrs: { d, stroke: "black", "fill-opacity": "0.0" } } -}; - -const textNode = (str, x, y, horizAlign) => { - const node = { tag: "text", attrs: { x: String(x), y: String(y) } }; - if (horizAlign === "middle" || horizAlign === "end") { - node.attrs["text-anchor"] = horizAlign; - } - node.children = [{ tag: "tspan", text: str }]; - return node -}; - -const Draw = Object.freeze({ - pointForce, - pointMoment, - polyline, - restraint, - textNode -}); - -const round$1 = (num, prec) => { - // Round a number to prec significant digits. - // Return a string. This is used for display of numbers on the diagram. - const str = num.toPrecision(prec); - if (str.indexOf("e") === -1) { return str } - const pos = str.indexOf("e"); - const significand = Number.parseFloat(str.slice(0, pos)); - const exponent = Number.parseFloat(str.slice(pos + 1)); - return (significand * 10 ** exponent).toString() -}; - -function createLoadDiagram(beam, nodes, spans) { - beam.xDiagram = 90; // x coordinate at left end of diagram line, px - beam.yLoad = 80; // y coordiate of load diagram - beam.xScale = 300 / nodes[nodes.length - 1].x; - const lengthFactor = beam.SI ? 1 : 0.3048; - const forceFactor = beam.SI ? 1000 : 4448.2216152605; - const momentFactor = beam.SI ? 1000 : 4448.2216152605 * 0.3048; - const lineLoadFactor = beam.SI ? 1000 : 4448.2216152605 / 0.3048; - - // Begin the diagram. - let diagram = []; - diagram.push({ tag: "title", attrs: { text: "Beam Diagram" } }); - diagram.push({ - tag: "defs", - attrs: {}, - style: `svg { background-color: #fff; } -text, tspan { font: 12px Arial; }` - }); - diagram.push(Draw.textNode("loads", 20, beam.yLoad + 2)); - diagram.push(Draw.textNode(`(${beam.SI ? 'kN, m' : 'kips, ft'})`, 20, beam.yLoad + 16)); - diagram.push({ - tag: "path", - attrs: { stroke: "black", "stroke-width": "1.5px", - d: `M${beam.xDiagram} ${beam.yLoad} h300` } - }); - - // Draw restraints - for (let i = 0; i < nodes.length; i++) { - if (nodes[i].fixity !== "continuous") { - diagram = diagram.concat(Draw.restraint(nodes[i], beam)); - } - } - - // Write the span length below each span, but only if there are no loads in the way. - for (let i = 0; i < spans.length; i++) { - let okay = true; // initialize - if (spans[i].length * beam.xScale < 30) { continue } - if (okay) { - for (let j = 1; j < spans[i].segments.length; j++) { - if (spans[i].segments[j].P[0] > 0) { okay = false; break } - } - } - if (okay) { - const x = beam.xDiagram + beam.xScale * (nodes[i].x + spans[i].length / 2); - const unit = beam.SI ? "" : "′"; - const sText = round$1(spans[i].length / lengthFactor, 3); - diagram.push(Draw.textNode(`${sText}${unit}`, x, beam.yLoad + 15)); - } - } - - // Draw nodal loads - for (let i = 0; i < nodes.length; i++) { - const x = beam.xDiagram + beam.xScale * nodes[i].x; - if (Math.abs(nodes[i].P[0]) > 0) { - const sText = round$1(nodes[i].P[0] / forceFactor, 3); - diagram = diagram.concat(Draw.pointForce(x, beam.yLoad, sText, nodes[i].fixity)); - } - if (Math.abs(nodes[i].M[0]) > 0) { - const sText = round$1(nodes[i].M[0] / momentFactor, 3); - diagram = diagram.concat(Draw.pointMoment(x, beam.yLoad, sText)); - } - } - - // Draw span loads - const wScale = 20 / beam.wMax; - let wPrev = 0; - let d = `M${beam.xDiagram} ${beam.yLoad}`; - for (let i = 0; i < spans.length; i++) { - for (let j = 0; j < spans[i].segments.length; j++) { - const seg = spans[i].segments[j]; - const x = beam.xDiagram + beam.xScale * seg.xOfLeftEnd; - if (Math.abs(seg.P[0]) > 0) { - const sText = round$1(seg.P[0] / forceFactor, 3); - diagram = diagram.concat(Draw.pointForce(x, beam.yLoad, sText, "continuous")); - } - if (Math.abs(seg.M[0]) > 0) { - const sText = round$1(seg.M[0] / momentFactor, 3); - diagram = diagram.concat(Draw.pointMoment(x, beam.yLoad, sText)); - } - // Draw a line segment for the service load. - const xEnd = x + beam.xScale * seg.length; - if (seg.w1[0] !== wPrev) { - d += `V${beam.yLoad + seg.w1[0] * wScale}`; // vertical load discontinuiy. - } - const yEnd = beam.yLoad + seg.w2[0] * wScale; - d += `L${xEnd} ${yEnd}`; - wPrev = seg.w2[0]; - } - } - if (wPrev !== 0) { d += `V${beam.yLoad}`; } - diagram.push({ tag: "path", attrs: { d, stroke: "black", "fill-opacity": "0.0" } }); - - // Write in the line load values - let lastSegUniform = false; - let firstSegment; - let xFirstSegment = 0; - const segments = []; - for (let i = 0; i < spans.length; i++) { - for (let j = 0; j < spans[i].segments.length; j++) { - segments.push(spans[i].segments[j]); - } - } - const numSegments = segments.length; - for (let i = 0; i < segments.length; i++) { - const seg = segments[i]; - if (seg.w1[0] === seg.w2[0] && Math.abs(seg.w1[0]) > 0) { - lastSegUniform = true; - if (i === 0 || seg.w1[0] !== segments[i - 1].w1[0] || lastSegUniform === false) { - firstSegment = i; - xFirstSegment = beam.xScale * seg.xOfLeftEnd; - } - if (i === numSegments - 1 || segments[i + 1].w1[0] !== segments[i + 1].w2[0] - || seg.w1[0] !== segments[i + 1].w1[0]) { - // This segment is the end of a uniform load. - // Find a place to write the load value - const lenSegLoad = i < numSegments - 1 - ? segments[i + 1].xOfLeftEnd - segments[firstSegment].xOfLeftEnd - : beam.length - segments[firstSegment].xOfLeftEnd; - if (lenSegLoad * beam.xScale > 30) { - let noBust = true; // initialize the value - const fudge = seg.w1[0] > 0 ? 10 : -4; - const yy = beam.yLoad + wScale * seg.w1[0] + fudge; - const str = round$1(Math.abs(seg.w1[0] / lineLoadFactor), 3); - // try the middle of the uniform load. See if there is a point load there - for (let j = firstSegment + 1; j <= i; j++) { - if (beam.xScale * (Math.abs(segments[j].xOfLeftEnd - - (segments[firstSegment].xOfLeftEnd + lenSegLoad / 2))) < 35) { - if (segments[j].M[0] || segments[j].P[0] !== 0) { - noBust = false; - break - } - } - } - if (noBust) { - const x = beam.xDiagram + xFirstSegment + beam.xScale * lenSegLoad / 2; - diagram.push(Draw.textNode(str, x, yy)); - } else { - // try the 1/3 point - noBust = true; - for (let j = firstSegment + 1; j <= i; j++) { - if (beam.xScale * (Math.abs(segments[j].xOfLeftEnd - - (segments[firstSegment].xOfLeftEnd + lenSegLoad / 3))) < 35) { - if (segments[j].M[0] || segments[j].P[0] !== 0) { - noBust = false; - break - } - } - } - if (noBust) { - const x = beam.xDiagram + xFirstSegment + beam.xScale * lenSegLoad / 3 - 17; - diagram.push(Draw.textNode(str, x, yy)); - } else { - // try the 2/3 point - noBust = true; - for (let j = firstSegment + 1; j <= i; j++) { - if (beam.xScale * (Math.abs(segments[j].xOfLeftEnd - - (segments[firstSegment].xOfLeftEnd + 2 * lenSegLoad / 3))) < 5) { - if (segments[j].M[0] || segments[j].P[0] !== 0) { - noBust = false; - break - } - } - } - if (noBust) { - const x = beam.xDiagram + xFirstSegment + beam.xScale * 2 * lenSegLoad / 3; - diagram.push(Draw.textNode(str, x, yy)); - } else { - if (i === 0) { - diagram.push(Draw.textNode(str, beam.xDiagram - 35, yy)); - } - } - } - } - } - } - } else { - // We've got a distributed sloping load - lastSegUniform = false; - const s = i === 0 - ? 0 - : (segments[i - 1].w2[0] - segments[i - 1].w1[0]) / segments[i - 1].length; - const s2 = (seg.w2[0] - seg.w1[0]) / seg.length; - const s3 = i === numSegments - 1 - ? 0 - : (segments[i + 1].w2[0] - segments[i + 1].w1[0]) / segments[i + 1].length; - if (Math.abs(s2 - s) > 0.05 || i === 0) { - if (Math.abs(seg.w1[0]) > 0.05) { - if (seg.length * beam.xScale > 20) { - const str = round$1(Math.abs(seg.w1[0] / lineLoadFactor), 3); - const x = beam.xDiagram + beam.xScale * seg.xOfLeftEnd; - const fudge = seg.w1[0] > 0 ? 10 : -5; - const yy = beam.yLoad + wScale * seg.w1[0] + fudge; - diagram.push(Draw.textNode(str, x, yy)); - } - } - } - if (Math.abs(s2 - s3) > 0.05 || i === numSegments - 1 - || Math.abs(seg.w2[0] - segments[i + 1].w1[0]) > 0) { - if (Math.abs(seg.w2[0]) > 0.05) { - if (seg.length * beam.xScale > 20) { - const str = round$1(Math.abs(seg.w2[0] / lineLoadFactor), 3); - const x = beam.xDiagram + beam.xScale * (seg.xOfLeftEnd + seg.length) - 30; - const fudge = seg.w2[0] > 0 ? 10 : -5; - const yy = beam.yLoad + wScale * seg.w2[0] + fudge; - diagram.push(Draw.textNode(str, x, yy)); - } - } - } - } - } - - return diagram -} - -const ftRegEx = /′/g; -const numberRegEx$3 = new RegExp(Rnl.numberPattern); -const lengths = ["ft", "m", "cm", "mm"]; -const metricLengths = ["m", "cm", "mm"]; - -const readNumber = str => { - const matches = numberRegEx$3.exec(str); - if (matches) { - const numStr = matches[0]; - return [Rnl.fromString(numStr), numStr.length]; - } else { - return ["Error", null] - } -}; - -const convertToBaseUnit = (num, unitName) => { - const unit = unitFromUnitName(unitName); - return Rnl.multiply(Rnl.add(num, unit.gauge), unit.factor) -}; - -const readInputData = data => { - const input = Object.create(null); - // Set some defaults - input.nodes = []; - input.spanLength = []; - input.loads = []; - input.E = 1; - input.I = 1; - input.k = 0; - input.SI = false; - input.convention = 1; - // Read the input and overwrite the defaults. - - // Read the top line of data. - // It contains the geometry, connectivity, and node fixity. - const layout = data[1][0].trim(); - if (numberRegEx$3.test(layout)) { input.nodes.push("continuous"); } - const elements = layout.split(/ +/g); - for (let k = 0; k < elements.length; k++) { - switch (elements[k]) { - case "p": - case "△": - input.nodes.push("pinned"); - break - case "f": - case "⫢": - input.nodes.push("fixed"); - break - case "h": - case "∘": - input.nodes.push("hinged"); - break - case "ph": - case "⫯": - case "⧊": - input.nodes.push("proppedHinge"); - break - case "s": - case "⌇": - input.nodes.push("spring"); - break - case "-": - input.nodes.push("continuous"); - break - default: { - const element = elements[k].replace(ftRegEx, "ft"); - const [L, pos] = readNumber(element); - if (typeof L === "string") { return "Error. Non-numeric length." } - let unitName = element.slice(pos).trim(); - if (unitName === "") { - if (lengths.includes(elements[k + 1])) { - unitName = elements[k + 1]; - k += 1; - } else { - unitName = "mm"; - } - } - if (metricLengths.includes(unitName)) { input.SI = true; } - input.spanLength.push(convertToBaseUnit(L, unitName)); - break - } - } - } - if (numberRegEx$3.test(elements[elements.length - 1])) { input.nodes.push("continuous"); } - - // Read the rest of the data. - for (let i = 1; i < data[0].length; i++) { - const item = data[0][i].trim(); - let datum = data[1][i].trim(); - switch (item) { - case "E": { - const [E, pos] = readNumber(datum); - if (typeof E === "string") { return "Error. Non-numeric E." } - const unitName = datum.slice(pos).trim(); - input.E = Rnl.toNumber(convertToBaseUnit(E, unitName)); - break - } - - case "I": { - const [I, pos] = readNumber(datum); - if (typeof I === "string") { return "Error. Non-numeric I." } - const unitName = datum.slice(pos).trim(); - input.I = Rnl.toNumber(convertToBaseUnit(I, unitName)); - break - } - - case "k": { - const [k, pos] = readNumber(datum); - if (typeof k === "string") { return "Error. Non-numeric k." } - const unitName = datum.slice(pos).trim(); - input.k = Rnl.toNumber(convertToBaseUnit(k, unitName)); - break - } - - case "+M": { - input.convention = datum.charAt(0).toLowerCase() === "←→" ? 1 : -1; - break - } - - default: { - // Treat as a load - const load = Object.create(null); - datum = datum.replace(ftRegEx, "ft"); - const elements = datum.split(","); - let str = elements[0]; - load.type = item; - load.from = Rnl.zero; - load.to = Rnl.zero; - load.P = 0; - load.M = 0; - load.wStart = 0; - load.wEnd = 0; - let [num1, pos] = readNumber(str); // eslint-disable-line prefer-const - if (typeof num1 === "string") { return "Error. Non-numeric load." } - let num2 = num1; - str = str.slice(pos).trim(); - if (str.slice(0, 1) === ":") { - str = str.slice(1).trim(); - [num2, pos] = readNumber(str); - str = str.slice(pos).trim(); - } - const unitName = str.trim(); - const unit = unitFromUnitName(unitName); - // Read the load from & to points, if any - let L1 = 0; - let L2 = 0; - let lengthUnitName = ""; - if (elements.length > 1) { - str = elements[1].trim(); - [L1, pos] = readNumber(str); - str = str.slice(pos).trim(); - if (str.slice(0, 1) === ":") { - str = str.slice(1).trim(); - [L2, pos] = readNumber(str); - str = str.slice(pos).trim(); - } else { - L2 = L1; - } - lengthUnitName = str.trim(); - if (lengthUnitName === "") { lengthUnitName = "mm"; } - } - const expos = unit.expos.join(""); - if (expos === "01-200000") { - load.shape = "w"; - load.wStart = Rnl.toNumber(convertToBaseUnit(num1, unitName)); - load.wEnd = Rnl.toNumber(convertToBaseUnit(num2, unitName)); - } else if (expos === "11-200000") { - load.shape = "P"; - load.P = Rnl.toNumber(convertToBaseUnit(num1, unitName)); - } else if (expos === "21-200000") { - load.shape = "M"; - load.M = Rnl.toNumber(convertToBaseUnit(num1, unitName)); - } else { - return `Error. ${unitName} is not a force, line load, or moment.` - } - if (L1 !== 0) { load.from = convertToBaseUnit(L1, lengthUnitName); } - if (L2 !== 0) { load.to = convertToBaseUnit(L2, lengthUnitName); } - input.loads.push(load); - } - } - } - return input -}; - -const dotProduct = (a, b) => a.map((e, i) => (e * b[i])).reduce((m, n) => m + n); -const isLiveish = (loadType, beam) => beam.getsPattern[loadType]; - - -function doAnalysis(beam, nodes, spans) { - const numNodes = nodes.length; - const numSpans = spans.length; - const gotType = beam.gotType; - const numDegreesOfFreedom = beam.numDegreesOfFreedom; - const numEndActions = 4 * numSpans + numNodes; // include the node spring actions. - beam.numEndActions = numEndActions; - const EI = beam.EI; - - // The Direct Stiffness Method employs matrix methods to solve indeterminate structures. - // Textbooks describe the Direct Stiffness Method with one-based matrices. - // To avoid confusion, the code below employs arrays as if they were one-based. - // Since JavaScript arrays are actually zero-based, we will dimension each array with one - // element more than it needs. Then we'll leave array[0] unused. All our loops will be - // written as if we had one-based arrays. - - // Prepend elements to arrays `nodes` & `spans` so that they act like 1-based arrays. - nodes.unshift(0); - spans.unshift(0); - - // Find the Span Stiffness Matrix, SSM - // Imagine that a fixed-end span undergoes a displacement, Δ, down at its right end. - // (Notice that rotation, θ, is zero at both ends) - // ▄ █ - // █ █ - // █▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,█──────┬── - // █ ▀▀▀▀▀▀▀▄▄▄▄ █ │ - // █ ▀▀▀▄▄▄▄▄ █ │ Δ - // █ ▀▀▀▀▄▄▄▄▄▄ █ │ - // ▀▀▀▀▀▀▀▀▀▀▀▀▀▀█──────┴── - // █ - // If we draw the free-body diagram of the span, we would see these forces: - // V_left = 6EIΔ/L², upward - // M_left = 12EIΔ/L³, clockwise - // V_right = 6EIΔ/L², downward - // M_right = 12EIΔ/L³, clockwise - // The Span Stiffness Matrix is populated, for each span, with just those stiffnesses. - - const ssm = []; // Span Stiffnes Matrix, not yet the Stiffness Matrix. - ssm.push([0, 0, 0, 0, 0]); - for (let i = 1; i <= numSpans; i++) { - const subMatrix = [ - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0] - ]; - subMatrix[1][1] = EI * 12 / spans[i].length ** 3; - subMatrix[1][2] = EI * 6 / spans[i].length ** 2; - subMatrix[1][3] = -EI * 12 / spans[i].length ** 3; - subMatrix[1][4] = EI * 6 / spans[i].length ** 2; - subMatrix[2][1] = EI * 6 / spans[i].length ** 2; - subMatrix[2][2] = EI * 4 / spans[i].length; - subMatrix[2][3] = -EI * 6 / spans[i].length ** 2; - subMatrix[2][4] = EI * 2 / spans[i].length; - subMatrix[3][1] = -EI * 12 / spans[i].length ** 3; - subMatrix[3][2] = -EI * 6 / spans[i].length ** 2; - subMatrix[3][3] = EI * 12 / spans[i].length ** 3; - subMatrix[3][4] = -EI * 6 / spans[i].length ** 2; - subMatrix[4][1] = EI * 6 / spans[i].length ** 2; - subMatrix[4][2] = EI * 2 / spans[i].length; - subMatrix[4][3] = -EI * 6 / spans[i].length ** 2; - subMatrix[4][4] = EI * 4 / spans[i].length; - ssm.push(subMatrix); - } - - //Find dtm, the Displacement Transformation Matrix - const dtm = new Array(numEndActions + 1).fill(0).map(e => { - return new Array(numDegreesOfFreedom + 1).fill(0) - }); - let j = 0; - for (let i = 1; i <= numNodes; i++) { - if (i === 1) { - if (nodes[i].fixity === "continuous" || nodes[i].fixity === "spring") { - dtm[1][1] = 1; - dtm[2][1] = 1; - dtm[3][2] = 1; - j = 2; - } else if (nodes[i].fixity === "fixed") ; else if (nodes[i].fixity === "pinned") { - dtm[3][1] = 1; - j = 1; - } - } else if (i === numNodes) { - if (nodes[i].fixity === "continuous" || nodes[i].fixity === "spring") { - j = j + 1; - dtm[5 * numSpans - 1][j] = 1; - j = j + 1; - dtm[5 * numSpans][j] = 1; - dtm[5 * numSpans + 1][j - 1] = 1; - } else if (nodes[i].fixity === "fixed") ; else if (nodes[i].fixity === "pinned") { - j = j + 1; - dtm[5 * numSpans][j] = 1; - } - } else { - if (nodes[i].fixity === "continuous" || nodes[i].fixity === "spring") { - j = j + 1; - dtm[5 * (i - 1) - 1][j] = 1; - dtm[5 * (i - 1) + 1][j] = 1; - dtm[5 * (i - 1) + 2][j] = 1; - j = j + 1; - dtm[5 * (i - 1)][j] = 1; - dtm[5 * (i - 1) + 3][j] = 1; - } else if (nodes[i].fixity === "hinge") { - j = j + 1; - dtm[5 * (i - 1) - 1][j] = 1; - dtm[5 * (i - 1) + 1][j] = 1; - dtm[5 * (i - 1) + 2][j] = 1; - j = j + 1; - dtm[5 * (i - 1)][j] = 1; - j = j + 1; - dtm[5 * (i - 1) + 3][j] = 1; - } else if (nodes[i].fixity === "proppedHinge") { - j = j + 1; - dtm[5 * (i - 1)][j] = 1; - j = j + 1; - dtm[5 * (i - 1) + 3][j] = 1; - } else if (nodes[i].fixity === "fixed") ; else if (nodes[i].fixity === "pinned") { - j = j + 1; - dtm[5 * (i - 1)][j] = 1; - dtm[5 * (i - 1) + 3][j] = 1; - } - } - } - - //Now do the first matrix operations - const lsmDtm = createLsmDtm(ssm, dtm, nodes, numEndActions, numDegreesOfFreedom); - // Create the Stiffness Matrix. - const [sm, bandWidth] = createSM(dtm, lsmDtm, numDegreesOfFreedom); - - let diag = []; - let ltm = []; - if (numDegreesOfFreedom > 1) { - [diag, ltm] = luDecomposition(sm, bandWidth); - } - - //Find the number of load patterns - beam.containsLive = false; - for (let i = 1; i <= beam.numLoadTypes; i++) { - if (beam.getsPattern[i]) { beam.containsLive = true; break } - } - const numPatterns = !beam.containsLive - ? 1 - : !beam.doLiveLoadPatterns - ? 1 - : numSpans > 7 - ? beam.patterns - : 2; - - // Initialize some variables - const feam = new Array(numEndActions + 1).fill(0); // Fixed End Action Matrix - const nfm = new Array(numDegreesOfFreedom + 1).fill(0); // Nodal Force Matrix - let mam; // Member Action Matrix - let dm; // Displacement Matrix - const actions = new Array(beam.numLoadTypes); - const deflections = new Array(beam.numLoadTypes); - for (let i = 0; i <= beam.numLoadTypes; i++) { - if (beam.getsPattern[i]) { - actions[i] = new Array(numEndActions + 1).fill(0); - for (let j = 0; j < actions[i].length; j++) { - actions[i][j] = new Array(numDegreesOfFreedom).fill(0); - } - deflections[i] = new Array(numDegreesOfFreedom + 1).fill(0); - for (let j = 0; j < deflections[i].length; j++) { - deflections[i][j] = Array(numSpans + 1).fill(0); - } - } else { - actions[i] = new Array(numEndActions).fill(0); - deflections[i] = new Array(numDegreesOfFreedom).fill(0); - } - } - - //Find a Member end Action Matrix, mam for each type of load, Service, D, L, S, W, E, etc - //For the live loads, find a different mam due to loads on each individual span. - for (let loadType = 0; loadType <= 9; loadType++) { - if (loadType === 0 || gotType[loadType]) { - let lastK = 0; - let doPatterns = false; // patterned live loads - if (loadType === 0) { - doPatterns = false; - lastK = 1; - } else if (isLiveish(loadType, beam) && numPatterns > 1) { - doPatterns = true; - // To do load patterns, we have to get a Member Action Matrix, mam, for each span. - lastK = numSpans; - } else { - doPatterns = false; - lastK = 1; - } - - for (let k = 1; k <= lastK; k++) { - for (let i = 1; i <= numSpans; i++) { - const L = spans[i].length; - const iSpring = 5 * i - 4; - const i1 = 5 * i - 3; - const i2 = 5 * i - 2; - const i3 = 5 * i - 1; - const i4 = 5 * i; - - // Find the fixed end actions - feam[iSpring] = 0; - feam[i1] = 0; //The left end reaction if this segment were a fixed/fixed beam. - feam[i2] = 0; //The left fixed end moment - feam[i3] = 0; //The right end reaction - feam[i4] = 0; //The right fixed end moment - let applyLoadsFromThisSpan = false; - if (!doPatterns) { - // We are not doing live load patterns. - // So make one pass thru the beam and get a MAM that is the result of all loads. - applyLoadsFromThisSpan = true; - } else { - // We are doing live load patterns. - // k = number of spans. - // Make k passes thru the beam. - // In the kth pass, we calclate a MAM for the entire beam that results from - // live loads on just the kth span. - // The other spans have FEAM = [0, 0, etc] as their contribution to this MAM. - // Having k MAMs will enable us later to superimpose forces for each pattern. - applyLoadsFromThisSpan = i === k; - } - - if (applyLoadsFromThisSpan) { - for (let iSeg = 0; iSeg < spans[i].segments.length; iSeg++) { - const seg = spans[i].segments[iSeg]; - // In the next few lines, - // a is the distance from the beginning of the span to the load point. - // b is the length of the load. - // c is the distance from the end of the load to the right edge of the span. - // e is the distance from the left edge of the load to the right end of the span. - // d is the distance from the right edge of the load to the left edge of the span - let w = 0; - let s = 0; - const a = seg.xOfLeftEnd - nodes[i].x; - let b = seg.length; - let c = L - a - b; - let d = a + b; - const e = b + c; - let gotOppSigns = false; - let a2 = 0; - let b2 = 0; - let c2 = 0; - let d2 = 0; - let e2 = 0; - - if (Math.abs(seg.w1[loadType]) < 0.000000001) { seg.w1[loadType] = 0; } - if (Math.abs(seg.w2[loadType]) < 0.000000001) { seg.w2[loadType] = 0; } - - if (seg.w1[loadType] !== 0 && seg.w2[loadType] !== 0 && - Math.sign(seg.w1[loadType]) !== Math.sign(seg.w2[loadType])) { - gotOppSigns = true; - w = 0; - s = (seg.w2[loadType] - seg.w1[loadType]) / b; //slope of line load - a2 = a - seg.w1[loadType] / s; - b2 = d - a2; - c2 = c; - d2 = d; - e2 = d2 - b2; - b = a2 - a; - d = a + b; - c = L - d; - - } else { - gotOppSigns = false; - w = Math.abs(seg.w1[loadType]) < Math.abs(seg.w2[loadType]) - ? seg.w1[loadType] - : seg.w2[loadType]; - } - - if (a === 0) { - feam[iSpring] = seg.P[loadType]; - } else { - //FEA for point loads - feam[i2] = feam[i2] + seg.P[loadType] * a * e ** 2 / L ** 2; - feam[i4] = feam[i4] - seg.P[loadType] * a ** 2 * e / L ** 2; - feam[i2] = feam[i2] - seg.M[loadType] * (-1 + 4 * a / L - 3 * a ** 2 / L ** 2); - feam[i4] = feam[i4] - seg.M[loadType] * a / L * (2 - 3 * a / L); - feam[i1] = feam[i1] + seg.P[loadType] * e ** 2 / L ** 3 * (3 * a + e); - feam[i3] = feam[i3] + seg.P[loadType] * a ** 2 / L ** 3 * (a + 3 * e); - feam[i1] = feam[i1] - 6 * seg.M[loadType] * a / L ** 2 * (1 - a / L); - feam[i3] = feam[i3] + 6 * seg.M[loadType] * a / L ** 2 * (1 - a / L); - } - - //FEA for uniform loads - if (w !== 0) { - const mA = (w * b / (12 * L ** 2 * b)) * (e ** 3 * (4 * L - 3 * e) - - c ** 3 * (4 * L - 3 * c)); - feam[i2] = feam[i2] + mA; - const mB = (w * b / (12 * L ** 2 * b)) * (d ** 3 * (4 * L - 3 * d) - - a ** 3 * (4 * L - 3 * a)); - feam[i4] = feam[i4] - mB; - feam[i1] = feam[i1] + (w * b / (2 * L)) * (2 * c + b) + (mA - mB) / L; - feam[i3] = feam[i3] + (w * b / (2 * L)) * (2 * a + b) + (mB - mA) / L; - } - - //FEA for triangular loads - if (Math.abs(seg.w1[loadType]) > Math.abs(seg.w2[loadType]) || gotOppSigns) { - const wL = seg.w1[loadType] - w; - // const wR = 0 - const wT = wL; - const centerOfTriangle = a + b / 3; - const wF = wT * d / b; - const mA = (wF * L ** 2 / 60) * (d / L) ** 2 * (10 - 10 * d / L - + 3 * d ** 2 / L ** 2) - - ((wF - wT) * L ** 2 / 60) * (a / L) ** 2 - * (10 - 10 * a / L + 3 * a ** 2 / L ** 2) - - (wT * L ** 2 / 12) * (a / L) ** 2 * (6 - 8 * a / L + 3 * a ** 2 / L ** 2); - feam[i2] = feam[i2] + mA; - const mB = (wF * L ** 2 / 60) * (d / L) ** 3 * (5 - 3 * d / L) - - ((wF - wT) * L ** 2 / 60) * (a / L) ** 3 * (5 - 3 * a / L) - - (wT * L ** 2 / 12) * (a / L) ** 3 * (4 - 3 * a / L); - feam[i4] = feam[i4] - mB; - feam[i1] = feam[i1] - + 0.5 * (wT * b) * (L - centerOfTriangle) / L + (mA - mB) / L; - feam[i3] = feam[i3] + 0.5 * (wT * b) * centerOfTriangle / L + (mB - mA) / L; - - } else if (Math.abs(seg.w2[loadType]) > Math.abs(seg.w1[loadType])) { - // const wL = 0 - const wR = seg.w2[loadType] - w; - const wT = wR; - const centerOfTriangle = a + 2 * b / 3; - const wF = wT * e / b; - const mA = (wF * L ** 2 / 60) * (e / L) ** 3 * (5 - 3 * e / L) - - ((wF - wT) * L ** 2 / 60) * (c / L) ** 3 * (5 - 3 * c / L) - - (wT * L ** 2 / 12) * (c / L) ** 3 * (4 - 3 * c / L); - feam[i2] = feam[i2] + mA; - const mB = (wF * L ** 2 / 60) * (e / L) ** 2 - * (10 - 10 * e / L + 3 * e ** 2 / L ** 2) - - ((wF - wT) * L ** 2 / 60) * (c / L) ** 2 - * (10 - 10 * c / L + 3 * c ** 2 / L ** 2) - - (wT * L ** 2 / 12) * (c / L) ** 2 * (6 - 8 * c / L + 3 * c ** 2 / L ** 2); - feam[i4] = feam[i4] - mB; - feam[i1] = feam[i1] - + 0.5 * (wT * b) * (L - centerOfTriangle) / L + (mA - mB) / L; - feam[i3] = feam[i3] + 0.5 * (wT * b) * centerOfTriangle / L + (mB - mA) / L; - } - if (gotOppSigns) { - //Do the right-hand triangle load - // const wL = 0 - // const wR = seg.w2[loadType] - const wT = seg.w2[loadType]; - const centerOfTriangle = a2 + 2 * b2 / 3; - const wF = wT * e2 / b2; - const mA = (wF * L ** 2 / 60) * (e2 / L) ** 3 * (5 - 3 * e2 / L) - - ((wF - wT) * L ** 2 / 60) * (c2 / L) ** 3 * (5 - 3 * c2 / L) - - (wT * L ** 2 / 12) * (c2 / L) ** 3 * (4 - 3 * c2 / L); - feam[i2] = feam[i2] + mA; - const mB = (wF * L ** 2 / 60) * (e2 / L) ** 2 - * (10 - 10 * e2 / L + 3 * e2 ** 2 / L ** 2) - - ((wF - wT) * L ** 2 / 60) * (c2 / L) ** 2 - * (10 - 10 * c2 / L + 3 * c2 ** 2 / L ** 2) - // eslint-disable-next-line max-len - - (wT * L ** 2 / 12) * (c2 / L) ** 2 * (6 - 8 * c2 / L + 3 * c2 ** 2 / L ** 2); - feam[i4] = feam[i4] - mB; - feam[i1] = feam[i1] - + 0.5 * (wT * b2) * (L - centerOfTriangle) / L + (mA - mB) / L; - feam[i3] = feam[i3] + 0.5 * (wT * b2) * centerOfTriangle / L + (mB - mA) / L; - } - } - } - } - - //Find the Nodal Force Matrix, NFM - let j = 0; - for (let i = 1; i <= numNodes; i++) { - if (i === 1) { - if (nodes[i].fixity === "continuous" || nodes[i].fixity === "spring") { - nfm[1] = -feam[1] - feam[2]; - nfm[2] = -feam[3]; - if (isLiveish(loadType, beam) && numPatterns > 1) { - if (k === 0) { - nfm[1] = nfm[1] - nodes[1].P[loadType]; - nfm[2] = nfm[2] - nodes[1].M[loadType]; - } - } else { - nfm[1] = nfm[1] - nodes[1].P[loadType]; - nfm[2] = nfm[2] - nodes[1].M[loadType]; - } - - j = 2; - } else if (nodes[i].fixity === "fixed") ; else if (nodes[i].fixity === "pinned") { - j += 1; - nfm[1] = -feam[3]; - if (isLiveish(loadType, beam) && numPatterns > 1) { - if (k === 1) { - nfm[j] = nfm[j] - nodes[1].M[loadType]; - } - } else { - nfm[j] = nfm[j] - nodes[1].M[loadType]; - } - } - } else if (i === numNodes) { - if (nodes[i].fixity === "continuous" || nodes[i].fixity === "spring") { - j += 1; - nfm[j] = -feam[5 * numSpans - 1] - feam[5 * numSpans + 1]; - j += 1; - nfm[j] = -feam[5 * numSpans]; - if (isLiveish(loadType, beam) && numPatterns > 1) { - if (k === numSpans) { - nfm[j - 1] = nfm[j - 1] - nodes[numNodes].P[loadType]; - nfm[j] = nfm[j] - nodes[numNodes].M[loadType]; - } - } else { - nfm[j - 1] = nfm[j - 1] - nodes[numNodes].P[loadType]; - nfm[j] = nfm[j] - nodes[numNodes].M[loadType]; - } - } else if (nodes[i].fixity === "fixed") ; else if (nodes[i].fixity === "pinned") { - j += 1; - nfm[j] = -feam[5 * numSpans]; - if (isLiveish(loadType, beam) && numPatterns > 1) { - if (k === numSpans) { - nfm[j] = nfm[j] - nodes[numNodes].M[loadType]; - } - } else { - nfm[j] = nfm[j] - nodes[numNodes].M[loadType]; - } - } - } else { - if (nodes[i].fixity === "continuous" || nodes[i].fixity === "spring") { - j += 1; - nfm[j] = -feam[5 * (i - 1) - 1] - feam[5 * (i - 1) + 1] - feam[5 * (i - 1) + 2]; - j += 1; - nfm[j] = -feam[5 * (i - 1)] - feam[5 * (i - 1) + 3]; - if ((loadType === 3 || loadType === 5 || loadType === 6) && numPatterns > 1) { - if (k === i) { - nfm[j - 1] = nfm[j - 1] - nodes[i].P[loadType]; - nfm[j] = nfm[j] - nodes[i].M[loadType]; - } - } else { - nfm[j - 1] = nfm[j - 1] - nodes[i].P[loadType]; - nfm[j] = nfm[j] - nodes[i].M[loadType]; - } - } else if (nodes[i].fixity === "hinge") { - j += 1; - nfm[j] = -feam[5 * (i - 1) - 1] - feam[5 * (i - 1) + 1] - feam[5 * (i - 1) + 2]; - j += 1; - nfm[j] = -feam[5 * (i - 1)]; - if ((loadType === 3 || loadType === 5 || loadType === 6) && numPatterns > 1) { - if (k === i) { - nfm[j - 1] = nfm[j - 1] - nodes[i].P[loadType]; - nfm[j] = nfm[j] - nodes[i].M[loadType]; - } - } else { - nfm[j - 1] = nfm[j - 1] - nodes[i].P[loadType]; - nfm[j] = nfm[j] - nodes[i].M[loadType]; - } - - j += 1; - nfm[j] = -feam[5 * (i - 1) + 3]; - } else if (nodes[i].fixity === "proppedHinge") { - j += 1; - nfm[j] = -feam[5 * (i - 1)]; - j += 1; - nfm[j] = -feam[5 * (i - 1) + 3]; - } else if (nodes[i].fixity === "fixed") ; else if (nodes[i].fixity === "pinned") { - j += 1; - nfm[j] = -feam[5 * (i - 1)] - feam[5 * (i - 1) + 3]; - if ((loadType === 3 || loadType === 5 || loadType === 6) && numPatterns > 1) { - if (k === i) { - nfm[j] = nfm[j] - nodes[i].M[loadType]; - } - } else { - nfm[j] = nfm[j] - nodes[i].M[loadType]; - } - } - } - } - - //Now do the rest of the matrix operations for the current load type - if (numDegreesOfFreedom === 0) { - dm = [0]; - } else if (numDegreesOfFreedom === 1) { - dm = [0, nfm[1] / sm[1][1]]; - } else { - dm = solveViaLDLt(diag, ltm, nfm, bandWidth); - } - - // Get the Member Action Matrix, MAM. - // Multiply lsmDtm times dm, then add the resulting column vector to the FEAM - mam = lsmDtm.map(row => dotProduct(row, dm)).map((e, i) => e + feam[i]); - - //Set elements of mam = 0 where fixity so dictates - for (let i = 1; i <= numEndActions; i++) { - if (Math.abs(mam[i]) < 0.00000000000001) { mam[i] = 0; } - } - - if ((!beam.getsPattern[loadType]) || typeof actions[loadType][0] === "number") { - actions[loadType] = clone(mam); - if (EI !== 1) { deflections[loadType] = clone(dm); } - } else { - for (let j = 1; j < 5 * numSpans + 1; j++) { - actions[loadType][j][k - 1] = mam[j]; //mam for live loads on span k - } - if (EI !== 1) { - for (let j = 1; j <= numDegreesOfFreedom; j++) { - deflections[loadType][j][k] = dm[j]; - } - } - } - - // Find the reactions - if (numPatterns === 1 || !(beam.containsLive && isLiveish(loadType, beam))) { - if (nodes[1].fixity === "fixed") { - nodes[1].Mr[loadType] = mam[3] + nodes[1].M[loadType]; - } - if (nodes[1].fixity === "spring") { - nodes[1].Pr[loadType] = mam[1]; - } else if (nodes[1].fixity !== "continuous") { - nodes[1].Pr[loadType] = -mam[2] - nodes[1].P[loadType]; - } - - for (let j = 2; j <= numSpans; j++) { - if (nodes[j].fixity === "fixed") { - nodes[j].Mr[loadType] = mam[5 * (j - 1)] - + mam[5 * (j - 1) + 3] + nodes[j].M[loadType]; - } - if (nodes[j].fixity === "spring") { - nodes[j].Pr[loadType] = mam[5 * (j - 1) + 1]; - } else if (nodes[j].fixity !== "continuous") { - nodes[j].Pr[loadType] = -mam[5 * (j - 1) - 1] - mam[5 * (j - 1) + 2] - - nodes[j].P[loadType]; - } - } - - if (nodes[numNodes].fixity === "fixed") { - nodes[numNodes].Mr[loadType] = mam[5 * numSpans] + nodes[numNodes].M[loadType]; - } - if (nodes[numNodes].fixity === "spring") { - nodes[numNodes].Pr[loadType] = mam[5 * numSpans + 1]; - } else if (nodes[numNodes].fixity !== "continuous") { - nodes[numNodes].Pr[loadType] = -mam[5 * numSpans - 1] - nodes[numNodes].P[loadType]; - } - } else { - let mTest = 0; - if (nodes[1].fixity === "fixed") { - mTest = mam[3] + nodes[1].M[loadType]; - if (mTest > 0) { nodes[1].Mr[loadType] = nodes[1].Mr[loadType] + mTest; } - if (mTest < 0) { nodes[1].MrMin[loadType] = nodes[1].MrMin[loadType] + mTest; } - } - let pTest = 0; - if (nodes[1].fixity === "spring") { - pTest = mam[1]; - } else if (nodes[1].fixity !== "continuous") { - pTest = -mam[2] - nodes[1].P[loadType]; - } - if (pTest > 0) { nodes[1].Pr[loadType] = nodes[1].Pr[loadType] + pTest; } - if (pTest < 0) { nodes[1].PrMin[loadType] = nodes[1].PrMin[loadType] + pTest; } - - for (let j = 1; j < numSpans; j++) { - if (nodes[j].fixity === "fixed") { - mTest = mam[5 * (j - 1)] + mam[5 * (j - 1) + 3] + nodes[j].M[loadType]; - if (mTest > 0) { nodes[j].Mr[loadType] = nodes[j].Mr[loadType] + mTest; } - if (mTest < 0) { nodes[j].MrMin[loadType] = nodes[j].MrMin[loadType] + mTest; } - } - pTest = 0; - if (nodes[j].fixity === "spring") { - nodes[j].Pr[loadType] = nodes[j].Pr[loadType] + mam[5 * (j - 1) + 1]; - } else if (nodes[j].fixity !== "continuous") { - pTest = -mam[5 * (j - 1) - 1] - mam[5 * (j - 1) + 2] - nodes[j].P[loadType]; - } - if (pTest > 0) { nodes[j].Pr[loadType] = nodes[j].Pr[loadType] + pTest; } - if (pTest < 0) { nodes[j].PrMin[loadType] = nodes[j].PrMin[loadType] + pTest; } - } - - if (nodes[numNodes].fixity === "fixed") { - mTest = mam[5 * numSpans] + nodes[numSpans].M[loadType]; - if (mTest > 0) { - nodes[numNodes].Mr[loadType] = nodes[numNodes].Mr[loadType] + mTest; - } - if (mTest < 0) { - nodes[numNodes].MrMin[loadType] = nodes[numNodes].MrMin[loadType] + mTest; - } - } - - pTest = 0; - if (nodes[numNodes].fixity === "spring") { - nodes[numNodes].Pr[loadType] = nodes[numNodes].Pr[loadType] + mam[5 * numSpans + 1]; - } else if (nodes[numNodes].fixity !== "continuous") { - pTest = -mam[5 * numSpans - 1] - nodes[j].P[loadType]; - } - if (pTest > 0) { - nodes[numNodes].Pr[loadType] = nodes[numNodes].Pr[loadType] + pTest; - } - if (pTest < 0) { - nodes[numNodes].PrMin[loadType] = nodes[numNodes].PrMin[loadType] + pTest; - } - } //finished finding the reactions - - } - } - } - return [actions, deflections] -} - -const createLsmDtm = (ssm, dtm, nodes, numEndActions, numDegreesOfFreedom) => { -// Create LSM × DTM - - let lsmDtm = new Array(numEndActions + 1).fill(0); - lsmDtm = lsmDtm.map(e => new Array(numDegreesOfFreedom + 1).fill(0)); - - for (let i = 1; i <= numEndActions; i++) { - const iSpan = Math.trunc((i - 1) / 5) + 1; - const g = i - 1 - 5 * (iSpan - 1); - - for (let j = 1; j <= numDegreesOfFreedom; j++) { - if (g === 0) { - lsmDtm[i][j] = nodes[iSpan].k * dtm[i][j]; - } else { - const kStart = 5 * iSpan - 3; - const kEnd = 5 * iSpan; - let h = 0; - for (let k = kStart; k <= kEnd; k++) { - h += 1; - lsmDtm[i][j] = lsmDtm[i][j] + ssm[iSpan][g][h] * dtm[k][j]; - } - } - } - } - return lsmDtm -}; - -const createSM = (dtm, lsmDtm, numDegreesOfFreedom) => { - // Create the Stiffness Matrix, SM. - // SM = DTM**T × LsmDtm - let sm = Array(numDegreesOfFreedom + 1).fill(0); - sm = sm.map(e => Array(numDegreesOfFreedom + 1).fill(0)); - const h = lsmDtm.length - 1; - let bandWidth = 1; - for (let i = 1; i < dtm[0].length; i++) { - for (let j = 1; j <= i; j++) { // Only the lower half of SM. - for (let k = 1; k <= h; k++) { - sm[i][j] = sm[i][j] + dtm[k][i] * lsmDtm[k][j]; // DTM**T, not DTM. - } - if (sm[i][j] !== 0 && i - j > bandWidth) { bandWidth = i - j;} // lower band width - } - } - return [sm, bandWidth] -}; - -const luDecomposition = (sm, bandWidth) => { - // Perform the LU Decomposition of the stiffness matrix, SM. - // This is in preparation for the LDL**T matrix solution to come later. - - const diag = new Array(sm.length).fill(0); - // Lower Triangular matrix, ltm - let ltm = new Array(sm.length).fill(0); - ltm = ltm.map(e => new Array(sm.length - 1).fill(0)); - - const n = sm.length - 1; // number of equations - - for (let j = 1; j <= n; j++) { - let kStar = Math.max(j - bandWidth, 1); - diag[j] = sm[j][j]; - for (let k = kStar; k <= j - 1; k++) { - diag[j] = diag[j] - diag[k] * ltm[j][k] * ltm[j][k]; - } - - const iMax = Math.min(j + bandWidth, n); - for (let i = j + 1; i <= iMax; i++) { - kStar = Math.max(i - bandWidth, 1); - let sum = 0; - for (let k = kStar; k <= j - 1; k++) { - sum = sum + diag[k] * ltm[j][k] * ltm[i][k]; - } - ltm[i][j] = (sm[i][j] - sum) / diag[j]; - } - } - return [diag, ltm] -}; - -const solveViaLDLt = (diag, ltm, b, bandWidth) => { - // Solve for dm() in a system of equations expressed by matrices: SM() × dm() = NFM() - - // This sub// s method is a banded version of the LDL**T solver. - // LDL**T takes advantage of the fact that SM is a symmetric, positive-definite matrix. - // The algorithm will overwrite b(), which starts out as NFM and ends as dm. - // We already have the diag & ltm matrices, so we can go directly to the LU solution. - - const n = b.length - 1; // number of equations - - // Forward substitution - for (let i = 2; i <= n; i++) { - const kStar = i - bandWidth < 1 ? 1 : i - bandWidth; - for (let k = kStar; k <= i - 1; k++) { - b[i] = b[i] - ltm[i][k] * b[k]; - } - } - - // Diagonal scaling and backward substitution - b[n] = b[n] / diag[n]; - for (let i = n - 1; i >= 1; i--) { - b[i] = b[i] / diag[i]; - const kStar = Math.min(n, i + bandWidth); - for (let k = i + 1; k <= kStar; k++) { - b[i] = b[i] - ltm[k][i] * b[k]; - } - } - - return b -}; - -function getLoadPatterns(beam, numSpans) { - if (!beam.containsLive || !beam.doLiveLoadPatterns) { - // Just one pattern. It includes each span. - const pattern = [1]; - for (let i = 2; i <= numSpans; i++) { - pattern.push(i); - } - return [pattern] - } else if (beam.numPatterns === 2 || numSpans > 7) { - // Do 2 patterns. One with all live load on, and one with all live load off. - const pattern = [1]; - for (let i = 2; i <= numSpans; i++) { - pattern.push(i); - } - return [pattern, []] - } else { - switch (numSpans) { - case 1: - return [[1], []] - case 2: - return [[1, 2], [], [1], [2]] - case 3: - return [[1, 2, 3], [], [1], [2], [3], [1, 2], [1, 3], [2, 3]] - case 4: - // eslint-disable-next-line max-len - return [[1, 2, 3, 4], [], [1], [2], [3], [4], [1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4], [1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]] - case 5: - // eslint-disable-next-line max-len - return [[1, 2, 3, 4, 5], [], [1], [2], [3], [4], [5], [1, 2], [1, 3], [1, 4], [1, 5], [2, 3], [2, 4], [2, 5], [3, 4], [3, 5], [4, 5], [1, 2, 3], [1, 2, 4], [1, 2, 5], [1, 3, 4], [1, 3, 5], [1, 4, 5], [2, 3, 4], [2, 3, 5], [2, 4, 5], [3, 4, 5], [1, 2, 3, 4], [1, 2, 3, 5], [1, 2, 4, 5], [1, 3, 4, 5], [2, 3, 4, 5]] - case 6: - // eslint-disable-next-line max-len - return [[1, 2, 3, 4, 5, 6], [], [1], [2], [3], [4], [5], [6], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [2, 3], [2, 4], [2, 5], [2, 6], [3, 4], [3, 5], [3, 6], [4, 5], [4, 6], [5, 6], [1, 2, 3], [1, 2, 4], [1, 2, 5], [1, 2, 6], [1, 3, 4], [1, 3, 5], [1, 3, 6], [1, 4, 5], [1, 4, 6], [1, 5, 6], [2, 3, 4], [2, 3, 5], [2, 3, 6], [2, 4, 5], [2, 4, 6], [2, 5, 6], [3, 4, 5], [3, 4, 6], [3, 5, 6], [4, 5, 6], [1, 2, 3, 4], [1, 2, 3, 5], [1, 2, 3, 6], [1, 2, 4, 5], [1, 2, 4, 6], [1, 2, 5, 6], [1, 3, 4, 5], [1, 3, 4, 6], [1, 3, 5, 6], [1, 4, 5, 6], [2, 3, 4, 5], [2, 3, 4, 6], [2, 3, 5, 6], [2, 4, 5, 6], [3, 4, 5, 6], [1, 2, 3, 4, 5], [1, 2, 3, 4, 6], [1, 2, 3, 5, 6], [1, 2, 4, 5, 6], [1, 3, 4, 5, 6], [2, 3, 4, 5, 6]] - case 7: - // eslint-disable-next-line max-len - return [[1, 2, 3, 4, 5, 6, 7], [], [1], [2], [3], [4], [5], [6], [7], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [2, 3], [2, 4], [2, 5], [2, 6], [2, 7], [3, 4], [3, 5], [3, 6], [3, 7], [4, 5], [4, 6], [4, 7], [5, 6], [5, 7], [6, 7], [1, 2, 3], [1, 2, 4], [1, 2, 5], [1, 2, 6], [1, 2, 7], [1, 3, 4], [1, 3, 5], [1, 3, 6], [1, 3, 7], [1, 4, 5], [1, 4, 6], [1, 4, 7], [1, 5, 6], [1, 5, 7], [1, 6, 7], [2, 3, 4], [2, 3, 5], [2, 3, 6], [2, 3, 7], [2, 4, 5], [2, 4, 6], [2, 4, 7], [2, 5, 6], [2, 5, 7], [2, 6, 7], [3, 4, 5], [3, 4, 6], [3, 4, 7], [3, 5, 6], [3, 5, 7], [3, 6, 7], [4, 5, 6], [4, 5, 7], [4, 6, 7], [5, 6, 7], [1, 2, 3, 4], [1, 2, 3, 5], [1, 2, 3, 6], [1, 2, 3, 7], [1, 2, 4, 5], [1, 2, 4, 6], [1, 2, 4, 7], [1, 2, 5, 6], [1, 2, 5, 7], [1, 2, 6, 7], [1, 3, 4, 5], [1, 3, 4, 6], [1, 3, 4, 7], [1, 3, 5, 6], [1, 3, 5, 7], [1, 3, 6, 7], [1, 4, 5, 6], [1, 4, 5, 7], [1, 4, 6, 7], [1, 5, 6, 7], [2, 3, 4, 5], [2, 3, 4, 6], [2, 3, 4, 7], [2, 3, 5, 6], [2, 3, 5, 7], [2, 3, 6, 7], [2, 4, 5, 6], [2, 4, 5, 7], [2, 4, 6, 7], [2, 5, 6, 7], [3, 4, 5, 6], [3, 4, 5, 7], [3, 4, 6, 7], [3, 5, 6, 7], [4, 5, 6, 7], [1, 2, 3, 4, 5], [1, 2, 3, 4, 6], [1, 2, 3, 4, 7], [1, 2, 3, 5, 6], [1, 2, 3, 5, 7], [1, 2, 3, 6, 7], [1, 2, 4, 5, 6], [1, 2, 4, 5, 7], [1, 2, 4, 6, 7], [1, 2, 5, 6, 7], [1, 3, 4, 5, 6], [1, 3, 4, 5, 7], [1, 3, 4, 6, 7], [1, 3, 5, 6, 7], [1, 4, 5, 6, 7], [2, 3, 4, 5, 6], [2, 3, 4, 5, 7], [2, 3, 4, 6, 7], [2, 3, 5, 6, 7], [2, 4, 5, 6, 7], [3, 4, 5, 6, 7], [1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 7], [1, 2, 3, 4, 6, 7], [1, 2, 3, 5, 6, 7], [1, 2, 4, 5, 6, 7], [1, 3, 4, 5, 6, 7], [2, 3, 4, 5, 6, 7]] - // We cannot get here. - } - } -} - -function populateMAM(loadFactors, combern, loadPattern, beam, nodes, spans, actions) { - let mam = new Array(beam.numEndActions).fill(0); // Member end Action Matrix - const numSpans = spans.length - 1; - const numNodes = nodes.length - 1; - const numPatterns = beam.numPatterns; - const didNode = new Array(numNodes); - - // Fill mam with dead load - const deadLoadFactor = loadFactors[1]; - mam = mam.map((e, i) => deadLoadFactor * actions[1][i]); - for (let i = 1; i <= numSpans; i++) { - nodes[i].Pf = deadLoadFactor * nodes[i].P[1]; - nodes[i].Mf = deadLoadFactor * nodes[i].M[1]; - for (let j = 0; j < spans[i].segments.length; j++) { - const seg = spans[i].segments[j]; - seg.w1f[combern] = deadLoadFactor * seg.w1[1]; - seg.w2f = deadLoadFactor * seg.w2[1]; - seg.Pf = deadLoadFactor * seg.P[1]; - seg.Mf = deadLoadFactor * seg.M[1]; - } - } - - // Superimpose the other load types onto mam. - for (let iLoadType = 2; iLoadType <= 9; iLoadType++) { - const loadFactor = loadFactors[iLoadType]; - if (loadFactor > 0 && beam.gotType[iLoadType]) { - if (!beam.getsPattern[iLoadType] || numPatterns === 1) { - mam = mam.map((e, i) => e + loadFactor * actions[iLoadType][i]); - for (let i = 1; i <= numSpans; i++) { - nodes[i].Pf = nodes[i].Pf + loadFactor * nodes[i].P[iLoadType]; - nodes[i].Mf = nodes[i].Mf + loadFactor * nodes[i].M[iLoadType]; - for (let j = 0; j < spans[i].segments.length; j++) { - const seg = spans[i].segments[j]; - seg.w1f[combern] = seg.w1f[combern] + loadFactor * seg.w1[iLoadType]; - seg.w2f = seg.w2f + loadFactor * seg.w2[iLoadType]; - seg.Pf = seg.Pf + loadFactor * seg.P[iLoadType]; - seg.Mf = seg.Mf + loadFactor * seg.M[iLoadType]; - } - } - } else { - // load case includes live load patterns - for (let k = 1; k <= numSpans; k++) { - if (loadPattern.includes(k)) { - let ii = 0; - for (let j = 1; j <= numSpans; j++) { - ii = 5 * j - 4; - mam[ii] = mam[ii] + loadFactor * actions[iLoadType][ii][k - 1]; - mam[ii + 1] = mam[ii + 1] + loadFactor * actions[iLoadType][ii + 1][k - 1]; - mam[ii + 2] = mam[ii + 2] + loadFactor * actions[iLoadType][ii + 2][k - 1]; - mam[ii + 3] = mam[ii + 3] + loadFactor * actions[iLoadType][ii + 3][k - 1]; - mam[ii + 4] = mam[ii + 4] + loadFactor * actions[iLoadType][ii + 4][k - 1]; - } - mam[ii + 5] = mam[ii + 5] + loadFactor * actions[iLoadType][ii + 5][k - 1]; - } - } - - // Do node loads. - // Include a node load if the span on either side is in the load pattern. - didNode.fill(false); - for (let i = 1; i <= numSpans; i++) { - if (loadPattern.includes(i)) { - if (!didNode[i]) { - nodes[i].Pf = nodes[i].Pf + loadFactor * nodes[i].P[iLoadType]; - nodes[i].Mf = nodes[i].Mf + loadFactor * nodes[i].M[iLoadType]; - didNode[i] = true; - } - if (!didNode[i + 1]) { - nodes[i + 1].Pf = nodes[i + 1].Pf + loadFactor * nodes[i + 1].P[iLoadType]; - nodes[i + 1].Mf = nodes[i + 1].Mf + loadFactor * nodes[i + 1].M[iLoadType]; - didNode[i + 1] = true; - } - } - for (let j = 0; j < spans[i].segments.length; j++) { - const seg = spans[i].segments[j]; - if (loadPattern.includes(i)) { - seg.w1f[combern] = seg.w1f[combern] + loadFactor * seg.w1[iLoadType]; - seg.w2f = seg.w2f + loadFactor * seg.w2[iLoadType]; - seg.Pf = seg.Pf + loadFactor * seg.P[iLoadType]; - seg.Mf = seg.Mf + loadFactor * seg.M[iLoadType]; - } - } - } - } - } - } - - for (let i = 1; i <= numSpans; i++) { - for (let j = 0; j < spans[i].segments.length; j++) { - const seg = spans[i].segments[j]; - if (seg.length !== 0) { - seg.slope[combern] = (seg.w2f - seg.w1f[combern]) / seg.length; - } - } - } - return mam -} - -function combine(beam, nodes, spans, actions, deflections, comboSet) { - // We already have member end actions for each load type on each span. - // In this function, we superimpose the load combinations and live load patterns and - // find the maximum and minimum shears and moments. - const numSpans = spans.length - 1; - const isService = comboSet === "service"; - if (isService) { comboSet = [[0, 1, 1, 1, 1, 1, 1, 1, 1, 1]]; } - const liveLoadPatterns = getLoadPatterns(beam, numSpans); - const numPatterns = liveLoadPatterns.length; - - let vMin = 0; - let vMax = 0; - let mMin = 0; - let mMax = 0; - let deflectionMax = 0; - let deflMaxCase = 0; - let deflectionMin = 0; - let deflMinCase = 0; - - // Get ready to do lots of different load combinations. - // Definition: "combern" is a conflation of the words "combination" and "pattern". - const numComberns = getNumComberns(comboSet, isService, beam, numPatterns); - - for (let i = 1; i <= numSpans; i++) { - for (let j = 0; j < spans[i].segments.length; j++) { - const seg = spans[i].segments[j]; - seg.w1f = new Array(numComberns).fill(0); - seg.w2f = 0; - seg.slope = new Array(numComberns).fill(0); - seg.V1 = new Array(numComberns).fill(0); - seg.M1 = new Array(numComberns).fill(0); - if (beam.EI !== 1) { - seg.theta1 = new Array(numPatterns).fill(0); - seg.delta1 = new Array(numPatterns).fill(0); - } - } - } - - // The number of interations through this next loop will be a function of - // both the number of load combinations and the number of load patterns. - // I define "combern" as a conflation of the words "combination" & "pattern" - // "combern" will be the loop index as we look at unique combinations of both - // load combinations and live load patterns. - // Each time through the loop, we;ll get the factored loads and the factored MAM - // To do this, we'll make much use of a subroutine called "PopulateMAM" - // It's called as: PopulateMAM loadFactors, combern, iPattern - // The load factors are factors from the ASCE or NBCC load combinations - - // As you can see below, we'll find a unique MAM for each iCombo and live load pattern. - // Then, we'll use the MAM to find the segment shears, moments, etc. - - let combern = 0; - - // iCombo 0 is for deflections only. We'll go thru each load pattern. - // iCombo 1 thru comboSet.length is for finding shear and moment extremes. As code - // requires, this often means testing many load combinations. - - for (let iCombo = 0; iCombo <= comboSet.length; iCombo++) { - const isReqd = iCombo === 0 && beam.EI !== 0 - ? true // Go thru each load pattern and find deflection extremes. - : isService - ? true - : isReqdCombo(comboSet[iCombo - 1], beam.gotType); - - if (isReqd) { - const loadFactors = iCombo === 0 && beam.EI !== 0 - ? [0, 1, 1, 1, 1, 1, 1, 1, 1, 1] - : comboSet[iCombo - 1]; - - for (let iPattern = 0; iPattern < numPatterns; iPattern++) { - const loadPattern = liveLoadPatterns[iPattern]; - - // Get the Member Action Matrix, MAM, for this combern. - // A MAM contains the end shears and end moments for each span. - const mam = populateMAM(loadFactors, combern, loadPattern, beam, nodes, spans, actions); - - let dm; - if (iCombo === 0 && beam.EI !== 1) { - // Create a Displacement Matrix, DM, for this load combination and load pattern. - dm = new Array(beam.numDegreesOfFreedom + 1).fill(0); - for (let iLoadType = 1; iLoadType < 10; iLoadType++) { - if (beam.gotType[iLoadType]) { - if (beam.getsPattern[iLoadType]) { - dm = getLiveDM(dm, deflections[iLoadType], loadPattern, numSpans); - } else { - dm = dm.map((e, i) => e + deflections[iLoadType][i]); - } - } - } - } - - let iDM = 0; - for (let iSpan = 1; iSpan <= numSpans; iSpan++) { - let vMid = 0; - let vEnd = 0; - let mMid = 0; - let mEnd = 0; - let slopeEnd = 0; - let deflectionEnd = 0; - let deflectionMid = 0; - for (let k = 0; k < spans[iSpan].segments.length; k++) { - const seg = spans[iSpan].segments[k]; - - if (k === 0) { - // The first segment in this span. - seg.V1[combern] = -mam[5 * iSpan - 3]; - seg.M1[combern] = mam[5 * iSpan - 2]; - if (iCombo === 0 && beam.EI !== 1) { - iDM = getThetaAndDelta(nodes[iSpan].fixity, dm, seg, combern, iDM); - } - } else { - // Subsequent segments. - seg.V1[combern] = vEnd + seg.Pf; - seg.M1[combern] = mEnd - seg.Mf; - if (iCombo === 0 && beam.EI !== 1) { - seg.theta1[combern] = slopeEnd; - seg.delta1[combern] = deflectionEnd; - } - } - - vEnd = seg.V1[combern] + seg.w1f[combern] * seg.length - + 0.5 * seg.slope[combern] * seg.length ** 2; - if (Math.abs(vEnd) < 0.00000000000001) { vEnd = 0; } - - mEnd = seg.M1[combern] + seg.V1[combern] * seg.length - + 0.5 * seg.w1f[combern] * seg.length ** 2 - + seg.slope[combern] * seg.length ** 3 / 6; - if (Math.abs(mEnd) < 0.00000000000001) { mEnd = 0; } - - if (iCombo === 0) { - // Check if this load pattern contains a deflection extreme. - if (beam.EI !== 1) { - slopeEnd = seg.theta1[combern] + (seg.M1[combern] * seg.length - + 0.5 * seg.V1[combern] * seg.length ** 2 - + seg.w1f[combern] * seg.length ** 3 / 6 - + seg.slope[combern] * seg.length ** 4 / 24) / beam.EI; - deflectionMid = seg.delta1[combern] + seg.theta1[combern] * 0.5 * seg.length - + (0.5 * seg.M1[combern] * (0.5 * seg.length) ** 2 - + seg.V1[combern] * (0.5 * seg.length) ** 3 / 6 - + seg.w1f[combern] * (0.5 * seg.length) ** 4 / 24 - + seg.slope[combern] * (0.5 * seg.length) ** 5 / 120) / beam.EI; - deflectionEnd = seg.delta1[combern] + seg.theta1[combern] * seg.length - + (0.5 * seg.M1[combern] * seg.length ** 2 - + seg.V1[combern] * seg.length ** 3 / 6 - + seg.w1f[combern] * seg.length ** 4 / 24 - + seg.slope[combern] * seg.length ** 5 / 120) / beam.EI; - if (seg.delta1[combern] > deflectionMax) { - deflectionMax = seg.delta1[combern]; - deflMaxCase = combern; - } - if (seg.delta1[combern] < deflectionMin) { - deflectionMin = seg.delta1[combern]; - deflMaxCase = combern; - } - if (deflectionEnd > deflectionMax) { - deflectionMax = deflectionEnd; - deflMaxCase = combern; - } - if (deflectionEnd < deflectionMin) { - deflectionMin = deflectionEnd; - deflMinCase = combern; - } - if (deflectionMid > deflectionMax) { - deflectionMax = deflectionMid; - deflMaxCase = combern; - } - if (deflectionMid < deflectionMin) { - deflectionMin = deflectionMid; - deflMinCase = combern; - } - } - } else { - // Determine if this combern contains a shear or moment extreme. - // Start by finding the shear value in the middle of the segment - let xCross = 0; // initialze the variable - if (seg.slope[combern] !== 0) { - xCross = -1 * seg.w1f[combern] / seg.slope[combern]; - if (xCross > 0 && xCross < seg.length) { - vMid = seg.V1[combern] + seg.w1f[combern] * xCross - + 0.5 * seg.slope[combern] * xCross ** 2; - } else { - vMid = seg.V1[combern] + seg.w1f[combern] * (seg.length / 2) - + 0.5 * seg.slope[combern] * (seg.length / 2) ** 2; - } - } else { - vMid = seg.V1[combern] + seg.w1f[combern] * (seg.length / 2) - + 0.5 * seg.slope[combern] * (seg.length / 2) ** 2; - } - - // Find the moment in the middle of the segment - xCross = 0; // initialze the variable - if (seg.slope[combern] === 0) { - if (seg.w1f[combern] !== 0) { - xCross = -seg.V1[combern] / seg.w1f[combern]; - } - } else { - if ((seg.w1f[combern] ** 2 - 2 * seg.slope[combern] * seg.V1[combern]) > 0) { - xCross = -(seg.w1f[combern] + Math.sqrt(seg.w1f[combern] ** 2 - - 2 * seg.slope[combern] * seg.V1[combern])) / seg.slope[combern]; - } - } - if (xCross > 0 && xCross < seg.length) { - mMid = seg.M1[combern] + seg.V1[combern] * xCross - + 0.5 * seg.w1f[combern] * xCross ** 2 - + seg.slope[combern] * xCross ** 3 / 6; - } else { - mMid = seg.M1[combern] + seg.V1[combern] * (seg.length / 2) - + 0.5 * seg.w1f[combern] * (seg.length / 2) ** 2 - + seg.slope[combern] * (seg.length / 2) ** 3 / 6; - } - - // Check for local maximums and minimums - if (seg.V1[combern] > seg.Vmax.left.value && seg.V1[combern] > 0.01) { - seg.Vmax.left.value = seg.V1[combern]; - seg.Vmax.left.case = combern; // This is a case that we// ll want to plot - if (seg.V1[combern] > vMax) { vMax = seg.V1[combern]; } - } - - if (vMid > seg.Vmax.mid.value && vMid > 0.01) { - seg.Vmax.mid.value = vMid; - seg.Vmax.mid.case = combern; - if (vMid > vMax) { vMax = vMid; } - } - - if (vEnd > seg.Vmax.right.value && vEnd > 0.01) { - seg.Vmax.right.value = vEnd; - seg.Vmax.right.case = combern; - if (vEnd > vMax) { vMax = vEnd; } - } - - if (seg.V1[combern] < seg.Vmin.left.value && seg.V1[combern] < -0.01) { - seg.Vmin.left.value = seg.V1[combern]; - seg.Vmin.left.case = combern; - if (seg.V1[combern] < vMin) { vMin = seg.V1[combern]; } - } - - if (vMid < seg.Vmin.mid.value && vMid < -0.01) { - seg.Vmin.mid.value = vMid; - seg.Vmin.mid.case = combern; - if (vMid < vMin) { vMin = vMid; } - } - - if (vEnd < seg.Vmin.right.value && vEnd < -0.01) { - seg.Vmin.right.value = vEnd; - seg.Vmin.right.case = combern; - if (vEnd < vMin) { vMin = vEnd; } - } - - if (seg.M1[combern] > seg.Mmax.left.value && seg.M1[combern] > 0.01) { - seg.Mmax.left.value = seg.M1[combern]; - seg.Mmax.left.case = combern; - if (seg.M1[combern] > mMax) { mMax = seg.M1[combern]; } - } - - if (mMid > seg.Mmax.mid.value && mMid > 0.01) { - seg.Mmax.mid.value = mMid; - seg.Mmax.mid.case = combern; - seg.Mmax.mid.x = seg.xOfLeftEnd + xCross; - if (mMid > mMax) { mMax = mMid; } - } - - if (mEnd > seg.Mmax.right.value && mEnd > 0.01) { - seg.Mmax.right.value = mEnd; - seg.Mmax.right.case = combern; - if (mEnd > mMax) { mMax = mEnd; } - } - - if (seg.M1[combern] < seg.Mmin.left.value && seg.M1[combern] < -0.01) { - seg.Mmin.left.value = seg.M1[combern]; - seg.Mmin.left.case = combern; - if (seg.M1[combern] < mMin) { mMin = seg.M1[combern]; } - } - - if (mMid < seg.Mmin.mid.value && mMid < -0.01) { - seg.Mmin.mid.value = mMid; - seg.Mmin.mid.case = combern; - seg.Mmin.mid.x = seg.xOfLeftEnd + xCross; - if (mMid < mMin) { mMin = mMid; } - } - - if (mEnd < seg.Mmin.right.value && mEnd < -0.01) { - seg.Mmin.right.value = mEnd; - seg.Mmin.right.case = combern; - if (mEnd < mMin) { mMin = mEnd; } - } - } - - } - } - combern += 1; - } - } - } - return [vMax, vMin, mMax, mMin, deflectionMax, deflectionMin, - deflMaxCase, deflMinCase, numComberns] -} - -const isReqdCombo = (combo, gotType) => { - let isDeadLoadOnly = true; - for (let j = 2; j < combo.length; j++) { - if (combo[j] > 0) { - isDeadLoadOnly = false; - if (gotType[j]) { return true } - } - } - return isDeadLoadOnly -}; - -/*const comboContainsLive = (combo, beam) => { - for (let i = 1; i <= beam.numLoadTypes; i++) { - if (beam.getsPattern[i] && combo[i] !== 0) { return true } - } - return false -}*/ - -const getNumComberns = (comboSet, isService, beam, numPatterns) => { - // We'll do a superposition of forces for each load combination and each live load pattern. - // How many is that? - // First, count the number of comberns needed to do the deflection superpositions. - let numComberns = beam.EI === 1 ? 1 : numPatterns; - // Then add a combern for each superposition done to get shears and moments. - for (let i = 0; i < comboSet.length; i++) { - if (isService || isReqdCombo(comboSet[i], beam.gotType)) { - numComberns += numPatterns; - } - } - return numComberns -}; - -const getLiveDM = (a, b, loadPattern, numSpans) => { - if (Array.isArray(b[1])) { - for (let k = 1; k <= numSpans; k++) { - if (loadPattern.includes(k)) { - a = a.map((e, i) => e + b[i][k]); - } - } - } else { - a = a.map((e, i) => e + b[i]); - } - return a -}; - -const getThetaAndDelta = (fixity, dm, seg, i, iDM) => { - if (fixity === "fixed") { - seg.delta1[i] = 0; - seg.theta1[i] = 0; - } else if (fixity === "pinned") { - seg.delta1[i] = 0; - iDM = iDM + 1; - seg.theta1[i] = -dm[iDM]; - } else if (fixity === "continuous") { - iDM = iDM + 1; - seg.delta1[i] = -dm[iDM]; - iDM = iDM + 1; - seg.theta1[i] = -dm[iDM]; - } else if (fixity === "spring") { - iDM = iDM + 1; - seg.delta1[i] = -dm[iDM]; - iDM = iDM + 1; - seg.theta1[i] = -dm[iDM]; - } else if (fixity === "proppedHinge") { - iDM = iDM + 1; - seg.delta1[i] = 0; - iDM = iDM + 1; - seg.theta1[i] = -dm[iDM]; - } else if (fixity === "hinge") { - iDM = iDM + 1; - seg.delta1[i] = -dm[iDM]; - iDM = iDM + 1; - iDM = iDM + 1; - seg.theta1[i] = -dm[iDM]; - } - return iDM -}; - -// Review the segments. Find out which comberns should be displayed -function selectCases(spans) { - const shearCases = []; - const bendingCases = []; - for (let i = 1; i < spans.length; i++) { - for (let j = 0; j < spans[i].segments.length; j++) { - const seg = spans[i].segments[j]; - if (seg.Vmax.left.value > 0) { - if (!shearCases.includes(seg.Vmax.left.case)) { - shearCases.push(seg.Vmax.left.case); - } - } - if (seg.Vmin.left.value < 0) { - if (!shearCases.includes(seg.Vmin.left.case)) { - shearCases.push(seg.Vmin.left.case); - } - } - if (seg.Mmax.left.value > 0) { - if (!bendingCases.includes(seg.Mmax.left.case)) { - bendingCases.push(seg.Mmax.left.case); - } - } - if (seg.Mmin.left.value < 0) { - if (!bendingCases.includes(seg.Mmin.left.case)) { - bendingCases.push(seg.Mmin.left.case); - } - } - if (seg.Vmax.mid.value > 0) { - if (!shearCases.includes(seg.Vmax.mid.case)) { - shearCases.push(seg.Vmax.mid.case); - } - } - if (seg.Vmin.mid.value < 0) { - if (!shearCases.includes(seg.Vmin.mid.case)) { - shearCases.push(seg.Vmin.mid.case); - } - } - if (seg.Mmax.mid.value > 0) { - if (!bendingCases.includes(seg.Mmax.mid.case)) { - bendingCases.push(seg.Mmax.mid.case); - } - } - if (seg.Mmin.mid.value < 0) { - if (!bendingCases.includes(seg.Mmin.mid.case)) { - bendingCases.push(seg.Mmin.mid.case); - } - } - if (seg.Vmax.right.value > 0) { - if (!shearCases.includes(seg.Vmax.right.case)) { - shearCases.push(seg.Vmax.right.case); - } - } - if (seg.Vmin.right.value < 0) { - if (!shearCases.includes(seg.Vmin.right.case)) { - shearCases.push(seg.Vmin.right.case); - } - } - if (seg.Mmax.right.value > 0) { - if (!bendingCases.includes(seg.Mmax.right.case)) { - bendingCases.push(seg.Mmax.right.case); - } - } - if (seg.Mmin.right.value < 0) { - if (!bendingCases.includes(seg.Mmin.right.case)) { - bendingCases.push(seg.Mmin.right.case); - } - } - } - } - return [shearCases, bendingCases] -} - -function locateDiagrams(beam, extremes) { - // Find the y-coordinates for the shear, moment, and deflection diagrams. - - // First, find out how many reaction vectors will be written onto the load diagram. - const [vMax, vMin, mMax, mMin, deflectionMax, deflectionMin, , , ] = extremes; - - const vScale = vMax - vMin > 0 ? 60 / (vMax - vMin) : 0; - const mScale = mMax - mMin > 0 ? 60 / (mMax - mMin) : 0; - const reactionTextHeight = 16; - - let yV = vMax > 0.0005 - ? beam.yLoad + 12 + reactionTextHeight + vMax * vScale + 70 - : beam.yLoad + 12 + reactionTextHeight; - yV = Math.round(yV); - const botOfV = vMin < -0.0005 - ? yV + vMin * vScale + 50 - : yV + 70; - const momentMax = beam.convention === 1 ? mMax : Math.abs(mMin); - const momentMin = beam.convention === 1 ? Math.abs(mMin) : mMax; - let yM = momentMax > 0.0005 - ? botOfV + 12 + momentMax * mScale + 40 - : botOfV + 12; - yM = Math.round(yM); - let yMax = yM; - - // Get yText for moment - let yText = yM - mScale * mMin; - if (yText > yMax) { yMax = yText; } - - let yDeflection = 0; - let deflectionScale = 0; - if (beam.EI !== 1) { - // eslint-disable-next-line max-len - if (deflectionMax > deflectionMin) { deflectionScale = 30 / (deflectionMax - deflectionMin); } - const botOfM = momentMin > (0.05 * momentMax) - ? yM + momentMin * mScale + 14 - : yM + 14; - yDeflection = botOfM + 60 + deflectionMax * deflectionScale; - yDeflection = Math.round(yDeflection); - yMax = yDeflection; - if (Math.abs(deflectionMin) > 0.2 * (deflectionMax - deflectionMin)) { - yText = yDeflection - deflectionScale * deflectionMin; - if (yText > yMax) { yMax = yText; } - } - } - yMax += 20; - - return [yV, yM, yDeflection, vScale, mScale, deflectionScale, yMax] - -} - -function drawDiagrams(beam, nodes, spans, cases, yCoords, extremes, combinations) { - let diagram = []; - // Now go thru the comberns again. Draw the line work this time. - const numSpans = spans.length - 1; - const [vMax, vMin, mMax, mMin, , , deflMaxCase, deflMinCase, numComberns] = extremes; - const [shearCases, bendingCases] = cases; - const [yV, yM, yDeflection, vScale, mScale, deflectionScale] = yCoords; - const vSmall = 0.01 * (vMax - vMin); - const mSmall = 0.05 * (mMax - mMin); - let deflectionMax = 0; - let deflectionMin = 0; - let xDeflectionMax = 0; - let xDeflectionMin = 0; - const xIncrement = beam.length / 50; - const wV = []; - const wVx = []; - const wM = []; - const wMx = []; - const horizAlign = "middle"; - - // Draw the horizontal lines for the shear and moment diagrams - diagram.push(Draw.textNode("shear", 20, yV + 2)); - diagram.push(Draw.textNode(`(${beam.SI ? "kN" : "kips"})`, 20, yV + 16)); - diagram.push({ - tag: "path", - attrs: { d: `M${beam.xDiagram} ${yV} h300`, stroke: "black", "stroke-width": '1.5px' } - }); - diagram.push(Draw.textNode("bending", 20, yM + 2)); - diagram.push(Draw.textNode(`(${beam.SI ? "kN-m" : "kip-ft"})`, 20, yM + 16)); - diagram.push({ - tag: "path", - attrs: { d: `M${beam.xDiagram} ${yM} h300`, stroke: "black", "stroke-width": '1.5px' } - }); - - if (combinations !== "service") { - diagram.push(Draw.textNode("factored", 20, yV - 12)); - diagram.push(Draw.textNode("factored", 20, yM - 12)); - } - - // Draw the reactions. - let f = 0; - for (let i = 1; i < nodes.length; i++) { - const x = beam.xDiagram + beam.xScale * nodes[i].x; - if (Math.abs(nodes[i].Pr[0]) > 0) { - f = 1 / (beam.SI ? 1000 : 4448.2216152605); - const sText = round$1(nodes[i].Pr[0] * f, 3); - diagram = diagram.concat(Draw.pointForce(x, beam.yLoad, sText, nodes[i].fixity, true)); - } - if (Math.abs(nodes[i].Mr[0]) > 0) { - f = 1 / (beam.SI ? 1000 : 4448.2216152605 * 0.3048); - const sText = round$1(nodes[i].Mr[0] * f, 3); - diagram = diagram.concat(Draw.pointMoment(x, beam.yLoad, sText, true)); - } - } - - for (let combern = 0; combern <= numComberns; combern++) { - // Are we in a deflection combern? - const inaDeflCase = (deflMinCase === combern || deflMaxCase === combern) && beam.EI !== 1; - // Should we plot this combern? - if (!(shearCases.includes(combern) || bendingCases.includes(combern) || inaDeflCase)) { - continue // Skip this combern. - } - // This is a combern for which we should plot the line work - // Find detailed shear and moments for the diagrams. And we check local maximums to see - // if we should write their values onto the diagram. - let lastVend = 0; - let lastW2f = 0; - const x = inaDeflCase ? [] : [0]; - const deflection = []; - const v = []; - const m = []; - if (!inaDeflCase) { - v.push(0); - m.push(0); - } - let k = 0; - for (let i = 1; i <= numSpans; i++) { - for (let j = 0; j < spans[i].segments.length; j++) { - const seg = spans[i].segments[j]; - const vEnd = seg.V1[combern] + seg.w1f[combern] * seg.length - + 0.5 * seg.slope[combern] * seg.length ** 2; - const mEnd = seg.M1[combern] + seg.V1[combern] * seg.length - + 0.5 * seg.w1f[combern] * seg.length ** 2 + seg.slope[combern] * seg.length ** 3 / 6; - const w2f = seg.w1f[combern] + seg.slope[combern] * seg.length; - let deflectionEnd = 0; - if (inaDeflCase) { - deflectionEnd = seg.delta1[combern] + seg.theta1[combern] * seg.length - + (0.5 * seg.M1[combern] * seg.length ** 2 + seg.V1[combern] * seg.length ** 3 / 6 - + seg.w1f[combern] * seg.length ** 4 / 24 - + seg.slope[combern] * seg.length ** 5 / 120) / beam.EI; - } - // Details for line work - let xLocal = 0; - k += 1; - x.push(seg.xOfLeftEnd); - if (inaDeflCase) { - deflection.push(seg.delta1[combern]); - if (seg.delta1[combern] > deflectionMax) { - deflectionMax = seg.delta1[combern]; - xDeflectionMax = seg.xOfLeftEnd; - } - if (seg.delta1[combern] < deflectionMin) { - deflectionMin = seg.delta1[combern]; - xDeflectionMin = seg.xOfLeftEnd; - } - if (deflectionEnd > deflectionMax) { - deflectionMax = deflectionEnd; - xDeflectionMax = seg.xOfLeftEnd + seg.length; - } - if (deflectionEnd < deflectionMin) { - deflectionMin = deflectionEnd; - xDeflectionMin = seg.xOfLeftEnd + seg.length; - } - } else { - v.push(seg.V1[combern]); - m.push(seg.M1[combern]); - } - - for (let ii = 1; ii <= Math.trunc(seg.length / xIncrement); ii++) { - k = k + 1; - x.push(x[x.length - 1] + xIncrement); - xLocal += xIncrement; - if (inaDeflCase) { - deflection.push(seg.delta1[combern] + seg.theta1[combern] * xLocal - + (0.5 * seg.M1[combern] * xLocal ** 2 - + seg.V1[combern] * xLocal ** 3 / 6 + seg.w1f[combern] * xLocal ** 4 / 24 - + seg.slope[combern] * xLocal ** 5 / 120) / beam.EI); - if (deflection[deflection.length - 1] > deflectionMax) { - deflectionMax = deflection[deflection.length - 1]; - xDeflectionMax = seg.xOfLeftEnd + xLocal; - } - if (deflection[deflection.length - 1] < deflectionMin) { - deflectionMin = deflection[deflection.length - 1]; - xDeflectionMin = seg.xOfLeftEnd + xLocal; - } - } else { - v.push(seg.V1[combern] + seg.w1f[combern] * xLocal - + 0.5 * seg.slope[combern] * xLocal ** 2); - m.push(seg.M1[combern] + seg.V1[combern] * xLocal - + 0.5 * seg.w1f[combern] * xLocal ** 2 + seg.slope[combern] * xLocal ** 3 / 6); - } - } - - k += 1; - x.push(seg.xOfLeftEnd + seg.length); - if (inaDeflCase) { - deflection.push(deflectionEnd); - } else { - v.push(vEnd); - m.push(mEnd); - } - - // Check for local maximums and minimums - if (seg.Vmax.left.case === combern || seg.Vmin.left.case === combern) { - // Do we also want to write this value onto the shear diagram? - if (i === 1 && j === 0) { - if (Math.abs(seg.V1[combern]) > vSmall) { - checkVs(seg.V1[combern], 0, wV, wVx, spans, beam.length); - } - } else if (!(lastW2f === seg.w1f[combern] && - Math.abs(seg.V1[combern] - lastVend) < vSmall)) { - checkVs(seg.V1[combern], seg.xOfLeftEnd, wV, wVx, spans, beam.length); - } - } - - if (seg.Vmax.mid.case === combern || seg.Vmin.mid.case === combern) { - let xCross = 0; - if (seg.slope[combern] !== 0) { - xCross = -1 * seg.w1f[combern] / seg.slope[combern]; - if (xCross > 0 && xCross < seg.length) { - const vMid = seg.V1[combern] + seg.w1f[combern] * xCross - + 0.5 * seg.slope[combern] * xCross ** 2; - checkVs(vMid, seg.xOfLeftEnd + xCross, wV, wVx, spans, beam.length); - } - } - } - - if (seg.Vmax.right.case === combern || seg.Vmin.right.case === combern) { - if (Math.abs(vEnd) > vSmall) { - checkVs(vEnd, seg.xOfLeftEnd + seg.length, wV, wVx, spans, beam.length); - } - } - - if (seg.Mmax.left.case === combern || seg.Mmin.left.case === combern) { - if (i === 1 && j === 0) { - if (Math.abs(seg.M1[combern]) > mSmall) { - checkMs(seg.M1[combern], 0, wM, wMx, spans, beam.length, mSmall); - } - } else { - checkMs(seg.M1[combern], seg.xOfLeftEnd, wM, - wMx, spans, beam.length, mSmall); - } - } - - if (seg.Mmax.mid.case === combern || seg.Mmin.mid.case === combern) { - let xCross = 0; // initialze the variable - let mMid = 0; - if (seg.slope[combern] === 0) { - if (seg.w1f[combern] !== 0) { - xCross = -seg.V1[combern] / seg.w1f[combern]; - if (xCross > 0 && xCross < seg.length) { - mMid = seg.M1[combern] + seg.V1[combern] * xCross - + 0.5 * seg.w1f[combern] * xCross ** 2 + seg.slope[combern] * xCross ** 3 / 6; - checkMs(mMid, seg.xOfLeftEnd + xCross, wM, wMx, spans, beam.length, mSmall); - } - } - } else { - let mMid1 = 0; - let mMid2 = 0; - let xCross1 = 0; - let xCross2 = 0; - if ((seg.w1f[combern] ** 2 - 2 * seg.slope[combern] * seg.V1[combern]) > 0) { - const determinant = Math.sqrt(seg.w1f[combern] ** 2 - - 2 * seg.slope[combern] * seg.V1[combern]); - xCross1 = -(seg.w1f[combern] - determinant) / seg.slope[combern]; - xCross2 = -(seg.w1f[combern] + determinant) / seg.slope[combern]; - if (xCross1 > 0 && xCross1 < seg.length) { - xCross = xCross1; - mMid1 = seg.M1[combern] + seg.V1[combern] * xCross - + 0.5 * seg.w1f[combern] * xCross ** 2 + seg.slope[combern] * xCross ** 3 / 6; - } - if (xCross2 > 0 && xCross2 < seg.length) { - xCross = xCross2; - mMid2 = seg.M1[combern] + seg.V1[combern] * xCross - + 0.5 * seg.w1f[combern] * xCross ** 2 + seg.slope[combern] * xCross ** 3 / 6; - } - } - if (mMid1 > 0 || mMid2 > 0) { - if (mMid1 > mMid2) { - mMid = mMid1; - xCross = xCross1; - } else { - mMid = mMid2; - xCross = xCross2; - } - } - if (xCross > 0 && xCross < seg.length) { - mMid = seg.M1[combern] + seg.V1[combern] * xCross - + 0.5 * seg.w1f[combern] * xCross ** 2 + seg.slope[combern] * xCross ** 3 / 6; - checkMs(mMid, seg.xOfLeftEnd + xCross, wM, wMx, spans, beam.length, mSmall); - } - } - } - - if (seg.Mmax.right.case === combern || seg.Mmin.right.case === combern) { - checkMs(mEnd, seg.xOfLeftEnd + seg.length, wM, wMx, spans, beam.length, mSmall); - } - - lastW2f = w2f; - lastVend = vEnd; - } - } - - // Plot diagrams - const numDataPoints = k; - - // Draw the shear diagrams - if (shearCases.includes(combern)) { - let xPoly; - let yPoly; - - if (beam.allLoadsAreUniform) { - // Make the shear diagram out of straight lines. - let linearV = new Array(2 * beam.numSegments + 3).fill(0); - linearV = linearV.map(e => [0, 0]); - k = 1; - linearV[k][0] = beam.xDiagram; - linearV[k][1] = yV; - for (let i = 1; i <= numSpans; i++) { - for (let j = 0; j < spans[i].segments.length; j++) { - const seg = spans[i].segments[j]; - k = k + 1; - linearV[k][0] = beam.xDiagram + beam.xScale * seg.xOfLeftEnd; - linearV[k][1] = yV - vScale * seg.V1[combern]; - k = k + 1; - linearV[k][0] = beam.xDiagram + beam.xScale * (seg.xOfLeftEnd + seg.length); - const vEnd = seg.V1[combern] + seg.w1f[combern] * seg.length - + 0.5 * seg.slope[combern] * seg.length ** 2; - linearV[k][1] = yV - vScale * vEnd; - } - } - k = k + 1; - linearV[k][0] = beam.xDiagram + beam.xScale * beam.length; - linearV[k][1] = yV; - const numOfShearDataPoints = k; - - xPoly = new Array(numOfShearDataPoints - 1); - yPoly = new Array(numOfShearDataPoints - 1); - for (let ii = 1; ii <= numOfShearDataPoints; ii++) { - xPoly[ii - 1] = linearV[ii][0].toFixed(2); - yPoly[ii - 1] = linearV[ii][1].toFixed(2); - } - - } else { - xPoly = new Array(numDataPoints + 1).fill(0); - yPoly = new Array(numDataPoints + 1).fill(0); - for (let ii = 0; ii < numDataPoints; ii++) { - xPoly[ii] = (beam.xDiagram + beam.xScale * x[ii]).toFixed(2); // x(ii) - yPoly[ii] = (yV - vScale * v.shift()).toFixed(2); - } - xPoly[numDataPoints] = beam.xDiagram + 300; - yPoly[numDataPoints] = yV; - } - diagram.push(Draw.polyline(xPoly, yPoly)); - } - - // Draw the moment diagram - if (bendingCases.includes(combern)) { - const xPoly = new Array(numDataPoints + 1).fill(0); - const yPoly = new Array(numDataPoints + 1).fill(0); - for (let ii = 0; ii <= numDataPoints; ii++) { - xPoly[ii] = (beam.xDiagram + beam.xScale * x[ii]).toFixed(2); // x(ii) - yPoly[ii] = (yM - beam.convention * mScale * m.shift()).toFixed(2); // M(ii) - } - xPoly[numDataPoints + 1] = beam.xDiagram + 300; - yPoly[numDataPoints + 1] = yM; - diagram.push(Draw.polyline(xPoly, yPoly)); - } - - if (inaDeflCase) { - // Draw the deflection diagram - diagram.push(Draw.textNode("deflection", 20, yDeflection + 2)); - diagram.push({ - tag: "path", - attrs: { d: `M${beam.xDiagram} ${yDeflection} h300`, - stroke: "black", "stroke-width": '1.5px' } - }); - const xPoly = new Array(numDataPoints - 1).fill(0); - const yPoly = new Array(numDataPoints - 1).fill(0); - xPoly[0] = beam.xDiagram.toFixed(2); - yPoly[0] = yDeflection.toFixed(2); - for (let ii = 1; ii <= numDataPoints - 1; ii++) { - xPoly[ii] = (beam.xDiagram + beam.xScale * x[ii]).toFixed(2); // x(ii) - yPoly[ii] = (yDeflection - deflectionScale * deflection[ii]).toFixed(2); - } - diagram.push(Draw.polyline(xPoly, yPoly)); - } - } - - // Write the values of the local shear maximums onto the diagrams. - f = 1 / (beam.SI ? 1000 : 4448.2216152605); // conversion factor for N to kips or MN - while (wV.length > 0) { - const xText = (beam.xDiagram + beam.xScale * wVx.shift()).toFixed(2); - const fudge = wV[0] > 0 ? -2 : 13; - const yText = (yV - vScale * wV[0] + fudge).toFixed(2); - // horizAlign is middle - diagram.push(Draw.textNode(round$1(wV.shift() * f, 3), xText, yText, horizAlign)); - } - - // Write the values of the local bending maximums onto the diagrams. - f = beam.convention / (beam.SI ? 1000 : 4448.2216152605 * 0.3048); - while (wM.length > 0) { - const xText = (beam.xDiagram + beam.xScale * wMx.shift()).toFixed(2); - const fudge = beam.convention * wM[0] > 0 ? -2 : 13; - const yText = (yM - beam.convention * mScale * wM[0] + fudge).toFixed(2); - const sText = round$1(wM.shift() * f, 3); - diagram.push(Draw.textNode(sText, xText, yText, horizAlign)); - } - - if (beam.EI !== 1) { - // Insert the max and min deflection values - beam.deflectionMax = Math.max(Math.abs(deflectionMax), Math.abs(deflectionMin)); - f = beam.SI ? 1000 : (12 / 0.3048); - let sText = ""; - let xText = 0; - let yText = 0; - if (deflectionMax > 0.2 * (deflectionMax - deflectionMin)) { - xText = beam.xDiagram + beam.xScale * xDeflectionMax; - yText = yDeflection - deflectionScale * deflectionMax - 2; - if (beam.SI) { - sText = round$1(deflectionMax * f, 1) + " mm"; - } else { - sText = round$1(deflectionMax * f, 2) + '″'; - } - diagram.push(Draw.textNode(sText, xText, yText, horizAlign)); - } - if (Math.abs(deflectionMin) > 0.2 * (deflectionMax - deflectionMin)) { - xText = beam.xDiagram + beam.xScale * xDeflectionMin; - yText = yDeflection - deflectionScale * deflectionMin + 13; - if (beam.SI) { - sText = round$1(f * deflectionMin, 1) + " mm"; - } else { - sText = round$1(f * deflectionMin, 2) + '″'; - } - diagram.push(Draw.textNode(sText, xText, yText, horizAlign)); - } - } - - return diagram -} - -const checkVs = (v, x, wV, wVx, spans, beamLength) => { - // Check if we should write this value onto the shear diagram - let gottaWrite = true; // initialize the variable - const shortDistance = 0.15 * beamLength; - - for (let i = 1; i < spans.length; i++) { - for (let k = 0; k < spans[i].segments.length; k++) { - const seg = spans[i].segments[k]; - const xOfRightEnd = seg.xOfLeftEnd + seg.length; - if (xOfRightEnd < x - shortDistance) { continue } - if (seg.xOfLeftEnd > x + shortDistance) { continue } - - if (Math.abs(seg.xOfLeftEnd - x) < shortDistance) { - if (v > 0) { - if (seg.Vmax.left.value > v) { - gottaWrite = false; - break - } - } else if (seg.Vmin.left.value < v) { - gottaWrite = false; - break - } - } - - const xRightEnd = seg.xOfLeftEnd + seg.length; - if (Math.abs(x - xRightEnd < shortDistance)) { - if (v > 0) { - if (seg.Vmax.right.value > v) { - gottaWrite = false; - break - } - } else if (seg.Vmin.right.value < v) { - gottaWrite = false; - break - } - } - } - } - - if (gottaWrite) { - wV.push(v); - wVx.push(x); - } -}; - -const checkMs = (m, x, wM, wMx, spans, beamLength, mSmall) => { - // Check if we should write this value onto the moment diagram - if (Math.abs(m) < mSmall) { return false } - let gottaWrite = true; // initialize the variable - const shortDistance = 0.15 * beamLength; - - for (let i = 1; i < spans.length; i++) { - for (let k = 0; k < spans[i].segments.length; k++) { - const seg = spans[i].segments[k]; - const xOfRightEnd = seg.xOfLeftEnd + seg.length; - if (xOfRightEnd < x - shortDistance) { continue } - if (seg.xOfLeftEnd > x + shortDistance) { continue } - - if (Math.abs(seg.xOfLeftEnd - x) < shortDistance) { - if (m > 0) { - if (seg.Mmax.left.value > m) { - gottaWrite = false; - break - } - } else if (seg.Mmin.left.value < m) { - gottaWrite = false; - break - } - } - - if (m > 0 && Math.abs(seg.Mmax.mid.x - x) < shortDistance) { - if (seg.Mmax.mid.value > m) { - gottaWrite = false; - break - } - } - if (m < 0 && Math.abs(seg.Mmin.mid.x - x) < shortDistance) { - if (seg.Mmin.mid.value < m) { - gottaWrite = false; - break - } - } - - const xRightEnd = seg.xOfLeftEnd + seg.length; - if (Math.abs(x - xRightEnd < shortDistance)) { - if (m > 0) { - if (seg.Mmax.right.value > m) { - gottaWrite = false; - break - } - } else if (seg.Mmin.right.value < m) { - gottaWrite = false; - break - } - } - } - } - - if (gottaWrite) { - wM.push(m); - wMx.push(x); - } -}; - -function error(msg) { - if (msg === "") { return { value: "Error", unit: null, dtype: dt.ERROR } } - return { value: msg, unit: null, dtype: dt.ERROR } -} - -const beamDiagram = (beamInputData, loadFactorInput) => { - // This is the main analysis function. - - // Get raw data from the input dataframe. - const beamInput = readInputData(beamInputData); - if (typeof beamInput === "string") { return error(beamInput) } - - // Validate input and populate data structures. - const [errorMsg, beam, nodes, spans, combinations] = populateData(beamInput, loadFactorInput); - if (errorMsg) { return error(errorMsg) } - - // Start the SVG - const svg = { tag: 'svg', children: [], attrs: { float: "right" } }; - - // Create the first diagram. Show fixities, lengths, and loads. - const loadDiagram = createLoadDiagram(beam, nodes, spans); - svg.children = svg.children.concat(loadDiagram); - - // Do the linear algebra. For each load type, get member end actions and node displacements. - const [actions, deflections] = doAnalysis(beam, nodes, spans); - - // Determine shear, moment, and deflection maximums and minimums by superimposing - // the relevent load combinations and live load patterns. - const extremes = combine(beam, nodes, spans, actions, deflections, combinations); - - // Decide which combinations get plotted. - const cases = selectCases(spans); - - // Find the y coordinates for the shear, moment, and deflection diagrams. - const yCoords = locateDiagrams(beam, extremes); - const yMax = yCoords[6]; // Diagram overall height in local coords. - - const diagrams = drawDiagrams(beam, nodes, spans, cases, yCoords, extremes, combinations); - svg.children = svg.children.concat(diagrams); - - // Set the outer dimensions of the diagram. - svg.attrs.width = "375"; // px - svg.attrs.height = (375 / 450 * yMax).toFixed(0); - svg.attrs.viewBox = `0 0 450 ${yMax.toFixed(0)}`; - - return svg - -}; - -// evaluate.js - -/* - * This module receives an RPN string and a object containing Hurmet variables. - * It does the calculation, doing unit-compatibility checks along the way. - * It returns a result in two formats: (1) a TeX string that can be displayed and - * (2) numeric and unit data that can used for calculations by other cells. - * - * Hurmet does automatic unit conversions and checks for unit compatibility. - * Compatibility checks are done by keeping track of the unit exponents. - * So for instance if we divide an area by a length, the unit exponent calculation runs as: - * LENGTH^2 / LENGTH^1 = LENGTH^(2-1) = LENGTH^1 - * We keep track of unit exponents for each of 9 base dimensions. That's why - * you see an array of 9 integers occuring in the code below. - * - * Inside evalRpn(), Hurmet operands are each an object with three fields: - * value: the value of the operand - * unit: holds unit info, either unit name, an array of exponents, or a unitMap - * dtype: an integer indicating data type. - * - * Note that an operand can be two data types at once, such as RATIONAL and MATRIX. - * In such cases, dtype is the sum of the two underlying integers. - * So, in constants.js, we have enumerated the data types in powers of two. - * That way, we can use a bit-wise "&" operator to test for an individual type. - * - * Numeric matrices and numeric maps can have math operations done to them. - * We distinguish numeric matrices from other matrices by the fact that - * (oprnd.dtype & dt.RATIONAL) returns a true if the matrix is numeric. - * - * File operands.js contains further explanation of Hurmet operands. - */ - -// Some helper functions - -const setComparisons = ["in", "!in", "∈", "∉", "∋", "∌", "⊂", "⊄", "⊃", "⊅"]; - -const shapeOf = oprnd => { - return oprnd.dtype === dt.COMPLEX - ? "complex" - : oprnd.dtype < 128 - ? "scalar" - : isVector(oprnd) - ? "vector" - : (oprnd.dtype & dt.MATRIX) - ? "matrix" - : oprnd.dtype === dt.DATAFRAME - ? "dataFrame" - : (oprnd.dtype & dt.MAP) - ? "map" - : "other" -}; - -const binaryShapesOf = (o1, o2) => { - let shape1 = shapeOf(o1); - let shape2 = shapeOf(o2); - let needsMultBreakdown = false; - if ((isMatrix(o1) || (o1.dtyp & dt.MAP)) && (isMatrix(o2) || (o2.dtype & dt.MAP))) { - // If both operands are matrices, we need to return more information. - // That enables the various ways to multiply two matrices. - needsMultBreakdown = true; - if (shape1 === "vector") { - shape1 = (o1.dtype & dt.ROWVECTOR) ? "rowVector" : "columnVector"; - } - if (shape2 === "vector") { - shape2 = (o2.dtype & dt.ROWVECTOR) ? "rowVector" : "columnVector"; - } - } - return [shape1, shape2, needsMultBreakdown] -}; - -const matrixMults = { "×": "cross", "·": "dot", "∘": "circ", ".*": "circ", - "*": "multiply", "∗": "multiply", "⌧": "multiply" }; - -const nextToken = (tokens, i) => { - if (tokens.length < i + 2) { return undefined } - return tokens[i + 1] -}; - -// array of function names that return a real number from a complex argument. -const arfn = ["abs", "angle", "imag", "real", "Γ", "gamma"]; - -const stringFromOperand = (oprnd, decimalFormat) => { - return oprnd.dtype === dt.STRING - ? oprnd.value - : oprnd.dtype === dt.RATIONAL - ? format(oprnd.value, "h15", decimalFormat) - : isMatrix(oprnd.dtype) - ? Matrix.displayAlt(oprnd, "h15", decimalFormat) - : (oprnd.dtype & dt.MAP) - ? DataFrame.displayAlt(oprnd.value, "h15", decimalFormat) - : oprnd.value -}; - -const evalRpn = (rpn, vars, decimalFormat, unitAware, lib) => { - // This is the function that does calculations with the rpn string. - const tokens = rpn.split("\u00A0"); - const stack = []; - let oPrev; - for (let i = 0; i < tokens.length; i++) { - const tkn = tokens[i]; - const ch = tkn.charAt(0); - - if (ch === "®") { - // A rational number. - const r = new Array(2); - const pos = tkn.indexOf("/"); - r[0] = BigInt(tkn.slice(1, pos)); // numerator - r[1] = BigInt(tkn.slice(pos + 1)); // denominator - const num = Object.create(null); - num.value = r; - num.unit = Object.create(null); - num.unit.expos = allZeros; - num.dtype = dt.RATIONAL; - stack.push(Object.freeze(num)); - - } else if (ch === "©") { - // A complex number. - const ints = tkn.slice(1).split(","); - const z = new Array(2); - z[0] = [BigInt(ints[0]), BigInt(ints[1])]; // real part - z[1] = [BigInt(ints[2]), BigInt(ints[3])]; // imaginary part - const num = Object.create(null); - num.value = z; - num.unit = Object.create(null); - num.unit.expos = allZeros; - num.dtype = dt.COMPLEX; - stack.push(Object.freeze(num)); - - } else if (ch === "¿") { - // A variable. Get the value from vars - const varName = tkn.substring(1); - let oprnd = Object.create(null); - if (varName === "undefined") { - oprnd.value = undefined; - oprnd.unit = null; - oprnd.dtype = 0; - } else if (varName === "T" && nextToken(tokens, i) === "^" && - stack.length > 0 && isMatrix(stack[stack.length - 1])) { - i += 1; - oprnd = Matrix.transpose(stack.pop()); - } else if (varName === "j" && !vars.j) { - oprnd.value = [Rnl.zero, Rnl.one]; - oprnd.unit = Object.create(null); - oprnd.unit.expos = allZeros; - oprnd.dtype = dt.COMPLEX; - } else { - const cellAttrs = vars[varName]; - if (!cellAttrs) { return errorOprnd("V_NAME", varName) } - oprnd = fromAssignment(cellAttrs, unitAware); - if (oprnd.dtype === dt.ERROR) { return oprnd } - } - stack.push(Object.freeze(oprnd)); - - } else if (ch === '"') { - // A string literal. - const chEnd = tkn.charAt(tkn.length - 1); - const str = ch === '"' && chEnd === '"' ? tkn.slice(1, -1) : tkn; - stack.push(Object.freeze({ value: str, unit: null, dtype: dt.STRING })); - - } else if (/^``/.test(tkn)) { - stack.push(DataFrame.dataFrameFromTSV(tablessTrim(tkn.slice(2, -2)), vars)); - - } else if (ch === '`') { - // A rich text literal - const chEnd = tkn.charAt(tkn.length - 1); - const str = ch === '`' && chEnd === '`' ? tkn.slice(1, -1).trim() : tkn.trim(); - stack.push(Object.freeze({ value: str, unit: null, dtype: dt.RICHTEXT })); - - } else { - switch (tkn) { - case "true": - case "false": { - const bool = Object.create(null); - bool.value = tkn === "true"; - bool.unit = null; - bool.dtype = dt.BOOLEAN; - stack.push(Object.freeze(bool)); - break - } - - case "pi": - case "π": { - const pi = Object.create(null); - pi.value = Rnl.pi; - pi.dtype = dt.RATIONAL; - pi.unit = Object.create(null); - pi.unit.expos = allZeros; - stack.push(Object.freeze(pi)); - break - } - - case "e": { - const e = Object.create(null); - e.value = "e"; - e.dtype = dt.RATIONAL; - e.unit = Object.create(null); - e.unit.expos = allZeros; - stack.push(Object.freeze(e)); - break - } - - case "ℏ": { - // Reduced Plank constant - const hbar = Object.create(null); - hbar.value = Rnl.hbar; - hbar.dtype = dt.RATIONAL; - hbar.unit = Object.create(null); - hbar.unit.expos = Object.freeze(unitAware ? [2, 1, -1, 0, 0, 0, 0, 0] : allZeros); - stack.push(Object.freeze(hbar)); - break - } - - case "∠": { - // Complex number in polar notation. - const o2 = stack.pop(); - const o1 = stack.pop(); - if (o1.dtype !== dt.RATIONAL || o2.dtype !== dt.RATIONAL) { - return errorOprnd("NAN_OP") - } - const theta = Rnl.toNumber(o2.value); - const z = Object.create(null); - z.value = [ - Rnl.multiply(o1.value, Rnl.fromNumber(Math.cos(theta))), // real part - Rnl.multiply(o1.value, Rnl.fromNumber(Math.sin(theta))) // imaginary part - ]; - z.unit = Object.create(null); - z.unit.expos = allZeros; - z.dtype = dt.COMPLEX; - stack.push(Object.freeze(z)); - break - } - - case "+": - case ".+": - case "-": - case ".-": { - const o2 = stack.pop(); - const o1 = stack.pop(); - const op = tkn === "+" || tkn === ".+" ? "add" : "subtract"; - if (!(((o1.dtype & dt.RATIONAL) || (o1.dtype & dt.COMPLEX)) && - ((o2.dtype & dt.RATIONAL) || (o2.dtype & dt.COMPLEX)))) { - return errorOprnd("NAN_OP") - } - if (unitAware) { - if (!unitsAreCompatible(o1.unit.expos, o2.unit.expos)) { - return errorOprnd("UNIT_ADD") - } - } - const [shape1, shape2, _] = binaryShapesOf(o1, o2); - const sum = Object.create(null); - // See file operations.js for an explanation of what goes on in the next line. - sum.value = Operators.binary[shape1][shape2][op](o1.value, o2.value); - if (sum.value.dtype && sum.value.dtype === dt.ERROR) { return sum.value } - sum.unit = o1.unit; - sum.dtype = Operators.dtype[shape1][shape2](o1.dtype, o2.dtype, tkn); - stack.push(Object.freeze(sum)); - break - } - - case "~": { - // Unary minus - const o1 = stack.pop(); - if (!((o1.dtype & dt.RATIONAL) || o1.dtype === dt.COMPLEX)) { - return errorOprnd("NAN_OP") - } - const neg = Object.create(null); - neg.value = Operators.unary[shapeOf(o1)]["negate"](o1.value); - if (neg.value.dtype && neg.value.dtype === dt.ERROR) { return neg.value } - neg.unit = o1.unit; - neg.dtype = o1.dtype; - stack.push(Object.freeze(neg)); - break - } - - case "×": - case "·": - case "*": - case "∗": - case "∘": - case "⌧": { - const oprnd2 = stack.pop(); - const o2 = oprnd2.dtype === dt.DATAFRAME ? clone(oprnd2) : oprnd2; - const o1 = stack.pop(); - if ((tkn === "*" || tkn === "∗") - && o1.dtype === dt.STRING && o1.dtype === dt.STRING) { - // Julia's string concatenation operator - const str1 = stringFromOperand(o1, decimalFormat); - const str2 = stringFromOperand(o2, decimalFormat); - return { value: str1 + str2, unit: null, dtype: dt.STRING } - } - if (!(((o1.dtype & dt.RATIONAL) || (o1.dtype & dt.COMPLEX)) && - ((o2.dtype & dt.RATIONAL) || (o2.dtype & dt.COMPLEX) || - o2.dtype === dt.DATAFRAME))) { - return errorOprnd("NAN_OP") - } - const product = Object.create(null); - let unit = Object.create(null); - if (unitAware) { - if ((o1.dtype === dt.DATAFRAME && o2.dtype === dt.RATIONAL) || - (o1.dtype === dt.RATIONAL && o2.dtype === dt.DATAFRAME)) { - unit = o1.dtype === dt.DATAFRAME ? o1.unit : o2.unit; - } else { - unit.expos = o1.unit.expos.map((e, j) => e + o2.unit.expos[j]); - } - } else { - unit.expos = allZeros; - } - product.unit = o2.dtype === dt.DATAFRAME ? clone(o2.unit) : Object.freeze(unit); - - const [shape1, shape2, needsMultBreakdown] = binaryShapesOf(o1, o2); - const op = needsMultBreakdown ? matrixMults[tkn] : "multiply"; - - product.dtype = (tkn === "∘" || shape1 === "scalar" || shape1 === "map" || - shape1 === "complex" || shape2 === "scalar" || - shape2 === "map" || shape2 === "complex") - ? Operators.dtype[shape1][shape2](o1.dtype, o2.dtype, op) - : tkn === "·" - ? dt.RATIONAL - : tkn === "×" - ? dt.COLUMNVECTOR - : Matrix.multResultType(o1, o2); - - product.value = Operators.binary[shape1][shape2][op](o1.value, o2.value); - if (product.value.dtype && product.value.dtype === dt.ERROR) { - return product.value - } - - stack.push(Object.freeze(product)); - break - } - - case "/": - case "./": - case "//": - case "///": - case "\u2215": { - const o2 = stack.pop(); - const o1 = stack.pop(); - if (!(((o1.dtype & dt.RATIONAL) || o1.dtype === dt.COMPLEX) && - ((o2.dtype & dt.RATIONAL) || o2.dtype === dt.COMPLEX))) { - return errorOprnd("NAN_OP") - } - const quotient = Object.create(null); - const unit = Object.create(null); - unit.expos = unitAware - ? o1.unit.expos.map((e, j) => e - o2.unit.expos[j]) - : allZeros; - quotient.unit = Object.freeze(unit); - const [shape1, shape2, _] = binaryShapesOf(o1, o2); - quotient.value = Operators.binary[shape1][shape2]["divide"](o1.value, o2.value); - if (quotient.value.dtype && quotient.value.dtype === dt.ERROR) { - return quotient.value - } - quotient.dtype = Operators.dtype[shape1][shape2](o1.dtype, o2.dtype, "divide"); - if (isDivByZero(quotient.value, shapeOf(quotient))) { return errorOprnd("DIV") } - stack.push(Object.freeze(quotient)); - break - } - - case "^": - case ".^": { - const o2 = stack.pop(); - const o1 = stack.pop(); - if (!(((o1.dtype & dt.RATIONAL) || o1.dtype === dt.COMPLEX) && - ((o2.dtype & dt.RATIONAL) || o2.dtype === dt.COMPLEX) || - (isMatrix(o1) && o2.value === "T"))) { - return errorOprnd("NAN_OP") - } - const power = Object.create(null); - const unit = Object.create(null); - unit.expos = allZeros; - if (unitAware) { - // TODO: lots to do here - const d = typeof o2.unit === "number" ? o2.unit : Rnl.toNumber(o2.value); - unit.expos = o1.unit.expos.map(e => e * d); - } - power.unit = Object.freeze(unit); - const [shape1, shape2, _] = binaryShapesOf(o1, o2); - power.value = Operators.binary[shape1][shape2]["power"](o1.value, o2.value); - if (power.value.dtype) { return power.value } // Error - power.dtype = Cpx.isComplex(power.value) - ? dt.COMPLEX - : Operators.dtype[shape1][shape2](o1.dtype, o2.dtype, tkn); - stack.push(Object.freeze(power)); - break - } - - case "&": - case "hcat": - case "vcat": { - // Concatenation - const o2 = stack.pop(); - const o1 = stack.pop(); - const opName = tkn === "vcat" ? "unshift" : "concat"; - const [shape1, shape2, _] = binaryShapesOf(o1, o2); - let o3 = Object.create(null); - if (o1.dtype === dt.STRING && o1.dtype === dt.STRING) { - const str1 = stringFromOperand(o1, decimalFormat); - const str2 = stringFromOperand(o2, decimalFormat); - o3.value = str1 + str2; - o3.unit = null; - o3.dtype = dt.STRING; - } else if ((o1.dtype & dt.DATAFRAME) && isVector(o2) && tkn !== "vcat") { - o3 = DataFrame.append(o1, o2, vars.format.value, unitAware); - if (o3.dtype === dt.ERROR) { return o3 } - } else if (((o1.dtype & dt.DATAFRAME) && shape2 === "scalar") || - (shape1 === "scalar" && (o2.dtype & dt.DATAFRAME))) { - o3 = DataFrame.append(o1, o2, vars.format.value, unitAware); - if (o3.dtype === dt.ERROR) { return o3 } - } else if ((o1.dtype & dt.MAP) || (o2.dtype & dt.MAP)) { - o3 = map.append(o1, o2, shape1, shape2); - if (o3.dtype === dt.ERROR) { return o3 } - } else { - if (unitAware) { - if (!unitsAreCompatible(o1.unit.expos, o2.unit.expos)) { - return errorOprnd("UNIT_ADD") - } - } - o3.value = Operators.binary[shape1][shape2][opName](o1.value, o2.value); - if (o3.value.dtype) { return o3.value } // Error - o3.dtype = Operators.dtype[shape1][shape2](o1.dtype, o2.dtype, tkn); - if (o1.dtype === dt.COLUMNVECTOR && shape2 === "scalar") { - // Appending an element to an empty column vector - o3.dtype = o1.dtype + o2.dtype; - } - o3.unit = o1.unit; - } - stack.push(Object.freeze(o3)); - break - } - - case "√": - case "∛": - case "∜": { - const index = tkn.charCodeAt(0) - 8728; - const pow = [BigInt(1), BigInt(index)]; - const o1 = stack.pop(); - if (!((o1.dtype & dt.RATIONAL) || (o1.dtype & dt.COMPLEX))) { - return errorOprnd("NAN_OP") - } - const root = Object.create(null); - const unit = Object.create(null); - unit.expos = allZeros; - if (unitAware) { unit.expos = o1.unit.expos.map(e => e / index); } - root.unit = Object.freeze(unit); - - const shape1 = shapeOf(o1); - root.value = Operators.binary[shape1]["scalar"]["power"](o1.value, pow); - if (root.value.dtype && root.value.dtype === dt.ERROR) { return root.value } - - root.dtype = Cpx.isComplex(root.value) - ? dt.COMPLEX - : Operators.dtype[shape1]["scalar"](o1.dtype, dt.RATIONAL, tkn); - - stack.push(Object.freeze(root)); - break - } - - case "root": { - const o2 = stack.pop(); - const o1 = stack.pop(); - if (!((o1.dtype & dt.RATIONAL) & (o2.dtype & dt.RATIONAL))) { - return errorOprnd("NAN_OP") - } - const root = Object.create(null); - const unit = Object.create(null); - unit.expos = allZeros; - if (unitAware) { unit.expos = o2.unit.expos.map(e => e / Number(o1.value[0])); } - root.unit = Object.freeze(unit); - - const pow = Rnl.reciprocal(o1.value); - const shape1 = shapeOf(o1); - root.value = Operators.binary[shape1]["scalar"]["power"](o2.value, pow); - if (root.value.dtype && root.value.dtype === dt.ERROR) { return root.value } - - root.dtype = Operators.dtype[shape1]["scalar"](o1.dtype, dt.RATIONAL, tkn); - stack.push(Object.freeze(root)); - break - } - - case ".": { - // Accessor of a object's property in dot notation - const o2 = stack.pop(); - const o1 = stack.pop(); - const property = propertyFromDotAccessor(o1, o2, unitAware); - if (property.dtype === dt.ERROR) { return property } - stack.push(Object.freeze(property)); - break - } - - case "[]": { - // Bracket accessor to a data frame, matrix, string, map, or module. - const numArgs = Number(tokens[i + 1]); - i += 1; - const args = []; - for (let j = 0; j < numArgs; j++) { args.unshift(stack.pop()); } - const o1 = stack.pop(); - let property; - if (o1.dtype & dt.DATAFRAME) { - property = DataFrame.range(o1, args, unitAware); - - } else if (o1.dtype & dt.MAP) { - property = map.range(o1, args, unitAware); - - } else if (o1.dtype === dt.STRING) { - property = textRange(o1.value, args[0]); - - } else if (o1.dtype === dt.MODULE) { - if (numArgs === 1) { - property = fromAssignment(o1.value[args[0].value], unitAware); - } else { - // Multiple assignment. - property = { value: new Map(), unit: null, dtype: dt.TUPLE }; - for (let j = 0; j < args.length; j++) { - const name = args[j].value; - property.value.set(name, fromAssignment(o1.value[name], unitAware)); - } - } - - } else { - // o1 is a matrix or a data frame - const rowIndex = args[0]; - const colIndex = (numArgs === 2) - ? args[1] - : isVector(o1) - ? null - : { value: Rnl.zero, unit: allZeros, dtype: dt.RATIONAL }; - property = (o1.dtype & dt.DATAFRAME) - ? DataFrame.range(o1, rowIndex, colIndex, unitAware) - : Matrix.submatrix(o1, rowIndex, colIndex); - } - if (property.dtype === dt.ERROR) { return property } - stack.push(Object.freeze(property)); - break - } - - case ":": { - // range separator. - const end = stack.pop(); - const o1 = stack.pop(); - if (!(o1.dtype === dt.RATIONAL || o1.dtype === dt.RANGE)) { - return errorOprnd("NAN_OP") - } - const range = Object.create(null); - range.unit = null; - range.dtype = dt.RANGE; - const step = o1.dtype !== dt.RATIONAL - ? o1.value[2] - : end.value === "∞" || Rnl.lessThanOrEqualTo(o1.value, end.value) - ? Rnl.one - : Rnl.negate(Rnl.one); - range.value = o1.dtype === dt.RATIONAL - ? [o1.value, step, end.value] - : [o1.value[0], o1.value[2], end.value]; - stack.push((Object.freeze(range))); - break - } - - case "normal": - case "uniform": - case "lognormal": { - // eslint-disable-next-line no-unused-vars - stack.pop(); - // eslint-disable-next-line no-unused-vars - stack.pop(); - // low and high define a probablility distribution. They are the ends of a - // uniform distribution or they mark the 90% confidence interval of (log)normal. - // TODO: Implement probability distributions as a data type. - break - } - - case "!": - case "‼": - case "!!": { - // TODO: "!!" and "¡" - const o1 = stack.pop(); - if (!(o1.dtype & dt.RATIONAL)) { return errorOprnd("NAN_OP") } - if (unitAware) { - if (!unitsAreCompatible(o1.unit.expos, allZeros)) { return errorOprnd("FACT") } - } - const x = o1.value; - if (!Rnl.isInteger(x) || Rnl.isNegative(x)) { return errorOprnd("FACT") } - const factorial = Object.create(null); - factorial.unit = allZeros; - factorial.dtype = dt.RATIONAL; - factorial.value = tkn === "!" - ? Operators.unary[shapeOf(o1)]["factorial"](x) - : Operators.unary[shapeOf(o1)]["doubleFactorial"](x); - if (factorial.value.dtype) { return factorial.value } // Error - stack.push(Object.freeze(factorial)); - break - } - - case "%": { - // TODO: per thousand, ‰ - const o1 = stack.pop(); - if (!(o1.dtype & dt.RATIONAL)) { return errorOprnd("NAN_OP") } - const percentage = Object.create(null); - percentage.unit = o1.unit; - percentage.dtype = o1.dtype; - percentage.value = Operators.unary[shapeOf(o1)]["percent"](o1.value); - if (percentage.value) { return percentage.value } // Error - stack.push(Object.freeze(percentage)); - break - } - - case "|": - case "‖": { - // Find |x| or ‖x‖ - const o1 = stack.pop(); - if (!((o1.dtype & dt.RATIONAL) || o1.dtype === dt.COMPLEX)) { - return errorOprnd("NAN_OP") - } - const op = tkn === "|" ? "abs" : "norm"; - const abs = Object.create(null); - abs.unit = o1.unit; - abs.dtype = dt.RATIONAL; - abs.value = Operators.unary[shapeOf(o1)][op](o1.value); - if (abs.value.dtype && abs.value.dtype === dt.ERROR) { return abs.value } - stack.push(Object.freeze(abs)); - break - } - - case "matrix": { - // matrix - const numRows = Number(tokens[i + 1]); - const numCols = Number(tokens[i + 2]); - i += 2; - - const result = (stack.length > 0 && stack[stack.length - 1].dtype === dt.RANGE) - ? Matrix.operandFromRange(stack.pop().value) // Input was [start:step:end...] - : Matrix.operandFromTokenStack(stack, numRows, numCols); - if (result.dtype === dt.ERROR) { return result } - stack.push(result); - break - } - - case "tuple": { - const numItems = Number(tokens[i + 1]); - i += 1; - const oprnd = { value: [], unit: null, dtype: dt.TUPLE }; - for (let j = 0; j < numItems; j++) { - oprnd.value.unshift(stack.pop()); - } - stack.push(oprnd); - break - } - - case "startSvg": - stack.push({ value: draw.startSvg(), unit: null, dtype: dt.DRAWING }); - break - - case "beamDiagram": { - const numArgs = Number(tokens[i + 1]); - i += 1; - let combinations = "service"; - if (numArgs === 2) { combinations = stack.pop().value; } - const beam = stack.pop(); - if (!(beam.dtype & dt.MAP)) { return errorOprnd("BAD_TYPE", "beamDiagram") } - const diagram = beamDiagram(beam.value.data, combinations); - if (diagram.dtype && diagram.dtype === dt.ERROR) { return diagram } - stack.push({ value: diagram, resultdisplay: diagram, unit: null, dtype: dt.DRAWING }); - break - } - - case "abs": - case "cos": - case "sin": - case "tan": - case "acos": - case "asin": - case "atan": - case "sec": - case "csc": - case "cot": - case "asec": - case "acsc": - case "acot": - case "exp": - case "log": - case "ln": - case "log10": - case "log2": - case "cosh": - case "sinh": - case "tanh": - case "sech": - case "csch": - case "coth": - case "acosh": - case "asinh": - case "atanh": - case "asech": - case "acsch": - case "acoth": - case "gamma": - case "Γ": - case "lgamma": - case "lfact": - case "factorial": - case "cosd": - case "sind": - case "tand": - case "acosd": - case "asind": - case "atand": - case "secd": - case "cscd": - case "cotd": - case "asecd": - case "acscd": - case "acotd": - case "real": - case "imag": - case "angle": - case "conj": - case "ceil": - case "floor": - case "Char": - case "round": - case "sqrt": - case "sign": { - // Functions with one real or complex argument. - const arg = stack.pop(); - if (!((arg.dtype & dt.RATIONAL) || (arg.dtype & dt.COMPLEX))) { - return errorOprnd("UNREAL", tkn) - } - - const output = Object.create(null); - const unit = Object.create(null); - unit.expos = unitAware ? Functions.functionExpos(tkn, [arg]) : allZeros; - if (unit.expos.dtype && unit.expos.dtype === dt.ERROR) { return unit.expos } - output.unit = tkn === "Char" ? null : Object.freeze(unit); - - const shape = (arg.dtype & dt.RATIONAL) ? "scalar" : "complex"; - let value; - if (arg.dtype & dt.MAP) { - value = arg.value; - value.data = value.data.map(col => Rnl.isRational(col[0]) - ? col.map(e => Functions.unary[shape][tkn](e)) - : col - ); - } else { - value = isVector(arg) - ? arg.value.map(e => Functions.unary[shape][tkn](e)) - : isMatrix(arg) - ? arg.value.map(row => row.map(e => Functions.unary[shape][tkn](e))) - : Functions.unary[shape][tkn](arg.value); - } - if (value.dtype && value.dtype === dt.ERROR) { return value } - output.value = Object.freeze(value); - - output.dtype = tkn === "Char" - ? arg.dtype - dt.RATIONAL + dt.STRING - : (arg.dtype & dt.COMPLEX) && arfn.includes(tkn) - ? arg.dtype - dt.COMPLEX + dt.RATIONAL - : arg.dtype; - - stack.push(Object.freeze(output)); - break - } - - case "logn": - case "atan2": - case "hypot": - case "gcd": - case "rms": - case "binomial": - case "ones": - case "zeros": - case "mod": - case "rem": { - // Functions with two real arguments. - const args = []; - args.push(stack.pop()); - args.unshift(stack.pop()); - if (!(args[0].dtype & dt.RATIONAL)) { return errorOprnd("") } - - const output = Object.create(null); - const unit = Object.create(null); - unit.expos = unitAware ? Functions.functionExpos(tkn, args) : allZeros; - if (unit.dtype && unit.dtype === dt.ERROR) { return unit } - output.unit = Object.freeze(unit); - - const [value, dtype] = multivarFunction("binary", tkn, args); - if (dtype === dt.ERROR) { return value } - output.value = Object.freeze(value); - output.dtype = dtype; - stack.push(Object.freeze(output)); - break - } - - case "Int": { - const arg = stack.pop(); - const output = Object.create(null); - output.unit = { expos: allZeros }; - if (!(arg.dtype & dt.BOOLEAN)) { return errorOprnd("LOGIC", "Int") } - output.value = isVector(arg) - ? arg.value.map(e => Rnl.fromNumber(Number(e))) - : isMatrix(arg) - ? arg.value.map(row => row.map(e => Rnl.fromNumber(Number(e)))) - : Rnl.fromNumber(Number(arg.value)); - output.dtype = arg.dtype - dt.BOOLEAN + dt.RATIONAL; - stack.push(Object.freeze(output)); - break - } - - case "number": { - const arg = stack.pop(); - const output = Object.create(null); - output.unit = { expos: allZeros }; - if (!(arg.dtype & dt.STRING)) { return errorOprnd("STRING") } - output.value = isVector(arg) - ? arg.value.map(e => Rnl.fromString(e)) - : isMatrix(arg) - ? arg.value.map(row => row.map(e => Rnl.fromString(e))) - : Rnl.fromString(arg.value); - output.dtype = arg.dtype - dt.STRING + dt.RATIONAL; - stack.push(Object.freeze(output)); - break - } - - case "findmax": { - const arg = stack.pop(); - let max = arg.value[0]; - let index = 1; - if (!(isVector(arg) && (arg.dtype & dt.RATIONAL))) { - return errorOprnd("NOT_VECTOR", "findmax") - } - for (let i = 1; i < arg.value.length; i++) { - if (Rnl.greaterThan(arg.value[i], max)) { - max = arg.value[i]; - index = Rnl.fromNumber(i + 1); - } - } - const tuple = { value: new Map(), unit: null, dtype: dt.TUPLE }; - tuple.value.set("max", { value: max, unit: allZeros, dtype: dt.RATIONAL }); - tuple.value.set("index", { value: index, unit: allZeros, dtype: dt.RATIONAL }); - stack.push(tuple); - break - } - - case "findfirst": { - const numArgs = Number(tokens[i + 1]); - i += 1; - const args = []; - args.push(stack.pop()); - if (numArgs === 2) {args.unshift(stack.pop()); } - const isString = numArgs === 2 && (args[1].dtype & dt.STRING); - const output = Object.create(null); - output.unit = { expos: allZeros }; - output.value = isString && isVector(args[1]) - ? args[1].value.map(e => findfirst(args[0], e)) - : isString && isMatrix(args[1]) - ? args[1].value.map(row => row.map(e => findfirst(args[0], e))) - : isString - ? findfirst(args[0], args[1]) - : numArgs === 1 - ? Matrix.findfirst(true, args[0]) - : isVector(args[1]) - ? Matrix.findfirst(args[0].value, args[1]) - : errorOprnd("ERR_FUNC", "Error. Did not understand arguments"); - if (isString) { - output.dtype = args[1].dtype - dt.STRING + dt.RATIONAL; - } else { - output.dtype = dt.RATIONAL; - } - stack.push(Object.freeze(output)); - break - } - - case "roundn": - case "string": { - // Round a numeric value. - const spec = stack.pop(); - const num = stack.pop(); - if (!(num.dtype & dt.RATIONAL)) { return errorOprnd("") } - if (!(spec.dtype & dt.STRING)) { return errorOprnd("") } - if (!/(?:[fr])\d+/.test(spec.value)) { return errorOprnd("") } - let funcName = ""; - const output = Object.create(null); - if (tkn === "string") { - funcName = spec.value.charAt() === "f" ? "stringFixed" : "stringSignificant"; - output.unit = null; - output.dtype = num.dtype - dt.RATIONAL + dt.STRING; - } else { - funcName = spec.value.charAt() === "f" ? "roundFixed" : "roundSignificant"; - output.unit = num.unit; - output.dtype = num.dtype; - } - const n = Number(spec.value.slice(1)); - let value; - if (num.dtype & dt.MAP) { - value = num.value; - value.data = value.data.map( - col => Rnl.isRational(col[0]) - ? col.map(e => Functions.binary[funcName][tkn]([e, n])) - : col - ); - } else { - value = isVector(num) - ? num.value.map(e => Functions.binary[funcName]([e, n])) - : isMatrix(num) - ? num.value.map(row => row.map(e => Functions.binary[funcName]([e, n]))) - : Functions.binary[funcName]([num.value, n]); - } - if (value.dtype && value.dtype === dt.ERROR) { return value } - output.value = Object.freeze(value); - if (num.name) { output.name = num.name; } - stack.push(Object.freeze(output)); - break - } - - case "dataframe": - case "max": - case "min": - case "sum": - case "product": - case "range": - case "mean": - case "median": - case "variance": - case "stddev": - case "accumulate": { - // Functions that reduce multiple arguments to one result. - // TODO: unit-aware reducing functions. - const numArgs = Number(tokens[i + 1]); - i += 1; - const args = []; - for (let j = 0; j < numArgs; j++) { - const datum = stack.pop(); - if (tkn !== "dataframe" && !(datum.dtype & dt.RATIONAL)) { - return errorOprnd("NANARG", tkn) - } - args.unshift(datum); - } - - if (tkn === "dataframe") { - const df = DataFrame.dataFrameFromVectors(args, vars.format.value); - if (df.dtype && df.dtype === dt.ERROR) { return df } - stack.push(df); - break - } - - const output = Object.create(null); - const unit = Object.create(null); - unit.expos = unitAware ? Functions.functionExpos(tkn, args) : allZeros; - if (unit.dtype && unit.dtype === dt.ERROR) { return errorOprnd("") } - output.unit = Object.freeze(unit); - - const [value, dtype] = multivarFunction("reduce", tkn, args); - if (dtype === dt.ERROR) { return value } - output.value = Object.freeze(value); - output.dtype = dtype; - stack.push(Object.freeze(output)); - break - } - - case "rand": { - const numArgs = Number(tokens[i + 1]); - i += 1; - if (numArgs === 0) { - const value = Rnl.fromNumber(Math.random()); - stack.push({ value, unit: allZeros, dtype: dt.RATIONAL }); - } else if (numArgs === 1) { - const n = Rnl.toNumber(stack.pop().value); - if (!Number.isInteger(n)) { return errorOprnd("INT_ARG", "rand") } - const value = new Array(n).fill(0) - .map(e => Rnl.fromNumber(Math.random())); - stack.push({ value, unit: allZeros, dtype: dt.RATIONAL + dt.COLUMNVECTOR }); - } else if (numArgs === 2) { - const n = Rnl.toNumber(stack.pop().value); - if (!Number.isInteger(n)) { return errorOprnd("INT_ARG", "rand") } - const m = Rnl.toNumber(stack.pop().value); - if (!Number.isInteger(m)) { return errorOprnd("INT_ARG", "rand") } - let value = new Array(m).fill(new Array(n).fill(0)); - value = value.map(row => row.map(e => Rnl.fromNumber(Math.random()))); - stack.push({ value, unit: allZeros, dtype: dt.RATIONAL + dt.MATRIX }); - } else { - return errorOprnd("BAD_ARGS", "rand") - } - break - } - - case "isnan": { - const oprnd = stack.pop(); - const output = Object.create(null); - output.value = !(oprnd.dtype & dt.RATIONAL); - output.unit = null; - output.dtype = dt.BOOLEAN; - stack.push(Object.freeze(output)); - break - } - - case "length": { - const arg = stack.pop(); - const value = arg.value; - const length = isVector(arg) - ? value.length - : (arg.dtype & dt.MATRIX) - ? value.length * value[0].length - : (arg.dtype === dt.STRING) - ? Array.from(value).length - : (arg.dtype & dt.MAP) - ? arg.keys().value.length - : 0; - const output = Object.create(null); - output.value = Object.freeze(Rnl.fromNumber(length)); - output.unit = Object.create(null); - output.unit.expos = allZeros; - output.dtype = dt.RATIONAL; - stack.push(Object.freeze(output)); - break - } - - case "count": { - const pattern = stack.pop(); - const str = stack.pop(); - if (pattern.dtype !== dt.STRING || str.dtype !== dt.STRING) { - return errorOprnd("COUNT") - } - const output = Object.create(null); - output.value = Object.freeze( - Rnl.fromNumber(str.value.split(pattern.value).length - 1) - ); - output.unit = Object.create(null); - output.unit.expos = allZeros; - output.dtype = dt.RATIONAL; - stack.push(Object.freeze(output)); - break - } - - case "format": { - const formatSpec = stack.pop().value; - const str = format(stack.pop().value, formatSpec); - stack.push({ value: str, unit: null, dtype: dt.STRING }); - break - } - - case "lerp": { - // linear interpolation function - const args = new Array(3); - args[2] = stack.pop(); - args[1] = stack.pop(); - args[0] = stack.pop(); - const result = Functions.lerp(args, unitAware); - if (result.dtype === dt.ERROR) { return result } - stack.push(result); - break - } - - case "matrix2table": { - const numArgs = Number(tokens[i + 1]); - i += 1; - const rowNames = numArgs === 3 ? stack.pop().value : []; - const colNames = stack.pop().value; - const matrix = stack.pop(); - const result = DataFrame.matrix2table(matrix, colNames, rowNames); - if (result.dtype === dt.ERROR) { return result } - stack.push(result); - break - } - - case "transpose": - stack.push(Matrix.transpose(stack.pop())); - break - - case "trace": - stack.push(Matrix.trace(stack.pop())); - break - - case "fetch": - // fetch() is handled in updateCalculations.js. - // It's easier from there to coordinate an async function with ProseMirror. - // So if control flow get here, we have an error. - return errorOprnd("FETCH") - - case "function": { - // User defined function. - const functionName = tokens[i + 1]; - const numArgs = Number(tokens[i + 2]); - i += 2; - const args = new Array(numArgs); - for (let j = numArgs - 1; j >= 0; j--) { - args[j] = stack.pop(); - } - let oprnd; - if (vars.svg && (functionName === "plot" || (draw.functions[functionName]))) { - if (functionName === "plot") { - args.splice(1, 0, decimalFormat); - oprnd = plot(...args); - } else if (functionName === "path") { - oprnd = draw.functions[functionName](args[0], args.slice(1)); - } else { - oprnd = draw.functions[functionName](...args); - } - } else if (nextToken(tokens, i) === ".") { - // Function from a module - let lib = stack.pop().value; // remote module - if (lib.value) { lib = lib.value; } // local module - const udf = lib[functionName]; - if (udf === undefined) { return errorOprnd("F_NAME", functionName) } - if (udf.dtype === dt.ERROR) { return udf } - oprnd = evalCustomFunction(udf, args, decimalFormat, unitAware, lib); - i += 1; - } else if (lib && lib[functionName]) { - // A module, "lib", was passed to this instance of evalRpn(). - const udf = lib[functionName]; - oprnd = evalCustomFunction(udf, args, decimalFormat, unitAware, lib); - } else if (vars[functionName] && vars[functionName].dtype === dt.MODULE) { - // User-defined function from a calculation node. - const udf = vars[functionName]["value"]; - oprnd = evalCustomFunction(udf, args, decimalFormat, unitAware); - } else { - return errorOprnd("BAD_FUN_NM", functionName) - } - if (oprnd.dtype === dt.ERROR) { return oprnd } - stack.push(oprnd); - break - } - - case "=": - case "==": - case "⩵": - case "<": - case ">": - case "<=": - case "≤": - case ">=": - case "≥": - case "≠": - case "!=": - case "∈": - case "in": - case "∉": - case "!in": - case "∋": - case "∌": - case "⊂": - case "⊄": - case "⊃": - case "⊅": { - const o2 = stack.pop(); - const o1 = stack.pop(); - if (unitAware && - !((o1.dtype & dt.STRING) || (o2.dtype & dt.STRING) || - o1.dtype === dt.NULL || o2.dtype === dt.NULL)) { - if (!unitsAreCompatible(o1.unit.expos, o2.unit.expos)) { - return errorOprnd("UNIT_COMP") - } - } - const bool = Object.create(null); - bool.unit = null; - const prevValue = (o1.dtype === dt.BOOLEANFROMCOMPARISON) ? oPrev.value : undefined; - - if (setComparisons.includes(tkn)) { - bool.value = compare(tkn, o1.value, o2.value, prevValue); - bool.dtype = o1.dtype + dt.BOOLEANFROMCOMPARISON; - } else { - const [shape1, shape2, _] = binaryShapesOf(o1, o2); - bool.value = Operators.relations[shape1][shape2].relate(tkn, o1.value, - o2.value, prevValue); - bool.dtype = Operators.dtype[shape1][shape2](o1.dtype, o2.dtype, tkn) - + dt.BOOLEANFROMCOMPARISON; - } - if (bool.value.dtype && bool.value.dtype === dt.ERROR) { return bool.value } - if (bool.dtype & dt.RATIONAL) { bool.dtype -= dt.RATIONAL; } - if (bool.dtype & dt.COMPLEX) { bool.dtype -= dt.COMPLEX; } - if (bool.dtype & dt.STRING) { bool.dtype -= dt.STRING; } - oPrev = o2; - stack.push(Object.freeze(bool)); - break - } - - case "and": - case "&&": - case "or": - case "||": - case "∧": - case "∨": - case "⊻": { - const o2 = stack.pop(); - const o1 = stack.pop(); - if (!(o1.dtype & dt.BOOLEAN) || !(o2.dtype & dt.BOOLEAN)) { - return errorOprnd("LOGIC", tokens[i]) - } - const op = { "and": "and", "&&": "and", "or": "or", "∧": "and", - "||": "or", "∨": "or", "⊻": "xor" }[tkn]; - const [shape1, shape2, _] = binaryShapesOf(o1, o2); - - const bool = Object.create(null); - bool.unit = null; - bool.value = Operators.binary[shape1][shape2][op](o1.value, o2.value); - if (bool.value.dtype && bool.value.dtype === dt.ERROR) { return bool.value } - - bool.dtype = Operators.dtype[shape1][shape2](o1.dtype, o2.dtype, tkn); - stack.push(Object.freeze(bool)); - break - } - - case "not": - case "¬": { - const o1 = stack.pop(); - if (!(o1.dtype & dt.BOOLEAN)) { return errorOprnd("LOGIC", tkn) } - const bool = Object.create(null); - bool.unit = null; - bool.value = Operators.unary[shapeOf(o1)]["not"](o1.value); - if (bool.value.dtype && bool.value.dtype === dt.ERROR) { return bool.value } - bool.dtype = dt.BOOLEAN; - stack.push(Object.freeze(bool)); - break - } - - case "cases": { - // A multi-line cases expression. Hurmet's ternary expression. - const numArgs = Number(tokens[i + 1]); - i += 1; - // We evaluate cases expressions lazily. Pop the conditions into an array. - const conditions = new Array(numArgs); - for (let j = numArgs - 1; j >= 0; j--) { - conditions[j] = stack.pop(); - } - // Check each condition. - // When we reach the first true condition, evaluate the corresponding expression. - for (let j = 0; j < numArgs; j++) { - if ((conditions[j].dtype & dt.BOOLEAN) === 0) { - return errorOprnd("LOGIC", "if") - } - const val = Operators.condition[shapeOf(conditions[j])](conditions[j].value); - if (val) { - const rpnLocal = tokens[i + j + 1].replace(/§/g, "\u00A0"); - const oprnd = evalRpn(rpnLocal, vars, decimalFormat, unitAware, lib); - if (oprnd.dtype === dt.ERROR) { return oprnd } - stack.push(oprnd); - break - } - } - i += numArgs; // Discard the unused expressions - break - } - - case "applyUnit": { - // Pop a magnitude off the stack and apply a unit. - // This happens where a user writes a QUANTITY literal. - if (!unitAware) { return errorOprnd("UNIT_AWARE", tokens[i + 1]) } - const o1 = stack.pop(); - if (!(o1.dtype & dt.RATIONAL)) { return errorOprnd("QUANT_NUM") } - const unitName = tokens[i + 1]; - i += 1; - const output = Object.create(null); - output.unit = Object.create(null); - output.dtype = o1.dtype; - if (!unitAware) { - output.value = o1.value; - if (o1.dtype & dt.MAP) { - output.unit = unitFromUnitName(unitName); - } else { - output.unit.name = unitName; - } - } else { - // Convert the magnitude to base units. - const unit = unitFromUnitName(unitName); - if (unit.dtype && unit.dtype === dt.ERROR) { return unit } - if (isMatrix(o1)) { - output.unit.expos = o1.unit.expos.map((e, j) => e + unit.expos[j]); - output.value = Matrix.convertToBaseUnits(o1, unit.gauge, unit.factor); - } else if (o1.dtype & dt.MAP) { - output.unit = unitFromUnitName(o1.unit); - output.value = o1.value; - } else { - output.unit.expos = o1.unit.expos.map((e, j) => e + unit.expos[j]); - output.value = Rnl.multiply(Rnl.add(o1.value, unit.gauge), unit.factor); - } - } - stack.push(Object.freeze(output)); - break - } - - case "rem%": { - const o2 = stack.pop(); - const o1 = stack.pop(); - if (!((o1.dtype & dt.RATIONAL) & (o2.dtype & dt.RATIONAL))) { - return errorOprnd("NAN_OP") - } - const [shape1, shape2, _] = binaryShapesOf(o1, o2); - const mod = Object.create(null); - mod.unit = Object.create(null); - mod.unit.expos = allZeros; - mod.value = Operators.binary[shape1][shape2]["rem"](o1.value, o2.value); - if (mod.value.dtype && mod.value.dtype === dt.ERROR) { return mod.value } - mod.dtype = Operators.dtype[shape1][shape2](o1.dtype, o2.dtype, tkn); - stack.push(Object.freeze(mod)); - break - } - - case "⎾⏋": - case "⎿⏌": { - // ceiling or floor - const o1 = stack.pop(); - if (!(o1.dtype & dt.RATIONAL)) { return errorOprnd("NAN_OP") } - if (unitAware) { - if (!unitsAreCompatible(o1.unit.expos, allZeros)) { - // TODO: Write an error message. - { return errorOprnd("") } - } - } - const op = tkn === "⎾⏋" ? "ceil" : "floor"; - const output = Object.create(null); - output.value = Operators.unary[shapeOf(o1)][op](o1.value); - if (output.value.dtype && output.value.dtype === dt.ERROR) { return output.value } - output.unit = o1.unit; - output.dtype = o1.dtype; - stack.push(Object.freeze(output)); - break - } - - case "()": { - // binomial - const args = []; - args.unshift(stack.pop()); - args.unshift(stack.pop()); - if (unitAware) { - if (!unitsAreCompatible(args[0].unit.expos, allZeros) || - !unitsAreCompatible(args[1].unit.expos, allZeros)) { - return errorOprnd("BINOM") - } - } - const binom = Object.create(null); - binom.unit = Object.create(null); - binom.unit.expos = allZeros; - const [value, dtype] = multivarFunction("binary", "binomial", args); - binom.value = value; - binom.dtype = dtype; - stack.push(Object.freeze(binom)); - break - } - - case "→": { - // Anonymous function, e.g., x → cos x - const rpnLocal = stack.pop().value.replace(/§/g, "\xa0"); - const parameter = stack.pop().value; - stack.push({ - dtype: dt.MODULE, - unit: null, - value: { - parameters: [ { name: parameter }], - statements: [{ rpn: rpnLocal, stype: "return" }] - } }); - break - } - - case "∑": { - const rpnLocal = stack.pop().value.replace(/§/g, "\xa0"); - const endOfRange = stack.pop().value; - let index = stack.pop().value; - const parameter = stack.pop().value; - let sum = Rnl.zero; - while (Rnl.lessThanOrEqualTo(index, endOfRange)) { - vars[parameter] = { value: index, unit: allZeros, dtype: dt.RATIONAL }; - const localResult = evalRpn(rpnLocal, vars, decimalFormat, false); - sum = Rnl.add(sum, localResult.value); - index = Rnl.add(index, Rnl.one); - } - delete vars[parameter]; - stack.push({ value: sum, unit: allZeros, dtype: dt.RATIONAL }); - break - } - - case "throw": - return { value: stack.pop().value, unit: null, dtype: dt.ERROR } - - case "\\blue": - case "\\gray": - case "\\green": - case "\\orange": - case "\\pink": - case "\\purple": - case "\\red": { - const color = clone(stack.pop()); - if (color.dtype === dt.STRING) { color.unit = tkn.slice(1); } - stack.push(color); - break - } - // TODO: Write an error message - } - } - } // next i - - const oprnd = stack.pop(); - if (stack.length > 0) { - return errorOprnd("ERROR") - } - - return oprnd -}; - -const plot = (svg, decimalFormat, fun, numPoints, xMin, xMax) => { - // Plot a function. - // To avoid a circular reference, this function has to be here instead of in draw.js. - const attrs = svg.value.temp; - numPoints = (numPoints == null) ? Rnl.fromNumber(250) : numPoints.value; - const min = (xMin == null) ? Rnl.fromNumber(attrs.xmin) : xMin.value; - const max = (xMax == null) ? Rnl.fromNumber(attrs.xmax) : xMax.value; - // Vectorize the evaluation. Start by finding a vector of the input. - const step = Rnl.divide(Rnl.subtract(max, min), numPoints); - const vector = Matrix.operandFromRange([min, step, max]); - // Transpose the row vector into a column vector. - const arg = { value: vector.value, unit: null, dtype: dt.COLUMNVECTOR + dt.RATIONAL }; - // Run the function on the vector. - let funResult; - let pathValue; - if (fun.value.dtype && fun.value.dtype === dt.MODULE) { - funResult = evalCustomFunction(fun.value, [arg], decimalFormat, false); - pathValue = arg.value.map((e, i) => [e, funResult.value[i]]); - } else if (fun.dtype === dt.STRING) { - if (/§matrix§1§2$/.test(fun.value)) { - arg.name = "t"; - pathValue = evalRpn(fun.value.replace(/§/g, "\xa0"), { t: arg }, decimalFormat, false).value; - } else { - arg.name = "x"; - funResult = evalRpn(fun.value.replace(/§/g, "\xa0"), { x: arg }, decimalFormat, false); - pathValue = arg.value.map((e, i) => [e, funResult.value[i]]); - } - } else ; - const point = { value: pathValue[0], unit: null, dtype: dt.ROWVECTOR + dt.RATIONAL }; - const pth = { value: pathValue.slice(1), unit: null, dtype: dt.MATRIX + dt.RATIONAL }; - return draw.functions.path(svg, [point, pth]) -}; - -const elementFromIterable = (iterable, index, step) => { - // A helper function. This is called by `for` loops in evalCustomFunction() - let value; - let nextIndex = Rnl.increment(index); - let dtype = 0; - if (iterable.dtype === dt.RANGE) { - value = index; - nextIndex = Rnl.add(index, step); - dtype = dt.RATIONAL; - } else if ((iterable.dtype === dt.STRING) && - iterable.value[Rnl.fromNumber(index)] === "\uD835") { - value = Rnl.fromNumber(iterable.value[index] + iterable.value[index + 1]); - nextIndex = Rnl.add(index, 2); - dtype = dt.STRING; - } else { - value = iterable.value[Rnl.toNumber(index)]; - dtype = (iterable.dtype & dt.STRING) - ? dt.STRING - : (iterable.dtype & dt.ROWVECTOR) - ? iterable.dtype - dt.ROWVECTOR - : (iterable.dtype & dt.COLUMNVECTOR) - ? iterable.dtype - dt.COLUMNVECTOR - : iterable.dtype - dt.MATRIX; - } - const oprnd = { value: value, unit: iterable.unit, dtype: dtype }; - return [oprnd, nextIndex] -}; - -const loopTypes = ["while", "for"]; - -const evalCustomFunction = (udf, args, decimalFormat, isUnitAware, lib) => { - // UDF stands for "user-defined function" - // lib is short for library. If not omitted, it contains a module with more functions. - - if (udf.dtype === dt.ERROR) { - return udf - } - - // Populate the function parameters. - if (args.length > udf.parameters.length) { return errorOprnd("NUMARGS", udf.name) } - const vars = Object.create(null); - for (let i = 0; i < args.length; i++) { - vars[udf.parameters[i].name] = args[i]; - } - if (udf.parameters.length > args.length) { - for (let i = args.length; i < udf.parameters.length; i++) { - vars[udf.parameters[i].name] = udf.parameters[i].default; - } - } - if (udf.dtype === dt.DRAWING) { - vars["svg"] = { value: draw.startSvg(), unit: null, dtype: dt.DRAWING }; - } - - // Execute the function statements. - // There will be nested flow of control, of course. So we'll create a - // "control" stack. The topmost element contains info about the control - // that applies to the current nesting level. - const control = [{ type: "if", condition: true, endOfBlock: udf.statements.length - 1 }]; - for (let i = 0; i < udf.statements.length; i++) { - const statement = udf.statements[i]; - const stype = statement.stype; - const level = control.length - 1; - switch (stype) { - case "statement": { - if (control[level].condition) { - const result = evalRpn(statement.rpn, vars, decimalFormat, isUnitAware, lib); - if (result.dtype === dt.ERROR) { - // eslint-disable-next-line no-console - console.log(statement.rpn); - return result - } - if (statement.name) { - statement.resultdisplay = isUnitAware ? "!!" : "!"; - const [stmt, _] = conditionResult(statement, result, isUnitAware); - insertOneHurmetVar(vars, stmt, null, decimalFormat); - } - } - break - } - - case "if": { - if (control[level].condition) { - const result = evalRpn(statement.rpn, vars, decimalFormat, isUnitAware, lib); - if (result.dtype === dt.ERROR) { return result } - const val = Operators.condition[shapeOf(result)](result.value); - control.push({ - type: "if", - condition: val, - endOfBlock: statement.endOfBlock - }); - } else { - // Skip this block - i = statement.endOfBlock; - } - break - } - - case "elseif": { - if (control[level].type === "if" && control[level].condition) { - i = control[level].endOfBlock; - control.pop(); - } else { - const result = evalRpn(statement.rpn, vars, decimalFormat, isUnitAware, lib); - if (result.dtype === dt.ERROR) { return result } - const val = Operators.condition[shapeOf(result)](result.value); - control[control.length - 1].condition = val; - } - break - } - - case "else": - if (control[level].type === "if" && control[level].condition) { - i = control[level].endOfBlock; - control.pop(); - } else { - control[level].condition = true; - } - break - - case "while": { - if (control[level].condition) { - const cntrl = { - type: "while", - startStatement: i, - rpn: statement.rpn, - endOfBlock: statement.endOfBlock - }; - const result = evalRpn(statement.rpn, vars, decimalFormat, isUnitAware, lib); - if (result.dtype === dt.ERROR) { return result } - const val = Operators.condition[shapeOf(result)](result.value); - cntrl.condition = val; - if (cntrl.condition === true) { - control.push(cntrl); - } else { - i = statement.endOfBlock; - } - } else { - i = statement.endOfBlock; - } - break - } - - case "for": { - if (control[level].condition) { - const ctrl = { - type: "for", - condition: true, - startStatement: i, - endOfBlock: statement.endOfBlock - }; - const tokens = statement.rpn.split("\u00A0"); - ctrl.dummyVariable = tokens.shift().slice(1); - const iterable = evalRpn(tokens.join("\u00A0"), vars, - decimalFormat, isUnitAware, lib); - ctrl.index = (iterable.dtype & dt.RANGE) ? iterable.value[0] : Rnl.fromNumber(0); - ctrl.step = (iterable.dtype & dt.RANGE) ? iterable.value[1] : Rnl.fromNumber(0); - ctrl.endIndex = (iterable.dtype & dt.RANGE) - ? iterable.value[2] - : Rnl.fromNumber(iterable.value.length - 1); - const [oprnd, nextIndex] = elementFromIterable(iterable, ctrl.index, ctrl.step); - ctrl.nextIndex = nextIndex; - ctrl.iterable = iterable; - control.push(ctrl); - vars[ctrl.dummyVariable] = oprnd; - } else { - i = statement.endOfBlock; - } - break - } - - case "break": { - if (control[level].condition) { - // Find the enclosing loop and pop out of it. - for (let j = control.length - 1; j > 0; j--) { - if (loopTypes.includes(control[j].type) || j === 0) { - i = control[j].endOfBlock; - control.pop(); - break - } else { - control.pop(); - } - } - } - break - } - - case "end": { - // end of code block - if (control[level].type === "if" && i >= control[level].endOfBlock) { - control.pop(); - } else if (control[level].type === "if" && control[level].condition) { - // Jump ahead to end of if block - if (i < control[level].endOfBlock) { i = control[level].endOfBlock; } - control.pop(); - } else if (control[level].type === "while") { - const result = evalRpn(control[level].rpn, vars, decimalFormat, isUnitAware, lib); - if (result.dtype === dt.ERROR) { return result } - control[level].condition = result.value; - if (control[level].condition) { - i = control[level].startStatement; - } else { - control.pop(); - } - } else if (control[level].type === "for") { - control[level].index = control[level].nextIndex; - const proceed = Rnl.isRational(control[level].index) - && Rnl.isPositive(control[level].step) - ? Rnl.lessThanOrEqualTo(control[level].index, control[level].endIndex) - : Rnl.isRational(control[level].index) - ? Rnl.greaterThanOrEqualTo(control[level].index, control[level].endIndex) - : control[level].index <= control[level].endIndex; - if (proceed) { - const [oprnd, nextIndex] = elementFromIterable( - control[level].iterable, - control[level].index, control[level].step - ); - vars[control[level].dummyVariable] = oprnd; - control[level].nextIndex = nextIndex; - i = control[level].startStatement; - } else { - control.pop(); - } - } - break - } - - case "return": - if (control[level].condition) { - if (statement.rpn) { - const result = evalRpn(statement.rpn, vars, decimalFormat, isUnitAware, lib); - return result - } else { - return { value: Rnl.zero, unit: allZeros, dtype: dt.RATIONAL } - } - } - break - - case "print": - if (control[level].condition) { - if (statement.rpn) { - const result = evalRpn(statement.rpn, vars, decimalFormat, isUnitAware, lib); - if (result.dtype === dt.ERROR) { return result } - const msg = result.dtype === dt.RATIONAL - ? Rnl.toNumber(result.value) - : result.dtype === dt.STRING || result.dtype === dt.BOOLEAN - ? result.value - : isVector(result) && (result.dtype & dt.RATIONAL) - ? result.value.map(e => Rnl.toNumber(e)) - : result.dtype === dt.MATRIX + dt.RATIONAL - ? result.value.map(row => row.map(e => Rnl.toNumber(e))) - : result.value; - // eslint-disable-next-line no-console - console.log(msg); - } - } - break - - case "throw": - if (control[level].condition) { - if (statement.rpn) { - const result = evalRpn(statement.rpn, vars, decimalFormat, isUnitAware, lib); - return { value: result.value, unit: null, dtype: dt.ERROR } - } else { - return { value: statement.rpn, unit: null, dtype: dt.ERROR } - } - } - break - // TODO: Error message. - } - } -}; - -const errorResult = (stmt, result) => { - stmt.value = null; - stmt.resultDisplay = "\\textcolor{firebrick}{\\text{" + result.value.replace(/%/g, "\\%") + "}}"; - stmt.altResultDisplay = result.value; - stmt.error = true; - stmt.dtype = dt.ERROR; - if (stmt.resulttemplate.indexOf("!") > -1) { - stmt.tex += "= " + stmt.resultDisplay; - stmt.alt += result.value; - } else if (stmt.resulttemplate.indexOf("@") > -1) { - stmt.tex = stmt.resulttemplate.replace(/@@?/, stmt.resultDisplay); - stmt.alt = stmt.altresulttemplate.replace(/@@?/, stmt.altResultDisplay); - } else { - stmt.tex = stmt.tex.replace(/[?%] *[?%]|[?%]/, stmt.resultDisplay); - stmt.alt = stmt.alt.replace(/[?%] *[?%]|[?%]/, stmt.altResultDisplay); - } - return [stmt, result] -}; - -const conditionResult = (stmt, oprnd, unitAware) => { - let result = Object.create(null); - result.value = oprnd.dtype === dt.DATAFRAME - ? oprnd.value - : clone(oprnd.value); - result.unit = clone(oprnd.unit); - result.dtype = oprnd.dtype; - - if (result.dtype === dt.COMPLEX && Rnl.isZero(Cpx.imag(result.value))) { - result.value = Cpx.real(result.value); - result.dtype = 1; - } - - // Check unit compatibility. - if (result.dtype !== dt.ERROR && unitAware && stmt.resultdisplay.indexOf("!") === -1 && - (stmt.unit && stmt.unit.expos || - (result.unit && result.unit.expos && Array.isArray(result.unit.expos)))) { - const expos = (stmt.unit && stmt.unit.expos) ? stmt.unit.expos : allZeros; - if (!unitsAreCompatible(result.unit.expos, expos)) { - const message = stmt.unit.expos ? "UNIT_RES" : "UNIT_MISS"; - result = errorOprnd(message); - } - } - if (result.dtype === dt.ERROR) { return errorResult(stmt, result) } - - // Check for a valid display indicator. - if (stmt.resulttemplate && stmt.resulttemplate.indexOf("!") > -1 && - !(result.dtype === dt.DATAFRAME || (result.dtype & dt.MAP) || isMatrix(result) - || (result.dtype & dt.TUPLE))) { - return errorResult(stmt, errorOprnd("BAD_DISPLAY")) - } - - if (result.dtype & dt.RATIONAL) { - if (result.dtype & dt.MAP) { - result.value.data = result.value.data.map(column => Rnl.isRational(column[0]) - ? column.map(e => Rnl.normalize(e)) - : column); - } else { - result.value = isVector(result) - ? result.value.map(e => Rnl.normalize(e)) - : isMatrix(result) - ? result.value.map(row => row.map(e => Rnl.normalize(e))) - : result.dtype === dt.RATIONAL - ? Rnl.normalize(result.value) - : result.value; - } - } else if (result.dtype === dt.COMPLEX) { - result.value = [Rnl.normalize(result.value[0]), Rnl.normalize(result.value[1])]; - } - stmt.dtype = result.dtype; - - // If unit-aware, convert result to desired result units. - const unitInResultSpec = (stmt.unit && stmt.unit.factor && - (!Rnl.areEqual(stmt.unit.factor, Rnl.one) || stmt.unit.gauge)); - if ((result.dtype & dt.DATAFRAME) || - (typeof stmt.resultdisplay === "string" && stmt.resultdisplay.indexOf("!") > -1)) { - stmt.unit = result.unit; - } else if (unitAware && (result.dtype & dt.RATIONAL)) { - if (!unitInResultSpec & unitsAreCompatible(result.unit.expos, allZeros)) { - stmt.unit = { factor: Rnl.one, gauge: Rnl.zero, expos: allZeros }; - } - if (result.dtype & dt.MAP) { - result.value.data = { - plain: map.convertFromBaseUnits(result.value.data, stmt.unit.gauge, stmt.unit.factor), - inBaseUnits: result.value.data - }; - } else { - result.value = { - plain: (isMatrix(result)) - ? Matrix.convertFromBaseUnits( - { value: result.value, dtype: result.dtype }, - stmt.unit.gauge, - stmt.unit.factor - ) - : Rnl.subtract(Rnl.divide(result.value, stmt.unit.factor), stmt.unit.gauge), - inBaseUnits: result.value - }; - } - stmt.dtype += dt.QUANTITY; - stmt.expos = result.unit.expos; - } else if (unitInResultSpec) { - // A non-unit aware calculation, but with a unit attached to the result. - if (result.dtype & dt.MAP) { - const data = { - plain: result.value.data, - inBaseUnits: map.convertToBaseUnits(result.value.data, - stmt.unit.gauge, stmt.unit.factor) - }; - result.value.data = data; - } else { - result.value = { - plain: result.value, - inBaseUnits: (isMatrix(result)) - ? Matrix.convertToBaseUnits( - { value: result.value, dtype: result.dtype }, - stmt.unit.gauge, - stmt.unit.factor - ) - : Rnl.multiply(Rnl.add(result.value, stmt.unit.gauge), stmt.unit.factor) - }; - } - stmt.dtype += dt.QUANTITY; - - } else if ((result.dtype & dt.RATIONAL) || (result.dtype & dt.COMPLEX) ) { - // A numeric result with no unit specified. - stmt.unit = { expos: allZeros }; - } - if (Object.prototype.hasOwnProperty.call(result, "value")) { - stmt.value = result.value; - } - return [stmt, result] -}; - -const evaluateDrawing = (stmt, vars, decimalFormat = "1,000,000.") => { - // eslint-disable-next-line no-prototype-builtins - const udf = stmt.value; - const args = []; - for (let i = 0; i < udf.parameters.length; i++) { - const argName = udf.parameters[i].name; - args.push(evalRpn("¿" + argName, vars, decimalFormat, false, {})); - } - const funcResult = evalCustomFunction(udf, args, decimalFormat, false, {}); - if (funcResult.dtype === dt.ERROR) { - stmt.error = true; - stmt.tex = "\\textcolor{firebrick}{\\text{" + funcResult.value + "}}"; - stmt.value = null; - stmt.dtype = dt.ERROR; - } else { - stmt.resultdisplay = funcResult.value; - delete stmt.resultdisplay.temp; - } - return stmt -}; - -const evaluate = (stmt, vars, decimalFormat = "1,000,000.") => { - stmt.tex = stmt.template; - stmt.alt = stmt.altTemplate; - const isUnitAware = /\?\?|!!|%%|@@|¡¡/.test(stmt.resulttemplate); - - const formatSpec = vars.format ? vars.format.value : "h15"; - - if (stmt.tex.indexOf("〖") > -1) { - // eslint-disable-next-line max-len - const eqnWithVals = plugValsIntoEcho(stmt.tex, vars, isUnitAware, formatSpec, decimalFormat); - if (eqnWithVals.dtype && eqnWithVals.dtype === dt.ERROR) { - const [newStmt, _] = errorResult(stmt, eqnWithVals); - return newStmt - } else { - stmt.tex = eqnWithVals; - } - } - - if (stmt.rpn) { - let oprnd = evalRpn(stmt.rpn, vars, decimalFormat, isUnitAware); - if (oprnd.dtype === dt.ERROR) { [stmt, oprnd] = errorResult(stmt, oprnd); return stmt} - let result; - [stmt, result] = conditionResult(stmt, oprnd, isUnitAware); - if (stmt.error) { return stmt } - const assert = vars.assert ? vars.assert : null; - stmt = formatResult(stmt, result, formatSpec, decimalFormat, assert, isUnitAware); - } - return stmt -}; - -const numberRegEx$2 = new RegExp(Rnl.numberPattern); -const matrixRegEx = /^[([] *(?:(?:-?[0-9.]+|"[^"]+"|true|false) *[,;\t]? *)+[)\]]/; -/* eslint-disable max-len */ - -const numStr = "(-?(?:0x[0-9A-Fa-f]+|[0-9]+(?: [0-9]+\\/[0-9]+|(?:\\.[0-9]+)?(?:e[+-]?[0-9]+|%)?)))"; -const nonNegNumStr = "(0x[0-9A-Fa-f]+|[0-9]+(?: [0-9]+\\/[0-9]+|(?:\\.[0-9]+)?(?:e[+-]?[0-9]+|%)?))"; -const complexRegEx = new RegExp("^" + numStr + "(?: *([+-]) *(?: j *" + nonNegNumStr + "|" + nonNegNumStr + " *∠" + numStr + "(°)?))"); -// const complexRegEx = /^(number)(?: *([+-]) *(non-negative number) *j(number)(°)?)/ -/* eslint-enable max-len */ -// Capturing groups: -// [1] First number, either a in a ± b im, or r in r∠θ -// [2] + or -. Gives the sign of the imaginary part in an a ± b im. -// [3] b, the imaginary part in an a ± b im expression -// [4] theta, the argument (phase angle ) of an r∠θ expression -// [5] °, optional trailing degree sign in an r∠θ expression - -const unitFromString = str => { - if (str.length === 0) { return ["", ""] } - const unitName = str.replace(/'/g, "").trim(); - const unit = unitFromUnitName(unitName); - const unitDisplay = (unit.dtype && unit.dtype === dt.ERROR) - ? "" - : unitTeXFromString(unitName); - return [unit, unitDisplay] -}; - -const literalWithUnit = (oprnd, tex, unitStr) => { - let unit = (oprnd.dtype & dt.RATIONAL) ? { expos: allZeros } : null; - let unitDisplay = ""; - let value = oprnd.value; - if (unitStr.length > 0) { - [unit, unitDisplay] = unitFromString(unitStr); - if (unit.dtype && unit.dtype === dt.ERROR) { - return [0, null, dt.ERROR, ""] - } - value = oprnd.dtype === dt.RATIONAL - ? { - plain: oprnd.value, - inBaseUnits: Rnl.multiply(Rnl.add(oprnd.value, unit.gauge), unit.factor) - } - : { - plain: oprnd.value, - inBaseUnits: Matrix.convertToBaseUnits(oprnd, unit.gauge, unit.factor) - }; - } - let dtype = oprnd.dtype; - if (unitDisplay.length > 0) { - dtype += dt.QUANTITY; - return [value, unit, dtype, tex + "\\," + unitDisplay] - } else { - return [value, unit, dtype, tex] - } -}; - -const valueFromLiteral = (str, name, decimalFormat) => { - // Read a literal string and return a value - // The return should take the form: [value, unit, dtype, resultDisplay] - - if (/^[({[].* to /.test(str)) { - // str defines a quantity distribution, (a to b). That is handled by calculation.js. - // This is not a valid literal. - return [0, null, dt.ERROR, ""] - - } else if (str === "true" || str === "false") { - return [Boolean(str), null, dt.BOOLEAN, `\\mathord{\\text{${str}}}`] - - } else if (str.length > 3 && str.slice(0, 3) === '"""') { - // str contains a macro - return [str.slice(3, -3), undefined, dt.MACRO, ""] - - } else if (/^\x22.+\x22/.test(str)) { - // str contains text between quotation marks - if (name === "format") { - return parseFormatSpec(str.slice(1, -1).trim()) - } else { - const tex = parse$1(str, decimalFormat); - return [str.slice(1, -1), undefined, dt.STRING, tex] - } - - } else if (matrixRegEx.test(str)) { - // We're processing a matrix - const matrixStr = matrixRegEx.exec(str)[0]; - const [tex, rpn, _] = parse$1(matrixStr, decimalFormat, true); - const oprnd = evalRpn(rpn, {}, decimalFormat, false, {}); - const unitStr = str.slice(matrixStr.length).trim(); - return literalWithUnit(oprnd, tex, unitStr) - - } else if (/^``/.test(str)) { - // A TSV between double back ticks. - // Read the TSV into a data frame. - const pos = str.indexOf("``", 2); - const tsv = tablessTrim(str.slice(2, pos)); - const oprnd = DataFrame.dataFrameFromTSV(tsv); - if (oprnd.dtype === dt.DATAFRAME) { - return [oprnd.value, oprnd.unit, dt.DATAFRAME, - DataFrame.display(oprnd.value, "h3", decimalFormat)] - } else { - // It's a Hurmet Map - const unitStr = str.slice(pos + 2).trim(); - let unit; - let unitDisplay = ""; - if (unitStr.length > 0) { - [unit, unitDisplay] = unitFromString(unitStr); - if (unit.dtype && unit.dtype === dt.ERROR) { return [0, null, dt.ERROR, ""] } - oprnd.unit = unit; - oprnd.dtype = dt.MAP + dt.RATIONAL + dt.QUANTITY; - oprnd.value.data = { - plain: oprnd.value.data, - inBaseUnits: map.convertToBaseUnits(oprnd.value.data, unit.gauge, unit.factor) - }; - } - return [oprnd.value, unit, oprnd.dtype, - DataFrame.display(oprnd.value, "h3", decimalFormat) + "\\;" + unitDisplay] - } - - } else if (complexRegEx.test(str)) { - // str is a complex number. - const resultDisplay = parse$1(str, decimalFormat); - const parts = str.match(complexRegEx); - let realPart; - let imPart; - if (parts[3]) { - // a + b im expression - realPart = Rnl.fromString(parts[1]); - imPart = Rnl.fromString(parts[3]); - if (parts[2] === "-") { imPart = Rnl.negate(imPart); } - } else { - // r∠θ expression - const r = Rnl.fromString(parts[1]); - let theta = Rnl.fromString(parts[4]); - if (parts[5]) { theta = Rnl.divide(Rnl.multiply(theta, Rnl.pi), Rnl.fromNumber(180)); } - realPart = Rnl.multiply(r, Rnl.fromNumber(Math.cos(Rnl.toNumber(theta)))); - imPart = Rnl.multiply(r, Rnl.fromNumber(Math.sin(Rnl.toNumber(theta)))); - } - return [[realPart, imPart], allZeros, dt.COMPLEX, resultDisplay] - - } else { - const match = numberRegEx$2.exec(str); - if (match) { - // str begins with a number. - const numStr = match[0]; - const unitStr = str.slice(numStr.length).trim(); - const [tex, rpn, _] = parse$1(numStr, decimalFormat, true); - const oprnd = evalRpn(rpn, {}, decimalFormat, false, {}); - return literalWithUnit(oprnd, tex, unitStr) - - } else { - // TODO: Preceding currency symbol, e.g., $25.20 - return [0, null, dt.ERROR, ""] - } - } -}; - -const isValidIdentifier = /^(?:[A-Za-zıȷ\u0391-\u03C9\u03D5\u210B\u210F\u2110\u2112\u2113\u211B\u212C\u2130\u2131\u2133]|(?:\uD835[\uDC00-\udc33\udc9c-\udcb5]))[A-Za-z0-9_\u0391-\u03C9\u03D5\u0300-\u0308\u030A\u030C\u0332\u20d0\u20d1\u20d6\u20d7\u20e1]*′*$/; -const keywordRegEx = /^(if|elseif|else|return|throw|while|for|break|print|end)(\u2002|\b)/; -const drawCommandRegEx = /^(title|frame|view|axes|grid|stroke|strokewidth|strokedasharray|fill|fontsize|fontweight|fontstyle|fontfamily|marker|line|path|plot|curve|rect|circle|ellipse|arc|text|dot|leader|dimension)\b/; -const leadingSpaceRegEx = /^[\t ]+/; -const oneLinerRegEx = /^( *)if ([^\n`]+) +(return|throw|print|break)\b([^\n]+)?(?: end)? *\n/gm; - -// If you change functionRegEx, then also change it in mathprompt.js. -// It isn't called from there in order to avoid duplicating Hurmet code inside ProseMirror.js. -const functionRegEx = /^function (?:[A-Za-zıȷ\u0391-\u03C9\u03D5\u210B\u210F\u2110\u2112\u2113\u211B\u212C\u2130\u2131\u2133]|(?:\uD835[\uDC00-\udc33\udc9c-\udcb5]))[A-Za-z0-9_\u0391-\u03C9\u03D5\u0300-\u0308\u030A\u030C\u0332\u20d0\u20d1\u20d6\u20d7\u20e1]*′*\(/; -const moduleRegEx = /^module ([A-Za-z][A-Za-z0-9]*)/; -const drawRegEx = /^draw\(/; -const startSvgRegEx = /^startSvg\(\)/; -const lexRegEx = /"[^"]*"|``.*|`[^`]*`|'[^']*'|#|[^"`'#]+/g; - -const testForStatement = str => { - const pos = str.indexOf("="); - if (pos === -1) { return false } - const leadStr = str.slice(0, pos).replace(leadingSpaceRegEx, "").trim(); - if (isValidIdentifier.test(leadStr)) { return true } - if (leadStr.indexOf(",") === -1) { return false } - let result = true; - const arry = leadStr.split(","); - arry.forEach(e => { - if (!isValidIdentifier.test(e.trim())) { result = false; } - }); - return result -}; - -const stripComment = str => { - // Strip the comment, if any, from the end of a code line. - const matches = arrayOfRegExMatches(lexRegEx, str); - for (let i = 0; i < matches.length; i++) { - if (matches[i].value === "#") { - str = str.slice(0, matches[i].index); - break - } - } - return str.trim() -}; - -const scanModule = (str, decimalFormat) => { - // Scan the code and break it down into individual lines of code. - // Assemble the lines into functions and assign each function to parent. - const parent = Object.create(null); - - // Expand one-liners into if ... end blocks. - str = str.replace(oneLinerRegEx, "$1if\u2002$2\n$1 $3\u2002$4\n$1end\n"); - - // Statements end at a newline. - const lines = str.split(/\r?\n/g); - - for (let i = 0; i < lines.length; i++) { - // Get a single line of code and strip off any comments. - const line = stripComment(lines[i]); - if (line.length === 0) { continue } - - if (functionRegEx.test(line) || drawRegEx.test(line)) { - // This line starts a new function. - const [funcObj, endLineNum] = scanFunction(lines, decimalFormat, i); - if (funcObj.dtype && funcObj.dtype === dt.ERROR) { return funcObj } - parent[funcObj.name] = funcObj; - i = endLineNum; - } else if (testForStatement(line)) { - // This line starts a Hurmet assignment. - const [stmt, endLineNum] = scanAssignment(lines, decimalFormat, i); - parent[stmt.name] = stmt; - i = endLineNum; - } - } - return { value: parent, unit: null, dtype: dt.MODULE } - -}; - -const handleTSV = (expression, lines, startLineNum) => { - for (let i = startLineNum + 1; i < lines.length; i++) { - const line = tablessTrim(lines[i]); - if (line.length === 0) { continue } - expression += "\n" + line; - if (line.slice(-2) === "``") { return [expression, i] } - } -}; - -const scanFunction = (lines, decimalFormat, startLineNum) => { - const line1 = stripComment(lines[startLineNum]); - let isDraw = line1.charAt(0) === "d"; - const posParen = line1.indexOf("("); - let functionName = ""; - if (isDraw) { - functionName = "draw"; - } else { - const posFn = line1.indexOf("function"); - functionName = line1.slice(posFn + 8, posParen).trim(); - } - - const parameterString = line1.slice(posParen + 1, -1).trim(); - const parameterSplit = parameterString.length === 0 ? [] : parameterString.split(/ *[,;] */g); - const parameters = []; - for (const param of parameterSplit) { - const parts = param.split(/ *= */); - const name = parts[0]; - let defaultVal = { name, value: null, dtype: null }; - if (parts[1]) { - const [value, unit, dtype, resultDisplay] = valueFromLiteral(parts[1], "", decimalFormat); - defaultVal = { name, value, unit, dtype, resultDisplay }; - } - parameters.push({ name, default: defaultVal }); - } - - const funcObj = { - name: functionName, - dtype: isDraw ? dt.DRAWING : dt.MODULE, - parameters, - statements: [] - }; - - const stackOfCtrls = []; - let expression = ""; - let prevLineEndedInContinuation = false; - let prevLine = ""; - let name = ""; - let isStatement = false; - - let j = startLineNum; - for (let i = startLineNum + 1; i < lines.length; i++) { - j += 1; - let line = stripComment(lines[i]); - if (line.length === 0) { continue } - - if (prevLineEndedInContinuation) { - // Check if the previous character is a semi-colon just before a matrix literal closes. - const lastChar = prevLine.slice(-1); - line = lastChar === ";" && "})]".indexOf(line.charAt(0)) > -1 - ? prevLine.slice(0, -1).trim() + line - : lastChar === ";" || lastChar === "," - ? prevLine + " " + line - : prevLine + line; - } - - // Line continuation characters are: { ( [ , ; + - - if (/[{([,;]$/.test(line)) { - prevLineEndedInContinuation = true; - prevLine = line; - continue - } else if (lines.length > i + 1 && /^\s*[+\-)\]}]/.test(lines[i + 1])) { - prevLineEndedInContinuation = true; - prevLine = line; - continue - } - - let isFromOneLiner = false; - const keyword = keywordRegEx.exec(line); - if (keyword) { - name = keyword[1]; - if (keyword[2]) { isFromOneLiner = true; } - expression = line.slice(name.length).trim(); - if (expression.length > 0 && /^``/.test(expression)) { - [expression, i] = handleTSV(expression, lines, i); - } - } else if (isDraw && drawCommandRegEx.test(line)) { - name = "svg"; - expression = line.indexOf(" ") === -1 - ? line + "(svg)" - : line.replace(" ", "(svg, ") + ")"; - isStatement = true; - } else { - if (testForStatement(line)) { - // We have an "=" assignment operator. - const posEq = line.indexOf("="); - name = line.slice(0, posEq - 1).trim(); - expression = line.slice(posEq + 1).trim(); - if (/^``/.test(expression)) { [expression, i] = handleTSV(expression, lines, i); } - if (startSvgRegEx.test(expression)) { isDraw = true; } - isStatement = true; - } else { - // TODO: We shouldn't get here. Write an error. - return [errorOprnd("FUNC_LINE", functionName + ", line " + (j + 1) + "\n" + line), i] - } - } - if (isFromOneLiner) { j -= 1; } - let rpn = ""; - let _; - if (expression) { - [, rpn, _] = parse$1(expression, decimalFormat, true); - if (name === "for") { rpn = rpn.replace(/\u00a0in\u00a0/, "\u00a0"); } - } - const stype = isStatement ? "statement" : name; - if (isStatement && /[,;]/.test(name)) { - name = name.split(/[,;]/).map(e => e.trim()); - } - funcObj.statements.push({ name, rpn, stype }); - if (stype === "if" || stype === "while" || stype === "for") { - stackOfCtrls.push({ type: stype, statementNum: funcObj.statements.length - 1 }); - } else if (stype === "end") { - if (stackOfCtrls.length === 0) { - // Finished the current function. - if (isDraw) { - funcObj.statements.splice(-1, 0, { name: "return", rpn: "¿svg", stype: "return" }); - } - return [funcObj, i] - } - const ctrl = stackOfCtrls[stackOfCtrls.length - 1]; - funcObj.statements[ctrl.statementNum].endOfBlock = funcObj.statements.length - 1; - stackOfCtrls.pop(); - } - - // Reset for next statement - isStatement = false; - prevLineEndedInContinuation = false; - prevLine = ""; - name = ""; - expression = ""; - } - return [errorOprnd("END_MISS", functionName), 0] -}; - -const scanAssignment = (lines, decimalFormat, iStart) => { - let prevLineEndedInContinuation = false; - let str = ""; - let iEnd = iStart; - for (let i = iStart; i < lines.length; i++) { - const line = stripComment(lines[i]); - if (line.length === 0) { continue } - - if (prevLineEndedInContinuation) { - // Check if the previous character is a semi-colon just before a matrix literal closes. - str = str.slice(-1) === ";" && "})]".indexOf(line.charAt(0)) > -1 - ? str.slice(0, -1).trim() + line - : str + line; - } else { - str = line; - } - - // Line continuation characters are: { ( [ , ; + - - if (/[{([,;]$/.test(str)) { - prevLineEndedInContinuation = true; - } else if (lines.length > i + 1 && /^\s*[+\-)\]}]/.test(lines[i + 1])) { - prevLineEndedInContinuation = true; - } else { - iEnd = i; - break - } - } - - const posEquals = str.indexOf("="); - let name = str.slice(0, posEquals).trim(); - if (/[,;]/.test(name)) { - name = name.split(/[,;]/).map(e => e.trim()); - } - let trailStr = str.slice(posEquals + 1).trim(); - if (trailStr.length > 3 && trailStr.slice(0, 3) === '"""') { - // We're at a macro, which extends beyond normal line endings. - let j = iEnd; - let pos = trailStr.indexOf('"""', 3); - while (pos < 0 && j < lines.length - 1) { - j += 1; - trailStr += "\n" + lines[j]; - pos = trailStr.indexOf('"""', 3); - } - iEnd = j; - } - const [value, unit, dtype, resultDisplay] = valueFromLiteral(trailStr, name, decimalFormat); - const stmt = { name, value, unit, dtype, resultDisplay }; - return [stmt, iEnd] -}; - -/* compile.js - * - * This module is called when: (1) an author submits a Hurmet calculation dialog box, or - * (2) when a new document is opened, or (3) when recalculate-all is called. - * Here we do some preparation in a calculation cell prior to calculation. - * - * This module does NOT calculate the result of an expression. It stops just short of that. - * How do we choose where to draw the line between tasks done here and tasks done later? - * We do as much here as we can without knowing the values that other cells have assigned - * to variables. The goal is to minimize the amount of work done by each dependent cell - * when an author changes an assigned value. Later, calculation updates will not have to - * repeat the work done in this module, so updates will be faster. - * - * Variable inputStr contains the string that an author wrote into mathPrompt(). - * - * From that entry this module will: - * 1. Determine the name of the cell, as in "x" from "x = 12" - * 2. Parse the entry string into TeX, to be passed later to Temml for rendering. - * 3. If the input asks for a calculation: - * a. Parse the expression into an echo string (in TeX) with placeholders that will be - * filled in later with values when the calculation is done. - * b. Compile the expression into RPN (postfix) to be passed later to evaluateRPN(). - * c. Process the unit of measure, if any, of the result. Save it for later calculation. - * 4. If an assigned value is static, not dynamically calculated, find its value. - * 5. Append all the display strings together. - * 6. Return the result. Hurmet will attach it to ProseMirror "attrs" of that node. - */ - -const containsOperator = /[+\-×·*∘⌧/^%‰&√!¡|‖&=<>≟≠≤≥∈∉⋐∧∨⊻¬]|\xa0(function|mod|\\atop|root|sum|abs|cos|sin|tan|acos|asin|atan|sec|csc|cot|asec|acsc|acot|exp|log|ln|log10|log2|cosh|sinh|tanh|sech|csch|coth|acosh|asinh|atanh|asech|acsch|acoth|gamma|Γ|lgamma|logΓ|lfact|cosd|sind|tand|acosd|asind|atand|secd|cscd|cotd|asecd|acscd|acotd|real|imag|angle|Char|round|sqrt|sign|\?{}|%|⎾⏋|⎿⏌|\[\]|\(\))\xa0/; -const mustDoCalculation = /^(``.+``|[$$£¥\u20A0-\u20CF]?(\?{1,2}|@{1,2}|%{1,2}|!{1,2})[^=!(?@%!{})]*)$/; -const assignDataFrameRegEx = /^[^=]+=\s*``[\s\S]+`` *\n/; -const currencyRegEx = /^[$£¥\u20A0-\u20CF]/; -const matrixOfNames = /^[([](?:[A-Za-zıȷ\u0391-\u03C9\u03D5\u210B\u210F\u2110\u2112\u2113\u211B\u212C\u2130\u2131\u2133]|(?:\uD835[\uDC00-\udc33\udc9c-\udcb5]))[A-Za-z0-9_\u0391-\u03C9\u03D5\u0300-\u0308\u030A\u030C\u0332\u20d0\u20d1\u20d6\u20d7\u20e1]*′*[,;].+[)\]]$/; -const isKeyWord = /^(π|true|false|root|if|else|elseif|and|or|otherwise|mod|for|while|break|return|throw)$/; -const testRegEx = /^(@{1,2})test /; - -const shortcut = (str, decimalFormat) => { - // No calculation in str. Parse it just for presentation. - const tex = parse$1(str, decimalFormat); - return { entry: str, tex, alt: str } -}; - -const compile = (inputStr, decimalFormat = "1,000,000.") => { - let leadStr = ""; - let mainStr = ""; - let trailStr = ""; - let isCalc = false; - let suppressResultDisplay = false; - let displayResultOnly = false; - let omitEcho = false; - let mustAlign = false; - let posOfFirstEquals = 0; - let expression = ""; - let echo = ""; - let rpn = ""; - let dependencies = []; - let resultDisplay = ""; - let name = ""; - let leadsWithCurrency = false; - let value; - let unit; - let dtype; - let str = ""; - - const isModule = moduleRegEx.test(inputStr); - const isDraw = drawRegEx.test(inputStr); - if (functionRegEx.test(inputStr) || isDraw || isModule) { - // This cell contains a custom function. - let name = ""; - if (isDraw) { - name = "draw"; - } else if (isModule) { - name = moduleRegEx.exec(inputStr)[1].trim(); - } else if (!isModule) { - const posFn = inputStr.indexOf("function"); - const posParen = inputStr.indexOf("("); - name = inputStr.slice(posFn + 8, posParen).trim(); - } - const module = scanModule(inputStr, decimalFormat); - const isError = module.dtype && module.dtype === dt.ERROR; - if (isError) { - // eslint-disable-next-line no-alert - window.alert(module.value); - } - const attrs = { - entry: inputStr, - name, - value: (isError || isModule) ? module.value : module.value[name], - // TODO: what to do with comma decimals? - resultdisplay: "\\text{" + name + "}", - dtype: isError ? dt.ERROR : name === "draw" ? dt.DRAWING : dt.MODULE, - error: isError - }; - return attrs - } - - str = inputStr; - - if (testRegEx.test(inputStr)) { - str = str.replace(testRegEx, "").trim(); - const [_, rpn, dependencies] = parse$1(str, decimalFormat, true); - const resulttemplate = testRegEx.exec(inputStr)[1]; - return { entry: inputStr, template: "", rpn, dependencies, resulttemplate, - altresulttemplate: resulttemplate, resultdisplay: "" } - } - - const isDataFrameAssigment = assignDataFrameRegEx.test(str); - const posOfLastEquals = isDataFrameAssigment - ? str.indexOf("=") + 1 - : str.lastIndexOf("=") + 1; - - if (posOfLastEquals > 1) { - // input has form: mainStr = trailStr - mainStr = str.substring(0, posOfLastEquals - 1).replace(/ +$/, ""); - if (mainStr.length > 0 && /;\s*$/.test(mainStr)) { - mustAlign = true; - mainStr = mainStr.replace(/;\s*$/, ""); - } - mainStr = mainStr.trim(); - trailStr = str.substring(posOfLastEquals).trim(); - - if (mustDoCalculation.test(trailStr)) { - // trailStr contains a ? or a @ or a % or a !. In other words, - // input has form: mainStr = something [?@%!] something - // The [?@%!] signals that the author wants a calculation done. - isCalc = true; - - // A ! tells us to calculate and save the result, but to NOT display the result. - suppressResultDisplay = trailStr.indexOf("!") > -1; - - // A @ tells us to display only the result. - displayResultOnly = trailStr.indexOf("@") > -1; - - omitEcho = trailStr.indexOf("%") > -1; - - posOfFirstEquals = mainStr.indexOf("=") + 1; - if (posOfFirstEquals) { - // input has form: leadStr = something = trailStr - leadStr = mainStr.slice(0, posOfFirstEquals - 1).trim(); - - // Input has form: name = expression = trailStr, or - // name1, name2, = expression = trailStr - expression = mainStr.substring(posOfFirstEquals).trim(); - if (matrixOfNames.test(leadStr)) { leadStr = leadStr.slice(1, -1).trim(); } - if (/[,;]/.test(leadStr)) { - const potentialIdentifiers = leadStr.split(/[,;]/); - for (let i = 0; i < potentialIdentifiers.length; i++) { - const candidate = potentialIdentifiers[i].trim(); - if (isKeyWord.test(candidate) || !isValidIdentifier$1.test(candidate)) { - // leadStr is not a list of valid identifiers. - // So this isn't a valid calculation statement. Let's finish early. - return shortcut(str, decimalFormat) - } - } - // multiple assignment. - name = potentialIdentifiers.map(e => e.trim()); - - } else { - if (isValidIdentifier$1.test(leadStr) && !isKeyWord.test(leadStr)) { - name = leadStr; - } else { - // The "=" sign is inside an expression. There is no lead identifier. - // This statement does not assign a value to a variable. But it may do a calc. - // input has form: expression = trailStr - expression = mainStr; - } - } - } else { - // This calculation string contains only one "=" character. - // input has form: expression = trailStr - expression = mainStr; - } - } else if (isDataFrameAssigment) { - name = mainStr; - expression = trailStr; - } else if (isValidIdentifier$1.test(mainStr) && !isKeyWord.test(mainStr)) { - // No calculation display selector is present, - // but there is one "=" and a valid idendtifier. - // It may be an assignment statement. - // input has form: name = trailStr - name = mainStr; - if (trailStr === "") { - const tex = parse$1(str, decimalFormat); - return { entry: str, tex, alt: str } - } - } else { - // input has form: mainStr = trailStr. - // It almost works as an assignment statment, but mainStr is not a valid identifier. - // So we'll finish early. - return shortcut(str, decimalFormat) - } - } else { - // str contains no "=" character. Let's fnish early. - return shortcut(str, decimalFormat) - } - - if (expression.length > 0) { - // The author may want a calculation done on the expression. - if (/^\s*fetch\(/.test(expression)) { - // fetch() functions are handled in updateCalculations.js, not here. - // It's easier from there to send a fetch() callback to a ProseMirror transaction. - echo = ""; - - } else { - // Parse the expression. Stop short of doing the calculation. - [echo, rpn, dependencies] = parse$1(expression, decimalFormat, true); - - // Shoulld we display an echo of the expression, with values shown for each variable? - if (suppressResultDisplay || displayResultOnly || echo.indexOf("〖") === -1 - || /\u00a0for\u00a0/.test(rpn)) { - // No. - echo = ""; - } else if (omitEcho) { - echo = ""; - } else { - // The expression calls a variable. - // If it also contains an operator or a function, then we need to show the echo. - if (containsOperator.test("\xa0" + rpn + "\xa0")) { - echo = "\\textcolor{#0000ff}{" + echo + "}"; - } else { - echo = ""; - } - } - } - } - - // Now let's turn our attention from the expression to the trailStr. - if (currencyRegEx.test(trailStr)) { - leadsWithCurrency = true; - unit = trailStr.charAt(0); - } - - if (isCalc) { - // trailStr contains a display selector. - value = null; - - if (!leadsWithCurrency) { - // Check for a unit, even if it isn't a unit-aware calculation - unit = trailStr.replace(/[?@%!']/g, "").trim(); - } - - if (suppressResultDisplay) { - resultDisplay = trailStr; - } else { - if (unit) { - resultDisplay = trailStr.trim().replace(/([^ ?!@%]+)$/, "'" + "$1" + "'"); - resultDisplay = parse$1(resultDisplay, decimalFormat).replace(/\\%/g, "%").replace("@ @", "@@"); - } else { - resultDisplay = parse$1(trailStr, decimalFormat).replace(/\\%/g, "%").replace("@ @", "@@"); - } - resultDisplay = resultDisplay.replace(/\\text\{(\?\??|%%?)\}/, "$1"); - resultDisplay = resultDisplay.replace(/([?%]) ([?%])/, "$1" + "$2"); - } - - } else { - // trailStr may be a static value in an assignment statement. - // Check if trailStr is a valid literal. - [value, unit, dtype, resultDisplay] = valueFromLiteral(trailStr, name, decimalFormat); - - if (dtype === dt.ERROR) { return shortcut(str, decimalFormat) } - rpn = ""; - } - - // Assemble the equation to display - let eqn = ""; - let altEqn = ""; - if (!displayResultOnly) { - eqn = parse$1(mainStr, decimalFormat); - if (mustAlign) { - eqn = "\\begin{aligned}" + eqn; - const pos = eqn.indexOf("="); - eqn = eqn.slice(0, pos) + "&" + eqn.slice(pos); - } - const alignChar = mustAlign ? "\\\\ &" : ""; - altEqn = mainStr; - if (echo.length > 0 && !omitEcho) { - eqn += ` ${alignChar}= ` + echo; - } - if (!suppressResultDisplay) { - eqn += " " + (mustAlign ? "\\\\&" : "") + "= " + resultDisplay; - altEqn += " = " + trailStr; - } - if (mustAlign) { eqn += "\\end{aligned}"; } - } - - // Populate the object to be returned. - // It will eventually be attached to ProseMirror schema attrs, so call it "attrs". - const attrs = { - entry: str, - template: eqn, - altTemplate: altEqn, - resultdisplay: resultDisplay, - dtype: dtype, - error: false - }; - - if (name) { attrs.name = name; } - if (isCalc) { - attrs.resulttemplate = resultDisplay; - attrs.altresulttemplate = trailStr; - } else { - attrs.tex = eqn; - attrs.alt = altEqn; - } - if (rpn) { attrs.rpn = rpn; } - if (dependencies.length > 0) { attrs.dependencies = dependencies; } - if (value) { attrs.value = value; } - if (unit) { - if (rpn && !attrs.value) { - attrs.unit = typeof unit === "string" - ? unitFromUnitName(unit) - : { factor: 1, gauge: 0, expos: allZeros }; - } else { - attrs.unit = Array.isArray(unit) ? { expos: unit } : unit; - } - } - - return attrs -}; - -// This function is not used by the hurmet.org page. -// It is provided for use by unit tests and by the demo box in the manual page. -// If you are looking for the app's main calculation module, try evaluate.js. -const calculate = ( - entry, - vars = {}, - inDraftMode = false, - decimalFormat = "1,000,000." -) => { - let attrs = compile(entry, decimalFormat); - if (attrs.rpn) { - attrs = evaluate(clone(attrs), vars, decimalFormat); - } else if (attrs.dtype && attrs.dtype === dt.DRAWING) { - attrs = evaluateDrawing(attrs, vars, decimalFormat); - } - if (attrs.name) { - insertOneHurmetVar(vars, attrs); - } - return attrs.dtype && attrs.dtype === dt.DRAWING - ? attrs - : inDraftMode - ? attrs.alt - : attrs.tex -}; - -/* - * This module organizes one or two passes through the data structure of a Hurmet - * document, calling for a calculation to be done on each Hurmet calculation cell. - * If you are looking for the calculation itself, look at evaluate.js. - * - * To be more precise, this module is called: - * 1. When an author submits one calculation cell, or - * 2. When a new Hurmet.org instance has opened (from index.js), or - * 3. When a user has opened a new file (from openFile.js), or - * 4. When a recalculate-all has been called, possibly after a paste. (from menu.js) - * - * Case 1 calculates the submitted cell and all dependent calculation cells. - * Cases 2 thru 4 re-calculate the entire document. I.e., isCalcAll is set to true. - * After calculation is complete, we send the results to ProseMirror to be - * rendered in the document. - * - * This module's main exported function is updateCalculations(…) - */ - -/* -* Note 1: state.selection shenanigans -* -* Before creating a ProseMirror (PM) transaction, this module first changes `state.selection`. -* That is to say, I change the PM state without running that change thru a PM transaction. -* PM docs advise against that, so I want to explain why I do so. -* -* For Undo purposes, a calculation should be atomic. -* An Undo of a calculation should return the doc to the condition before the -* calculation cell was edited. That will feel natural to people accustomed to Excel. -* When a calculation is submitted, Hurmet creates a single PM transaction and into it, -* Hurmet collects all the changes that the calculation makes to the original cell and -* also all the changes to dependent cells. -* When a user submits a calculation, the cell is open, so a PM Undo would ordinarily return -* the state to a condition that once again has the cell open. -* -* But now consider a user who wants to Undo twice. The first Undo retreats to a condition in -* which a cell is open. The user thinks a second Undo will change the PM document. But no! -* Because the cell is open, the CodeMirror plain text editor is active and the Undo is captured -* by CodeMirror. An Undo affects CodeMirror but not the outer document. It's very confusing! -* So the Undo should return to a condition in which the cell is closed. That's why I change -* the PM state.selection object _before_ I create the PM transaction. I don't want an Undo to -* open that cell and so I don't want the Undo to finish with the selection point inside the -* cell. Before creating the transaction, I move the selection point to just after the cell. -*/ - -const fetchRegEx = /^(?:[A-Za-zıȷ\u0391-\u03C9\u03D5\u210B\u210F\u2110\u2112\u2113\u211B\u212C\u2130\u2131\u2133]|(?:\uD835[\uDC00-\udc33\udc9c-\udcb5]))[A-Za-z0-9_\u0391-\u03C9\u03D5\u0300-\u0308\u030A\u030C\u0332\u20d0\u20d1\u20d6\u20d7\u20e1]*′* *= *(?:fetch|import)\(/; -const importRegEx = /^[^=]+= *import/; -const fileErrorRegEx = /^Error while reading file. Status Code: \d*$/; -const textRegEx = /\\text{[^}]+}/; - -const urlFromEntry = entry => { - // Get the URL from the entry input string. - const str = entry.replace(/^[^()]+\("?/, ""); - return str.replace(/"?\).*$/, "").trim() -}; - -// Helper function. -const processFetchedString = (entry, text, hurmetVars, decimalFormat) => { - const attrs = Object.create(null); - attrs.entry = entry; - attrs.name = entry.replace(/=.+$/, "").trim(); - let str = parse$1(entry.replace(/\s*=\s*[$$£¥\u20A0-\u20CF]?(?:!{1,2}).*$/, ""), decimalFormat); - const url = urlFromEntry(entry); - if (/\.(?:tsv|txt)$/.test(url)) { - // Shorten the URL. - const fileName = url.replace(/.+\//, ""); - const match = textRegEx.exec(str); - str = str.slice(0, match.index) + "\\text{" + addTextEscapes(fileName) + "})"; - } - attrs.tex = str; - attrs.alt = entry; - if (text === "File not found." || fileErrorRegEx.test(text)) { - attrs.dtype = dt.ERROR; - attrs.tex += ` = \\red{\\text{${text}}}`; - attrs.alt = " = " + text; - attrs.value = null; - return attrs - } - const data = importRegEx.test(entry) - ? scanModule(text, decimalFormat) // import code - : DataFrame.dataFrameFromTSV(text); // fetch data - - // Append the data to attrs - attrs.value = data.value; - attrs.dtype = data.dtype; - attrs.unit = data.unit; - attrs.isFetch = true; - attrs.fallback = data.dtype === dt.MODULE ? text : ""; - if (data.dtype === dt.MODULE && /^importedParameters *=/.test(entry)) { - // Assign to multiple variables, not one namespace. - let nameTex = "\\begin{matrix}"; - let i = 0; - Object.entries(data.value).forEach(([key, value]) => { - hurmetVars[key] = value; - nameTex += parse$1(value.name) + " & "; - i += 1; - if (i === 5) { - nameTex = nameTex.slice(0, -1) + "\\\\ "; - i = 0; - } - }); - nameTex = nameTex.slice(0, (i === 0 ? -2 : -1)) + "\\end{matrix}"; - attrs.tex = attrs.tex.replace("\\mathrm{importedParameters}", nameTex); - } - return attrs -}; - -const mustCalc = (attrs, hurmetVars, changedVars, isCalcAll, isFormat) => { - if (isCalcAll || isFormat) { return true } - if (attrs.rpn && !(attrs.name && hurmetVars[attrs.name] && hurmetVars[attrs.name].isFetch)) { - for (const varName of attrs.dependencies) { - if (changedVars.has(varName)) { return true } - } - } - if (attrs.dtype && attrs.dtype === dt.DRAWING && attrs.value.parameters && - attrs.value.parameters.length > 0) { - for (const parameter of attrs.value.parameters) { - if (changedVars.has(parameter)) { return true } - } - } - return false -}; - -const workWithFetchedTexts = ( - view, - doc, - inDraftMode, - decimalFormat, - calcNodeSchema, - isCalcAll, - nodeAttrs, - curPos, - hurmetVars, - fetchPositions, - texts -) => { - // At this point, we have the text of each Hurmet fetch and import. - // Create a ProseMirror transaction. - // Each node update below will be one step in the transaction. - const state = view.state; - if (state.selection.to === curPos + 1) { - // See Note 1 above for an explanation of the state.selection shenanigans. - state.selection = state.selection.constructor.near(state.doc.resolve(curPos + 1)); - } - const tr = state.tr; - - // Load in the data from the fetch statements - for (let i = 0; i < texts.length; i++) { - const pos = fetchPositions[i]; - const entry = isCalcAll - ? doc.nodeAt(pos).attrs.entry - : nodeAttrs.entry; - const attrs = processFetchedString(entry, texts[i], hurmetVars, decimalFormat); - attrs.inDraftMode = inDraftMode; - tr.replaceWith(pos, pos + 1, calcNodeSchema.createAndFill(attrs)); - if (attrs.name) { - insertOneHurmetVar(hurmetVars, attrs, null, decimalFormat); - } - } - // There. Fetches are done and are loaded into the document. - // Now proceed to the rest of the work. - proceedAfterFetch(view, calcNodeSchema, isCalcAll, nodeAttrs, curPos, hurmetVars, tr); - -}; - -const workAsync = ( - view, - calcNodeSchema, - isCalcAll, - nodeAttrs, - curPos, - hurmetVars, - urls, - fetchPositions -) => { - - // Here we fetch the remote data. - const doc = view.state.doc; - const inDraftMode = doc.attrs.inDraftMode; - const decimalFormat = doc.attrs.decimalFormat; - - if (!navigator.onLine) { - const texts = []; - for (const url of urls) { - Object.keys(doc.attrs.fallbacks).forEach(function(key) { - if (doc.attrs.fallbacks[key].url === url) { - texts.push(doc.attrs.fallbacks[key].text); - } - }); - } - workWithFetchedTexts(view, doc, inDraftMode, decimalFormat, calcNodeSchema, isCalcAll, - nodeAttrs, curPos, hurmetVars, fetchPositions, texts); - } else { - Promise.all( - urls.map(url => fetch(url, { - method: "GET", - headers: { "Content-Type": "text/plain;charset=UTF-8" }, - mode: "cors" - })) - ).then(fetchResponses => { - // The fetch promises have resolved. Now we extract their text. - return Promise.all(fetchResponses.map(r => { - if (r.status !== 200 && r.status !== 0) { - // The fetch failed. Try for a fallback. - Object.keys(doc.attrs.fallbacks).forEach(function(key) { - if (doc.attrs.fallbacks[key].url === r.url) { - return doc.attrs.fallbacks[key].text - } - }); - return r.status === 404 - ? 'File not found.' - : 'Error while reading file. Status Code: ' + r.status - } - return r.text() - })) - }).then((texts) => { - workWithFetchedTexts(view, doc, inDraftMode, decimalFormat, calcNodeSchema, isCalcAll, - nodeAttrs, curPos, hurmetVars, fetchPositions, texts); - }); - } -}; - -const proceedAfterFetch = ( - view, - calcNodeSchema, - isCalcAll, - nodeAttrs, - curPos, - hurmetVars, - tr -) => { - // This function happens either - // 1. After remote, fetched data has been processed, or - // 2. After we know that no fetch statements need be processed. - const doc = view.state.doc; - const decimalFormat = doc.attrs.decimalFormat; - // Create a set to track which variable have a changed value. - const changedVars = isCalcAll ? null : new Set(); - - if (!isCalcAll && (nodeAttrs.name || nodeAttrs.rpn || - (nodeAttrs.dtype && nodeAttrs.dtype === dt.DRAWING))) { - // Load hurmetVars with values from earlier in the document. - doc.nodesBetween(0, curPos, function(node) { - if (node.type.name === "calculation") { - const attrs = node.attrs; - if (attrs.name) { - if (attrs.name === "importedParameters") { - Object.entries(attrs.value).forEach(([key, value]) => { - hurmetVars[key] = value; - }); - } else { - insertOneHurmetVar(hurmetVars, attrs, null, decimalFormat); - } - } - } - }); - - // Hoist any user-defined functions located below the selection. - doc.nodesBetween(curPos + 1, doc.content.size, function(node, pos) { - if (node.type.name === "calculation" && node.attrs.dtype === dt.MODULE) { - insertOneHurmetVar(hurmetVars, node.attrs, null, decimalFormat); - } - }); - - // Calculate the current node. - if (!fetchRegEx.test(nodeAttrs.entry)) { - // This is the typical calculation statement. We'll evalutate it. - let attrs = clone(nodeAttrs); // compile was already run in mathprompt.js. - // The mathPrompt dialog box did not have accesss to hurmetVars, so it - // did not do unit conversions on the result template. Do that first. - try { - // Proceed to do the calculation of the cell. - if (attrs.rpn || (nodeAttrs.dtype && nodeAttrs.dtype === dt.DRAWING)) { - attrs = attrs.dtype && attrs.dtype === dt.DRAWING - ? evaluateDrawing(attrs, hurmetVars, decimalFormat) - : evaluate(attrs, hurmetVars, decimalFormat); - } - if (attrs.name) { insertOneHurmetVar(hurmetVars, attrs, changedVars, decimalFormat); } - //attrs.displayMode = nodeAttrs.displayMode - } catch (err) { - attrs.tex = "\\text{" + attrs.entry + " = " + err + "}"; - } - tr.replaceWith(curPos, curPos + 1, calcNodeSchema.createAndFill(attrs)); - } - } - - // Finally, update calculations after startPos. - const startPos = isCalcAll ? 0 : (curPos + 1); - const isFormat = (nodeAttrs && nodeAttrs.name && nodeAttrs.name === "format"); - doc.nodesBetween(startPos, doc.content.size, function(node, pos) { - if (node.type.name === "calculation") { - const notFetched = isCalcAll ? !fetchRegEx.test(node.attrs.entry) : !node.attrs.isFetch; - if (notFetched) { - const entry = node.attrs.entry; - let attrs = isCalcAll - ? compile(entry, decimalFormat) - : clone(node.attrs); - attrs.displayMode = node.attrs.displayMode; - const mustRedraw = attrs.dtype && attrs.dtype === dt.DRAWING && - (attrs.rpn || (attrs.value.parameters.length > 0 || isCalcAll)); - if (mustCalc(attrs, hurmetVars, changedVars, isCalcAll, isFormat)) { - try { - if (attrs.rpn || mustRedraw) { - attrs.error = false; - attrs = attrs.rpn // attrs.dtype && attrs.dtype === dt.DRAWING - ? evaluate(attrs, hurmetVars, decimalFormat) - : evaluateDrawing(attrs, hurmetVars, decimalFormat); - } - if (attrs.name) { - insertOneHurmetVar(hurmetVars, attrs, changedVars, decimalFormat); - } - } catch (err) { - attrs.tex = "\\text{" + attrs.entry + " = " + err + "}"; - } - if (isCalcAll || attrs.rpn || mustRedraw) { - tr.replaceWith(pos, pos + 1, calcNodeSchema.createAndFill(attrs)); - } - } else if (attrs.name && attrs.value) { - insertOneHurmetVar(hurmetVars, attrs, null, decimalFormat); - } - } else if (node.attrs.name && !(isCalcAll && node.attrs.isFetch)) { - if (node.attrs.name) { - if (node.attrs.name === "importedParameters") { - Object.entries(node.attrs.value).forEach(([key, value]) => { - hurmetVars[key] = value; - }); - } else { - insertOneHurmetVar(hurmetVars, node.attrs, null, decimalFormat); - } - } - } - } - }); - - // All the steps are now loaded into the transaction. - // Dispatch the transaction to ProseMirror, which will re-render the document. - if (!isCalcAll) { - tr.setSelection(view.state.selection.constructor.near(tr.doc.resolve(curPos + 1))); - } - view.dispatch(tr); - view.focus(); -}; - -function updateCalculations( - view, - calcNodeSchema, - isCalcAll = false, - nodeAttrs, - curPos -) { - const doc = view.state.doc; - - if (!(isCalcAll || nodeAttrs.name || nodeAttrs.rpn || - (nodeAttrs.dtype && nodeAttrs.dtype === dt.DRAWING))) { - // No calculation is required. Just render the node and get out. - const state = view.state; - if (state.selection.to === curPos + 1) { - // See Note 1 above for an explanation of the state.selection shenanigans. - state.selection = state.selection.constructor.near(state.doc.resolve(curPos + 1)); - } - const tr = state.tr; - try { - tr.replaceWith(curPos, curPos + 1, calcNodeSchema.createAndFill(nodeAttrs)); - } catch (err) { - // nada - } finally { - view.dispatch(tr); - view.focus(); - } - return - } - - // Create an object in which we'll hold variable values. - const hurmetVars = Object.create(null); - hurmetVars.format = { value: "h15" }; // default rounding format - - // Get an array of all the URLs called by fetch statements. - const urls = []; - const fetchPositions = []; - if (!isCalcAll) { - // The author has submitted a single calculation cell. - const entry = nodeAttrs.entry; - if (fetchRegEx.test(entry)) { - urls.push(urlFromEntry(entry)); - fetchPositions.push(curPos); - } - } else { - // We're updating the entire document. - doc.nodesBetween(0, doc.content.size, function(node, pos) { - if (node.type.name === "calculation" && !node.attrs.value) { - const entry = node.attrs.entry; - if (fetchRegEx.test(entry)) { - urls.push(urlFromEntry(entry)); - fetchPositions.push(pos); - } else if (/^function /.test(entry)) { - node.attrs = compile(entry, doc.attrs.decimalFormat); - insertOneHurmetVar(hurmetVars, node.attrs, null, doc.attrs.decimalFormat); - } - } else if (node.attrs.isFetch || (node.attrs.dtype && node.attrs.dtype === dt.MODULE)) { - insertOneHurmetVar(hurmetVars, node.attrs, null, doc.attrs.decimalFormat); - } - }); - } - - if (urls.length > 0) { - // We have to fetch some remote data. Asynchronous work ahead. - workAsync(view, calcNodeSchema, isCalcAll, nodeAttrs, curPos, - hurmetVars, urls, fetchPositions); - } else { - // Skip the fetches and go directly to work that we can do synchronously. - const state = view.state; - if (state.selection.to === curPos + 1) { - // See Note 1 above for an explanation of the state.selection shenanigans. - state.selection = state.selection.constructor.near(state.doc.resolve(curPos + 1)); - } - const tr = state.tr; - proceedAfterFetch(view, calcNodeSchema, isCalcAll, nodeAttrs, curPos, hurmetVars, tr); - } -} - -const helpers = Object.freeze({ - fetchRegEx, - textRegEx, - urlFromEntry, - processFetchedString -}); - -async function fetchTexts(urls) { - // Here we fetch remote data. - return Promise.all( - urls.map(url => fetch(url, { - method: "GET", - headers: { "Content-Type": "text/plain;charset=UTF-8" }, - mode: "cors" - })) - ).then(fetchResponses => { - // The fetch promises have resolved. Now we extract their text. - return Promise.all(fetchResponses.map(r => { - if (r.status !== 200 && r.status !== 0) { - return r.status === 404 - ? 'File not found.' - : 'Error while reading file. Status Code: ' + r.status - } - return r.text() - })) - }).then((texts) => { - // At this point, we have the text of each Hurmet fetch and import. - return texts - }) -} - -async function getRemoteTexts(urls) { - // This is necessary to return text, not just a promise of text. - return await fetchTexts(urls) -} - -const getCalcNodes = (ast, calcNodes) => { - // Create an array of calculation nodes. - if (Array.isArray(ast)) { - for (let i = 0; i < ast.length; i++) { - getCalcNodes(ast[i], calcNodes); - } - } else if (ast && ast.type === "calculation") { - calcNodes.push(ast); - // eslint-disable-next-line no-prototype-builtins - } else if (ast.hasOwnProperty("content")) { - for (let j = 0; j < ast.content.length; j++) { - getCalcNodes(ast.content[j], calcNodes); - } - } -}; - -async function updateCalcs(doc) { - // This function is a lot like what updateCalculations.js does for the Hurmet web site. - - // Create an object in which we'll hold variable values. - const hurmetVars = Object.create(null); - hurmetVars.format = { value: "h15" }; // default rounding format - const decimalFormat = doc.attrs ? doc.attrs.decimalFormat : '1,000,000.'; - - // Create an array of all the calculation nodes in the document - const calcNodes = []; - getCalcNodes(Array.isArray(doc) ? doc : doc.content, calcNodes); - if (calcNodes.length === 0) { return doc } - - // Get an array of all the URLs called by fetch statements. - const urls = []; - const callers = []; - for (const node of calcNodes) { - const entry = node.attrs.entry; - if (helpers.fetchRegEx.test(entry)) { - urls.push(helpers.urlFromEntry(entry)); - callers.push(node); - } else if (/^function /.test(entry)) { - node.attrs = compile(entry, decimalFormat); - insertOneHurmetVar(hurmetVars, node.attrs, null, decimalFormat); - } - } - - if (urls.length > 0) { - // We have to fetch some remote data. - const texts = await getRemoteTexts(urls); - // Fetches are now complete. Load in the data. - for (let i = 0; i < texts.length; i++) { - const node = callers[i]; - const entry = node.attrs.entry; - // When we modify a node, we are also mutating the container doc. - node.attrs = helpers.processFetchedString(entry, texts[i], hurmetVars, decimalFormat); - if (node.attrs.name) { - if (node.attrs.name === "importedParameters") { - Object.entries(node.attrs.value).forEach(([key, value]) => { - hurmetVars[key] = value; - }); - } else { - insertOneHurmetVar(hurmetVars, node.attrs, null, decimalFormat); - } - } - } - } - - // Fetches, if any, are now complete and loaded into hurmetVars. - // Make a pass through the calculation nodes and calculate each result. - try { - for (const node of calcNodes) { - if (!helpers.fetchRegEx.test(node.attrs.entry)) { - const entry = node.attrs.entry; - let attrs = compile(entry, decimalFormat); - attrs.displayMode = node.attrs.displayMode; - const mustDraw = attrs.dtype && attrs.dtype === dt.DRAWING; - if (attrs.rpn || mustDraw) { - attrs = attrs.rpn - ? evaluate(attrs, hurmetVars, decimalFormat) - : evaluateDrawing(attrs, hurmetVars, decimalFormat); - } - if (attrs.name) { insertOneHurmetVar(hurmetVars, attrs, null, decimalFormat); } - // When we modify a node, we are also mutating the container doc. - node.attrs = attrs; - } - } - return doc - } catch (err) { - console.log(err); // eslint-disable-line no-console - } -} - -const sanitizeUrl = function(url) { - if (url == null) { - return null; - } - try { - const prot = decodeURIComponent(url) - .replace(/[^A-Za-z0-9/:]/g, "") - .toLowerCase(); - if ( - prot.indexOf("javascript:") === 0 || - prot.indexOf("vbscript:") === 0 || - prot.indexOf("data:") === 0 - ) { - return null; - } - } catch (e) { - // decodeURIComponent sometimes throws a URIError - // See `decodeURIComponent('a%AFc');` - // http://stackoverflow.com/questions/9064536/javascript-decodeuricomponent-malformed-uri-exception - return null; - } - return url; -}; - -const SANITIZE_TEXT_R = /[<>&"']/g; -const SANITIZE_TEXT_CODES = { - "<": "<", - ">": ">", - "&": "&", - '"': """, - "'": "'", - "/": "/", - "`": "`" -}; -const sanitizeText = function(text /* : Attr */) { - return String(text).replace(SANITIZE_TEXT_R, function(chr) { - return SANITIZE_TEXT_CODES[chr]; - }); -}; - -const htmlTag = (tagName, content, attributes = {}, isClosed = true) => { - let attributeString = ""; - for (const attr in attributes) { - if (Object.prototype.hasOwnProperty.call(attributes, attr)) { - const attribute = attributes[attr]; - // Removes falsey attributes - if (attribute) { - const sanitizedAttribute = attr === "src" - ? attribute.replace(//g, "%3E") - : sanitizeText(attribute); - attributeString += " " + sanitizeText(attr) + '="' + sanitizedAttribute + '"'; - } - } - } - - const unclosedTag = "<" + tagName + attributeString + ">"; - - if (isClosed) { - if (content.charAt(content.length - 1) === "\n") { - content = content.slice(0, -1); - } - return unclosedTag + content + ""; - } else { - return unclosedTag; - } -}; - -const tagName = { - em: "em", - strong: "strong", - code: "code", - strikethru: "del", - subscript: "sub", - superscript: "sup", - underline: "u", - highlight: "mark" -}; - -const quoteRegEx = /"/g; -const dataStr = str => { - if (str.indexOf("'") === -1) { - return `'${str}'` - } else if (str.indexOf('"') === -1) { - return `"${str}"` - } else { - return `"${str.replace(quoteRegEx, """)}"` - } -}; - -const writeSVG = dwg => { - let svg = ' { - svg += ` ${key}='${dwg.attrs[key]}'`; - }); - svg += ">\n"; - dwg.children.forEach(el => { - svg += `<${el.tag}`; - Object.keys(el.attrs).forEach(attr => { - if (el.tag !== "title") { - svg += ` ${attr}='${el.attrs[attr]}'`; - } - }); - svg += ">\n"; - if (el.tag === "text") { - el.children.forEach(child => { - svg += ' { - svg += ` ${mark}='${child.attrs[mark]}'`; - }); - } - svg += `>${sanitizeText(child.text)}`; - }); - } else if (el.tag === "defs") { - svg += ``; - } else if (el.tag === "title") { - svg += sanitizeText(el.attrs.text); - } - svg += `\n`; - }); - svg += ""; - return svg -}; - -const functionOrModuleRegEx = /^ *(?:function|module) /; - -const writeTOC = node => { - let toc = "
      \n"; - for (const item of node.attrs.body) { - let li = " 0) { li += ` style= 'margin-left: ${String(1.5 * item[1])}em'`; } - li += `>${item[0]}0\n`; - toc += li; - } - return toc + "
    \n" -}; - -const headingText = content => { - let str = ""; - for (const node of content) { - if (node.type && node.type === "text") { - str += node.text; - } - } - return sanitizeText(str) -}; - -const headings = []; - -const nodes = { - html(node) { return node.text }, - heading(node) { - const text = headingText(node.content); - let tag = "h" + node.attrs.level; - tag = htmlTag(tag, text); - if (!headings.includes(text)) { - // Add an id so others can link to it. - tag = tag.slice(0, 3) + " id='" + text.toLowerCase().replace(/,/g, "").replace(/\s+/g, '-') + "'" + tag.slice(3); - headings.push(text); - } - return tag + "\n" - }, - paragraph(node) { return htmlTag("p", ast2html(node.content)) + "\n" }, - blockquote(node) { return htmlTag("blockquote", ast2html(node.content)) }, - code_block(node) { - return htmlTag("pre", htmlTag("code", sanitizeText(node.content[0].text))) - }, - hard_break(node) { return "
    " }, - def(node) { return "" }, - newline(node) { return "\n" }, - horizontal_rule(node) { return "
    \n" }, - ordered_list(node) { - const attributes = node.attrs.order !== 1 ? { start: node.attrs.order } : undefined; - return htmlTag("ol", ast2html(node.content), attributes) + "\n" - }, - bullet_list(node) { return htmlTag("ul", ast2html(node.content)) + "\n" }, - list_item(node) { return htmlTag("li", ast2html(node.content)) + "\n" }, - tight_list_item(node) { - return htmlTag("li", ast2html(node.content), { class: "tight" }) + "\n" - }, - table(node) { return htmlTag("table", ast2html(node.content), node.attrs) + "\n" }, - colGroup(node) { - return "\n" + htmlTag("colgroup", ast2html(node.content), node.attrs) + "\n" - }, - col(node) { return htmlTag("col", "", node.attrs[0], false) }, - table_row(node) { return htmlTag("tr", ast2html(node.content)) + "\n" }, - table_header(node) { - const attributes = {}; - if (node.attrs.colspan !== 1) { attributes.colspan = node.attrs.colspan; } - if (node.attrs.rowspan !== 1) { attributes.rowspan = node.attrs.rowspan; } - return htmlTag("th", ast2html(node.content), attributes) + "\n" - }, - table_cell(node) { - const attributes = {}; - if (node.attrs.colspan !== 1) { attributes.colspan = node.attrs.colspan; } - if (node.attrs.rowspan !== 1) { attributes.rowspan = node.attrs.rowspan; } - return htmlTag("td", ast2html(node.content), attributes) - }, - link(node) { - const attributes = { href: sanitizeUrl(node.attrs.href), title: node.attrs.title }; - return htmlTag("a", ast2html(node.content), attributes); - }, - image(node) { - const attributes = { src: node.attrs.src }; - if (node.attrs.alt) { attributes.alt = node.attrs.alt; } - if (node.attrs.class) { attributes.class = node.attrs.class; } - if (node.attrs.id) { attributes.id = node.attrs.id; } - if (node.attrs.width) { attributes.width = node.attrs.width; } - return htmlTag("img", "", attributes, false); - }, - figure(node) { return htmlTag("figure", ast2html(node.content)) + "\n" }, - figcaption(node) { return htmlTag("figcaption", ast2html(node.content)) }, - figimg(node) { - const attributes = { src: node.attrs.src, class: "figimg" }; - if (node.attrs.alt) { attributes.alt = node.attrs.alt; } - if (node.attrs.id) { attributes.id = node.attrs.id; } - if (node.attrs.width) { attributes.width = node.attrs.width; } - return htmlTag("img", "", attributes, false) + "\n"; - }, - footnote(node) { return htmlTag("footnote", "") }, - calculation(node) { - if (node.attrs.dtype && node.attrs.dtype === dt.DRAWING) { - const svg = writeSVG(node.attrs.resultdisplay); - const style = svg.indexOf('float="right"' > -1) ? " style='float: right;'" : ""; - return `` + - `${svg}` - } else if (node.attrs.dtype && node.attrs.dtype === dt.MODULE && - functionOrModuleRegEx.test(node.attrs.entry)) { - return `` - + `${sanitizeText(node.attrs.entry)}` - } else { - const tex = node.attrs.tex ? node.attrs.tex : parse$1(node.attrs.entry); - // eslint-disable-next-line no-undef - const mathML = globalThis.temml.renderToString( - tex, - { trust: true, wrap: "=", displayMode: (node.attrs.displayMode || false) } - ); - const tag = node.attrs.displayMode ? "p" : "span"; - return `<${tag} class='hurmet-calc' data-entry=${dataStr(node.attrs.entry)}>` + - `${mathML}` - } - }, - tex(node) { - // eslint-disable-next-line no-undef - const mathML = globalThis.temml.renderToString( - node.attrs.tex, - { trust: true, displayMode: (node.attrs.displayMode || false) } - ); - const tag = node.attrs.displayMode ? "p" : "span"; - return `<${tag} class='hurmet-tex' data-entry=${dataStr(node.attrs.tex)}>` + - `${mathML}` - }, - indented(node) { - return htmlTag("div", ast2html(node.content), { class: 'indented' }) + "\n" - }, - boxed(node) { - return htmlTag("div", ast2html(node.content), { class: 'boxed' }) + "\n" - }, - centered(node) { - return htmlTag("div", ast2html(node.content), { class: 'centered' }) + "\n" - }, - right_justified(node) { - return htmlTag("div", ast2html(node.content), { class: 'right_justified' }) + "\n" - }, - hidden(node) { - return htmlTag("div", ast2html(node.content), { class: 'hidden' }) + "\n" - }, - epigraph(node) { - return htmlTag("blockquote", ast2html(node.content), { class: 'epigraph' }) + "\n" - }, - note(node) { - return htmlTag("div", ast2html(node.content), { class: 'note' }) + "\n" - }, - tip(node) { - return htmlTag("div", ast2html(node.content), { class: 'tip' }) + "\n" - }, - important(node) { - return htmlTag("div", ast2html(node.content), { class: 'important' }) + "\n" - }, - warning(node) { - return htmlTag("div", ast2html(node.content), { class: 'warning' }) + "\n" - }, - header(node) { - return htmlTag("header", ast2html(node.content)) + "\n" - }, - toc(node) { return writeTOC(node) }, - comment(node) { - return htmlTag("aside", ast2html(node.content), { class: 'comment' }) + "\n" - }, - dt(node) { - let text = ast2html(node.content); - let tag = htmlTag("dt", text); - // Add id so others can link to it. - const pos = text.indexOf("("); - if (pos > -1) { text = text.slice(0, pos).replace("_", "-"); } - tag = tag.slice(0, 3) + " id='" + text.toLowerCase().replace(/\s+/g, '-') + "'" + tag.slice(3); - return tag + "\n" - }, - dd(node) { return htmlTag("dd", ast2html(node.content)) + "\n" }, - text(node) { - const text = sanitizeText(node.text); - if (!node.marks) { - return text - } else { - let span = text; - for (const mark of node.marks) { - if (mark.type === "link") { - let tag = `" + span + ""; - } else { - const tag = tagName[mark.type]; - span = `<${tag}>${span}`; - } - } - return span - } - } -}; - -const getTOCitems = (ast, tocArray, start, end, node) => { - if (Array.isArray(ast)) { - for (let i = 0; i < ast.length; i++) { - getTOCitems(ast[i], tocArray, start, end, node); - } - } else if (ast && ast.type === "heading") { - const level = ast.attrs.level; - if (start <= level && level <= end) { - tocArray.push([headingText(ast.content), level - start]); - } - } else if (ast.type === "toc") { - node.push(ast); - // eslint-disable-next-line no-prototype-builtins - } else if (ast.hasOwnProperty("content")) { - for (let j = 0; j < ast.content.length; j++) { - getTOCitems(ast.content[j], tocArray, start, end, node); - } - } -}; - -const getFootnotes = (ast, footnotes) => { - if (Array.isArray(ast)) { - for (let i = 0; i < ast.length; i++) { - getFootnotes(ast[i], footnotes); - } - } else if (ast && ast.type === "footnote") { - footnotes.push(ast.content); - // eslint-disable-next-line no-prototype-builtins - } else if (ast.hasOwnProperty("content")) { - for (let j = 0; j < ast.content.length; j++) { - getFootnotes(ast.content[j], footnotes); - } - } -}; - -const ast2html = ast => { - // Return HTML. - let html = ""; - if (Array.isArray(ast)) { - for (let i = 0; i < ast.length; i++) { - html += ast2html(ast[i]); - } - } else if (ast && ast.type === "doc") { - html += ast2html(ast.content); - } else if (ast && ast.type !== "null") { - html += nodes[ast.type](ast); - } - return html -}; - -const wrapWithHead = (html, title, attrs) => { - title = title ? title : "Hurmet doc"; - const fontClass = attrs && attrs.fontSize - ? { "10": "long-primer", "12": "pica", "18": "great-primer" }[attrs.fontSize] - : "long-primer"; - const head = ` - - - - - ${title} - - - -
    -
    -`; - return head + html + "\n
    \n\n" -}; - -async function md2html(md, title = "", inHtml = false) { - // Convert the Markdown to an AST that matches the Hurmet internal data structure. - let ast = md2ast(md, inHtml); - - // Populate a Table of Contents, if any exists. - const tocCapture = /\n *\n{\.toc start=(\d) end=(\d)}\n/.exec(md); - if (tocCapture) { - const start = Number(tocCapture[1]); - const end = Number(tocCapture[2]); - const tocArray = []; - const node = []; - getTOCitems(ast, tocArray, start, end, node); - node[0].attrs.body = tocArray; - } - - // Perform calculations - ast = await updateCalcs(ast); - - // Write the HTML - let html = ast2html(ast); - - // Write the footnotes, if any. - const footnotes = []; - getFootnotes(ast, footnotes); - if (footnotes.length > 0) { - html += "\n
    \n
      \n"; - for (const footnote of footnotes) { - html += "
    1. " + ast2html(footnote) + "

    2. \n"; - } - html += "
    \n"; - } - - if (title.length > 0) { - html = wrapWithHead(html, title, ast.attrs); - } - - return html -} - -/** - * This is the ParseError class, which is the main error thrown by Temml - * functions when something has gone wrong. This is used to distinguish internal - * errors from errors in the expression that the user provided. - * - * If possible, a caller should provide a Token or ParseNode with information - * about where in the source string the problem occurred. - */ -class ParseError { - constructor( - message, // The error message - token // An object providing position information - ) { - let error = " " + message; - let start; - - const loc = token && token.loc; - if (loc && loc.start <= loc.end) { - // If we have the input and a position, make the error a bit fancier - - // Get the input - const input = loc.lexer.input; - - // Prepend some information - start = loc.start; - const end = loc.end; - if (start === input.length) { - error += " at end of input: "; - } else { - error += " at position " + (start + 1) + ": "; - } - - // Underline token in question using combining underscores - const underlined = input.slice(start, end).replace(/[^]/g, "$&\u0332"); - - // Extract some context from the input and add it to the error - let left; - if (start > 15) { - left = "…" + input.slice(start - 15, start); - } else { - left = input.slice(0, start); - } - let right; - if (end + 15 < input.length) { - right = input.slice(end, end + 15) + "…"; - } else { - right = input.slice(end); - } - error += left + underlined + right; - } - - // Some hackery to make ParseError a prototype of Error - // See http://stackoverflow.com/a/8460753 - const self = new Error(error); - self.name = "ParseError"; - self.__proto__ = ParseError.prototype; - self.position = start; - return self; - } -} - -ParseError.prototype.__proto__ = Error.prototype; - -// -/** - * This file contains a list of utility functions which are useful in other - * files. - */ - -/** - * Provide a default value if a setting is undefined - */ -const deflt = function(setting, defaultIfUndefined) { - return setting === undefined ? defaultIfUndefined : setting; -}; - -// hyphenate and escape adapted from Facebook's React under Apache 2 license - -const uppercase = /([A-Z])/g; -const hyphenate = function(str) { - return str.replace(uppercase, "-$1").toLowerCase(); -}; - -const ESCAPE_LOOKUP = { - "&": "&", - ">": ">", - "<": "<", - '"': """, - "'": "'" -}; - -const ESCAPE_REGEX = /[&><"']/g; - -/** - * Escapes text to prevent scripting attacks. - */ -function escape(text) { - return String(text).replace(ESCAPE_REGEX, (match) => ESCAPE_LOOKUP[match]); -} - -/** - * Sometimes we want to pull out the innermost element of a group. In most - * cases, this will just be the group itself, but when ordgroups and colors have - * a single element, we want to pull that out. - */ -const getBaseElem = function(group) { - if (group.type === "ordgroup") { - if (group.body.length === 1) { - return getBaseElem(group.body[0]); - } else { - return group; - } - } else if (group.type === "color") { - if (group.body.length === 1) { - return getBaseElem(group.body[0]); - } else { - return group; - } - } else if (group.type === "font") { - return getBaseElem(group.body); - } else { - return group; - } -}; - -/** - * TeXbook algorithms often reference "character boxes", which are simply groups - * with a single character in them. To decide if something is a character box, - * we find its innermost group, and see if it is a single character. - */ -const isCharacterBox = function(group) { - const baseElem = getBaseElem(group); - - // These are all the types of groups which hold single characters - return baseElem.type === "mathord" || baseElem.type === "textord" || baseElem.type === "atom" -}; - -const assert = function(value) { - if (!value) { - throw new Error("Expected non-null, but got " + String(value)); - } - return value; -}; - -/** - * Return the protocol of a URL, or "_relative" if the URL does not specify a - * protocol (and thus is relative), or `null` if URL has invalid protocol - * (so should be outright rejected). - */ -const protocolFromUrl = function(url) { - // Check for possible leading protocol. - // https://url.spec.whatwg.org/#url-parsing strips leading whitespace - // (\x00) or C0 control (\x00-\x1F) characters. - // eslint-disable-next-line no-control-regex - const protocol = /^[\x00-\x20]*([^\\/#?]*?)(:|�*58|�*3a|&colon)/i.exec(url); - if (!protocol) { - return "_relative"; - } - // Reject weird colons - if (protocol[2] !== ":") { - return null; - } - // Reject invalid characters in scheme according to - // https://datatracker.ietf.org/doc/html/rfc3986#section-3.1 - if (!/^[a-zA-Z][a-zA-Z0-9+\-.]*$/.test(protocol[1])) { - return null; - } - // Lowercase the protocol - return protocol[1].toLowerCase(); -}; - -/** - * Round `n` to 4 decimal places, or to the nearest 1/10,000th em. The TeXbook - * gives an acceptable rounding error of 100sp (which would be the nearest - * 1/6551.6em with our ptPerEm = 10): - * http://www.ctex.org/documents/shredder/src/texbook.pdf#page=69 - */ -const round = function(n) { - return +n.toFixed(4); -}; - -var utils = { - deflt, - escape, - hyphenate, - getBaseElem, - isCharacterBox, - protocolFromUrl, - round -}; - -/** - * This is a module for storing settings passed into Temml. It correctly handles - * default settings. - */ - -/** - * The main Settings object - */ -class Settings { - constructor(options) { - // allow null options - options = options || {}; - this.displayMode = utils.deflt(options.displayMode, false); // boolean - this.annotate = utils.deflt(options.annotate, false); // boolean - this.leqno = utils.deflt(options.leqno, false); // boolean - this.throwOnError = utils.deflt(options.throwOnError, false); // boolean - this.errorColor = utils.deflt(options.errorColor, "#b22222"); // string - this.macros = options.macros || {}; - this.wrap = utils.deflt(options.wrap, "tex"); // "tex" | "=" - this.xml = utils.deflt(options.xml, false); // boolean - this.colorIsTextColor = utils.deflt(options.colorIsTextColor, false); // booelean - this.strict = utils.deflt(options.strict, false); // boolean - this.trust = utils.deflt(options.trust, false); // trust context. See html.js. - this.maxSize = (options.maxSize === undefined - ? [Infinity, Infinity] - : Array.isArray(options.maxSize) - ? options.maxSize - : [Infinity, Infinity] - ); - this.maxExpand = Math.max(0, utils.deflt(options.maxExpand, 1000)); // number - } - - /** - * Check whether to test potentially dangerous input, and return - * `true` (trusted) or `false` (untrusted). The sole argument `context` - * should be an object with `command` field specifying the relevant LaTeX - * command (as a string starting with `\`), and any other arguments, etc. - * If `context` has a `url` field, a `protocol` field will automatically - * get added by this function (changing the specified object). - */ - isTrusted(context) { - if (context.url && !context.protocol) { - const protocol = utils.protocolFromUrl(context.url); - if (protocol == null) { - return false - } - context.protocol = protocol; - } - const trust = typeof this.trust === "function" ? this.trust(context) : this.trust; - return Boolean(trust); - } -} - -/** - * All registered functions. - * `functions.js` just exports this same dictionary again and makes it public. - * `Parser.js` requires this dictionary. - */ -const _functions = {}; - -/** - * All MathML builders. Should be only used in the `define*` and the `build*ML` - * functions. - */ -const _mathmlGroupBuilders = {}; - -function defineFunction({ - type, - names, - props, - handler, - mathmlBuilder -}) { - // Set default values of functions - const data = { - type, - numArgs: props.numArgs, - argTypes: props.argTypes, - allowedInArgument: !!props.allowedInArgument, - allowedInText: !!props.allowedInText, - allowedInMath: props.allowedInMath === undefined ? true : props.allowedInMath, - numOptionalArgs: props.numOptionalArgs || 0, - infix: !!props.infix, - primitive: !!props.primitive, - handler: handler - }; - for (let i = 0; i < names.length; ++i) { - _functions[names[i]] = data; - } - if (type) { - if (mathmlBuilder) { - _mathmlGroupBuilders[type] = mathmlBuilder; - } - } -} - -/** - * Use this to register only the MathML builder for a function(e.g. - * if the function's ParseNode is generated in Parser.js rather than via a - * stand-alone handler provided to `defineFunction`). - */ -function defineFunctionBuilders({ type, mathmlBuilder }) { - defineFunction({ - type, - names: [], - props: { numArgs: 0 }, - handler() { - throw new Error("Should never be called.") - }, - mathmlBuilder - }); -} - -const normalizeArgument = function(arg) { - return arg.type === "ordgroup" && arg.body.length === 1 ? arg.body[0] : arg -}; - -// Since the corresponding buildMathML function expects a -// list of elements, we normalize for different kinds of arguments -const ordargument = function(arg) { - return arg.type === "ordgroup" ? arg.body : [arg] -}; - -/** - * This node represents a document fragment, which contains elements, but when - * placed into the DOM doesn't have any representation itself. It only contains - * children and doesn't have any DOM node properties. - */ -class DocumentFragment { - constructor(children) { - this.children = children; - this.classes = []; - this.style = {}; - } - - hasClass(className) { - return this.classes.includes(className); - } - - /** Convert the fragment into a node. */ - toNode() { - const frag = document.createDocumentFragment(); - - for (let i = 0; i < this.children.length; i++) { - frag.appendChild(this.children[i].toNode()); - } - - return frag; - } - - /** Convert the fragment into HTML markup. */ - toMarkup() { - let markup = ""; - - // Simply concatenate the markup for the children together. - for (let i = 0; i < this.children.length; i++) { - markup += this.children[i].toMarkup(); - } - - return markup; - } - - /** - * Converts the math node into a string, similar to innerText. Applies to - * MathDomNode's only. - */ - toText() { - // To avoid this, we would subclass documentFragment separately for - // MathML, but polyfills for subclassing is expensive per PR 1469. - const toText = (child) => child.toText(); - return this.children.map(toText).join(""); - } -} - -/** - * These objects store the data about the DOM nodes we create, as well as some - * extra data. They can then be transformed into real DOM nodes with the - * `toNode` function or HTML markup using `toMarkup`. They are useful for both - * storing extra properties on the nodes, as well as providing a way to easily - * work with the DOM. - * - * Similar functions for working with MathML nodes exist in mathMLTree.js. - * - */ - -/** - * Create an HTML className based on a list of classes. In addition to joining - * with spaces, we also remove empty classes. - */ -const createClass = function(classes) { - return classes.filter((cls) => cls).join(" "); -}; - -const initNode = function(classes, style) { - this.classes = classes || []; - this.attributes = {}; - this.style = style || {}; -}; - -/** - * Convert into an HTML node - */ -const toNode = function(tagName) { - const node = document.createElement(tagName); - - // Apply the class - node.className = createClass(this.classes); - - // Apply inline styles - for (const style in this.style) { - if (Object.prototype.hasOwnProperty.call(this.style, style )) { - node.style[style] = this.style[style]; - } - } - - // Apply attributes - for (const attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr )) { - node.setAttribute(attr, this.attributes[attr]); - } - } - - // Append the children, also as HTML nodes - for (let i = 0; i < this.children.length; i++) { - node.appendChild(this.children[i].toNode()); - } - - return node; -}; - -/** - * Convert into an HTML markup string - */ -const toMarkup = function(tagName) { - let markup = `<${tagName}`; - - // Add the class - if (this.classes.length) { - markup += ` class="${utils.escape(createClass(this.classes))}"`; - } - - let styles = ""; - - // Add the styles, after hyphenation - for (const style in this.style) { - if (Object.prototype.hasOwnProperty.call(this.style, style )) { - styles += `${utils.hyphenate(style)}:${this.style[style]};`; - } - } - - if (styles) { - markup += ` style="${styles}"`; - } - - // Add the attributes - for (const attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr )) { - markup += ` ${attr}="${utils.escape(this.attributes[attr])}"`; - } - } - - markup += ">"; - - // Add the markup of the children, also as markup - for (let i = 0; i < this.children.length; i++) { - markup += this.children[i].toMarkup(); - } - - markup += ``; - - return markup; -}; - -/** - * This node represents a span node, with a className, a list of children, and - * an inline style. - * - */ -class Span { - constructor(classes, children, style) { - initNode.call(this, classes, style); - this.children = children || []; - } - - setAttribute(attribute, value) { - this.attributes[attribute] = value; - } - - toNode() { - return toNode.call(this, "span"); - } - - toMarkup() { - return toMarkup.call(this, "span"); - } -} - -class TextNode$1 { - constructor(text) { - this.text = text; - } - toNode() { - return document.createTextNode(this.text); - } - toMarkup() { - return utils.escape(this.text); - } -} - -/* - * This node represents an image embed () element. - */ -class Img { - constructor(src, alt, style) { - this.alt = alt; - this.src = src; - this.classes = ["mord"]; - this.style = style; - } - - hasClass(className) { - return this.classes.includes(className); - } - - toNode() { - const node = document.createElement("img"); - node.src = this.src; - node.alt = this.alt; - node.className = "mord"; - - // Apply inline styles - for (const style in this.style) { - if (Object.prototype.hasOwnProperty.call(this.style, style )) { - node.style[style] = this.style[style]; - } - } - - return node; - } - - toMarkup() { - let markup = `${this.alt}` and - * `` tags). - */ -class MathNode { - constructor(type, children, classes, style) { - this.type = type; - this.attributes = {}; - this.children = children || []; - this.classes = classes || []; - this.style = style || {}; // Used for elements - } - - /** - * Sets an attribute on a MathML node. MathML depends on attributes to convey a - * semantic content, so this is used heavily. - */ - setAttribute(name, value) { - this.attributes[name] = value; - } - - /** - * Gets an attribute on a MathML node. - */ - getAttribute(name) { - return this.attributes[name]; - } - - /** - * Converts the math node into a MathML-namespaced DOM element. - */ - toNode() { - const node = document.createElementNS("http://www.w3.org/1998/Math/MathML", this.type); - - for (const attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { - node.setAttribute(attr, this.attributes[attr]); - } - } - - if (this.classes.length > 0) { - node.className = createClass(this.classes); - } - - // Apply inline styles - for (const style in this.style) { - if (Object.prototype.hasOwnProperty.call(this.style, style )) { - node.style[style] = this.style[style]; - } - } - - for (let i = 0; i < this.children.length; i++) { - node.appendChild(this.children[i].toNode()); - } - - return node; - } - - /** - * Converts the math node into an HTML markup string. - */ - toMarkup() { - let markup = "<" + this.type; - - // Add the attributes - for (const attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { - markup += " " + attr + '="'; - markup += utils.escape(this.attributes[attr]); - markup += '"'; - } - } - - if (this.classes.length > 0) { - markup += ` class="${utils.escape(createClass(this.classes))}"`; - } - - let styles = ""; - - // Add the styles, after hyphenation - for (const style in this.style) { - if (Object.prototype.hasOwnProperty.call(this.style, style )) { - styles += `${utils.hyphenate(style)}:${this.style[style]};`; - } - } - - if (styles) { - markup += ` style="${styles}"`; - } - - markup += ">"; - - for (let i = 0; i < this.children.length; i++) { - markup += this.children[i].toMarkup(); - } - - markup += ""; - - return markup; - } - - /** - * Converts the math node into a string, similar to innerText, but escaped. - */ - toText() { - return this.children.map((child) => child.toText()).join(""); - } -} - -/** - * This node represents a piece of text. - */ -class TextNode { - constructor(text) { - this.text = text; - } - - /** - * Converts the text node into a DOM text node. - */ - toNode() { - return document.createTextNode(this.text); - } - - /** - * Converts the text node into escaped HTML markup - * (representing the text itself). - */ - toMarkup() { - return utils.escape(this.toText()); - } - - /** - * Converts the text node into a string - * (representing the text itself). - */ - toText() { - return this.text; - } -} - -// Do not make an the only child of a . -// An acts as its own implicit . -const wrapWithMstyle = expression => { - let node; - if (expression.length === 1 && expression[0].type === "mrow") { - node = expression.pop(); - node.type = "mstyle"; - } else { - node = new MathNode("mstyle", expression); - } - return node -}; - -var mathMLTree = { - MathNode, - TextNode, - newDocumentFragment -}; - -/** - * This file provides support for building horizontal stretchy elements. - */ - -// TODO: Remove when Chromium stretches \widetilde & \widehat -const estimatedWidth = node => { - let width = 0; - if (node.body) { - for (const item of node.body) { - width += estimatedWidth(item); - } - } else if (node.type === "supsub") { - width += estimatedWidth(node.base); - if (node.sub) { width += 0.7 * estimatedWidth(node.sub); } - if (node.sup) { width += 0.7 * estimatedWidth(node.sup); } - } else if (node.type === "mathord" || node.type === "textord") { - for (const ch of node.text.split('')) { - const codePoint = ch.codePointAt(0); - if ((0x60 < codePoint && codePoint < 0x7B) || (0x03B0 < codePoint && codePoint < 0x3CA)) { - width += 0.56; // lower case latin or greek. Use advance width of letter n - } else if (0x2F < codePoint && codePoint < 0x3A) { - width += 0.50; // numerals. - } else { - width += 0.92; // advance width of letter M - } - } - } else { - width += 1.0; - } - return width -}; - -const stretchyCodePoint = { - widehat: "^", - widecheck: "ˇ", - widetilde: "~", - wideparen: "⏜", // \u23dc - utilde: "~", - overleftarrow: "\u2190", - underleftarrow: "\u2190", - xleftarrow: "\u2190", - overrightarrow: "\u2192", - underrightarrow: "\u2192", - xrightarrow: "\u2192", - underbrace: "\u23df", - overbrace: "\u23de", - overgroup: "\u23e0", - overparen: "⏜", - undergroup: "\u23e1", - underparen: "\u23dd", - overleftrightarrow: "\u2194", - underleftrightarrow: "\u2194", - xleftrightarrow: "\u2194", - Overrightarrow: "\u21d2", - xRightarrow: "\u21d2", - overleftharpoon: "\u21bc", - xleftharpoonup: "\u21bc", - overrightharpoon: "\u21c0", - xrightharpoonup: "\u21c0", - xLeftarrow: "\u21d0", - xLeftrightarrow: "\u21d4", - xhookleftarrow: "\u21a9", - xhookrightarrow: "\u21aa", - xmapsto: "\u21a6", - xrightharpoondown: "\u21c1", - xleftharpoondown: "\u21bd", - xtwoheadleftarrow: "\u219e", - xtwoheadrightarrow: "\u21a0", - xlongequal: "=", - xrightleftarrows: "\u21c4", - yields: "\u2192", - yieldsLeft: "\u2190", - mesomerism: "\u2194", - longrightharpoonup: "\u21c0", - longleftharpoondown: "\u21bd", - eqrightharpoonup: "\u21c0", - eqleftharpoondown: "\u21bd", - "\\cdrightarrow": "\u2192", - "\\cdleftarrow": "\u2190", - "\\cdlongequal": "=" -}; - -const mathMLnode = function(label) { - const child = new mathMLTree.TextNode(stretchyCodePoint[label.slice(1)]); - const node = new mathMLTree.MathNode("mo", [child]); - node.setAttribute("stretchy", "true"); - return node -}; - -const crookedWides = ["\\widetilde", "\\widehat", "\\widecheck", "\\utilde"]; - -// TODO: Remove when Chromium stretches \widetilde & \widehat -const accentNode = (group) => { - const mo = mathMLnode(group.label); - if (crookedWides.includes(group.label)) { - const width = estimatedWidth(group.base); - if (1 < width && width < 1.6) { - mo.classes.push("tml-crooked-2"); - } else if (1.6 <= width && width < 2.5) { - mo.classes.push("tml-crooked-3"); - } else if (2.5 <= width) { - mo.classes.push("tml-crooked-4"); - } - } - return mo -}; - -var stretchy = { - mathMLnode, - accentNode -}; - -/** - * This file holds a list of all no-argument functions and single-character - * symbols (like 'a' or ';'). - * - * For each of the symbols, there are two properties they can have: - * - group (required): the ParseNode group type the symbol should have (i.e. - "textord", "mathord", etc). - * - replace: the character that this symbol or function should be - * replaced with (i.e. "\phi" has a replace value of "\u03d5", the phi - * character in the main font). - * - * The outermost map in the table indicates what mode the symbols should be - * accepted in (e.g. "math" or "text"). - */ - -// Some of these have a "-token" suffix since these are also used as `ParseNode` -// types for raw text tokens, and we want to avoid conflicts with higher-level -// `ParseNode` types. These `ParseNode`s are constructed within `Parser` by -// looking up the `symbols` map. -const ATOMS = { - bin: 1, - close: 1, - inner: 1, - open: 1, - punct: 1, - rel: 1 -}; -const NON_ATOMS = { - "accent-token": 1, - mathord: 1, - "op-token": 1, - spacing: 1, - textord: 1 -}; - -const symbols = { - math: {}, - text: {} -}; - -/** `acceptUnicodeChar = true` is only applicable if `replace` is set. */ -function defineSymbol(mode, group, replace, name, acceptUnicodeChar) { - symbols[mode][name] = { group, replace }; - - if (acceptUnicodeChar && replace) { - symbols[mode][replace] = symbols[mode][name]; - } -} - -// Some abbreviations for commonly used strings. -// This helps minify the code, and also spotting typos using jshint. - -// modes: -const math = "math"; -const text = "text"; - -// groups: -const accent = "accent-token"; -const bin = "bin"; -const close = "close"; -const inner = "inner"; -const mathord = "mathord"; -const op = "op-token"; -const open = "open"; -const punct = "punct"; -const rel = "rel"; -const spacing = "spacing"; -const textord = "textord"; - -// Now comes the symbol table - -// Relation Symbols -defineSymbol(math, rel, "\u2261", "\\equiv", true); -defineSymbol(math, rel, "\u227a", "\\prec", true); -defineSymbol(math, rel, "\u227b", "\\succ", true); -defineSymbol(math, rel, "\u223c", "\\sim", true); -defineSymbol(math, rel, "\u27c2", "\\perp", true); -defineSymbol(math, rel, "\u2aaf", "\\preceq", true); -defineSymbol(math, rel, "\u2ab0", "\\succeq", true); -defineSymbol(math, rel, "\u2243", "\\simeq", true); -defineSymbol(math, rel, "\u224c", "\\backcong", true); -defineSymbol(math, rel, "|", "\\mid", true); -defineSymbol(math, rel, "\u226a", "\\ll", true); -defineSymbol(math, rel, "\u226b", "\\gg", true); -defineSymbol(math, rel, "\u224d", "\\asymp", true); -defineSymbol(math, rel, "\u2225", "\\parallel"); -defineSymbol(math, rel, "\u2323", "\\smile", true); -defineSymbol(math, rel, "\u2291", "\\sqsubseteq", true); -defineSymbol(math, rel, "\u2292", "\\sqsupseteq", true); -defineSymbol(math, rel, "\u2250", "\\doteq", true); -defineSymbol(math, rel, "\u2322", "\\frown", true); -defineSymbol(math, rel, "\u220b", "\\ni", true); -defineSymbol(math, rel, "\u220c", "\\notni", true); -defineSymbol(math, rel, "\u221d", "\\propto", true); -defineSymbol(math, rel, "\u22a2", "\\vdash", true); -defineSymbol(math, rel, "\u22a3", "\\dashv", true); -defineSymbol(math, rel, "\u220b", "\\owns"); -defineSymbol(math, rel, "\u2258", "\\arceq", true); -defineSymbol(math, rel, "\u2259", "\\wedgeq", true); -defineSymbol(math, rel, "\u225a", "\\veeeq", true); -defineSymbol(math, rel, "\u225b", "\\stareq", true); -defineSymbol(math, rel, "\u225d", "\\eqdef", true); -defineSymbol(math, rel, "\u225e", "\\measeq", true); -defineSymbol(math, rel, "\u225f", "\\questeq", true); -defineSymbol(math, rel, "\u2260", "\\ne", true); -defineSymbol(math, rel, "\u2260", "\\neq"); -// unicodemath -defineSymbol(math, rel, "\u2a75", "\\eqeq", true); -defineSymbol(math, rel, "\u2a76", "\\eqeqeq", true); -// mathtools.sty -defineSymbol(math, rel, "\u2237", "\\dblcolon", true); -defineSymbol(math, rel, "\u2254", "\\coloneqq", true); -defineSymbol(math, rel, "\u2255", "\\eqqcolon", true); -defineSymbol(math, rel, "\u2239", "\\eqcolon", true); -defineSymbol(math, rel, "\u2A74", "\\Coloneqq", true); - -// Punctuation -defineSymbol(math, punct, "\u002e", "\\ldotp"); -defineSymbol(math, punct, "\u00b7", "\\cdotp"); - -// Misc Symbols -defineSymbol(math, textord, "\u0023", "\\#"); -defineSymbol(text, textord, "\u0023", "\\#"); -defineSymbol(math, textord, "\u0026", "\\&"); -defineSymbol(text, textord, "\u0026", "\\&"); -defineSymbol(math, textord, "\u2135", "\\aleph", true); -defineSymbol(math, textord, "\u2200", "\\forall", true); -defineSymbol(math, textord, "\u210f", "\\hbar", true); -defineSymbol(math, textord, "\u2203", "\\exists", true); -// ∇ is actually a unary operator, not binary. But this works. -defineSymbol(math, bin, "\u2207", "\\nabla", true); -defineSymbol(math, textord, "\u266d", "\\flat", true); -defineSymbol(math, textord, "\u2113", "\\ell", true); -defineSymbol(math, textord, "\u266e", "\\natural", true); -defineSymbol(math, textord, "Å", "\\Angstrom", true); -defineSymbol(text, textord, "Å", "\\Angstrom", true); -defineSymbol(math, textord, "\u2663", "\\clubsuit", true); -defineSymbol(math, textord, "\u2667", "\\varclubsuit", true); -defineSymbol(math, textord, "\u2118", "\\wp", true); -defineSymbol(math, textord, "\u266f", "\\sharp", true); -defineSymbol(math, textord, "\u2662", "\\diamondsuit", true); -defineSymbol(math, textord, "\u2666", "\\vardiamondsuit", true); -defineSymbol(math, textord, "\u211c", "\\Re", true); -defineSymbol(math, textord, "\u2661", "\\heartsuit", true); -defineSymbol(math, textord, "\u2665", "\\varheartsuit", true); -defineSymbol(math, textord, "\u2111", "\\Im", true); -defineSymbol(math, textord, "\u2660", "\\spadesuit", true); -defineSymbol(math, textord, "\u2664", "\\varspadesuit", true); -defineSymbol(math, textord, "\u2640", "\\female", true); -defineSymbol(math, textord, "\u2642", "\\male", true); -defineSymbol(math, textord, "\u00a7", "\\S", true); -defineSymbol(text, textord, "\u00a7", "\\S"); -defineSymbol(math, textord, "\u00b6", "\\P", true); -defineSymbol(text, textord, "\u00b6", "\\P"); -defineSymbol(text, textord, "\u263a", "\\smiley", true); -defineSymbol(math, textord, "\u263a", "\\smiley", true); - -// Math and Text -defineSymbol(math, textord, "\u2020", "\\dag"); -defineSymbol(text, textord, "\u2020", "\\dag"); -defineSymbol(text, textord, "\u2020", "\\textdagger"); -defineSymbol(math, textord, "\u2021", "\\ddag"); -defineSymbol(text, textord, "\u2021", "\\ddag"); -defineSymbol(text, textord, "\u2021", "\\textdaggerdbl"); - -// Large Delimiters -defineSymbol(math, close, "\u23b1", "\\rmoustache", true); -defineSymbol(math, open, "\u23b0", "\\lmoustache", true); -defineSymbol(math, close, "\u27ef", "\\rgroup", true); -defineSymbol(math, open, "\u27ee", "\\lgroup", true); - -// Binary Operators -defineSymbol(math, bin, "\u2213", "\\mp", true); -defineSymbol(math, bin, "\u2296", "\\ominus", true); -defineSymbol(math, bin, "\u228e", "\\uplus", true); -defineSymbol(math, bin, "\u2293", "\\sqcap", true); -defineSymbol(math, bin, "\u2217", "\\ast"); -defineSymbol(math, bin, "\u2294", "\\sqcup", true); -defineSymbol(math, bin, "\u25ef", "\\bigcirc", true); -defineSymbol(math, bin, "\u2219", "\\bullet", true); -defineSymbol(math, bin, "\u2021", "\\ddagger"); -defineSymbol(math, bin, "\u2240", "\\wr", true); -defineSymbol(math, bin, "\u2a3f", "\\amalg"); -defineSymbol(math, bin, "\u0026", "\\And"); // from amsmath -defineSymbol(math, bin, "\u2AFD", "\\sslash", true); // from stmaryrd - -// Arrow Symbols -defineSymbol(math, rel, "\u27f5", "\\longleftarrow", true); -defineSymbol(math, rel, "\u21d0", "\\Leftarrow", true); -defineSymbol(math, rel, "\u27f8", "\\Longleftarrow", true); -defineSymbol(math, rel, "\u27f6", "\\longrightarrow", true); -defineSymbol(math, rel, "\u21d2", "\\Rightarrow", true); -defineSymbol(math, rel, "\u27f9", "\\Longrightarrow", true); -defineSymbol(math, rel, "\u2194", "\\leftrightarrow", true); -defineSymbol(math, rel, "\u27f7", "\\longleftrightarrow", true); -defineSymbol(math, rel, "\u21d4", "\\Leftrightarrow", true); -defineSymbol(math, rel, "\u27fa", "\\Longleftrightarrow", true); -defineSymbol(math, rel, "\u21a4", "\\mapsfrom", true); -defineSymbol(math, rel, "\u21a6", "\\mapsto", true); -defineSymbol(math, rel, "\u27fc", "\\longmapsto", true); -defineSymbol(math, rel, "\u2197", "\\nearrow", true); -defineSymbol(math, rel, "\u21a9", "\\hookleftarrow", true); -defineSymbol(math, rel, "\u21aa", "\\hookrightarrow", true); -defineSymbol(math, rel, "\u2198", "\\searrow", true); -defineSymbol(math, rel, "\u21bc", "\\leftharpoonup", true); -defineSymbol(math, rel, "\u21c0", "\\rightharpoonup", true); -defineSymbol(math, rel, "\u2199", "\\swarrow", true); -defineSymbol(math, rel, "\u21bd", "\\leftharpoondown", true); -defineSymbol(math, rel, "\u21c1", "\\rightharpoondown", true); -defineSymbol(math, rel, "\u2196", "\\nwarrow", true); -defineSymbol(math, rel, "\u21cc", "\\rightleftharpoons", true); -defineSymbol(math, mathord, "\u21af", "\\lightning", true); -defineSymbol(math, mathord, "\u220E", "\\QED", true); -defineSymbol(math, mathord, "\u2030", "\\permil", true); -defineSymbol(text, textord, "\u2030", "\\permil"); -defineSymbol(math, mathord, "\u2609", "\\astrosun", true); -defineSymbol(math, mathord, "\u263c", "\\sun", true); -defineSymbol(math, mathord, "\u263e", "\\leftmoon", true); -defineSymbol(math, mathord, "\u263d", "\\rightmoon", true); -defineSymbol(math, mathord, "\u2295", "\\Earth"); - -// AMS Negated Binary Relations -defineSymbol(math, rel, "\u226e", "\\nless", true); -// Symbol names preceeded by "@" each have a corresponding macro. -defineSymbol(math, rel, "\u2a87", "\\lneq", true); -defineSymbol(math, rel, "\u2268", "\\lneqq", true); -defineSymbol(math, rel, "\u2268\ufe00", "\\lvertneqq"); -defineSymbol(math, rel, "\u22e6", "\\lnsim", true); -defineSymbol(math, rel, "\u2a89", "\\lnapprox", true); -defineSymbol(math, rel, "\u2280", "\\nprec", true); -// unicode-math maps \u22e0 to \npreccurlyeq. We'll use the AMS synonym. -defineSymbol(math, rel, "\u22e0", "\\npreceq", true); -defineSymbol(math, rel, "\u22e8", "\\precnsim", true); -defineSymbol(math, rel, "\u2ab9", "\\precnapprox", true); -defineSymbol(math, rel, "\u2241", "\\nsim", true); -defineSymbol(math, rel, "\u2224", "\\nmid", true); -defineSymbol(math, rel, "\u2224", "\\nshortmid"); -defineSymbol(math, rel, "\u22ac", "\\nvdash", true); -defineSymbol(math, rel, "\u22ad", "\\nvDash", true); -defineSymbol(math, rel, "\u22ea", "\\ntriangleleft"); -defineSymbol(math, rel, "\u22ec", "\\ntrianglelefteq", true); -defineSymbol(math, rel, "\u2284", "\\nsubset", true); -defineSymbol(math, rel, "\u2285", "\\nsupset", true); -defineSymbol(math, rel, "\u228a", "\\subsetneq", true); -defineSymbol(math, rel, "\u228a\ufe00", "\\varsubsetneq"); -defineSymbol(math, rel, "\u2acb", "\\subsetneqq", true); -defineSymbol(math, rel, "\u2acb\ufe00", "\\varsubsetneqq"); -defineSymbol(math, rel, "\u226f", "\\ngtr", true); -defineSymbol(math, rel, "\u2a88", "\\gneq", true); -defineSymbol(math, rel, "\u2269", "\\gneqq", true); -defineSymbol(math, rel, "\u2269\ufe00", "\\gvertneqq"); -defineSymbol(math, rel, "\u22e7", "\\gnsim", true); -defineSymbol(math, rel, "\u2a8a", "\\gnapprox", true); -defineSymbol(math, rel, "\u2281", "\\nsucc", true); -// unicode-math maps \u22e1 to \nsucccurlyeq. We'll use the AMS synonym. -defineSymbol(math, rel, "\u22e1", "\\nsucceq", true); -defineSymbol(math, rel, "\u22e9", "\\succnsim", true); -defineSymbol(math, rel, "\u2aba", "\\succnapprox", true); -// unicode-math maps \u2246 to \simneqq. We'll use the AMS synonym. -defineSymbol(math, rel, "\u2246", "\\ncong", true); -defineSymbol(math, rel, "\u2226", "\\nparallel", true); -defineSymbol(math, rel, "\u2226", "\\nshortparallel"); -defineSymbol(math, rel, "\u22af", "\\nVDash", true); -defineSymbol(math, rel, "\u22eb", "\\ntriangleright"); -defineSymbol(math, rel, "\u22ed", "\\ntrianglerighteq", true); -defineSymbol(math, rel, "\u228b", "\\supsetneq", true); -defineSymbol(math, rel, "\u228b", "\\varsupsetneq"); -defineSymbol(math, rel, "\u2acc", "\\supsetneqq", true); -defineSymbol(math, rel, "\u2acc\ufe00", "\\varsupsetneqq"); -defineSymbol(math, rel, "\u22ae", "\\nVdash", true); -defineSymbol(math, rel, "\u2ab5", "\\precneqq", true); -defineSymbol(math, rel, "\u2ab6", "\\succneqq", true); -defineSymbol(math, bin, "\u22b4", "\\unlhd"); -defineSymbol(math, bin, "\u22b5", "\\unrhd"); - -// AMS Negated Arrows -defineSymbol(math, rel, "\u219a", "\\nleftarrow", true); -defineSymbol(math, rel, "\u219b", "\\nrightarrow", true); -defineSymbol(math, rel, "\u21cd", "\\nLeftarrow", true); -defineSymbol(math, rel, "\u21cf", "\\nRightarrow", true); -defineSymbol(math, rel, "\u21ae", "\\nleftrightarrow", true); -defineSymbol(math, rel, "\u21ce", "\\nLeftrightarrow", true); - -// AMS Misc -defineSymbol(math, rel, "\u25b3", "\\vartriangle"); -defineSymbol(math, textord, "\u210f", "\\hslash"); -defineSymbol(math, textord, "\u25bd", "\\triangledown"); -defineSymbol(math, textord, "\u25ca", "\\lozenge"); -defineSymbol(math, textord, "\u24c8", "\\circledS"); -defineSymbol(math, textord, "\u00ae", "\\circledR", true); -defineSymbol(text, textord, "\u00ae", "\\circledR"); -defineSymbol(text, textord, "\u00ae", "\\textregistered"); -defineSymbol(math, textord, "\u2221", "\\measuredangle", true); -defineSymbol(math, textord, "\u2204", "\\nexists"); -defineSymbol(math, textord, "\u2127", "\\mho"); -defineSymbol(math, textord, "\u2132", "\\Finv", true); -defineSymbol(math, textord, "\u2141", "\\Game", true); -defineSymbol(math, textord, "\u2035", "\\backprime"); -defineSymbol(math, textord, "\u2036", "\\backdprime"); -defineSymbol(math, textord, "\u2037", "\\backtrprime"); -defineSymbol(math, textord, "\u25b2", "\\blacktriangle"); -defineSymbol(math, textord, "\u25bc", "\\blacktriangledown"); -defineSymbol(math, textord, "\u25a0", "\\blacksquare"); -defineSymbol(math, textord, "\u29eb", "\\blacklozenge"); -defineSymbol(math, textord, "\u2605", "\\bigstar"); -defineSymbol(math, textord, "\u2222", "\\sphericalangle", true); -defineSymbol(math, textord, "\u2201", "\\complement", true); -// unicode-math maps U+F0 to \matheth. We map to AMS function \eth -defineSymbol(math, textord, "\u00f0", "\\eth", true); -defineSymbol(text, textord, "\u00f0", "\u00f0"); -defineSymbol(math, textord, "\u2571", "\\diagup"); -defineSymbol(math, textord, "\u2572", "\\diagdown"); -defineSymbol(math, textord, "\u25a1", "\\square"); -defineSymbol(math, textord, "\u25a1", "\\Box"); -defineSymbol(math, textord, "\u25ca", "\\Diamond"); -// unicode-math maps U+A5 to \mathyen. We map to AMS function \yen -defineSymbol(math, textord, "\u00a5", "\\yen", true); -defineSymbol(text, textord, "\u00a5", "\\yen", true); -defineSymbol(math, textord, "\u2713", "\\checkmark", true); -defineSymbol(text, textord, "\u2713", "\\checkmark"); -defineSymbol(math, textord, "\u2717", "\\ballotx", true); -defineSymbol(text, textord, "\u2717", "\\ballotx"); -defineSymbol(text, textord, "\u2022", "\\textbullet"); - -// AMS Hebrew -defineSymbol(math, textord, "\u2136", "\\beth", true); -defineSymbol(math, textord, "\u2138", "\\daleth", true); -defineSymbol(math, textord, "\u2137", "\\gimel", true); - -// AMS Greek -defineSymbol(math, textord, "\u03dd", "\\digamma", true); -defineSymbol(math, textord, "\u03f0", "\\varkappa"); - -// AMS Delimiters -defineSymbol(math, open, "\u231C", "\\ulcorner", true); -defineSymbol(math, close, "\u231D", "\\urcorner", true); -defineSymbol(math, open, "\u231E", "\\llcorner", true); -defineSymbol(math, close, "\u231F", "\\lrcorner", true); - -// AMS Binary Relations -defineSymbol(math, rel, "\u2266", "\\leqq", true); -defineSymbol(math, rel, "\u2a7d", "\\leqslant", true); -defineSymbol(math, rel, "\u2a95", "\\eqslantless", true); -defineSymbol(math, rel, "\u2272", "\\lesssim", true); -defineSymbol(math, rel, "\u2a85", "\\lessapprox", true); -defineSymbol(math, rel, "\u224a", "\\approxeq", true); -defineSymbol(math, bin, "\u22d6", "\\lessdot"); -defineSymbol(math, rel, "\u22d8", "\\lll", true); -defineSymbol(math, rel, "\u2276", "\\lessgtr", true); -defineSymbol(math, rel, "\u22da", "\\lesseqgtr", true); -defineSymbol(math, rel, "\u2a8b", "\\lesseqqgtr", true); -defineSymbol(math, rel, "\u2251", "\\doteqdot"); -defineSymbol(math, rel, "\u2253", "\\risingdotseq", true); -defineSymbol(math, rel, "\u2252", "\\fallingdotseq", true); -defineSymbol(math, rel, "\u223d", "\\backsim", true); -defineSymbol(math, rel, "\u22cd", "\\backsimeq", true); -defineSymbol(math, rel, "\u2ac5", "\\subseteqq", true); -defineSymbol(math, rel, "\u22d0", "\\Subset", true); -defineSymbol(math, rel, "\u228f", "\\sqsubset", true); -defineSymbol(math, rel, "\u227c", "\\preccurlyeq", true); -defineSymbol(math, rel, "\u22de", "\\curlyeqprec", true); -defineSymbol(math, rel, "\u227e", "\\precsim", true); -defineSymbol(math, rel, "\u2ab7", "\\precapprox", true); -defineSymbol(math, rel, "\u22b2", "\\vartriangleleft"); -defineSymbol(math, rel, "\u22b4", "\\trianglelefteq"); -defineSymbol(math, rel, "\u22a8", "\\vDash", true); -defineSymbol(math, rel, "\u22ab", "\\VDash", true); -defineSymbol(math, rel, "\u22aa", "\\Vvdash", true); -defineSymbol(math, rel, "\u2323", "\\smallsmile"); -defineSymbol(math, rel, "\u2322", "\\smallfrown"); -defineSymbol(math, rel, "\u224f", "\\bumpeq", true); -defineSymbol(math, rel, "\u224e", "\\Bumpeq", true); -defineSymbol(math, rel, "\u2267", "\\geqq", true); -defineSymbol(math, rel, "\u2a7e", "\\geqslant", true); -defineSymbol(math, rel, "\u2a96", "\\eqslantgtr", true); -defineSymbol(math, rel, "\u2273", "\\gtrsim", true); -defineSymbol(math, rel, "\u2a86", "\\gtrapprox", true); -defineSymbol(math, bin, "\u22d7", "\\gtrdot"); -defineSymbol(math, rel, "\u22d9", "\\ggg", true); -defineSymbol(math, rel, "\u2277", "\\gtrless", true); -defineSymbol(math, rel, "\u22db", "\\gtreqless", true); -defineSymbol(math, rel, "\u2a8c", "\\gtreqqless", true); -defineSymbol(math, rel, "\u2256", "\\eqcirc", true); -defineSymbol(math, rel, "\u2257", "\\circeq", true); -defineSymbol(math, rel, "\u225c", "\\triangleq", true); -defineSymbol(math, rel, "\u223c", "\\thicksim"); -defineSymbol(math, rel, "\u2248", "\\thickapprox"); -defineSymbol(math, rel, "\u2ac6", "\\supseteqq", true); -defineSymbol(math, rel, "\u22d1", "\\Supset", true); -defineSymbol(math, rel, "\u2290", "\\sqsupset", true); -defineSymbol(math, rel, "\u227d", "\\succcurlyeq", true); -defineSymbol(math, rel, "\u22df", "\\curlyeqsucc", true); -defineSymbol(math, rel, "\u227f", "\\succsim", true); -defineSymbol(math, rel, "\u2ab8", "\\succapprox", true); -defineSymbol(math, rel, "\u22b3", "\\vartriangleright"); -defineSymbol(math, rel, "\u22b5", "\\trianglerighteq"); -defineSymbol(math, rel, "\u22a9", "\\Vdash", true); -defineSymbol(math, rel, "\u2223", "\\shortmid"); -defineSymbol(math, rel, "\u2225", "\\shortparallel"); -defineSymbol(math, rel, "\u226c", "\\between", true); -defineSymbol(math, rel, "\u22d4", "\\pitchfork", true); -defineSymbol(math, rel, "\u221d", "\\varpropto"); -defineSymbol(math, rel, "\u25c0", "\\blacktriangleleft"); -// unicode-math says that \therefore is a mathord atom. -// We kept the amssymb atom type, which is rel. -defineSymbol(math, rel, "\u2234", "\\therefore", true); -defineSymbol(math, rel, "\u220d", "\\backepsilon"); -defineSymbol(math, rel, "\u25b6", "\\blacktriangleright"); -// unicode-math says that \because is a mathord atom. -// We kept the amssymb atom type, which is rel. -defineSymbol(math, rel, "\u2235", "\\because", true); -defineSymbol(math, rel, "\u22d8", "\\llless"); -defineSymbol(math, rel, "\u22d9", "\\gggtr"); -defineSymbol(math, bin, "\u22b2", "\\lhd"); -defineSymbol(math, bin, "\u22b3", "\\rhd"); -defineSymbol(math, rel, "\u2242", "\\eqsim", true); -defineSymbol(math, rel, "\u2251", "\\Doteq", true); -defineSymbol(math, rel, "\u297d", "\\strictif", true); -defineSymbol(math, rel, "\u297c", "\\strictfi", true); - -// AMS Binary Operators -defineSymbol(math, bin, "\u2214", "\\dotplus", true); -defineSymbol(math, bin, "\u2216", "\\smallsetminus"); -defineSymbol(math, bin, "\u22d2", "\\Cap", true); -defineSymbol(math, bin, "\u22d3", "\\Cup", true); -defineSymbol(math, bin, "\u2a5e", "\\doublebarwedge", true); -defineSymbol(math, bin, "\u229f", "\\boxminus", true); -defineSymbol(math, bin, "\u229e", "\\boxplus", true); -defineSymbol(math, bin, "\u22c7", "\\divideontimes", true); -defineSymbol(math, bin, "\u22c9", "\\ltimes", true); -defineSymbol(math, bin, "\u22ca", "\\rtimes", true); -defineSymbol(math, bin, "\u22cb", "\\leftthreetimes", true); -defineSymbol(math, bin, "\u22cc", "\\rightthreetimes", true); -defineSymbol(math, bin, "\u22cf", "\\curlywedge", true); -defineSymbol(math, bin, "\u22ce", "\\curlyvee", true); -defineSymbol(math, bin, "\u229d", "\\circleddash", true); -defineSymbol(math, bin, "\u229b", "\\circledast", true); -defineSymbol(math, bin, "\u22ba", "\\intercal", true); -defineSymbol(math, bin, "\u22d2", "\\doublecap"); -defineSymbol(math, bin, "\u22d3", "\\doublecup"); -defineSymbol(math, bin, "\u22a0", "\\boxtimes", true); -defineSymbol(math, bin, "\u22c8", "\\bowtie", true); -defineSymbol(math, bin, "\u22c8", "\\Join"); -defineSymbol(math, bin, "\u27d5", "\\leftouterjoin", true); -defineSymbol(math, bin, "\u27d6", "\\rightouterjoin", true); -defineSymbol(math, bin, "\u27d7", "\\fullouterjoin", true); - -// stix Binary Operators -defineSymbol(math, bin, "\u2238", "\\dotminus", true); -defineSymbol(math, bin, "\u27D1", "\\wedgedot", true); -defineSymbol(math, bin, "\u27C7", "\\veedot", true); -defineSymbol(math, bin, "\u2A62", "\\doublebarvee", true); -defineSymbol(math, bin, "\u2A63", "\\veedoublebar", true); -defineSymbol(math, bin, "\u2A5F", "\\wedgebar", true); -defineSymbol(math, bin, "\u2A60", "\\wedgedoublebar", true); -defineSymbol(math, bin, "\u2A54", "\\Vee", true); -defineSymbol(math, bin, "\u2A53", "\\Wedge", true); -defineSymbol(math, bin, "\u2A43", "\\barcap", true); -defineSymbol(math, bin, "\u2A42", "\\barcup", true); -defineSymbol(math, bin, "\u2A48", "\\capbarcup", true); -defineSymbol(math, bin, "\u2A40", "\\capdot", true); -defineSymbol(math, bin, "\u2A47", "\\capovercup", true); -defineSymbol(math, bin, "\u2A46", "\\cupovercap", true); -defineSymbol(math, bin, "\u2A4D", "\\closedvarcap", true); -defineSymbol(math, bin, "\u2A4C", "\\closedvarcup", true); -defineSymbol(math, bin, "\u2A2A", "\\minusdot", true); -defineSymbol(math, bin, "\u2A2B", "\\minusfdots", true); -defineSymbol(math, bin, "\u2A2C", "\\minusrdots", true); -defineSymbol(math, bin, "\u22BB", "\\Xor", true); -defineSymbol(math, bin, "\u22BC", "\\Nand", true); -defineSymbol(math, bin, "\u22BD", "\\Nor", true); -defineSymbol(math, bin, "\u22BD", "\\barvee"); -defineSymbol(math, bin, "\u2AF4", "\\interleave", true); -defineSymbol(math, bin, "\u29E2", "\\shuffle", true); -defineSymbol(math, bin, "\u2AF6", "\\threedotcolon", true); -defineSymbol(math, bin, "\u2982", "\\typecolon", true); -defineSymbol(math, bin, "\u223E", "\\invlazys", true); -defineSymbol(math, bin, "\u2A4B", "\\twocaps", true); -defineSymbol(math, bin, "\u2A4A", "\\twocups", true); -defineSymbol(math, bin, "\u2A4E", "\\Sqcap", true); -defineSymbol(math, bin, "\u2A4F", "\\Sqcup", true); -defineSymbol(math, bin, "\u2A56", "\\veeonvee", true); -defineSymbol(math, bin, "\u2A55", "\\wedgeonwedge", true); -defineSymbol(math, bin, "\u29D7", "\\blackhourglass", true); -defineSymbol(math, bin, "\u29C6", "\\boxast", true); -defineSymbol(math, bin, "\u29C8", "\\boxbox", true); -defineSymbol(math, bin, "\u29C7", "\\boxcircle", true); -defineSymbol(math, bin, "\u229C", "\\circledequal", true); -defineSymbol(math, bin, "\u29B7", "\\circledparallel", true); -defineSymbol(math, bin, "\u29B6", "\\circledvert", true); -defineSymbol(math, bin, "\u29B5", "\\circlehbar", true); -defineSymbol(math, bin, "\u27E1", "\\concavediamond", true); -defineSymbol(math, bin, "\u27E2", "\\concavediamondtickleft", true); -defineSymbol(math, bin, "\u27E3", "\\concavediamondtickright", true); -defineSymbol(math, bin, "\u22C4", "\\diamond", true); -defineSymbol(math, bin, "\u29D6", "\\hourglass", true); -defineSymbol(math, bin, "\u27E0", "\\lozengeminus", true); -defineSymbol(math, bin, "\u233D", "\\obar", true); -defineSymbol(math, bin, "\u29B8", "\\obslash", true); -defineSymbol(math, bin, "\u2A38", "\\odiv", true); -defineSymbol(math, bin, "\u29C1", "\\ogreaterthan", true); -defineSymbol(math, bin, "\u29C0", "\\olessthan", true); -defineSymbol(math, bin, "\u29B9", "\\operp", true); -defineSymbol(math, bin, "\u2A37", "\\Otimes", true); -defineSymbol(math, bin, "\u2A36", "\\otimeshat", true); -defineSymbol(math, bin, "\u22C6", "\\star", true); -defineSymbol(math, bin, "\u25B3", "\\triangle", true); -defineSymbol(math, bin, "\u2A3A", "\\triangleminus", true); -defineSymbol(math, bin, "\u2A39", "\\triangleplus", true); -defineSymbol(math, bin, "\u2A3B", "\\triangletimes", true); -defineSymbol(math, bin, "\u27E4", "\\whitesquaretickleft", true); -defineSymbol(math, bin, "\u27E5", "\\whitesquaretickright", true); -defineSymbol(math, bin, "\u2A33", "\\smashtimes", true); - -// AMS Arrows -// Note: unicode-math maps \u21e2 to their own function \rightdasharrow. -// We'll map it to AMS function \dashrightarrow. It produces the same atom. -defineSymbol(math, rel, "\u21e2", "\\dashrightarrow", true); -// unicode-math maps \u21e0 to \leftdasharrow. We'll use the AMS synonym. -defineSymbol(math, rel, "\u21e0", "\\dashleftarrow", true); -defineSymbol(math, rel, "\u21c7", "\\leftleftarrows", true); -defineSymbol(math, rel, "\u21c6", "\\leftrightarrows", true); -defineSymbol(math, rel, "\u21da", "\\Lleftarrow", true); -defineSymbol(math, rel, "\u219e", "\\twoheadleftarrow", true); -defineSymbol(math, rel, "\u21a2", "\\leftarrowtail", true); -defineSymbol(math, rel, "\u21ab", "\\looparrowleft", true); -defineSymbol(math, rel, "\u21cb", "\\leftrightharpoons", true); -defineSymbol(math, rel, "\u21b6", "\\curvearrowleft", true); -// unicode-math maps \u21ba to \acwopencirclearrow. We'll use the AMS synonym. -defineSymbol(math, rel, "\u21ba", "\\circlearrowleft", true); -defineSymbol(math, rel, "\u21b0", "\\Lsh", true); -defineSymbol(math, rel, "\u21c8", "\\upuparrows", true); -defineSymbol(math, rel, "\u21bf", "\\upharpoonleft", true); -defineSymbol(math, rel, "\u21c3", "\\downharpoonleft", true); -defineSymbol(math, rel, "\u22b6", "\\origof", true); -defineSymbol(math, rel, "\u22b7", "\\imageof", true); -defineSymbol(math, rel, "\u22b8", "\\multimap", true); -defineSymbol(math, rel, "\u21ad", "\\leftrightsquigarrow", true); -defineSymbol(math, rel, "\u21c9", "\\rightrightarrows", true); -defineSymbol(math, rel, "\u21c4", "\\rightleftarrows", true); -defineSymbol(math, rel, "\u21a0", "\\twoheadrightarrow", true); -defineSymbol(math, rel, "\u21a3", "\\rightarrowtail", true); -defineSymbol(math, rel, "\u21ac", "\\looparrowright", true); -defineSymbol(math, rel, "\u21b7", "\\curvearrowright", true); -// unicode-math maps \u21bb to \cwopencirclearrow. We'll use the AMS synonym. -defineSymbol(math, rel, "\u21bb", "\\circlearrowright", true); -defineSymbol(math, rel, "\u21b1", "\\Rsh", true); -defineSymbol(math, rel, "\u21ca", "\\downdownarrows", true); -defineSymbol(math, rel, "\u21be", "\\upharpoonright", true); -defineSymbol(math, rel, "\u21c2", "\\downharpoonright", true); -defineSymbol(math, rel, "\u21dd", "\\rightsquigarrow", true); -defineSymbol(math, rel, "\u21dd", "\\leadsto"); -defineSymbol(math, rel, "\u21db", "\\Rrightarrow", true); -defineSymbol(math, rel, "\u21be", "\\restriction"); - -defineSymbol(math, textord, "\u2018", "`"); -defineSymbol(math, textord, "$", "\\$"); -defineSymbol(text, textord, "$", "\\$"); -defineSymbol(text, textord, "$", "\\textdollar"); -defineSymbol(math, textord, "¢", "\\cent"); -defineSymbol(text, textord, "¢", "\\cent"); -defineSymbol(math, textord, "%", "\\%"); -defineSymbol(text, textord, "%", "\\%"); -defineSymbol(math, textord, "_", "\\_"); -defineSymbol(text, textord, "_", "\\_"); -defineSymbol(text, textord, "_", "\\textunderscore"); -defineSymbol(text, textord, "\u2423", "\\textvisiblespace", true); -defineSymbol(math, textord, "\u2220", "\\angle", true); -defineSymbol(math, textord, "\u221e", "\\infty", true); -defineSymbol(math, textord, "\u2032", "\\prime"); -defineSymbol(math, textord, "\u2033", "\\dprime"); -defineSymbol(math, textord, "\u2034", "\\trprime"); -defineSymbol(math, textord, "\u2057", "\\qprime"); -defineSymbol(math, textord, "\u25b3", "\\triangle"); -defineSymbol(text, textord, "\u0391", "\\Alpha", true); -defineSymbol(text, textord, "\u0392", "\\Beta", true); -defineSymbol(text, textord, "\u0393", "\\Gamma", true); -defineSymbol(text, textord, "\u0394", "\\Delta", true); -defineSymbol(text, textord, "\u0395", "\\Epsilon", true); -defineSymbol(text, textord, "\u0396", "\\Zeta", true); -defineSymbol(text, textord, "\u0397", "\\Eta", true); -defineSymbol(text, textord, "\u0398", "\\Theta", true); -defineSymbol(text, textord, "\u0399", "\\Iota", true); -defineSymbol(text, textord, "\u039a", "\\Kappa", true); -defineSymbol(text, textord, "\u039b", "\\Lambda", true); -defineSymbol(text, textord, "\u039c", "\\Mu", true); -defineSymbol(text, textord, "\u039d", "\\Nu", true); -defineSymbol(text, textord, "\u039e", "\\Xi", true); -defineSymbol(text, textord, "\u039f", "\\Omicron", true); -defineSymbol(text, textord, "\u03a0", "\\Pi", true); -defineSymbol(text, textord, "\u03a1", "\\Rho", true); -defineSymbol(text, textord, "\u03a3", "\\Sigma", true); -defineSymbol(text, textord, "\u03a4", "\\Tau", true); -defineSymbol(text, textord, "\u03a5", "\\Upsilon", true); -defineSymbol(text, textord, "\u03a6", "\\Phi", true); -defineSymbol(text, textord, "\u03a7", "\\Chi", true); -defineSymbol(text, textord, "\u03a8", "\\Psi", true); -defineSymbol(text, textord, "\u03a9", "\\Omega", true); -defineSymbol(math, mathord, "\u0391", "\\Alpha", true); -defineSymbol(math, mathord, "\u0392", "\\Beta", true); -defineSymbol(math, mathord, "\u0393", "\\Gamma", true); -defineSymbol(math, mathord, "\u0394", "\\Delta", true); -defineSymbol(math, mathord, "\u0395", "\\Epsilon", true); -defineSymbol(math, mathord, "\u0396", "\\Zeta", true); -defineSymbol(math, mathord, "\u0397", "\\Eta", true); -defineSymbol(math, mathord, "\u0398", "\\Theta", true); -defineSymbol(math, mathord, "\u0399", "\\Iota", true); -defineSymbol(math, mathord, "\u039a", "\\Kappa", true); -defineSymbol(math, mathord, "\u039b", "\\Lambda", true); -defineSymbol(math, mathord, "\u039c", "\\Mu", true); -defineSymbol(math, mathord, "\u039d", "\\Nu", true); -defineSymbol(math, mathord, "\u039e", "\\Xi", true); -defineSymbol(math, mathord, "\u039f", "\\Omicron", true); -defineSymbol(math, mathord, "\u03a0", "\\Pi", true); -defineSymbol(math, mathord, "\u03a1", "\\Rho", true); -defineSymbol(math, mathord, "\u03a3", "\\Sigma", true); -defineSymbol(math, mathord, "\u03a4", "\\Tau", true); -defineSymbol(math, mathord, "\u03a5", "\\Upsilon", true); -defineSymbol(math, mathord, "\u03a6", "\\Phi", true); -defineSymbol(math, mathord, "\u03a7", "\\Chi", true); -defineSymbol(math, mathord, "\u03a8", "\\Psi", true); -defineSymbol(math, mathord, "\u03a9", "\\Omega", true); -defineSymbol(math, open, "\u00ac", "\\neg", true); -defineSymbol(math, open, "\u00ac", "\\lnot"); -defineSymbol(math, textord, "\u22a4", "\\top"); -defineSymbol(math, textord, "\u22a5", "\\bot"); -defineSymbol(math, textord, "\u2205", "\\emptyset"); -defineSymbol(math, textord, "\u2300", "\\varnothing"); -defineSymbol(math, mathord, "\u03b1", "\\alpha", true); -defineSymbol(math, mathord, "\u03b2", "\\beta", true); -defineSymbol(math, mathord, "\u03b3", "\\gamma", true); -defineSymbol(math, mathord, "\u03b4", "\\delta", true); -defineSymbol(math, mathord, "\u03f5", "\\epsilon", true); -defineSymbol(math, mathord, "\u03b6", "\\zeta", true); -defineSymbol(math, mathord, "\u03b7", "\\eta", true); -defineSymbol(math, mathord, "\u03b8", "\\theta", true); -defineSymbol(math, mathord, "\u03b9", "\\iota", true); -defineSymbol(math, mathord, "\u03ba", "\\kappa", true); -defineSymbol(math, mathord, "\u03bb", "\\lambda", true); -defineSymbol(math, mathord, "\u03bc", "\\mu", true); -defineSymbol(math, mathord, "\u03bd", "\\nu", true); -defineSymbol(math, mathord, "\u03be", "\\xi", true); -defineSymbol(math, mathord, "\u03bf", "\\omicron", true); -defineSymbol(math, mathord, "\u03c0", "\\pi", true); -defineSymbol(math, mathord, "\u03c1", "\\rho", true); -defineSymbol(math, mathord, "\u03c3", "\\sigma", true); -defineSymbol(math, mathord, "\u03c4", "\\tau", true); -defineSymbol(math, mathord, "\u03c5", "\\upsilon", true); -defineSymbol(math, mathord, "\u03d5", "\\phi", true); -defineSymbol(math, mathord, "\u03c7", "\\chi", true); -defineSymbol(math, mathord, "\u03c8", "\\psi", true); -defineSymbol(math, mathord, "\u03c9", "\\omega", true); -defineSymbol(math, mathord, "\u03b5", "\\varepsilon", true); -defineSymbol(math, mathord, "\u03d1", "\\vartheta", true); -defineSymbol(math, mathord, "\u03d6", "\\varpi", true); -defineSymbol(math, mathord, "\u03f1", "\\varrho", true); -defineSymbol(math, mathord, "\u03c2", "\\varsigma", true); -defineSymbol(math, mathord, "\u03c6", "\\varphi", true); -defineSymbol(math, mathord, "\u03d8", "\\Coppa", true); -defineSymbol(math, mathord, "\u03d9", "\\coppa", true); -defineSymbol(math, mathord, "\u03d9", "\\varcoppa", true); -defineSymbol(math, mathord, "\u03de", "\\Koppa", true); -defineSymbol(math, mathord, "\u03df", "\\koppa", true); -defineSymbol(math, mathord, "\u03e0", "\\Sampi", true); -defineSymbol(math, mathord, "\u03e1", "\\sampi", true); -defineSymbol(math, mathord, "\u03da", "\\Stigma", true); -defineSymbol(math, mathord, "\u03db", "\\stigma", true); -defineSymbol(math, mathord, "\u2aeb", "\\Bot"); -defineSymbol(math, bin, "\u2217", "\u2217", true); -defineSymbol(math, bin, "+", "+"); -defineSymbol(math, bin, "*", "*"); -defineSymbol(math, bin, "\u2044", "/", true); -defineSymbol(math, bin, "\u2044", "\u2044"); -defineSymbol(math, bin, "\u2212", "-", true); -defineSymbol(math, bin, "\u22c5", "\\cdot", true); -defineSymbol(math, bin, "\u2218", "\\circ", true); -defineSymbol(math, bin, "\u00f7", "\\div", true); -defineSymbol(math, bin, "\u00b1", "\\pm", true); -defineSymbol(math, bin, "\u00d7", "\\times", true); -defineSymbol(math, bin, "\u2229", "\\cap", true); -defineSymbol(math, bin, "\u222a", "\\cup", true); -defineSymbol(math, bin, "\u2216", "\\setminus", true); -defineSymbol(math, bin, "\u2227", "\\land"); -defineSymbol(math, bin, "\u2228", "\\lor"); -defineSymbol(math, bin, "\u2227", "\\wedge", true); -defineSymbol(math, bin, "\u2228", "\\vee", true); -defineSymbol(math, open, "\u27e6", "\\llbracket", true); // stmaryrd/semantic packages -defineSymbol(math, close, "\u27e7", "\\rrbracket", true); -defineSymbol(math, open, "\u27e8", "\\langle", true); -defineSymbol(math, open, "\u27ea", "\\lAngle", true); -defineSymbol(math, open, "\u2989", "\\llangle", true); -defineSymbol(math, open, "|", "\\lvert"); -defineSymbol(math, open, "\u2016", "\\lVert"); -defineSymbol(math, textord, "!", "\\oc"); // cmll package -defineSymbol(math, textord, "?", "\\wn"); -defineSymbol(math, textord, "\u2193", "\\shpos"); -defineSymbol(math, textord, "\u2195", "\\shift"); -defineSymbol(math, textord, "\u2191", "\\shneg"); -defineSymbol(math, close, "?", "?"); -defineSymbol(math, close, "!", "!"); -defineSymbol(math, close, "‼", "‼"); -defineSymbol(math, close, "\u27e9", "\\rangle", true); -defineSymbol(math, close, "\u27eb", "\\rAngle", true); -defineSymbol(math, close, "\u298a", "\\rrangle", true); -defineSymbol(math, close, "|", "\\rvert"); -defineSymbol(math, close, "\u2016", "\\rVert"); -defineSymbol(math, open, "\u2983", "\\lBrace", true); // stmaryrd/semantic packages -defineSymbol(math, close, "\u2984", "\\rBrace", true); -defineSymbol(math, rel, "=", "\\equal", true); -defineSymbol(math, rel, ":", ":"); -defineSymbol(math, rel, "\u2248", "\\approx", true); -defineSymbol(math, rel, "\u2245", "\\cong", true); -defineSymbol(math, rel, "\u2265", "\\ge"); -defineSymbol(math, rel, "\u2265", "\\geq", true); -defineSymbol(math, rel, "\u2190", "\\gets"); -defineSymbol(math, rel, ">", "\\gt", true); -defineSymbol(math, rel, "\u2208", "\\in", true); -defineSymbol(math, rel, "\u2209", "\\notin", true); -defineSymbol(math, rel, "\ue020", "\\@not"); -defineSymbol(math, rel, "\u2282", "\\subset", true); -defineSymbol(math, rel, "\u2283", "\\supset", true); -defineSymbol(math, rel, "\u2286", "\\subseteq", true); -defineSymbol(math, rel, "\u2287", "\\supseteq", true); -defineSymbol(math, rel, "\u2288", "\\nsubseteq", true); -defineSymbol(math, rel, "\u2288", "\\nsubseteqq"); -defineSymbol(math, rel, "\u2289", "\\nsupseteq", true); -defineSymbol(math, rel, "\u2289", "\\nsupseteqq"); -defineSymbol(math, rel, "\u22a8", "\\models"); -defineSymbol(math, rel, "\u2190", "\\leftarrow", true); -defineSymbol(math, rel, "\u2264", "\\le"); -defineSymbol(math, rel, "\u2264", "\\leq", true); -defineSymbol(math, rel, "<", "\\lt", true); -defineSymbol(math, rel, "\u2192", "\\rightarrow", true); -defineSymbol(math, rel, "\u2192", "\\to"); -defineSymbol(math, rel, "\u2271", "\\ngeq", true); -defineSymbol(math, rel, "\u2271", "\\ngeqq"); -defineSymbol(math, rel, "\u2271", "\\ngeqslant"); -defineSymbol(math, rel, "\u2270", "\\nleq", true); -defineSymbol(math, rel, "\u2270", "\\nleqq"); -defineSymbol(math, rel, "\u2270", "\\nleqslant"); -defineSymbol(math, rel, "\u2aeb", "\\Perp", true); //cmll package -defineSymbol(math, spacing, "\u00a0", "\\ "); -defineSymbol(math, spacing, "\u00a0", "\\space"); -// Ref: LaTeX Source 2e: \DeclareRobustCommand{\nobreakspace}{% -defineSymbol(math, spacing, "\u00a0", "\\nobreakspace"); -defineSymbol(text, spacing, "\u00a0", "\\ "); -defineSymbol(text, spacing, "\u00a0", " "); -defineSymbol(text, spacing, "\u00a0", "\\space"); -defineSymbol(text, spacing, "\u00a0", "\\nobreakspace"); -defineSymbol(math, spacing, null, "\\nobreak"); -defineSymbol(math, spacing, null, "\\allowbreak"); -defineSymbol(math, punct, ",", ","); -defineSymbol(text, punct, ":", ":"); -defineSymbol(math, punct, ";", ";"); -defineSymbol(math, bin, "\u22bc", "\\barwedge"); -defineSymbol(math, bin, "\u22bb", "\\veebar"); -defineSymbol(math, bin, "\u2299", "\\odot", true); -// Firefox turns ⊕ into an emoji. So append \uFE0E. Define Unicode character in macros, not here. -defineSymbol(math, bin, "\u2295\uFE0E", "\\oplus"); -defineSymbol(math, bin, "\u2297", "\\otimes", true); -defineSymbol(math, textord, "\u2202", "\\partial", true); -defineSymbol(math, bin, "\u2298", "\\oslash", true); -defineSymbol(math, bin, "\u229a", "\\circledcirc", true); -defineSymbol(math, bin, "\u22a1", "\\boxdot", true); -defineSymbol(math, bin, "\u25b3", "\\bigtriangleup"); -defineSymbol(math, bin, "\u25bd", "\\bigtriangledown"); -defineSymbol(math, bin, "\u2020", "\\dagger"); -defineSymbol(math, bin, "\u22c4", "\\diamond"); -defineSymbol(math, bin, "\u25c3", "\\triangleleft"); -defineSymbol(math, bin, "\u25b9", "\\triangleright"); -defineSymbol(math, open, "{", "\\{"); -defineSymbol(text, textord, "{", "\\{"); -defineSymbol(text, textord, "{", "\\textbraceleft"); -defineSymbol(math, close, "}", "\\}"); -defineSymbol(text, textord, "}", "\\}"); -defineSymbol(text, textord, "}", "\\textbraceright"); -defineSymbol(math, open, "{", "\\lbrace"); -defineSymbol(math, close, "}", "\\rbrace"); -defineSymbol(math, open, "[", "\\lbrack", true); -defineSymbol(text, textord, "[", "\\lbrack", true); -defineSymbol(math, close, "]", "\\rbrack", true); -defineSymbol(text, textord, "]", "\\rbrack", true); -defineSymbol(math, open, "(", "\\lparen", true); -defineSymbol(math, close, ")", "\\rparen", true); -defineSymbol(math, open, "⦇", "\\llparenthesis", true); -defineSymbol(math, close, "⦈", "\\rrparenthesis", true); -defineSymbol(text, textord, "<", "\\textless", true); // in T1 fontenc -defineSymbol(text, textord, ">", "\\textgreater", true); // in T1 fontenc -defineSymbol(math, open, "\u230a", "\\lfloor", true); -defineSymbol(math, close, "\u230b", "\\rfloor", true); -defineSymbol(math, open, "\u2308", "\\lceil", true); -defineSymbol(math, close, "\u2309", "\\rceil", true); -defineSymbol(math, textord, "\\", "\\backslash"); -defineSymbol(math, textord, "|", "|"); -defineSymbol(math, textord, "|", "\\vert"); -defineSymbol(text, textord, "|", "\\textbar", true); // in T1 fontenc -defineSymbol(math, textord, "\u2016", "\\|"); -defineSymbol(math, textord, "\u2016", "\\Vert"); -defineSymbol(text, textord, "\u2016", "\\textbardbl"); -defineSymbol(text, textord, "~", "\\textasciitilde"); -defineSymbol(text, textord, "\\", "\\textbackslash"); -defineSymbol(text, textord, "^", "\\textasciicircum"); -defineSymbol(math, rel, "\u2191", "\\uparrow", true); -defineSymbol(math, rel, "\u21d1", "\\Uparrow", true); -defineSymbol(math, rel, "\u2193", "\\downarrow", true); -defineSymbol(math, rel, "\u21d3", "\\Downarrow", true); -defineSymbol(math, rel, "\u2195", "\\updownarrow", true); -defineSymbol(math, rel, "\u21d5", "\\Updownarrow", true); -defineSymbol(math, op, "\u2210", "\\coprod"); -defineSymbol(math, op, "\u22c1", "\\bigvee"); -defineSymbol(math, op, "\u22c0", "\\bigwedge"); -defineSymbol(math, op, "\u2a04", "\\biguplus"); -defineSymbol(math, op, "\u22c2", "\\bigcap"); -defineSymbol(math, op, "\u22c3", "\\bigcup"); -defineSymbol(math, op, "\u222b", "\\int"); -defineSymbol(math, op, "\u222b", "\\intop"); -defineSymbol(math, op, "\u222c", "\\iint"); -defineSymbol(math, op, "\u222d", "\\iiint"); -defineSymbol(math, op, "\u220f", "\\prod"); -defineSymbol(math, op, "\u2211", "\\sum"); -defineSymbol(math, op, "\u2a02", "\\bigotimes"); -defineSymbol(math, op, "\u2a01", "\\bigoplus"); -defineSymbol(math, op, "\u2a00", "\\bigodot"); -defineSymbol(math, op, "\u2a09", "\\bigtimes"); -defineSymbol(math, op, "\u222e", "\\oint"); -defineSymbol(math, op, "\u222f", "\\oiint"); -defineSymbol(math, op, "\u2230", "\\oiiint"); -defineSymbol(math, op, "\u2231", "\\intclockwise"); -defineSymbol(math, op, "\u2232", "\\varointclockwise"); -defineSymbol(math, op, "\u2a0c", "\\iiiint"); -defineSymbol(math, op, "\u2a0d", "\\intbar"); -defineSymbol(math, op, "\u2a0e", "\\intBar"); -defineSymbol(math, op, "\u2a0f", "\\fint"); -defineSymbol(math, op, "\u2a12", "\\rppolint"); -defineSymbol(math, op, "\u2a13", "\\scpolint"); -defineSymbol(math, op, "\u2a15", "\\pointint"); -defineSymbol(math, op, "\u2a16", "\\sqint"); -defineSymbol(math, op, "\u2a17", "\\intlarhk"); -defineSymbol(math, op, "\u2a18", "\\intx"); -defineSymbol(math, op, "\u2a19", "\\intcap"); -defineSymbol(math, op, "\u2a1a", "\\intcup"); -defineSymbol(math, op, "\u2a05", "\\bigsqcap"); -defineSymbol(math, op, "\u2a06", "\\bigsqcup"); -defineSymbol(math, op, "\u222b", "\\smallint"); -defineSymbol(text, inner, "\u2026", "\\textellipsis"); -defineSymbol(math, inner, "\u2026", "\\mathellipsis"); -defineSymbol(text, inner, "\u2026", "\\ldots", true); -defineSymbol(math, inner, "\u2026", "\\ldots", true); -defineSymbol(math, inner, "\u22f0", "\\iddots", true); -defineSymbol(math, inner, "\u22ef", "\\@cdots", true); -defineSymbol(math, inner, "\u22f1", "\\ddots", true); -defineSymbol(math, textord, "\u22ee", "\\varvdots"); // \vdots is a macro -defineSymbol(math, accent, "\u02ca", "\\acute"); -defineSymbol(math, accent, "\u0060", "\\grave"); -defineSymbol(math, accent, "\u00a8", "\\ddot"); -defineSymbol(math, accent, "\u2026", "\\dddot"); -defineSymbol(math, accent, "\u2026\u002e", "\\ddddot"); -defineSymbol(math, accent, "\u007e", "\\tilde"); -defineSymbol(math, accent, "\u203e", "\\bar"); -defineSymbol(math, accent, "\u02d8", "\\breve"); -defineSymbol(math, accent, "\u02c7", "\\check"); -defineSymbol(math, accent, "\u005e", "\\hat"); -defineSymbol(math, accent, "\u2192", "\\vec"); -defineSymbol(math, accent, "\u02d9", "\\dot"); -defineSymbol(math, accent, "\u02da", "\\mathring"); -defineSymbol(math, mathord, "\u0131", "\\imath", true); -defineSymbol(math, mathord, "\u0237", "\\jmath", true); -defineSymbol(math, textord, "\u0131", "\u0131"); -defineSymbol(math, textord, "\u0237", "\u0237"); -defineSymbol(text, textord, "\u0131", "\\i", true); -defineSymbol(text, textord, "\u0237", "\\j", true); -defineSymbol(text, textord, "\u00df", "\\ss", true); -defineSymbol(text, textord, "\u00e6", "\\ae", true); -defineSymbol(text, textord, "\u0153", "\\oe", true); -defineSymbol(text, textord, "\u00f8", "\\o", true); -defineSymbol(math, mathord, "\u00f8", "\\o", true); -defineSymbol(text, textord, "\u00c6", "\\AE", true); -defineSymbol(text, textord, "\u0152", "\\OE", true); -defineSymbol(text, textord, "\u00d8", "\\O", true); -defineSymbol(math, mathord, "\u00d8", "\\O", true); -defineSymbol(text, accent, "\u02ca", "\\'"); // acute -defineSymbol(text, accent, "\u02cb", "\\`"); // grave -defineSymbol(text, accent, "\u02c6", "\\^"); // circumflex -defineSymbol(text, accent, "\u02dc", "\\~"); // tilde -defineSymbol(text, accent, "\u02c9", "\\="); // macron -defineSymbol(text, accent, "\u02d8", "\\u"); // breve -defineSymbol(text, accent, "\u02d9", "\\."); // dot above -defineSymbol(text, accent, "\u00b8", "\\c"); // cedilla -defineSymbol(text, accent, "\u02da", "\\r"); // ring above -defineSymbol(text, accent, "\u02c7", "\\v"); // caron -defineSymbol(text, accent, "\u00a8", '\\"'); // diaresis -defineSymbol(text, accent, "\u02dd", "\\H"); // double acute -defineSymbol(math, accent, "\u02ca", "\\'"); // acute -defineSymbol(math, accent, "\u02cb", "\\`"); // grave -defineSymbol(math, accent, "\u02c6", "\\^"); // circumflex -defineSymbol(math, accent, "\u02dc", "\\~"); // tilde -defineSymbol(math, accent, "\u02c9", "\\="); // macron -defineSymbol(math, accent, "\u02d8", "\\u"); // breve -defineSymbol(math, accent, "\u02d9", "\\."); // dot above -defineSymbol(math, accent, "\u00b8", "\\c"); // cedilla -defineSymbol(math, accent, "\u02da", "\\r"); // ring above -defineSymbol(math, accent, "\u02c7", "\\v"); // caron -defineSymbol(math, accent, "\u00a8", '\\"'); // diaresis -defineSymbol(math, accent, "\u02dd", "\\H"); // double acute - -// These ligatures are detected and created in Parser.js's `formLigatures`. -const ligatures = { - "--": true, - "---": true, - "``": true, - "''": true -}; - -defineSymbol(text, textord, "\u2013", "--", true); -defineSymbol(text, textord, "\u2013", "\\textendash"); -defineSymbol(text, textord, "\u2014", "---", true); -defineSymbol(text, textord, "\u2014", "\\textemdash"); -defineSymbol(text, textord, "\u2018", "`", true); -defineSymbol(text, textord, "\u2018", "\\textquoteleft"); -defineSymbol(text, textord, "\u2019", "'", true); -defineSymbol(text, textord, "\u2019", "\\textquoteright"); -defineSymbol(text, textord, "\u201c", "``", true); -defineSymbol(text, textord, "\u201c", "\\textquotedblleft"); -defineSymbol(text, textord, "\u201d", "''", true); -defineSymbol(text, textord, "\u201d", "\\textquotedblright"); -// \degree from gensymb package -defineSymbol(math, textord, "\u00b0", "\\degree", true); -defineSymbol(text, textord, "\u00b0", "\\degree"); -// \textdegree from inputenc package -defineSymbol(text, textord, "\u00b0", "\\textdegree", true); -// TODO: In LaTeX, \pounds can generate a different character in text and math -// mode, but among our fonts, only Main-Regular defines this character "163". -defineSymbol(math, textord, "\u00a3", "\\pounds"); -defineSymbol(math, textord, "\u00a3", "\\mathsterling", true); -defineSymbol(text, textord, "\u00a3", "\\pounds"); -defineSymbol(text, textord, "\u00a3", "\\textsterling", true); -defineSymbol(math, textord, "\u2720", "\\maltese"); -defineSymbol(text, textord, "\u2720", "\\maltese"); -defineSymbol(math, textord, "\u20ac", "\\euro", true); -defineSymbol(text, textord, "\u20ac", "\\euro", true); -defineSymbol(text, textord, "\u20ac", "\\texteuro"); -defineSymbol(math, textord, "\u00a9", "\\copyright", true); -defineSymbol(text, textord, "\u00a9", "\\textcopyright"); -defineSymbol(math, textord, "\u2300", "\\diameter", true); -defineSymbol(text, textord, "\u2300", "\\diameter"); - -// Italic Greek -defineSymbol(math, textord, "𝛤", "\\varGamma"); -defineSymbol(math, textord, "𝛥", "\\varDelta"); -defineSymbol(math, textord, "𝛩", "\\varTheta"); -defineSymbol(math, textord, "𝛬", "\\varLambda"); -defineSymbol(math, textord, "𝛯", "\\varXi"); -defineSymbol(math, textord, "𝛱", "\\varPi"); -defineSymbol(math, textord, "𝛴", "\\varSigma"); -defineSymbol(math, textord, "𝛶", "\\varUpsilon"); -defineSymbol(math, textord, "𝛷", "\\varPhi"); -defineSymbol(math, textord, "𝛹", "\\varPsi"); -defineSymbol(math, textord, "𝛺", "\\varOmega"); -defineSymbol(text, textord, "𝛤", "\\varGamma"); -defineSymbol(text, textord, "𝛥", "\\varDelta"); -defineSymbol(text, textord, "𝛩", "\\varTheta"); -defineSymbol(text, textord, "𝛬", "\\varLambda"); -defineSymbol(text, textord, "𝛯", "\\varXi"); -defineSymbol(text, textord, "𝛱", "\\varPi"); -defineSymbol(text, textord, "𝛴", "\\varSigma"); -defineSymbol(text, textord, "𝛶", "\\varUpsilon"); -defineSymbol(text, textord, "𝛷", "\\varPhi"); -defineSymbol(text, textord, "𝛹", "\\varPsi"); -defineSymbol(text, textord, "𝛺", "\\varOmega"); - - -// There are lots of symbols which are the same, so we add them in afterwards. -// All of these are textords in math mode -const mathTextSymbols = '0123456789/@."'; -for (let i = 0; i < mathTextSymbols.length; i++) { - const ch = mathTextSymbols.charAt(i); - defineSymbol(math, textord, ch, ch); -} - -// All of these are textords in text mode -const textSymbols = '0123456789!@*()-=+";:?/.,'; -for (let i = 0; i < textSymbols.length; i++) { - const ch = textSymbols.charAt(i); - defineSymbol(text, textord, ch, ch); -} - -// All of these are textords in text mode, and mathords in math mode -const letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; -for (let i = 0; i < letters.length; i++) { - const ch = letters.charAt(i); - defineSymbol(math, mathord, ch, ch); - defineSymbol(text, textord, ch, ch); -} - -// Some more letters in Unicode Basic Multilingual Plane. -const narrow = "ÇÐÞçþℂℍℕℙℚℝℤℎℏℊℋℌℐℑℒℓ℘ℛℜℬℰℱℳℭℨ"; -for (let i = 0; i < narrow.length; i++) { - const ch = narrow.charAt(i); - defineSymbol(math, mathord, ch, ch); - defineSymbol(text, textord, ch, ch); -} - -// The next loop loads wide (surrogate pair) characters. -// We support some letters in the Unicode range U+1D400 to U+1D7FF, -// Mathematical Alphanumeric Symbols. -let wideChar = ""; -for (let i = 0; i < letters.length; i++) { - // The hex numbers in the next line are a surrogate pair. - // 0xD835 is the high surrogate for all letters in the range we support. - // 0xDC00 is the low surrogate for bold A. - wideChar = String.fromCharCode(0xd835, 0xdc00 + i); // A-Z a-z bold - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xdc34 + i); // A-Z a-z italic - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xdc68 + i); // A-Z a-z bold italic - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xdd04 + i); // A-Z a-z Fractur - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xdda0 + i); // A-Z a-z sans-serif - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xddd4 + i); // A-Z a-z sans bold - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xde08 + i); // A-Z a-z sans italic - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xde70 + i); // A-Z a-z monospace - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xdd38 + i); // A-Z a-z double struck - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - const ch = letters.charAt(i); - wideChar = String.fromCharCode(0xd835, 0xdc9c + i); // A-Z a-z calligraphic - defineSymbol(math, mathord, ch, wideChar); - defineSymbol(text, textord, ch, wideChar); -} - -// Next, some wide character numerals -for (let i = 0; i < 10; i++) { - wideChar = String.fromCharCode(0xd835, 0xdfce + i); // 0-9 bold - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xdfe2 + i); // 0-9 sans serif - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xdfec + i); // 0-9 bold sans - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xdff6 + i); // 0-9 monospace - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); -} - -/* - * Neither Firefox nor Chrome support hard line breaks or soft line breaks. - * (Despite https://www.w3.org/Math/draft-spec/mathml.html#chapter3_presm.lbattrs) - * So Temml has work-arounds for both hard and soft breaks. - * The work-arounds sadly do not work simultaneously. Any top-level hard - * break makes soft line breaks impossible. - * - * Hard breaks are simulated by creating a and putting each line in its own . - * - * To create soft line breaks, Temml avoids using the and tags. - * Then the top level of a element can be occupied by elements, and the browser - * will break after a if the expression extends beyond the container limit. - * - * The default is for soft line breaks after each top-level binary or - * relational operator, per TeXbook p. 173. So we gather the expression into s so that - * each ends in a binary or relational operator. - * - * An option is for soft line breaks before an "=" sign. That changes the s. - * - * Soft line breaks will not work in Chromium and Safari, only Firefox. - * - * Hopefully browsers will someday do their own linebreaking and we will be able to delete - * much of this module. - */ - -const openDelims = "([{⌊⌈⟨⟮⎰⟦⦃"; -const closeDelims = ")]}⌋⌉⟩⟯⎱⟦⦄"; - -function setLineBreaks(expression, wrapMode, isDisplayMode) { - const mtrs = []; - let mrows = []; - let block = []; - let numTopLevelEquals = 0; - let i = 0; - let level = 0; - while (i < expression.length) { - while (expression[i] instanceof DocumentFragment) { - expression.splice(i, 1, ...expression[i].children); // Expand the fragment. - } - const node = expression[i]; - if (node.attributes && node.attributes.linebreak && - node.attributes.linebreak === "newline") { - // A hard line break. Create a for the current block. - if (block.length > 0) { - mrows.push(new mathMLTree.MathNode("mrow", block)); - } - mrows.push(node); - block = []; - const mtd = new mathMLTree.MathNode("mtd", mrows); - mtd.style.textAlign = "left"; - mtrs.push(new mathMLTree.MathNode("mtr", [mtd])); - mrows = []; - i += 1; - continue - } - block.push(node); - if (node.type && node.type === "mo" && node.children.length === 1 && - !Object.hasOwn(node.attributes, "movablelimits")) { - const ch = node.children[0].text; - if (openDelims.indexOf(ch) > -1) { - level += 1; - } else if (closeDelims.indexOf(ch) > -1) { - level -= 1; - } else if (level === 0 && wrapMode === "=" && ch === "=") { - numTopLevelEquals += 1; - if (numTopLevelEquals > 1) { - block.pop(); - // Start a new block. (Insert a soft linebreak.) - const element = new mathMLTree.MathNode("mrow", block); - mrows.push(element); - block = [node]; - } - } else if (level === 0 && wrapMode === "tex" && ch !== "∇") { - // Check if the following node is a \nobreak text node, e.g. "~"" - const next = i < expression.length - 1 ? expression[i + 1] : null; - let glueIsFreeOfNobreak = true; - if ( - !( - next && - next.type === "mtext" && - next.attributes.linebreak && - next.attributes.linebreak === "nobreak" - ) - ) { - // We may need to start a new block. - // First, put any post-operator glue on same line as operator. - for (let j = i + 1; j < expression.length; j++) { - const nd = expression[j]; - if ( - nd.type && - nd.type === "mspace" && - !(nd.attributes.linebreak && nd.attributes.linebreak === "newline") - ) { - block.push(nd); - i += 1; - if ( - nd.attributes && - nd.attributes.linebreak && - nd.attributes.linebreak === "nobreak" - ) { - glueIsFreeOfNobreak = false; - } - } else { - break; - } - } - } - if (glueIsFreeOfNobreak) { - // Start a new block. (Insert a soft linebreak.) - const element = new mathMLTree.MathNode("mrow", block); - mrows.push(element); - block = []; - } - } - } - i += 1; - } - if (block.length > 0) { - const element = new mathMLTree.MathNode("mrow", block); - mrows.push(element); - } - if (mtrs.length > 0) { - const mtd = new mathMLTree.MathNode("mtd", mrows); - mtd.style.textAlign = "left"; - const mtr = new mathMLTree.MathNode("mtr", [mtd]); - mtrs.push(mtr); - const mtable = new mathMLTree.MathNode("mtable", mtrs); - if (!isDisplayMode) { - mtable.setAttribute("columnalign", "left"); - mtable.setAttribute("rowspacing", "0em"); - } - return mtable - } - return mathMLTree.newDocumentFragment(mrows); -} - -/** - * This file converts a parse tree into a corresponding MathML tree. The main - * entry point is the `buildMathML` function, which takes a parse tree from the - * parser. - */ - -/** - * Takes a symbol and converts it into a MathML text node after performing - * optional replacement from symbols.js. - */ -const makeText = function(text, mode, style) { - if ( - symbols[mode][text] && - symbols[mode][text].replace && - text.charCodeAt(0) !== 0xd835 && - !( - Object.prototype.hasOwnProperty.call(ligatures, text) && - style && - ((style.fontFamily && style.fontFamily.slice(4, 6) === "tt") || - (style.font && style.font.slice(4, 6) === "tt")) - ) - ) { - text = symbols[mode][text].replace; - } - - return new mathMLTree.TextNode(text); -}; - -const consolidateText = mrow => { - // If possible, consolidate adjacent elements into a single element. - if (mrow.type !== "mrow" && mrow.type !== "mstyle") { return mrow } - if (mrow.children.length === 0) { return mrow } // empty group, e.g., \text{} - if (!mrow.children[0].attributes || mrow.children[0].type !== "mtext") { return mrow } - const variant = mrow.children[0].attributes.mathvariant || ""; - const mtext = new mathMLTree.MathNode( - "mtext", - [new mathMLTree.TextNode(mrow.children[0].children[0].text)] - ); - for (let i = 1; i < mrow.children.length; i++) { - // Check each child and, if possible, copy the character into child[0]. - const localVariant = mrow.children[i].attributes.mathvariant || ""; - if (mrow.children[i].type === "mrow") { - const childRow = mrow.children[i]; - for (let j = 0; j < childRow.children.length; j++) { - // We'll also check the children of a mrow. One level only. No recursion. - const childVariant = childRow.children[j].attributes.mathvariant || ""; - if (childVariant !== variant || childRow.children[j].type !== "mtext") { - return mrow // At least one element cannot be consolidated. Get out. - } else { - mtext.children[0].text += childRow.children[j].children[0].text; - } - } - } else if (localVariant !== variant || mrow.children[i].type !== "mtext") { - return mrow - } else { - mtext.children[0].text += mrow.children[i].children[0].text; - } - } - // Firefox does not render a space at either end of an string. - // To get proper rendering, we replace leading or trailing spaces with no-break spaces. - if (mtext.children[0].text.charAt(0) === " ") { - mtext.children[0].text = "\u00a0" + mtext.children[0].text.slice(1); - } - const L = mtext.children[0].text.length; - if (L > 0 && mtext.children[0].text.charAt(L - 1) === " ") { - mtext.children[0].text = mtext.children[0].text.slice(0, -1) + "\u00a0"; - } - for (const [key, value] of Object.entries(mrow.attributes)) { - mtext.attributes[key] = value; - } - return mtext -}; - -const numberRegEx$1 = /^[0-9]$/; -const isDotOrComma = (node, followingNode) => { - return ((node.type === "textord" && node.text === ".") || - (node.type === "atom" && node.text === ",")) && - // Don't consolidate if there is a space after the comma. - node.loc && followingNode.loc && node.loc.end === followingNode.loc.start -}; -const consolidateNumbers = expression => { - // Consolidate adjacent numbers. We want to return 1,506.3, - // not 1,506.3 - if (expression.length < 2) { return } - const nums = []; - let inNum = false; - // Find adjacent numerals - for (let i = 0; i < expression.length; i++) { - const node = expression[i]; - if (node.type === "textord" && numberRegEx$1.test(node.text)) { - if (!inNum) { nums.push({ start: i }); } - inNum = true; - } else { - if (inNum) { nums[nums.length - 1].end = i - 1; } - inNum = false; - } - } - if (inNum) { nums[nums.length - 1].end = expression.length - 1; } - - // Determine if numeral groups are separated by a comma or dot. - for (let i = nums.length - 1; i > 0; i--) { - if (nums[i - 1].end === nums[i].start - 2 && - isDotOrComma(expression[nums[i].start - 1], expression[nums[i].start])) { - // Merge the two groups. - nums[i - 1].end = nums[i].end; - nums.splice(i, 1); - } - } - - // Consolidate the number nodes - for (let i = nums.length - 1; i >= 0; i--) { - for (let j = nums[i].start + 1; j <= nums[i].end; j++) { - expression[nums[i].start].text += expression[j].text; - } - expression.splice(nums[i].start + 1, nums[i].end - nums[i].start); - // Check if the is followed by a numeric base in a supsub, e.g. the "3" in 123^4 - // If so, merge the first into the base. - if (expression.length > nums[i].start + 1) { - const nextTerm = expression[nums[i].start + 1]; - if (nextTerm.type === "supsub" && nextTerm.base && nextTerm.base.type === "textord" && - numberRegEx$1.test(nextTerm.base.text)) { - nextTerm.base.text = expression[nums[i].start].text + nextTerm.base.text; - expression.splice(nums[i].start, 1); - } - } - } -}; - -/** - * Wrap the given array of nodes in an node if needed, i.e., - * unless the array has length 1. Always returns a single node. - */ -const makeRow = function(body, semisimple = false) { - if (body.length === 1 && !(body[0] instanceof DocumentFragment)) { - return body[0]; - } else if (!semisimple) { - // Suppress spacing on nodes at both ends of the row. - if (body[0] instanceof MathNode && body[0].type === "mo" && !body[0].attributes.fence) { - body[0].attributes.lspace = "0em"; - body[0].attributes.rspace = "0em"; - } - const end = body.length - 1; - if (body[end] instanceof MathNode && body[end].type === "mo" && !body[end].attributes.fence) { - body[end].attributes.lspace = "0em"; - body[end].attributes.rspace = "0em"; - } - } - return new mathMLTree.MathNode("mrow", body); -}; - -const isRel = item => { - return (item.type === "atom" && item.family === "rel") || - (item.type === "mclass" && item.mclass === "mrel") -}; - -/** - * Takes a list of nodes, builds them, and returns a list of the generated - * MathML nodes. Also do a couple chores along the way: - * (1) Suppress spacing when an author wraps an operator w/braces, as in {=}. - * (2) Suppress spacing between two adjacent relations. - */ -const buildExpression = function(expression, style, semisimple = false) { - if (!semisimple && expression.length === 1) { - const group = buildGroup$1(expression[0], style); - if (group instanceof MathNode && group.type === "mo") { - // When TeX writers want to suppress spacing on an operator, - // they often put the operator by itself inside braces. - group.setAttribute("lspace", "0em"); - group.setAttribute("rspace", "0em"); - } - return [group]; - } - - consolidateNumbers(expression); - - const groups = []; - for (let i = 0; i < expression.length; i++) { - const group = buildGroup$1(expression[i], style); - // Suppress spacing between adjacent relations - if (i < expression.length - 1 && isRel(expression[i]) && isRel(expression[i + 1])) { - group.setAttribute("rspace", "0em"); - } - if (i > 0 && isRel(expression[i]) && isRel(expression[i - 1])) { - group.setAttribute("lspace", "0em"); - } - groups.push(group); - } - return groups; -}; - -/** - * Equivalent to buildExpression, but wraps the elements in an - * if there's more than one. Returns a single node instead of an array. - */ -const buildExpressionRow = function(expression, style, semisimple = false) { - return makeRow(buildExpression(expression, style, semisimple), semisimple); -}; - -/** - * Takes a group from the parser and calls the appropriate groupBuilders function - * on it to produce a MathML node. - */ -const buildGroup$1 = function(group, style) { - if (!group) { - return new mathMLTree.MathNode("mrow"); - } - - if (_mathmlGroupBuilders[group.type]) { - // Call the groupBuilders function - const result = _mathmlGroupBuilders[group.type](group, style); - return result; - } else { - throw new ParseError("Got group of unknown type: '" + group.type + "'"); - } -}; - -const glue$1 = _ => { - return new mathMLTree.MathNode("mtd", [], [], { padding: "0", width: "50%" }) -}; - -const taggedExpression = (expression, tag, style, leqno) => { - tag = buildExpressionRow(tag[0].body, style); - tag = consolidateText(tag); - tag.classes.push("tml-tag"); - - expression = new mathMLTree.MathNode("mtd", [expression]); - const rowArray = [glue$1(), expression, glue$1()]; - rowArray[leqno ? 0 : 2].classes.push(leqno ? "tml-left" : "tml-right"); - rowArray[leqno ? 0 : 2].children.push(tag); - const mtr = new mathMLTree.MathNode("mtr", rowArray, ["tml-tageqn"]); - const table = new mathMLTree.MathNode("mtable", [mtr]); - table.style.width = "100%"; - table.setAttribute("displaystyle", "true"); - return table -}; - -/** - * Takes a full parse tree and settings and builds a MathML representation of - * it. - */ -function buildMathML(tree, texExpression, style, settings) { - // Strip off outer tag wrapper for processing below. - let tag = null; - if (tree.length === 1 && tree[0].type === "tag") { - tag = tree[0].tag; - tree = tree[0].body; - } - - const expression = buildExpression(tree, style); - const wrap = (settings.displayMode || settings.annotate) ? "none" : settings.wrap; - - const n1 = expression.length === 0 ? null : expression[0]; - let wrapper = expression.length === 1 && tag === null && (n1 instanceof MathNode) - ? expression[0] - : setLineBreaks(expression, wrap, settings.displayMode); - - if (tag) { - wrapper = taggedExpression(wrapper, tag, style, settings.leqno); - } - - if (settings.annotate) { - // Build a TeX annotation of the source - const annotation = new mathMLTree.MathNode( - "annotation", [new mathMLTree.TextNode(texExpression)]); - annotation.setAttribute("encoding", "application/x-tex"); - wrapper = new mathMLTree.MathNode("semantics", [wrapper, annotation]); - } - - const math = new mathMLTree.MathNode("math", [wrapper]); - - if (settings.xml) { - math.setAttribute("xmlns", "http://www.w3.org/1998/Math/MathML"); - } - if (settings.displayMode) { - math.setAttribute("display", "block"); - math.style.display = "block math"; // necessary in Chromium. - // Firefox and Safari do not recognize display: "block math". - // Set a class so that the CSS file can set display: block. - math.classes = ["tml-display"]; - } - return math; -} - -const smalls = "acegıȷmnopqrsuvwxyzαγεηικμνοπρςστυχωϕ𝐚𝐜𝐞𝐠𝐦𝐧𝐨𝐩𝐪𝐫𝐬𝐮𝐯𝐰𝐱𝐲𝐳"; -const talls = "ABCDEFGHIJKLMNOPQRSTUVWXYZbdfhkltΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩβδλζφθψ" - + "𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙𝐛𝐝𝐟𝐡𝐤𝐥𝐭"; -const longSmalls = new Set(["\\alpha", "\\gamma", "\\delta", "\\epsilon", "\\eta", "\\iota", - "\\kappa", "\\mu", "\\nu", "\\pi", "\\rho", "\\sigma", "\\tau", "\\upsilon", "\\chi", "\\psi", - "\\omega", "\\imath", "\\jmath"]); -const longTalls = new Set(["\\Gamma", "\\Delta", "\\Sigma", "\\Omega", "\\beta", "\\delta", - "\\lambda", "\\theta", "\\psi"]); - -const mathmlBuilder$a = (group, style) => { - const accentNode = group.isStretchy - ? stretchy.accentNode(group) - : new mathMLTree.MathNode("mo", [makeText(group.label, group.mode)]); - - if (group.label === "\\vec") { - accentNode.style.transform = "scale(0.75) translate(10%, 30%)"; - } else { - accentNode.style.mathStyle = "normal"; - accentNode.style.mathDepth = "0"; - if (needWebkitShift.has(group.label) && utils.isCharacterBox(group.base)) { - let shift = ""; - const ch = group.base.text; - if (smalls.indexOf(ch) > -1 || longSmalls.has(ch)) { shift = "tml-xshift"; } - if (talls.indexOf(ch) > -1 || longTalls.has(ch)) { shift = "tml-capshift"; } - if (shift) { accentNode.classes.push(shift); } - } - } - if (!group.isStretchy) { - accentNode.setAttribute("stretchy", "false"); - } - - const node = new mathMLTree.MathNode((group.label === "\\c" ? "munder" : "mover"), - [buildGroup$1(group.base, style), accentNode] - ); - - return node; -}; - -const nonStretchyAccents = new Set([ - "\\acute", - "\\grave", - "\\ddot", - "\\dddot", - "\\ddddot", - "\\tilde", - "\\bar", - "\\breve", - "\\check", - "\\hat", - "\\vec", - "\\dot", - "\\mathring" -]); - -const needWebkitShift = new Set([ - "\\acute", - "\\bar", - "\\breve", - "\\check", - "\\dot", - "\\ddot", - "\\grave", - "\\hat", - "\\mathring", - "\\'", "\\^", "\\~", "\\=", "\\u", "\\.", '\\"', "\\r", "\\H", "\\v" -]); - -// Accents -defineFunction({ - type: "accent", - names: [ - "\\acute", - "\\grave", - "\\ddot", - "\\dddot", - "\\ddddot", - "\\tilde", - "\\bar", - "\\breve", - "\\check", - "\\hat", - "\\vec", - "\\dot", - "\\mathring", - "\\overparen", - "\\widecheck", - "\\widehat", - "\\wideparen", - "\\widetilde", - "\\overrightarrow", - "\\overleftarrow", - "\\Overrightarrow", - "\\overleftrightarrow", - "\\overgroup", - "\\overleftharpoon", - "\\overrightharpoon" - ], - props: { - numArgs: 1 - }, - handler: (context, args) => { - const base = normalizeArgument(args[0]); - - const isStretchy = !nonStretchyAccents.has(context.funcName); - - return { - type: "accent", - mode: context.parser.mode, - label: context.funcName, - isStretchy: isStretchy, - base: base - }; - }, - mathmlBuilder: mathmlBuilder$a -}); - -// Text-mode accents -defineFunction({ - type: "accent", - names: ["\\'", "\\`", "\\^", "\\~", "\\=", "\\c", "\\u", "\\.", '\\"', "\\r", "\\H", "\\v"], - props: { - numArgs: 1, - allowedInText: true, - allowedInMath: true, - argTypes: ["primitive"] - }, - handler: (context, args) => { - const base = normalizeArgument(args[0]); - const mode = context.parser.mode; - - if (mode === "math" && context.parser.settings.strict) { - // LaTeX only writes a warning. It doesn't stop. We'll issue the same warning. - // eslint-disable-next-line no-console - console.log(`Temml parse error: Command ${context.funcName} is invalid in math mode.`); - } - - return { - type: "accent", - mode: mode, - label: context.funcName, - isStretchy: false, - base: base - }; - }, - mathmlBuilder: mathmlBuilder$a -}); - -defineFunction({ - type: "accentUnder", - names: [ - "\\underleftarrow", - "\\underrightarrow", - "\\underleftrightarrow", - "\\undergroup", - "\\underparen", - "\\utilde" - ], - props: { - numArgs: 1 - }, - handler: ({ parser, funcName }, args) => { - const base = args[0]; - return { - type: "accentUnder", - mode: parser.mode, - label: funcName, - base: base - }; - }, - mathmlBuilder: (group, style) => { - const accentNode = stretchy.accentNode(group); - accentNode.style["math-depth"] = 0; - const node = new mathMLTree.MathNode("munder", [ - buildGroup$1(group.base, style), - accentNode - ]); - return node; - } -}); - -/** - * This file does conversion between units. In particular, it provides - * calculateSize to convert other units into CSS units. - */ - -const ptPerUnit = { - // Convert to CSS (Postscipt) points, not TeX points - // https://en.wikibooks.org/wiki/LaTeX/Lengths and - // https://tex.stackexchange.com/a/8263 - pt: 800 / 803, // convert TeX point to CSS (Postscript) point - pc: (12 * 800) / 803, // pica - dd: ((1238 / 1157) * 800) / 803, // didot - cc: ((14856 / 1157) * 800) / 803, // cicero (12 didot) - nd: ((685 / 642) * 800) / 803, // new didot - nc: ((1370 / 107) * 800) / 803, // new cicero (12 new didot) - sp: ((1 / 65536) * 800) / 803, // scaled point (TeX's internal smallest unit) - mm: (25.4 / 72), - cm: (2.54 / 72), - in: (1 / 72), - px: (96 / 72) -}; - -/** - * Determine whether the specified unit (either a string defining the unit - * or a "size" parse node containing a unit field) is valid. - */ -const validUnits = [ - "em", - "ex", - "mu", - "pt", - "mm", - "cm", - "in", - "px", - "bp", - "pc", - "dd", - "cc", - "nd", - "nc", - "sp" -]; - -const validUnit = function(unit) { - if (typeof unit !== "string") { - unit = unit.unit; - } - return validUnits.indexOf(unit) > -1 -}; - -const emScale = styleLevel => { - const scriptLevel = Math.max(styleLevel - 1, 0); - return [1, 0.7, 0.5][scriptLevel] -}; - -/* - * Convert a "size" parse node (with numeric "number" and string "unit" fields, - * as parsed by functions.js argType "size") into a CSS value. - */ -const calculateSize = function(sizeValue, style) { - let number = sizeValue.number; - if (style.maxSize[0] < 0 && number > 0) { - return { number: 0, unit: "em" } - } - const unit = sizeValue.unit; - switch (unit) { - case "mm": - case "cm": - case "in": - case "px": { - const numInCssPts = number * ptPerUnit[unit]; - if (numInCssPts > style.maxSize[1]) { - return { number: style.maxSize[1], unit: "pt" } - } - return { number, unit }; // absolute CSS units. - } - case "em": - case "ex": { - // In TeX, em and ex do not change size in \scriptstyle. - if (unit === "ex") { number *= 0.431; } - number = Math.min(number / emScale(style.level), style.maxSize[0]); - return { number: utils.round(number), unit: "em" }; - } - case "bp": { - if (number > style.maxSize[1]) { number = style.maxSize[1]; } - return { number, unit: "pt" }; // TeX bp is a CSS pt. (1/72 inch). - } - case "pt": - case "pc": - case "dd": - case "cc": - case "nd": - case "nc": - case "sp": { - number = Math.min(number * ptPerUnit[unit], style.maxSize[1]); - return { number: utils.round(number), unit: "pt" } - } - case "mu": { - number = Math.min(number / 18, style.maxSize[0]); - return { number: utils.round(number), unit: "em" } - } - default: - throw new ParseError("Invalid unit: '" + unit + "'") - } -}; - -// Helper functions - -const padding$2 = width => { - const node = new mathMLTree.MathNode("mspace"); - node.setAttribute("width", width + "em"); - return node -}; - -const paddedNode = (group, lspace = 0.3, rspace = 0) => { - if (group == null && rspace === 0) { return padding$2(lspace) } - const row = group ? [group] : []; - if (lspace !== 0) { row.unshift(padding$2(lspace)); } - if (rspace > 0) { row.push(padding$2(rspace)); } - return new mathMLTree.MathNode("mrow", row) -}; - -const labelSize = (size, scriptLevel) => Number(size) / emScale(scriptLevel); - -const munderoverNode = (fName, body, below, style) => { - const arrowNode = stretchy.mathMLnode(fName); - // Is this the short part of a mhchem equilibrium arrow? - const isEq = fName.slice(1, 3) === "eq"; - const minWidth = fName.charAt(1) === "x" - ? "1.75" // mathtools extensible arrows are ≥ 1.75em long - : fName.slice(2, 4) === "cd" - ? "3.0" // cd package arrows - : isEq - ? "1.0" // The shorter harpoon of a mhchem equilibrium arrow - : "2.0"; // other mhchem arrows - // TODO: When Firefox supports minsize, use the next line. - //arrowNode.setAttribute("minsize", String(minWidth) + "em") - arrowNode.setAttribute("lspace", "0"); - arrowNode.setAttribute("rspace", (isEq ? "0.5em" : "0")); - - // upper and lower labels are set to scriptlevel by MathML - // So we have to adjust our label dimensions accordingly. - const labelStyle = style.withLevel(style.level < 2 ? 2 : 3); - const minArrowWidth = labelSize(minWidth, labelStyle.level); - // The dummyNode will be inside a inside a - // So it will be at scriptlevel 3 - const dummyWidth = labelSize(minWidth, 3); - const emptyLabel = paddedNode(null, minArrowWidth.toFixed(4), 0); - const dummyNode = paddedNode(null, dummyWidth.toFixed(4), 0); - // The arrow is a little longer than the label. Set a spacer length. - const space = labelSize((isEq ? 0 : 0.3), labelStyle.level).toFixed(4); - let upperNode; - let lowerNode; - - const gotUpper = (body && body.body && - // \hphantom visible content - (body.body.body || body.body.length > 0)); - if (gotUpper) { - let label = buildGroup$1(body, labelStyle); - label = paddedNode(label, space, space); - // Since Firefox does not support minsize, stack a invisible node - // on top of the label. Its width will serve as a min-width. - // TODO: Refactor this after Firefox supports minsize. - upperNode = new mathMLTree.MathNode("mover", [label, dummyNode]); - } - const gotLower = (below && below.body && - (below.body.body || below.body.length > 0)); - if (gotLower) { - let label = buildGroup$1(below, labelStyle); - label = paddedNode(label, space, space); - lowerNode = new mathMLTree.MathNode("munder", [label, dummyNode]); - } - - let node; - if (!gotUpper && !gotLower) { - node = new mathMLTree.MathNode("mover", [arrowNode, emptyLabel]); - } else if (gotUpper && gotLower) { - node = new mathMLTree.MathNode("munderover", [arrowNode, lowerNode, upperNode]); - } else if (gotUpper) { - node = new mathMLTree.MathNode("mover", [arrowNode, upperNode]); - } else { - node = new mathMLTree.MathNode("munder", [arrowNode, lowerNode]); - } - if (minWidth === "3.0") { node.style.height = "1em"; } // CD environment - node.setAttribute("accent", "false"); // Necessary for MS Word - return node -}; - -// Stretchy arrows with an optional argument -defineFunction({ - type: "xArrow", - names: [ - "\\xleftarrow", - "\\xrightarrow", - "\\xLeftarrow", - "\\xRightarrow", - "\\xleftrightarrow", - "\\xLeftrightarrow", - "\\xhookleftarrow", - "\\xhookrightarrow", - "\\xmapsto", - "\\xrightharpoondown", - "\\xrightharpoonup", - "\\xleftharpoondown", - "\\xleftharpoonup", - "\\xlongequal", - "\\xtwoheadrightarrow", - "\\xtwoheadleftarrow", - // The next 5 functions are here only to support mhchem - "\\yields", - "\\yieldsLeft", - "\\mesomerism", - "\\longrightharpoonup", - "\\longleftharpoondown", - // The next 3 functions are here only to support the {CD} environment. - "\\\\cdrightarrow", - "\\\\cdleftarrow", - "\\\\cdlongequal" - ], - props: { - numArgs: 1, - numOptionalArgs: 1 - }, - handler({ parser, funcName }, args, optArgs) { - return { - type: "xArrow", - mode: parser.mode, - name: funcName, - body: args[0], - below: optArgs[0] - }; - }, - mathmlBuilder(group, style) { - // Build the arrow and its labels. - const node = munderoverNode(group.name, group.body, group.below, style); - // Create operator spacing for a relation. - const row = [node]; - row.unshift(padding$2(0.2778)); - row.push(padding$2(0.2778)); - return new mathMLTree.MathNode("mrow", row) - } -}); - -const arrowComponent = { - "\\xtofrom": ["\\xrightarrow", "\\xleftarrow"], - "\\xleftrightharpoons": ["\\xleftharpoonup", "\\xrightharpoondown"], - "\\xrightleftharpoons": ["\\xrightharpoonup", "\\xleftharpoondown"], - "\\yieldsLeftRight": ["\\yields", "\\yieldsLeft"], - // The next three all get the same harpoon glyphs. Only the lengths and paddings differ. - "\\equilibrium": ["\\longrightharpoonup", "\\longleftharpoondown"], - "\\equilibriumRight": ["\\longrightharpoonup", "\\eqleftharpoondown"], - "\\equilibriumLeft": ["\\eqrightharpoonup", "\\longleftharpoondown"] -}; - -// Browsers are not good at stretching a glyph that contains a pair of stacked arrows such as ⇄. -// So we stack a pair of single arrows. -defineFunction({ - type: "stackedArrow", - names: [ - "\\xtofrom", // expfeil - "\\xleftrightharpoons", // mathtools - "\\xrightleftharpoons", // mathtools - "\\yieldsLeftRight", // mhchem - "\\equilibrium", // mhchem - "\\equilibriumRight", - "\\equilibriumLeft" - ], - props: { - numArgs: 1, - numOptionalArgs: 1 - }, - handler({ parser, funcName }, args, optArgs) { - const lowerArrowBody = args[0] - ? { - type: "hphantom", - mode: parser.mode, - body: args[0] - } - : null; - const upperArrowBelow = optArgs[0] - ? { - type: "hphantom", - mode: parser.mode, - body: optArgs[0] - } - : null; - return { - type: "stackedArrow", - mode: parser.mode, - name: funcName, - body: args[0], - upperArrowBelow, - lowerArrowBody, - below: optArgs[0] - }; - }, - mathmlBuilder(group, style) { - const topLabel = arrowComponent[group.name][0]; - const botLabel = arrowComponent[group.name][1]; - const topArrow = munderoverNode(topLabel, group.body, group.upperArrowBelow, style); - const botArrow = munderoverNode(botLabel, group.lowerArrowBody, group.below, style); - let wrapper; - - const raiseNode = new mathMLTree.MathNode("mpadded", [topArrow]); - raiseNode.setAttribute("voffset", "0.3em"); - raiseNode.setAttribute("height", "+0.3em"); - raiseNode.setAttribute("depth", "-0.3em"); - // One of the arrows is given ~zero width. so the other has the same horzontal alignment. - if (group.name === "\\equilibriumLeft") { - const botNode = new mathMLTree.MathNode("mpadded", [botArrow]); - botNode.setAttribute("width", "0.5em"); - wrapper = new mathMLTree.MathNode( - "mpadded", - [padding$2(0.2778), botNode, raiseNode, padding$2(0.2778)] - ); - } else { - raiseNode.setAttribute("width", (group.name === "\\equilibriumRight" ? "0.5em" : "0")); - wrapper = new mathMLTree.MathNode( - "mpadded", - [padding$2(0.2778), raiseNode, botArrow, padding$2(0.2778)] - ); - } - - wrapper.setAttribute("voffset", "-0.18em"); - wrapper.setAttribute("height", "-0.18em"); - wrapper.setAttribute("depth", "+0.18em"); - return wrapper - } -}); - -/** - * Asserts that the node is of the given type and returns it with stricter - * typing. Throws if the node's type does not match. - */ -function assertNodeType(node, type) { - if (!node || node.type !== type) { - throw new Error( - `Expected node of type ${type}, but got ` + - (node ? `node of type ${node.type}` : String(node)) - ); - } - return node; -} - -/** - * Returns the node more strictly typed iff it is of the given type. Otherwise, - * returns null. - */ -function assertSymbolNodeType(node) { - const typedNode = checkSymbolNodeType(node); - if (!typedNode) { - throw new Error( - `Expected node of symbol group type, but got ` + - (node ? `node of type ${node.type}` : String(node)) - ); - } - return typedNode; -} - -/** - * Returns the node more strictly typed iff it is of the given type. Otherwise, - * returns null. - */ -function checkSymbolNodeType(node) { - if (node && (node.type === "atom" || - Object.prototype.hasOwnProperty.call(NON_ATOMS, node.type))) { - return node; - } - return null; -} - -const cdArrowFunctionName = { - ">": "\\\\cdrightarrow", - "<": "\\\\cdleftarrow", - "=": "\\\\cdlongequal", - A: "\\uparrow", - V: "\\downarrow", - "|": "\\Vert", - ".": "no arrow" -}; - -const newCell = () => { - // Create an empty cell, to be filled below with parse nodes. - return { type: "styling", body: [], mode: "math", scriptLevel: "display" }; -}; - -const isStartOfArrow = (node) => { - return node.type === "textord" && node.text === "@"; -}; - -const isLabelEnd = (node, endChar) => { - return (node.type === "mathord" || node.type === "atom") && node.text === endChar; -}; - -function cdArrow(arrowChar, labels, parser) { - // Return a parse tree of an arrow and its labels. - // This acts in a way similar to a macro expansion. - const funcName = cdArrowFunctionName[arrowChar]; - switch (funcName) { - case "\\\\cdrightarrow": - case "\\\\cdleftarrow": - return parser.callFunction(funcName, [labels[0]], [labels[1]]); - case "\\uparrow": - case "\\downarrow": { - const leftLabel = parser.callFunction("\\\\cdleft", [labels[0]], []); - const bareArrow = { - type: "atom", - text: funcName, - mode: "math", - family: "rel" - }; - const sizedArrow = parser.callFunction("\\Big", [bareArrow], []); - const rightLabel = parser.callFunction("\\\\cdright", [labels[1]], []); - const arrowGroup = { - type: "ordgroup", - mode: "math", - body: [leftLabel, sizedArrow, rightLabel], - semisimple: true - }; - return parser.callFunction("\\\\cdparent", [arrowGroup], []); - } - case "\\\\cdlongequal": - return parser.callFunction("\\\\cdlongequal", [], []); - case "\\Vert": { - const arrow = { type: "textord", text: "\\Vert", mode: "math" }; - return parser.callFunction("\\Big", [arrow], []); - } - default: - return { type: "textord", text: " ", mode: "math" }; - } -} - -function parseCD(parser) { - // Get the array's parse nodes with \\ temporarily mapped to \cr. - const parsedRows = []; - parser.gullet.beginGroup(); - parser.gullet.macros.set("\\cr", "\\\\\\relax"); - parser.gullet.beginGroup(); - while (true) { // eslint-disable-line no-constant-condition - // Get the parse nodes for the next row. - parsedRows.push(parser.parseExpression(false, "\\\\")); - parser.gullet.endGroup(); - parser.gullet.beginGroup(); - const next = parser.fetch().text; - if (next === "&" || next === "\\\\") { - parser.consume(); - } else if (next === "\\end") { - if (parsedRows[parsedRows.length - 1].length === 0) { - parsedRows.pop(); // final row ended in \\ - } - break; - } else { - throw new ParseError("Expected \\\\ or \\cr or \\end", parser.nextToken); - } - } - - let row = []; - const body = [row]; - - // Loop thru the parse nodes. Collect them into cells and arrows. - for (let i = 0; i < parsedRows.length; i++) { - // Start a new row. - const rowNodes = parsedRows[i]; - // Create the first cell. - let cell = newCell(); - - for (let j = 0; j < rowNodes.length; j++) { - if (!isStartOfArrow(rowNodes[j])) { - // If a parseNode is not an arrow, it goes into a cell. - cell.body.push(rowNodes[j]); - } else { - // Parse node j is an "@", the start of an arrow. - // Before starting on the arrow, push the cell into `row`. - row.push(cell); - - // Now collect parseNodes into an arrow. - // The character after "@" defines the arrow type. - j += 1; - const arrowChar = assertSymbolNodeType(rowNodes[j]).text; - - // Create two empty label nodes. We may or may not use them. - const labels = new Array(2); - labels[0] = { type: "ordgroup", mode: "math", body: [] }; - labels[1] = { type: "ordgroup", mode: "math", body: [] }; - - // Process the arrow. - if ("=|.".indexOf(arrowChar) > -1) ; else if ("<>AV".indexOf(arrowChar) > -1) { - // Four arrows, `@>>>`, `@<<<`, `@AAA`, and `@VVV`, each take - // two optional labels. E.g. the right-point arrow syntax is - // really: @>{optional label}>{optional label}> - // Collect parseNodes into labels. - for (let labelNum = 0; labelNum < 2; labelNum++) { - let inLabel = true; - for (let k = j + 1; k < rowNodes.length; k++) { - if (isLabelEnd(rowNodes[k], arrowChar)) { - inLabel = false; - j = k; - break; - } - if (isStartOfArrow(rowNodes[k])) { - throw new ParseError( - "Missing a " + arrowChar + " character to complete a CD arrow.", - rowNodes[k] - ); - } - - labels[labelNum].body.push(rowNodes[k]); - } - if (inLabel) { - // isLabelEnd never returned a true. - throw new ParseError( - "Missing a " + arrowChar + " character to complete a CD arrow.", - rowNodes[j] - ); - } - } - } else { - throw new ParseError(`Expected one of "<>AV=|." after @.`); - } - - // Now join the arrow to its labels. - const arrow = cdArrow(arrowChar, labels, parser); - - // Wrap the arrow in a styling node - row.push(arrow); - // In CD's syntax, cells are implicit. That is, everything that - // is not an arrow gets collected into a cell. So create an empty - // cell now. It will collect upcoming parseNodes. - cell = newCell(); - } - } - if (i % 2 === 0) { - // Even-numbered rows consist of: cell, arrow, cell, arrow, ... cell - // The last cell is not yet pushed into `row`, so: - row.push(cell); - } else { - // Odd-numbered rows consist of: vert arrow, empty cell, ... vert arrow - // Remove the empty cell that was placed at the beginning of `row`. - row.shift(); - } - row = []; - body.push(row); - } - body.pop(); - - // End row group - parser.gullet.endGroup(); - // End array group defining \\ - parser.gullet.endGroup(); - - return { - type: "array", - mode: "math", - body, - envClasses: ["jot", "cd"], - cols: [], - hLinesBeforeRow: new Array(body.length + 1).fill([]) - }; -} - -// The functions below are not available for general use. -// They are here only for internal use by the {CD} environment in placing labels -// next to vertical arrows. - -// We don't need any such functions for horizontal arrows because we can reuse -// the functionality that already exists for extensible arrows. - -defineFunction({ - type: "cdlabel", - names: ["\\\\cdleft", "\\\\cdright"], - props: { - numArgs: 1 - }, - handler({ parser, funcName }, args) { - return { - type: "cdlabel", - mode: parser.mode, - side: funcName.slice(4), - label: args[0] - }; - }, - mathmlBuilder(group, style) { - let label = new mathMLTree.MathNode("mrow", [buildGroup$1(group.label, style)]); - label = new mathMLTree.MathNode("mpadded", [label]); - label.setAttribute("width", "0"); - if (group.side === "left") { - label.setAttribute("lspace", "-1width"); - } - // We have to guess at vertical alignment. We know the arrow is 1.8em tall, - // But we don't know the height or depth of the label. - label.setAttribute("voffset", "0.7em"); - label = new mathMLTree.MathNode("mstyle", [label]); - label.setAttribute("displaystyle", "false"); - label.setAttribute("scriptlevel", "1"); - return label; - } -}); - -defineFunction({ - type: "cdlabelparent", - names: ["\\\\cdparent"], - props: { - numArgs: 1 - }, - handler({ parser }, args) { - return { - type: "cdlabelparent", - mode: parser.mode, - fragment: args[0] - }; - }, - mathmlBuilder(group, style) { - return new mathMLTree.MathNode("mrow", [buildGroup$1(group.fragment, style)]); - } -}); - -// \@char is an internal function that takes a grouped decimal argument like -// {123} and converts into symbol with code 123. It is used by the *macro* -// \char defined in macros.js. -defineFunction({ - type: "textord", - names: ["\\@char"], - props: { - numArgs: 1, - allowedInText: true - }, - handler({ parser, token }, args) { - const arg = assertNodeType(args[0], "ordgroup"); - const group = arg.body; - let number = ""; - for (let i = 0; i < group.length; i++) { - const node = assertNodeType(group[i], "textord"); - number += node.text; - } - const code = parseInt(number); - if (isNaN(code)) { - throw new ParseError(`\\@char has non-numeric argument ${number}`, token) - } - return { - type: "textord", - mode: parser.mode, - text: String.fromCodePoint(code) - } - } -}); - -// Helpers -const htmlRegEx = /^(#[a-f0-9]{3}|#?[a-f0-9]{6})$/i; -const htmlOrNameRegEx = /^(#[a-f0-9]{3}|#?[a-f0-9]{6}|[a-z]+)$/i; -const RGBregEx = /^ *\d{1,3} *(?:, *\d{1,3} *){2}$/; -const rgbRegEx = /^ *[10](?:\.\d*)? *(?:, *[10](?:\.\d*)? *){2}$/; -const xcolorHtmlRegEx = /^[a-f0-9]{6}$/i; -const toHex = num => { - let str = num.toString(16); - if (str.length === 1) { str = "0" + str; } - return str -}; - -// Colors from Tables 4.1 and 4.2 of the xcolor package. -// Table 4.1 (lower case) RGB values are taken from chroma and xcolor.dtx. -// Table 4.2 (Capitalizzed) values were sampled, because Chroma contains a unreliable -// conversion from cmyk to RGB. See https://tex.stackexchange.com/a/537274. -const xcolors = JSON.parse(`{ - "Apricot": "#ffb484", - "Aquamarine": "#08b4bc", - "Bittersweet": "#c84c14", - "blue": "#0000FF", - "Blue": "#303494", - "BlueGreen": "#08b4bc", - "BlueViolet": "#503c94", - "BrickRed": "#b8341c", - "brown": "#BF8040", - "Brown": "#802404", - "BurntOrange": "#f8941c", - "CadetBlue": "#78749c", - "CarnationPink": "#f884b4", - "Cerulean": "#08a4e4", - "CornflowerBlue": "#40ace4", - "cyan": "#00FFFF", - "Cyan": "#08acec", - "Dandelion": "#ffbc44", - "darkgray": "#404040", - "DarkOrchid": "#a8548c", - "Emerald": "#08ac9c", - "ForestGreen": "#089c54", - "Fuchsia": "#90348c", - "Goldenrod": "#ffdc44", - "gray": "#808080", - "Gray": "#98949c", - "green": "#00FF00", - "Green": "#08a44c", - "GreenYellow": "#e0e474", - "JungleGreen": "#08ac9c", - "Lavender": "#f89cc4", - "lightgray": "#c0c0c0", - "lime": "#BFFF00", - "LimeGreen": "#90c43c", - "magenta": "#FF00FF", - "Magenta": "#f0048c", - "Mahogany": "#b0341c", - "Maroon": "#b03434", - "Melon": "#f89c7c", - "MidnightBlue": "#086494", - "Mulberry": "#b03c94", - "NavyBlue": "#086cbc", - "olive": "#7F7F00", - "OliveGreen": "#407c34", - "orange": "#FF8000", - "Orange": "#f8843c", - "OrangeRed": "#f0145c", - "Orchid": "#b074ac", - "Peach": "#f8945c", - "Periwinkle": "#8074bc", - "PineGreen": "#088c74", - "pink": "#ff7f7f", - "Plum": "#98248c", - "ProcessBlue": "#08b4ec", - "purple": "#BF0040", - "Purple": "#a0449c", - "RawSienna": "#983c04", - "red": "#ff0000", - "Red": "#f01c24", - "RedOrange": "#f86434", - "RedViolet": "#a0246c", - "Rhodamine": "#f0549c", - "Royallue": "#0874bc", - "RoyalPurple": "#683c9c", - "RubineRed": "#f0047c", - "Salmon": "#f8948c", - "SeaGreen": "#30bc9c", - "Sepia": "#701404", - "SkyBlue": "#48c4dc", - "SpringGreen": "#c8dc64", - "Tan": "#e09c74", - "teal": "#007F7F", - "TealBlue": "#08acb4", - "Thistle": "#d884b4", - "Turquoise": "#08b4cc", - "violet": "#800080", - "Violet": "#60449c", - "VioletRed": "#f054a4", - "WildStrawberry": "#f0246c", - "yellow": "#FFFF00", - "Yellow": "#fff404", - "YellowGreen": "#98cc6c", - "YellowOrange": "#ffa41c" -}`); - -const colorFromSpec = (model, spec) => { - let color = ""; - if (model === "HTML") { - if (!htmlRegEx.test(spec)) { - throw new ParseError("Invalid HTML input.") - } - color = spec; - } else if (model === "RGB") { - if (!RGBregEx.test(spec)) { - throw new ParseError("Invalid RGB input.") - } - spec.split(",").map(e => { color += toHex(Number(e.trim())); }); - } else { - if (!rgbRegEx.test(spec)) { - throw new ParseError("Invalid rbg input.") - } - spec.split(",").map(e => { - const num = Number(e.trim()); - if (num > 1) { throw new ParseError("Color rgb input must be < 1.") } - color += toHex(Number((num * 255).toFixed(0))); - }); - } - if (color.charAt(0) !== "#") { color = "#" + color; } - return color -}; - -const validateColor = (color, macros, token) => { - const macroName = `\\\\color@${color}`; // from \defineColor. - const match = htmlOrNameRegEx.exec(color); - if (!match) { throw new ParseError("Invalid color: '" + color + "'", token) } - // We allow a 6-digit HTML color spec without a leading "#". - // This follows the xcolor package's HTML color model. - // Predefined color names are all missed by this RegEx pattern. - if (xcolorHtmlRegEx.test(color)) { - return "#" + color - } else if (color.charAt(0) === "#") { - return color - } else if (macros.has(macroName)) { - color = macros.get(macroName).tokens[0].text; - } else if (xcolors[color]) { - color = xcolors[color]; - } - return color -}; - -const mathmlBuilder$9 = (group, style) => { - // In LaTeX, color is not supposed to change the spacing of any node. - // So instead of wrapping the group in an , we apply - // the color individually to each node and return a document fragment. - let expr = buildExpression(group.body, style.withColor(group.color)); - expr = expr.map(e => { - e.style.color = group.color; - return e - }); - return mathMLTree.newDocumentFragment(expr) -}; - -defineFunction({ - type: "color", - names: ["\\textcolor"], - props: { - numArgs: 2, - numOptionalArgs: 1, - allowedInText: true, - argTypes: ["raw", "raw", "original"] - }, - handler({ parser, token }, args, optArgs) { - const model = optArgs[0] && assertNodeType(optArgs[0], "raw").string; - let color = ""; - if (model) { - const spec = assertNodeType(args[0], "raw").string; - color = colorFromSpec(model, spec); - } else { - color = validateColor(assertNodeType(args[0], "raw").string, parser.gullet.macros, token); - } - const body = args[1]; - return { - type: "color", - mode: parser.mode, - color, - body: ordargument(body) - } - }, - mathmlBuilder: mathmlBuilder$9 -}); - -defineFunction({ - type: "color", - names: ["\\color"], - props: { - numArgs: 1, - numOptionalArgs: 1, - allowedInText: true, - argTypes: ["raw", "raw"] - }, - handler({ parser, breakOnTokenText, token }, args, optArgs) { - const model = optArgs[0] && assertNodeType(optArgs[0], "raw").string; - let color = ""; - if (model) { - const spec = assertNodeType(args[0], "raw").string; - color = colorFromSpec(model, spec); - } else { - color = validateColor(assertNodeType(args[0], "raw").string, parser.gullet.macros, token); - } - - // Parse out the implicit body that should be colored. - const body = parser.parseExpression(true, breakOnTokenText, true); - - return { - type: "color", - mode: parser.mode, - color, - body - } - }, - mathmlBuilder: mathmlBuilder$9 -}); - -defineFunction({ - type: "color", - names: ["\\definecolor"], - props: { - numArgs: 3, - allowedInText: true, - argTypes: ["raw", "raw", "raw"] - }, - handler({ parser, funcName, token }, args) { - const name = assertNodeType(args[0], "raw").string; - if (!/^[A-Za-z]+$/.test(name)) { - throw new ParseError("Color name must be latin letters.", token) - } - const model = assertNodeType(args[1], "raw").string; - if (!["HTML", "RGB", "rgb"].includes(model)) { - throw new ParseError("Color model must be HTML, RGB, or rgb.", token) - } - const spec = assertNodeType(args[2], "raw").string; - const color = colorFromSpec(model, spec); - parser.gullet.macros.set(`\\\\color@${name}`, { tokens: [{ text: color }], numArgs: 0 }); - return { type: "internal", mode: parser.mode } - } - // No mathmlBuilder. The point of \definecolor is to set a macro. -}); - -// Row breaks within tabular environments, and line breaks at top level - -// \DeclareRobustCommand\\{...\@xnewline} -defineFunction({ - type: "cr", - names: ["\\\\"], - props: { - numArgs: 0, - numOptionalArgs: 0, - allowedInText: true - }, - - handler({ parser }, args, optArgs) { - const size = parser.gullet.future().text === "[" ? parser.parseSizeGroup(true) : null; - const newLine = !parser.settings.displayMode; - return { - type: "cr", - mode: parser.mode, - newLine, - size: size && assertNodeType(size, "size").value - } - }, - - // The following builder is called only at the top level, - // not within tabular/array environments. - - mathmlBuilder(group, style) { - // MathML 3.0 calls for newline to occur in an or an . - // Ref: https://www.w3.org/TR/MathML3/chapter3.html#presm.linebreaking - const node = new mathMLTree.MathNode("mo"); - if (group.newLine) { - node.setAttribute("linebreak", "newline"); - if (group.size) { - const size = calculateSize(group.size, style); - node.setAttribute("height", size.number + size.unit); - } - } - return node - } -}); - -const globalMap = { - "\\global": "\\global", - "\\long": "\\\\globallong", - "\\\\globallong": "\\\\globallong", - "\\def": "\\gdef", - "\\gdef": "\\gdef", - "\\edef": "\\xdef", - "\\xdef": "\\xdef", - "\\let": "\\\\globallet", - "\\futurelet": "\\\\globalfuture" -}; - -const checkControlSequence = (tok) => { - const name = tok.text; - if (/^(?:[\\{}$&#^_]|EOF)$/.test(name)) { - throw new ParseError("Expected a control sequence", tok); - } - return name; -}; - -const getRHS = (parser) => { - let tok = parser.gullet.popToken(); - if (tok.text === "=") { - // consume optional equals - tok = parser.gullet.popToken(); - if (tok.text === " ") { - // consume one optional space - tok = parser.gullet.popToken(); - } - } - return tok; -}; - -const letCommand = (parser, name, tok, global) => { - let macro = parser.gullet.macros.get(tok.text); - if (macro == null) { - // don't expand it later even if a macro with the same name is defined - // e.g., \let\foo=\frac \def\frac{\relax} \frac12 - tok.noexpand = true; - macro = { - tokens: [tok], - numArgs: 0, - // reproduce the same behavior in expansion - unexpandable: !parser.gullet.isExpandable(tok.text) - }; - } - parser.gullet.macros.set(name, macro, global); -}; - -// -> | -// -> |\global -// -> | -// -> \global|\long|\outer -defineFunction({ - type: "internal", - names: [ - "\\global", - "\\long", - "\\\\globallong" // can’t be entered directly - ], - props: { - numArgs: 0, - allowedInText: true - }, - handler({ parser, funcName }) { - parser.consumeSpaces(); - const token = parser.fetch(); - if (globalMap[token.text]) { - // Temml doesn't have \par, so ignore \long - if (funcName === "\\global" || funcName === "\\\\globallong") { - token.text = globalMap[token.text]; - } - return assertNodeType(parser.parseFunction(), "internal"); - } - throw new ParseError(`Invalid token after macro prefix`, token); - } -}); - -// Basic support for macro definitions: \def, \gdef, \edef, \xdef -// -> -// -> \def|\gdef|\edef|\xdef -// -> -defineFunction({ - type: "internal", - names: ["\\def", "\\gdef", "\\edef", "\\xdef"], - props: { - numArgs: 0, - allowedInText: true, - primitive: true - }, - handler({ parser, funcName }) { - let tok = parser.gullet.popToken(); - const name = tok.text; - if (/^(?:[\\{}$&#^_]|EOF)$/.test(name)) { - throw new ParseError("Expected a control sequence", tok); - } - - let numArgs = 0; - let insert; - const delimiters = [[]]; - // contains no braces - while (parser.gullet.future().text !== "{") { - tok = parser.gullet.popToken(); - if (tok.text === "#") { - // If the very last character of the is #, so that - // this # is immediately followed by {, TeX will behave as if the { - // had been inserted at the right end of both the parameter text - // and the replacement text. - if (parser.gullet.future().text === "{") { - insert = parser.gullet.future(); - delimiters[numArgs].push("{"); - break; - } - - // A parameter, the first appearance of # must be followed by 1, - // the next by 2, and so on; up to nine #’s are allowed - tok = parser.gullet.popToken(); - if (!/^[1-9]$/.test(tok.text)) { - throw new ParseError(`Invalid argument number "${tok.text}"`); - } - if (parseInt(tok.text) !== numArgs + 1) { - throw new ParseError(`Argument number "${tok.text}" out of order`); - } - numArgs++; - delimiters.push([]); - } else if (tok.text === "EOF") { - throw new ParseError("Expected a macro definition"); - } else { - delimiters[numArgs].push(tok.text); - } - } - // replacement text, enclosed in '{' and '}' and properly nested - let { tokens } = parser.gullet.consumeArg(); - if (insert) { - tokens.unshift(insert); - } - - if (funcName === "\\edef" || funcName === "\\xdef") { - tokens = parser.gullet.expandTokens(tokens); - if (tokens.length > parser.gullet.settings.maxExpand) { - throw new ParseError("Too many expansions in an " + funcName); - } - tokens.reverse(); // to fit in with stack order - } - // Final arg is the expansion of the macro - parser.gullet.macros.set( - name, - { tokens, numArgs, delimiters }, - funcName === globalMap[funcName] - ); - return { type: "internal", mode: parser.mode }; - } -}); - -// -> -// -> \futurelet -// | \let -// -> |= -defineFunction({ - type: "internal", - names: [ - "\\let", - "\\\\globallet" // can’t be entered directly - ], - props: { - numArgs: 0, - allowedInText: true, - primitive: true - }, - handler({ parser, funcName }) { - const name = checkControlSequence(parser.gullet.popToken()); - parser.gullet.consumeSpaces(); - const tok = getRHS(parser); - letCommand(parser, name, tok, funcName === "\\\\globallet"); - return { type: "internal", mode: parser.mode }; - } -}); - -// ref: https://www.tug.org/TUGboat/tb09-3/tb22bechtolsheim.pdf -defineFunction({ - type: "internal", - names: [ - "\\futurelet", - "\\\\globalfuture" // can’t be entered directly - ], - props: { - numArgs: 0, - allowedInText: true, - primitive: true - }, - handler({ parser, funcName }) { - const name = checkControlSequence(parser.gullet.popToken()); - const middle = parser.gullet.popToken(); - const tok = parser.gullet.popToken(); - letCommand(parser, name, tok, funcName === "\\\\globalfuture"); - parser.gullet.pushToken(tok); - parser.gullet.pushToken(middle); - return { type: "internal", mode: parser.mode }; - } -}); - -defineFunction({ - type: "internal", - names: ["\\newcommand", "\\renewcommand", "\\providecommand"], - props: { - numArgs: 0, - allowedInText: true, - primitive: true - }, - handler({ parser, funcName }) { - let name = ""; - const tok = parser.gullet.popToken(); - if (tok.text === "{") { - name = checkControlSequence(parser.gullet.popToken()); - parser.gullet.popToken(); - } else { - name = checkControlSequence(tok); - } - - const exists = parser.gullet.isDefined(name); - if (exists && funcName === "\\newcommand") { - throw new ParseError( - `\\newcommand{${name}} attempting to redefine ${name}; use \\renewcommand` - ); - } - if (!exists && funcName === "\\renewcommand") { - throw new ParseError( - `\\renewcommand{${name}} when command ${name} does not yet exist; use \\newcommand` - ); - } - - let numArgs = 0; - if (parser.gullet.future().text === "[") { - let tok = parser.gullet.popToken(); - tok = parser.gullet.popToken(); - if (!/^[0-9]$/.test(tok.text)) { - throw new ParseError(`Invalid number of arguments: "${tok.text}"`); - } - numArgs = parseInt(tok.text); - tok = parser.gullet.popToken(); - if (tok.text !== "]") { - throw new ParseError(`Invalid argument "${tok.text}"`); - } - } - - // replacement text, enclosed in '{' and '}' and properly nested - const { tokens } = parser.gullet.consumeArg(); - - parser.gullet.macros.set( - name, - { tokens, numArgs }, - !parser.settings.strict - ); - - return { type: "internal", mode: parser.mode }; - - } -}); - -// Extra data needed for the delimiter handler down below -const delimiterSizes = { - "\\bigl": { mclass: "mopen", size: 1 }, - "\\Bigl": { mclass: "mopen", size: 2 }, - "\\biggl": { mclass: "mopen", size: 3 }, - "\\Biggl": { mclass: "mopen", size: 4 }, - "\\bigr": { mclass: "mclose", size: 1 }, - "\\Bigr": { mclass: "mclose", size: 2 }, - "\\biggr": { mclass: "mclose", size: 3 }, - "\\Biggr": { mclass: "mclose", size: 4 }, - "\\bigm": { mclass: "mrel", size: 1 }, - "\\Bigm": { mclass: "mrel", size: 2 }, - "\\biggm": { mclass: "mrel", size: 3 }, - "\\Biggm": { mclass: "mrel", size: 4 }, - "\\big": { mclass: "mord", size: 1 }, - "\\Big": { mclass: "mord", size: 2 }, - "\\bigg": { mclass: "mord", size: 3 }, - "\\Bigg": { mclass: "mord", size: 4 } -}; - -const delimiters = [ - "(", - "\\lparen", - ")", - "\\rparen", - "[", - "\\lbrack", - "]", - "\\rbrack", - "\\{", - "\\lbrace", - "\\}", - "\\rbrace", - "⦇", - "\\llparenthesis", - "⦈", - "\\rrparenthesis", - "\\lfloor", - "\\rfloor", - "\u230a", - "\u230b", - "\\lceil", - "\\rceil", - "\u2308", - "\u2309", - "<", - ">", - "\\langle", - "\u27e8", - "\\rangle", - "\u27e9", - "\\lAngle", - "\u27ea", - "\\rAngle", - "\u27eb", - "\\llangle", - "⦉", - "\\rrangle", - "⦊", - "\\lt", - "\\gt", - "\\lvert", - "\\rvert", - "\\lVert", - "\\rVert", - "\\lgroup", - "\\rgroup", - "\u27ee", - "\u27ef", - "\\lmoustache", - "\\rmoustache", - "\u23b0", - "\u23b1", - "\\llbracket", - "\\rrbracket", - "\u27e6", - "\u27e6", - "\\lBrace", - "\\rBrace", - "\u2983", - "\u2984", - "/", - "\\backslash", - "|", - "\\vert", - "\\|", - "\\Vert", - "\\uparrow", - "\\Uparrow", - "\\downarrow", - "\\Downarrow", - "\\updownarrow", - "\\Updownarrow", - "." -]; - -// Export isDelimiter for benefit of parser. -const dels = ["}", "\\left", "\\middle", "\\right"]; -const isDelimiter = str => str.length > 0 && - (delimiters.includes(str) || delimiterSizes[str] || dels.includes(str)); - -// Metrics of the different sizes. Found by looking at TeX's output of -// $\bigl| // \Bigl| \biggl| \Biggl| \showlists$ -// Used to create stacked delimiters of appropriate sizes in makeSizedDelim. -const sizeToMaxHeight = [0, 1.2, 1.8, 2.4, 3.0]; - -// Delimiter functions -function checkDelimiter(delim, context) { - const symDelim = checkSymbolNodeType(delim); - if (symDelim && delimiters.includes(symDelim.text)) { - // If a character is not in the MathML operator dictionary, it will not stretch. - // Replace such characters w/characters that will stretch. - if (["/", "\u2044"].includes(symDelim.text)) { symDelim.text = "\u2215"; } - if (["<", "\\lt"].includes(symDelim.text)) { symDelim.text = "⟨"; } - if ([">", "\\gt"].includes(symDelim.text)) { symDelim.text = "⟩"; } - if (symDelim.text === "\\backslash") { symDelim.text = "\u2216"; } - return symDelim; - } else if (symDelim) { - throw new ParseError(`Invalid delimiter '${symDelim.text}' after '${context.funcName}'`, delim); - } else { - throw new ParseError(`Invalid delimiter type '${delim.type}'`, delim); - } -} - -defineFunction({ - type: "delimsizing", - names: [ - "\\bigl", - "\\Bigl", - "\\biggl", - "\\Biggl", - "\\bigr", - "\\Bigr", - "\\biggr", - "\\Biggr", - "\\bigm", - "\\Bigm", - "\\biggm", - "\\Biggm", - "\\big", - "\\Big", - "\\bigg", - "\\Bigg" - ], - props: { - numArgs: 1, - argTypes: ["primitive"] - }, - handler: (context, args) => { - const delim = checkDelimiter(args[0], context); - - return { - type: "delimsizing", - mode: context.parser.mode, - size: delimiterSizes[context.funcName].size, - mclass: delimiterSizes[context.funcName].mclass, - delim: delim.text - }; - }, - mathmlBuilder: (group) => { - const children = []; - - if (group.delim === ".") { group.delim = ""; } - children.push(makeText(group.delim, group.mode)); - - const node = new mathMLTree.MathNode("mo", children); - - if (group.mclass === "mopen" || group.mclass === "mclose") { - // Only some of the delimsizing functions act as fences, and they - // return "mopen" or "mclose" mclass. - node.setAttribute("fence", "true"); - } else { - // Explicitly disable fencing if it's not a fence, to override the - // defaults. - node.setAttribute("fence", "false"); - } - if (group.delim === "\u2216" || group.delim === "\\vert" || - group.delim === "|" || group.delim.indexOf("arrow") > -1) { - // We have to explicitly set stretchy to true. - node.setAttribute("stretchy", "true"); - } - node.setAttribute("symmetric", "true"); // Needed for tall arrows in Firefox. - node.setAttribute("minsize", sizeToMaxHeight[group.size] + "em"); - node.setAttribute("maxsize", sizeToMaxHeight[group.size] + "em"); - return node; - } -}); - -function assertParsed(group) { - if (!group.body) { - throw new Error("Bug: The leftright ParseNode wasn't fully parsed."); - } -} - -defineFunction({ - type: "leftright-right", - names: ["\\right"], - props: { - numArgs: 1, - argTypes: ["primitive"] - }, - handler: (context, args) => { - return { - type: "leftright-right", - mode: context.parser.mode, - delim: checkDelimiter(args[0], context).text - }; - } -}); - -defineFunction({ - type: "leftright", - names: ["\\left"], - props: { - numArgs: 1, - argTypes: ["primitive"] - }, - handler: (context, args) => { - const delim = checkDelimiter(args[0], context); - - const parser = context.parser; - // Parse out the implicit body - ++parser.leftrightDepth; - // parseExpression stops before '\\right' or `\\middle` - let body = parser.parseExpression(false, null, true); - let nextToken = parser.fetch(); - while (nextToken.text === "\\middle") { - // `\middle`, from the ε-TeX package, ends one group and starts another group. - // We had to parse this expression with `breakOnMiddle` enabled in order - // to get TeX-compliant parsing of \over. - // But we do not want, at this point, to end on \middle, so continue - // to parse until we fetch a `\right`. - parser.consume(); - const middle = parser.fetch().text; - if (!symbols.math[middle]) { - throw new ParseError(`Invalid delimiter '${middle}' after '\\middle'`); - } - checkDelimiter({ type: "atom", mode: "math", text: middle }, { funcName: "\\middle" }); - body.push({ type: "middle", mode: "math", delim: middle }); - parser.consume(); - body = body.concat(parser.parseExpression(false, null, true)); - nextToken = parser.fetch(); - } - --parser.leftrightDepth; - // Check the next token - parser.expect("\\right", false); - const right = assertNodeType(parser.parseFunction(), "leftright-right"); - return { - type: "leftright", - mode: parser.mode, - body, - left: delim.text, - right: right.delim - }; - }, - mathmlBuilder: (group, style) => { - assertParsed(group); - const inner = buildExpression(group.body, style); - - if (group.left === ".") { group.left = ""; } - const leftNode = new mathMLTree.MathNode("mo", [makeText(group.left, group.mode)]); - leftNode.setAttribute("fence", "true"); - leftNode.setAttribute("form", "prefix"); - if (group.left === "\u2216" || group.left.indexOf("arrow") > -1) { - leftNode.setAttribute("stretchy", "true"); - } - inner.unshift(leftNode); - - if (group.right === ".") { group.right = ""; } - const rightNode = new mathMLTree.MathNode("mo", [makeText(group.right, group.mode)]); - rightNode.setAttribute("fence", "true"); - rightNode.setAttribute("form", "postfix"); - if (group.right === "\u2216" || group.right.indexOf("arrow") > -1) { - rightNode.setAttribute("stretchy", "true"); - } - inner.push(rightNode); - - return makeRow(inner); - } -}); - -defineFunction({ - type: "middle", - names: ["\\middle"], - props: { - numArgs: 1, - argTypes: ["primitive"] - }, - handler: (context, args) => { - const delim = checkDelimiter(args[0], context); - if (!context.parser.leftrightDepth) { - throw new ParseError("\\middle without preceding \\left", delim); - } - - return { - type: "middle", - mode: context.parser.mode, - delim: delim.text - }; - }, - mathmlBuilder: (group, style) => { - const textNode = makeText(group.delim, group.mode); - const middleNode = new mathMLTree.MathNode("mo", [textNode]); - middleNode.setAttribute("fence", "true"); - if (group.delim.indexOf("arrow") > -1) { - middleNode.setAttribute("stretchy", "true"); - } - // The next line is not semantically correct, but - // Chromium fails to stretch if it is not there. - middleNode.setAttribute("form", "prefix"); - // MathML gives 5/18em spacing to each element. - // \middle should get delimiter spacing instead. - middleNode.setAttribute("lspace", "0.05em"); - middleNode.setAttribute("rspace", "0.05em"); - return middleNode; - } -}); - -const padding$1 = _ => { - const node = new mathMLTree.MathNode("mspace"); - node.setAttribute("width", "3pt"); - return node -}; - -const mathmlBuilder$8 = (group, style) => { - let node; - if (group.label.indexOf("colorbox") > -1 || group.label === "\\boxed") { - // MathML core does not support +width attribute in . - // Firefox does not reliably add side padding. - // Insert - node = new mathMLTree.MathNode("mrow", [ - padding$1(), - buildGroup$1(group.body, style), - padding$1() - ]); - } else { - node = new mathMLTree.MathNode("mrow", [buildGroup$1(group.body, style)]); - } - switch (group.label) { - case "\\overline": - node.style.padding = "0.1em 0 0 0"; - node.style.borderTop = "0.065em solid"; - break - case "\\underline": - node.style.padding = "0 0 0.1em 0"; - node.style.borderBottom = "0.065em solid"; - break - case "\\cancel": - // We can't use an inline background-gradient. It does not work client-side. - // So set a class and put the rule in the external CSS file. - node.classes.push("tml-cancel"); - break - case "\\bcancel": - node.classes.push("tml-bcancel"); - break - /* - case "\\longdiv": - node.setAttribute("notation", "longdiv"); - break - case "\\phase": - node.setAttribute("notation", "phasorangle"); - break */ - case "\\angl": - node.style.padding = "0.03889em 0.03889em 0 0.03889em"; - node.style.borderTop = "0.049em solid"; - node.style.borderRight = "0.049em solid"; - node.style.marginRight = "0.03889em"; - break - case "\\sout": - node.style.backgroundImage = 'linear-gradient(black, black)'; - node.style.backgroundRepeat = 'no-repeat'; - node.style.backgroundSize = '100% 1.5px'; - node.style.backgroundPosition = '0 center'; - break - case "\\boxed": - // \newcommand{\boxed}[1]{\fbox{\m@th$\displaystyle#1$}} from amsmath.sty - node.style = { padding: "3pt 0 3pt 0", border: "1px solid" }; - node.setAttribute("scriptlevel", "0"); - node.setAttribute("displaystyle", "true"); - break - case "\\fbox": - node.style = { padding: "3pt", border: "1px solid" }; - break - case "\\fcolorbox": - case "\\colorbox": { - // doesn't have a good notation option for \colorbox. - // So use instead. Set some attributes that come - // included with . - //const fboxsep = 3; // 3 pt from LaTeX source2e - //node.setAttribute("height", `+${2 * fboxsep}pt`) - //node.setAttribute("voffset", `${fboxsep}pt`) - const style = { padding: "3pt 0 3pt 0" }; - - if (group.label === "\\fcolorbox") { - style.border = "0.06em solid " + String(group.borderColor); - } - node.style = style; - break - } - case "\\xcancel": - node.classes.push("tml-xcancel"); - break - } - if (group.backgroundColor) { - node.setAttribute("mathbackground", group.backgroundColor); - } - return node; -}; - -defineFunction({ - type: "enclose", - names: ["\\colorbox"], - props: { - numArgs: 2, - numOptionalArgs: 1, - allowedInText: true, - argTypes: ["raw", "raw", "text"] - }, - handler({ parser, funcName }, args, optArgs) { - const model = optArgs[0] && assertNodeType(optArgs[0], "raw").string; - let color = ""; - if (model) { - const spec = assertNodeType(args[0], "raw").string; - color = colorFromSpec(model, spec); - } else { - color = validateColor(assertNodeType(args[0], "raw").string, parser.gullet.macros); - } - const body = args[1]; - return { - type: "enclose", - mode: parser.mode, - label: funcName, - backgroundColor: color, - body - }; - }, - mathmlBuilder: mathmlBuilder$8 -}); - -defineFunction({ - type: "enclose", - names: ["\\fcolorbox"], - props: { - numArgs: 3, - numOptionalArgs: 1, - allowedInText: true, - argTypes: ["raw", "raw", "raw", "text"] - }, - handler({ parser, funcName }, args, optArgs) { - const model = optArgs[0] && assertNodeType(optArgs[0], "raw").string; - let borderColor = ""; - let backgroundColor; - if (model) { - const borderSpec = assertNodeType(args[0], "raw").string; - const backgroundSpec = assertNodeType(args[0], "raw").string; - borderColor = colorFromSpec(model, borderSpec); - backgroundColor = colorFromSpec(model, backgroundSpec); - } else { - borderColor = validateColor(assertNodeType(args[0], "raw").string, parser.gullet.macros); - backgroundColor = validateColor(assertNodeType(args[1], "raw").string, parser.gullet.macros); - } - const body = args[2]; - return { - type: "enclose", - mode: parser.mode, - label: funcName, - backgroundColor, - borderColor, - body - }; - }, - mathmlBuilder: mathmlBuilder$8 -}); - -defineFunction({ - type: "enclose", - names: ["\\fbox"], - props: { - numArgs: 1, - argTypes: ["hbox"], - allowedInText: true - }, - handler({ parser }, args) { - return { - type: "enclose", - mode: parser.mode, - label: "\\fbox", - body: args[0] - }; - } -}); - -defineFunction({ - type: "enclose", - names: ["\\angl", "\\cancel", "\\bcancel", "\\xcancel", "\\sout", "\\overline", "\\boxed"], - // , "\\phase", "\\longdiv" - props: { - numArgs: 1 - }, - handler({ parser, funcName }, args) { - const body = args[0]; - return { - type: "enclose", - mode: parser.mode, - label: funcName, - body - }; - }, - mathmlBuilder: mathmlBuilder$8 -}); - -defineFunction({ - type: "enclose", - names: ["\\underline"], - props: { - numArgs: 1, - allowedInText: true - }, - handler({ parser, funcName }, args) { - const body = args[0]; - return { - type: "enclose", - mode: parser.mode, - label: funcName, - body - }; - }, - mathmlBuilder: mathmlBuilder$8 -}); - -/** - * All registered environments. - * `environments.js` exports this same dictionary again and makes it public. - * `Parser.js` requires this dictionary via `environments.js`. - */ -const _environments = {}; - -function defineEnvironment({ type, names, props, handler, mathmlBuilder }) { - // Set default values of environments. - const data = { - type, - numArgs: props.numArgs || 0, - allowedInText: false, - numOptionalArgs: 0, - handler - }; - for (let i = 0; i < names.length; ++i) { - _environments[names[i]] = data; - } - if (mathmlBuilder) { - _mathmlGroupBuilders[type] = mathmlBuilder; - } -} - -// In TeX, there are actually three sets of dimensions, one for each of - -// Math style is not quite the same thing as script level. -const StyleLevel = { - DISPLAY: 0, - TEXT: 1, - SCRIPT: 2, - SCRIPTSCRIPT: 3 -}; - -// Helper functions -function getHLines(parser) { - // Return an array. The array length = number of hlines. - // Each element in the array tells if the line is dashed. - const hlineInfo = []; - parser.consumeSpaces(); - let nxt = parser.fetch().text; - if (nxt === "\\relax") { - parser.consume(); - parser.consumeSpaces(); - nxt = parser.fetch().text; - } - while (nxt === "\\hline" || nxt === "\\hdashline") { - parser.consume(); - hlineInfo.push(nxt === "\\hdashline"); - parser.consumeSpaces(); - nxt = parser.fetch().text; - } - return hlineInfo; -} - -const validateAmsEnvironmentContext = context => { - const settings = context.parser.settings; - if (!settings.displayMode) { - throw new ParseError(`{${context.envName}} can be used only in display mode.`); - } -}; - -const getTag = (group, style, rowNum) => { - let tag; - const tagContents = group.tags.shift(); - if (tagContents) { - // The author has written a \tag or a \notag in this row. - if (tagContents.body) { - tag = buildExpressionRow(tagContents.body, style, true); - tag.classes = ["tml-tag"]; - } else { - // \notag. Return an empty span. - tag = new mathMLTree.MathNode("mtext", [], []); - return tag - } - } else if (group.envClasses.includes("multline") && - ((group.leqno && rowNum !== 0) || (!group.leqno && rowNum !== group.body.length - 1))) { - // A multiline that does not receive a tag. Return an empty cell. - tag = new mathMLTree.MathNode("mtext", [], []); - return tag - } else { - // AMS automatcally numbered equaton. - // Insert a class so the element can be populated by a CSS counter. - // WebKit will display the CSS counter only inside a span. - tag = new mathMLTree.MathNode("mtext", [new Span(["tml-eqn"])]); - } - return tag -}; - -/** - * Parse the body of the environment, with rows delimited by \\ and - * columns delimited by &, and create a nested list in row-major order - * with one group per cell. If given an optional argument scriptLevel - * ("text", "display", etc.), then each cell is cast into that scriptLevel. - */ -function parseArray( - parser, - { - cols, // [{ type: string , align: l|c|r|null }] - envClasses, // align(ed|at|edat) | array | cases | cd | small | multline - addEqnNum, // boolean - singleRow, // boolean - emptySingleRow, // boolean - maxNumCols, // number - leqno // boolean - }, - scriptLevel -) { - parser.gullet.beginGroup(); - if (!singleRow) { - // \cr is equivalent to \\ without the optional size argument (see below) - // TODO: provide helpful error when \cr is used outside array environment - parser.gullet.macros.set("\\cr", "\\\\\\relax"); - } - if (addEqnNum) { - parser.gullet.macros.set("\\tag", "\\@ifstar\\envtag@literal\\envtag@paren"); - parser.gullet.macros.set("\\envtag@paren", "\\env@tag{{(\\text{#1})}}"); - parser.gullet.macros.set("\\envtag@literal", "\\env@tag{\\text{#1}}"); - parser.gullet.macros.set("\\notag", "\\env@notag"); - parser.gullet.macros.set("\\nonumber", "\\env@notag"); - } - - // Start group for first cell - parser.gullet.beginGroup(); - - let row = []; - const body = [row]; - const rowGaps = []; - const tags = []; - let rowTag; - const hLinesBeforeRow = []; - - // Test for \hline at the top of the array. - hLinesBeforeRow.push(getHLines(parser)); - - // eslint-disable-next-line no-constant-condition - while (true) { - // Parse each cell in its own group (namespace) - let cell = parser.parseExpression(false, singleRow ? "\\end" : "\\\\"); - - if (addEqnNum && !rowTag) { - // Check if the author wrote a \tag{} inside this cell. - for (let i = 0; i < cell.length; i++) { - if (cell[i].type === "envTag" || cell[i].type === "noTag") { - // Get the contents of the \text{} nested inside the \env@Tag{} - rowTag = cell[i].type === "envTag" - ? cell.splice(i, 1)[0].body.body[0] - : { body: null }; - break - } - } - } - parser.gullet.endGroup(); - parser.gullet.beginGroup(); - - cell = { - type: "ordgroup", - mode: parser.mode, - body: cell, - semisimple: true - }; - row.push(cell); - const next = parser.fetch().text; - if (next === "&") { - if (maxNumCols && row.length === maxNumCols) { - if (envClasses.includes("array")) { - if (parser.settings.strict) { - throw new ParseError("Too few columns " + "specified in the {array} column argument.", - parser.nextToken) - } - } else if (maxNumCols === 2) { - throw new ParseError("The split environment accepts no more than two columns", - parser.nextToken); - } else { - throw new ParseError("The equation environment accepts only one column", - parser.nextToken) - } - } - parser.consume(); - } else if (next === "\\end") { - // Arrays terminate newlines with `\crcr` which consumes a `\cr` if - // the last line is empty. However, AMS environments keep the - // empty row if it's the only one. - // NOTE: Currently, `cell` is the last item added into `row`. - if (row.length === 1 && cell.body.length === 0 && (body.length > 1 || !emptySingleRow)) { - body.pop(); - } - if (hLinesBeforeRow.length < body.length + 1) { - hLinesBeforeRow.push([]); - } - break; - } else if (next === "\\\\") { - parser.consume(); - let size; - // \def\Let@{\let\\\math@cr} - // \def\math@cr{...\math@cr@} - // \def\math@cr@{\new@ifnextchar[\math@cr@@{\math@cr@@[\z@]}} - // \def\math@cr@@[#1]{...\math@cr@@@...} - // \def\math@cr@@@{\cr} - if (parser.gullet.future().text !== " ") { - size = parser.parseSizeGroup(true); - } - rowGaps.push(size ? size.value : null); - - tags.push(rowTag); - - // check for \hline(s) following the row separator - hLinesBeforeRow.push(getHLines(parser)); - - row = []; - rowTag = null; - body.push(row); - } else { - throw new ParseError("Expected & or \\\\ or \\cr or \\end", parser.nextToken); - } - } - - // End cell group - parser.gullet.endGroup(); - // End array group defining \cr - parser.gullet.endGroup(); - - tags.push(rowTag); - - return { - type: "array", - mode: parser.mode, - body, - cols, - rowGaps, - hLinesBeforeRow, - envClasses, - addEqnNum, - scriptLevel, - tags, - leqno - }; -} - -// Decides on a scriptLevel for cells in an array according to whether the given -// environment name starts with the letter 'd'. -function dCellStyle(envName) { - return envName.slice(0, 1) === "d" ? "display" : "text" -} - -const alignMap = { - c: "center ", - l: "left ", - r: "right " -}; - -const glue = group => { - const glueNode = new mathMLTree.MathNode("mtd", []); - glueNode.style = { padding: "0", width: "50%" }; - if (group.envClasses.includes("multline")) { - glueNode.style.width = "7.5%"; - } - return glueNode -}; - -const mathmlBuilder$7 = function(group, style) { - const tbl = []; - const numRows = group.body.length; - const hlines = group.hLinesBeforeRow; - - for (let i = 0; i < numRows; i++) { - const rw = group.body[i]; - const row = []; - const cellLevel = group.scriptLevel === "text" - ? StyleLevel.TEXT - : group.scriptLevel === "script" - ? StyleLevel.SCRIPT - : StyleLevel.DISPLAY; - - for (let j = 0; j < rw.length; j++) { - const mtd = new mathMLTree.MathNode( - "mtd", - [buildGroup$1(rw[j], style.withLevel(cellLevel))] - ); - - if (group.envClasses.includes("multline")) { - const align = i === 0 ? "left" : i === numRows - 1 ? "right" : "center"; - mtd.setAttribute("columnalign", align); - if (align !== "center") { - mtd.classes.push("tml-" + align); - } - } - row.push(mtd); - } - if (group.addEqnNum) { - row.unshift(glue(group)); - row.push(glue(group)); - const tag = getTag(group, style.withLevel(cellLevel), i); - if (group.leqno) { - row[0].children.push(tag); - row[0].classes.push("tml-left"); - } else { - row[row.length - 1].children.push(tag); - row[row.length - 1].classes.push("tml-right"); - } - } - const mtr = new mathMLTree.MathNode("mtr", row, []); - // Write horizontal rules - if (i === 0 && hlines[0].length > 0) { - if (hlines[0].length === 2) { - mtr.children.forEach(cell => { cell.style.borderTop = "0.15em double"; }); - } else { - mtr.children.forEach(cell => { - cell.style.borderTop = hlines[0][0] ? "0.06em dashed" : "0.06em solid"; - }); - } - } - if (hlines[i + 1].length > 0) { - if (hlines[i + 1].length === 2) { - mtr.children.forEach(cell => { cell.style.borderBottom = "0.15em double"; }); - } else { - mtr.children.forEach(cell => { - cell.style.borderBottom = hlines[i + 1][0] ? "0.06em dashed" : "0.06em solid"; - }); - } - } - tbl.push(mtr); - } - - if (group.envClasses.length > 0) { - const pad = group.envClasses.includes("jot") - ? "0.7" // 0.5ex + 0.09em top & bot padding - : group.envClasses.includes("small") - ? "0.35" - : "0.5"; // 0.5ex default top & bot padding - const sidePadding = group.envClasses.includes("abut") - ? "0" - : group.envClasses.includes("cases") - ? "0" - : group.envClasses.includes("small") - ? "0.1389" - : group.envClasses.includes("cd") - ? "0.25" - : "0.4"; // default side padding - - const numCols = tbl.length === 0 ? 0 : tbl[0].children.length; - - const sidePad = (j, hand) => { - if (j === 0 && hand === 0) { return "0" } - if (j === numCols - 1 && hand === 1) { return "0" } - if (group.envClasses[0] !== "align") { return sidePadding } - if (hand === 1) { return "0" } - if (group.addEqnNum) { - return (j % 2) ? "1" : "0" - } else { - return (j % 2) ? "0" : "1" - } - }; - - // Padding - for (let i = 0; i < tbl.length; i++) { - for (let j = 0; j < tbl[i].children.length; j++) { - tbl[i].children[j].style.padding = `${pad}ex ${sidePad(j, 1)}em ${pad}ex ${sidePad(j, 0)}em`; - } - } - - // Justification - const align = group.envClasses.includes("align") || group.envClasses.includes("alignat"); - for (let i = 0; i < tbl.length; i++) { - const row = tbl[i]; - if (align) { - for (let j = 0; j < row.children.length; j++) { - // Chromium does not recognize text-align: left. Use -webkit- - // TODO: Remove -webkit- when Chromium no longer needs it. - row.children[j].classes = ["tml-" + (j % 2 ? "left" : "right")]; - } - if (group.addEqnNum) { - const k = group.leqno ? 0 : row.children.length - 1; - row.children[k].classes = ["tml-" + (group.leqno ? "left" : "right")]; - } - } - if (row.children.length > 1 && group.envClasses.includes("cases")) { - row.children[1].style.padding = row.children[1].style.padding.replace(/0em$/, "1em"); - } - - if (group.envClasses.includes("cases") || group.envClasses.includes("subarray")) { - for (const cell of row.children) { - cell.classes.push("tml-left"); - } - } - } - } else { - // Set zero padding on side of the matrix - for (let i = 0; i < tbl.length; i++) { - tbl[i].children[0].style.paddingLeft = "0em"; - if (tbl[i].children.length === tbl[0].children.length) { - tbl[i].children[tbl[i].children.length - 1].style.paddingRight = "0em"; - } - } - } - - let table = new mathMLTree.MathNode("mtable", tbl); - if (group.scriptLevel === "display") { table.setAttribute("displaystyle", "true"); } - - if (group.addEqnNum || group.envClasses.includes("multline")) { - table.style.width = "100%"; - } - - // Column separator lines and column alignment - let align = ""; - - if (group.cols && group.cols.length > 0) { - const cols = group.cols; - let prevTypeWasAlign = false; - let iStart = 0; - let iEnd = cols.length; - - while (cols[iStart].type === "separator") { - iStart += 1; - } - while (cols[iEnd - 1].type === "separator") { - iEnd -= 1; - } - - if (cols[0].type === "separator") { - const sep = cols[1].type === "separator" - ? "0.15em double" - : cols[0].separator === "|" - ? "0.06em solid " - : "0.06em dashed "; - for (const row of table.children) { - row.children[0].style.borderLeft = sep; - } - } - let iCol = group.addEqnNum ? 0 : -1; - for (let i = iStart; i < iEnd; i++) { - if (cols[i].type === "align") { - const colAlign = alignMap[cols[i].align]; - align += colAlign; - iCol += 1; - for (const row of table.children) { - if (colAlign.trim() !== "center" && iCol < row.children.length) { - row.children[iCol].classes = ["tml-" + colAlign.trim()]; - } - } - prevTypeWasAlign = true; - } else if (cols[i].type === "separator") { - // MathML accepts only single lines between cells. - // So we read only the first of consecutive separators. - if (prevTypeWasAlign) { - const sep = cols[i + 1].type === "separator" - ? "0.15em double" - : cols[i].separator === "|" - ? "0.06em solid" - : "0.06em dashed"; - for (const row of table.children) { - if (iCol < row.children.length) { - row.children[iCol].style.borderRight = sep; - } - } - } - prevTypeWasAlign = false; - } - } - if (cols[cols.length - 1].type === "separator") { - const sep = cols[cols.length - 2].type === "separator" - ? "0.15em double" - : cols[cols.length - 1].separator === "|" - ? "0.06em solid" - : "0.06em dashed"; - for (const row of table.children) { - row.children[row.children.length - 1].style.borderRight = sep; - row.children[row.children.length - 1].style.paddingRight = "0.4em"; - } - } - } - if (group.addEqnNum) { - // allow for glue cells on each side - align = "left " + (align.length > 0 ? align : "center ") + "right "; - } - if (align) { - // Firefox reads this attribute, not the -webkit-left|right written above. - // TODO: When Chrome no longer needs "-webkit-", use CSS and delete the next line. - table.setAttribute("columnalign", align.trim()); - } - - if (group.envClasses.includes("small")) { - // A small array. Wrap in scriptstyle. - table = new mathMLTree.MathNode("mstyle", [table]); - table.setAttribute("scriptlevel", "1"); - } - - return table -}; - -// Convenience function for align, align*, aligned, alignat, alignat*, alignedat, split. -const alignedHandler = function(context, args) { - if (context.envName.indexOf("ed") === -1) { - validateAmsEnvironmentContext(context); - } - const cols = []; - const res = parseArray( - context.parser, - { - cols, - addEqnNum: context.envName === "align" || context.envName === "alignat", - emptySingleRow: true, - envClasses: ["abut", "jot"], // set row spacing & provisional column spacing - maxNumCols: context.envName === "split" ? 2 : undefined, - leqno: context.parser.settings.leqno - }, - "display" - ); - - // Determining number of columns. - // 1. If the first argument is given, we use it as a number of columns, - // and makes sure that each row doesn't exceed that number. - // 2. Otherwise, just count number of columns = maximum number - // of cells in each row ("aligned" mode -- isAligned will be true). - // - // At the same time, prepend empty group {} at beginning of every second - // cell in each row (starting with second cell) so that operators become - // binary. This behavior is implemented in amsmath's \start@aligned. - let numMaths; - let numCols = 0; - const isAlignedAt = context.envName.indexOf("at") > -1; - if (args[0] && isAlignedAt) { - // alignat environment takes an argument w/ number of columns - let arg0 = ""; - for (let i = 0; i < args[0].body.length; i++) { - const textord = assertNodeType(args[0].body[i], "textord"); - arg0 += textord.text; - } - if (isNaN(arg0)) { - throw new ParseError("The alignat enviroment requires a numeric first argument.") - } - numMaths = Number(arg0); - numCols = numMaths * 2; - } - res.body.forEach(function(row) { - if (isAlignedAt) { - // Case 1 - const curMaths = row.length / 2; - if (numMaths < curMaths) { - throw new ParseError( - "Too many math in a row: " + `expected ${numMaths}, but got ${curMaths}`, - row[0] - ); - } - } else if (numCols < row.length) { - // Case 2 - numCols = row.length; - } - }); - - // Adjusting alignment. - // In aligned mode, we add one \qquad between columns; - // otherwise we add nothing. - for (let i = 0; i < numCols; ++i) { - let align = "r"; - if (i % 2 === 1) { - align = "l"; - } - cols[i] = { - type: "align", - align: align - }; - } - if (context.envName === "split") ; else if (isAlignedAt) { - res.envClasses.push("alignat"); // Sets justification - } else { - res.envClasses[0] = "align"; // Sets column spacing & justification - } - return res; -}; - -// Arrays are part of LaTeX, defined in lttab.dtx so its documentation -// is part of the source2e.pdf file of LaTeX2e source documentation. -// {darray} is an {array} environment where cells are set in \displaystyle, -// as defined in nccmath.sty. -defineEnvironment({ - type: "array", - names: ["array", "darray"], - props: { - numArgs: 1 - }, - handler(context, args) { - // Since no types are specified above, the two possibilities are - // - The argument is wrapped in {} or [], in which case Parser's - // parseGroup() returns an "ordgroup" wrapping some symbol node. - // - The argument is a bare symbol node. - const symNode = checkSymbolNodeType(args[0]); - const colalign = symNode ? [args[0]] : assertNodeType(args[0], "ordgroup").body; - const cols = colalign.map(function(nde) { - const node = assertSymbolNodeType(nde); - const ca = node.text; - if ("lcr".indexOf(ca) !== -1) { - return { - type: "align", - align: ca - }; - } else if (ca === "|") { - return { - type: "separator", - separator: "|" - }; - } else if (ca === ":") { - return { - type: "separator", - separator: ":" - }; - } - throw new ParseError("Unknown column alignment: " + ca, nde); - }); - const res = { - cols, - envClasses: ["array"], - maxNumCols: cols.length - }; - return parseArray(context.parser, res, dCellStyle(context.envName)); - }, - mathmlBuilder: mathmlBuilder$7 -}); - -// The matrix environments of amsmath builds on the array environment -// of LaTeX, which is discussed above. -// The mathtools package adds starred versions of the same environments. -// These have an optional argument to choose left|center|right justification. -defineEnvironment({ - type: "array", - names: [ - "matrix", - "pmatrix", - "bmatrix", - "Bmatrix", - "vmatrix", - "Vmatrix", - "matrix*", - "pmatrix*", - "bmatrix*", - "Bmatrix*", - "vmatrix*", - "Vmatrix*" - ], - props: { - numArgs: 0 - }, - handler(context) { - const delimiters = { - matrix: null, - pmatrix: ["(", ")"], - bmatrix: ["[", "]"], - Bmatrix: ["\\{", "\\}"], - vmatrix: ["|", "|"], - Vmatrix: ["\\Vert", "\\Vert"] - }[context.envName.replace("*", "")]; - // \hskip -\arraycolsep in amsmath - let colAlign = "c"; - const payload = { - envClasses: [], - cols: [] - }; - if (context.envName.charAt(context.envName.length - 1) === "*") { - // It's one of the mathtools starred functions. - // Parse the optional alignment argument. - const parser = context.parser; - parser.consumeSpaces(); - if (parser.fetch().text === "[") { - parser.consume(); - parser.consumeSpaces(); - colAlign = parser.fetch().text; - if ("lcr".indexOf(colAlign) === -1) { - throw new ParseError("Expected l or c or r", parser.nextToken); - } - parser.consume(); - parser.consumeSpaces(); - parser.expect("]"); - parser.consume(); - payload.cols = []; - } - } - const res = parseArray(context.parser, payload, "text"); - res.cols = new Array(res.body[0].length).fill({ type: "align", align: colAlign }); - return delimiters - ? { - type: "leftright", - mode: context.mode, - body: [res], - left: delimiters[0], - right: delimiters[1], - rightColor: undefined // \right uninfluenced by \color in array - } - : res; - }, - mathmlBuilder: mathmlBuilder$7 -}); - -defineEnvironment({ - type: "array", - names: ["smallmatrix"], - props: { - numArgs: 0 - }, - handler(context) { - const payload = { type: "small" }; - const res = parseArray(context.parser, payload, "script"); - res.envClasses = ["small"]; - return res; - }, - mathmlBuilder: mathmlBuilder$7 -}); - -defineEnvironment({ - type: "array", - names: ["subarray"], - props: { - numArgs: 1 - }, - handler(context, args) { - // Parsing of {subarray} is similar to {array} - const symNode = checkSymbolNodeType(args[0]); - const colalign = symNode ? [args[0]] : assertNodeType(args[0], "ordgroup").body; - const cols = colalign.map(function(nde) { - const node = assertSymbolNodeType(nde); - const ca = node.text; - // {subarray} only recognizes "l" & "c" - if ("lc".indexOf(ca) !== -1) { - return { - type: "align", - align: ca - }; - } - throw new ParseError("Unknown column alignment: " + ca, nde); - }); - if (cols.length > 1) { - throw new ParseError("{subarray} can contain only one column"); - } - let res = { - cols, - envClasses: ["small"] - }; - res = parseArray(context.parser, res, "script"); - if (res.body.length > 0 && res.body[0].length > 1) { - throw new ParseError("{subarray} can contain only one column"); - } - return res; - }, - mathmlBuilder: mathmlBuilder$7 -}); - -// A cases environment (in amsmath.sty) is almost equivalent to -// \def -// \left\{\begin{array}{@{}l@{\quad}l@{}} … \end{array}\right. -// {dcases} is a {cases} environment where cells are set in \displaystyle, -// as defined in mathtools.sty. -// {rcases} is another mathtools environment. It's brace is on the right side. -defineEnvironment({ - type: "array", - names: ["cases", "dcases", "rcases", "drcases"], - props: { - numArgs: 0 - }, - handler(context) { - const payload = { - cols: [], - envClasses: ["cases"] - }; - const res = parseArray(context.parser, payload, dCellStyle(context.envName)); - return { - type: "leftright", - mode: context.mode, - body: [res], - left: context.envName.indexOf("r") > -1 ? "." : "\\{", - right: context.envName.indexOf("r") > -1 ? "\\}" : ".", - rightColor: undefined - }; - }, - mathmlBuilder: mathmlBuilder$7 -}); - -// In the align environment, one uses ampersands, &, to specify number of -// columns in each row, and to locate spacing between each column. -// align gets automatic numbering. align* and aligned do not. -// The alignedat environment can be used in math mode. -defineEnvironment({ - type: "array", - names: ["align", "align*", "aligned", "split"], - props: { - numArgs: 0 - }, - handler: alignedHandler, - mathmlBuilder: mathmlBuilder$7 -}); - -// alignat environment is like an align environment, but one must explicitly -// specify maximum number of columns in each row, and can adjust where spacing occurs. -defineEnvironment({ - type: "array", - names: ["alignat", "alignat*", "alignedat"], - props: { - numArgs: 1 - }, - handler: alignedHandler, - mathmlBuilder: mathmlBuilder$7 -}); - -// A gathered environment is like an array environment with one centered -// column, but where rows are considered lines so get \jot line spacing -// and contents are set in \displaystyle. -defineEnvironment({ - type: "array", - names: ["gathered", "gather", "gather*"], - props: { - numArgs: 0 - }, - handler(context) { - if (context.envName !== "gathered") { - validateAmsEnvironmentContext(context); - } - const res = { - cols: [], - envClasses: ["abut", "jot"], - addEqnNum: context.envName === "gather", - emptySingleRow: true, - leqno: context.parser.settings.leqno - }; - return parseArray(context.parser, res, "display"); - }, - mathmlBuilder: mathmlBuilder$7 -}); - -defineEnvironment({ - type: "array", - names: ["equation", "equation*"], - props: { - numArgs: 0 - }, - handler(context) { - validateAmsEnvironmentContext(context); - const res = { - addEqnNum: context.envName === "equation", - emptySingleRow: true, - singleRow: true, - maxNumCols: 1, - envClasses: ["align"], - leqno: context.parser.settings.leqno - }; - return parseArray(context.parser, res, "display"); - }, - mathmlBuilder: mathmlBuilder$7 -}); - -defineEnvironment({ - type: "array", - names: ["multline", "multline*"], - props: { - numArgs: 0 - }, - handler(context) { - validateAmsEnvironmentContext(context); - const res = { - addEqnNum: context.envName === "multline", - maxNumCols: 1, - envClasses: ["jot", "multline"], - leqno: context.parser.settings.leqno - }; - return parseArray(context.parser, res, "display"); - }, - mathmlBuilder: mathmlBuilder$7 -}); - -defineEnvironment({ - type: "array", - names: ["CD"], - props: { - numArgs: 0 - }, - handler(context) { - validateAmsEnvironmentContext(context); - return parseCD(context.parser); - }, - mathmlBuilder: mathmlBuilder$7 -}); - -// Catch \hline outside array environment -defineFunction({ - type: "text", // Doesn't matter what this is. - names: ["\\hline", "\\hdashline"], - props: { - numArgs: 0, - allowedInText: true, - allowedInMath: true - }, - handler(context, args) { - throw new ParseError(`${context.funcName} valid only within array environment`); - } -}); - -const environments = _environments; - -// Environment delimiters. HTML/MathML rendering is defined in the corresponding -// defineEnvironment definitions. -defineFunction({ - type: "environment", - names: ["\\begin", "\\end"], - props: { - numArgs: 1, - argTypes: ["text"] - }, - handler({ parser, funcName }, args) { - const nameGroup = args[0]; - if (nameGroup.type !== "ordgroup") { - throw new ParseError("Invalid environment name", nameGroup); - } - let envName = ""; - for (let i = 0; i < nameGroup.body.length; ++i) { - envName += assertNodeType(nameGroup.body[i], "textord").text; - } - - if (funcName === "\\begin") { - // begin...end is similar to left...right - if (!Object.prototype.hasOwnProperty.call(environments, envName )) { - throw new ParseError("No such environment: " + envName, nameGroup); - } - // Build the environment object. Arguments and other information will - // be made available to the begin and end methods using properties. - const env = environments[envName]; - const { args, optArgs } = parser.parseArguments("\\begin{" + envName + "}", env); - const context = { - mode: parser.mode, - envName, - parser - }; - const result = env.handler(context, args, optArgs); - parser.expect("\\end", false); - const endNameToken = parser.nextToken; - const end = assertNodeType(parser.parseFunction(), "environment"); - if (end.name !== envName) { - throw new ParseError( - `Mismatch: \\begin{${envName}} matched by \\end{${end.name}}`, - endNameToken - ); - } - return result; - } - - return { - type: "environment", - mode: parser.mode, - name: envName, - nameGroup - }; - } -}); - -defineFunction({ - type: "envTag", - names: ["\\env@tag"], - props: { - numArgs: 1, - argTypes: ["math"] - }, - handler({ parser }, args) { - return { - type: "envTag", - mode: parser.mode, - body: args[0] - }; - }, - mathmlBuilder(group, style) { - return new mathMLTree.MathNode("mrow"); - } -}); - -defineFunction({ - type: "noTag", - names: ["\\env@notag"], - props: { - numArgs: 0 - }, - handler({ parser }) { - return { - type: "noTag", - mode: parser.mode - }; - }, - mathmlBuilder(group, style) { - return new mathMLTree.MathNode("mrow"); - } -}); - -const isLongVariableName = (group, font) => { - if (font !== "mathrm" || group.body.type !== "ordgroup" || group.body.body.length === 1) { - return false - } - if (group.body.body[0].type !== "mathord") { return false } - for (let i = 1; i < group.body.body.length; i++) { - const parseNodeType = group.body.body[i].type; - if (!(parseNodeType === "mathord" || - (parseNodeType === "textord" && !isNaN(group.body.body[i].text)))) { - return false - } - } - return true -}; - -const mathmlBuilder$6 = (group, style) => { - const font = group.font; - const newStyle = style.withFont(font); - const mathGroup = buildGroup$1(group.body, newStyle); - - if (mathGroup.children.length === 0) { return mathGroup } // empty group, e.g., \mathrm{} - if (font === "boldsymbol" && ["mo", "mpadded", "mrow"].includes(mathGroup.type)) { - mathGroup.style.fontWeight = "bold"; - return mathGroup - } - // Check if it is possible to consolidate elements into a single element. - if (isLongVariableName(group, font)) { - // This is a \mathrm{…} group. It gets special treatment because symbolsOrd.js - // wraps elements with s to work around a Firefox bug. - const mi = mathGroup.children[0].children[0]; - delete mi.attributes.mathvariant; - for (let i = 1; i < mathGroup.children.length; i++) { - mi.children[0].text += mathGroup.children[i].type === "mn" - ? mathGroup.children[i].children[0].text - : mathGroup.children[i].children[0].children[0].text; - } - // Wrap in a to prevent the same Firefox bug. - const bogus = new mathMLTree.MathNode("mtext", new mathMLTree.TextNode("\u200b")); - return new mathMLTree.MathNode("mrow", [bogus, mi]) - } - let canConsolidate = mathGroup.children[0].type === "mo"; - for (let i = 1; i < mathGroup.children.length; i++) { - if (mathGroup.children[i].type === "mo" && font === "boldsymbol") { - mathGroup.children[i].style.fontWeight = "bold"; - } - if (mathGroup.children[i].type !== "mi") { canConsolidate = false; } - const localVariant = mathGroup.children[i].attributes && - mathGroup.children[i].attributes.mathvariant || ""; - if (localVariant !== "normal") { canConsolidate = false; } - } - if (!canConsolidate) { return mathGroup } - // Consolidate the elements. - const mi = mathGroup.children[0]; - for (let i = 1; i < mathGroup.children.length; i++) { - mi.children.push(mathGroup.children[i].children[0]); - } - if (mi.attributes.mathvariant && mi.attributes.mathvariant === "normal") { - // Workaround for a Firefox bug that renders spurious space around - // a - // Ref: https://bugs.webkit.org/show_bug.cgi?id=129097 - // We insert a text node that contains a zero-width space and wrap in an mrow. - // TODO: Get rid of this workaround when the Firefox bug is fixed. - const bogus = new mathMLTree.MathNode("mtext", new mathMLTree.TextNode("\u200b")); - return new mathMLTree.MathNode("mrow", [bogus, mi]) - } - return mi -}; - -const fontAliases = { - "\\Bbb": "\\mathbb", - "\\bold": "\\mathbf", - "\\frak": "\\mathfrak", - "\\bm": "\\boldsymbol" -}; - -defineFunction({ - type: "font", - names: [ - // styles - "\\mathrm", - "\\mathit", - "\\mathbf", - "\\mathnormal", - "\\up@greek", - "\\boldsymbol", - - // families - "\\mathbb", - "\\mathcal", - "\\mathfrak", - "\\mathscr", - "\\mathsf", - "\\mathtt", - - // aliases - "\\Bbb", - "\\bm", - "\\bold", - "\\frak" - ], - props: { - numArgs: 1, - allowedInArgument: true - }, - handler: ({ parser, funcName }, args) => { - const body = normalizeArgument(args[0]); - let func = funcName; - if (func in fontAliases) { - func = fontAliases[func]; - } - return { - type: "font", - mode: parser.mode, - font: func.slice(1), - body - }; - }, - mathmlBuilder: mathmlBuilder$6 -}); - -// Old font changing functions -defineFunction({ - type: "font", - names: ["\\rm", "\\sf", "\\tt", "\\bf", "\\it", "\\cal"], - props: { - numArgs: 0, - allowedInText: true - }, - handler: ({ parser, funcName, breakOnTokenText }, args) => { - const { mode } = parser; - const body = parser.parseExpression(true, breakOnTokenText, true); - const fontStyle = `math${funcName.slice(1)}`; - - return { - type: "font", - mode: mode, - font: fontStyle, - body: { - type: "ordgroup", - mode: parser.mode, - body - } - }; - }, - mathmlBuilder: mathmlBuilder$6 -}); - -const stylArray = ["display", "text", "script", "scriptscript"]; -const scriptLevel = { auto: -1, display: 0, text: 0, script: 1, scriptscript: 2 }; - -const mathmlBuilder$5 = (group, style) => { - // Track the scriptLevel of the numerator and denominator. - // We may need that info for \mathchoice or for adjusting em dimensions. - const childOptions = group.scriptLevel === "auto" - ? style.incrementLevel() - : group.scriptLevel === "display" - ? style.withLevel(StyleLevel.TEXT) - : group.scriptLevel === "text" - ? style.withLevel(StyleLevel.SCRIPT) - : style.withLevel(StyleLevel.SCRIPTSCRIPT); - - let node = new mathMLTree.MathNode("mfrac", [ - buildGroup$1(group.numer, childOptions), - buildGroup$1(group.denom, childOptions) - ]); - - if (!group.hasBarLine) { - node.setAttribute("linethickness", "0px"); - } else if (group.barSize) { - const ruleWidth = calculateSize(group.barSize, style); - node.setAttribute("linethickness", ruleWidth.number + ruleWidth.unit); - } - - if (group.leftDelim != null || group.rightDelim != null) { - const withDelims = []; - - if (group.leftDelim != null) { - const leftOp = new mathMLTree.MathNode("mo", [ - new mathMLTree.TextNode(group.leftDelim.replace("\\", "")) - ]); - leftOp.setAttribute("fence", "true"); - withDelims.push(leftOp); - } - - withDelims.push(node); - - if (group.rightDelim != null) { - const rightOp = new mathMLTree.MathNode("mo", [ - new mathMLTree.TextNode(group.rightDelim.replace("\\", "")) - ]); - rightOp.setAttribute("fence", "true"); - withDelims.push(rightOp); - } - - node = makeRow(withDelims); - } - - if (group.scriptLevel !== "auto") { - node = new mathMLTree.MathNode("mstyle", [node]); - node.setAttribute("displaystyle", String(group.scriptLevel === "display")); - node.setAttribute("scriptlevel", scriptLevel[group.scriptLevel]); - } - - return node; -}; - -defineFunction({ - type: "genfrac", - names: [ - "\\dfrac", - "\\frac", - "\\tfrac", - "\\dbinom", - "\\binom", - "\\tbinom", - "\\\\atopfrac", // can’t be entered directly - "\\\\bracefrac", - "\\\\brackfrac" // ditto - ], - props: { - numArgs: 2, - allowedInArgument: true - }, - handler: ({ parser, funcName }, args) => { - const numer = args[0]; - const denom = args[1]; - let hasBarLine = false; - let leftDelim = null; - let rightDelim = null; - let scriptLevel = "auto"; - - switch (funcName) { - case "\\dfrac": - case "\\frac": - case "\\tfrac": - hasBarLine = true; - break; - case "\\\\atopfrac": - hasBarLine = false; - break; - case "\\dbinom": - case "\\binom": - case "\\tbinom": - leftDelim = "("; - rightDelim = ")"; - break; - case "\\\\bracefrac": - leftDelim = "\\{"; - rightDelim = "\\}"; - break; - case "\\\\brackfrac": - leftDelim = "["; - rightDelim = "]"; - break; - default: - throw new Error("Unrecognized genfrac command"); - } - - switch (funcName) { - case "\\dfrac": - case "\\dbinom": - scriptLevel = "display"; - break; - case "\\tfrac": - case "\\tbinom": - scriptLevel = "text"; - break; - } - - return { - type: "genfrac", - mode: parser.mode, - continued: false, - numer, - denom, - hasBarLine, - leftDelim, - rightDelim, - scriptLevel, - barSize: null - }; - }, - mathmlBuilder: mathmlBuilder$5 -}); - -defineFunction({ - type: "genfrac", - names: ["\\cfrac"], - props: { - numArgs: 2 - }, - handler: ({ parser, funcName }, args) => { - const numer = args[0]; - const denom = args[1]; - - return { - type: "genfrac", - mode: parser.mode, - continued: true, - numer, - denom, - hasBarLine: true, - leftDelim: null, - rightDelim: null, - scriptLevel: "display", - barSize: null - }; - } -}); - -// Infix generalized fractions -- these are not rendered directly, but replaced -// immediately by one of the variants above. -defineFunction({ - type: "infix", - names: ["\\over", "\\choose", "\\atop", "\\brace", "\\brack"], - props: { - numArgs: 0, - infix: true - }, - handler({ parser, funcName, token }) { - let replaceWith; - switch (funcName) { - case "\\over": - replaceWith = "\\frac"; - break; - case "\\choose": - replaceWith = "\\binom"; - break; - case "\\atop": - replaceWith = "\\\\atopfrac"; - break; - case "\\brace": - replaceWith = "\\\\bracefrac"; - break; - case "\\brack": - replaceWith = "\\\\brackfrac"; - break; - default: - throw new Error("Unrecognized infix genfrac command"); - } - return { - type: "infix", - mode: parser.mode, - replaceWith, - token - }; - } -}); - -const delimFromValue = function(delimString) { - let delim = null; - if (delimString.length > 0) { - delim = delimString; - delim = delim === "." ? null : delim; - } - return delim; -}; - -defineFunction({ - type: "genfrac", - names: ["\\genfrac"], - props: { - numArgs: 6, - allowedInArgument: true, - argTypes: ["math", "math", "size", "text", "math", "math"] - }, - handler({ parser }, args) { - const numer = args[4]; - const denom = args[5]; - - // Look into the parse nodes to get the desired delimiters. - const leftNode = normalizeArgument(args[0]); - const leftDelim = leftNode.type === "atom" && leftNode.family === "open" - ? delimFromValue(leftNode.text) - : null; - const rightNode = normalizeArgument(args[1]); - const rightDelim = - rightNode.type === "atom" && rightNode.family === "close" - ? delimFromValue(rightNode.text) - : null; - - const barNode = assertNodeType(args[2], "size"); - let hasBarLine; - let barSize = null; - if (barNode.isBlank) { - // \genfrac acts differently than \above. - // \genfrac treats an empty size group as a signal to use a - // standard bar size. \above would see size = 0 and omit the bar. - hasBarLine = true; - } else { - barSize = barNode.value; - hasBarLine = barSize.number > 0; - } - - // Find out if we want displaystyle, textstyle, etc. - let scriptLevel = "auto"; - let styl = args[3]; - if (styl.type === "ordgroup") { - if (styl.body.length > 0) { - const textOrd = assertNodeType(styl.body[0], "textord"); - scriptLevel = stylArray[Number(textOrd.text)]; - } - } else { - styl = assertNodeType(styl, "textord"); - scriptLevel = stylArray[Number(styl.text)]; - } - - return { - type: "genfrac", - mode: parser.mode, - numer, - denom, - continued: false, - hasBarLine, - barSize, - leftDelim, - rightDelim, - scriptLevel - }; - }, - mathmlBuilder: mathmlBuilder$5 -}); - -// \above is an infix fraction that also defines a fraction bar size. -defineFunction({ - type: "infix", - names: ["\\above"], - props: { - numArgs: 1, - argTypes: ["size"], - infix: true - }, - handler({ parser, funcName, token }, args) { - return { - type: "infix", - mode: parser.mode, - replaceWith: "\\\\abovefrac", - barSize: assertNodeType(args[0], "size").value, - token - }; - } -}); - -defineFunction({ - type: "genfrac", - names: ["\\\\abovefrac"], - props: { - numArgs: 3, - argTypes: ["math", "size", "math"] - }, - handler: ({ parser, funcName }, args) => { - const numer = args[0]; - const barSize = assert(assertNodeType(args[1], "infix").barSize); - const denom = args[2]; - - const hasBarLine = barSize.number > 0; - return { - type: "genfrac", - mode: parser.mode, - numer, - denom, - continued: false, - hasBarLine, - barSize, - leftDelim: null, - rightDelim: null, - scriptLevel: "auto" - }; - }, - - mathmlBuilder: mathmlBuilder$5 -}); - -// \hbox is provided for compatibility with LaTeX functions that act on a box. -// This function by itself doesn't do anything but set scriptlevel to \textstyle -// and prevent a soft line break. - -defineFunction({ - type: "hbox", - names: ["\\hbox"], - props: { - numArgs: 1, - argTypes: ["hbox"], - allowedInArgument: true, - allowedInText: false - }, - handler({ parser }, args) { - return { - type: "hbox", - mode: parser.mode, - body: ordargument(args[0]) - }; - }, - mathmlBuilder(group, style) { - const newStyle = style.withLevel(StyleLevel.TEXT); - const mrow = buildExpressionRow(group.body, newStyle); - return consolidateText(mrow) - } -}); - -const mathmlBuilder$4 = (group, style) => { - const accentNode = stretchy.mathMLnode(group.label); - accentNode.style["math-depth"] = 0; - return new mathMLTree.MathNode(group.isOver ? "mover" : "munder", [ - buildGroup$1(group.base, style), - accentNode - ]); -}; - -// Horizontal stretchy braces -defineFunction({ - type: "horizBrace", - names: ["\\overbrace", "\\underbrace"], - props: { - numArgs: 1 - }, - handler({ parser, funcName }, args) { - return { - type: "horizBrace", - mode: parser.mode, - label: funcName, - isOver: /^\\over/.test(funcName), - base: args[0] - }; - }, - mathmlBuilder: mathmlBuilder$4 -}); - -defineFunction({ - type: "href", - names: ["\\href"], - props: { - numArgs: 2, - argTypes: ["url", "original"], - allowedInText: true - }, - handler: ({ parser, token }, args) => { - const body = args[1]; - const href = assertNodeType(args[0], "url").url; - - if ( - !parser.settings.isTrusted({ - command: "\\href", - url: href - }) - ) { - throw new ParseError(`Function "\\href" is not trusted`, token) - } - - return { - type: "href", - mode: parser.mode, - href, - body: ordargument(body) - }; - }, - mathmlBuilder: (group, style) => { - let math = buildExpressionRow(group.body, style); - if (!(math instanceof MathNode)) { - math = new MathNode("mrow", [math]); - } - math.setAttribute("href", group.href); - return math; - } -}); - -defineFunction({ - type: "href", - names: ["\\url"], - props: { - numArgs: 1, - argTypes: ["url"], - allowedInText: true - }, - handler: ({ parser, token }, args) => { - const href = assertNodeType(args[0], "url").url; - - if ( - !parser.settings.isTrusted({ - command: "\\url", - url: href - }) - ) { - throw new ParseError(`Function "\\url" is not trusted`, token) - } - - const chars = []; - for (let i = 0; i < href.length; i++) { - let c = href[i]; - if (c === "~") { - c = "\\textasciitilde"; - } - chars.push({ - type: "textord", - mode: "text", - text: c - }); - } - const body = { - type: "text", - mode: parser.mode, - font: "\\texttt", - body: chars - }; - return { - type: "href", - mode: parser.mode, - href, - body: ordargument(body) - }; - } -}); - -defineFunction({ - type: "html", - names: ["\\class", "\\id", "\\style", "\\data"], - props: { - numArgs: 2, - argTypes: ["raw", "original"], - allowedInText: true - }, - handler: ({ parser, funcName, token }, args) => { - const value = assertNodeType(args[0], "raw").string; - const body = args[1]; - - if (parser.settings.strict) { - throw new ParseError(`Function "${funcName}" is disabled in strict mode`, token) - } - - let trustContext; - const attributes = {}; - - switch (funcName) { - case "\\class": - attributes.class = value; - trustContext = { - command: "\\class", - class: value - }; - break; - case "\\id": - attributes.id = value; - trustContext = { - command: "\\id", - id: value - }; - break; - case "\\style": - attributes.style = value; - trustContext = { - command: "\\style", - style: value - }; - break; - case "\\data": { - const data = value.split(","); - for (let i = 0; i < data.length; i++) { - const keyVal = data[i].split("="); - if (keyVal.length !== 2) { - throw new ParseError("Error parsing key-value for \\data"); - } - attributes["data-" + keyVal[0].trim()] = keyVal[1].trim(); - } - - trustContext = { - command: "\\data", - attributes - }; - break; - } - default: - throw new Error("Unrecognized html command"); - } - - if (!parser.settings.isTrusted(trustContext)) { - throw new ParseError(`Function "${funcName}" is not trusted`, token) - } - return { - type: "html", - mode: parser.mode, - attributes, - body: ordargument(body) - }; - }, - mathmlBuilder: (group, style) => { - const element = buildExpressionRow(group.body, style); - - const classes = []; - if (group.attributes.class) { - classes.push(...group.attributes.class.trim().split(/\s+/)); - } - element.classes = classes; - - for (const attr in group.attributes) { - if (attr !== "class" && Object.prototype.hasOwnProperty.call(group.attributes, attr)) { - element.setAttribute(attr, group.attributes[attr]); - } - } - - return element; - } -}); - -const sizeData = function(str) { - if (/^[-+]? *(\d+(\.\d*)?|\.\d+)$/.test(str)) { - // str is a number with no unit specified. - // default unit is bp, per graphix package. - return { number: +str, unit: "bp" } - } else { - const match = /([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(str); - if (!match) { - throw new ParseError("Invalid size: '" + str + "' in \\includegraphics"); - } - const data = { - number: +(match[1] + match[2]), // sign + magnitude, cast to number - unit: match[3] - }; - if (!validUnit(data)) { - throw new ParseError("Invalid unit: '" + data.unit + "' in \\includegraphics."); - } - return data - } -}; - -defineFunction({ - type: "includegraphics", - names: ["\\includegraphics"], - props: { - numArgs: 1, - numOptionalArgs: 1, - argTypes: ["raw", "url"], - allowedInText: false - }, - handler: ({ parser, token }, args, optArgs) => { - let width = { number: 0, unit: "em" }; - let height = { number: 0.9, unit: "em" }; // sorta character sized. - let totalheight = { number: 0, unit: "em" }; - let alt = ""; - - if (optArgs[0]) { - const attributeStr = assertNodeType(optArgs[0], "raw").string; - - // Parser.js does not parse key/value pairs. We get a string. - const attributes = attributeStr.split(","); - for (let i = 0; i < attributes.length; i++) { - const keyVal = attributes[i].split("="); - if (keyVal.length === 2) { - const str = keyVal[1].trim(); - switch (keyVal[0].trim()) { - case "alt": - alt = str; - break - case "width": - width = sizeData(str); - break - case "height": - height = sizeData(str); - break - case "totalheight": - totalheight = sizeData(str); - break - default: - throw new ParseError("Invalid key: '" + keyVal[0] + "' in \\includegraphics.") - } - } - } - } - - const src = assertNodeType(args[0], "url").url; - - if (alt === "") { - // No alt given. Use the file name. Strip away the path. - alt = src; - alt = alt.replace(/^.*[\\/]/, ""); - alt = alt.substring(0, alt.lastIndexOf(".")); - } - - if ( - !parser.settings.isTrusted({ - command: "\\includegraphics", - url: src - }) - ) { - throw new ParseError(`Function "\\includegraphics" is not trusted`, token) - } - - return { - type: "includegraphics", - mode: parser.mode, - alt: alt, - width: width, - height: height, - totalheight: totalheight, - src: src - } - }, - mathmlBuilder: (group, style) => { - const height = calculateSize(group.height, style); - const depth = { number: 0, unit: "em" }; - - if (group.totalheight.number > 0) { - if (group.totalheight.unit === height.unit && - group.totalheight.number > height.number) { - depth.number = group.totalheight.number - height.number; - depth.unit = height.unit; - } - } - - let width = 0; - if (group.width.number > 0) { - width = calculateSize(group.width, style); - } - - const graphicStyle = { height: height.number + depth.number + "em" }; - if (width.number > 0) { - graphicStyle.width = width.number + width.unit; - } - if (depth.number > 0) { - graphicStyle.verticalAlign = -depth.number + depth.unit; - } - - const node = new Img(group.src, group.alt, graphicStyle); - node.height = height; - node.depth = depth; - return new mathMLTree.MathNode("mtext", [node]) - } -}); - -// Horizontal spacing commands - -// TODO: \hskip and \mskip should support plus and minus in lengths - -defineFunction({ - type: "kern", - names: ["\\kern", "\\mkern", "\\hskip", "\\mskip"], - props: { - numArgs: 1, - argTypes: ["size"], - primitive: true, - allowedInText: true - }, - handler({ parser, funcName, token }, args) { - const size = assertNodeType(args[0], "size"); - if (parser.settings.strict) { - const mathFunction = funcName[1] === "m"; // \mkern, \mskip - const muUnit = size.value.unit === "mu"; - if (mathFunction) { - if (!muUnit) { - throw new ParseError(`LaTeX's ${funcName} supports only mu units, ` + - `not ${size.value.unit} units`, token) - } - if (parser.mode !== "math") { - throw new ParseError(`LaTeX's ${funcName} works only in math mode`, token) - } - } else { - // !mathFunction - if (muUnit) { - throw new ParseError(`LaTeX's ${funcName} doesn't support mu units`, token) - } - } - } - return { - type: "kern", - mode: parser.mode, - dimension: size.value - }; - }, - mathmlBuilder(group, style) { - const dimension = calculateSize(group.dimension, style); - const ch = dimension.unit === "em" ? spaceCharacter(dimension.number) : ""; - if (group.mode === "text" && ch.length > 0) { - const character = new mathMLTree.TextNode(ch); - return new mathMLTree.MathNode("mtext", [character]); - } else { - const node = new mathMLTree.MathNode("mspace"); - node.setAttribute("width", dimension.number + dimension.unit); - if (dimension.number < 0) { - node.style.marginLeft = dimension.number + dimension.unit; - } - return node; - } - } -}); - -const spaceCharacter = function(width) { - if (width >= 0.05555 && width <= 0.05556) { - return "\u200a"; //   - } else if (width >= 0.1666 && width <= 0.1667) { - return "\u2009"; //   - } else if (width >= 0.2222 && width <= 0.2223) { - return "\u2005"; //   - } else if (width >= 0.2777 && width <= 0.2778) { - return "\u2005\u200a"; //    - } else { - return ""; - } -}; - -// Limit valid characters to a small set, for safety. -const invalidIdRegEx = /[^A-Za-z_0-9-]/g; - -defineFunction({ - type: "label", - names: ["\\label"], - props: { - numArgs: 1, - argTypes: ["raw"] - }, - handler({ parser }, args) { - return { - type: "label", - mode: parser.mode, - string: args[0].string.replace(invalidIdRegEx, "") - }; - }, - mathmlBuilder(group, style) { - // Return a no-width, no-ink element with an HTML id. - const node = new mathMLTree.MathNode("mrow", [], ["tml-label"]); - if (group.string.length > 0) { - node.setAttribute("id", group.string); - } - return node - } -}); - -// Horizontal overlap functions - -const textModeLap = ["\\clap", "\\llap", "\\rlap"]; - -defineFunction({ - type: "lap", - names: ["\\mathllap", "\\mathrlap", "\\mathclap", "\\clap", "\\llap", "\\rlap"], - props: { - numArgs: 1, - allowedInText: true - }, - handler: ({ parser, funcName, token }, args) => { - if (textModeLap.includes(funcName)) { - if (parser.settings.strict && parser.mode !== "text") { - throw new ParseError(`{${funcName}} can be used only in text mode. - Try \\math${funcName.slice(1)}`, token) - } - funcName = funcName.slice(1); - } else { - funcName = funcName.slice(5); - } - const body = args[0]; - return { - type: "lap", - mode: parser.mode, - alignment: funcName, - body - } - }, - mathmlBuilder: (group, style) => { - // mathllap, mathrlap, mathclap - let strut; - if (group.alignment === "llap") { - // We need an invisible strut with the same depth as the group. - // We can't just read the depth, so we use \vphantom methods. - const phantomInner = buildExpression(ordargument(group.body), style); - const phantom = new mathMLTree.MathNode("mphantom", phantomInner); - strut = new mathMLTree.MathNode("mpadded", [phantom]); - strut.setAttribute("width", "0px"); - } - - const inner = buildGroup$1(group.body, style); - let node; - if (group.alignment === "llap") { - inner.style.position = "absolute"; - inner.style.right = "0"; - inner.style.bottom = `0`; // If we could have read the ink depth, it would go here. - node = new mathMLTree.MathNode("mpadded", [strut, inner]); - } else { - node = new mathMLTree.MathNode("mpadded", [inner]); - } - - if (group.alignment === "rlap") { - if (group.body.body.length > 0 && group.body.body[0].type === "genfrac") { - // In Firefox, a squashes the 3/18em padding of a child \frac. Put it back. - node.setAttribute("lspace", "0.16667em"); - } - } else { - const offset = group.alignment === "llap" ? "-1" : "-0.5"; - node.setAttribute("lspace", offset + "width"); - if (group.alignment === "llap") { - node.style.position = "relative"; - } else { - node.style.display = "flex"; - node.style.justifyContent = "center"; - } - } - node.setAttribute("width", "0px"); - return node - } -}); - -// Switching from text mode back to math mode -defineFunction({ - type: "ordgroup", - names: ["\\(", "$"], - props: { - numArgs: 0, - allowedInText: true, - allowedInMath: false - }, - handler({ funcName, parser }, args) { - const outerMode = parser.mode; - parser.switchMode("math"); - const close = funcName === "\\(" ? "\\)" : "$"; - const body = parser.parseExpression(false, close); - parser.expect(close); - parser.switchMode(outerMode); - return { - type: "ordgroup", - mode: parser.mode, - body - }; - } -}); - -// Check for extra closing math delimiters -defineFunction({ - type: "text", // Doesn't matter what this is. - names: ["\\)", "\\]"], - props: { - numArgs: 0, - allowedInText: true, - allowedInMath: false - }, - handler(context, token) { - throw new ParseError(`Mismatched ${context.funcName}`, token); - } -}); - -const chooseStyle = (group, style) => { - switch (style.level) { - case StyleLevel.DISPLAY: // 0 - return group.display; - case StyleLevel.TEXT: // 1 - return group.text; - case StyleLevel.SCRIPT: // 2 - return group.script; - case StyleLevel.SCRIPTSCRIPT: // 3 - return group.scriptscript; - default: - return group.text; - } -}; - -defineFunction({ - type: "mathchoice", - names: ["\\mathchoice"], - props: { - numArgs: 4, - primitive: true - }, - handler: ({ parser }, args) => { - return { - type: "mathchoice", - mode: parser.mode, - display: ordargument(args[0]), - text: ordargument(args[1]), - script: ordargument(args[2]), - scriptscript: ordargument(args[3]) - }; - }, - mathmlBuilder: (group, style) => { - const body = chooseStyle(group, style); - return buildExpressionRow(body, style); - } -}); - -const textAtomTypes = ["text", "textord", "mathord", "atom"]; - -const padding = width => { - const node = new mathMLTree.MathNode("mspace"); - node.setAttribute("width", width + "em"); - return node -}; - -function mathmlBuilder$3(group, style) { - let node; - const inner = buildExpression(group.body, style); - - if (group.mclass === "minner") { - node = new mathMLTree.MathNode("mpadded", inner); - } else if (group.mclass === "mord") { - if (group.isCharacterBox || inner[0].type === "mathord") { - node = inner[0]; - node.type = "mi"; - if (node.children.length === 1 && node.children[0].text && node.children[0].text === "∇") { - node.setAttribute("mathvariant", "normal"); - } - } else { - node = new mathMLTree.MathNode("mi", inner); - } - } else { - node = new mathMLTree.MathNode("mrow", inner); - if (group.mustPromote) { - node = inner[0]; - node.type = "mo"; - if (group.isCharacterBox && group.body[0].text && /[A-Za-z]/.test(group.body[0].text)) { - node.setAttribute("mathvariant", "italic"); - } - } else { - node = new mathMLTree.MathNode("mrow", inner); - } - - // Set spacing based on what is the most likely adjacent atom type. - // See TeXbook p170. - const doSpacing = style.level < 2; // Operator spacing is zero inside a (sub|super)script. - if (node.type === "mrow") { - if (doSpacing ) { - if (group.mclass === "mbin") { - // medium space - node.children.unshift(padding(0.2222)); - node.children.push(padding(0.2222)); - } else if (group.mclass === "mrel") { - // thickspace - node.children.unshift(padding(0.2778)); - node.children.push(padding(0.2778)); - } else if (group.mclass === "mpunct") { - node.children.push(padding(0.1667)); - } else if (group.mclass === "minner") { - node.children.unshift(padding(0.0556)); // 1 mu is the most likely option - node.children.push(padding(0.0556)); - } - } - } else { - if (group.mclass === "mbin") { - // medium space - node.attributes.lspace = (doSpacing ? "0.2222em" : "0"); - node.attributes.rspace = (doSpacing ? "0.2222em" : "0"); - } else if (group.mclass === "mrel") { - // thickspace - node.attributes.lspace = (doSpacing ? "0.2778em" : "0"); - node.attributes.rspace = (doSpacing ? "0.2778em" : "0"); - } else if (group.mclass === "mpunct") { - node.attributes.lspace = "0em"; - node.attributes.rspace = (doSpacing ? "0.1667em" : "0"); - } else if (group.mclass === "mopen" || group.mclass === "mclose") { - node.attributes.lspace = "0em"; - node.attributes.rspace = "0em"; - } else if (group.mclass === "minner" && doSpacing) { - node.attributes.lspace = "0.0556em"; // 1 mu is the most likely option - node.attributes.width = "+0.1111em"; - } - } - - if (!(group.mclass === "mopen" || group.mclass === "mclose")) { - delete node.attributes.stretchy; - delete node.attributes.form; - } - } - return node; -} - -// Math class commands except \mathop -defineFunction({ - type: "mclass", - names: [ - "\\mathord", - "\\mathbin", - "\\mathrel", - "\\mathopen", - "\\mathclose", - "\\mathpunct", - "\\mathinner" - ], - props: { - numArgs: 1, - primitive: true - }, - handler({ parser, funcName }, args) { - const body = args[0]; - const isCharacterBox = utils.isCharacterBox(body); - // We should not wrap a around a or . That would be invalid MathML. - // In that case, we instead promote the text contents of the body to the parent. - let mustPromote = true; - const mord = { type: "mathord", text: "", mode: parser.mode }; - const arr = (body.body) ? body.body : [body]; - for (const arg of arr) { - if (textAtomTypes.includes(arg.type)) { - if (symbols[parser.mode][arg.text]) { - mord.text += symbols[parser.mode][arg.text].replace; - } else if (arg.text) { - mord.text += arg.text; - } else if (arg.body) { - arg.body.map(e => { mord.text += e.text; }); - } - } else { - mustPromote = false; - break - } - } - return { - type: "mclass", - mode: parser.mode, - mclass: "m" + funcName.slice(5), - body: ordargument(mustPromote ? mord : body), - isCharacterBox, - mustPromote - }; - }, - mathmlBuilder: mathmlBuilder$3 -}); - -const binrelClass = (arg) => { - // \binrel@ spacing varies with (bin|rel|ord) of the atom in the argument. - // (by rendering separately and with {}s before and after, and measuring - // the change in spacing). We'll do roughly the same by detecting the - // atom type directly. - const atom = arg.type === "ordgroup" && arg.body.length ? arg.body[0] : arg; - if (atom.type === "atom" && (atom.family === "bin" || atom.family === "rel")) { - return "m" + atom.family; - } else { - return "mord"; - } -}; - -// \@binrel{x}{y} renders like y but as mbin/mrel/mord if x is mbin/mrel/mord. -// This is equivalent to \binrel@{x}\binrel@@{y} in AMSTeX. -defineFunction({ - type: "mclass", - names: ["\\@binrel"], - props: { - numArgs: 2 - }, - handler({ parser }, args) { - return { - type: "mclass", - mode: parser.mode, - mclass: binrelClass(args[0]), - body: ordargument(args[1]), - isCharacterBox: utils.isCharacterBox(args[1]) - }; - } -}); - -// Build a relation or stacked op by placing one symbol on top of another -defineFunction({ - type: "mclass", - names: ["\\stackrel", "\\overset", "\\underset"], - props: { - numArgs: 2 - }, - handler({ parser, funcName }, args) { - const baseArg = args[1]; - const shiftedArg = args[0]; - - const baseOp = { - type: "op", - mode: baseArg.mode, - limits: true, - alwaysHandleSupSub: true, - parentIsSupSub: false, - symbol: false, - stack: true, - suppressBaseShift: funcName !== "\\stackrel", - body: ordargument(baseArg) - }; - - return { - type: "supsub", - mode: shiftedArg.mode, - base: baseOp, - sup: funcName === "\\underset" ? null : shiftedArg, - sub: funcName === "\\underset" ? shiftedArg : null - }; - }, - mathmlBuilder: mathmlBuilder$3 -}); - -// Helper function -const buildGroup = (el, style, noneNode) => { - if (!el) { return noneNode } - const node = buildGroup$1(el, style); - if (node.type === "mrow" && node.children.length === 0) { return noneNode } - return node -}; - -defineFunction({ - type: "multiscript", - names: ["\\sideset", "\\pres@cript"], // See macros.js for \prescript - props: { - numArgs: 3 - }, - handler({ parser, funcName, token }, args) { - if (args[2].body.length === 0) { - throw new ParseError(funcName + `cannot parse an empty base.`) - } - const base = args[2].body[0]; - if (parser.settings.strict && funcName === "\\sideset" && !base.symbol) { - throw new ParseError(`The base of \\sideset must be a big operator. Try \\prescript.`) - } - - if ((args[0].body.length > 0 && args[0].body[0].type !== "supsub") || - (args[1].body.length > 0 && args[1].body[0].type !== "supsub")) { - throw new ParseError("\\sideset can parse only subscripts and " + - "superscripts in its first two arguments", token) - } - - // The prescripts and postscripts come wrapped in a supsub. - const prescripts = args[0].body.length > 0 ? args[0].body[0] : null; - const postscripts = args[1].body.length > 0 ? args[1].body[0] : null; - - if (!prescripts && !postscripts) { - return base - } else if (!prescripts) { - // It's not a multi-script. Get a \textstyle supsub. - return { - type: "styling", - mode: parser.mode, - scriptLevel: "text", - body: [{ - type: "supsub", - mode: parser.mode, - base, - sup: postscripts.sup, - sub: postscripts.sub - }] - } - } else { - return { - type: "multiscript", - mode: parser.mode, - isSideset: funcName === "\\sideset", - prescripts, - postscripts, - base - } - } - }, - mathmlBuilder(group, style) { - const base = buildGroup$1(group.base, style); - - const prescriptsNode = new mathMLTree.MathNode("mprescripts"); - const noneNode = new mathMLTree.MathNode("none"); - let children = []; - - const preSub = buildGroup(group.prescripts.sub, style, noneNode); - const preSup = buildGroup(group.prescripts.sup, style, noneNode); - if (group.isSideset) { - // This seems silly, but LaTeX does this. Firefox ignores it, which does not make me sad. - preSub.setAttribute("style", "text-align: left;"); - preSup.setAttribute("style", "text-align: left;"); - } - - if (group.postscripts) { - const postSub = buildGroup(group.postscripts.sub, style, noneNode); - const postSup = buildGroup(group.postscripts.sup, style, noneNode); - children = [base, postSub, postSup, prescriptsNode, preSub, preSup]; - } else { - children = [base, prescriptsNode, preSub, preSup]; - } - - return new mathMLTree.MathNode("mmultiscripts", children); - } -}); - -defineFunction({ - type: "not", - names: ["\\not"], - props: { - numArgs: 1, - primitive: true, - allowedInText: false - }, - handler({ parser }, args) { - const isCharacterBox = utils.isCharacterBox(args[0]); - let body; - if (isCharacterBox) { - body = ordargument(args[0]); - if (body[0].text.charAt(0) === "\\") { - body[0].text = symbols.math[body[0].text].replace; - } - // \u0338 is the Unicode Combining Long Solidus Overlay - body[0].text = body[0].text.slice(0, 1) + "\u0338" + body[0].text.slice(1); - } else { - // When the argument is not a character box, TeX does an awkward, poorly placed overlay. - // We'll do the same. - const notNode = { type: "textord", mode: "math", text: "\u0338" }; - const kernNode = { type: "kern", mode: "math", dimension: { number: -0.6, unit: "em" } }; - body = [notNode, kernNode, args[0]]; - } - return { - type: "not", - mode: parser.mode, - body, - isCharacterBox - }; - }, - mathmlBuilder(group, style) { - if (group.isCharacterBox) { - const inner = buildExpression(group.body, style, true); - return inner[0] - } else { - return buildExpressionRow(group.body, style) - } - } -}); - -// Limits, symbols - -// Some helpers - -const ordAtomTypes = ["textord", "mathord", "atom"]; - -// Most operators have a large successor symbol, but these don't. -const noSuccessor = ["\\smallint"]; - -// Math operators (e.g. \sin) need a space between these types and themselves: -const ordTypes = ["textord", "mathord", "ordgroup", "close", "leftright"]; - -// NOTE: Unlike most `builders`s, this one handles not only "op", but also -// "supsub" since some of them (like \int) can affect super/subscripting. - -const setSpacing = node => { - // The user wrote a \mathop{…} function. Change spacing from default to OP spacing. - // The most likely spacing for an OP is a thin space per TeXbook p170. - node.attributes.lspace = "0.1667em"; - node.attributes.rspace = "0.1667em"; -}; - -const mathmlBuilder$2 = (group, style) => { - let node; - - if (group.symbol) { - // This is a symbol. Just add the symbol. - node = new MathNode("mo", [makeText(group.name, group.mode)]); - if (noSuccessor.includes(group.name)) { - node.setAttribute("largeop", "false"); - } else { - node.setAttribute("movablelimits", "false"); - } - if (group.fromMathOp) { setSpacing(node); } - } else if (group.body) { - // This is an operator with children. Add them. - node = new MathNode("mo", buildExpression(group.body, style)); - if (group.fromMathOp) { setSpacing(node); } - } else { - // This is a text operator. Add all of the characters from the operator's name. - node = new MathNode("mi", [new TextNode(group.name.slice(1))]); - - if (!group.parentIsSupSub) { - // Append an invisible . - // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4 - const operator = new MathNode("mo", [makeText("\u2061", "text")]); - const row = [node, operator]; - // Set spacing - if (group.needsLeadingSpace) { - const lead = new MathNode("mspace"); - lead.setAttribute("width", "0.1667em"); // thin space. - row.unshift(lead); - } - if (!group.isFollowedByDelimiter) { - const trail = new MathNode("mspace"); - trail.setAttribute("width", "0.1667em"); // thin space. - row.push(trail); - } - node = new MathNode("mrow", row); - } - } - - return node; -}; - -const singleCharBigOps = { - "\u220F": "\\prod", - "\u2210": "\\coprod", - "\u2211": "\\sum", - "\u22c0": "\\bigwedge", - "\u22c1": "\\bigvee", - "\u22c2": "\\bigcap", - "\u22c3": "\\bigcup", - "\u2a00": "\\bigodot", - "\u2a01": "\\bigoplus", - "\u2a02": "\\bigotimes", - "\u2a04": "\\biguplus", - "\u2a05": "\\bigsqcap", - "\u2a06": "\\bigsqcup", - "\u2a09": "\\bigtimes" -}; - -defineFunction({ - type: "op", - names: [ - "\\coprod", - "\\bigvee", - "\\bigwedge", - "\\biguplus", - "\\bigcap", - "\\bigcup", - "\\intop", - "\\prod", - "\\sum", - "\\bigotimes", - "\\bigoplus", - "\\bigodot", - "\\bigsqcap", - "\\bigsqcup", - "\\bigtimes", - "\\smallint", - "\u220F", - "\u2210", - "\u2211", - "\u22c0", - "\u22c1", - "\u22c2", - "\u22c3", - "\u2a00", - "\u2a01", - "\u2a02", - "\u2a04", - "\u2a06" - ], - props: { - numArgs: 0 - }, - handler: ({ parser, funcName }, args) => { - let fName = funcName; - if (fName.length === 1) { - fName = singleCharBigOps[fName]; - } - return { - type: "op", - mode: parser.mode, - limits: true, - parentIsSupSub: false, - symbol: true, - stack: false, // This is true for \stackrel{}, not here. - name: fName - }; - }, - mathmlBuilder: mathmlBuilder$2 -}); - -// Note: calling defineFunction with a type that's already been defined only -// works because the same mathmlBuilder is being used. -defineFunction({ - type: "op", - names: ["\\mathop"], - props: { - numArgs: 1, - primitive: true - }, - handler: ({ parser }, args) => { - const body = args[0]; - // It would be convienient to just wrap a around the argument. - // But if the argument is a or , that would be invalid MathML. - // In that case, we instead promote the text contents of the body to the parent. - const arr = (body.body) ? body.body : [body]; - const isSymbol = arr.length === 1 && ordAtomTypes.includes(arr[0].type); - return { - type: "op", - mode: parser.mode, - limits: true, - parentIsSupSub: false, - symbol: isSymbol, - fromMathOp: true, - stack: false, - name: isSymbol ? arr[0].text : null, - body: isSymbol ? null : ordargument(body) - }; - }, - mathmlBuilder: mathmlBuilder$2 -}); - -// There are 2 flags for operators; whether they produce limits in -// displaystyle, and whether they are symbols and should grow in -// displaystyle. These four groups cover the four possible choices. - -const singleCharIntegrals = { - "\u222b": "\\int", - "\u222c": "\\iint", - "\u222d": "\\iiint", - "\u222e": "\\oint", - "\u222f": "\\oiint", - "\u2230": "\\oiiint", - "\u2231": "\\intclockwise", - "\u2232": "\\varointclockwise", - "\u2a0c": "\\iiiint", - "\u2a0d": "\\intbar", - "\u2a0e": "\\intBar", - "\u2a0f": "\\fint", - "\u2a12": "\\rppolint", - "\u2a13": "\\scpolint", - "\u2a15": "\\pointint", - "\u2a16": "\\sqint", - "\u2a17": "\\intlarhk", - "\u2a18": "\\intx", - "\u2a19": "\\intcap", - "\u2a1a": "\\intcup" -}; - -// No limits, not symbols -defineFunction({ - type: "op", - names: [ - "\\arcsin", - "\\arccos", - "\\arctan", - "\\arctg", - "\\arcctg", - "\\arg", - "\\ch", - "\\cos", - "\\cosec", - "\\cosh", - "\\cot", - "\\cotg", - "\\coth", - "\\csc", - "\\ctg", - "\\cth", - "\\deg", - "\\dim", - "\\exp", - "\\hom", - "\\ker", - "\\lg", - "\\ln", - "\\log", - "\\sec", - "\\sin", - "\\sinh", - "\\sh", - "\\sgn", - "\\tan", - "\\tanh", - "\\tg", - "\\th" - ], - props: { - numArgs: 0 - }, - handler({ parser, funcName }) { - const prevAtomType = parser.prevAtomType; - const next = parser.gullet.future().text; - return { - type: "op", - mode: parser.mode, - limits: false, - parentIsSupSub: false, - symbol: false, - stack: false, - isFollowedByDelimiter: isDelimiter(next), - needsLeadingSpace: prevAtomType.length > 0 && ordTypes.includes(prevAtomType), - name: funcName - }; - }, - mathmlBuilder: mathmlBuilder$2 -}); - -// Limits, not symbols -defineFunction({ - type: "op", - names: ["\\det", "\\gcd", "\\inf", "\\lim", "\\max", "\\min", "\\Pr", "\\sup"], - props: { - numArgs: 0 - }, - handler({ parser, funcName }) { - const prevAtomType = parser.prevAtomType; - const next = parser.gullet.future().text; - return { - type: "op", - mode: parser.mode, - limits: true, - parentIsSupSub: false, - symbol: false, - stack: false, - isFollowedByDelimiter: isDelimiter(next), - needsLeadingSpace: prevAtomType.length > 0 && ordTypes.includes(prevAtomType), - name: funcName - }; - }, - mathmlBuilder: mathmlBuilder$2 -}); - -// No limits, symbols -defineFunction({ - type: "op", - names: [ - "\\int", - "\\iint", - "\\iiint", - "\\iiiint", - "\\oint", - "\\oiint", - "\\oiiint", - "\\intclockwise", - "\\varointclockwise", - "\\intbar", - "\\intBar", - "\\fint", - "\\rppolint", - "\\scpolint", - "\\pointint", - "\\sqint", - "\\intlarhk", - "\\intx", - "\\intcap", - "\\intcup", - "\u222b", - "\u222c", - "\u222d", - "\u222e", - "\u222f", - "\u2230", - "\u2231", - "\u2232", - "\u2a0c", - "\u2a0d", - "\u2a0e", - "\u2a0f", - "\u2a12", - "\u2a13", - "\u2a15", - "\u2a16", - "\u2a17", - "\u2a18", - "\u2a19", - "\u2a1a" - ], - props: { - numArgs: 0 - }, - handler({ parser, funcName }) { - let fName = funcName; - if (fName.length === 1) { - fName = singleCharIntegrals[fName]; - } - return { - type: "op", - mode: parser.mode, - limits: false, - parentIsSupSub: false, - symbol: true, - stack: false, - name: fName - }; - }, - mathmlBuilder: mathmlBuilder$2 -}); - -/** - * All registered global/built-in macros. - * `macros.js` exports this same dictionary again and makes it public. - * `Parser.js` requires this dictionary via `macros.js`. - */ -const _macros = {}; - -// This function might one day accept an additional argument and do more things. -function defineMacro(name, body) { - _macros[name] = body; -} - -// NOTE: Unlike most builders, this one handles not only -// "operatorname", but also "supsub" since \operatorname* can -// affect super/subscripting. - -const mathmlBuilder$1 = (group, style) => { - let expression = buildExpression(group.body, style.withFont("mathrm")); - - // Is expression a string or has it something like a fraction? - let isAllString = true; // default - for (let i = 0; i < expression.length; i++) { - let node = expression[i]; - if (node instanceof mathMLTree.MathNode) { - if (node.type === "mrow" && node.children.length === 1 && - node.children[0] instanceof mathMLTree.MathNode) { - node = node.children[0]; - } - switch (node.type) { - case "mi": - case "mn": - case "ms": - case "mtext": - break; // Do nothing yet. - case "mspace": - { - if (node.attributes.width) { - const width = node.attributes.width.replace("em", ""); - const ch = spaceCharacter(Number(width)); - if (ch === "") { - isAllString = false; - } else { - expression[i] = new mathMLTree.MathNode("mtext", [new mathMLTree.TextNode(ch)]); - } - } - } - break - case "mo": { - const child = node.children[0]; - if (node.children.length === 1 && child instanceof mathMLTree.TextNode) { - child.text = child.text.replace(/\u2212/, "-").replace(/\u2217/, "*"); - } else { - isAllString = false; - } - break - } - default: - isAllString = false; - } - } else { - isAllString = false; - } - } - - if (isAllString) { - // Write a single TextNode instead of multiple nested tags. - const word = expression.map((node) => node.toText()).join(""); - expression = [new mathMLTree.TextNode(word)]; - } else if ( - expression.length === 1 - && ["mover", "munder"].includes(expression[0].type) && - (expression[0].children[0].type === "mi" || expression[0].children[0].type === "mtext") - ) { - expression[0].children[0].type = "mi"; - if (group.parentIsSupSub) { - return new mathMLTree.MathNode("mrow", expression) - } else { - const operator = new mathMLTree.MathNode("mo", [makeText("\u2061", "text")]); - return mathMLTree.newDocumentFragment([expression[0], operator]) - } - } - - let wrapper; - if (isAllString) { - wrapper = new mathMLTree.MathNode("mi", expression); - if (expression[0].text.length === 1) { - wrapper.setAttribute("mathvariant", "normal"); - } - } else { - wrapper = new mathMLTree.MathNode("mrow", expression); - } - - if (!group.parentIsSupSub) { - // Append an . - // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4 - const operator = new mathMLTree.MathNode("mo", [makeText("\u2061", "text")]); - const fragment = [wrapper, operator]; - if (group.needsLeadingSpace) { - // LaTeX gives operator spacing, but a gets ord spacing. - // So add a leading space. - const space = new mathMLTree.MathNode("mspace"); - space.setAttribute("width", "0.1667em"); // thin space. - fragment.unshift(space); - } - if (!group.isFollowedByDelimiter) { - const trail = new mathMLTree.MathNode("mspace"); - trail.setAttribute("width", "0.1667em"); // thin space. - fragment.push(trail); - } - return mathMLTree.newDocumentFragment(fragment) - } - - return wrapper -}; - -// \operatorname -// amsopn.dtx: \mathop{#1\kern\z@\operator@font#3}\newmcodes@ -defineFunction({ - type: "operatorname", - names: ["\\operatorname@", "\\operatornamewithlimits"], - props: { - numArgs: 1, - allowedInArgument: true - }, - handler: ({ parser, funcName }, args) => { - const body = args[0]; - const prevAtomType = parser.prevAtomType; - const next = parser.gullet.future().text; - return { - type: "operatorname", - mode: parser.mode, - body: ordargument(body), - alwaysHandleSupSub: (funcName === "\\operatornamewithlimits"), - limits: false, - parentIsSupSub: false, - isFollowedByDelimiter: isDelimiter(next), - needsLeadingSpace: prevAtomType.length > 0 && ordTypes.includes(prevAtomType) - }; - }, - mathmlBuilder: mathmlBuilder$1 -}); - -defineMacro("\\operatorname", - "\\@ifstar\\operatornamewithlimits\\operatorname@"); - -defineFunctionBuilders({ - type: "ordgroup", - mathmlBuilder(group, style) { - return buildExpressionRow(group.body, style, group.semisimple); - } -}); - -defineFunction({ - type: "phantom", - names: ["\\phantom"], - props: { - numArgs: 1, - allowedInText: true - }, - handler: ({ parser }, args) => { - const body = args[0]; - return { - type: "phantom", - mode: parser.mode, - body: ordargument(body) - }; - }, - mathmlBuilder: (group, style) => { - const inner = buildExpression(group.body, style); - return new mathMLTree.MathNode("mphantom", inner); - } -}); - -defineFunction({ - type: "hphantom", - names: ["\\hphantom"], - props: { - numArgs: 1, - allowedInText: true - }, - handler: ({ parser }, args) => { - const body = args[0]; - return { - type: "hphantom", - mode: parser.mode, - body - }; - }, - mathmlBuilder: (group, style) => { - const inner = buildExpression(ordargument(group.body), style); - const phantom = new mathMLTree.MathNode("mphantom", inner); - const node = new mathMLTree.MathNode("mpadded", [phantom]); - node.setAttribute("height", "0px"); - node.setAttribute("depth", "0px"); - return node; - } -}); - -defineFunction({ - type: "vphantom", - names: ["\\vphantom"], - props: { - numArgs: 1, - allowedInText: true - }, - handler: ({ parser }, args) => { - const body = args[0]; - return { - type: "vphantom", - mode: parser.mode, - body - }; - }, - mathmlBuilder: (group, style) => { - const inner = buildExpression(ordargument(group.body), style); - const phantom = new mathMLTree.MathNode("mphantom", inner); - const node = new mathMLTree.MathNode("mpadded", [phantom]); - node.setAttribute("width", "0px"); - return node; - } -}); - -// In LaTeX, \pmb is a simulation of bold font. -// The version of \pmb in ambsy.sty works by typesetting three copies of the argument -// with small offsets. We use CSS font-weight:bold. - -defineFunction({ - type: "pmb", - names: ["\\pmb"], - props: { - numArgs: 1, - allowedInText: true - }, - handler({ parser }, args) { - return { - type: "pmb", - mode: parser.mode, - body: ordargument(args[0]) - } - }, - mathmlBuilder(group, style) { - const inner = buildExpression(group.body, style); - // Wrap with an element. - const node = wrapWithMstyle(inner); - node.setAttribute("style", "font-weight:bold"); - return node - } -}); - -// \raise, \lower, and \raisebox - -const mathmlBuilder = (group, style) => { - const newStyle = style.withLevel(StyleLevel.TEXT); - const node = new mathMLTree.MathNode("mpadded", [buildGroup$1(group.body, newStyle)]); - const dy = calculateSize(group.dy, style); - node.setAttribute("voffset", dy.number + dy.unit); - // Add padding, which acts to increase height in Chromium. - // TODO: Figure out some way to change height in Firefox w/o breaking Chromium. - if (dy.number > 0) { - node.style.padding = dy.number + dy.unit + " 0 0 0"; - } else { - node.style.padding = "0 0 " + Math.abs(dy.number) + dy.unit + " 0"; - } - return node -}; - -defineFunction({ - type: "raise", - names: ["\\raise", "\\lower"], - props: { - numArgs: 2, - argTypes: ["size", "primitive"], - primitive: true - }, - handler({ parser, funcName }, args) { - const amount = assertNodeType(args[0], "size").value; - if (funcName === "\\lower") { amount.number *= -1; } - const body = args[1]; - return { - type: "raise", - mode: parser.mode, - dy: amount, - body - }; - }, - mathmlBuilder -}); - - -defineFunction({ - type: "raise", - names: ["\\raisebox"], - props: { - numArgs: 2, - argTypes: ["size", "hbox"], - allowedInText: true - }, - handler({ parser, funcName }, args) { - const amount = assertNodeType(args[0], "size").value; - const body = args[1]; - return { - type: "raise", - mode: parser.mode, - dy: amount, - body - }; - }, - mathmlBuilder -}); - -defineFunction({ - type: "ref", - names: ["\\ref", "\\eqref"], - props: { - numArgs: 1, - argTypes: ["raw"] - }, - handler({ parser, funcName }, args) { - return { - type: "ref", - mode: parser.mode, - funcName, - string: args[0].string.replace(invalidIdRegEx, "") - }; - }, - mathmlBuilder(group, style) { - // Create an empty text node. Set a class and an href. - // The post-processor will populate with the target's tag or equation number. - const classes = group.funcName === "\\ref" ? ["tml-ref"] : ["tml-ref", "tml-eqref"]; - const node = new mathMLTree.MathNode("mtext", [new mathMLTree.TextNode("")], classes); - node.setAttribute("href", "#" + group.string); - return node - } -}); - -defineFunction({ - type: "reflect", - names: ["\\reflectbox"], - props: { - numArgs: 1, - argTypes: ["hbox"], - allowedInText: true - }, - handler({ parser }, args) { - return { - type: "reflect", - mode: parser.mode, - body: args[0] - }; - }, - mathmlBuilder(group, style) { - const node = buildGroup$1(group.body, style); - node.style.transform = "scaleX(-1)"; - return node - } -}); - -defineFunction({ - type: "internal", - names: ["\\relax"], - props: { - numArgs: 0, - allowedInText: true - }, - handler({ parser }) { - return { - type: "internal", - mode: parser.mode - }; - } -}); - -defineFunction({ - type: "rule", - names: ["\\rule"], - props: { - numArgs: 2, - numOptionalArgs: 1, - argTypes: ["size", "size", "size"] - }, - handler({ parser }, args, optArgs) { - const shift = optArgs[0]; - const width = assertNodeType(args[0], "size"); - const height = assertNodeType(args[1], "size"); - return { - type: "rule", - mode: parser.mode, - shift: shift && assertNodeType(shift, "size").value, - width: width.value, - height: height.value - }; - }, - mathmlBuilder(group, style) { - const width = calculateSize(group.width, style); - const height = calculateSize(group.height, style); - const shift = group.shift - ? calculateSize(group.shift, style) - : { number: 0, unit: "em" }; - const color = (style.color && style.getColor()) || "black"; - - const rule = new mathMLTree.MathNode("mspace"); - if (width.number > 0 && height.number > 0) { - rule.setAttribute("mathbackground", color); - } - rule.setAttribute("width", width.number + width.unit); - rule.setAttribute("height", height.number + height.unit); - if (shift.number === 0) { return rule } - - const wrapper = new mathMLTree.MathNode("mpadded", [rule]); - if (shift.number >= 0) { - wrapper.setAttribute("height", "+" + shift.number + shift.unit); - } else { - wrapper.setAttribute("height", shift.number + shift.unit); - wrapper.setAttribute("depth", "+" + -shift.number + shift.unit); - } - wrapper.setAttribute("voffset", shift.number + shift.unit); - return wrapper; - } -}); - -// The size mappings are taken from TeX with \normalsize=10pt. -// We don't have to track script level. MathML does that. -const sizeMap = { - "\\tiny": 0.5, - "\\sixptsize": 0.6, - "\\Tiny": 0.6, - "\\scriptsize": 0.7, - "\\footnotesize": 0.8, - "\\small": 0.9, - "\\normalsize": 1.0, - "\\large": 1.2, - "\\Large": 1.44, - "\\LARGE": 1.728, - "\\huge": 2.074, - "\\Huge": 2.488 -}; - -defineFunction({ - type: "sizing", - names: [ - "\\tiny", - "\\sixptsize", - "\\Tiny", - "\\scriptsize", - "\\footnotesize", - "\\small", - "\\normalsize", - "\\large", - "\\Large", - "\\LARGE", - "\\huge", - "\\Huge" - ], - props: { - numArgs: 0, - allowedInText: true - }, - handler: ({ breakOnTokenText, funcName, parser }, args) => { - if (parser.settings.strict && parser.mode === "math") { - // eslint-disable-next-line no-console - console.log(`Temml strict-mode warning: Command ${funcName} is invalid in math mode.`); - } - const body = parser.parseExpression(false, breakOnTokenText, true); - return { - type: "sizing", - mode: parser.mode, - funcName, - body - }; - }, - mathmlBuilder: (group, style) => { - const newStyle = style.withFontSize(sizeMap[group.funcName]); - const inner = buildExpression(group.body, newStyle); - // Wrap with an element. - const node = wrapWithMstyle(inner); - const factor = (sizeMap[group.funcName] / style.fontSize).toFixed(4); - node.setAttribute("mathsize", factor + "em"); - return node; - } -}); - -// smash, with optional [tb], as in AMS - -defineFunction({ - type: "smash", - names: ["\\smash"], - props: { - numArgs: 1, - numOptionalArgs: 1, - allowedInText: true - }, - handler: ({ parser }, args, optArgs) => { - let smashHeight = false; - let smashDepth = false; - const tbArg = optArgs[0] && assertNodeType(optArgs[0], "ordgroup"); - if (tbArg) { - // Optional [tb] argument is engaged. - // ref: amsmath: \renewcommand{\smash}[1][tb]{% - // def\mb@t{\ht}\def\mb@b{\dp}\def\mb@tb{\ht\z@\z@\dp}% - let letter = ""; - for (let i = 0; i < tbArg.body.length; ++i) { - const node = tbArg.body[i]; - // TODO: Write an AssertSymbolNode - letter = node.text; - if (letter === "t") { - smashHeight = true; - } else if (letter === "b") { - smashDepth = true; - } else { - smashHeight = false; - smashDepth = false; - break; - } - } - } else { - smashHeight = true; - smashDepth = true; - } - - const body = args[0]; - return { - type: "smash", - mode: parser.mode, - body, - smashHeight, - smashDepth - }; - }, - mathmlBuilder: (group, style) => { - const node = new mathMLTree.MathNode("mpadded", [buildGroup$1(group.body, style)]); - - if (group.smashHeight) { - node.setAttribute("height", "0px"); - } - - if (group.smashDepth) { - node.setAttribute("depth", "0px"); - } - - return node; - } -}); - -defineFunction({ - type: "sqrt", - names: ["\\sqrt"], - props: { - numArgs: 1, - numOptionalArgs: 1 - }, - handler({ parser }, args, optArgs) { - const index = optArgs[0]; - const body = args[0]; - return { - type: "sqrt", - mode: parser.mode, - body, - index - }; - }, - mathmlBuilder(group, style) { - const { body, index } = group; - return index - ? new mathMLTree.MathNode("mroot", [ - buildGroup$1(body, style), - buildGroup$1(index, style.incrementLevel()) - ]) - : new mathMLTree.MathNode("msqrt", [buildGroup$1(body, style)]); - } -}); - -const styleMap = { - display: 0, - text: 1, - script: 2, - scriptscript: 3 -}; - -const styleAttributes = { - display: ["0", "true"], - text: ["0", "false"], - script: ["1", "false"], - scriptscript: ["2", "false"] -}; - -defineFunction({ - type: "styling", - names: ["\\displaystyle", "\\textstyle", "\\scriptstyle", "\\scriptscriptstyle"], - props: { - numArgs: 0, - allowedInText: true, - primitive: true - }, - handler({ breakOnTokenText, funcName, parser }, args) { - // parse out the implicit body - const body = parser.parseExpression(true, breakOnTokenText, true); - - const scriptLevel = funcName.slice(1, funcName.length - 5); - return { - type: "styling", - mode: parser.mode, - // Figure out what scriptLevel to use by pulling out the scriptLevel from - // the function name - scriptLevel, - body - }; - }, - mathmlBuilder(group, style) { - // Figure out what scriptLevel we're changing to. - const newStyle = style.withLevel(styleMap[group.scriptLevel]); - // The style argument in the next line does NOT directly set a MathML script level. - // It just tracks the style level, in case we need to know it for supsub or mathchoice. - const inner = buildExpression(group.body, newStyle); - // Wrap with an element. - const node = wrapWithMstyle(inner); - - const attr = styleAttributes[group.scriptLevel]; - - // Here is where we set the MathML script level. - node.setAttribute("scriptlevel", attr[0]); - node.setAttribute("displaystyle", attr[1]); - - return node; - } -}); - -/** - * Sometimes, groups perform special rules when they have superscripts or - * subscripts attached to them. This function lets the `supsub` group know that - * Sometimes, groups perform special rules when they have superscripts or - * its inner element should handle the superscripts and subscripts instead of - * handling them itself. - */ - -// Helpers -const symbolRegEx = /^m(over|under|underover)$/; - -// Super scripts and subscripts, whose precise placement can depend on other -// functions that precede them. -defineFunctionBuilders({ - type: "supsub", - mathmlBuilder(group, style) { - // Is the inner group a relevant horizonal brace? - let isBrace = false; - let isOver; - let isSup; - let appendApplyFunction = false; - let appendSpace = false; - let needsLeadingSpace = false; - - if (group.base && group.base.type === "horizBrace") { - isSup = !!group.sup; - if (isSup === group.base.isOver) { - isBrace = true; - isOver = group.base.isOver; - } - } - - if (group.base && !group.base.stack && - (group.base.type === "op" || group.base.type === "operatorname")) { - group.base.parentIsSupSub = true; - appendApplyFunction = !group.base.symbol; - appendSpace = appendApplyFunction && !group.isFollowedByDelimiter; - needsLeadingSpace = group.base.needsLeadingSpace; - } - - const children = group.base && group.base.stack - ? [buildGroup$1(group.base.body[0], style)] - : [buildGroup$1(group.base, style)]; - - const childStyle = style.inSubOrSup(); - if (group.sub) { - children.push(buildGroup$1(group.sub, childStyle)); - } - - if (group.sup) { - const sup = buildGroup$1(group.sup, childStyle); - const testNode = sup.type === "mrow" ? sup.children[0] : sup; - if ((testNode.type === "mo" && testNode.classes.includes("tml-prime")) - && group.base && group.base.text && group.base.text === "f") { - // Chromium does not address italic correction on prime. Prevent f′ from overlapping. - testNode.classes.push("prime-pad"); - } - children.push(sup); - } - - let nodeType; - if (isBrace) { - nodeType = isOver ? "mover" : "munder"; - } else if (!group.sub) { - const base = group.base; - if ( - base && - base.type === "op" && - base.limits && - (style.level === StyleLevel.DISPLAY || base.alwaysHandleSupSub) - ) { - nodeType = "mover"; - } else if ( - base && - base.type === "operatorname" && - base.alwaysHandleSupSub && - (base.limits || style.level === StyleLevel.DISPLAY) - ) { - nodeType = "mover"; - } else { - nodeType = "msup"; - } - } else if (!group.sup) { - const base = group.base; - if ( - base && - base.type === "op" && - base.limits && - (style.level === StyleLevel.DISPLAY || base.alwaysHandleSupSub) - ) { - nodeType = "munder"; - } else if ( - base && - base.type === "operatorname" && - base.alwaysHandleSupSub && - (base.limits || style.level === StyleLevel.DISPLAY) - ) { - nodeType = "munder"; - } else { - nodeType = "msub"; - } - } else { - const base = group.base; - if (base && ((base.type === "op" && base.limits) || base.type === "multiscript") && - (style.level === StyleLevel.DISPLAY || base.alwaysHandleSupSub) - ) { - nodeType = "munderover"; - } else if ( - base && - base.type === "operatorname" && - base.alwaysHandleSupSub && - (style.level === StyleLevel.DISPLAY || base.limits) - ) { - nodeType = "munderover"; - } else { - nodeType = "msubsup"; - } - } - - let node = new mathMLTree.MathNode(nodeType, children); - if (appendApplyFunction) { - // Append an . - // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4 - const operator = new mathMLTree.MathNode("mo", [makeText("\u2061", "text")]); - if (needsLeadingSpace) { - const space = new mathMLTree.MathNode("mspace"); - space.setAttribute("width", "0.1667em"); // thin space. - node = mathMLTree.newDocumentFragment([space, node, operator]); - } else { - node = mathMLTree.newDocumentFragment([node, operator]); - } - if (appendSpace) { - const space = new mathMLTree.MathNode("mspace"); - space.setAttribute("width", "0.1667em"); // thin space. - node.children.push(space); - } - } else if (symbolRegEx.test(nodeType)) { - // Wrap in a . Otherwise Firefox stretchy parens will not stretch to include limits. - node = new mathMLTree.MathNode("mrow", [node]); - } - - return node - } -}); - -// Operator ParseNodes created in Parser.js from symbol Groups in src/symbols.js. - -const short = ["\\shortmid", "\\nshortmid", "\\shortparallel", - "\\nshortparallel", "\\smallsetminus"]; - -const arrows = ["\\Rsh", "\\Lsh", "\\restriction"]; - -const isArrow = str => { - if (str.length === 1) { - const codePoint = str.codePointAt(0); - return (0x218f < codePoint && codePoint < 0x2200) - } - return str.indexOf("arrow") > -1 || str.indexOf("harpoon") > -1 || arrows.includes(str) -}; - -defineFunctionBuilders({ - type: "atom", - mathmlBuilder(group, style) { - const node = new mathMLTree.MathNode("mo", [makeText(group.text, group.mode)]); - if (group.family === "punct") { - node.setAttribute("separator", "true"); - } else if (group.family === "open" || group.family === "close") { - // Delims built here should not stretch vertically. - // See delimsizing.js for stretchy delims. - if (group.family === "open") { - node.setAttribute("form", "prefix"); - // Set an explicit attribute for stretch. Otherwise Firefox may do it wrong. - node.setAttribute("stretchy", "false"); - } else if (group.family === "close") { - node.setAttribute("form", "postfix"); - node.setAttribute("stretchy", "false"); - } - } else if (group.text === "\\mid") { - // Firefox messes up this spacing if at the end of an . See it explicitly. - node.setAttribute("lspace", "0.22em"); // medium space - node.setAttribute("rspace", "0.22em"); - node.setAttribute("stretchy", "false"); - } else if (group.family === "rel" && isArrow(group.text)) { - node.setAttribute("stretchy", "false"); - } else if (short.includes(group.text)) { - node.setAttribute("mathsize", "70%"); - } else if (group.text === ":") { - // ":" is not in the MathML operator dictionary. Give it BIN spacing. - node.attributes.lspace = "0.2222em"; - node.attributes.rspace = "0.2222em"; - } - return node; - } -}); - -/** - * Maps TeX font commands to "mathvariant" attribute in buildMathML.js - */ -const fontMap = { - // styles - mathbf: "bold", - mathrm: "normal", - textit: "italic", - mathit: "italic", - mathnormal: "italic", - - // families - mathbb: "double-struck", - mathcal: "script", - mathfrak: "fraktur", - mathscr: "script", - mathsf: "sans-serif", - mathtt: "monospace" -}; - -/** - * Returns the math variant as a string or null if none is required. - */ -const getVariant = function(group, style) { - // Handle font specifiers as best we can. - // Chromium does not support the MathML mathvariant attribute. - // So we'll use Unicode replacement characters instead. - // But first, determine the math variant. - - // Deal with the \textit, \textbf, etc., functions. - if (style.fontFamily === "texttt") { - return "monospace" - } else if (style.fontFamily === "textsc") { - return "normal"; // handled via character substitution in symbolsOrd.js. - } else if (style.fontFamily === "textsf") { - if (style.fontShape === "textit" && style.fontWeight === "textbf") { - return "sans-serif-bold-italic" - } else if (style.fontShape === "textit") { - return "sans-serif-italic" - } else if (style.fontWeight === "textbf") { - return "sans-serif-bold" - } else { - return "sans-serif" - } - } else if (style.fontShape === "textit" && style.fontWeight === "textbf") { - return "bold-italic" - } else if (style.fontShape === "textit") { - return "italic" - } else if (style.fontWeight === "textbf") { - return "bold" - } - - // Deal with the \mathit, mathbf, etc, functions. - const font = style.font; - if (!font || font === "mathnormal") { - return null - } - - const mode = group.mode; - switch (font) { - case "mathit": - return "italic" - case "mathrm": { - const codePoint = group.text.codePointAt(0); - // LaTeX \mathrm returns italic for Greek characters. - return (0x03ab < codePoint && codePoint < 0x03cf) ? "italic" : "normal" - } - case "greekItalic": - return "italic" - case "up@greek": - return "normal" - case "boldsymbol": - case "mathboldsymbol": - return "bold-italic" - case "mathbf": - return "bold" - case "mathbb": - return "double-struck" - case "mathfrak": - return "fraktur" - case "mathscr": - case "mathcal": - return "script" - case "mathsf": - return "sans-serif" - case "mathtt": - return "monospace" - } - - let text = group.text; - if (symbols[mode][text] && symbols[mode][text].replace) { - text = symbols[mode][text].replace; - } - - return Object.prototype.hasOwnProperty.call(fontMap, font) ? fontMap[font] : null -}; - -// Chromium does not support the MathML `mathvariant` attribute. -// Instead, we replace ASCII characters with Unicode characters that -// are defined in the font as bold, italic, double-struck, etc. -// This module identifies those Unicode code points. - -// First, a few helpers. -const script = Object.freeze({ - B: 0x20EA, // Offset from ASCII B to Unicode script B - E: 0x20EB, - F: 0x20EB, - H: 0x20C3, - I: 0x20C7, - L: 0x20C6, - M: 0x20E6, - R: 0x20C9, - e: 0x20CA, - g: 0x20A3, - o: 0x20C5 -}); - -const frak = Object.freeze({ - C: 0x20EA, - H: 0x20C4, - I: 0x20C8, - R: 0x20CA, - Z: 0x20CE -}); - -const bbb = Object.freeze({ - C: 0x20BF, // blackboard bold - H: 0x20C5, - N: 0x20C7, - P: 0x20C9, - Q: 0x20C9, - R: 0x20CB, - Z: 0x20CA -}); - -const bold = Object.freeze({ - "\u03f5": 0x1D2E7, // lunate epsilon - "\u03d1": 0x1D30C, // vartheta - "\u03f0": 0x1D2EE, // varkappa - "\u03c6": 0x1D319, // varphi - "\u03f1": 0x1D2EF, // varrho - "\u03d6": 0x1D30B // varpi -}); - -const boldItalic = Object.freeze({ - "\u03f5": 0x1D35B, // lunate epsilon - "\u03d1": 0x1D380, // vartheta - "\u03f0": 0x1D362, // varkappa - "\u03c6": 0x1D38D, // varphi - "\u03f1": 0x1D363, // varrho - "\u03d6": 0x1D37F // varpi -}); - -const boldsf = Object.freeze({ - "\u03f5": 0x1D395, // lunate epsilon - "\u03d1": 0x1D3BA, // vartheta - "\u03f0": 0x1D39C, // varkappa - "\u03c6": 0x1D3C7, // varphi - "\u03f1": 0x1D39D, // varrho - "\u03d6": 0x1D3B9 // varpi -}); - -const bisf = Object.freeze({ - "\u03f5": 0x1D3CF, // lunate epsilon - "\u03d1": 0x1D3F4, // vartheta - "\u03f0": 0x1D3D6, // varkappa - "\u03c6": 0x1D401, // varphi - "\u03f1": 0x1D3D7, // varrho - "\u03d6": 0x1D3F3 // varpi -}); - -// Code point offsets below are derived from https://www.unicode.org/charts/PDF/U1D400.pdf -const offset = Object.freeze({ - upperCaseLatin: { // A-Z - "normal": ch => { return 0 }, - "bold": ch => { return 0x1D3BF }, - "italic": ch => { return 0x1D3F3 }, - "bold-italic": ch => { return 0x1D427 }, - "script": ch => { return script[ch] || 0x1D45B }, - "script-bold": ch => { return 0x1D48F }, - "fraktur": ch => { return frak[ch] || 0x1D4C3 }, - "fraktur-bold": ch => { return 0x1D52B }, - "double-struck": ch => { return bbb[ch] || 0x1D4F7 }, - "sans-serif": ch => { return 0x1D55F }, - "sans-serif-bold": ch => { return 0x1D593 }, - "sans-serif-italic": ch => { return 0x1D5C7 }, - "sans-serif-bold-italic": ch => { return 0x1D63C }, - "monospace": ch => { return 0x1D62F } - }, - lowerCaseLatin: { // a-z - "normal": ch => { return 0 }, - "bold": ch => { return 0x1D3B9 }, - "italic": ch => { return ch === "h" ? 0x20A6 : 0x1D3ED }, - "bold-italic": ch => { return 0x1D421 }, - "script": ch => { return script[ch] || 0x1D455 }, - "script-bold": ch => { return 0x1D489 }, - "fraktur": ch => { return 0x1D4BD }, - "fraktur-bold": ch => { return 0x1D525 }, - "double-struck": ch => { return 0x1D4F1 }, - "sans-serif": ch => { return 0x1D559 }, - "sans-serif-bold": ch => { return 0x1D58D }, - "sans-serif-italic": ch => { return 0x1D5C1 }, - "sans-serif-bold-italic": ch => { return 0x1D5F5 }, - "monospace": ch => { return 0x1D629 } - }, - upperCaseGreek: { // A-Ω - "normal": ch => { return 0 }, - "bold": ch => { return 0x1D317 }, - "italic": ch => { return 0x1D351 }, - // \boldsymbol actually returns upright bold for upperCaseGreek - "bold-italic": ch => { return 0x1D317 }, - "script": ch => { return 0 }, - "script-bold": ch => { return 0 }, - "fraktur": ch => { return 0 }, - "fraktur-bold": ch => { return 0 }, - "double-struck": ch => { return 0 }, - // Unicode has no code points for regular-weight san-serif Greek. Use bold. - "sans-serif": ch => { return 0x1D3C5 }, - "sans-serif-bold": ch => { return 0x1D3C5 }, - "sans-serif-italic": ch => { return 0 }, - "sans-serif-bold-italic": ch => { return 0x1D3FF }, - "monospace": ch => { return 0 } - }, - lowerCaseGreek: { // α-ω - "normal": ch => { return 0 }, - "bold": ch => { return 0x1D311 }, - "italic": ch => { return 0x1D34B }, - "bold-italic": ch => { return ch === "\u03d5" ? 0x1D37E : 0x1D385 }, - "script": ch => { return 0 }, - "script-bold": ch => { return 0 }, - "fraktur": ch => { return 0 }, - "fraktur-bold": ch => { return 0 }, - "double-struck": ch => { return 0 }, - // Unicode has no code points for regular-weight san-serif Greek. Use bold. - "sans-serif": ch => { return 0x1D3BF }, - "sans-serif-bold": ch => { return 0x1D3BF }, - "sans-serif-italic": ch => { return 0 }, - "sans-serif-bold-italic": ch => { return 0x1D3F9 }, - "monospace": ch => { return 0 } - }, - varGreek: { // \varGamma, etc - "normal": ch => { return 0 }, - "bold": ch => { return bold[ch] || -51 }, - "italic": ch => { return 0 }, - "bold-italic": ch => { return boldItalic[ch] || 0x3A }, - "script": ch => { return 0 }, - "script-bold": ch => { return 0 }, - "fraktur": ch => { return 0 }, - "fraktur-bold": ch => { return 0 }, - "double-struck": ch => { return 0 }, - "sans-serif": ch => { return boldsf[ch] || 0x74 }, - "sans-serif-bold": ch => { return boldsf[ch] || 0x74 }, - "sans-serif-italic": ch => { return 0 }, - "sans-serif-bold-italic": ch => { return bisf[ch] || 0xAE }, - "monospace": ch => { return 0 } - }, - numeral: { // 0-9 - "normal": ch => { return 0 }, - "bold": ch => { return 0x1D79E }, - "italic": ch => { return 0 }, - "bold-italic": ch => { return 0 }, - "script": ch => { return 0 }, - "script-bold": ch => { return 0 }, - "fraktur": ch => { return 0 }, - "fraktur-bold": ch => { return 0 }, - "double-struck": ch => { return 0x1D7A8 }, - "sans-serif": ch => { return 0x1D7B2 }, - "sans-serif-bold": ch => { return 0x1D7BC }, - "sans-serif-italic": ch => { return 0 }, - "sans-serif-bold-italic": ch => { return 0 }, - "monospace": ch => { return 0x1D7C6 } - } -}); - -const variantChar = (ch, variant) => { - const codePoint = ch.codePointAt(0); - const block = 0x40 < codePoint && codePoint < 0x5b - ? "upperCaseLatin" - : 0x60 < codePoint && codePoint < 0x7b - ? "lowerCaseLatin" - : (0x390 < codePoint && codePoint < 0x3AA) - ? "upperCaseGreek" - : 0x3B0 < codePoint && codePoint < 0x3CA || ch === "\u03d5" - ? "lowerCaseGreek" - : 0x1D6E1 < codePoint && codePoint < 0x1D6FC || bold[ch] - ? "varGreek" - : (0x2F < codePoint && codePoint < 0x3A) - ? "numeral" - : "other"; - return block === "other" - ? ch - : String.fromCodePoint(codePoint + offset[block][variant](ch)) -}; - -const smallCaps = Object.freeze({ - a: "ᴀ", - b: "ʙ", - c: "ᴄ", - d: "ᴅ", - e: "ᴇ", - f: "ꜰ", - g: "ɢ", - h: "ʜ", - i: "ɪ", - j: "ᴊ", - k: "ᴋ", - l: "ʟ", - m: "ᴍ", - n: "ɴ", - o: "ᴏ", - p: "ᴘ", - q: "ǫ", - r: "ʀ", - s: "s", - t: "ᴛ", - u: "ᴜ", - v: "ᴠ", - w: "ᴡ", - x: "x", - y: "ʏ", - z: "ᴢ" -}); - -// "mathord" and "textord" ParseNodes created in Parser.js from symbol Groups in -// src/symbols.js. - -const numberRegEx = /^\d(?:[\d,.]*\d)?$/; -const latinRegEx = /[A-Ba-z]/; -const primes = new Set(["\\prime", "\\dprime", "\\trprime", "\\qprime", - "\\backprime", "\\backdprime", "\\backtrprime"]); - -const italicNumber = (text, variant, tag) => { - const mn = new mathMLTree.MathNode(tag, [text]); - const wrapper = new mathMLTree.MathNode("mstyle", [mn]); - wrapper.style["font-style"] = "italic"; - wrapper.style["font-family"] = "Cambria, 'Times New Roman', serif"; - if (variant === "bold-italic") { wrapper.style["font-weight"] = "bold"; } - return wrapper -}; - -defineFunctionBuilders({ - type: "mathord", - mathmlBuilder(group, style) { - const text = makeText(group.text, group.mode, style); - const codePoint = text.text.codePointAt(0); - // Test for upper-case Greek - const defaultVariant = (0x0390 < codePoint && codePoint < 0x03aa) ? "normal" : "italic"; - const variant = getVariant(group, style) || defaultVariant; - if (variant === "script") { - text.text = variantChar(text.text, variant); - return new mathMLTree.MathNode("mi", [text], [style.font]) - } else if (variant !== "italic") { - text.text = variantChar(text.text, variant); - } - let node = new mathMLTree.MathNode("mi", [text]); - // TODO: Handle U+1D49C - U+1D4CF per https://www.unicode.org/charts/PDF/U1D400.pdf - if (variant === "normal") { - node.setAttribute("mathvariant", "normal"); - if (text.text.length === 1) { - // A Firefox bug will apply spacing here, but there should be none. Fix it. - node = new mathMLTree.MathNode("mrow", [node]); - } - } - return node - } -}); - -defineFunctionBuilders({ - type: "textord", - mathmlBuilder(group, style) { - let ch = group.text; - const codePoint = ch.codePointAt(0); - if (style.fontFamily === "textsc") { - // Convert small latin letters to small caps. - if (96 < codePoint && codePoint < 123) { - ch = smallCaps[ch]; - } - } - const text = makeText(ch, group.mode, style); - const variant = getVariant(group, style) || "normal"; - - let node; - if (numberRegEx.test(group.text)) { - const tag = group.mode === "text" ? "mtext" : "mn"; - if (variant === "italic" || variant === "bold-italic") { - return italicNumber(text, variant, tag) - } else { - if (variant !== "normal") { - text.text = text.text.split("").map(c => variantChar(c, variant)).join(""); - } - node = new mathMLTree.MathNode(tag, [text]); - } - } else if (group.mode === "text") { - if (variant !== "normal") { - text.text = variantChar(text.text, variant); - } - node = new mathMLTree.MathNode("mtext", [text]); - } else if (primes.has(group.text)) { - node = new mathMLTree.MathNode("mo", [text]); - // TODO: If/when Chromium uses ssty variant for prime, remove the next line. - node.classes.push("tml-prime"); - } else { - const origText = text.text; - if (variant !== "italic") { - text.text = variantChar(text.text, variant); - } - node = new mathMLTree.MathNode("mi", [text]); - if (text.text === origText && latinRegEx.test(origText)) { - node.setAttribute("mathvariant", "italic"); - } - } - return node - } -}); - -// A map of CSS-based spacing functions to their CSS class. -const cssSpace = { - "\\nobreak": "nobreak", - "\\allowbreak": "allowbreak" -}; - -// A lookup table to determine whether a spacing function/symbol should be -// treated like a regular space character. If a symbol or command is a key -// in this table, then it should be a regular space character. Furthermore, -// the associated value may have a `className` specifying an extra CSS class -// to add to the created `span`. -const regularSpace = { - " ": {}, - "\\ ": {}, - "~": { - className: "nobreak" - }, - "\\space": {}, - "\\nobreakspace": { - className: "nobreak" - } -}; - -// ParseNode<"spacing"> created in Parser.js from the "spacing" symbol Groups in -// src/symbols.js. -defineFunctionBuilders({ - type: "spacing", - mathmlBuilder(group, style) { - let node; - - if (Object.prototype.hasOwnProperty.call(regularSpace, group.text)) { - // Firefox does not render a space in a . So write a no-break space. - // TODO: If Firefox fixes that bug, uncomment the next line and write ch into the node. - //const ch = (regularSpace[group.text].className === "nobreak") ? "\u00a0" : " " - node = new mathMLTree.MathNode("mtext", [new mathMLTree.TextNode("\u00a0")]); - } else if (Object.prototype.hasOwnProperty.call(cssSpace, group.text)) { - // MathML 3.0 calls for nobreak to occur in an , not an - // Ref: https://www.w3.org/Math/draft-spec/mathml.html#chapter3_presm.lbattrs - node = new mathMLTree.MathNode("mo"); - if (group.text === "\\nobreak") { - node.setAttribute("linebreak", "nobreak"); - } - } else { - throw new ParseError(`Unknown type of space "${group.text}"`) - } - - return node - } -}); - -defineFunctionBuilders({ - type: "tag" -}); - -// For a \tag, the work usually done in a mathmlBuilder is instead done in buildMathML.js. -// That way, a \tag can be pulled out of the parse tree and wrapped around the outer node. - -// Non-mathy text, possibly in a font -const textFontFamilies = { - "\\text": undefined, - "\\textrm": "textrm", - "\\textsf": "textsf", - "\\texttt": "texttt", - "\\textnormal": "textrm", - "\\textsc": "textsc" // small caps -}; - -const textFontWeights = { - "\\textbf": "textbf", - "\\textmd": "textmd" -}; - -const textFontShapes = { - "\\textit": "textit", - "\\textup": "textup" -}; - -const styleWithFont = (group, style) => { - const font = group.font; - // Checks if the argument is a font family or a font style. - if (!font) { - return style; - } else if (textFontFamilies[font]) { - return style.withTextFontFamily(textFontFamilies[font]); - } else if (textFontWeights[font]) { - return style.withTextFontWeight(textFontWeights[font]); - } else { - return style.withTextFontShape(textFontShapes[font]); - } -}; - -defineFunction({ - type: "text", - names: [ - // Font families - "\\text", - "\\textrm", - "\\textsf", - "\\texttt", - "\\textnormal", - "\\textsc", - // Font weights - "\\textbf", - "\\textmd", - // Font Shapes - "\\textit", - "\\textup" - ], - props: { - numArgs: 1, - argTypes: ["text"], - allowedInArgument: true, - allowedInText: true - }, - handler({ parser, funcName }, args) { - const body = args[0]; - return { - type: "text", - mode: parser.mode, - body: ordargument(body), - font: funcName - }; - }, - mathmlBuilder(group, style) { - const newStyle = styleWithFont(group, style); - const mrow = buildExpressionRow(group.body, newStyle); - return consolidateText(mrow) - } -}); - -defineFunction({ - type: "verb", - names: ["\\verb"], - props: { - numArgs: 0, - allowedInText: true - }, - handler(context, args, optArgs) { - // \verb and \verb* are dealt with directly in Parser.js. - // If we end up here, it's because of a failure to match the two delimiters - // in the regex in Lexer.js. LaTeX raises the following error when \verb is - // terminated by end of line (or file). - throw new ParseError("\\verb ended by end of line instead of matching delimiter"); - }, - mathmlBuilder(group, style) { - const text = new mathMLTree.TextNode(makeVerb(group)); - const node = new mathMLTree.MathNode("mtext", [text]); - node.setAttribute("mathvariant", "monospace"); - return node; - } -}); - -/** - * Converts verb group into body string. - * - * \verb* replaces each space with an open box \u2423 - * \verb replaces each space with a no-break space \xA0 - */ -const makeVerb = (group) => group.body.replace(/ /g, group.star ? "\u2423" : "\xA0"); - -/** Include this to ensure that all functions are defined. */ - -const functions = _functions; - -/** - * Lexing or parsing positional information for error reporting. - * This object is immutable. - */ -class SourceLocation { - constructor(lexer, start, end) { - this.lexer = lexer; // Lexer holding the input string. - this.start = start; // Start offset, zero-based inclusive. - this.end = end; // End offset, zero-based exclusive. - } - - /** - * Merges two `SourceLocation`s from location providers, given they are - * provided in order of appearance. - * - Returns the first one's location if only the first is provided. - * - Returns a merged range of the first and the last if both are provided - * and their lexers match. - * - Otherwise, returns null. - */ - static range(first, second) { - if (!second) { - return first && first.loc; - } else if (!first || !first.loc || !second.loc || first.loc.lexer !== second.loc.lexer) { - return null; - } else { - return new SourceLocation(first.loc.lexer, first.loc.start, second.loc.end); - } - } -} - -/** - * Interface required to break circular dependency between Token, Lexer, and - * ParseError. - */ - -/** - * The resulting token returned from `lex`. - * - * It consists of the token text plus some position information. - * The position information is essentially a range in an input string, - * but instead of referencing the bare input string, we refer to the lexer. - * That way it is possible to attach extra metadata to the input string, - * like for example a file name or similar. - * - * The position information is optional, so it is OK to construct synthetic - * tokens if appropriate. Not providing available position information may - * lead to degraded error reporting, though. - */ -class Token { - constructor( - text, // the text of this token - loc - ) { - this.text = text; - this.loc = loc; - } - - /** - * Given a pair of tokens (this and endToken), compute a `Token` encompassing - * the whole input range enclosed by these two. - */ - range( - endToken, // last token of the range, inclusive - text // the text of the newly constructed token - ) { - return new Token(text, SourceLocation.range(this, endToken)); - } -} - -/** - * The Lexer class handles tokenizing the input in various ways. Since our - * parser expects us to be able to backtrack, the lexer allows lexing from any - * given starting point. - * - * Its main exposed function is the `lex` function, which takes a position to - * lex from and a type of token to lex. It defers to the appropriate `_innerLex` - * function. - * - * The various `_innerLex` functions perform the actual lexing of different - * kinds. - */ - -/* The following tokenRegex - * - matches typical whitespace (but not NBSP etc.) using its first two groups - * - does not match any control character \x00-\x1f except whitespace - * - does not match a bare backslash - * - matches any ASCII character except those just mentioned - * - does not match the BMP private use area \uE000-\uF8FF - * - does not match bare surrogate code units - * - matches any BMP character except for those just described - * - matches any valid Unicode surrogate pair - * - mathches numerals - * - matches a backslash followed by one or more whitespace characters - * - matches a backslash followed by one or more letters then whitespace - * - matches a backslash followed by any BMP character - * Capturing groups: - * [1] regular whitespace - * [2] backslash followed by whitespace - * [3] anything else, which may include: - * [4] left character of \verb* - * [5] left character of \verb - * [6] backslash followed by word, excluding any trailing whitespace - * Just because the Lexer matches something doesn't mean it's valid input: - * If there is no matching function or symbol definition, the Parser will - * still reject the input. - */ -const spaceRegexString = "[ \r\n\t]"; -const controlWordRegexString = "\\\\[a-zA-Z@]+"; -const controlSymbolRegexString = "\\\\[^\uD800-\uDFFF]"; -const controlWordWhitespaceRegexString = `(${controlWordRegexString})${spaceRegexString}*`; -const controlSpaceRegexString = "\\\\(\n|[ \r\t]+\n?)[ \r\t]*"; -const combiningDiacriticalMarkString = "[\u0300-\u036f]"; -const combiningDiacriticalMarksEndRegex = new RegExp(`${combiningDiacriticalMarkString}+$`); -const tokenRegexString = - `(${spaceRegexString}+)|` + // whitespace - `${controlSpaceRegexString}|` + // whitespace - "([!-\\[\\]-\u2027\u202A-\uD7FF\uF900-\uFFFF]" + // single codepoint - `${combiningDiacriticalMarkString}*` + // ...plus accents - "|[\uD800-\uDBFF][\uDC00-\uDFFF]" + // surrogate pair - `${combiningDiacriticalMarkString}*` + // ...plus accents - "|\\\\verb\\*([^]).*?\\4" + // \verb* - "|\\\\verb([^*a-zA-Z]).*?\\5" + // \verb unstarred - `|${controlWordWhitespaceRegexString}` + // \macroName + spaces - `|${controlSymbolRegexString})`; // \\, \', etc. - -/** Main Lexer class */ -class Lexer { - constructor(input, settings) { - // Separate accents from characters - this.input = input; - this.settings = settings; - this.tokenRegex = new RegExp(tokenRegexString, 'g'); - // Category codes. The lexer only supports comment characters (14) for now. - // MacroExpander additionally distinguishes active (13). - this.catcodes = { - "%": 14, // comment character - "~": 13 // active character - }; - } - - setCatcode(char, code) { - this.catcodes[char] = code; - } - - /** - * This function lexes a single token. - */ - lex() { - const input = this.input; - const pos = this.tokenRegex.lastIndex; - if (pos === input.length) { - return new Token("EOF", new SourceLocation(this, pos, pos)); - } - const match = this.tokenRegex.exec(input); - if (match === null || match.index !== pos) { - throw new ParseError( - `Unexpected character: '${input[pos]}'`, - new Token(input[pos], new SourceLocation(this, pos, pos + 1)) - ); - } - const text = match[6] || match[3] || (match[2] ? "\\ " : " "); - - if (this.catcodes[text] === 14) { - // comment character - const nlIndex = input.indexOf("\n", this.tokenRegex.lastIndex); - if (nlIndex === -1) { - this.tokenRegex.lastIndex = input.length; // EOF - if (this.settings.strict) { - throw new ParseError("% comment has no terminating newline; LaTeX would " + - "fail because of commenting the end of math mode") - } - } else { - this.tokenRegex.lastIndex = nlIndex + 1; - } - return this.lex(); - } - - return new Token(text, new SourceLocation(this, pos, this.tokenRegex.lastIndex)); - } -} - -/** - * A `Namespace` refers to a space of nameable things like macros or lengths, - * which can be `set` either globally or local to a nested group, using an - * undo stack similar to how TeX implements this functionality. - * Performance-wise, `get` and local `set` take constant time, while global - * `set` takes time proportional to the depth of group nesting. - */ - -class Namespace { - /** - * Both arguments are optional. The first argument is an object of - * built-in mappings which never change. The second argument is an object - * of initial (global-level) mappings, which will constantly change - * according to any global/top-level `set`s done. - */ - constructor(builtins = {}, globalMacros = {}) { - this.current = globalMacros; - this.builtins = builtins; - this.undefStack = []; - } - - /** - * Start a new nested group, affecting future local `set`s. - */ - beginGroup() { - this.undefStack.push({}); - } - - /** - * End current nested group, restoring values before the group began. - */ - endGroup() { - if (this.undefStack.length === 0) { - throw new ParseError( - "Unbalanced namespace destruction: attempt " + - "to pop global namespace; please report this as a bug" - ); - } - const undefs = this.undefStack.pop(); - for (const undef in undefs) { - if (Object.prototype.hasOwnProperty.call(undefs, undef )) { - if (undefs[undef] === undefined) { - delete this.current[undef]; - } else { - this.current[undef] = undefs[undef]; - } - } - } - } - - /** - * Detect whether `name` has a definition. Equivalent to - * `get(name) != null`. - */ - has(name) { - return Object.prototype.hasOwnProperty.call(this.current, name ) || - Object.prototype.hasOwnProperty.call(this.builtins, name ); - } - - /** - * Get the current value of a name, or `undefined` if there is no value. - * - * Note: Do not use `if (namespace.get(...))` to detect whether a macro - * is defined, as the definition may be the empty string which evaluates - * to `false` in JavaScript. Use `if (namespace.get(...) != null)` or - * `if (namespace.has(...))`. - */ - get(name) { - if (Object.prototype.hasOwnProperty.call(this.current, name )) { - return this.current[name]; - } else { - return this.builtins[name]; - } - } - - /** - * Set the current value of a name, and optionally set it globally too. - * Local set() sets the current value and (when appropriate) adds an undo - * operation to the undo stack. Global set() may change the undo - * operation at every level, so takes time linear in their number. - */ - set(name, value, global = false) { - if (global) { - // Global set is equivalent to setting in all groups. Simulate this - // by destroying any undos currently scheduled for this name, - // and adding an undo with the *new* value (in case it later gets - // locally reset within this environment). - for (let i = 0; i < this.undefStack.length; i++) { - delete this.undefStack[i][name]; - } - if (this.undefStack.length > 0) { - this.undefStack[this.undefStack.length - 1][name] = value; - } - } else { - // Undo this set at end of this group (possibly to `undefined`), - // unless an undo is already in place, in which case that older - // value is the correct one. - const top = this.undefStack[this.undefStack.length - 1]; - if (top && !Object.prototype.hasOwnProperty.call(top, name )) { - top[name] = this.current[name]; - } - } - this.current[name] = value; - } -} - -/** - * Predefined macros for Temml. - * This can be used to define some commands in terms of others. - */ -const macros = _macros; - -////////////////////////////////////////////////////////////////////// -// macro tools - -defineMacro("\\noexpand", function(context) { - // The expansion is the token itself; but that token is interpreted - // as if its meaning were ‘\relax’ if it is a control sequence that - // would ordinarily be expanded by TeX’s expansion rules. - const t = context.popToken(); - if (context.isExpandable(t.text)) { - t.noexpand = true; - t.treatAsRelax = true; - } - return { tokens: [t], numArgs: 0 }; -}); - -defineMacro("\\expandafter", function(context) { - // TeX first reads the token that comes immediately after \expandafter, - // without expanding it; let’s call this token t. Then TeX reads the - // token that comes after t (and possibly more tokens, if that token - // has an argument), replacing it by its expansion. Finally TeX puts - // t back in front of that expansion. - const t = context.popToken(); - context.expandOnce(true); // expand only an expandable token - return { tokens: [t], numArgs: 0 }; -}); - -// LaTeX's \@firstoftwo{#1}{#2} expands to #1, skipping #2 -// TeX source: \long\def\@firstoftwo#1#2{#1} -defineMacro("\\@firstoftwo", function(context) { - const args = context.consumeArgs(2); - return { tokens: args[0], numArgs: 0 }; -}); - -// LaTeX's \@secondoftwo{#1}{#2} expands to #2, skipping #1 -// TeX source: \long\def\@secondoftwo#1#2{#2} -defineMacro("\\@secondoftwo", function(context) { - const args = context.consumeArgs(2); - return { tokens: args[1], numArgs: 0 }; -}); - -// LaTeX's \@ifnextchar{#1}{#2}{#3} looks ahead to the next (unexpanded) -// symbol that isn't a space, consuming any spaces but not consuming the -// first nonspace character. If that nonspace character matches #1, then -// the macro expands to #2; otherwise, it expands to #3. -defineMacro("\\@ifnextchar", function(context) { - const args = context.consumeArgs(3); // symbol, if, else - context.consumeSpaces(); - const nextToken = context.future(); - if (args[0].length === 1 && args[0][0].text === nextToken.text) { - return { tokens: args[1], numArgs: 0 }; - } else { - return { tokens: args[2], numArgs: 0 }; - } -}); - -// LaTeX's \@ifstar{#1}{#2} looks ahead to the next (unexpanded) symbol. -// If it is `*`, then it consumes the symbol, and the macro expands to #1; -// otherwise, the macro expands to #2 (without consuming the symbol). -// TeX source: \def\@ifstar#1{\@ifnextchar *{\@firstoftwo{#1}}} -defineMacro("\\@ifstar", "\\@ifnextchar *{\\@firstoftwo{#1}}"); - -// LaTeX's \TextOrMath{#1}{#2} expands to #1 in text mode, #2 in math mode -defineMacro("\\TextOrMath", function(context) { - const args = context.consumeArgs(2); - if (context.mode === "text") { - return { tokens: args[0], numArgs: 0 }; - } else { - return { tokens: args[1], numArgs: 0 }; - } -}); - -const stringFromArg = arg => { - // Reverse the order of the arg and return a string. - let str = ""; - for (let i = arg.length - 1; i > -1; i--) { - str += arg[i].text; - } - return str -}; - -// Lookup table for parsing numbers in base 8 through 16 -const digitToNumber = { - 0: 0, - 1: 1, - 2: 2, - 3: 3, - 4: 4, - 5: 5, - 6: 6, - 7: 7, - 8: 8, - 9: 9, - a: 10, - A: 10, - b: 11, - B: 11, - c: 12, - C: 12, - d: 13, - D: 13, - e: 14, - E: 14, - f: 15, - F: 15 -}; - -const nextCharNumber = context => { - const numStr = context.future().text; - if (numStr === "EOF") { return [null, ""] } - return [digitToNumber[numStr.charAt(0)], numStr] -}; - -const appendCharNumbers = (number, numStr, base) => { - for (let i = 1; i < numStr.length; i++) { - const digit = digitToNumber[numStr.charAt(i)]; - number *= base; - number += digit; - } - return number -}; - -// TeX \char makes a literal character (catcode 12) using the following forms: -// (see The TeXBook, p. 43) -// \char123 -- decimal -// \char'123 -- octal -// \char"123 -- hex -// \char`x -- character that can be written (i.e. isn't active) -// \char`\x -- character that cannot be written (e.g. %) -// These all refer to characters from the font, so we turn them into special -// calls to a function \@char dealt with in the Parser. -defineMacro("\\char", function(context) { - let token = context.popToken(); - let base; - let number = ""; - if (token.text === "'") { - base = 8; - token = context.popToken(); - } else if (token.text === '"') { - base = 16; - token = context.popToken(); - } else if (token.text === "`") { - token = context.popToken(); - if (token.text[0] === "\\") { - number = token.text.charCodeAt(1); - } else if (token.text === "EOF") { - throw new ParseError("\\char` missing argument"); - } else { - number = token.text.charCodeAt(0); - } - } else { - base = 10; - } - if (base) { - // Parse a number in the given base, starting with first `token`. - let numStr = token.text; - number = digitToNumber[numStr.charAt(0)]; - if (number == null || number >= base) { - throw new ParseError(`Invalid base-${base} digit ${token.text}`); - } - number = appendCharNumbers(number, numStr, base); - let digit; - [digit, numStr] = nextCharNumber(context); - while (digit != null && digit < base) { - number *= base; - number += digit; - number = appendCharNumbers(number, numStr, base); - context.popToken(); - [digit, numStr] = nextCharNumber(context); - } - } - return `\\@char{${number}}`; -}); - -function recreateArgStr(context) { - // Recreate the macro's original argument string from the array of parse tokens. - const tokens = context.consumeArgs(1)[0]; - let str = ""; - let expectedLoc = tokens[tokens.length - 1].loc.start; - for (let i = tokens.length - 1; i >= 0; i--) { - const actualLoc = tokens[i].loc.start; - if (actualLoc > expectedLoc) { - // context.consumeArgs has eaten a space. - str += " "; - expectedLoc = actualLoc; - } - str += tokens[i].text; - expectedLoc += tokens[i].text.length; - } - return str -} - -// The Latin Modern font renders at the wrong vertical alignment. -// This macro provides a better rendering. -defineMacro("\\surd", '\\sqrt{\\vphantom{|}}'); - -// See comment for \oplus in symbols.js. -defineMacro("\u2295", "\\oplus"); - -// Since Temml has no \par, ignore \long. -defineMacro("\\long", ""); - -////////////////////////////////////////////////////////////////////// -// Grouping -// \let\bgroup={ \let\egroup=} -defineMacro("\\bgroup", "{"); -defineMacro("\\egroup", "}"); - -// Symbols from latex.ltx: -// \def~{\nobreakspace{}} -// \def\lq{`} -// \def\rq{'} -// \def \aa {\r a} -defineMacro("~", "\\nobreakspace"); -defineMacro("\\lq", "`"); -defineMacro("\\rq", "'"); -defineMacro("\\aa", "\\r a"); - -defineMacro("\\Bbbk", "\\Bbb{k}"); - -// \mathstrut from the TeXbook, p 360 -defineMacro("\\mathstrut", "\\vphantom{(}"); - -// \underbar from TeXbook p 353 -defineMacro("\\underbar", "\\underline{\\text{#1}}"); - -////////////////////////////////////////////////////////////////////// -// LaTeX_2ε - -// \vdots{\vbox{\baselineskip4\p@ \lineskiplimit\z@ -// \kern6\p@\hbox{.}\hbox{.}\hbox{.}}} -// We'll call \varvdots, which gets a glyph from symbols.js. -// The zero-width rule gets us an equivalent to the vertical 6pt kern. -defineMacro("\\vdots", "{\\varvdots\\rule{0pt}{15pt}}"); -defineMacro("\u22ee", "\\vdots"); - -////////////////////////////////////////////////////////////////////// -// amsmath.sty -// http://mirrors.concertpass.com/tex-archive/macros/latex/required/amsmath/amsmath.pdf - -//\newcommand{\substack}[1]{\subarray{c}#1\endsubarray} -defineMacro("\\substack", "\\begin{subarray}{c}#1\\end{subarray}"); - -// \def\iff{\DOTSB\;\Longleftrightarrow\;} -// \def\implies{\DOTSB\;\Longrightarrow\;} -// \def\impliedby{\DOTSB\;\Longleftarrow\;} -defineMacro("\\iff", "\\DOTSB\\;\\Longleftrightarrow\\;"); -defineMacro("\\implies", "\\DOTSB\\;\\Longrightarrow\\;"); -defineMacro("\\impliedby", "\\DOTSB\\;\\Longleftarrow\\;"); - -// AMSMath's automatic \dots, based on \mdots@@ macro. -const dotsByToken = { - ",": "\\dotsc", - "\\not": "\\dotsb", - // \keybin@ checks for the following: - "+": "\\dotsb", - "=": "\\dotsb", - "<": "\\dotsb", - ">": "\\dotsb", - "-": "\\dotsb", - "*": "\\dotsb", - ":": "\\dotsb", - // Symbols whose definition starts with \DOTSB: - "\\DOTSB": "\\dotsb", - "\\coprod": "\\dotsb", - "\\bigvee": "\\dotsb", - "\\bigwedge": "\\dotsb", - "\\biguplus": "\\dotsb", - "\\bigcap": "\\dotsb", - "\\bigcup": "\\dotsb", - "\\prod": "\\dotsb", - "\\sum": "\\dotsb", - "\\bigotimes": "\\dotsb", - "\\bigoplus": "\\dotsb", - "\\bigodot": "\\dotsb", - "\\bigsqcap": "\\dotsb", - "\\bigsqcup": "\\dotsb", - "\\bigtimes": "\\dotsb", - "\\And": "\\dotsb", - "\\longrightarrow": "\\dotsb", - "\\Longrightarrow": "\\dotsb", - "\\longleftarrow": "\\dotsb", - "\\Longleftarrow": "\\dotsb", - "\\longleftrightarrow": "\\dotsb", - "\\Longleftrightarrow": "\\dotsb", - "\\mapsto": "\\dotsb", - "\\longmapsto": "\\dotsb", - "\\hookrightarrow": "\\dotsb", - "\\doteq": "\\dotsb", - // Symbols whose definition starts with \mathbin: - "\\mathbin": "\\dotsb", - // Symbols whose definition starts with \mathrel: - "\\mathrel": "\\dotsb", - "\\relbar": "\\dotsb", - "\\Relbar": "\\dotsb", - "\\xrightarrow": "\\dotsb", - "\\xleftarrow": "\\dotsb", - // Symbols whose definition starts with \DOTSI: - "\\DOTSI": "\\dotsi", - "\\int": "\\dotsi", - "\\oint": "\\dotsi", - "\\iint": "\\dotsi", - "\\iiint": "\\dotsi", - "\\iiiint": "\\dotsi", - "\\idotsint": "\\dotsi", - // Symbols whose definition starts with \DOTSX: - "\\DOTSX": "\\dotsx" -}; - -defineMacro("\\dots", function(context) { - // TODO: If used in text mode, should expand to \textellipsis. - // However, in Temml, \textellipsis and \ldots behave the same - // (in text mode), and it's unlikely we'd see any of the math commands - // that affect the behavior of \dots when in text mode. So fine for now - // (until we support \ifmmode ... \else ... \fi). - let thedots = "\\dotso"; - const next = context.expandAfterFuture().text; - if (next in dotsByToken) { - thedots = dotsByToken[next]; - } else if (next.slice(0, 4) === "\\not") { - thedots = "\\dotsb"; - } else if (next in symbols.math) { - if (["bin", "rel"].includes(symbols.math[next].group)) { - thedots = "\\dotsb"; - } - } - return thedots; -}); - -const spaceAfterDots = { - // \rightdelim@ checks for the following: - ")": true, - "]": true, - "\\rbrack": true, - "\\}": true, - "\\rbrace": true, - "\\rangle": true, - "\\rceil": true, - "\\rfloor": true, - "\\rgroup": true, - "\\rmoustache": true, - "\\right": true, - "\\bigr": true, - "\\biggr": true, - "\\Bigr": true, - "\\Biggr": true, - // \extra@ also tests for the following: - $: true, - // \extrap@ checks for the following: - ";": true, - ".": true, - ",": true -}; - -defineMacro("\\dotso", function(context) { - const next = context.future().text; - if (next in spaceAfterDots) { - return "\\ldots\\,"; - } else { - return "\\ldots"; - } -}); - -defineMacro("\\dotsc", function(context) { - const next = context.future().text; - // \dotsc uses \extra@ but not \extrap@, instead specially checking for - // ';' and '.', but doesn't check for ','. - if (next in spaceAfterDots && next !== ",") { - return "\\ldots\\,"; - } else { - return "\\ldots"; - } -}); - -defineMacro("\\cdots", function(context) { - const next = context.future().text; - if (next in spaceAfterDots) { - return "\\@cdots\\,"; - } else { - return "\\@cdots"; - } -}); - -defineMacro("\\dotsb", "\\cdots"); -defineMacro("\\dotsm", "\\cdots"); -defineMacro("\\dotsi", "\\!\\cdots"); -defineMacro("\\idotsint", "\\dotsi"); -// amsmath doesn't actually define \dotsx, but \dots followed by a macro -// starting with \DOTSX implies \dotso, and then \extra@ detects this case -// and forces the added `\,`. -defineMacro("\\dotsx", "\\ldots\\,"); - -// \let\DOTSI\relax -// \let\DOTSB\relax -// \let\DOTSX\relax -defineMacro("\\DOTSI", "\\relax"); -defineMacro("\\DOTSB", "\\relax"); -defineMacro("\\DOTSX", "\\relax"); - -// Spacing, based on amsmath.sty's override of LaTeX defaults -// \DeclareRobustCommand{\tmspace}[3]{% -// \ifmmode\mskip#1#2\else\kern#1#3\fi\relax} -defineMacro("\\tmspace", "\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax"); -// \renewcommand{\,}{\tmspace+\thinmuskip{.1667em}} -// TODO: math mode should use \thinmuskip -defineMacro("\\,", "{\\tmspace+{3mu}{.1667em}}"); -// \let\thinspace\, -defineMacro("\\thinspace", "\\,"); -// \def\>{\mskip\medmuskip} -// \renewcommand{\:}{\tmspace+\medmuskip{.2222em}} -// TODO: \> and math mode of \: should use \medmuskip = 4mu plus 2mu minus 4mu -defineMacro("\\>", "\\mskip{4mu}"); -defineMacro("\\:", "{\\tmspace+{4mu}{.2222em}}"); -// \let\medspace\: -defineMacro("\\medspace", "\\:"); -// \renewcommand{\;}{\tmspace+\thickmuskip{.2777em}} -// TODO: math mode should use \thickmuskip = 5mu plus 5mu -defineMacro("\\;", "{\\tmspace+{5mu}{.2777em}}"); -// \let\thickspace\; -defineMacro("\\thickspace", "\\;"); -// \renewcommand{\!}{\tmspace-\thinmuskip{.1667em}} -// TODO: math mode should use \thinmuskip -defineMacro("\\!", "{\\tmspace-{3mu}{.1667em}}"); -// \let\negthinspace\! -defineMacro("\\negthinspace", "\\!"); -// \newcommand{\negmedspace}{\tmspace-\medmuskip{.2222em}} -// TODO: math mode should use \medmuskip -defineMacro("\\negmedspace", "{\\tmspace-{4mu}{.2222em}}"); -// \newcommand{\negthickspace}{\tmspace-\thickmuskip{.2777em}} -// TODO: math mode should use \thickmuskip -defineMacro("\\negthickspace", "{\\tmspace-{5mu}{.277em}}"); -// \def\enspace{\kern.5em } -defineMacro("\\enspace", "\\kern.5em "); -// \def\enskip{\hskip.5em\relax} -defineMacro("\\enskip", "\\hskip.5em\\relax"); -// \def\quad{\hskip1em\relax} -defineMacro("\\quad", "\\hskip1em\\relax"); -// \def\qquad{\hskip2em\relax} -defineMacro("\\qquad", "\\hskip2em\\relax"); - -defineMacro("\\AA", "\\TextOrMath{\\Angstrom}{\\mathring{A}}\\relax"); - -// \tag@in@display form of \tag -defineMacro("\\tag", "\\@ifstar\\tag@literal\\tag@paren"); -defineMacro("\\tag@paren", "\\tag@literal{({#1})}"); -defineMacro("\\tag@literal", (context) => { - if (context.macros.get("\\df@tag")) { - throw new ParseError("Multiple \\tag"); - } - return "\\def\\df@tag{\\text{#1}}"; -}); - -// \renewcommand{\bmod}{\nonscript\mskip-\medmuskip\mkern5mu\mathbin -// {\operator@font mod}\penalty900 -// \mkern5mu\nonscript\mskip-\medmuskip} -// \newcommand{\pod}[1]{\allowbreak -// \if@display\mkern18mu\else\mkern8mu\fi(#1)} -// \renewcommand{\pmod}[1]{\pod{{\operator@font mod}\mkern6mu#1}} -// \newcommand{\mod}[1]{\allowbreak\if@display\mkern18mu -// \else\mkern12mu\fi{\operator@font mod}\,\,#1} -// TODO: math mode should use \medmuskip = 4mu plus 2mu minus 4mu -defineMacro("\\bmod", "\\mathbin{\\text{mod}}"); -defineMacro( - "\\pod", - "\\allowbreak" + "\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)" -); -defineMacro("\\pmod", "\\pod{{\\rm mod}\\mkern6mu#1}"); -defineMacro( - "\\mod", - "\\allowbreak" + - "\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}" + - "{\\rm mod}\\,\\,#1" -); - -////////////////////////////////////////////////////////////////////// -// LaTeX source2e - -// \expandafter\let\expandafter\@normalcr -// \csname\expandafter\@gobble\string\\ \endcsname -// \DeclareRobustCommand\newline{\@normalcr\relax} -defineMacro("\\newline", "\\\\\\relax"); - -// \def\TeX{T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX\@} -// TODO: Doesn't normally work in math mode because \@ fails. -defineMacro("\\TeX", "\\textrm{T}\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125em\\textrm{X}"); - -defineMacro( - "\\LaTeX", - "\\textrm{L}\\kern-.35em\\raisebox{0.2em}{\\scriptstyle A}\\kern-.15em\\TeX" -); - -defineMacro( - "\\Temml", - // eslint-disable-next-line max-len - "\\textrm{T}\\kern-0.2em\\lower{0.2em}{\\textrm{E}}\\kern-0.08em{\\textrm{M}\\kern-0.08em\\raise{0.2em}\\textrm{M}\\kern-0.08em\\textrm{L}}" -); - -// \DeclareRobustCommand\hspace{\@ifstar\@hspacer\@hspace} -// \def\@hspace#1{\hskip #1\relax} -// \def\@hspacer#1{\vrule \@width\z@\nobreak -// \hskip #1\hskip \z@skip} -defineMacro("\\hspace", "\\@ifstar\\@hspacer\\@hspace"); -defineMacro("\\@hspace", "\\hskip #1\\relax"); -defineMacro("\\@hspacer", "\\rule{0pt}{0pt}\\hskip #1\\relax"); - -defineMacro("\\colon", `\\mathpunct{\\char"3a}`); - -////////////////////////////////////////////////////////////////////// -// mathtools.sty - -defineMacro("\\prescript", "\\pres@cript{_{#1}^{#2}}{}{#3}"); - -//\providecommand\ordinarycolon{:} -defineMacro("\\ordinarycolon", `\\char"3a`); -// Raise to center on the math axis, as closely as possible. -defineMacro("\\vcentcolon", "\\mathrel{\\raisebox{0.035em}{\\ordinarycolon}}"); -// \providecommand*\coloneq{\vcentcolon\mathrel{\mkern-1.2mu}\mathrel{-}} -defineMacro("\\coloneq", '\\mathrel{\\raisebox{0.035em}{\\ordinarycolon}\\char"2212}'); -// \providecommand*\Coloneq{\dblcolon\mathrel{\mkern-1.2mu}\mathrel{-}} -defineMacro("\\Coloneq", '\\mathrel{\\char"2237\\char"2212}'); -// \providecommand*\Eqqcolon{=\mathrel{\mkern-1.2mu}\dblcolon} -defineMacro("\\Eqqcolon", '\\mathrel{\\char"3d\\char"2237}'); -// \providecommand*\Eqcolon{\mathrel{-}\mathrel{\mkern-1.2mu}\dblcolon} -defineMacro("\\Eqcolon", '\\mathrel{\\char"2212\\char"2237}'); -// \providecommand*\colonapprox{\vcentcolon\mathrel{\mkern-1.2mu}\approx} -defineMacro("\\colonapprox", '\\mathrel{\\raisebox{0.035em}{\\ordinarycolon}\\char"2248}'); -// \providecommand*\Colonapprox{\dblcolon\mathrel{\mkern-1.2mu}\approx} -defineMacro("\\Colonapprox", '\\mathrel{\\char"2237\\char"2248}'); -// \providecommand*\colonsim{\vcentcolon\mathrel{\mkern-1.2mu}\sim} -defineMacro("\\colonsim", '\\mathrel{\\raisebox{0.035em}{\\ordinarycolon}\\char"223c}'); -// \providecommand*\Colonsim{\dblcolon\mathrel{\mkern-1.2mu}\sim} -defineMacro("\\Colonsim", '\\mathrel{\\raisebox{0.035em}{\\ordinarycolon}\\char"223c}'); - -////////////////////////////////////////////////////////////////////// -// colonequals.sty - -// Alternate names for mathtools's macros: -defineMacro("\\ratio", "\\vcentcolon"); -defineMacro("\\coloncolon", "\\dblcolon"); -defineMacro("\\colonequals", "\\coloneqq"); -defineMacro("\\coloncolonequals", "\\Coloneqq"); -defineMacro("\\equalscolon", "\\eqqcolon"); -defineMacro("\\equalscoloncolon", "\\Eqqcolon"); -defineMacro("\\colonminus", "\\coloneq"); -defineMacro("\\coloncolonminus", "\\Coloneq"); -defineMacro("\\minuscolon", "\\eqcolon"); -defineMacro("\\minuscoloncolon", "\\Eqcolon"); -// \colonapprox name is same in mathtools and colonequals. -defineMacro("\\coloncolonapprox", "\\Colonapprox"); -// \colonsim name is same in mathtools and colonequals. -defineMacro("\\coloncolonsim", "\\Colonsim"); - -// Present in newtxmath, pxfonts and txfonts -defineMacro("\\notni", "\\mathrel{\\char`\u220C}"); -defineMacro("\\limsup", "\\DOTSB\\operatorname*{lim\\,sup}"); -defineMacro("\\liminf", "\\DOTSB\\operatorname*{lim\\,inf}"); - -////////////////////////////////////////////////////////////////////// -// From amsopn.sty -defineMacro("\\injlim", "\\DOTSB\\operatorname*{inj\\,lim}"); -defineMacro("\\projlim", "\\DOTSB\\operatorname*{proj\\,lim}"); -defineMacro("\\varlimsup", "\\DOTSB\\operatorname*{\\overline{\\text{lim}}}"); -defineMacro("\\varliminf", "\\DOTSB\\operatorname*{\\underline{\\text{lim}}}"); -defineMacro("\\varinjlim", "\\DOTSB\\operatorname*{\\underrightarrow{\\text{lim}}}"); -defineMacro("\\varprojlim", "\\DOTSB\\operatorname*{\\underleftarrow{\\text{lim}}}"); - -defineMacro("\\centerdot", "{\\medspace\\rule{0.167em}{0.189em}\\medspace}"); - -////////////////////////////////////////////////////////////////////// -// statmath.sty -// https://ctan.math.illinois.edu/macros/latex/contrib/statmath/statmath.pdf - -defineMacro("\\argmin", "\\DOTSB\\operatorname*{arg\\,min}"); -defineMacro("\\argmax", "\\DOTSB\\operatorname*{arg\\,max}"); -defineMacro("\\plim", "\\DOTSB\\operatorname*{plim}"); - -////////////////////////////////////////////////////////////////////// -// MnSymbol.sty - -defineMacro("\\leftmodels", "\\mathop{\\reflectbox{$\\models$}}"); - -////////////////////////////////////////////////////////////////////// -// braket.sty -// http://ctan.math.washington.edu/tex-archive/macros/latex/contrib/braket/braket.pdf - -defineMacro("\\bra", "\\mathinner{\\langle{#1}|}"); -defineMacro("\\ket", "\\mathinner{|{#1}\\rangle}"); -defineMacro("\\braket", "\\mathinner{\\langle{#1}\\rangle}"); -defineMacro("\\Bra", "\\left\\langle#1\\right|"); -defineMacro("\\Ket", "\\left|#1\\right\\rangle"); -// A helper for \Braket and \Set -const replaceVert = (argStr, match) => { - const ch = match[0] === "|" ? "\\vert" : "\\Vert"; - const replaceStr = `}\\,\\middle${ch}\\,{`; - return argStr.slice(0, match.index) + replaceStr + argStr.slice(match.index + match[0].length) -}; -defineMacro("\\Braket", function(context) { - let argStr = recreateArgStr(context); - const regEx = /\|\||\||\\\|/g; - let match; - while ((match = regEx.exec(argStr)) !== null) { - argStr = replaceVert(argStr, match); - } - return "\\left\\langle{" + argStr + "}\\right\\rangle" -}); -defineMacro("\\Set", function(context) { - let argStr = recreateArgStr(context); - const match = /\|\||\||\\\|/.exec(argStr); - if (match) { - argStr = replaceVert(argStr, match); - } - return "\\left\\{\\:{" + argStr + "}\\:\\right\\}" -}); -defineMacro("\\set", function(context) { - const argStr = recreateArgStr(context); - return "\\{{" + argStr.replace(/\|/, "}\\mid{") + "}\\}" -}); - -////////////////////////////////////////////////////////////////////// -// actuarialangle.dtx -defineMacro("\\angln", "{\\angl n}"); - -////////////////////////////////////////////////////////////////////// -// derivative.sty -defineMacro("\\odv", "\\@ifstar\\odv@next\\odv@numerator"); -defineMacro("\\odv@numerator", "\\frac{\\mathrm{d}#1}{\\mathrm{d}#2}"); -defineMacro("\\odv@next", "\\frac{\\mathrm{d}}{\\mathrm{d}#2}#1"); -defineMacro("\\pdv", "\\@ifstar\\pdv@next\\pdv@numerator"); - -const pdvHelper = args => { - const numerator = args[0][0].text; - const denoms = stringFromArg(args[1]).split(","); - const power = String(denoms.length); - const numOp = power === "1" ? "\\partial" : `\\partial^${power}`; - let denominator = ""; - denoms.map(e => { denominator += "\\partial " + e.trim() + "\\,";}); - return [numerator, numOp, denominator.replace(/\\,$/, "")] -}; -defineMacro("\\pdv@numerator", function(context) { - const [numerator, numOp, denominator] = pdvHelper(context.consumeArgs(2)); - return `\\frac{${numOp} ${numerator}}{${denominator}}` -}); -defineMacro("\\pdv@next", function(context) { - const [numerator, numOp, denominator] = pdvHelper(context.consumeArgs(2)); - return `\\frac{${numOp}}{${denominator}} ${numerator}` -}); - -////////////////////////////////////////////////////////////////////// -// upgreek.dtx -defineMacro("\\upalpha", "\\up@greek{\\alpha}"); -defineMacro("\\upbeta", "\\up@greek{\\beta}"); -defineMacro("\\upgamma", "\\up@greek{\\gamma}"); -defineMacro("\\updelta", "\\up@greek{\\delta}"); -defineMacro("\\upepsilon", "\\up@greek{\\epsilon}"); -defineMacro("\\upzeta", "\\up@greek{\\zeta}"); -defineMacro("\\upeta", "\\up@greek{\\eta}"); -defineMacro("\\uptheta", "\\up@greek{\\theta}"); -defineMacro("\\upiota", "\\up@greek{\\iota}"); -defineMacro("\\upkappa", "\\up@greek{\\kappa}"); -defineMacro("\\uplambda", "\\up@greek{\\lambda}"); -defineMacro("\\upmu", "\\up@greek{\\mu}"); -defineMacro("\\upnu", "\\up@greek{\\nu}"); -defineMacro("\\upxi", "\\up@greek{\\xi}"); -defineMacro("\\upomicron", "\\up@greek{\\omicron}"); -defineMacro("\\uppi", "\\up@greek{\\pi}"); -defineMacro("\\upalpha", "\\up@greek{\\alpha}"); -defineMacro("\\uprho", "\\up@greek{\\rho}"); -defineMacro("\\upsigma", "\\up@greek{\\sigma}"); -defineMacro("\\uptau", "\\up@greek{\\tau}"); -defineMacro("\\upupsilon", "\\up@greek{\\upsilon}"); -defineMacro("\\upphi", "\\up@greek{\\phi}"); -defineMacro("\\upchi", "\\up@greek{\\chi}"); -defineMacro("\\uppsi", "\\up@greek{\\psi}"); -defineMacro("\\upomega", "\\up@greek{\\omega}"); - -////////////////////////////////////////////////////////////////////// -// cmll package -defineMacro("\\invamp", '\\mathbin{\\char"214b}'); -defineMacro("\\parr", '\\mathbin{\\char"214b}'); -defineMacro("\\with", '\\mathbin{\\char"26}'); -defineMacro("\\multimapinv", '\\mathrel{\\char"27dc}'); -defineMacro("\\multimapboth", '\\mathrel{\\char"29df}'); -defineMacro("\\scoh", '{\\mkern5mu\\char"2322\\mkern5mu}'); -defineMacro("\\sincoh", '{\\mkern5mu\\char"2323\\mkern5mu}'); -defineMacro("\\coh", `{\\mkern5mu\\rule{}{0.7em}\\mathrlap{\\smash{\\raise2mu{\\char"2322}}} -{\\smash{\\lower4mu{\\char"2323}}}\\mkern5mu}`); -defineMacro("\\incoh", `{\\mkern5mu\\rule{}{0.7em}\\mathrlap{\\smash{\\raise2mu{\\char"2323}}} -{\\smash{\\lower4mu{\\char"2322}}}\\mkern5mu}`); - - -////////////////////////////////////////////////////////////////////// -// chemstyle package -defineMacro("\\standardstate", "\\text{\\tiny\\char`⦵}"); - -/* eslint-disable */ -/* -*- Mode: JavaScript; indent-tabs-mode:nil; js-indent-level: 2 -*- */ -/* vim: set ts=2 et sw=2 tw=80: */ - -/************************************************************* - * - * Temml mhchem.js - * - * This file implements a Temml version of mhchem version 3.3.0. - * It is adapted from MathJax/extensions/TeX/mhchem.js - * It differs from the MathJax version as follows: - * 1. The interface is changed so that it can be called from Temml, not MathJax. - * 2. \rlap and \llap are replaced with \mathrlap and \mathllap. - * 3. The reaction arrow code is simplified. All reaction arrows are rendered - * using Temml extensible arrows instead of building non-extensible arrows. - * 4. The ~bond forms are composed entirely of \rule elements. - * 5. Two dashes in _getBond are wrapped in braces to suppress spacing. i.e., {-} - * 6. The electron dot uses \textbullet instead of \bullet. - * - * This code, as other Temml code, is released under the MIT license. - * - * /************************************************************* - * - * MathJax/extensions/TeX/mhchem.js - * - * Implements the \ce command for handling chemical formulas - * from the mhchem LaTeX package. - * - * --------------------------------------------------------------------- - * - * Copyright (c) 2011-2015 The MathJax Consortium - * Copyright (c) 2015-2018 Martin Hensel - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// -// Coding Style -// - use '' for identifiers that can by minified/uglified -// - use "" for strings that need to stay untouched - -// version: "3.3.0" for MathJax and Temml - - -// Add \ce, \pu, and \tripleDash to the Temml macros. - -defineMacro("\\ce", function(context) { - return chemParse(context.consumeArgs(1)[0], "ce") -}); - -defineMacro("\\pu", function(context) { - return chemParse(context.consumeArgs(1)[0], "pu"); -}); - -// Math fonts do not include glyphs for the ~ form of bonds. So we'll send path geometry -// So we'll compose characters built from \rule elements. -defineMacro("\\uniDash", `{\\rule{0.672em}{0.06em}}`); -defineMacro("\\triDash", `{\\rule{0.15em}{0.06em}\\kern2mu\\rule{0.15em}{0.06em}\\kern2mu\\rule{0.15em}{0.06em}}`); -defineMacro("\\tripleDash", `\\kern0.075em\\raise0.25em{\\triDash}\\kern0.075em`); -defineMacro("\\tripleDashOverLine", `\\kern0.075em\\mathrlap{\\raise0.125em{\\uniDash}}\\raise0.34em{\\triDash}\\kern0.075em`); -defineMacro("\\tripleDashOverDoubleLine", `\\kern0.075em\\mathrlap{\\mathrlap{\\raise0.48em{\\triDash}}\\raise0.27em{\\uniDash}}{\\raise0.05em{\\uniDash}}\\kern0.075em`); -defineMacro("\\tripleDashBetweenDoubleLine", `\\kern0.075em\\mathrlap{\\mathrlap{\\raise0.48em{\\uniDash}}\\raise0.27em{\\triDash}}{\\raise0.05em{\\uniDash}}\\kern0.075em`); - - // - // This is the main function for handing the \ce and \pu commands. - // It takes the argument to \ce or \pu and returns the corresponding TeX string. - // - - var chemParse = function (tokens, stateMachine) { - // Recreate the argument string from Temml's array of tokens. - var str = ""; - var expectedLoc = tokens.length && tokens[tokens.length - 1].loc.start; - for (var i = tokens.length - 1; i >= 0; i--) { - if(tokens[i].loc.start > expectedLoc) { - // context.consumeArgs has eaten a space. - str += " "; - expectedLoc = tokens[i].loc.start; - } - str += tokens[i].text; - expectedLoc += tokens[i].text.length; - } - // Call the mhchem core parser. - var tex = texify.go(mhchemParser.go(str, stateMachine)); - return tex; - }; - - // - // Core parser for mhchem syntax (recursive) - // - /** @type {MhchemParser} */ - var mhchemParser = { - // - // Parses mchem \ce syntax - // - // Call like - // go("H2O"); - // - go: function (input, stateMachine) { - if (!input) { return []; } - if (stateMachine === undefined) { stateMachine = 'ce'; } - var state = '0'; - - // - // String buffers for parsing: - // - // buffer.a == amount - // buffer.o == element - // buffer.b == left-side superscript - // buffer.p == left-side subscript - // buffer.q == right-side subscript - // buffer.d == right-side superscript - // - // buffer.r == arrow - // buffer.rdt == arrow, script above, type - // buffer.rd == arrow, script above, content - // buffer.rqt == arrow, script below, type - // buffer.rq == arrow, script below, content - // - // buffer.text_ - // buffer.rm - // etc. - // - // buffer.parenthesisLevel == int, starting at 0 - // buffer.sb == bool, space before - // buffer.beginsWithBond == bool - // - // These letters are also used as state names. - // - // Other states: - // 0 == begin of main part (arrow/operator unlikely) - // 1 == next entity - // 2 == next entity (arrow/operator unlikely) - // 3 == next atom - // c == macro - // - /** @type {Buffer} */ - var buffer = {}; - buffer['parenthesisLevel'] = 0; - - input = input.replace(/\n/g, " "); - input = input.replace(/[\u2212\u2013\u2014\u2010]/g, "-"); - input = input.replace(/[\u2026]/g, "..."); - - // - // Looks through mhchemParser.transitions, to execute a matching action - // (recursive) - // - var lastInput; - var watchdog = 10; - /** @type {ParserOutput[]} */ - var output = []; - while (true) { - if (lastInput !== input) { - watchdog = 10; - lastInput = input; - } else { - watchdog--; - } - // - // Find actions in transition table - // - var machine = mhchemParser.stateMachines[stateMachine]; - var t = machine.transitions[state] || machine.transitions['*']; - iterateTransitions: - for (var i=0; i 0) { - if (!task.revisit) { - input = matches.remainder; - } - if (!task.toContinue) { - break iterateTransitions; - } - } else { - return output; - } - } - } - // - // Prevent infinite loop - // - if (watchdog <= 0) { - throw ["MhchemBugU", "mhchem bug U. Please report."]; // Unexpected character - } - } - }, - concatArray: function (a, b) { - if (b) { - if (Array.isArray(b)) { - for (var iB=0; iB': /^[=<>]/, - '#': /^[#\u2261]/, - '+': /^\+/, - '-$': /^-(?=[\s_},;\]/]|$|\([a-z]+\))/, // -space -, -; -] -/ -$ -state-of-aggregation - '-9': /^-(?=[0-9])/, - '- orbital overlap': /^-(?=(?:[spd]|sp)(?:$|[\s,;\)\]\}]))/, - '-': /^-/, - 'pm-operator': /^(?:\\pm|\$\\pm\$|\+-|\+\/-)/, - 'operator': /^(?:\+|(?:[\-=<>]|<<|>>|\\approx|\$\\approx\$)(?=\s|$|-?[0-9]))/, - 'arrowUpDown': /^(?:v|\(v\)|\^|\(\^\))(?=$|[\s,;\)\]\}])/, - '\\bond{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, "\\bond{", "", "", "}"); }, - '->': /^(?:<->|<-->|->|<-|<=>>|<<=>|<=>|[\u2192\u27F6\u21CC])/, - 'CMT': /^[CMT](?=\[)/, - '[(...)]': function (input) { return mhchemParser.patterns.findObserveGroups(input, "[", "", "", "]"); }, - '1st-level escape': /^(&|\\\\|\\hline)\s*/, - '\\,': /^(?:\\[,\ ;:])/, // \\x - but output no space before - '\\x{}{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, "", /^\\[a-zA-Z]+\{/, "}", "", "", "{", "}", "", true); }, - '\\x{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, "", /^\\[a-zA-Z]+\{/, "}", ""); }, - '\\ca': /^\\ca(?:\s+|(?![a-zA-Z]))/, - '\\x': /^(?:\\[a-zA-Z]+\s*|\\[_&{}%])/, - 'orbital': /^(?:[0-9]{1,2}[spdfgh]|[0-9]{0,2}sp)(?=$|[^a-zA-Z])/, // only those with numbers in front, because the others will be formatted correctly anyway - 'others': /^[\/~|]/, - '\\frac{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, "\\frac{", "", "", "}", "{", "", "", "}"); }, - '\\overset{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, "\\overset{", "", "", "}", "{", "", "", "}"); }, - '\\underset{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, "\\underset{", "", "", "}", "{", "", "", "}"); }, - '\\underbrace{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, "\\underbrace{", "", "", "}_", "{", "", "", "}"); }, - '\\color{(...)}0': function (input) { return mhchemParser.patterns.findObserveGroups(input, "\\color{", "", "", "}"); }, - '\\color{(...)}{(...)}1': function (input) { return mhchemParser.patterns.findObserveGroups(input, "\\color{", "", "", "}", "{", "", "", "}"); }, - '\\color(...){(...)}2': function (input) { return mhchemParser.patterns.findObserveGroups(input, "\\color", "\\", "", /^(?=\{)/, "{", "", "", "}"); }, - '\\ce{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, "\\ce{", "", "", "}"); }, - 'oxidation$': /^(?:[+-][IVX]+|\\pm\s*0|\$\\pm\$\s*0)$/, - 'd-oxidation$': /^(?:[+-]?\s?[IVX]+|\\pm\s*0|\$\\pm\$\s*0)$/, // 0 could be oxidation or charge - 'roman numeral': /^[IVX]+/, - '1/2$': /^[+\-]?(?:[0-9]+|\$[a-z]\$|[a-z])\/[0-9]+(?:\$[a-z]\$|[a-z])?$/, - 'amount': function (input) { - var match; - // e.g. 2, 0.5, 1/2, -2, n/2, +; $a$ could be added later in parsing - match = input.match(/^(?:(?:(?:\([+\-]?[0-9]+\/[0-9]+\)|[+\-]?(?:[0-9]+|\$[a-z]\$|[a-z])\/[0-9]+|[+\-]?[0-9]+[.,][0-9]+|[+\-]?\.[0-9]+|[+\-]?[0-9]+)(?:[a-z](?=\s*[A-Z]))?)|[+\-]?[a-z](?=\s*[A-Z])|\+(?!\s))/); - if (match) { - return { match_: match[0], remainder: input.substr(match[0].length) }; - } - var a = mhchemParser.patterns.findObserveGroups(input, "", "$", "$", ""); - if (a) { // e.g. $2n-1$, $-$ - match = a.match_.match(/^\$(?:\(?[+\-]?(?:[0-9]*[a-z]?[+\-])?[0-9]*[a-z](?:[+\-][0-9]*[a-z]?)?\)?|\+|-)\$$/); - if (match) { - return { match_: match[0], remainder: input.substr(match[0].length) }; - } - } - return null; - }, - 'amount2': function (input) { return this['amount'](input); }, - '(KV letters),': /^(?:[A-Z][a-z]{0,2}|i)(?=,)/, - 'formula$': function (input) { - if (input.match(/^\([a-z]+\)$/)) { return null; } // state of aggregation = no formula - var match = input.match(/^(?:[a-z]|(?:[0-9\ \+\-\,\.\(\)]+[a-z])+[0-9\ \+\-\,\.\(\)]*|(?:[a-z][0-9\ \+\-\,\.\(\)]+)+[a-z]?)$/); - if (match) { - return { match_: match[0], remainder: input.substr(match[0].length) }; - } - return null; - }, - 'uprightEntities': /^(?:pH|pOH|pC|pK|iPr|iBu)(?=$|[^a-zA-Z])/, - '/': /^\s*(\/)\s*/, - '//': /^\s*(\/\/)\s*/, - '*': /^\s*[*.]\s*/ - }, - findObserveGroups: function (input, begExcl, begIncl, endIncl, endExcl, beg2Excl, beg2Incl, end2Incl, end2Excl, combine) { - /** @type {{(input: string, pattern: string | RegExp): string | string[] | null;}} */ - var _match = function (input, pattern) { - if (typeof pattern === "string") { - if (input.indexOf(pattern) !== 0) { return null; } - return pattern; - } else { - var match = input.match(pattern); - if (!match) { return null; } - return match[0]; - } - }; - /** @type {{(input: string, i: number, endChars: string | RegExp): {endMatchBegin: number, endMatchEnd: number} | null;}} */ - var _findObserveGroups = function (input, i, endChars) { - var braces = 0; - while (i < input.length) { - var a = input.charAt(i); - var match = _match(input.substr(i), endChars); - if (match !== null && braces === 0) { - return { endMatchBegin: i, endMatchEnd: i + match.length }; - } else if (a === "{") { - braces++; - } else if (a === "}") { - if (braces === 0) { - throw ["ExtraCloseMissingOpen", "Extra close brace or missing open brace"]; - } else { - braces--; - } - } - i++; - } - if (braces > 0) { - return null; - } - return null; - }; - var match = _match(input, begExcl); - if (match === null) { return null; } - input = input.substr(match.length); - match = _match(input, begIncl); - if (match === null) { return null; } - var e = _findObserveGroups(input, match.length, endIncl || endExcl); - if (e === null) { return null; } - var match1 = input.substring(0, (endIncl ? e.endMatchEnd : e.endMatchBegin)); - if (!(beg2Excl || beg2Incl)) { - return { - match_: match1, - remainder: input.substr(e.endMatchEnd) - }; - } else { - var group2 = this.findObserveGroups(input.substr(e.endMatchEnd), beg2Excl, beg2Incl, end2Incl, end2Excl); - if (group2 === null) { return null; } - /** @type {string[]} */ - var matchRet = [match1, group2.match_]; - return { - match_: (combine ? matchRet.join("") : matchRet), - remainder: group2.remainder - }; - } - }, - - // - // Matching function - // e.g. match("a", input) will look for the regexp called "a" and see if it matches - // returns null or {match_:"a", remainder:"bc"} - // - match_: function (m, input) { - var pattern = mhchemParser.patterns.patterns[m]; - if (pattern === undefined) { - throw ["MhchemBugP", "mhchem bug P. Please report. (" + m + ")"]; // Trying to use non-existing pattern - } else if (typeof pattern === "function") { - return mhchemParser.patterns.patterns[m](input); // cannot use cached var pattern here, because some pattern functions need this===mhchemParser - } else { // RegExp - var match = input.match(pattern); - if (match) { - var mm; - if (match[2]) { - mm = [ match[1], match[2] ]; - } else if (match[1]) { - mm = match[1]; - } else { - mm = match[0]; - } - return { match_: mm, remainder: input.substr(match[0].length) }; - } - return null; - } - } - }, - - // - // Generic state machine actions - // - actions: { - 'a=': function (buffer, m) { buffer.a = (buffer.a || "") + m; }, - 'b=': function (buffer, m) { buffer.b = (buffer.b || "") + m; }, - 'p=': function (buffer, m) { buffer.p = (buffer.p || "") + m; }, - 'o=': function (buffer, m) { buffer.o = (buffer.o || "") + m; }, - 'q=': function (buffer, m) { buffer.q = (buffer.q || "") + m; }, - 'd=': function (buffer, m) { buffer.d = (buffer.d || "") + m; }, - 'rm=': function (buffer, m) { buffer.rm = (buffer.rm || "") + m; }, - 'text=': function (buffer, m) { buffer.text_ = (buffer.text_ || "") + m; }, - 'insert': function (buffer, m, a) { return { type_: a }; }, - 'insert+p1': function (buffer, m, a) { return { type_: a, p1: m }; }, - 'insert+p1+p2': function (buffer, m, a) { return { type_: a, p1: m[0], p2: m[1] }; }, - 'copy': function (buffer, m) { return m; }, - 'rm': function (buffer, m) { return { type_: 'rm', p1: m || ""}; }, - 'text': function (buffer, m) { return mhchemParser.go(m, 'text'); }, - '{text}': function (buffer, m) { - var ret = [ "{" ]; - mhchemParser.concatArray(ret, mhchemParser.go(m, 'text')); - ret.push("}"); - return ret; - }, - 'tex-math': function (buffer, m) { return mhchemParser.go(m, 'tex-math'); }, - 'tex-math tight': function (buffer, m) { return mhchemParser.go(m, 'tex-math tight'); }, - 'bond': function (buffer, m, k) { return { type_: 'bond', kind_: k || m }; }, - 'color0-output': function (buffer, m) { return { type_: 'color0', color: m[0] }; }, - 'ce': function (buffer, m) { return mhchemParser.go(m); }, - '1/2': function (buffer, m) { - /** @type {ParserOutput[]} */ - var ret = []; - if (m.match(/^[+\-]/)) { - ret.push(m.substr(0, 1)); - m = m.substr(1); - } - var n = m.match(/^([0-9]+|\$[a-z]\$|[a-z])\/([0-9]+)(\$[a-z]\$|[a-z])?$/); - n[1] = n[1].replace(/\$/g, ""); - ret.push({ type_: 'frac', p1: n[1], p2: n[2] }); - if (n[3]) { - n[3] = n[3].replace(/\$/g, ""); - ret.push({ type_: 'tex-math', p1: n[3] }); - } - return ret; - }, - '9,9': function (buffer, m) { return mhchemParser.go(m, '9,9'); } - }, - // - // createTransitions - // convert { 'letter': { 'state': { action_: 'output' } } } to { 'state' => [ { pattern: 'letter', task: { action_: [{type_: 'output'}] } } ] } - // with expansion of 'a|b' to 'a' and 'b' (at 2 places) - // - createTransitions: function (o) { - var pattern, state; - /** @type {string[]} */ - var stateArray; - var i; - // - // 1. Collect all states - // - /** @type {Transitions} */ - var transitions = {}; - for (pattern in o) { - for (state in o[pattern]) { - stateArray = state.split("|"); - o[pattern][state].stateArray = stateArray; - for (i=0; i': { - '0|1|2|3': { action_: 'r=', nextState: 'r' }, - 'a|as': { action_: [ 'output', 'r=' ], nextState: 'r' }, - '*': { action_: [ 'output', 'r=' ], nextState: 'r' } }, - '+': { - 'o': { action_: 'd= kv', nextState: 'd' }, - 'd|D': { action_: 'd=', nextState: 'd' }, - 'q': { action_: 'd=', nextState: 'qd' }, - 'qd|qD': { action_: 'd=', nextState: 'qd' }, - 'dq': { action_: [ 'output', 'd=' ], nextState: 'd' }, - '3': { action_: [ 'sb=false', 'output', 'operator' ], nextState: '0' } }, - 'amount': { - '0|2': { action_: 'a=', nextState: 'a' } }, - 'pm-operator': { - '0|1|2|a|as': { action_: [ 'sb=false', 'output', { type_: 'operator', option: '\\pm' } ], nextState: '0' } }, - 'operator': { - '0|1|2|a|as': { action_: [ 'sb=false', 'output', 'operator' ], nextState: '0' } }, - '-$': { - 'o|q': { action_: [ 'charge or bond', 'output' ], nextState: 'qd' }, - 'd': { action_: 'd=', nextState: 'd' }, - 'D': { action_: [ 'output', { type_: 'bond', option: "-" } ], nextState: '3' }, - 'q': { action_: 'd=', nextState: 'qd' }, - 'qd': { action_: 'd=', nextState: 'qd' }, - 'qD|dq': { action_: [ 'output', { type_: 'bond', option: "-" } ], nextState: '3' } }, - '-9': { - '3|o': { action_: [ 'output', { type_: 'insert', option: 'hyphen' } ], nextState: '3' } }, - '- orbital overlap': { - 'o': { action_: [ 'output', { type_: 'insert', option: 'hyphen' } ], nextState: '2' }, - 'd': { action_: [ 'output', { type_: 'insert', option: 'hyphen' } ], nextState: '2' } }, - '-': { - '0|1|2': { action_: [ { type_: 'output', option: 1 }, 'beginsWithBond=true', { type_: 'bond', option: "-" } ], nextState: '3' }, - '3': { action_: { type_: 'bond', option: "-" } }, - 'a': { action_: [ 'output', { type_: 'insert', option: 'hyphen' } ], nextState: '2' }, - 'as': { action_: [ { type_: 'output', option: 2 }, { type_: 'bond', option: "-" } ], nextState: '3' }, - 'b': { action_: 'b=' }, - 'o': { action_: { type_: '- after o/d', option: false }, nextState: '2' }, - 'q': { action_: { type_: '- after o/d', option: false }, nextState: '2' }, - 'd|qd|dq': { action_: { type_: '- after o/d', option: true }, nextState: '2' }, - 'D|qD|p': { action_: [ 'output', { type_: 'bond', option: "-" } ], nextState: '3' } }, - 'amount2': { - '1|3': { action_: 'a=', nextState: 'a' } }, - 'letters': { - '0|1|2|3|a|as|b|p|bp|o': { action_: 'o=', nextState: 'o' }, - 'q|dq': { action_: ['output', 'o='], nextState: 'o' }, - 'd|D|qd|qD': { action_: 'o after d', nextState: 'o' } }, - 'digits': { - 'o': { action_: 'q=', nextState: 'q' }, - 'd|D': { action_: 'q=', nextState: 'dq' }, - 'q': { action_: [ 'output', 'o=' ], nextState: 'o' }, - 'a': { action_: 'o=', nextState: 'o' } }, - 'space A': { - 'b|p|bp': {} }, - 'space': { - 'a': { nextState: 'as' }, - '0': { action_: 'sb=false' }, - '1|2': { action_: 'sb=true' }, - 'r|rt|rd|rdt|rdq': { action_: 'output', nextState: '0' }, - '*': { action_: [ 'output', 'sb=true' ], nextState: '1'} }, - '1st-level escape': { - '1|2': { action_: [ 'output', { type_: 'insert+p1', option: '1st-level escape' } ] }, - '*': { action_: [ 'output', { type_: 'insert+p1', option: '1st-level escape' } ], nextState: '0' } }, - '[(...)]': { - 'r|rt': { action_: 'rd=', nextState: 'rd' }, - 'rd|rdt': { action_: 'rq=', nextState: 'rdq' } }, - '...': { - 'o|d|D|dq|qd|qD': { action_: [ 'output', { type_: 'bond', option: "..." } ], nextState: '3' }, - '*': { action_: [ { type_: 'output', option: 1 }, { type_: 'insert', option: 'ellipsis' } ], nextState: '1' } }, - '. |* ': { - '*': { action_: [ 'output', { type_: 'insert', option: 'addition compound' } ], nextState: '1' } }, - 'state of aggregation $': { - '*': { action_: [ 'output', 'state of aggregation' ], nextState: '1' } }, - '{[(': { - 'a|as|o': { action_: [ 'o=', 'output', 'parenthesisLevel++' ], nextState: '2' }, - '0|1|2|3': { action_: [ 'o=', 'output', 'parenthesisLevel++' ], nextState: '2' }, - '*': { action_: [ 'output', 'o=', 'output', 'parenthesisLevel++' ], nextState: '2' } }, - ')]}': { - '0|1|2|3|b|p|bp|o': { action_: [ 'o=', 'parenthesisLevel--' ], nextState: 'o' }, - 'a|as|d|D|q|qd|qD|dq': { action_: [ 'output', 'o=', 'parenthesisLevel--' ], nextState: 'o' } }, - ', ': { - '*': { action_: [ 'output', 'comma' ], nextState: '0' } }, - '^_': { // ^ and _ without a sensible argument - '*': { } }, - '^{(...)}|^($...$)': { - '0|1|2|as': { action_: 'b=', nextState: 'b' }, - 'p': { action_: 'b=', nextState: 'bp' }, - '3|o': { action_: 'd= kv', nextState: 'D' }, - 'q': { action_: 'd=', nextState: 'qD' }, - 'd|D|qd|qD|dq': { action_: [ 'output', 'd=' ], nextState: 'D' } }, - '^a|^\\x{}{}|^\\x{}|^\\x|\'': { - '0|1|2|as': { action_: 'b=', nextState: 'b' }, - 'p': { action_: 'b=', nextState: 'bp' }, - '3|o': { action_: 'd= kv', nextState: 'd' }, - 'q': { action_: 'd=', nextState: 'qd' }, - 'd|qd|D|qD': { action_: 'd=' }, - 'dq': { action_: [ 'output', 'd=' ], nextState: 'd' } }, - '_{(state of aggregation)}$': { - 'd|D|q|qd|qD|dq': { action_: [ 'output', 'q=' ], nextState: 'q' } }, - '_{(...)}|_($...$)|_9|_\\x{}{}|_\\x{}|_\\x': { - '0|1|2|as': { action_: 'p=', nextState: 'p' }, - 'b': { action_: 'p=', nextState: 'bp' }, - '3|o': { action_: 'q=', nextState: 'q' }, - 'd|D': { action_: 'q=', nextState: 'dq' }, - 'q|qd|qD|dq': { action_: [ 'output', 'q=' ], nextState: 'q' } }, - '=<>': { - '0|1|2|3|a|as|o|q|d|D|qd|qD|dq': { action_: [ { type_: 'output', option: 2 }, 'bond' ], nextState: '3' } }, - '#': { - '0|1|2|3|a|as|o': { action_: [ { type_: 'output', option: 2 }, { type_: 'bond', option: "#" } ], nextState: '3' } }, - '{}': { - '*': { action_: { type_: 'output', option: 1 }, nextState: '1' } }, - '{...}': { - '0|1|2|3|a|as|b|p|bp': { action_: 'o=', nextState: 'o' }, - 'o|d|D|q|qd|qD|dq': { action_: [ 'output', 'o=' ], nextState: 'o' } }, - '$...$': { - 'a': { action_: 'a=' }, // 2$n$ - '0|1|2|3|as|b|p|bp|o': { action_: 'o=', nextState: 'o' }, // not 'amount' - 'as|o': { action_: 'o=' }, - 'q|d|D|qd|qD|dq': { action_: [ 'output', 'o=' ], nextState: 'o' } }, - '\\bond{(...)}': { - '*': { action_: [ { type_: 'output', option: 2 }, 'bond' ], nextState: "3" } }, - '\\frac{(...)}': { - '*': { action_: [ { type_: 'output', option: 1 }, 'frac-output' ], nextState: '3' } }, - '\\overset{(...)}': { - '*': { action_: [ { type_: 'output', option: 2 }, 'overset-output' ], nextState: '3' } }, - '\\underset{(...)}': { - '*': { action_: [ { type_: 'output', option: 2 }, 'underset-output' ], nextState: '3' } }, - '\\underbrace{(...)}': { - '*': { action_: [ { type_: 'output', option: 2 }, 'underbrace-output' ], nextState: '3' } }, - '\\color{(...)}{(...)}1|\\color(...){(...)}2': { - '*': { action_: [ { type_: 'output', option: 2 }, 'color-output' ], nextState: '3' } }, - '\\color{(...)}0': { - '*': { action_: [ { type_: 'output', option: 2 }, 'color0-output' ] } }, - '\\ce{(...)}': { - '*': { action_: [ { type_: 'output', option: 2 }, 'ce' ], nextState: '3' } }, - '\\,': { - '*': { action_: [ { type_: 'output', option: 1 }, 'copy' ], nextState: '1' } }, - '\\x{}{}|\\x{}|\\x': { - '0|1|2|3|a|as|b|p|bp|o|c0': { action_: [ 'o=', 'output' ], nextState: '3' }, - '*': { action_: ['output', 'o=', 'output' ], nextState: '3' } }, - 'others': { - '*': { action_: [ { type_: 'output', option: 1 }, 'copy' ], nextState: '3' } }, - 'else2': { - 'a': { action_: 'a to o', nextState: 'o', revisit: true }, - 'as': { action_: [ 'output', 'sb=true' ], nextState: '1', revisit: true }, - 'r|rt|rd|rdt|rdq': { action_: [ 'output' ], nextState: '0', revisit: true }, - '*': { action_: [ 'output', 'copy' ], nextState: '3' } } - }), - actions: { - 'o after d': function (buffer, m) { - var ret; - if ((buffer.d || "").match(/^[0-9]+$/)) { - var tmp = buffer.d; - buffer.d = undefined; - ret = this['output'](buffer); - buffer.b = tmp; - } else { - ret = this['output'](buffer); - } - mhchemParser.actions['o='](buffer, m); - return ret; - }, - 'd= kv': function (buffer, m) { - buffer.d = m; - buffer.dType = 'kv'; - }, - 'charge or bond': function (buffer, m) { - if (buffer['beginsWithBond']) { - /** @type {ParserOutput[]} */ - var ret = []; - mhchemParser.concatArray(ret, this['output'](buffer)); - mhchemParser.concatArray(ret, mhchemParser.actions['bond'](buffer, m, "-")); - return ret; - } else { - buffer.d = m; - } - }, - '- after o/d': function (buffer, m, isAfterD) { - var c1 = mhchemParser.patterns.match_('orbital', buffer.o || ""); - var c2 = mhchemParser.patterns.match_('one lowercase greek letter $', buffer.o || ""); - var c3 = mhchemParser.patterns.match_('one lowercase latin letter $', buffer.o || ""); - var c4 = mhchemParser.patterns.match_('$one lowercase latin letter$ $', buffer.o || ""); - var hyphenFollows = m==="-" && ( c1 && c1.remainder==="" || c2 || c3 || c4 ); - if (hyphenFollows && !buffer.a && !buffer.b && !buffer.p && !buffer.d && !buffer.q && !c1 && c3) { - buffer.o = '$' + buffer.o + '$'; - } - /** @type {ParserOutput[]} */ - var ret = []; - if (hyphenFollows) { - mhchemParser.concatArray(ret, this['output'](buffer)); - ret.push({ type_: 'hyphen' }); - } else { - c1 = mhchemParser.patterns.match_('digits', buffer.d || ""); - if (isAfterD && c1 && c1.remainder==='') { - mhchemParser.concatArray(ret, mhchemParser.actions['d='](buffer, m)); - mhchemParser.concatArray(ret, this['output'](buffer)); - } else { - mhchemParser.concatArray(ret, this['output'](buffer)); - mhchemParser.concatArray(ret, mhchemParser.actions['bond'](buffer, m, "-")); - } - } - return ret; - }, - 'a to o': function (buffer) { - buffer.o = buffer.a; - buffer.a = undefined; - }, - 'sb=true': function (buffer) { buffer.sb = true; }, - 'sb=false': function (buffer) { buffer.sb = false; }, - 'beginsWithBond=true': function (buffer) { buffer['beginsWithBond'] = true; }, - 'beginsWithBond=false': function (buffer) { buffer['beginsWithBond'] = false; }, - 'parenthesisLevel++': function (buffer) { buffer['parenthesisLevel']++; }, - 'parenthesisLevel--': function (buffer) { buffer['parenthesisLevel']--; }, - 'state of aggregation': function (buffer, m) { - return { type_: 'state of aggregation', p1: mhchemParser.go(m, 'o') }; - }, - 'comma': function (buffer, m) { - var a = m.replace(/\s*$/, ''); - var withSpace = (a !== m); - if (withSpace && buffer['parenthesisLevel'] === 0) { - return { type_: 'comma enumeration L', p1: a }; - } else { - return { type_: 'comma enumeration M', p1: a }; - } - }, - 'output': function (buffer, m, entityFollows) { - // entityFollows: - // undefined = if we have nothing else to output, also ignore the just read space (buffer.sb) - // 1 = an entity follows, never omit the space if there was one just read before (can only apply to state 1) - // 2 = 1 + the entity can have an amount, so output a\, instead of converting it to o (can only apply to states a|as) - /** @type {ParserOutput | ParserOutput[]} */ - var ret; - if (!buffer.r) { - ret = []; - if (!buffer.a && !buffer.b && !buffer.p && !buffer.o && !buffer.q && !buffer.d && !entityFollows) ; else { - if (buffer.sb) { - ret.push({ type_: 'entitySkip' }); - } - if (!buffer.o && !buffer.q && !buffer.d && !buffer.b && !buffer.p && entityFollows!==2) { - buffer.o = buffer.a; - buffer.a = undefined; - } else if (!buffer.o && !buffer.q && !buffer.d && (buffer.b || buffer.p)) { - buffer.o = buffer.a; - buffer.d = buffer.b; - buffer.q = buffer.p; - buffer.a = buffer.b = buffer.p = undefined; - } else { - if (buffer.o && buffer.dType==='kv' && mhchemParser.patterns.match_('d-oxidation$', buffer.d || "")) { - buffer.dType = 'oxidation'; - } else if (buffer.o && buffer.dType==='kv' && !buffer.q) { - buffer.dType = undefined; - } - } - ret.push({ - type_: 'chemfive', - a: mhchemParser.go(buffer.a, 'a'), - b: mhchemParser.go(buffer.b, 'bd'), - p: mhchemParser.go(buffer.p, 'pq'), - o: mhchemParser.go(buffer.o, 'o'), - q: mhchemParser.go(buffer.q, 'pq'), - d: mhchemParser.go(buffer.d, (buffer.dType === 'oxidation' ? 'oxidation' : 'bd')), - dType: buffer.dType - }); - } - } else { // r - /** @type {ParserOutput[]} */ - var rd; - if (buffer.rdt === 'M') { - rd = mhchemParser.go(buffer.rd, 'tex-math'); - } else if (buffer.rdt === 'T') { - rd = [ { type_: 'text', p1: buffer.rd || "" } ]; - } else { - rd = mhchemParser.go(buffer.rd); - } - /** @type {ParserOutput[]} */ - var rq; - if (buffer.rqt === 'M') { - rq = mhchemParser.go(buffer.rq, 'tex-math'); - } else if (buffer.rqt === 'T') { - rq = [ { type_: 'text', p1: buffer.rq || ""} ]; - } else { - rq = mhchemParser.go(buffer.rq); - } - ret = { - type_: 'arrow', - r: buffer.r, - rd: rd, - rq: rq - }; - } - for (var p in buffer) { - if (p !== 'parenthesisLevel' && p !== 'beginsWithBond') { - delete buffer[p]; - } - } - return ret; - }, - 'oxidation-output': function (buffer, m) { - var ret = [ "{" ]; - mhchemParser.concatArray(ret, mhchemParser.go(m, 'oxidation')); - ret.push("}"); - return ret; - }, - 'frac-output': function (buffer, m) { - return { type_: 'frac-ce', p1: mhchemParser.go(m[0]), p2: mhchemParser.go(m[1]) }; - }, - 'overset-output': function (buffer, m) { - return { type_: 'overset', p1: mhchemParser.go(m[0]), p2: mhchemParser.go(m[1]) }; - }, - 'underset-output': function (buffer, m) { - return { type_: 'underset', p1: mhchemParser.go(m[0]), p2: mhchemParser.go(m[1]) }; - }, - 'underbrace-output': function (buffer, m) { - return { type_: 'underbrace', p1: mhchemParser.go(m[0]), p2: mhchemParser.go(m[1]) }; - }, - 'color-output': function (buffer, m) { - return { type_: 'color', color1: m[0], color2: mhchemParser.go(m[1]) }; - }, - 'r=': function (buffer, m) { buffer.r = m; }, - 'rdt=': function (buffer, m) { buffer.rdt = m; }, - 'rd=': function (buffer, m) { buffer.rd = m; }, - 'rqt=': function (buffer, m) { buffer.rqt = m; }, - 'rq=': function (buffer, m) { buffer.rq = m; }, - 'operator': function (buffer, m, p1) { return { type_: 'operator', kind_: (p1 || m) }; } - } - }, - 'a': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': {} }, - '1/2$': { - '0': { action_: '1/2' } }, - 'else': { - '0': { nextState: '1', revisit: true } }, - '$(...)$': { - '*': { action_: 'tex-math tight', nextState: '1' } }, - ',': { - '*': { action_: { type_: 'insert', option: 'commaDecimal' } } }, - 'else2': { - '*': { action_: 'copy' } } - }), - actions: {} - }, - 'o': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': {} }, - '1/2$': { - '0': { action_: '1/2' } }, - 'else': { - '0': { nextState: '1', revisit: true } }, - 'letters': { - '*': { action_: 'rm' } }, - '\\ca': { - '*': { action_: { type_: 'insert', option: 'circa' } } }, - '\\x{}{}|\\x{}|\\x': { - '*': { action_: 'copy' } }, - '${(...)}$|$(...)$': { - '*': { action_: 'tex-math' } }, - '{(...)}': { - '*': { action_: '{text}' } }, - 'else2': { - '*': { action_: 'copy' } } - }), - actions: {} - }, - 'text': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': { action_: 'output' } }, - '{...}': { - '*': { action_: 'text=' } }, - '${(...)}$|$(...)$': { - '*': { action_: 'tex-math' } }, - '\\greek': { - '*': { action_: [ 'output', 'rm' ] } }, - '\\,|\\x{}{}|\\x{}|\\x': { - '*': { action_: [ 'output', 'copy' ] } }, - 'else': { - '*': { action_: 'text=' } } - }), - actions: { - 'output': function (buffer) { - if (buffer.text_) { - /** @type {ParserOutput} */ - var ret = { type_: 'text', p1: buffer.text_ }; - for (var p in buffer) { delete buffer[p]; } - return ret; - } - } - } - }, - 'pq': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': {} }, - 'state of aggregation $': { - '*': { action_: 'state of aggregation' } }, - 'i$': { - '0': { nextState: '!f', revisit: true } }, - '(KV letters),': { - '0': { action_: 'rm', nextState: '0' } }, - 'formula$': { - '0': { nextState: 'f', revisit: true } }, - '1/2$': { - '0': { action_: '1/2' } }, - 'else': { - '0': { nextState: '!f', revisit: true } }, - '${(...)}$|$(...)$': { - '*': { action_: 'tex-math' } }, - '{(...)}': { - '*': { action_: 'text' } }, - 'a-z': { - 'f': { action_: 'tex-math' } }, - 'letters': { - '*': { action_: 'rm' } }, - '-9.,9': { - '*': { action_: '9,9' } }, - ',': { - '*': { action_: { type_: 'insert+p1', option: 'comma enumeration S' } } }, - '\\color{(...)}{(...)}1|\\color(...){(...)}2': { - '*': { action_: 'color-output' } }, - '\\color{(...)}0': { - '*': { action_: 'color0-output' } }, - '\\ce{(...)}': { - '*': { action_: 'ce' } }, - '\\,|\\x{}{}|\\x{}|\\x': { - '*': { action_: 'copy' } }, - 'else2': { - '*': { action_: 'copy' } } - }), - actions: { - 'state of aggregation': function (buffer, m) { - return { type_: 'state of aggregation subscript', p1: mhchemParser.go(m, 'o') }; - }, - 'color-output': function (buffer, m) { - return { type_: 'color', color1: m[0], color2: mhchemParser.go(m[1], 'pq') }; - } - } - }, - 'bd': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': {} }, - 'x$': { - '0': { nextState: '!f', revisit: true } }, - 'formula$': { - '0': { nextState: 'f', revisit: true } }, - 'else': { - '0': { nextState: '!f', revisit: true } }, - '-9.,9 no missing 0': { - '*': { action_: '9,9' } }, - '.': { - '*': { action_: { type_: 'insert', option: 'electron dot' } } }, - 'a-z': { - 'f': { action_: 'tex-math' } }, - 'x': { - '*': { action_: { type_: 'insert', option: 'KV x' } } }, - 'letters': { - '*': { action_: 'rm' } }, - '\'': { - '*': { action_: { type_: 'insert', option: 'prime' } } }, - '${(...)}$|$(...)$': { - '*': { action_: 'tex-math' } }, - '{(...)}': { - '*': { action_: 'text' } }, - '\\color{(...)}{(...)}1|\\color(...){(...)}2': { - '*': { action_: 'color-output' } }, - '\\color{(...)}0': { - '*': { action_: 'color0-output' } }, - '\\ce{(...)}': { - '*': { action_: 'ce' } }, - '\\,|\\x{}{}|\\x{}|\\x': { - '*': { action_: 'copy' } }, - 'else2': { - '*': { action_: 'copy' } } - }), - actions: { - 'color-output': function (buffer, m) { - return { type_: 'color', color1: m[0], color2: mhchemParser.go(m[1], 'bd') }; - } - } - }, - 'oxidation': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': {} }, - 'roman numeral': { - '*': { action_: 'roman-numeral' } }, - '${(...)}$|$(...)$': { - '*': { action_: 'tex-math' } }, - 'else': { - '*': { action_: 'copy' } } - }), - actions: { - 'roman-numeral': function (buffer, m) { return { type_: 'roman numeral', p1: m || "" }; } - } - }, - 'tex-math': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': { action_: 'output' } }, - '\\ce{(...)}': { - '*': { action_: [ 'output', 'ce' ] } }, - '{...}|\\,|\\x{}{}|\\x{}|\\x': { - '*': { action_: 'o=' } }, - 'else': { - '*': { action_: 'o=' } } - }), - actions: { - 'output': function (buffer) { - if (buffer.o) { - /** @type {ParserOutput} */ - var ret = { type_: 'tex-math', p1: buffer.o }; - for (var p in buffer) { delete buffer[p]; } - return ret; - } - } - } - }, - 'tex-math tight': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': { action_: 'output' } }, - '\\ce{(...)}': { - '*': { action_: [ 'output', 'ce' ] } }, - '{...}|\\,|\\x{}{}|\\x{}|\\x': { - '*': { action_: 'o=' } }, - '-|+': { - '*': { action_: 'tight operator' } }, - 'else': { - '*': { action_: 'o=' } } - }), - actions: { - 'tight operator': function (buffer, m) { buffer.o = (buffer.o || "") + "{"+m+"}"; }, - 'output': function (buffer) { - if (buffer.o) { - /** @type {ParserOutput} */ - var ret = { type_: 'tex-math', p1: buffer.o }; - for (var p in buffer) { delete buffer[p]; } - return ret; - } - } - } - }, - '9,9': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': {} }, - ',': { - '*': { action_: 'comma' } }, - 'else': { - '*': { action_: 'copy' } } - }), - actions: { - 'comma': function () { return { type_: 'commaDecimal' }; } - } - }, - //#endregion - // - // \pu state machines - // - //#region pu - 'pu': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': { action_: 'output' } }, - 'space$': { - '*': { action_: [ 'output', 'space' ] } }, - '{[(|)]}': { - '0|a': { action_: 'copy' } }, - '(-)(9)^(-9)': { - '0': { action_: 'number^', nextState: 'a' } }, - '(-)(9.,9)(e)(99)': { - '0': { action_: 'enumber', nextState: 'a' } }, - 'space': { - '0|a': {} }, - 'pm-operator': { - '0|a': { action_: { type_: 'operator', option: '\\pm' }, nextState: '0' } }, - 'operator': { - '0|a': { action_: 'copy', nextState: '0' } }, - '//': { - 'd': { action_: 'o=', nextState: '/' } }, - '/': { - 'd': { action_: 'o=', nextState: '/' } }, - '{...}|else': { - '0|d': { action_: 'd=', nextState: 'd' }, - 'a': { action_: [ 'space', 'd=' ], nextState: 'd' }, - '/|q': { action_: 'q=', nextState: 'q' } } - }), - actions: { - 'enumber': function (buffer, m) { - /** @type {ParserOutput[]} */ - var ret = []; - if (m[0] === "+-" || m[0] === "+/-") { - ret.push("\\pm "); - } else if (m[0]) { - ret.push(m[0]); - } - if (m[1]) { - mhchemParser.concatArray(ret, mhchemParser.go(m[1], 'pu-9,9')); - if (m[2]) { - if (m[2].match(/[,.]/)) { - mhchemParser.concatArray(ret, mhchemParser.go(m[2], 'pu-9,9')); - } else { - ret.push(m[2]); - } - } - m[3] = m[4] || m[3]; - if (m[3]) { - m[3] = m[3].trim(); - if (m[3] === "e" || m[3].substr(0, 1) === "*") { - ret.push({ type_: 'cdot' }); - } else { - ret.push({ type_: 'times' }); - } - } - } - if (m[3]) { - ret.push("10^{"+m[5]+"}"); - } - return ret; - }, - 'number^': function (buffer, m) { - /** @type {ParserOutput[]} */ - var ret = []; - if (m[0] === "+-" || m[0] === "+/-") { - ret.push("\\pm "); - } else if (m[0]) { - ret.push(m[0]); - } - mhchemParser.concatArray(ret, mhchemParser.go(m[1], 'pu-9,9')); - ret.push("^{"+m[2]+"}"); - return ret; - }, - 'operator': function (buffer, m, p1) { return { type_: 'operator', kind_: (p1 || m) }; }, - 'space': function () { return { type_: 'pu-space-1' }; }, - 'output': function (buffer) { - /** @type {ParserOutput | ParserOutput[]} */ - var ret; - var md = mhchemParser.patterns.match_('{(...)}', buffer.d || ""); - if (md && md.remainder === '') { buffer.d = md.match_; } - var mq = mhchemParser.patterns.match_('{(...)}', buffer.q || ""); - if (mq && mq.remainder === '') { buffer.q = mq.match_; } - if (buffer.d) { - buffer.d = buffer.d.replace(/\u00B0C|\^oC|\^{o}C/g, "{}^{\\circ}C"); - buffer.d = buffer.d.replace(/\u00B0F|\^oF|\^{o}F/g, "{}^{\\circ}F"); - } - if (buffer.q) { // fraction - buffer.q = buffer.q.replace(/\u00B0C|\^oC|\^{o}C/g, "{}^{\\circ}C"); - buffer.q = buffer.q.replace(/\u00B0F|\^oF|\^{o}F/g, "{}^{\\circ}F"); - var b5 = { - d: mhchemParser.go(buffer.d, 'pu'), - q: mhchemParser.go(buffer.q, 'pu') - }; - if (buffer.o === '//') { - ret = { type_: 'pu-frac', p1: b5.d, p2: b5.q }; - } else { - ret = b5.d; - if (b5.d.length > 1 || b5.q.length > 1) { - ret.push({ type_: ' / ' }); - } else { - ret.push({ type_: '/' }); - } - mhchemParser.concatArray(ret, b5.q); - } - } else { // no fraction - ret = mhchemParser.go(buffer.d, 'pu-2'); - } - for (var p in buffer) { delete buffer[p]; } - return ret; - } - } - }, - 'pu-2': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': { action_: 'output' } }, - '*': { - '*': { action_: [ 'output', 'cdot' ], nextState: '0' } }, - '\\x': { - '*': { action_: 'rm=' } }, - 'space': { - '*': { action_: [ 'output', 'space' ], nextState: '0' } }, - '^{(...)}|^(-1)': { - '1': { action_: '^(-1)' } }, - '-9.,9': { - '0': { action_: 'rm=', nextState: '0' }, - '1': { action_: '^(-1)', nextState: '0' } }, - '{...}|else': { - '*': { action_: 'rm=', nextState: '1' } } - }), - actions: { - 'cdot': function () { return { type_: 'tight cdot' }; }, - '^(-1)': function (buffer, m) { buffer.rm += "^{"+m+"}"; }, - 'space': function () { return { type_: 'pu-space-2' }; }, - 'output': function (buffer) { - /** @type {ParserOutput | ParserOutput[]} */ - var ret = []; - if (buffer.rm) { - var mrm = mhchemParser.patterns.match_('{(...)}', buffer.rm || ""); - if (mrm && mrm.remainder === '') { - ret = mhchemParser.go(mrm.match_, 'pu'); - } else { - ret = { type_: 'rm', p1: buffer.rm }; - } - } - for (var p in buffer) { delete buffer[p]; } - return ret; - } - } - }, - 'pu-9,9': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '0': { action_: 'output-0' }, - 'o': { action_: 'output-o' } }, - ',': { - '0': { action_: [ 'output-0', 'comma' ], nextState: 'o' } }, - '.': { - '0': { action_: [ 'output-0', 'copy' ], nextState: 'o' } }, - 'else': { - '*': { action_: 'text=' } } - }), - actions: { - 'comma': function () { return { type_: 'commaDecimal' }; }, - 'output-0': function (buffer) { - /** @type {ParserOutput[]} */ - var ret = []; - buffer.text_ = buffer.text_ || ""; - if (buffer.text_.length > 4) { - var a = buffer.text_.length % 3; - if (a === 0) { a = 3; } - for (var i=buffer.text_.length-3; i>0; i-=3) { - ret.push(buffer.text_.substr(i, 3)); - ret.push({ type_: '1000 separator' }); - } - ret.push(buffer.text_.substr(0, a)); - ret.reverse(); - } else { - ret.push(buffer.text_); - } - for (var p in buffer) { delete buffer[p]; } - return ret; - }, - 'output-o': function (buffer) { - /** @type {ParserOutput[]} */ - var ret = []; - buffer.text_ = buffer.text_ || ""; - if (buffer.text_.length > 4) { - var a = buffer.text_.length - 3; - for (var i=0; i, so we change \vphantom{X} to {} - // TODO: Reinstate \vphantom{X} when the Firefox bug is fixed. -// res += "{\\vphantom{X}}"; - res += "{{}}"; - res += "_{\\smash[t]{"+b5.q+"}}"; - } - } else { - if (b5.q) { - // TODO: Reinstate \vphantom{X} when the Firefox bug is fixed. -// res += "{\\vphantom{X}}"; - res += "{{}}"; - res += "_{\\smash[t]{"+b5.q+"}}"; - } - if (b5.d) { - // TODO: Reinstate \vphantom{X} when the Firefox bug is fixed. -// res += "{\\vphantom{X}}"; - res += "{{}}"; - res += "^{"+b5.d+"}"; - } - } - break; - case 'rm': - res = "\\mathrm{"+buf.p1+"}"; - break; - case 'text': - if (buf.p1.match(/[\^_]/)) { - buf.p1 = buf.p1.replace(" ", "~").replace("-", "\\text{-}"); - res = "\\mathrm{"+buf.p1+"}"; - } else { - res = "\\text{"+buf.p1+"}"; - } - break; - case 'roman numeral': - res = "\\mathrm{"+buf.p1+"}"; - break; - case 'state of aggregation': - res = "\\mskip2mu "+texify._goInner(buf.p1); - break; - case 'state of aggregation subscript': - res = "\\mskip1mu "+texify._goInner(buf.p1); - break; - case 'bond': - res = texify._getBond(buf.kind_); - if (!res) { - throw ["MhchemErrorBond", "mhchem Error. Unknown bond type (" + buf.kind_ + ")"]; - } - break; - case 'frac': - var c = "\\frac{" + buf.p1 + "}{" + buf.p2 + "}"; - res = "\\mathchoice{\\textstyle"+c+"}{"+c+"}{"+c+"}{"+c+"}"; - break; - case 'pu-frac': - var d = "\\frac{" + texify._goInner(buf.p1) + "}{" + texify._goInner(buf.p2) + "}"; - res = "\\mathchoice{\\textstyle"+d+"}{"+d+"}{"+d+"}{"+d+"}"; - break; - case 'tex-math': - res = buf.p1 + " "; - break; - case 'frac-ce': - res = "\\frac{" + texify._goInner(buf.p1) + "}{" + texify._goInner(buf.p2) + "}"; - break; - case 'overset': - res = "\\overset{" + texify._goInner(buf.p1) + "}{" + texify._goInner(buf.p2) + "}"; - break; - case 'underset': - res = "\\underset{" + texify._goInner(buf.p1) + "}{" + texify._goInner(buf.p2) + "}"; - break; - case 'underbrace': - res = "\\underbrace{" + texify._goInner(buf.p1) + "}_{" + texify._goInner(buf.p2) + "}"; - break; - case 'color': - res = "{\\color{" + buf.color1 + "}{" + texify._goInner(buf.color2) + "}}"; - break; - case 'color0': - res = "\\color{" + buf.color + "}"; - break; - case 'arrow': - var b6 = { - rd: texify._goInner(buf.rd), - rq: texify._goInner(buf.rq) - }; - var arrow = texify._getArrow(buf.r); - if (b6.rq) { arrow += "[{\\rm " + b6.rq + "}]"; } - if (b6.rd) { - arrow += "{\\rm " + b6.rd + "}"; - } else { - arrow += "{}"; - } - res = arrow; - break; - case 'operator': - res = texify._getOperator(buf.kind_); - break; - case '1st-level escape': - res = buf.p1+" "; // &, \\\\, \\hlin - break; - case 'space': - res = " "; - break; - case 'entitySkip': - res = "~"; - break; - case 'pu-space-1': - res = "~"; - break; - case 'pu-space-2': - res = "\\mkern3mu "; - break; - case '1000 separator': - res = "\\mkern2mu "; - break; - case 'commaDecimal': - res = "{,}"; - break; - case 'comma enumeration L': - res = "{"+buf.p1+"}\\mkern6mu "; - break; - case 'comma enumeration M': - res = "{"+buf.p1+"}\\mkern3mu "; - break; - case 'comma enumeration S': - res = "{"+buf.p1+"}\\mkern1mu "; - break; - case 'hyphen': - res = "\\text{-}"; - break; - case 'addition compound': - res = "\\,{\\cdot}\\,"; - break; - case 'electron dot': - res = "\\mkern1mu \\text{\\textbullet}\\mkern1mu "; - break; - case 'KV x': - res = "{\\times}"; - break; - case 'prime': - res = "\\prime "; - break; - case 'cdot': - res = "\\cdot "; - break; - case 'tight cdot': - res = "\\mkern1mu{\\cdot}\\mkern1mu "; - break; - case 'times': - res = "\\times "; - break; - case 'circa': - res = "{\\sim}"; - break; - case '^': - res = "uparrow"; - break; - case 'v': - res = "downarrow"; - break; - case 'ellipsis': - res = "\\ldots "; - break; - case '/': - res = "/"; - break; - case ' / ': - res = "\\,/\\,"; - break; - default: - throw ["MhchemBugT", "mhchem bug T. Please report."]; // Missing texify rule or unknown MhchemParser output - } - return res; - }, - _getArrow: function (a) { - switch (a) { - case "->": return "\\yields"; - case "\u2192": return "\\yields"; - case "\u27F6": return "\\yields"; - case "<-": return "\\yieldsLeft"; - case "<->": return "\\mesomerism"; - case "<-->": return "\\yieldsLeftRight"; - case "<=>": return "\\equilibrium"; - case "\u21CC": return "\\equilibrium"; - case "<=>>": return "\\equilibriumRight"; - case "<<=>": return "\\equilibriumLeft"; - default: - throw ["MhchemBugT", "mhchem bug T. Please report."]; - } - }, - _getBond: function (a) { - switch (a) { - case "-": return "{-}"; - case "1": return "{-}"; - case "=": return "{=}"; - case "2": return "{=}"; - case "#": return "{\\equiv}"; - case "3": return "{\\equiv}"; - case "~": return "{\\tripleDash}"; - case "~-": return "{\\tripleDashOverLine}"; - case "~=": return "{\\tripleDashOverDoubleLine}"; - case "~--": return "{\\tripleDashOverDoubleLine}"; - case "-~-": return "{\\tripleDashBetweenDoubleLine}"; - case "...": return "{{\\cdot}{\\cdot}{\\cdot}}"; - case "....": return "{{\\cdot}{\\cdot}{\\cdot}{\\cdot}}"; - case "->": return "{\\rightarrow}"; - case "<-": return "{\\leftarrow}"; - case "<": return "{<}"; - case ">": return "{>}"; - default: - throw ["MhchemBugT", "mhchem bug T. Please report."]; - } - }, - _getOperator: function (a) { - switch (a) { - case "+": return " {}+{} "; - case "-": return " {}-{} "; - case "=": return " {}={} "; - case "<": return " {}<{} "; - case ">": return " {}>{} "; - case "<<": return " {}\\ll{} "; - case ">>": return " {}\\gg{} "; - case "\\pm": return " {}\\pm{} "; - case "\\approx": return " {}\\approx{} "; - case "$\\approx$": return " {}\\approx{} "; - case "v": return " \\downarrow{} "; - case "(v)": return " \\downarrow{} "; - case "^": return " \\uparrow{} "; - case "(^)": return " \\uparrow{} "; - default: - throw ["MhchemBugT", "mhchem bug T. Please report."]; - } - } - }; - -/* eslint-disable no-undef */ - -////////////////////////////////////////////////////////////////////// -// texvc.sty - -// The texvc package contains macros available in mediawiki pages. -// We omit the functions deprecated at -// https://en.wikipedia.org/wiki/Help:Displaying_a_formula#Deprecated_syntax - -// We also omit texvc's \O, which conflicts with \text{\O} - -defineMacro("\\darr", "\\downarrow"); -defineMacro("\\dArr", "\\Downarrow"); -defineMacro("\\Darr", "\\Downarrow"); -defineMacro("\\lang", "\\langle"); -defineMacro("\\rang", "\\rangle"); -defineMacro("\\uarr", "\\uparrow"); -defineMacro("\\uArr", "\\Uparrow"); -defineMacro("\\Uarr", "\\Uparrow"); -defineMacro("\\N", "\\mathbb{N}"); -defineMacro("\\R", "\\mathbb{R}"); -defineMacro("\\Z", "\\mathbb{Z}"); -defineMacro("\\alef", "\\aleph"); -defineMacro("\\alefsym", "\\aleph"); -defineMacro("\\bull", "\\bullet"); -defineMacro("\\clubs", "\\clubsuit"); -defineMacro("\\cnums", "\\mathbb{C}"); -defineMacro("\\Complex", "\\mathbb{C}"); -defineMacro("\\Dagger", "\\ddagger"); -defineMacro("\\diamonds", "\\diamondsuit"); -defineMacro("\\empty", "\\emptyset"); -defineMacro("\\exist", "\\exists"); -defineMacro("\\harr", "\\leftrightarrow"); -defineMacro("\\hArr", "\\Leftrightarrow"); -defineMacro("\\Harr", "\\Leftrightarrow"); -defineMacro("\\hearts", "\\heartsuit"); -defineMacro("\\image", "\\Im"); -defineMacro("\\infin", "\\infty"); -defineMacro("\\isin", "\\in"); -defineMacro("\\larr", "\\leftarrow"); -defineMacro("\\lArr", "\\Leftarrow"); -defineMacro("\\Larr", "\\Leftarrow"); -defineMacro("\\lrarr", "\\leftrightarrow"); -defineMacro("\\lrArr", "\\Leftrightarrow"); -defineMacro("\\Lrarr", "\\Leftrightarrow"); -defineMacro("\\natnums", "\\mathbb{N}"); -defineMacro("\\plusmn", "\\pm"); -defineMacro("\\rarr", "\\rightarrow"); -defineMacro("\\rArr", "\\Rightarrow"); -defineMacro("\\Rarr", "\\Rightarrow"); -defineMacro("\\real", "\\Re"); -defineMacro("\\reals", "\\mathbb{R}"); -defineMacro("\\Reals", "\\mathbb{R}"); -defineMacro("\\sdot", "\\cdot"); -defineMacro("\\sect", "\\S"); -defineMacro("\\spades", "\\spadesuit"); -defineMacro("\\sub", "\\subset"); -defineMacro("\\sube", "\\subseteq"); -defineMacro("\\supe", "\\supseteq"); -defineMacro("\\thetasym", "\\vartheta"); -defineMacro("\\weierp", "\\wp"); - -/* eslint-disable no-undef */ - -/**************************************************** - * - * physics.js - * - * Implements the Physics Package for LaTeX input. - * - * --------------------------------------------------------------------- - * - * The original version of this file is licensed as follows: - * Copyright (c) 2015-2016 Kolen Cheung . - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * --------------------------------------------------------------------- - * - * This file has been revised from the original in the following ways: - * 1. The interface is changed so that it can be called from Temml, not MathJax. - * 2. \Re and \Im are not used, to avoid conflict with existing LaTeX letters. - * - * This revision of the file is released under the MIT license. - * https://mit-license.org/ - */ -defineMacro("\\quantity", "{\\left\\{ #1 \\right\\}}"); -defineMacro("\\qty", "{\\left\\{ #1 \\right\\}}"); -defineMacro("\\pqty", "{\\left( #1 \\right)}"); -defineMacro("\\bqty", "{\\left[ #1 \\right]}"); -defineMacro("\\vqty", "{\\left\\vert #1 \\right\\vert}"); -defineMacro("\\Bqty", "{\\left\\{ #1 \\right\\}}"); -defineMacro("\\absolutevalue", "{\\left\\vert #1 \\right\\vert}"); -defineMacro("\\abs", "{\\left\\vert #1 \\right\\vert}"); -defineMacro("\\norm", "{\\left\\Vert #1 \\right\\Vert}"); -defineMacro("\\evaluated", "{\\left.#1 \\right\\vert}"); -defineMacro("\\eval", "{\\left.#1 \\right\\vert}"); -defineMacro("\\order", "{\\mathcal{O} \\left( #1 \\right)}"); -defineMacro("\\commutator", "{\\left[ #1 , #2 \\right]}"); -defineMacro("\\comm", "{\\left[ #1 , #2 \\right]}"); -defineMacro("\\anticommutator", "{\\left\\{ #1 , #2 \\right\\}}"); -defineMacro("\\acomm", "{\\left\\{ #1 , #2 \\right\\}}"); -defineMacro("\\poissonbracket", "{\\left\\{ #1 , #2 \\right\\}}"); -defineMacro("\\pb", "{\\left\\{ #1 , #2 \\right\\}}"); -defineMacro("\\vectorbold", "{\\boldsymbol{ #1 }}"); -defineMacro("\\vb", "{\\boldsymbol{ #1 }}"); -defineMacro("\\vectorarrow", "{\\vec{\\boldsymbol{ #1 }}}"); -defineMacro("\\va", "{\\vec{\\boldsymbol{ #1 }}}"); -defineMacro("\\vectorunit", "{{\\boldsymbol{\\hat{ #1 }}}}"); -defineMacro("\\vu", "{{\\boldsymbol{\\hat{ #1 }}}}"); -defineMacro("\\dotproduct", "\\mathbin{\\boldsymbol\\cdot}"); -defineMacro("\\vdot", "{\\boldsymbol\\cdot}"); -defineMacro("\\crossproduct", "\\mathbin{\\boldsymbol\\times}"); -defineMacro("\\cross", "\\mathbin{\\boldsymbol\\times}"); -defineMacro("\\cp", "\\mathbin{\\boldsymbol\\times}"); -defineMacro("\\gradient", "{\\boldsymbol\\nabla}"); -defineMacro("\\grad", "{\\boldsymbol\\nabla}"); -defineMacro("\\divergence", "{\\grad\\vdot}"); -//defineMacro("\\div", "{\\grad\\vdot}"); Not included in Temml. Conflicts w/LaTeX \div -defineMacro("\\curl", "{\\grad\\cross}"); -defineMacro("\\laplacian", "\\nabla^2"); -defineMacro("\\tr", "{\\operatorname{tr}}"); -defineMacro("\\Tr", "{\\operatorname{Tr}}"); -defineMacro("\\rank", "{\\operatorname{rank}}"); -defineMacro("\\erf", "{\\operatorname{erf}}"); -defineMacro("\\Res", "{\\operatorname{Res}}"); -defineMacro("\\principalvalue", "{\\mathcal{P}}"); -defineMacro("\\pv", "{\\mathcal{P}}"); -defineMacro("\\PV", "{\\operatorname{P.V.}}"); -// Temml does not use the next two lines. They conflict with LaTeX letters. -//defineMacro("\\Re", "{\\operatorname{Re} \\left\\{ #1 \\right\\}}"); -//defineMacro("\\Im", "{\\operatorname{Im} \\left\\{ #1 \\right\\}}"); -defineMacro("\\qqtext", "{\\quad\\text{ #1 }\\quad}"); -defineMacro("\\qq", "{\\quad\\text{ #1 }\\quad}"); -defineMacro("\\qcomma", "{\\text{,}\\quad}"); -defineMacro("\\qc", "{\\text{,}\\quad}"); -defineMacro("\\qcc", "{\\quad\\text{c.c.}\\quad}"); -defineMacro("\\qif", "{\\quad\\text{if}\\quad}"); -defineMacro("\\qthen", "{\\quad\\text{then}\\quad}"); -defineMacro("\\qelse", "{\\quad\\text{else}\\quad}"); -defineMacro("\\qotherwise", "{\\quad\\text{otherwise}\\quad}"); -defineMacro("\\qunless", "{\\quad\\text{unless}\\quad}"); -defineMacro("\\qgiven", "{\\quad\\text{given}\\quad}"); -defineMacro("\\qusing", "{\\quad\\text{using}\\quad}"); -defineMacro("\\qassume", "{\\quad\\text{assume}\\quad}"); -defineMacro("\\qsince", "{\\quad\\text{since}\\quad}"); -defineMacro("\\qlet", "{\\quad\\text{let}\\quad}"); -defineMacro("\\qfor", "{\\quad\\text{for}\\quad}"); -defineMacro("\\qall", "{\\quad\\text{all}\\quad}"); -defineMacro("\\qeven", "{\\quad\\text{even}\\quad}"); -defineMacro("\\qodd", "{\\quad\\text{odd}\\quad}"); -defineMacro("\\qinteger", "{\\quad\\text{integer}\\quad}"); -defineMacro("\\qand", "{\\quad\\text{and}\\quad}"); -defineMacro("\\qor", "{\\quad\\text{or}\\quad}"); -defineMacro("\\qas", "{\\quad\\text{as}\\quad}"); -defineMacro("\\qin", "{\\quad\\text{in}\\quad}"); -defineMacro("\\differential", "{\\text{d}}"); -defineMacro("\\dd", "{\\text{d}}"); -defineMacro("\\derivative", "{\\frac{\\text{d}{ #1 }}{\\text{d}{ #2 }}}"); -defineMacro("\\dv", "{\\frac{\\text{d}{ #1 }}{\\text{d}{ #2 }}}"); -defineMacro("\\partialderivative", "{\\frac{\\partial{ #1 }}{\\partial{ #2 }}}"); -defineMacro("\\variation", "{\\delta}"); -defineMacro("\\var", "{\\delta}"); -defineMacro("\\functionalderivative", "{\\frac{\\delta{ #1 }}{\\delta{ #2 }}}"); -defineMacro("\\fdv", "{\\frac{\\delta{ #1 }}{\\delta{ #2 }}}"); -defineMacro("\\innerproduct", "{\\left\\langle {#1} \\mid { #2} \\right\\rangle}"); -defineMacro("\\outerproduct", - "{\\left\\vert { #1 } \\right\\rangle\\left\\langle { #2} \\right\\vert}"); -defineMacro("\\dyad", - "{\\left\\vert { #1 } \\right\\rangle\\left\\langle { #2} \\right\\vert}"); -defineMacro("\\ketbra", - "{\\left\\vert { #1 } \\right\\rangle\\left\\langle { #2} \\right\\vert}"); -defineMacro("\\op", - "{\\left\\vert { #1 } \\right\\rangle\\left\\langle { #2} \\right\\vert}"); -defineMacro("\\expectationvalue", "{\\left\\langle {#1 } \\right\\rangle}"); -defineMacro("\\expval", "{\\left\\langle {#1 } \\right\\rangle}"); -defineMacro("\\ev", "{\\left\\langle {#1 } \\right\\rangle}"); -defineMacro("\\matrixelement", - "{\\left\\langle{ #1 }\\right\\vert{ #2 }\\left\\vert{#3}\\right\\rangle}"); -defineMacro("\\matrixel", - "{\\left\\langle{ #1 }\\right\\vert{ #2 }\\left\\vert{#3}\\right\\rangle}"); -defineMacro("\\mel", - "{\\left\\langle{ #1 }\\right\\vert{ #2 }\\left\\vert{#3}\\right\\rangle}"); - -/** - * This file contains the “gullet” where macros are expanded - * until only non-macro tokens remain. - */ - -// List of commands that act like macros but aren't defined as a macro, -// function, or symbol. Used in `isDefined`. -const implicitCommands = { - "^": true, // Parser.js - _: true, // Parser.js - "\\limits": true, // Parser.js - "\\nolimits": true // Parser.js -}; - -class MacroExpander { - constructor(input, settings, mode) { - this.settings = settings; - this.expansionCount = 0; - this.feed(input); - // Make new global namespace - this.macros = new Namespace(macros, settings.macros); - this.mode = mode; - this.stack = []; // contains tokens in REVERSE order - } - - /** - * Feed a new input string to the same MacroExpander - * (with existing macros etc.). - */ - feed(input) { - this.lexer = new Lexer(input, this.settings); - } - - /** - * Switches between "text" and "math" modes. - */ - switchMode(newMode) { - this.mode = newMode; - } - - /** - * Start a new group nesting within all namespaces. - */ - beginGroup() { - this.macros.beginGroup(); - } - - /** - * End current group nesting within all namespaces. - */ - endGroup() { - this.macros.endGroup(); - } - - /** - * Returns the topmost token on the stack, without expanding it. - * Similar in behavior to TeX's `\futurelet`. - */ - future() { - if (this.stack.length === 0) { - this.pushToken(this.lexer.lex()); - } - return this.stack[this.stack.length - 1] - } - - /** - * Remove and return the next unexpanded token. - */ - popToken() { - this.future(); // ensure non-empty stack - return this.stack.pop(); - } - - /** - * Add a given token to the token stack. In particular, this get be used - * to put back a token returned from one of the other methods. - */ - pushToken(token) { - this.stack.push(token); - } - - /** - * Append an array of tokens to the token stack. - */ - pushTokens(tokens) { - this.stack.push(...tokens); - } - - /** - * Find an macro argument without expanding tokens and append the array of - * tokens to the token stack. Uses Token as a container for the result. - */ - scanArgument(isOptional) { - let start; - let end; - let tokens; - if (isOptional) { - this.consumeSpaces(); // \@ifnextchar gobbles any space following it - if (this.future().text !== "[") { - return null; - } - start = this.popToken(); // don't include [ in tokens - ({ tokens, end } = this.consumeArg(["]"])); - } else { - ({ tokens, start, end } = this.consumeArg()); - } - - // indicate the end of an argument - this.pushToken(new Token("EOF", end.loc)); - - this.pushTokens(tokens); - return start.range(end, ""); - } - - /** - * Consume all following space tokens, without expansion. - */ - consumeSpaces() { - for (;;) { - const token = this.future(); - if (token.text === " ") { - this.stack.pop(); - } else { - break; - } - } - } - - /** - * Consume an argument from the token stream, and return the resulting array - * of tokens and start/end token. - */ - consumeArg(delims) { - // The argument for a delimited parameter is the shortest (possibly - // empty) sequence of tokens with properly nested {...} groups that is - // followed ... by this particular list of non-parameter tokens. - // The argument for an undelimited parameter is the next nonblank - // token, unless that token is ‘{’, when the argument will be the - // entire {...} group that follows. - const tokens = []; - const isDelimited = delims && delims.length > 0; - if (!isDelimited) { - // Ignore spaces between arguments. As the TeXbook says: - // "After you have said ‘\def\row#1#2{...}’, you are allowed to - // put spaces between the arguments (e.g., ‘\row x n’), because - // TeX doesn’t use single spaces as undelimited arguments." - this.consumeSpaces(); - } - const start = this.future(); - let tok; - let depth = 0; - let match = 0; - do { - tok = this.popToken(); - tokens.push(tok); - if (tok.text === "{") { - ++depth; - } else if (tok.text === "}") { - --depth; - if (depth === -1) { - throw new ParseError("Extra }", tok); - } - } else if (tok.text === "EOF") { - throw new ParseError( - "Unexpected end of input in a macro argument" + - ", expected '" + - (delims && isDelimited ? delims[match] : "}") + - "'", - tok - ); - } - if (delims && isDelimited) { - if ((depth === 0 || (depth === 1 && delims[match] === "{")) && tok.text === delims[match]) { - ++match; - if (match === delims.length) { - // don't include delims in tokens - tokens.splice(-match, match); - break; - } - } else { - match = 0; - } - } - } while (depth !== 0 || isDelimited); - // If the argument found ... has the form ‘{}’, - // ... the outermost braces enclosing the argument are removed - if (start.text === "{" && tokens[tokens.length - 1].text === "}") { - tokens.pop(); - tokens.shift(); - } - tokens.reverse(); // to fit in with stack order - return { tokens, start, end: tok }; - } - - /** - * Consume the specified number of (delimited) arguments from the token - * stream and return the resulting array of arguments. - */ - consumeArgs(numArgs, delimiters) { - if (delimiters) { - if (delimiters.length !== numArgs + 1) { - throw new ParseError("The length of delimiters doesn't match the number of args!"); - } - const delims = delimiters[0]; - for (let i = 0; i < delims.length; i++) { - const tok = this.popToken(); - if (delims[i] !== tok.text) { - throw new ParseError("Use of the macro doesn't match its definition", tok); - } - } - } - - const args = []; - for (let i = 0; i < numArgs; i++) { - args.push(this.consumeArg(delimiters && delimiters[i + 1]).tokens); - } - return args; - } - - /** - * Expand the next token only once if possible. - * - * If the token is expanded, the resulting tokens will be pushed onto - * the stack in reverse order, and the number of such tokens will be - * returned. This number might be zero or positive. - * - * If not, the return value is `false`, and the next token remains at the - * top of the stack. - * - * In either case, the next token will be on the top of the stack, - * or the stack will be empty (in case of empty expansion - * and no other tokens). - * - * Used to implement `expandAfterFuture` and `expandNextToken`. - * - * If expandableOnly, only expandable tokens are expanded and - * an undefined control sequence results in an error. - */ - expandOnce(expandableOnly) { - const topToken = this.popToken(); - const name = topToken.text; - const expansion = !topToken.noexpand ? this._getExpansion(name) : null; - if (expansion == null || (expandableOnly && expansion.unexpandable)) { - if (expandableOnly && expansion == null && name[0] === "\\" && !this.isDefined(name)) { - throw new ParseError("Undefined control sequence: " + name); - } - this.pushToken(topToken); - return false; - } - this.expansionCount++; - if (this.expansionCount > this.settings.maxExpand) { - throw new ParseError( - "Too many expansions: infinite loop or " + "need to increase maxExpand setting" - ); - } - let tokens = expansion.tokens; - const args = this.consumeArgs(expansion.numArgs, expansion.delimiters); - if (expansion.numArgs) { - // paste arguments in place of the placeholders - tokens = tokens.slice(); // make a shallow copy - for (let i = tokens.length - 1; i >= 0; --i) { - let tok = tokens[i]; - if (tok.text === "#") { - if (i === 0) { - throw new ParseError("Incomplete placeholder at end of macro body", tok); - } - tok = tokens[--i]; // next token on stack - if (tok.text === "#") { - // ## → # - tokens.splice(i + 1, 1); // drop first # - } else if (/^[1-9]$/.test(tok.text)) { - // replace the placeholder with the indicated argument - tokens.splice(i, 2, ...args[+tok.text - 1]); - } else { - throw new ParseError("Not a valid argument number", tok); - } - } - } - } - // Concatenate expansion onto top of stack. - this.pushTokens(tokens); - return tokens.length; - } - - /** - * Expand the next token only once (if possible), and return the resulting - * top token on the stack (without removing anything from the stack). - * Similar in behavior to TeX's `\expandafter\futurelet`. - * Equivalent to expandOnce() followed by future(). - */ - expandAfterFuture() { - this.expandOnce(); - return this.future(); - } - - /** - * Recursively expand first token, then return first non-expandable token. - */ - expandNextToken() { - for (;;) { - if (this.expandOnce() === false) { // fully expanded - const token = this.stack.pop(); - // The token after \noexpand is interpreted as if its meaning were ‘\relax’ - if (token.treatAsRelax) { - token.text = "\\relax"; - } - return token - } - } - - // This pathway is impossible. - throw new Error(); // eslint-disable-line no-unreachable - } - - /** - * Fully expand the given macro name and return the resulting list of - * tokens, or return `undefined` if no such macro is defined. - */ - expandMacro(name) { - return this.macros.has(name) ? this.expandTokens([new Token(name)]) : undefined; - } - - /** - * Fully expand the given token stream and return the resulting list of - * tokens. Note that the input tokens are in reverse order, but the - * output tokens are in forward order. - */ - expandTokens(tokens) { - const output = []; - const oldStackLength = this.stack.length; - this.pushTokens(tokens); - while (this.stack.length > oldStackLength) { - // Expand only expandable tokens - if (this.expandOnce(true) === false) { // fully expanded - const token = this.stack.pop(); - if (token.treatAsRelax) { - // the expansion of \noexpand is the token itself - token.noexpand = false; - token.treatAsRelax = false; - } - output.push(token); - } - } - return output; - } - - /** - * Fully expand the given macro name and return the result as a string, - * or return `undefined` if no such macro is defined. - */ - expandMacroAsText(name) { - const tokens = this.expandMacro(name); - if (tokens) { - return tokens.map((token) => token.text).join(""); - } else { - return tokens; - } - } - - /** - * Returns the expanded macro as a reversed array of tokens and a macro - * argument count. Or returns `null` if no such macro. - */ - _getExpansion(name) { - const definition = this.macros.get(name); - if (definition == null) { - // mainly checking for undefined here - return definition; - } - // If a single character has an associated catcode other than 13 - // (active character), then don't expand it. - if (name.length === 1) { - const catcode = this.lexer.catcodes[name]; - if (catcode != null && catcode !== 13) { - return - } - } - const expansion = typeof definition === "function" ? definition(this) : definition; - if (typeof expansion === "string") { - let numArgs = 0; - if (expansion.indexOf("#") !== -1) { - const stripped = expansion.replace(/##/g, ""); - while (stripped.indexOf("#" + (numArgs + 1)) !== -1) { - ++numArgs; - } - } - const bodyLexer = new Lexer(expansion, this.settings); - const tokens = []; - let tok = bodyLexer.lex(); - while (tok.text !== "EOF") { - tokens.push(tok); - tok = bodyLexer.lex(); - } - tokens.reverse(); // to fit in with stack using push and pop - const expanded = { tokens, numArgs }; - return expanded; - } - - return expansion; - } - - /** - * Determine whether a command is currently "defined" (has some - * functionality), meaning that it's a macro (in the current group), - * a function, a symbol, or one of the special commands listed in - * `implicitCommands`. - */ - isDefined(name) { - return ( - this.macros.has(name) || - Object.prototype.hasOwnProperty.call(functions, name ) || - Object.prototype.hasOwnProperty.call(symbols.math, name ) || - Object.prototype.hasOwnProperty.call(symbols.text, name ) || - Object.prototype.hasOwnProperty.call(implicitCommands, name ) - ); - } - - /** - * Determine whether a command is expandable. - */ - isExpandable(name) { - const macro = this.macros.get(name); - return macro != null - ? typeof macro === "string" || typeof macro === "function" || !macro.unexpandable - : Object.prototype.hasOwnProperty.call(functions, name ) && !functions[name].primitive; - } -} - -// Helpers for Parser.js handling of Unicode (sub|super)script characters. - -const unicodeSubRegEx = /^[₊₋₌₍₎₀₁₂₃₄₅₆₇₈₉ₐₑₕᵢⱼₖₗₘₙₒₚᵣₛₜᵤᵥₓᵦᵧᵨᵩᵪ]/; - -const uSubsAndSups = Object.freeze({ - '₊': '+', - '₋': '-', - '₌': '=', - '₍': '(', - '₎': ')', - '₀': '0', - '₁': '1', - '₂': '2', - '₃': '3', - '₄': '4', - '₅': '5', - '₆': '6', - '₇': '7', - '₈': '8', - '₉': '9', - '\u2090': 'a', - '\u2091': 'e', - '\u2095': 'h', - '\u1D62': 'i', - '\u2C7C': 'j', - '\u2096': 'k', - '\u2097': 'l', - '\u2098': 'm', - '\u2099': 'n', - '\u2092': 'o', - '\u209A': 'p', - '\u1D63': 'r', - '\u209B': 's', - '\u209C': 't', - '\u1D64': 'u', - '\u1D65': 'v', - '\u2093': 'x', - '\u1D66': 'β', - '\u1D67': 'γ', - '\u1D68': 'ρ', - '\u1D69': '\u03d5', - '\u1D6A': 'χ', - '⁺': '+', - '⁻': '-', - '⁼': '=', - '⁽': '(', - '⁾': ')', - '⁰': '0', - '¹': '1', - '²': '2', - '³': '3', - '⁴': '4', - '⁵': '5', - '⁶': '6', - '⁷': '7', - '⁸': '8', - '⁹': '9', - '\u1D2C': 'A', - '\u1D2E': 'B', - '\u1D30': 'D', - '\u1D31': 'E', - '\u1D33': 'G', - '\u1D34': 'H', - '\u1D35': 'I', - '\u1D36': 'J', - '\u1D37': 'K', - '\u1D38': 'L', - '\u1D39': 'M', - '\u1D3A': 'N', - '\u1D3C': 'O', - '\u1D3E': 'P', - '\u1D3F': 'R', - '\u1D40': 'T', - '\u1D41': 'U', - '\u2C7D': 'V', - '\u1D42': 'W', - '\u1D43': 'a', - '\u1D47': 'b', - '\u1D9C': 'c', - '\u1D48': 'd', - '\u1D49': 'e', - '\u1DA0': 'f', - '\u1D4D': 'g', - '\u02B0': 'h', - '\u2071': 'i', - '\u02B2': 'j', - '\u1D4F': 'k', - '\u02E1': 'l', - '\u1D50': 'm', - '\u207F': 'n', - '\u1D52': 'o', - '\u1D56': 'p', - '\u02B3': 'r', - '\u02E2': 's', - '\u1D57': 't', - '\u1D58': 'u', - '\u1D5B': 'v', - '\u02B7': 'w', - '\u02E3': 'x', - '\u02B8': 'y', - '\u1DBB': 'z', - '\u1D5D': 'β', - '\u1D5E': 'γ', - '\u1D5F': 'δ', - '\u1D60': '\u03d5', - '\u1D61': 'χ', - '\u1DBF': 'θ' -}); - -// Used for Unicode input of calligraphic and script letters -const asciiFromScript = Object.freeze({ - "\ud835\udc9c": "A", - "\u212c": "B", - "\ud835\udc9e": "C", - "\ud835\udc9f": "D", - "\u2130": "E", - "\u2131": "F", - "\ud835\udca2": "G", - "\u210B": "H", - "\u2110": "I", - "\ud835\udca5": "J", - "\ud835\udca6": "K", - "\u2112": "L", - "\u2133": "M", - "\ud835\udca9": "N", - "\ud835\udcaa": "O", - "\ud835\udcab": "P", - "\ud835\udcac": "Q", - "\u211B": "R", - "\ud835\udcae": "S", - "\ud835\udcaf": "T", - "\ud835\udcb0": "U", - "\ud835\udcb1": "V", - "\ud835\udcb2": "W", - "\ud835\udcb3": "X", - "\ud835\udcb4": "Y", - "\ud835\udcb5": "Z" -}); - -// Mapping of Unicode accent characters to their LaTeX equivalent in text and -// math mode (when they exist). -var unicodeAccents = { - "\u0301": { text: "\\'", math: "\\acute" }, - "\u0300": { text: "\\`", math: "\\grave" }, - "\u0308": { text: '\\"', math: "\\ddot" }, - "\u0303": { text: "\\~", math: "\\tilde" }, - "\u0304": { text: "\\=", math: "\\bar" }, - "\u0306": { text: "\\u", math: "\\breve" }, - "\u030c": { text: "\\v", math: "\\check" }, - "\u0302": { text: "\\^", math: "\\hat" }, - "\u0307": { text: "\\.", math: "\\dot" }, - "\u030a": { text: "\\r", math: "\\mathring" }, - "\u030b": { text: "\\H" }, - '\u0327': { text: '\\c' } -}; - -var unicodeSymbols = { - "á": "á", - "à": "à", - "ä": "ä", - "ǟ": "ǟ", - "ã": "ã", - "ā": "ā", - "ă": "ă", - "ắ": "ắ", - "ằ": "ằ", - "ẵ": "ẵ", - "ǎ": "ǎ", - "â": "â", - "ấ": "ấ", - "ầ": "ầ", - "ẫ": "ẫ", - "ȧ": "ȧ", - "ǡ": "ǡ", - "å": "å", - "ǻ": "ǻ", - "ḃ": "ḃ", - "ć": "ć", - "č": "č", - "ĉ": "ĉ", - "ċ": "ċ", - "ď": "ď", - "ḋ": "ḋ", - "é": "é", - "è": "è", - "ë": "ë", - "ẽ": "ẽ", - "ē": "ē", - "ḗ": "ḗ", - "ḕ": "ḕ", - "ĕ": "ĕ", - "ě": "ě", - "ê": "ê", - "ế": "ế", - "ề": "ề", - "ễ": "ễ", - "ė": "ė", - "ḟ": "ḟ", - "ǵ": "ǵ", - "ḡ": "ḡ", - "ğ": "ğ", - "ǧ": "ǧ", - "ĝ": "ĝ", - "ġ": "ġ", - "ḧ": "ḧ", - "ȟ": "ȟ", - "ĥ": "ĥ", - "ḣ": "ḣ", - "í": "í", - "ì": "ì", - "ï": "ï", - "ḯ": "ḯ", - "ĩ": "ĩ", - "ī": "ī", - "ĭ": "ĭ", - "ǐ": "ǐ", - "î": "î", - "ǰ": "ǰ", - "ĵ": "ĵ", - "ḱ": "ḱ", - "ǩ": "ǩ", - "ĺ": "ĺ", - "ľ": "ľ", - "ḿ": "ḿ", - "ṁ": "ṁ", - "ń": "ń", - "ǹ": "ǹ", - "ñ": "ñ", - "ň": "ň", - "ṅ": "ṅ", - "ó": "ó", - "ò": "ò", - "ö": "ö", - "ȫ": "ȫ", - "õ": "õ", - "ṍ": "ṍ", - "ṏ": "ṏ", - "ȭ": "ȭ", - "ō": "ō", - "ṓ": "ṓ", - "ṑ": "ṑ", - "ŏ": "ŏ", - "ǒ": "ǒ", - "ô": "ô", - "ố": "ố", - "ồ": "ồ", - "ỗ": "ỗ", - "ȯ": "ȯ", - "ȱ": "ȱ", - "ő": "ő", - "ṕ": "ṕ", - "ṗ": "ṗ", - "ŕ": "ŕ", - "ř": "ř", - "ṙ": "ṙ", - "ś": "ś", - "ṥ": "ṥ", - "š": "š", - "ṧ": "ṧ", - "ŝ": "ŝ", - "ṡ": "ṡ", - "ẗ": "ẗ", - "ť": "ť", - "ṫ": "ṫ", - "ú": "ú", - "ù": "ù", - "ü": "ü", - "ǘ": "ǘ", - "ǜ": "ǜ", - "ǖ": "ǖ", - "ǚ": "ǚ", - "ũ": "ũ", - "ṹ": "ṹ", - "ū": "ū", - "ṻ": "ṻ", - "ŭ": "ŭ", - "ǔ": "ǔ", - "û": "û", - "ů": "ů", - "ű": "ű", - "ṽ": "ṽ", - "ẃ": "ẃ", - "ẁ": "ẁ", - "ẅ": "ẅ", - "ŵ": "ŵ", - "ẇ": "ẇ", - "ẘ": "ẘ", - "ẍ": "ẍ", - "ẋ": "ẋ", - "ý": "ý", - "ỳ": "ỳ", - "ÿ": "ÿ", - "ỹ": "ỹ", - "ȳ": "ȳ", - "ŷ": "ŷ", - "ẏ": "ẏ", - "ẙ": "ẙ", - "ź": "ź", - "ž": "ž", - "ẑ": "ẑ", - "ż": "ż", - "Á": "Á", - "À": "À", - "Ä": "Ä", - "Ǟ": "Ǟ", - "Ã": "Ã", - "Ā": "Ā", - "Ă": "Ă", - "Ắ": "Ắ", - "Ằ": "Ằ", - "Ẵ": "Ẵ", - "Ǎ": "Ǎ", - "Â": "Â", - "Ấ": "Ấ", - "Ầ": "Ầ", - "Ẫ": "Ẫ", - "Ȧ": "Ȧ", - "Ǡ": "Ǡ", - "Å": "Å", - "Ǻ": "Ǻ", - "Ḃ": "Ḃ", - "Ć": "Ć", - "Č": "Č", - "Ĉ": "Ĉ", - "Ċ": "Ċ", - "Ď": "Ď", - "Ḋ": "Ḋ", - "É": "É", - "È": "È", - "Ë": "Ë", - "Ẽ": "Ẽ", - "Ē": "Ē", - "Ḗ": "Ḗ", - "Ḕ": "Ḕ", - "Ĕ": "Ĕ", - "Ě": "Ě", - "Ê": "Ê", - "Ế": "Ế", - "Ề": "Ề", - "Ễ": "Ễ", - "Ė": "Ė", - "Ḟ": "Ḟ", - "Ǵ": "Ǵ", - "Ḡ": "Ḡ", - "Ğ": "Ğ", - "Ǧ": "Ǧ", - "Ĝ": "Ĝ", - "Ġ": "Ġ", - "Ḧ": "Ḧ", - "Ȟ": "Ȟ", - "Ĥ": "Ĥ", - "Ḣ": "Ḣ", - "Í": "Í", - "Ì": "Ì", - "Ï": "Ï", - "Ḯ": "Ḯ", - "Ĩ": "Ĩ", - "Ī": "Ī", - "Ĭ": "Ĭ", - "Ǐ": "Ǐ", - "Î": "Î", - "İ": "İ", - "Ĵ": "Ĵ", - "Ḱ": "Ḱ", - "Ǩ": "Ǩ", - "Ĺ": "Ĺ", - "Ľ": "Ľ", - "Ḿ": "Ḿ", - "Ṁ": "Ṁ", - "Ń": "Ń", - "Ǹ": "Ǹ", - "Ñ": "Ñ", - "Ň": "Ň", - "Ṅ": "Ṅ", - "Ó": "Ó", - "Ò": "Ò", - "Ö": "Ö", - "Ȫ": "Ȫ", - "Õ": "Õ", - "Ṍ": "Ṍ", - "Ṏ": "Ṏ", - "Ȭ": "Ȭ", - "Ō": "Ō", - "Ṓ": "Ṓ", - "Ṑ": "Ṑ", - "Ŏ": "Ŏ", - "Ǒ": "Ǒ", - "Ô": "Ô", - "Ố": "Ố", - "Ồ": "Ồ", - "Ỗ": "Ỗ", - "Ȯ": "Ȯ", - "Ȱ": "Ȱ", - "Ő": "Ő", - "Ṕ": "Ṕ", - "Ṗ": "Ṗ", - "Ŕ": "Ŕ", - "Ř": "Ř", - "Ṙ": "Ṙ", - "Ś": "Ś", - "Ṥ": "Ṥ", - "Š": "Š", - "Ṧ": "Ṧ", - "Ŝ": "Ŝ", - "Ṡ": "Ṡ", - "Ť": "Ť", - "Ṫ": "Ṫ", - "Ú": "Ú", - "Ù": "Ù", - "Ü": "Ü", - "Ǘ": "Ǘ", - "Ǜ": "Ǜ", - "Ǖ": "Ǖ", - "Ǚ": "Ǚ", - "Ũ": "Ũ", - "Ṹ": "Ṹ", - "Ū": "Ū", - "Ṻ": "Ṻ", - "Ŭ": "Ŭ", - "Ǔ": "Ǔ", - "Û": "Û", - "Ů": "Ů", - "Ű": "Ű", - "Ṽ": "Ṽ", - "Ẃ": "Ẃ", - "Ẁ": "Ẁ", - "Ẅ": "Ẅ", - "Ŵ": "Ŵ", - "Ẇ": "Ẇ", - "Ẍ": "Ẍ", - "Ẋ": "Ẋ", - "Ý": "Ý", - "Ỳ": "Ỳ", - "Ÿ": "Ÿ", - "Ỹ": "Ỹ", - "Ȳ": "Ȳ", - "Ŷ": "Ŷ", - "Ẏ": "Ẏ", - "Ź": "Ź", - "Ž": "Ž", - "Ẑ": "Ẑ", - "Ż": "Ż", - "ά": "ά", - "ὰ": "ὰ", - "ᾱ": "ᾱ", - "ᾰ": "ᾰ", - "έ": "έ", - "ὲ": "ὲ", - "ή": "ή", - "ὴ": "ὴ", - "ί": "ί", - "ὶ": "ὶ", - "ϊ": "ϊ", - "ΐ": "ΐ", - "ῒ": "ῒ", - "ῑ": "ῑ", - "ῐ": "ῐ", - "ό": "ό", - "ὸ": "ὸ", - "ύ": "ύ", - "ὺ": "ὺ", - "ϋ": "ϋ", - "ΰ": "ΰ", - "ῢ": "ῢ", - "ῡ": "ῡ", - "ῠ": "ῠ", - "ώ": "ώ", - "ὼ": "ὼ", - "Ύ": "Ύ", - "Ὺ": "Ὺ", - "Ϋ": "Ϋ", - "Ῡ": "Ῡ", - "Ῠ": "Ῠ", - "Ώ": "Ώ", - "Ὼ": "Ὼ" -}; - -/* eslint no-constant-condition:0 */ - -const binLeftCancellers = ["bin", "op", "open", "punct", "rel"]; - -/** - * This file contains the parser used to parse out a TeX expression from the - * input. Since TeX isn't context-free, standard parsers don't work particularly - * well. - * - * The strategy of this parser is as such: - * - * The main functions (the `.parse...` ones) take a position in the current - * parse string to parse tokens from. The lexer (found in Lexer.js, stored at - * this.gullet.lexer) also supports pulling out tokens at arbitrary places. When - * individual tokens are needed at a position, the lexer is called to pull out a - * token, which is then used. - * - * The parser has a property called "mode" indicating the mode that - * the parser is currently in. Currently it has to be one of "math" or - * "text", which denotes whether the current environment is a math-y - * one or a text-y one (e.g. inside \text). Currently, this serves to - * limit the functions which can be used in text mode. - * - * The main functions then return an object which contains the useful data that - * was parsed at its given point, and a new position at the end of the parsed - * data. The main functions can call each other and continue the parsing by - * using the returned position as a new starting point. - * - * There are also extra `.handle...` functions, which pull out some reused - * functionality into self-contained functions. - * - * The functions return ParseNodes. - */ - -class Parser { - constructor(input, settings, isPreamble = false) { - // Start in math mode - this.mode = "math"; - // Create a new macro expander (gullet) and (indirectly via that) also a - // new lexer (mouth) for this parser (stomach, in the language of TeX) - this.gullet = new MacroExpander(input, settings, this.mode); - // Store the settings for use in parsing - this.settings = settings; - // Are we defining a preamble? - this.isPreamble = isPreamble; - // Count leftright depth (for \middle errors) - this.leftrightDepth = 0; - this.prevAtomType = ""; - } - - /** - * Checks a result to make sure it has the right type, and throws an - * appropriate error otherwise. - */ - expect(text, consume = true) { - if (this.fetch().text !== text) { - throw new ParseError(`Expected '${text}', got '${this.fetch().text}'`, this.fetch()); - } - if (consume) { - this.consume(); - } - } - - /** - * Discards the current lookahead token, considering it consumed. - */ - consume() { - this.nextToken = null; - } - - /** - * Return the current lookahead token, or if there isn't one (at the - * beginning, or if the previous lookahead token was consume()d), - * fetch the next token as the new lookahead token and return it. - */ - fetch() { - if (this.nextToken == null) { - this.nextToken = this.gullet.expandNextToken(); - } - return this.nextToken; - } - - /** - * Switches between "text" and "math" modes. - */ - switchMode(newMode) { - this.mode = newMode; - this.gullet.switchMode(newMode); - } - - /** - * Main parsing function, which parses an entire input. - */ - parse() { - // Create a group namespace for every $...$, $$...$$, \[...\].) - // A \def is then valid only within that pair of delimiters. - this.gullet.beginGroup(); - - if (this.settings.colorIsTextColor) { - // Use old \color behavior (same as LaTeX's \textcolor) if requested. - // We do this within the group for the math expression, so it doesn't - // pollute settings.macros. - this.gullet.macros.set("\\color", "\\textcolor"); - } - - // Try to parse the input - const parse = this.parseExpression(false); - - // If we succeeded, make sure there's an EOF at the end - this.expect("EOF"); - - if (this.isPreamble) { - const macros = Object.create(null); - Object.entries(this.gullet.macros.current).forEach(([key, value]) => { - macros[key] = value; - }); - this.gullet.endGroup(); - return macros - } - - // The only local macro that we want to save is from \tag. - const tag = this.gullet.macros.get("\\df@tag"); - - // End the group namespace for the expression - this.gullet.endGroup(); - - if (tag) { this.gullet.macros.current["\\df@tag"] = tag; } - - return parse; - } - - static get endOfExpression() { - return ["}", "\\endgroup", "\\end", "\\right", "\\endtoggle", "&"]; - } - - /** - * Fully parse a separate sequence of tokens as a separate job. - * Tokens should be specified in reverse order, as in a MacroDefinition. - */ - subparse(tokens) { - // Save the next token from the current job. - const oldToken = this.nextToken; - this.consume(); - - // Run the new job, terminating it with an excess '}' - this.gullet.pushToken(new Token("}")); - this.gullet.pushTokens(tokens); - const parse = this.parseExpression(false); - this.expect("}"); - - // Restore the next token from the current job. - this.nextToken = oldToken; - - return parse; - } - -/** - * Parses an "expression", which is a list of atoms. - * - * `breakOnInfix`: Should the parsing stop when we hit infix nodes? This - * happens when functions have higher precedence han infix - * nodes in implicit parses. - * - * `breakOnTokenText`: The text of the token that the expression should end - * with, or `null` if something else should end the - * expression. - * - * `breakOnMiddle`: \color, \over, and old styling functions work on an implicit group. - * These groups end just before the usual tokens, but they also - * end just before `\middle`. - */ - parseExpression(breakOnInfix, breakOnTokenText, breakOnMiddle) { - const body = []; - // Keep adding atoms to the body until we can't parse any more atoms (either - // we reached the end, a }, or a \right) - while (true) { - // Ignore spaces in math mode - if (this.mode === "math") { - this.consumeSpaces(); - } - const lex = this.fetch(); - if (Parser.endOfExpression.indexOf(lex.text) !== -1) { - break; - } - if (breakOnTokenText && lex.text === breakOnTokenText) { - break; - } - if (breakOnMiddle && lex.text === "\\middle") { - break - } - if (breakOnInfix && functions[lex.text] && functions[lex.text].infix) { - break; - } - const atom = this.parseAtom(breakOnTokenText); - if (!atom) { - break; - } else if (atom.type === "internal") { - continue; - } - body.push(atom); - // Keep a record of the atom type, so that op.js can set correct spacing. - this.prevAtomType = atom.type === "atom" ? atom.family : atom.type; - } - if (this.mode === "text") { - this.formLigatures(body); - } - return this.handleInfixNodes(body); - } - - /** - * Rewrites infix operators such as \over with corresponding commands such - * as \frac. - * - * There can only be one infix operator per group. If there's more than one - * then the expression is ambiguous. This can be resolved by adding {}. - */ - handleInfixNodes(body) { - let overIndex = -1; - let funcName; - - for (let i = 0; i < body.length; i++) { - if (body[i].type === "infix") { - if (overIndex !== -1) { - throw new ParseError("only one infix operator per group", body[i].token); - } - overIndex = i; - funcName = body[i].replaceWith; - } - } - - if (overIndex !== -1 && funcName) { - let numerNode; - let denomNode; - - const numerBody = body.slice(0, overIndex); - const denomBody = body.slice(overIndex + 1); - - if (numerBody.length === 1 && numerBody[0].type === "ordgroup") { - numerNode = numerBody[0]; - } else { - numerNode = { type: "ordgroup", mode: this.mode, body: numerBody }; - } - - if (denomBody.length === 1 && denomBody[0].type === "ordgroup") { - denomNode = denomBody[0]; - } else { - denomNode = { type: "ordgroup", mode: this.mode, body: denomBody }; - } - - let node; - if (funcName === "\\\\abovefrac") { - node = this.callFunction(funcName, [numerNode, body[overIndex], denomNode], []); - } else { - node = this.callFunction(funcName, [numerNode, denomNode], []); - } - return [node]; - } else { - return body; - } - } - - /** - * Handle a subscript or superscript with nice errors. - */ - handleSupSubscript( - name // For error reporting. - ) { - const symbolToken = this.fetch(); - const symbol = symbolToken.text; - this.consume(); - this.consumeSpaces(); // ignore spaces before sup/subscript argument - const group = this.parseGroup(name); - - if (!group) { - throw new ParseError("Expected group after '" + symbol + "'", symbolToken); - } - - return group; - } - - /** - * Converts the textual input of an unsupported command into a text node - * contained within a color node whose color is determined by errorColor - */ - formatUnsupportedCmd(text) { - const textordArray = []; - - for (let i = 0; i < text.length; i++) { - textordArray.push({ type: "textord", mode: "text", text: text[i] }); - } - - const textNode = { - type: "text", - mode: this.mode, - body: textordArray - }; - - const colorNode = { - type: "color", - mode: this.mode, - color: this.settings.errorColor, - body: [textNode] - }; - - return colorNode; - } - - /** - * Parses a group with optional super/subscripts. - */ - parseAtom(breakOnTokenText) { - // The body of an atom is an implicit group, so that things like - // \left(x\right)^2 work correctly. - const base = this.parseGroup("atom", breakOnTokenText); - - // In text mode, we don't have superscripts or subscripts - if (this.mode === "text") { - return base; - } - - // Note that base may be empty (i.e. null) at this point. - - let superscript; - let subscript; - while (true) { - // Guaranteed in math mode, so eat any spaces first. - this.consumeSpaces(); - - // Lex the first token - const lex = this.fetch(); - - if (lex.text === "\\limits" || lex.text === "\\nolimits") { - // We got a limit control - if (base && base.type === "op") { - const limits = lex.text === "\\limits"; - base.limits = limits; - base.alwaysHandleSupSub = true; - } else if (base && base.type === "operatorname") { - if (base.alwaysHandleSupSub) { - base.limits = lex.text === "\\limits"; - } - } else { - throw new ParseError("Limit controls must follow a math operator", lex); - } - this.consume(); - } else if (lex.text === "^") { - // We got a superscript start - if (superscript) { - throw new ParseError("Double superscript", lex); - } - superscript = this.handleSupSubscript("superscript"); - } else if (lex.text === "_") { - // We got a subscript start - if (subscript) { - throw new ParseError("Double subscript", lex); - } - subscript = this.handleSupSubscript("subscript"); - } else if (lex.text === "'") { - // We got a prime - if (superscript) { - throw new ParseError("Double superscript", lex); - } - const prime = { type: "textord", mode: this.mode, text: "\\prime" }; - - // Many primes can be grouped together, so we handle this here - const primes = [prime]; - this.consume(); - // Keep lexing tokens until we get something that's not a prime - while (this.fetch().text === "'") { - // For each one, add another prime to the list - primes.push(prime); - this.consume(); - } - // If there's a superscript following the primes, combine that - // superscript in with the primes. - if (this.fetch().text === "^") { - primes.push(this.handleSupSubscript("superscript")); - } - // Put everything into an ordgroup as the superscript - superscript = { type: "ordgroup", mode: this.mode, body: primes }; - } else if (uSubsAndSups[lex.text]) { - // A Unicode subscript or superscript character. - // We treat these similarly to the unicode-math package. - // So we render a string of Unicode (sub|super)scripts the - // same as a (sub|super)script of regular characters. - const isSub = unicodeSubRegEx.test(lex.text); - const subsupTokens = []; - subsupTokens.push(new Token(uSubsAndSups[lex.text])); - this.consume(); - // Continue fetching tokens to fill out the group. - while (true) { - const token = this.fetch().text; - if (!(uSubsAndSups[token])) { break } - if (unicodeSubRegEx.test(token) !== isSub) { break } - subsupTokens.unshift(new Token(uSubsAndSups[token])); - this.consume(); - } - // Now create a (sub|super)script. - const body = this.subparse(subsupTokens); - if (isSub) { - subscript = { type: "ordgroup", mode: "math", body }; - } else { - superscript = { type: "ordgroup", mode: "math", body }; - } - } else { - // If it wasn't ^, _, a Unicode (sub|super)script, or ', stop parsing super/subscripts - break; - } - } - - if (superscript || subscript) { - if (base && base.type === "multiscript" && !base.postscripts) { - // base is the result of a \prescript function. - // Write the sub- & superscripts into the multiscript element. - base.postscripts = { sup: superscript, sub: subscript }; - return base - } else { - // We got either a superscript or subscript, create a supsub - const isFollowedByDelimiter = (!base || base.type !== "op" && base.type !== "operatorname") - ? undefined - : isDelimiter(this.nextToken.text); - return { - type: "supsub", - mode: this.mode, - base: base, - sup: superscript, - sub: subscript, - isFollowedByDelimiter - } - } - } else { - // Otherwise return the original body - return base; - } - } - - /** - * Parses an entire function, including its base and all of its arguments. - */ - parseFunction( - breakOnTokenText, - name // For determining its context - ) { - const token = this.fetch(); - const func = token.text; - const funcData = functions[func]; - if (!funcData) { - return null; - } - this.consume(); // consume command token - - if (name && name !== "atom" && !funcData.allowedInArgument) { - throw new ParseError( - "Got function '" + func + "' with no arguments" + (name ? " as " + name : ""), - token - ); - } else if (this.mode === "text" && !funcData.allowedInText) { - throw new ParseError("Can't use function '" + func + "' in text mode", token); - } else if (this.mode === "math" && funcData.allowedInMath === false) { - throw new ParseError("Can't use function '" + func + "' in math mode", token); - } - - const prevAtomType = this.prevAtomType; - const { args, optArgs } = this.parseArguments(func, funcData); - this.prevAtomType = prevAtomType; - return this.callFunction(func, args, optArgs, token, breakOnTokenText); - } - - /** - * Call a function handler with a suitable context and arguments. - */ - callFunction(name, args, optArgs, token, breakOnTokenText) { - const context = { - funcName: name, - parser: this, - token, - breakOnTokenText - }; - const func = functions[name]; - if (func && func.handler) { - return func.handler(context, args, optArgs); - } else { - throw new ParseError(`No function handler for ${name}`); - } - } - - /** - * Parses the arguments of a function or environment - */ - parseArguments( - func, // Should look like "\name" or "\begin{name}". - funcData - ) { - const totalArgs = funcData.numArgs + funcData.numOptionalArgs; - if (totalArgs === 0) { - return { args: [], optArgs: [] }; - } - - const args = []; - const optArgs = []; - - for (let i = 0; i < totalArgs; i++) { - let argType = funcData.argTypes && funcData.argTypes[i]; - const isOptional = i < funcData.numOptionalArgs; - - if ( - (funcData.primitive && argType == null) || - // \sqrt expands into primitive if optional argument doesn't exist - (funcData.type === "sqrt" && i === 1 && optArgs[0] == null) - ) { - argType = "primitive"; - } - - const arg = this.parseGroupOfType(`argument to '${func}'`, argType, isOptional); - if (isOptional) { - optArgs.push(arg); - } else if (arg != null) { - args.push(arg); - } else { - // should be unreachable - throw new ParseError("Null argument, please report this as a bug"); - } - } - - return { args, optArgs }; - } - - /** - * Parses a group when the mode is changing. - */ - parseGroupOfType(name, type, optional) { - switch (type) { - case "size": - return this.parseSizeGroup(optional); - case "url": - return this.parseUrlGroup(optional); - case "math": - case "text": - return this.parseArgumentGroup(optional, type); - case "hbox": { - // hbox argument type wraps the argument in the equivalent of - // \hbox, which is like \text but switching to \textstyle size. - const group = this.parseArgumentGroup(optional, "text"); - return group != null - ? { - type: "styling", - mode: group.mode, - body: [group], - scriptLevel: "text" // simulate \textstyle - } - : null; - } - case "raw": { - const token = this.parseStringGroup("raw", optional); - return token != null - ? { - type: "raw", - mode: "text", - string: token.text - } - : null; - } - case "primitive": { - if (optional) { - throw new ParseError("A primitive argument cannot be optional"); - } - const group = this.parseGroup(name); - if (group == null) { - throw new ParseError("Expected group as " + name, this.fetch()); - } - return group; - } - case "original": - case null: - case undefined: - return this.parseArgumentGroup(optional); - default: - throw new ParseError("Unknown group type as " + name, this.fetch()); - } - } - - /** - * Discard any space tokens, fetching the next non-space token. - */ - consumeSpaces() { - while (true) { - const ch = this.fetch().text; - // \ufe0e is the Unicode variation selector to supress emoji. Ignore it. - if (ch === " " || ch === "\u00a0" || ch === "\ufe0e") { - this.consume(); - } else { - break - } - } - } - - /** - * Parses a group, essentially returning the string formed by the - * brace-enclosed tokens plus some position information. - */ - parseStringGroup( - modeName, // Used to describe the mode in error messages. - optional - ) { - const argToken = this.gullet.scanArgument(optional); - if (argToken == null) { - return null; - } - let str = ""; - let nextToken; - while ((nextToken = this.fetch()).text !== "EOF") { - str += nextToken.text; - this.consume(); - } - this.consume(); // consume the end of the argument - argToken.text = str; - return argToken; - } - - /** - * Parses a regex-delimited group: the largest sequence of tokens - * whose concatenated strings match `regex`. Returns the string - * formed by the tokens plus some position information. - */ - parseRegexGroup( - regex, - modeName // Used to describe the mode in error messages. - ) { - const firstToken = this.fetch(); - let lastToken = firstToken; - let str = ""; - let nextToken; - while ((nextToken = this.fetch()).text !== "EOF" && regex.test(str + nextToken.text)) { - lastToken = nextToken; - str += lastToken.text; - this.consume(); - } - if (str === "") { - throw new ParseError("Invalid " + modeName + ": '" + firstToken.text + "'", firstToken); - } - return firstToken.range(lastToken, str); - } - - /** - * Parses a size specification, consisting of magnitude and unit. - */ - parseSizeGroup(optional) { - let res; - let isBlank = false; - // don't expand before parseStringGroup - this.gullet.consumeSpaces(); - if (!optional && this.gullet.future().text !== "{") { - res = this.parseRegexGroup(/^[-+]? *(?:$|\d+|\d+\.\d*|\.\d*) *[a-z]{0,2} *$/, "size"); - } else { - res = this.parseStringGroup("size", optional); - } - if (!res) { - return null; - } - if (!optional && res.text.length === 0) { - // Because we've tested for what is !optional, this block won't - // affect \kern, \hspace, etc. It will capture the mandatory arguments - // to \genfrac and \above. - res.text = "0pt"; // Enable \above{} - isBlank = true; // This is here specifically for \genfrac - } - const match = /([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(res.text); - if (!match) { - throw new ParseError("Invalid size: '" + res.text + "'", res); - } - const data = { - number: +(match[1] + match[2]), // sign + magnitude, cast to number - unit: match[3] - }; - if (!validUnit(data)) { - throw new ParseError("Invalid unit: '" + data.unit + "'", res); - } - return { - type: "size", - mode: this.mode, - value: data, - isBlank - }; - } - - /** - * Parses an URL, checking escaped letters and allowed protocols, - * and setting the catcode of % as an active character (as in \hyperref). - */ - parseUrlGroup(optional) { - this.gullet.lexer.setCatcode("%", 13); // active character - this.gullet.lexer.setCatcode("~", 12); // other character - const res = this.parseStringGroup("url", optional); - this.gullet.lexer.setCatcode("%", 14); // comment character - this.gullet.lexer.setCatcode("~", 13); // active character - if (res == null) { - return null; - } - // hyperref package allows backslashes alone in href, but doesn't - // generate valid links in such cases; we interpret this as - // "undefined" behaviour, and keep them as-is. Some browser will - // replace backslashes with forward slashes. - let url = res.text.replace(/\\([#$%&~_^{}])/g, "$1"); - url = res.text.replace(/{\u2044}/g, "/"); - return { - type: "url", - mode: this.mode, - url - }; - } - - /** - * Parses an argument with the mode specified. - */ - parseArgumentGroup(optional, mode) { - const argToken = this.gullet.scanArgument(optional); - if (argToken == null) { - return null; - } - const outerMode = this.mode; - if (mode) { - // Switch to specified mode - this.switchMode(mode); - } - - this.gullet.beginGroup(); - const expression = this.parseExpression(false, "EOF"); - // TODO: find an alternative way to denote the end - this.expect("EOF"); // expect the end of the argument - this.gullet.endGroup(); - const result = { - type: "ordgroup", - mode: this.mode, - loc: argToken.loc, - body: expression - }; - - if (mode) { - // Switch mode back - this.switchMode(outerMode); - } - return result; - } - - /** - * Parses an ordinary group, which is either a single nucleus (like "x") - * or an expression in braces (like "{x+y}") or an implicit group, a group - * that starts at the current position, and ends right before a higher explicit - * group ends, or at EOF. - */ - parseGroup( - name, // For error reporting. - breakOnTokenText - ) { - const firstToken = this.fetch(); - const text = firstToken.text; - - let result; - // Try to parse an open brace or \begingroup - if (text === "{" || text === "\\begingroup" || text === "\\toggle") { - this.consume(); - const groupEnd = text === "{" - ? "}" - : text === "\\begingroup" - ? "\\endgroup" - : "\\endtoggle"; - - this.gullet.beginGroup(); - // If we get a brace, parse an expression - const expression = this.parseExpression(false, groupEnd); - const lastToken = this.fetch(); - this.expect(groupEnd); // Check that we got a matching closing brace - this.gullet.endGroup(); - result = { - type: (lastToken.text === "\\endtoggle" ? "toggle" : "ordgroup"), - mode: this.mode, - loc: SourceLocation.range(firstToken, lastToken), - body: expression, - // A group formed by \begingroup...\endgroup is a semi-simple group - // which doesn't affect spacing in math mode, i.e., is transparent. - // https://tex.stackexchange.com/questions/1930/ - semisimple: text === "\\begingroup" || undefined - }; - } else { - // If there exists a function with this name, parse the function. - // Otherwise, just return a nucleus - result = this.parseFunction(breakOnTokenText, name) || this.parseSymbol(); - if (result == null && text[0] === "\\" && - !Object.prototype.hasOwnProperty.call(implicitCommands, text )) { - result = this.formatUnsupportedCmd(text); - this.consume(); - } - } - return result; - } - - /** - * Form ligature-like combinations of characters for text mode. - * This includes inputs like "--", "---", "``" and "''". - * The result will simply replace multiple textord nodes with a single - * character in each value by a single textord node having multiple - * characters in its value. The representation is still ASCII source. - * The group will be modified in place. - */ - formLigatures(group) { - let n = group.length - 1; - for (let i = 0; i < n; ++i) { - const a = group[i]; - const v = a.text; - if (v === "-" && group[i + 1].text === "-") { - if (i + 1 < n && group[i + 2].text === "-") { - group.splice(i, 3, { - type: "textord", - mode: "text", - loc: SourceLocation.range(a, group[i + 2]), - text: "---" - }); - n -= 2; - } else { - group.splice(i, 2, { - type: "textord", - mode: "text", - loc: SourceLocation.range(a, group[i + 1]), - text: "--" - }); - n -= 1; - } - } - if ((v === "'" || v === "`") && group[i + 1].text === v) { - group.splice(i, 2, { - type: "textord", - mode: "text", - loc: SourceLocation.range(a, group[i + 1]), - text: v + v - }); - n -= 1; - } - } - } - - /** - * Parse a single symbol out of the string. Here, we handle single character - * symbols and special functions like \verb. - */ - parseSymbol() { - const nucleus = this.fetch(); - let text = nucleus.text; - - if (/^\\verb[^a-zA-Z]/.test(text)) { - this.consume(); - let arg = text.slice(5); - const star = arg.charAt(0) === "*"; - if (star) { - arg = arg.slice(1); - } - // Lexer's tokenRegex is constructed to always have matching - // first/last characters. - if (arg.length < 2 || arg.charAt(0) !== arg.slice(-1)) { - throw new ParseError(`\\verb assertion failed -- - please report what input caused this bug`); - } - arg = arg.slice(1, -1); // remove first and last char - return { - type: "verb", - mode: "text", - body: arg, - star - }; - } - // At this point, we should have a symbol, possibly with accents. - // First expand any accented base symbol according to unicodeSymbols. - if (Object.prototype.hasOwnProperty.call(unicodeSymbols, text[0]) && - !symbols[this.mode][text[0]]) { - // This behavior is not strict (XeTeX-compatible) in math mode. - if (this.settings.strict && this.mode === "math") { - throw new ParseError(`Accented Unicode text character "${text[0]}" used in ` + `math mode`, - nucleus - ); - } - text = unicodeSymbols[text[0]] + text.slice(1); - } - // Strip off any combining characters - const match = combiningDiacriticalMarksEndRegex.exec(text); - if (match) { - text = text.substring(0, match.index); - if (text === "i") { - text = "\u0131"; // dotless i, in math and text mode - } else if (text === "j") { - text = "\u0237"; // dotless j, in math and text mode - } - } - // Recognize base symbol - let symbol; - if (symbols[this.mode][text]) { - let group = symbols[this.mode][text].group; - if (group === "bin" && binLeftCancellers.includes(this.prevAtomType)) { - // Change from a binary operator to a unary (prefix) operator - group = "open"; - } - const loc = SourceLocation.range(nucleus); - let s; - if (Object.prototype.hasOwnProperty.call(ATOMS, group )) { - const family = group; - s = { - type: "atom", - mode: this.mode, - family, - loc, - text - }; - } else { - if (asciiFromScript[text]) { - // Unicode 14 disambiguates chancery from roundhand. - // See https://www.unicode.org/charts/PDF/U1D400.pdf - this.consume(); - const nextCode = this.fetch().text.charCodeAt(0); - // mathcal is Temml default. Use mathscript if called for. - const font = nextCode === 0xfe01 ? "mathscr" : "mathcal"; - if (nextCode === 0xfe00 || nextCode === 0xfe01) { this.consume(); } - return { - type: "font", - mode: "math", - font, - body: { type: "mathord", mode: "math", loc, text: asciiFromScript[text] } - } - } - // Default ord character. No disambiguation necessary. - s = { - type: group, - mode: this.mode, - loc, - text - }; - } - symbol = s; - } else if (text.charCodeAt(0) >= 0x80) { - // no symbol for e.g. ^ - if (this.settings.strict && this.mode === "math") { - throw new ParseError(`Unicode text character "${text[0]}" used in math mode`, nucleus) - } - // All nonmathematical Unicode characters are rendered as if they - // are in text mode (wrapped in \text) because that's what it - // takes to render them in LaTeX. - symbol = { - type: "textord", - mode: "text", - loc: SourceLocation.range(nucleus), - text - }; - } else { - return null; // EOF, ^, _, {, }, etc. - } - this.consume(); - // Transform combining characters into accents - if (match) { - for (let i = 0; i < match[0].length; i++) { - const accent = match[0][i]; - if (!unicodeAccents[accent]) { - throw new ParseError(`Unknown accent ' ${accent}'`, nucleus); - } - const command = unicodeAccents[accent][this.mode] || - unicodeAccents[accent].text; - if (!command) { - throw new ParseError(`Accent ${accent} unsupported in ${this.mode} mode`, nucleus); - } - symbol = { - type: "accent", - mode: this.mode, - loc: SourceLocation.range(nucleus), - label: command, - isStretchy: false, - base: symbol - }; - } - } - return symbol; - } -} - -/** - * Parses an expression using a Parser, then returns the parsed result. - */ -const parseTree = function(toParse, settings) { - if (!(typeof toParse === "string" || toParse instanceof String)) { - throw new TypeError("Temml can only parse string typed expression") - } - const parser = new Parser(toParse, settings); - // Blank out any \df@tag to avoid spurious "Duplicate \tag" errors - delete parser.gullet.macros.current["\\df@tag"]; - - let tree = parser.parse(); - - // LaTeX ignores a \tag placed outside an AMS environment. - if (!(tree.length > 0 && tree[0].type && tree[0].type === "array" && tree[0].addEqnNum)) { - // If the input used \tag, it will set the \df@tag macro to the tag. - // In this case, we separately parse the tag and wrap the tree. - if (parser.gullet.macros.get("\\df@tag")) { - if (!settings.displayMode) { - throw new ParseError("\\tag works only in display mode") - } - parser.gullet.feed("\\df@tag"); - tree = [ - { - type: "tag", - mode: "text", - body: tree, - tag: parser.parse() - } - ]; - } - } - - return tree -}; - -/** - * This file contains information about the style that the mathmlBuilder carries - * around with it. Data is held in an `Style` object, and when - * recursing, a new `Style` object can be created with the `.with*` functions. - */ - -const subOrSupLevel = [2, 2, 3, 3]; - -/** - * This is the main Style class. It contains the current style.level, color, and font. - * - * Style objects should not be modified. To create a new Style with - * different properties, call a `.with*` method. - */ -class Style { - constructor(data) { - // Style.level can be 0 | 1 | 2 | 3, which correspond to - // displaystyle, textstyle, scriptstyle, and scriptscriptstyle. - // style.level does not directly set MathML's script level. MathML does that itself. - // We use style.level to track, not set, math style so that we can get the - // correct scriptlevel when needed in supsub.js, mathchoice.js, or for dimensions in em. - this.level = data.level; - this.color = data.color; // string | void - // A font family applies to a group of fonts (i.e. SansSerif), while a font - // represents a specific font (i.e. SansSerif Bold). - // See: https://tex.stackexchange.com/questions/22350/difference-between-textrm-and-mathrm - this.font = data.font || ""; // string - this.fontFamily = data.fontFamily || ""; // string - this.fontSize = data.fontSize || 1.0; // number - this.fontWeight = data.fontWeight || ""; - this.fontShape = data.fontShape || ""; - this.maxSize = data.maxSize; // [number, number] - } - - /** - * Returns a new style object with the same properties as "this". Properties - * from "extension" will be copied to the new style object. - */ - extend(extension) { - const data = { - level: this.level, - color: this.color, - font: this.font, - fontFamily: this.fontFamily, - fontSize: this.fontSize, - fontWeight: this.fontWeight, - fontShape: this.fontShape, - maxSize: this.maxSize - }; - - for (const key in extension) { - if (Object.prototype.hasOwnProperty.call(extension, key)) { - data[key] = extension[key]; - } - } - - return new Style(data); - } - - withLevel(n) { - return this.extend({ - level: n - }); - } - - incrementLevel() { - return this.extend({ - level: Math.min(this.level + 1, 3) - }); - } - - inSubOrSup() { - return this.extend({ - level: subOrSupLevel[this.level] - }) - } - - /** - * Create a new style object with the given color. - */ - withColor(color) { - return this.extend({ - color: color - }); - } - - /** - * Creates a new style object with the given math font or old text font. - * @type {[type]} - */ - withFont(font) { - return this.extend({ - font - }); - } - - /** - * Create a new style objects with the given fontFamily. - */ - withTextFontFamily(fontFamily) { - return this.extend({ - fontFamily, - font: "" - }); - } - - /** - * Creates a new style object with the given font size - */ - withFontSize(num) { - return this.extend({ - fontSize: num - }); - } - - /** - * Creates a new style object with the given font weight - */ - withTextFontWeight(fontWeight) { - return this.extend({ - fontWeight, - font: "" - }); - } - - /** - * Creates a new style object with the given font weight - */ - withTextFontShape(fontShape) { - return this.extend({ - fontShape, - font: "" - }); - } - - /** - * Gets the CSS color of the current style object - */ - getColor() { - return this.color; - } -} - -/* Temml Post Process - * Perform two tasks not done by Temml when it created each individual Temml element. - * Given a block, - * 1. At each AMS auto-numbered environment, assign an id. - * 2. Populate the text contents of each \ref & \eqref - * - * As with other Temml code, this file is released under terms of the MIT license. - * https://mit-license.org/ - */ - -const version = "0.10.23"; - -function postProcess(block) { - const labelMap = {}; - let i = 0; - - // Get a collection of the parents of each \tag & auto-numbered equation - const parents = block.getElementsByClassName("tml-tageqn"); - for (const parent of parents) { - const eqns = parent.getElementsByClassName("tml-eqn"); - if (eqns. length > 0 ) { - // AMS automatically numbered equation. - // Assign an id. - i += 1; - eqns[0].id = "tml-eqn-" + i; - // No need to write a number into the text content of the element. - // A CSS counter does that even if this postProcess() function is not used. - } - // If there is a \label, add it to labelMap - const labels = parent.getElementsByClassName("tml-label"); - if (labels.length === 0) { continue } - if (eqns.length > 0) { - labelMap[labels[0].id] = String(i); - } else { - const tags = parent.getElementsByClassName("tml-tag"); - if (tags.length > 0) { - labelMap[labels[0].id] = tags[0].textContent; - } - } - } - - // Populate \ref & \eqref text content - const refs = block.getElementsByClassName("tml-ref"); - [...refs].forEach(ref => { - let str = labelMap[ref.getAttribute("href").slice(1)]; - if (ref.className.indexOf("tml-eqref") === -1) { - // \ref. Omit parens. - str = str.replace(/^\(/, ""); - str = str.replace(/\($/, ""); - } { - // \eqref. Include parens - if (str.charAt(0) !== "(") { str = "(" + str; } - if (str.slice(-1) !== ")") { str = str + ")"; } - } - ref.textContent = str; - }); -} - -/* eslint no-console:0 */ - -/** - * @type {import('./temml').render} - * Parse and build an expression, and place that expression in the DOM node - * given. - */ -let render$1 = function(expression, baseNode, options = {}) { - baseNode.textContent = ""; - const alreadyInMathElement = baseNode.tagName.toLowerCase() === "math"; - if (alreadyInMathElement) { options.wrap = "none"; } - const math = renderToMathMLTree(expression, options); - if (alreadyInMathElement) { - // The element already exists. Populate it. - baseNode.textContent = ""; - math.children.forEach(e => { baseNode.appendChild(e.toNode()); }); - } else if (math.children.length > 1) { - baseNode.textContent = ""; - math.children.forEach(e => { baseNode.appendChild(e.toNode()); }); - } else { - baseNode.appendChild(math.toNode()); - } -}; - -// Temml's styles don't work properly in quirks mode. Print out an error, and -// disable rendering. -if (typeof document !== "undefined") { - if (document.compatMode !== "CSS1Compat") { - typeof console !== "undefined" && - console.warn( - "Warning: Temml doesn't work in quirks mode. Make sure your " + - "website has a suitable doctype." - ); - - render$1 = function() { - throw new ParseError("Temml doesn't work in quirks mode."); - }; - } -} - -/** - * @type {import('./temml').renderToString} - * Parse and build an expression, and return the markup for that. - */ -const renderToString = function(expression, options) { - const markup = renderToMathMLTree(expression, options).toMarkup(); - return markup; -}; - -/** - * @type {import('./temml').generateParseTree} - * Parse an expression and return the parse tree. - */ -const generateParseTree = function(expression, options) { - const settings = new Settings(options); - return parseTree(expression, settings); -}; - -/** - * @type {import('./temml').definePreamble} - * Take an expression which contains a preamble. - * Parse it and return the macros. - */ -const definePreamble = function(expression, options) { - const settings = new Settings(options); - settings.macros = {}; - if (!(typeof expression === "string" || expression instanceof String)) { - throw new TypeError("Temml can only parse string typed expression") - } - const parser = new Parser(expression, settings, true); - // Blank out any \df@tag to avoid spurious "Duplicate \tag" errors - delete parser.gullet.macros.current["\\df@tag"]; - const macros = parser.parse(); - return macros -}; - -/** - * If the given error is a Temml ParseError, - * renders the invalid LaTeX as a span with hover title giving the Temml - * error message. Otherwise, simply throws the error. - */ -const renderError = function(error, expression, options) { - if (options.throwOnError || !(error instanceof ParseError)) { - throw error; - } - const node = new Span(["temml-error"], [new TextNode$1(expression + "\n" + error.toString())]); - node.style.color = options.errorColor; - node.style.whiteSpace = "pre-line"; - return node; -}; - -/** - * @type {import('./temml').renderToMathMLTree} - * Generates and returns the Temml build tree. This is used for advanced - * use cases (like rendering to custom output). - */ -const renderToMathMLTree = function(expression, options) { - const settings = new Settings(options); - try { - const tree = parseTree(expression, settings); - const style = new Style({ - level: settings.displayMode ? StyleLevel.DISPLAY : StyleLevel.TEXT, - maxSize: settings.maxSize - }); - return buildMathML(tree, expression, style, settings); - } catch (error) { - return renderError(error, expression, settings); - } -}; - -/** @type {import('./temml').default} */ -var temml = { - /** - * Current Temml version - */ - version: version, - /** - * Renders the given LaTeX into MathML, and adds - * it as a child to the specified DOM node. - */ - render: render$1, - /** - * Renders the given LaTeX into MathML string, - * for sending to the client. - */ - renderToString, - /** - * Post-process an entire HTML block. - * Writes AMS auto-numbers and implements \ref{}. - * Typcally called once, after a loop has rendered many individual spans. - */ - postProcess, - /** - * Temml error, usually during parsing. - */ - ParseError, - /** - * Creates a set of macros with document-wide scope. - */ - definePreamble, - /** - * Parses the given LaTeX into Temml's internal parse tree structure, - * without rendering to HTML or MathML. - * - * NOTE: This method is not currently recommended for public use. - * The internal tree representation is unstable and is very likely - * to change. Use at your own risk. - */ - __parse: generateParseTree, - /** - * Renders the given LaTeX into a MathML internal DOM tree - * representation, without flattening that representation to a string. - * - * NOTE: This method is not currently recommended for public use. - * The internal tree representation is unstable and is very likely - * to change. Use at your own risk. - */ - __renderToMathMLTree: renderToMathMLTree, - /** - * adds a new symbol to builtin symbols table - */ - __defineSymbol: defineSymbol, - /** - * adds a new macro to builtin macro list - */ - __defineMacro: defineMacro -}; - -/* - * This file bundles together and exposes the calculation parts of Hurmet. - * I use Rollup to create a UMD module from this code. - * That way, one file can expose the same functionality to (1) the Hurmet.org web page, - * (2) the REPL in the reference manual, (3) the script that transpiles - * the Hurmet reference manual from Markdown to HTML, and (4) unit testing. - * - * Some of Hurmet’s exported functions are valuable only to the Hurmet.org web page. - * If you wish to use Hurmet’s math parsing and/or calculation abilities, - * the two functions you want are: - * parse(entry: string, decimalFormat?: string) - * calculate(entry: string, vars?: Object, draftMode?: boolean, decimalFormat?: string) - * - * parse() returns a TeX string. - * calculate() returns either a TeX string or a string in Hurmet calculation syntax. - */ - -const render = (tex, dom, options) => { - temml.render(tex, dom, options); -}; - -var hurmet = { - parse: parse$1, - calculate, - compile, - md2ast, - md2html, - scanModule, - updateCalculations, - render, - Rnl -}; - -module.exports = hurmet; diff --git a/utils/insertPlugins.js b/utils/insertPlugins.js deleted file mode 100644 index 423016e7..00000000 --- a/utils/insertPlugins.js +++ /dev/null @@ -1,22 +0,0 @@ -// Embed extensions into the cjs and mjs version of Temml. - -const fs = require("fs") // Node.js file system - -// Get the temml.cjs and mjs code -let cjs = fs.readFileSync('./utils/temml.cjs').toString('utf8') -let mjs = fs.readFileSync('./utils/temml.mjs').toString('utf8') - -// Get the extension macros -const regex = /temml\.__/g; -const mhchem = fs.readFileSync('./contrib/mhchem/mhchem.js').toString('utf8').replace(regex, "") -const texvc = fs.readFileSync('./contrib/texvc/texvc.js').toString('utf8').replace(regex, "") -const physics = fs.readFileSync('./contrib/physics/physics.js').toString('utf8').replace(regex, "") - -// Insert the extension macros into temml.cjs and temml.mjs -let pos = cjs.indexOf("⦵") + 6 -cjs = cjs.slice(0, pos) + "\n" + mhchem + "\n" + texvc + "\n" + physics + "\n" + cjs.slice(pos + 1) -fs.writeFileSync('./utils/temml.cjs', cjs) - -pos = mjs.indexOf("⦵") + 6 -mjs = mjs.slice(0, pos) + "\n" + mhchem + "\n" + texvc + "\n" + physics + "\n" + mjs.slice(pos + 1) -fs.writeFileSync('./utils/temml.mjs', mjs) diff --git a/utils/katex.min.js b/utils/katex.min.js deleted file mode 100644 index dec14608..00000000 --- a/utils/katex.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.katex=t():e.katex=t()}("undefined"!=typeof self?self:this,(function(){return function(){"use strict";var e={d:function(t,r){for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},o:function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}},t={};e.d(t,{default:function(){return Zn}});var r=function e(t,r){this.position=void 0;var n,a="KaTeX parse error: "+t,i=r&&r.loc;if(i&&i.start<=i.end){var o=i.lexer.input;n=i.start;var s=i.end;n===o.length?a+=" at end of input: ":a+=" at position "+(n+1)+": ";var l=o.slice(n,s).replace(/[^]/g,"$&\u0332");a+=(n>15?"\u2026"+o.slice(n-15,n):o.slice(0,n))+l+(s+15":">","<":"<",'"':""","'":"'"},o=/[&><"']/g;var s=function e(t){return"ordgroup"===t.type||"color"===t.type?1===t.body.length?e(t.body[0]):t:"font"===t.type?e(t.body):t},l={contains:function(e,t){return-1!==e.indexOf(t)},deflt:function(e,t){return void 0===e?t:e},escape:function(e){return String(e).replace(o,(function(e){return i[e]}))},hyphenate:function(e){return e.replace(a,"-$1").toLowerCase()},getBaseElem:s,isCharacterBox:function(e){var t=s(e);return"mathord"===t.type||"textord"===t.type||"atom"===t.type},protocolFromUrl:function(e){var t=/^\s*([^\\/#]*?)(?::|�*58|�*3a)/i.exec(e);return null!=t?t[1]:"_relative"}},h=function(){function e(e){this.displayMode=void 0,this.output=void 0,this.leqno=void 0,this.fleqn=void 0,this.throwOnError=void 0,this.errorColor=void 0,this.macros=void 0,this.minRuleThickness=void 0,this.colorIsTextColor=void 0,this.strict=void 0,this.trust=void 0,this.maxSize=void 0,this.maxExpand=void 0,this.globalGroup=void 0,e=e||{},this.displayMode=l.deflt(e.displayMode,!1),this.output=l.deflt(e.output,"htmlAndMathml"),this.leqno=l.deflt(e.leqno,!1),this.fleqn=l.deflt(e.fleqn,!1),this.throwOnError=l.deflt(e.throwOnError,!0),this.errorColor=l.deflt(e.errorColor,"#cc0000"),this.macros=e.macros||{},this.minRuleThickness=Math.max(0,l.deflt(e.minRuleThickness,0)),this.colorIsTextColor=l.deflt(e.colorIsTextColor,!1),this.strict=l.deflt(e.strict,"warn"),this.trust=l.deflt(e.trust,!1),this.maxSize=Math.max(0,l.deflt(e.maxSize,1/0)),this.maxExpand=Math.max(0,l.deflt(e.maxExpand,1e3)),this.globalGroup=l.deflt(e.globalGroup,!1)}var t=e.prototype;return t.reportNonstrict=function(e,t,r){var a=this.strict;if("function"==typeof a&&(a=a(e,t,r)),a&&"ignore"!==a){if(!0===a||"error"===a)throw new n("LaTeX-incompatible input and strict mode is set to 'error': "+t+" ["+e+"]",r);"warn"===a?"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+t+" ["+e+"]"):"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+a+"': "+t+" ["+e+"]")}},t.useStrictBehavior=function(e,t,r){var n=this.strict;if("function"==typeof n)try{n=n(e,t,r)}catch(e){n="error"}return!(!n||"ignore"===n)&&(!0===n||"error"===n||("warn"===n?("undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+t+" ["+e+"]"),!1):("undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+n+"': "+t+" ["+e+"]"),!1)))},t.isTrusted=function(e){e.url&&!e.protocol&&(e.protocol=l.protocolFromUrl(e.url));var t="function"==typeof this.trust?this.trust(e):this.trust;return Boolean(t)},e}(),m=function(){function e(e,t,r){this.id=void 0,this.size=void 0,this.cramped=void 0,this.id=e,this.size=t,this.cramped=r}var t=e.prototype;return t.sup=function(){return c[u[this.id]]},t.sub=function(){return c[p[this.id]]},t.fracNum=function(){return c[d[this.id]]},t.fracDen=function(){return c[f[this.id]]},t.cramp=function(){return c[g[this.id]]},t.text=function(){return c[v[this.id]]},t.isTight=function(){return this.size>=2},e}(),c=[new m(0,0,!1),new m(1,0,!0),new m(2,1,!1),new m(3,1,!0),new m(4,2,!1),new m(5,2,!0),new m(6,3,!1),new m(7,3,!0)],u=[4,5,4,5,6,7,6,7],p=[5,5,5,5,7,7,7,7],d=[2,3,4,5,6,7,6,7],f=[3,3,5,5,7,7,7,7],g=[1,1,3,3,5,5,7,7],v=[0,1,2,3,2,3,2,3],b={DISPLAY:c[0],TEXT:c[2],SCRIPT:c[4],SCRIPTSCRIPT:c[6]},y=[{name:"latin",blocks:[[256,591],[768,879]]},{name:"cyrillic",blocks:[[1024,1279]]},{name:"armenian",blocks:[[1328,1423]]},{name:"brahmic",blocks:[[2304,4255]]},{name:"georgian",blocks:[[4256,4351]]},{name:"cjk",blocks:[[12288,12543],[19968,40879],[65280,65376]]},{name:"hangul",blocks:[[44032,55215]]}];var x=[];function w(e){for(var t=0;t=x[t]&&e<=x[t+1])return!0;return!1}y.forEach((function(e){return e.blocks.forEach((function(e){return x.push.apply(x,e)}))}));var k=80,S={doubleleftarrow:"M262 157\nl10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3\n 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28\n 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5\nc2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5\n 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87\n-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7\n-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z\nm8 0v40h399730v-40zm0 194v40h399730v-40z",doublerightarrow:"M399738 392l\n-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5\n 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88\n-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68\n-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18\n-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782\nc-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3\n-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z",leftarrow:"M400000 241H110l3-3c68.7-52.7 113.7-120\n 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8\n-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247\nc-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208\n 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3\n 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202\n l-3-3h399890zM100 241v40h399900v-40z",leftbrace:"M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117\n-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7\n 5-6 9-10 13-.7 1-7.3 1-20 1H6z",leftbraceunder:"M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13\n 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688\n 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7\n-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z",leftgroup:"M400000 80\nH435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0\n 435 0h399565z",leftgroupunder:"M400000 262\nH435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219\n 435 219h399565z",leftharpoon:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3\n-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5\n-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7\n-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z",leftharpoonplus:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5\n 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3\n-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7\n-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z\nm0 0v40h400000v-40z",leftharpoondown:"M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333\n 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5\n 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667\n-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z",leftharpoondownplus:"M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12\n 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7\n-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0\nv40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z",lefthook:"M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5\n-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3\n-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21\n 71.5 23h399859zM103 281v-40h399897v40z",leftlinesegment:"M40 281 V428 H0 V94 H40 V241 H400000 v40z\nM40 281 V428 H0 V94 H40 V241 H400000 v40z",leftmapsto:"M40 281 V448H0V74H40V241H400000v40z\nM40 281 V448H0V74H40V241H400000v40z",leftToFrom:"M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23\n-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8\nc28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3\n 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z",longequal:"M0 50 h400000 v40H0z m0 194h40000v40H0z\nM0 50 h400000 v40H0z m0 194h40000v40H0z",midbrace:"M200428 334\nc-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14\n-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7\n 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11\n 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z",midbraceunder:"M199572 214\nc100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14\n 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3\n 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0\n-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z",oiintSize1:"M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6\n-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z\nm368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8\n60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z",oiintSize2:"M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8\n-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z\nm502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2\nc0 110 84 276 504 276s502.4-166 502.4-276z",oiiintSize1:"M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6\n-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z\nm525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0\n85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z",oiiintSize2:"M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8\n-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z\nm770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1\nc0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z",rightarrow:"M0 241v40h399891c-47.3 35.3-84 78-110 128\n-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20\n 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7\n 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85\n-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n 151.7 139 205zm0 0v40h399900v-40z",rightbrace:"M400000 542l\n-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5\ns-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1\nc124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z",rightbraceunder:"M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3\n 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237\n-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z",rightgroup:"M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0\n 3-1 3-3v-38c-76-158-257-219-435-219H0z",rightgroupunder:"M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18\n 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z",rightharpoon:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3\n-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2\n-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58\n 69.2 92 94.5zm0 0v40h399900v-40z",rightharpoonplus:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11\n-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7\n 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z\nm0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z",rightharpoondown:"M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8\n 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5\n-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95\n-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z",rightharpoondownplus:"M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8\n 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3\n 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3\n-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z\nm0-194v40h400000v-40zm0 0v40h400000v-40z",righthook:"M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3\n 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0\n-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21\n 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z",rightlinesegment:"M399960 241 V94 h40 V428 h-40 V281 H0 v-40z\nM399960 241 V94 h40 V428 h-40 V281 H0 v-40z",rightToFrom:"M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23\n 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32\n-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142\n-167z M100 147v40h399900v-40zM0 341v40h399900v-40z",twoheadleftarrow:"M0 167c68 40\n 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69\n-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3\n-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19\n-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101\n 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z",twoheadrightarrow:"M400000 167\nc-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3\n 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42\n 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333\n-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70\n 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z",tilde1:"M200 55.538c-77 0-168 73.953-177 73.953-3 0-7\n-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0\n 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0\n 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128\n-68.267.847-113-73.952-191-73.952z",tilde2:"M344 55.266c-142 0-300.638 81.316-311.5 86.418\n-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9\n 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114\nc1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751\n 181.476 676 181.476c-149 0-189-126.21-332-126.21z",tilde3:"M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457\n-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0\n 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697\n 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696\n -338 0-409-156.573-744-156.573z",tilde4:"M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345\n-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409\n 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9\n 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409\n -175.236-744-175.236z",vec:"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z",widehat1:"M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22\nc-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z",widehat2:"M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat3:"M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat4:"M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widecheck1:"M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1,\n-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z",widecheck2:"M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck3:"M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck4:"M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",baraboveleftarrow:"M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202\nc4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5\nc-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130\ns-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47\n121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6\ns2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11\nc0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z\nM100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z",rightarrowabovebar:"M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32\n-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0\n13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39\n-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5\n-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z",baraboveshortleftharpoon:"M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17\nc2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21\nc-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40\nc-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z\nM0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z",rightharpoonaboveshortbar:"M0,241 l0,40c399126,0,399993,0,399993,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z",shortbaraboveleftharpoon:"M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9,\n1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7,\n-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z\nM93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z",shortrightharpoonabovebar:"M53,241l0,40c398570,0,399437,0,399437,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z"},M=function(){function e(e){this.children=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.children=e,this.classes=[],this.height=0,this.depth=0,this.maxFontSize=0,this.style={}}var t=e.prototype;return t.hasClass=function(e){return l.contains(this.classes,e)},t.toNode=function(){for(var e=document.createDocumentFragment(),t=0;t"},q=function(){function e(e,t,r,n){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.width=void 0,this.maxFontSize=void 0,this.style=void 0,A.call(this,e,r,n),this.children=t||[]}var t=e.prototype;return t.setAttribute=function(e,t){this.attributes[e]=t},t.hasClass=function(e){return l.contains(this.classes,e)},t.toNode=function(){return T.call(this,"span")},t.toMarkup=function(){return B.call(this,"span")},e}(),N=function(){function e(e,t,r,n){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,A.call(this,t,n),this.children=r||[],this.setAttribute("href",e)}var t=e.prototype;return t.setAttribute=function(e,t){this.attributes[e]=t},t.hasClass=function(e){return l.contains(this.classes,e)},t.toNode=function(){return T.call(this,"a")},t.toMarkup=function(){return B.call(this,"a")},e}(),C=function(){function e(e,t,r){this.src=void 0,this.alt=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.alt=t,this.src=e,this.classes=["mord"],this.style=r}var t=e.prototype;return t.hasClass=function(e){return l.contains(this.classes,e)},t.toNode=function(){var e=document.createElement("img");for(var t in e.src=this.src,e.alt=this.alt,e.className="mord",this.style)this.style.hasOwnProperty(t)&&(e.style[t]=this.style[t]);return e},t.toMarkup=function(){var e=""+this.alt+"=a[0]&&e<=a[1])return r.name}return null}(this.text.charCodeAt(0));l&&this.classes.push(l+"_fallback"),/[\xee\xef\xed\xec]/.test(this.text)&&(this.text=I[this.text])}var t=e.prototype;return t.hasClass=function(e){return l.contains(this.classes,e)},t.toNode=function(){var e=document.createTextNode(this.text),t=null;for(var r in this.italic>0&&((t=document.createElement("span")).style.marginRight=this.italic+"em"),this.classes.length>0&&((t=t||document.createElement("span")).className=z(this.classes)),this.style)this.style.hasOwnProperty(r)&&((t=t||document.createElement("span")).style[r]=this.style[r]);return t?(t.appendChild(e),t):e},t.toMarkup=function(){var e=!1,t="0&&(r+="margin-right:"+this.italic+"em;"),this.style)this.style.hasOwnProperty(n)&&(r+=l.hyphenate(n)+":"+this.style[n]+";");r&&(e=!0,t+=' style="'+l.escape(r)+'"');var a=l.escape(this.text);return e?(t+=">",t+=a,t+=""):a},e}(),O=function(){function e(e,t){this.children=void 0,this.attributes=void 0,this.children=e||[],this.attributes=t||{}}var t=e.prototype;return t.toNode=function(){var e=document.createElementNS("http://www.w3.org/2000/svg","svg");for(var t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);for(var r=0;r":""},e}(),H=function(){function e(e){this.attributes=void 0,this.attributes=e||{}}var t=e.prototype;return t.toNode=function(){var e=document.createElementNS("http://www.w3.org/2000/svg","line");for(var t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);return e},t.toMarkup=function(){var e="","\\gt",!0),_(j,Z,oe,"\u2208","\\in",!0),_(j,Z,oe,"\ue020","\\@not"),_(j,Z,oe,"\u2282","\\subset",!0),_(j,Z,oe,"\u2283","\\supset",!0),_(j,Z,oe,"\u2286","\\subseteq",!0),_(j,Z,oe,"\u2287","\\supseteq",!0),_(j,K,oe,"\u2288","\\nsubseteq",!0),_(j,K,oe,"\u2289","\\nsupseteq",!0),_(j,Z,oe,"\u22a8","\\models"),_(j,Z,oe,"\u2190","\\leftarrow",!0),_(j,Z,oe,"\u2264","\\le"),_(j,Z,oe,"\u2264","\\leq",!0),_(j,Z,oe,"<","\\lt",!0),_(j,Z,oe,"\u2192","\\rightarrow",!0),_(j,Z,oe,"\u2192","\\to"),_(j,K,oe,"\u2271","\\ngeq",!0),_(j,K,oe,"\u2270","\\nleq",!0),_(j,Z,se,"\xa0","\\ "),_(j,Z,se,"\xa0","\\space"),_(j,Z,se,"\xa0","\\nobreakspace"),_($,Z,se,"\xa0","\\ "),_($,Z,se,"\xa0"," "),_($,Z,se,"\xa0","\\space"),_($,Z,se,"\xa0","\\nobreakspace"),_(j,Z,se,null,"\\nobreak"),_(j,Z,se,null,"\\allowbreak"),_(j,Z,ie,",",","),_(j,Z,ie,";",";"),_(j,K,Q,"\u22bc","\\barwedge",!0),_(j,K,Q,"\u22bb","\\veebar",!0),_(j,Z,Q,"\u2299","\\odot",!0),_(j,Z,Q,"\u2295","\\oplus",!0),_(j,Z,Q,"\u2297","\\otimes",!0),_(j,Z,le,"\u2202","\\partial",!0),_(j,Z,Q,"\u2298","\\oslash",!0),_(j,K,Q,"\u229a","\\circledcirc",!0),_(j,K,Q,"\u22a1","\\boxdot",!0),_(j,Z,Q,"\u25b3","\\bigtriangleup"),_(j,Z,Q,"\u25bd","\\bigtriangledown"),_(j,Z,Q,"\u2020","\\dagger"),_(j,Z,Q,"\u22c4","\\diamond"),_(j,Z,Q,"\u22c6","\\star"),_(j,Z,Q,"\u25c3","\\triangleleft"),_(j,Z,Q,"\u25b9","\\triangleright"),_(j,Z,ae,"{","\\{"),_($,Z,le,"{","\\{"),_($,Z,le,"{","\\textbraceleft"),_(j,Z,ee,"}","\\}"),_($,Z,le,"}","\\}"),_($,Z,le,"}","\\textbraceright"),_(j,Z,ae,"{","\\lbrace"),_(j,Z,ee,"}","\\rbrace"),_(j,Z,ae,"[","\\lbrack",!0),_($,Z,le,"[","\\lbrack",!0),_(j,Z,ee,"]","\\rbrack",!0),_($,Z,le,"]","\\rbrack",!0),_(j,Z,ae,"(","\\lparen",!0),_(j,Z,ee,")","\\rparen",!0),_($,Z,le,"<","\\textless",!0),_($,Z,le,">","\\textgreater",!0),_(j,Z,ae,"\u230a","\\lfloor",!0),_(j,Z,ee,"\u230b","\\rfloor",!0),_(j,Z,ae,"\u2308","\\lceil",!0),_(j,Z,ee,"\u2309","\\rceil",!0),_(j,Z,le,"\\","\\backslash"),_(j,Z,le,"\u2223","|"),_(j,Z,le,"\u2223","\\vert"),_($,Z,le,"|","\\textbar",!0),_(j,Z,le,"\u2225","\\|"),_(j,Z,le,"\u2225","\\Vert"),_($,Z,le,"\u2225","\\textbardbl"),_($,Z,le,"~","\\textasciitilde"),_($,Z,le,"\\","\\textbackslash"),_($,Z,le,"^","\\textasciicircum"),_(j,Z,oe,"\u2191","\\uparrow",!0),_(j,Z,oe,"\u21d1","\\Uparrow",!0),_(j,Z,oe,"\u2193","\\downarrow",!0),_(j,Z,oe,"\u21d3","\\Downarrow",!0),_(j,Z,oe,"\u2195","\\updownarrow",!0),_(j,Z,oe,"\u21d5","\\Updownarrow",!0),_(j,Z,ne,"\u2210","\\coprod"),_(j,Z,ne,"\u22c1","\\bigvee"),_(j,Z,ne,"\u22c0","\\bigwedge"),_(j,Z,ne,"\u2a04","\\biguplus"),_(j,Z,ne,"\u22c2","\\bigcap"),_(j,Z,ne,"\u22c3","\\bigcup"),_(j,Z,ne,"\u222b","\\int"),_(j,Z,ne,"\u222b","\\intop"),_(j,Z,ne,"\u222c","\\iint"),_(j,Z,ne,"\u222d","\\iiint"),_(j,Z,ne,"\u220f","\\prod"),_(j,Z,ne,"\u2211","\\sum"),_(j,Z,ne,"\u2a02","\\bigotimes"),_(j,Z,ne,"\u2a01","\\bigoplus"),_(j,Z,ne,"\u2a00","\\bigodot"),_(j,Z,ne,"\u222e","\\oint"),_(j,Z,ne,"\u222f","\\oiint"),_(j,Z,ne,"\u2230","\\oiiint"),_(j,Z,ne,"\u2a06","\\bigsqcup"),_(j,Z,ne,"\u222b","\\smallint"),_($,Z,te,"\u2026","\\textellipsis"),_(j,Z,te,"\u2026","\\mathellipsis"),_($,Z,te,"\u2026","\\ldots",!0),_(j,Z,te,"\u2026","\\ldots",!0),_(j,Z,te,"\u22ef","\\@cdots",!0),_(j,Z,te,"\u22f1","\\ddots",!0),_(j,Z,le,"\u22ee","\\varvdots"),_(j,Z,J,"\u02ca","\\acute"),_(j,Z,J,"\u02cb","\\grave"),_(j,Z,J,"\xa8","\\ddot"),_(j,Z,J,"~","\\tilde"),_(j,Z,J,"\u02c9","\\bar"),_(j,Z,J,"\u02d8","\\breve"),_(j,Z,J,"\u02c7","\\check"),_(j,Z,J,"^","\\hat"),_(j,Z,J,"\u20d7","\\vec"),_(j,Z,J,"\u02d9","\\dot"),_(j,Z,J,"\u02da","\\mathring"),_(j,Z,re,"\ue131","\\@imath"),_(j,Z,re,"\ue237","\\@jmath"),_(j,Z,le,"\u0131","\u0131"),_(j,Z,le,"\u0237","\u0237"),_($,Z,le,"\u0131","\\i",!0),_($,Z,le,"\u0237","\\j",!0),_($,Z,le,"\xdf","\\ss",!0),_($,Z,le,"\xe6","\\ae",!0),_($,Z,le,"\u0153","\\oe",!0),_($,Z,le,"\xf8","\\o",!0),_($,Z,le,"\xc6","\\AE",!0),_($,Z,le,"\u0152","\\OE",!0),_($,Z,le,"\xd8","\\O",!0),_($,Z,J,"\u02ca","\\'"),_($,Z,J,"\u02cb","\\`"),_($,Z,J,"\u02c6","\\^"),_($,Z,J,"\u02dc","\\~"),_($,Z,J,"\u02c9","\\="),_($,Z,J,"\u02d8","\\u"),_($,Z,J,"\u02d9","\\."),_($,Z,J,"\u02da","\\r"),_($,Z,J,"\u02c7","\\v"),_($,Z,J,"\xa8",'\\"'),_($,Z,J,"\u02dd","\\H"),_($,Z,J,"\u25ef","\\textcircled");var he={"--":!0,"---":!0,"``":!0,"''":!0};_($,Z,le,"\u2013","--",!0),_($,Z,le,"\u2013","\\textendash"),_($,Z,le,"\u2014","---",!0),_($,Z,le,"\u2014","\\textemdash"),_($,Z,le,"\u2018","`",!0),_($,Z,le,"\u2018","\\textquoteleft"),_($,Z,le,"\u2019","'",!0),_($,Z,le,"\u2019","\\textquoteright"),_($,Z,le,"\u201c","``",!0),_($,Z,le,"\u201c","\\textquotedblleft"),_($,Z,le,"\u201d","''",!0),_($,Z,le,"\u201d","\\textquotedblright"),_(j,Z,le,"\xb0","\\degree",!0),_($,Z,le,"\xb0","\\degree"),_($,Z,le,"\xb0","\\textdegree",!0),_(j,Z,le,"\xa3","\\pounds"),_(j,Z,le,"\xa3","\\mathsterling",!0),_($,Z,le,"\xa3","\\pounds"),_($,Z,le,"\xa3","\\textsterling",!0),_(j,K,le,"\u2720","\\maltese"),_($,K,le,"\u2720","\\maltese");for(var me='0123456789/@."',ce=0;ce=5?0:e>=3?1:2]){var r=G[t]={cssEmPerMu:P.quad[t]/18};for(var n in P)P.hasOwnProperty(n)&&(r[n]=P[n][t])}return G[t]}(this.size)),this._fontMetrics},t.getColor=function(){return this.phantom?"transparent":this.color},e}();Ie.BASESIZE=6;var Re=Ie,Oe={pt:1,mm:7227/2540,cm:7227/254,in:72.27,bp:1.00375,pc:12,dd:1238/1157,cc:14856/1157,nd:685/642,nc:1370/107,sp:1/65536,px:1.00375},Ee={ex:!0,em:!0,mu:!0},He=function(e){return"string"!=typeof e&&(e=e.unit),e in Oe||e in Ee||"ex"===e},Le=function(e,t){var r;if(e.unit in Oe)r=Oe[e.unit]/t.fontMetrics().ptPerEm/t.sizeMultiplier;else if("mu"===e.unit)r=t.fontMetrics().cssEmPerMu;else{var a;if(a=t.style.isTight()?t.havingStyle(t.style.text()):t,"ex"===e.unit)r=a.fontMetrics().xHeight;else{if("em"!==e.unit)throw new n("Invalid unit: '"+e.unit+"'");r=a.fontMetrics().quad}a!==t&&(r*=a.sizeMultiplier/t.sizeMultiplier)}return Math.min(e.number*r,t.maxSize)},De=function(e,t,r){return X[r][e]&&X[r][e].replace&&(e=X[r][e].replace),{value:e,metrics:V(e,t,r)}},Pe=function(e,t,r,n,a){var i,o=De(e,t,r),s=o.metrics;if(e=o.value,s){var l=s.italic;("text"===r||n&&"mathit"===n.font)&&(l=0),i=new R(e,s.height,s.depth,l,s.skew,s.width,a)}else"undefined"!=typeof console&&console.warn("No character metrics for '"+e+"' in style '"+t+"' and mode '"+r+"'"),i=new R(e,0,0,0,0,0,a);if(n){i.maxFontSize=n.sizeMultiplier,n.style.isTight()&&i.classes.push("mtight");var h=n.getColor();h&&(i.style.color=h)}return i},Fe=function(e,t){if(z(e.classes)!==z(t.classes)||e.skew!==t.skew||e.maxFontSize!==t.maxFontSize)return!1;if(1===e.classes.length){var r=e.classes[0];if("mbin"===r||"mord"===r)return!1}for(var n in e.style)if(e.style.hasOwnProperty(n)&&e.style[n]!==t.style[n])return!1;for(var a in t.style)if(t.style.hasOwnProperty(a)&&e.style[a]!==t.style[a])return!1;return!0},Ve=function(e){for(var t=0,r=0,n=0,a=0;at&&(t=i.height),i.depth>r&&(r=i.depth),i.maxFontSize>n&&(n=i.maxFontSize)}e.height=t,e.depth=r,e.maxFontSize=n},Ge=function(e,t,r,n){var a=new q(e,t,r,n);return Ve(a),a},Ue=function(e,t,r,n){return new q(e,t,r,n)},Ye=function(e){var t=new M(e);return Ve(t),t},We=function(e,t,r){var n="";switch(e){case"amsrm":n="AMS";break;case"textrm":n="Main";break;case"textsf":n="SansSerif";break;case"texttt":n="Typewriter";break;default:n=e}return n+"-"+("textbf"===t&&"textit"===r?"BoldItalic":"textbf"===t?"Bold":"textit"===t?"Italic":"Regular")},Xe={mathbf:{variant:"bold",fontName:"Main-Bold"},mathrm:{variant:"normal",fontName:"Main-Regular"},textit:{variant:"italic",fontName:"Main-Italic"},mathit:{variant:"italic",fontName:"Main-Italic"},mathnormal:{variant:"italic",fontName:"Math-Italic"},mathbb:{variant:"double-struck",fontName:"AMS-Regular"},mathcal:{variant:"script",fontName:"Caligraphic-Regular"},mathfrak:{variant:"fraktur",fontName:"Fraktur-Regular"},mathscr:{variant:"script",fontName:"Script-Regular"},mathsf:{variant:"sans-serif",fontName:"SansSerif-Regular"},mathtt:{variant:"monospace",fontName:"Typewriter-Regular"}},_e={vec:["vec",.471,.714],oiintSize1:["oiintSize1",.957,.499],oiintSize2:["oiintSize2",1.472,.659],oiiintSize1:["oiiintSize1",1.304,.499],oiiintSize2:["oiiintSize2",1.98,.659]},je={fontMap:Xe,makeSymbol:Pe,mathsym:function(e,t,r,n){return void 0===n&&(n=[]),"boldsymbol"===r.font&&De(e,"Main-Bold",t).metrics?Pe(e,"Main-Bold",t,r,n.concat(["mathbf"])):"\\"===e||"main"===X[t][e].font?Pe(e,"Main-Regular",t,r,n):Pe(e,"AMS-Regular",t,r,n.concat(["amsrm"]))},makeSpan:Ge,makeSvgSpan:Ue,makeLineSpan:function(e,t,r){var n=Ge([e],[],t);return n.height=Math.max(r||t.fontMetrics().defaultRuleThickness,t.minRuleThickness),n.style.borderBottomWidth=n.height+"em",n.maxFontSize=1,n},makeAnchor:function(e,t,r,n){var a=new N(e,t,r,n);return Ve(a),a},makeFragment:Ye,wrapFragment:function(e,t){return e instanceof M?Ge([],[e],t):e},makeVList:function(e,t){for(var r=function(e){if("individualShift"===e.positionType){for(var t=e.children,r=[t[0]],n=-t[0].shift-t[0].elem.depth,a=n,i=1;i0&&(o.push(yt(s,t)),s=[]),o.push(a[l]));s.length>0&&o.push(yt(s,t)),r?((i=yt(ut(r,t,!0))).classes=["tag"],o.push(i)):n&&o.push(n);var m=st(["katex-html"],o);if(m.setAttribute("aria-hidden","true"),i){var c=i.children[0];c.style.height=m.height+m.depth+"em",c.style.verticalAlign=-m.depth+"em"}return m}function wt(e){return new M(e)}var kt=function(){function e(e,t,r){this.type=void 0,this.attributes=void 0,this.children=void 0,this.classes=void 0,this.type=e,this.attributes={},this.children=t||[],this.classes=r||[]}var t=e.prototype;return t.setAttribute=function(e,t){this.attributes[e]=t},t.getAttribute=function(e){return this.attributes[e]},t.toNode=function(){var e=document.createElementNS("http://www.w3.org/1998/Math/MathML",this.type);for(var t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);this.classes.length>0&&(e.className=z(this.classes));for(var r=0;r0&&(e+=' class ="'+l.escape(z(this.classes))+'"'),e+=">";for(var r=0;r"},t.toText=function(){return this.children.map((function(e){return e.toText()})).join("")},e}(),St=function(){function e(e){this.text=void 0,this.text=e}var t=e.prototype;return t.toNode=function(){return document.createTextNode(this.text)},t.toMarkup=function(){return l.escape(this.toText())},t.toText=function(){return this.text},e}(),Mt={MathNode:kt,TextNode:St,SpaceNode:function(){function e(e){this.width=void 0,this.character=void 0,this.width=e,this.character=e>=.05555&&e<=.05556?"\u200a":e>=.1666&&e<=.1667?"\u2009":e>=.2222&&e<=.2223?"\u2005":e>=.2777&&e<=.2778?"\u2005\u200a":e>=-.05556&&e<=-.05555?"\u200a\u2063":e>=-.1667&&e<=-.1666?"\u2009\u2063":e>=-.2223&&e<=-.2222?"\u205f\u2063":e>=-.2778&&e<=-.2777?"\u2005\u2063":null}var t=e.prototype;return t.toNode=function(){if(this.character)return document.createTextNode(this.character);var e=document.createElementNS("http://www.w3.org/1998/Math/MathML","mspace");return e.setAttribute("width",this.width+"em"),e},t.toMarkup=function(){return this.character?""+this.character+"":''},t.toText=function(){return this.character?this.character:" "},e}(),newDocumentFragment:wt},zt=function(e,t,r){return!X[t][e]||!X[t][e].replace||55349===e.charCodeAt(0)||he.hasOwnProperty(e)&&r&&(r.fontFamily&&"tt"===r.fontFamily.substr(4,2)||r.font&&"tt"===r.font.substr(4,2))||(e=X[t][e].replace),new Mt.TextNode(e)},At=function(e){return 1===e.length?e[0]:new Mt.MathNode("mrow",e)},Tt=function(e,t){if("texttt"===t.fontFamily)return"monospace";if("textsf"===t.fontFamily)return"textit"===t.fontShape&&"textbf"===t.fontWeight?"sans-serif-bold-italic":"textit"===t.fontShape?"sans-serif-italic":"textbf"===t.fontWeight?"bold-sans-serif":"sans-serif";if("textit"===t.fontShape&&"textbf"===t.fontWeight)return"bold-italic";if("textit"===t.fontShape)return"italic";if("textbf"===t.fontWeight)return"bold";var r=t.font;if(!r||"mathnormal"===r)return null;var n=e.mode;if("mathit"===r)return"italic";if("boldsymbol"===r)return"textord"===e.type?"bold":"bold-italic";if("mathbf"===r)return"bold";if("mathbb"===r)return"double-struck";if("mathfrak"===r)return"fraktur";if("mathscr"===r||"mathcal"===r)return"script";if("mathsf"===r)return"sans-serif";if("mathtt"===r)return"monospace";var a=e.text;return l.contains(["\\imath","\\jmath"],a)?null:(X[n][a]&&X[n][a].replace&&(a=X[n][a].replace),V(a,je.fontMap[r].fontName,n)?je.fontMap[r].variant:null)},Bt=function(e,t,r){if(1===e.length){var n=Nt(e[0],t);return r&&n instanceof kt&&"mo"===n.type&&(n.setAttribute("lspace","0em"),n.setAttribute("rspace","0em")),[n]}for(var a,i=[],o=0;o0&&(p.text=p.text.slice(0,1)+"\u0338"+p.text.slice(1),i.pop())}}}i.push(s),a=s}return i},qt=function(e,t,r){return At(Bt(e,t,r))},Nt=function(e,t){if(!e)return new Mt.MathNode("mrow");if(rt[e.type])return rt[e.type](e,t);throw new n("Got group of unknown type: '"+e.type+"'")};function Ct(e,t,r,n,a){var i,o=Bt(e,r);i=1===o.length&&o[0]instanceof kt&&l.contains(["mrow","mtable"],o[0].type)?o[0]:new Mt.MathNode("mrow",o);var s=new Mt.MathNode("annotation",[new Mt.TextNode(t)]);s.setAttribute("encoding","application/x-tex");var h=new Mt.MathNode("semantics",[i,s]),m=new Mt.MathNode("math",[h]);m.setAttribute("xmlns","http://www.w3.org/1998/Math/MathML"),n&&m.setAttribute("display","block");var c=a?"katex":"katex-mathml";return je.makeSpan([c],[m])}var It=function(e){return new Re({style:e.displayMode?b.DISPLAY:b.TEXT,maxSize:e.maxSize,minRuleThickness:e.minRuleThickness})},Rt=function(e,t){if(t.displayMode){var r=["katex-display"];t.leqno&&r.push("leqno"),t.fleqn&&r.push("fleqn"),e=je.makeSpan(r,[e])}return e},Ot=function(e,t,r){var n,a=It(r);if("mathml"===r.output)return Ct(e,t,a,r.displayMode,!0);if("html"===r.output){var i=xt(e,a);n=je.makeSpan(["katex"],[i])}else{var o=Ct(e,t,a,r.displayMode,!1),s=xt(e,a);n=je.makeSpan(["katex"],[o,s])}return Rt(n,r)},Et={widehat:"^",widecheck:"\u02c7",widetilde:"~",utilde:"~",overleftarrow:"\u2190",underleftarrow:"\u2190",xleftarrow:"\u2190",overrightarrow:"\u2192",underrightarrow:"\u2192",xrightarrow:"\u2192",underbrace:"\u23df",overbrace:"\u23de",overgroup:"\u23e0",undergroup:"\u23e1",overleftrightarrow:"\u2194",underleftrightarrow:"\u2194",xleftrightarrow:"\u2194",Overrightarrow:"\u21d2",xRightarrow:"\u21d2",overleftharpoon:"\u21bc",xleftharpoonup:"\u21bc",overrightharpoon:"\u21c0",xrightharpoonup:"\u21c0",xLeftarrow:"\u21d0",xLeftrightarrow:"\u21d4",xhookleftarrow:"\u21a9",xhookrightarrow:"\u21aa",xmapsto:"\u21a6",xrightharpoondown:"\u21c1",xleftharpoondown:"\u21bd",xrightleftharpoons:"\u21cc",xleftrightharpoons:"\u21cb",xtwoheadleftarrow:"\u219e",xtwoheadrightarrow:"\u21a0",xlongequal:"=",xtofrom:"\u21c4",xrightleftarrows:"\u21c4",xrightequilibrium:"\u21cc",xleftequilibrium:"\u21cb","\\cdrightarrow":"\u2192","\\cdleftarrow":"\u2190","\\cdlongequal":"="},Ht={overrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],overleftarrow:[["leftarrow"],.888,522,"xMinYMin"],underrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],underleftarrow:[["leftarrow"],.888,522,"xMinYMin"],xrightarrow:[["rightarrow"],1.469,522,"xMaxYMin"],"\\cdrightarrow":[["rightarrow"],3,522,"xMaxYMin"],xleftarrow:[["leftarrow"],1.469,522,"xMinYMin"],"\\cdleftarrow":[["leftarrow"],3,522,"xMinYMin"],Overrightarrow:[["doublerightarrow"],.888,560,"xMaxYMin"],xRightarrow:[["doublerightarrow"],1.526,560,"xMaxYMin"],xLeftarrow:[["doubleleftarrow"],1.526,560,"xMinYMin"],overleftharpoon:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoonup:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoondown:[["leftharpoondown"],.888,522,"xMinYMin"],overrightharpoon:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoonup:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoondown:[["rightharpoondown"],.888,522,"xMaxYMin"],xlongequal:[["longequal"],.888,334,"xMinYMin"],"\\cdlongequal":[["longequal"],3,334,"xMinYMin"],xtwoheadleftarrow:[["twoheadleftarrow"],.888,334,"xMinYMin"],xtwoheadrightarrow:[["twoheadrightarrow"],.888,334,"xMaxYMin"],overleftrightarrow:[["leftarrow","rightarrow"],.888,522],overbrace:[["leftbrace","midbrace","rightbrace"],1.6,548],underbrace:[["leftbraceunder","midbraceunder","rightbraceunder"],1.6,548],underleftrightarrow:[["leftarrow","rightarrow"],.888,522],xleftrightarrow:[["leftarrow","rightarrow"],1.75,522],xLeftrightarrow:[["doubleleftarrow","doublerightarrow"],1.75,560],xrightleftharpoons:[["leftharpoondownplus","rightharpoonplus"],1.75,716],xleftrightharpoons:[["leftharpoonplus","rightharpoondownplus"],1.75,716],xhookleftarrow:[["leftarrow","righthook"],1.08,522],xhookrightarrow:[["lefthook","rightarrow"],1.08,522],overlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],underlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],overgroup:[["leftgroup","rightgroup"],.888,342],undergroup:[["leftgroupunder","rightgroupunder"],.888,342],xmapsto:[["leftmapsto","rightarrow"],1.5,522],xtofrom:[["leftToFrom","rightToFrom"],1.75,528],xrightleftarrows:[["baraboveleftarrow","rightarrowabovebar"],1.75,901],xrightequilibrium:[["baraboveshortleftharpoon","rightharpoonaboveshortbar"],1.75,716],xleftequilibrium:[["shortbaraboveleftharpoon","shortrightharpoonabovebar"],1.75,716]},Lt=function(e,t,r,n,a){var i,o=e.height+e.depth+r+n;if(/fbox|color|angl/.test(t)){if(i=je.makeSpan(["stretchy",t],[],a),"fbox"===t){var s=a.color&&a.getColor();s&&(i.style.borderColor=s)}}else{var l=[];/^[bx]cancel$/.test(t)&&l.push(new H({x1:"0",y1:"0",x2:"100%",y2:"100%","stroke-width":"0.046em"})),/^x?cancel$/.test(t)&&l.push(new H({x1:"0",y1:"100%",x2:"100%",y2:"0","stroke-width":"0.046em"}));var h=new O(l,{width:"100%",height:o+"em"});i=je.makeSvgSpan([],[h],a)}return i.height=o,i.style.height=o+"em",i},Dt=function(e){var t=new Mt.MathNode("mo",[new Mt.TextNode(Et[e.replace(/^\\/,"")])]);return t.setAttribute("stretchy","true"),t},Pt=function(e,t){var r=function(){var r=4e5,n=e.label.substr(1);if(l.contains(["widehat","widecheck","widetilde","utilde"],n)){var a,i,o,s="ordgroup"===(d=e.base).type?d.body.length:1;if(s>5)"widehat"===n||"widecheck"===n?(a=420,r=2364,o=.42,i=n+"4"):(a=312,r=2340,o=.34,i="tilde4");else{var h=[1,1,2,2,3,3][s];"widehat"===n||"widecheck"===n?(r=[0,1062,2364,2364,2364][h],a=[0,239,300,360,420][h],o=[0,.24,.3,.3,.36,.42][h],i=n+h):(r=[0,600,1033,2339,2340][h],a=[0,260,286,306,312][h],o=[0,.26,.286,.3,.306,.34][h],i="tilde"+h)}var m=new E(i),c=new O([m],{width:"100%",height:o+"em",viewBox:"0 0 "+r+" "+a,preserveAspectRatio:"none"});return{span:je.makeSvgSpan([],[c],t),minWidth:0,height:o}}var u,p,d,f=[],g=Ht[n],v=g[0],b=g[1],y=g[2],x=y/1e3,w=v.length;if(1===w)u=["hide-tail"],p=[g[3]];else if(2===w)u=["halfarrow-left","halfarrow-right"],p=["xMinYMin","xMaxYMin"];else{if(3!==w)throw new Error("Correct katexImagesData or update code here to support\n "+w+" children.");u=["brace-left","brace-center","brace-right"],p=["xMinYMin","xMidYMin","xMaxYMin"]}for(var k=0;k0&&(n.style.minWidth=a+"em"),n};function Ft(e,t){if(!e||e.type!==t)throw new Error("Expected node of type "+t+", but got "+(e?"node of type "+e.type:String(e)));return e}function Vt(e){var t=Gt(e);if(!t)throw new Error("Expected node of symbol group type, but got "+(e?"node of type "+e.type:String(e)));return t}function Gt(e){return e&&("atom"===e.type||Y.hasOwnProperty(e.type))?e:null}var Ut=function(e,t){var r,n,a;e&&"supsub"===e.type?(r=(n=Ft(e.base,"accent")).base,e.base=r,a=function(e){if(e instanceof q)return e;throw new Error("Expected span but got "+String(e)+".")}(bt(e,t)),e.base=n):r=(n=Ft(e,"accent")).base;var i=bt(r,t.havingCrampedStyle()),o=0;if(n.isShifty&&l.isCharacterBox(r)){var s=l.getBaseElem(r);o=L(bt(s,t.havingCrampedStyle())).skew}var h,m=Math.min(i.height,t.fontMetrics().xHeight);if(n.isStretchy)h=Pt(n,t),h=je.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:i},{type:"elem",elem:h,wrapperClasses:["svg-align"],wrapperStyle:o>0?{width:"calc(100% - "+2*o+"em)",marginLeft:2*o+"em"}:void 0}]},t);else{var c,u;"\\vec"===n.label?(c=je.staticSvg("vec",t),u=je.svgData.vec[1]):((c=L(c=je.makeOrd({mode:n.mode,text:n.label},t,"textord"))).italic=0,u=c.width),h=je.makeSpan(["accent-body"],[c]);var p="\\textcircled"===n.label;p&&(h.classes.push("accent-full"),m=i.height);var d=o;p||(d-=u/2),h.style.left=d+"em","\\textcircled"===n.label&&(h.style.top=".2em"),h=je.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:i},{type:"kern",size:-m},{type:"elem",elem:h}]},t)}var f=je.makeSpan(["mord","accent"],[h],t);return a?(a.children[0]=f,a.height=Math.max(f.height,a.height),a.classes[0]="mord",a):f},Yt=function(e,t){var r=e.isStretchy?Dt(e.label):new Mt.MathNode("mo",[zt(e.label,e.mode)]),n=new Mt.MathNode("mover",[Nt(e.base,t),r]);return n.setAttribute("accent","true"),n},Wt=new RegExp(["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring"].map((function(e){return"\\"+e})).join("|"));nt({type:"accent",names:["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring","\\widecheck","\\widehat","\\widetilde","\\overrightarrow","\\overleftarrow","\\Overrightarrow","\\overleftrightarrow","\\overgroup","\\overlinesegment","\\overleftharpoon","\\overrightharpoon"],props:{numArgs:1},handler:function(e,t){var r=it(t[0]),n=!Wt.test(e.funcName),a=!n||"\\widehat"===e.funcName||"\\widetilde"===e.funcName||"\\widecheck"===e.funcName;return{type:"accent",mode:e.parser.mode,label:e.funcName,isStretchy:n,isShifty:a,base:r}},htmlBuilder:Ut,mathmlBuilder:Yt}),nt({type:"accent",names:["\\'","\\`","\\^","\\~","\\=","\\u","\\.",'\\"',"\\r","\\H","\\v","\\textcircled"],props:{numArgs:1,allowedInText:!0,allowedInMath:!1,argTypes:["primitive"]},handler:function(e,t){var r=t[0];return{type:"accent",mode:e.parser.mode,label:e.funcName,isStretchy:!1,isShifty:!0,base:r}},htmlBuilder:Ut,mathmlBuilder:Yt}),nt({type:"accentUnder",names:["\\underleftarrow","\\underrightarrow","\\underleftrightarrow","\\undergroup","\\underlinesegment","\\utilde"],props:{numArgs:1},handler:function(e,t){var r=e.parser,n=e.funcName,a=t[0];return{type:"accentUnder",mode:r.mode,label:n,base:a}},htmlBuilder:function(e,t){var r=bt(e.base,t),n=Pt(e,t),a="\\utilde"===e.label?.12:0,i=je.makeVList({positionType:"top",positionData:r.height,children:[{type:"elem",elem:n,wrapperClasses:["svg-align"]},{type:"kern",size:a},{type:"elem",elem:r}]},t);return je.makeSpan(["mord","accentunder"],[i],t)},mathmlBuilder:function(e,t){var r=Dt(e.label),n=new Mt.MathNode("munder",[Nt(e.base,t),r]);return n.setAttribute("accentunder","true"),n}});var Xt=function(e){var t=new Mt.MathNode("mpadded",e?[e]:[]);return t.setAttribute("width","+0.6em"),t.setAttribute("lspace","0.3em"),t};nt({type:"xArrow",names:["\\xleftarrow","\\xrightarrow","\\xLeftarrow","\\xRightarrow","\\xleftrightarrow","\\xLeftrightarrow","\\xhookleftarrow","\\xhookrightarrow","\\xmapsto","\\xrightharpoondown","\\xrightharpoonup","\\xleftharpoondown","\\xleftharpoonup","\\xrightleftharpoons","\\xleftrightharpoons","\\xlongequal","\\xtwoheadrightarrow","\\xtwoheadleftarrow","\\xtofrom","\\xrightleftarrows","\\xrightequilibrium","\\xleftequilibrium","\\\\cdrightarrow","\\\\cdleftarrow","\\\\cdlongequal"],props:{numArgs:1,numOptionalArgs:1},handler:function(e,t,r){var n=e.parser,a=e.funcName;return{type:"xArrow",mode:n.mode,label:a,body:t[0],below:r[0]}},htmlBuilder:function(e,t){var r,n=t.style,a=t.havingStyle(n.sup()),i=je.wrapFragment(bt(e.body,a,t),t),o="\\x"===e.label.slice(0,2)?"x":"cd";i.classes.push(o+"-arrow-pad"),e.below&&(a=t.havingStyle(n.sub()),(r=je.wrapFragment(bt(e.below,a,t),t)).classes.push(o+"-arrow-pad"));var s,l=Pt(e,t),h=-t.fontMetrics().axisHeight+.5*l.height,m=-t.fontMetrics().axisHeight-.5*l.height-.111;if((i.depth>.25||"\\xleftequilibrium"===e.label)&&(m-=i.depth),r){var c=-t.fontMetrics().axisHeight+r.height+.5*l.height+.111;s=je.makeVList({positionType:"individualShift",children:[{type:"elem",elem:i,shift:m},{type:"elem",elem:l,shift:h},{type:"elem",elem:r,shift:c}]},t)}else s=je.makeVList({positionType:"individualShift",children:[{type:"elem",elem:i,shift:m},{type:"elem",elem:l,shift:h}]},t);return s.children[0].children[0].children[1].classes.push("svg-align"),je.makeSpan(["mrel","x-arrow"],[s],t)},mathmlBuilder:function(e,t){var r,n=Dt(e.label);if(n.setAttribute("minsize","x"===e.label.charAt(0)?"1.75em":"3.0em"),e.body){var a=Xt(Nt(e.body,t));if(e.below){var i=Xt(Nt(e.below,t));r=new Mt.MathNode("munderover",[n,i,a])}else r=new Mt.MathNode("mover",[n,a])}else if(e.below){var o=Xt(Nt(e.below,t));r=new Mt.MathNode("munder",[n,o])}else r=Xt(),r=new Mt.MathNode("mover",[n,r]);return r}});var _t={">":"\\\\cdrightarrow","<":"\\\\cdleftarrow","=":"\\\\cdlongequal",A:"\\uparrow",V:"\\downarrow","|":"\\Vert",".":"no arrow"},jt=function(e){return"textord"===e.type&&"@"===e.text};function $t(e,t,r){var n=_t[e];switch(n){case"\\\\cdrightarrow":case"\\\\cdleftarrow":return r.callFunction(n,[t[0]],[t[1]]);case"\\uparrow":case"\\downarrow":var a={type:"atom",text:n,mode:"math",family:"rel"},i={type:"ordgroup",mode:"math",body:[r.callFunction("\\\\cdleft",[t[0]],[]),r.callFunction("\\Big",[a],[]),r.callFunction("\\\\cdright",[t[1]],[])]};return r.callFunction("\\\\cdparent",[i],[]);case"\\\\cdlongequal":return r.callFunction("\\\\cdlongequal",[],[]);case"\\Vert":return r.callFunction("\\Big",[{type:"textord",text:"\\Vert",mode:"math"}],[]);default:return{type:"textord",text:" ",mode:"math"}}}nt({type:"cdlabel",names:["\\\\cdleft","\\\\cdright"],props:{numArgs:1},handler:function(e,t){var r=e.parser,n=e.funcName;return{type:"cdlabel",mode:r.mode,side:n.slice(4),label:t[0]}},htmlBuilder:function(e,t){var r=t.havingStyle(t.style.sup()),n=je.wrapFragment(bt(e.label,r,t),t);return n.classes.push("cd-label-"+e.side),n.style.bottom=.8-n.depth+"em",n.height=0,n.depth=0,n},mathmlBuilder:function(e,t){var r=new Mt.MathNode("mrow",[Nt(e.label,t)]);return(r=new Mt.MathNode("mpadded",[r])).setAttribute("width","0"),"left"===e.side&&r.setAttribute("lspace","-1width"),r.setAttribute("voffset","0.7em"),(r=new Mt.MathNode("mstyle",[r])).setAttribute("displaystyle","false"),r.setAttribute("scriptlevel","1"),r}}),nt({type:"cdlabelparent",names:["\\\\cdparent"],props:{numArgs:1},handler:function(e,t){return{type:"cdlabelparent",mode:e.parser.mode,fragment:t[0]}},htmlBuilder:function(e,t){var r=je.wrapFragment(bt(e.fragment,t),t);return r.classes.push("cd-vert-arrow"),r},mathmlBuilder:function(e,t){return new Mt.MathNode("mrow",[Nt(e.fragment,t)])}}),nt({type:"textord",names:["\\@char"],props:{numArgs:1,allowedInText:!0},handler:function(e,t){for(var r=e.parser,a=Ft(t[0],"ordgroup").body,i="",o=0;o","\\langle","\\rangle","/","\\backslash","\\lt","\\gt"],gr=[0,1.2,1.8,2.4,3],vr=[{type:"small",style:b.SCRIPTSCRIPT},{type:"small",style:b.SCRIPT},{type:"small",style:b.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4}],br=[{type:"small",style:b.SCRIPTSCRIPT},{type:"small",style:b.SCRIPT},{type:"small",style:b.TEXT},{type:"stack"}],yr=[{type:"small",style:b.SCRIPTSCRIPT},{type:"small",style:b.SCRIPT},{type:"small",style:b.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4},{type:"stack"}],xr=function(e){if("small"===e.type)return"Main-Regular";if("large"===e.type)return"Size"+e.size+"-Regular";if("stack"===e.type)return"Size4-Regular";throw new Error("Add support for delim type '"+e.type+"' here.")},wr=function(e,t,r,n){for(var a=Math.min(2,3-n.style.size);at)return r[a]}return r[r.length-1]},kr=function(e,t,r,n,a,i){var o;"<"===e||"\\lt"===e||"\u27e8"===e?e="\\langle":">"!==e&&"\\gt"!==e&&"\u27e9"!==e||(e="\\rangle"),o=l.contains(fr,e)?vr:l.contains(pr,e)?yr:br;var s=wr(e,t,o,n);return"small"===s.type?function(e,t,r,n,a,i){var o=je.makeSymbol(e,"Main-Regular",a,n),s=rr(o,t,n,i);return r&&nr(s,n,t),s}(e,s.style,r,n,a,i):"large"===s.type?ar(e,s.size,r,n,a,i):mr(e,t,r,n,a,i)},Sr=function(e,t){var r,n,a=t.havingBaseSizing(),i=wr("\\surd",e*a.sizeMultiplier,yr,a),o=a.sizeMultiplier,s=Math.max(0,t.minRuleThickness-t.fontMetrics().sqrtRuleThickness),l=0,h=0,m=0;return"small"===i.type?(e<1?o=1:e<1.4&&(o=.7),h=(1+s)/o,(r=ur("sqrtMain",l=(1+s+cr)/o,m=1e3+1e3*s+80,s,t)).style.minWidth="0.853em",n=.833/o):"large"===i.type?(m=1080*gr[i.size],h=(gr[i.size]+s)/o,l=(gr[i.size]+s+cr)/o,(r=ur("sqrtSize"+i.size,l,m,s,t)).style.minWidth="1.02em",n=1/o):(l=e+s+cr,h=e+s,m=Math.floor(1e3*e+s)+80,(r=ur("sqrtTall",l,m,s,t)).style.minWidth="0.742em",n=1.056),r.height=h,r.style.height=l+"em",{span:r,advanceWidth:n,ruleWidth:(t.fontMetrics().sqrtRuleThickness+s)*o}},Mr=function(e,t,r,a,i){if("<"===e||"\\lt"===e||"\u27e8"===e?e="\\langle":">"!==e&&"\\gt"!==e&&"\u27e9"!==e||(e="\\rangle"),l.contains(pr,e)||l.contains(fr,e))return ar(e,t,!1,r,a,i);if(l.contains(dr,e))return mr(e,gr[t],!1,r,a,i);throw new n("Illegal delimiter: '"+e+"'")},zr=gr,Ar=kr,Tr=function(e,t,r,n,a,i){var o=n.fontMetrics().axisHeight*n.sizeMultiplier,s=5/n.fontMetrics().ptPerEm,l=Math.max(t-o,r+o),h=Math.max(l/500*901,2*l-s);return kr(e,h,!0,n,a,i)},Br={"\\bigl":{mclass:"mopen",size:1},"\\Bigl":{mclass:"mopen",size:2},"\\biggl":{mclass:"mopen",size:3},"\\Biggl":{mclass:"mopen",size:4},"\\bigr":{mclass:"mclose",size:1},"\\Bigr":{mclass:"mclose",size:2},"\\biggr":{mclass:"mclose",size:3},"\\Biggr":{mclass:"mclose",size:4},"\\bigm":{mclass:"mrel",size:1},"\\Bigm":{mclass:"mrel",size:2},"\\biggm":{mclass:"mrel",size:3},"\\Biggm":{mclass:"mrel",size:4},"\\big":{mclass:"mord",size:1},"\\Big":{mclass:"mord",size:2},"\\bigg":{mclass:"mord",size:3},"\\Bigg":{mclass:"mord",size:4}},qr=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230a","\u230b","\\lceil","\\rceil","\u2308","\u2309","<",">","\\langle","\u27e8","\\rangle","\u27e9","\\lt","\\gt","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27ee","\u27ef","\\lmoustache","\\rmoustache","\u23b0","\u23b1","/","\\backslash","|","\\vert","\\|","\\Vert","\\uparrow","\\Uparrow","\\downarrow","\\Downarrow","\\updownarrow","\\Updownarrow","."];function Nr(e,t){var r=Gt(e);if(r&&l.contains(qr,r.text))return r;throw new n(r?"Invalid delimiter '"+r.text+"' after '"+t.funcName+"'":"Invalid delimiter type '"+e.type+"'",e)}function Cr(e){if(!e.body)throw new Error("Bug: The leftright ParseNode wasn't fully parsed.")}nt({type:"delimsizing",names:["\\bigl","\\Bigl","\\biggl","\\Biggl","\\bigr","\\Bigr","\\biggr","\\Biggr","\\bigm","\\Bigm","\\biggm","\\Biggm","\\big","\\Big","\\bigg","\\Bigg"],props:{numArgs:1,argTypes:["primitive"]},handler:function(e,t){var r=Nr(t[0],e);return{type:"delimsizing",mode:e.parser.mode,size:Br[e.funcName].size,mclass:Br[e.funcName].mclass,delim:r.text}},htmlBuilder:function(e,t){return"."===e.delim?je.makeSpan([e.mclass]):Mr(e.delim,e.size,t,e.mode,[e.mclass])},mathmlBuilder:function(e){var t=[];"."!==e.delim&&t.push(zt(e.delim,e.mode));var r=new Mt.MathNode("mo",t);return"mopen"===e.mclass||"mclose"===e.mclass?r.setAttribute("fence","true"):r.setAttribute("fence","false"),r.setAttribute("stretchy","true"),r.setAttribute("minsize",zr[e.size]+"em"),r.setAttribute("maxsize",zr[e.size]+"em"),r}}),nt({type:"leftright-right",names:["\\right"],props:{numArgs:1,primitive:!0},handler:function(e,t){var r=e.parser.gullet.macros.get("\\current@color");if(r&&"string"!=typeof r)throw new n("\\current@color set to non-string in \\right");return{type:"leftright-right",mode:e.parser.mode,delim:Nr(t[0],e).text,color:r}}}),nt({type:"leftright",names:["\\left"],props:{numArgs:1,primitive:!0},handler:function(e,t){var r=Nr(t[0],e),n=e.parser;++n.leftrightDepth;var a=n.parseExpression(!1);--n.leftrightDepth,n.expect("\\right",!1);var i=Ft(n.parseFunction(),"leftright-right");return{type:"leftright",mode:n.mode,body:a,left:r.text,right:i.delim,rightColor:i.color}},htmlBuilder:function(e,t){Cr(e);for(var r,n,a=ut(e.body,t,!0,["mopen","mclose"]),i=0,o=0,s=!1,l=0;l-1?"mpadded":"menclose",[Nt(e.body,t)]);switch(e.label){case"\\cancel":n.setAttribute("notation","updiagonalstrike");break;case"\\bcancel":n.setAttribute("notation","downdiagonalstrike");break;case"\\phase":n.setAttribute("notation","phasorangle");break;case"\\sout":n.setAttribute("notation","horizontalstrike");break;case"\\fbox":n.setAttribute("notation","box");break;case"\\angl":n.setAttribute("notation","actuarial");break;case"\\fcolorbox":case"\\colorbox":if(r=t.fontMetrics().fboxsep*t.fontMetrics().ptPerEm,n.setAttribute("width","+"+2*r+"pt"),n.setAttribute("height","+"+2*r+"pt"),n.setAttribute("lspace",r+"pt"),n.setAttribute("voffset",r+"pt"),"\\fcolorbox"===e.label){var a=Math.max(t.fontMetrics().fboxrule,t.minRuleThickness);n.setAttribute("style","border: "+a+"em solid "+String(e.borderColor))}break;case"\\xcancel":n.setAttribute("notation","updiagonalstrike downdiagonalstrike")}return e.backgroundColor&&n.setAttribute("mathbackground",e.backgroundColor),n};nt({type:"enclose",names:["\\colorbox"],props:{numArgs:2,allowedInText:!0,argTypes:["color","text"]},handler:function(e,t,r){var n=e.parser,a=e.funcName,i=Ft(t[0],"color-token").color,o=t[1];return{type:"enclose",mode:n.mode,label:a,backgroundColor:i,body:o}},htmlBuilder:Ir,mathmlBuilder:Rr}),nt({type:"enclose",names:["\\fcolorbox"],props:{numArgs:3,allowedInText:!0,argTypes:["color","color","text"]},handler:function(e,t,r){var n=e.parser,a=e.funcName,i=Ft(t[0],"color-token").color,o=Ft(t[1],"color-token").color,s=t[2];return{type:"enclose",mode:n.mode,label:a,backgroundColor:o,borderColor:i,body:s}},htmlBuilder:Ir,mathmlBuilder:Rr}),nt({type:"enclose",names:["\\fbox"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!0},handler:function(e,t){return{type:"enclose",mode:e.parser.mode,label:"\\fbox",body:t[0]}}}),nt({type:"enclose",names:["\\cancel","\\bcancel","\\xcancel","\\sout","\\phase"],props:{numArgs:1},handler:function(e,t){var r=e.parser,n=e.funcName,a=t[0];return{type:"enclose",mode:r.mode,label:n,body:a}},htmlBuilder:Ir,mathmlBuilder:Rr}),nt({type:"enclose",names:["\\angl"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!1},handler:function(e,t){return{type:"enclose",mode:e.parser.mode,label:"\\angl",body:t[0]}}});var Or={};function Er(e){for(var t=e.type,r=e.names,n=e.props,a=e.handler,i=e.htmlBuilder,o=e.mathmlBuilder,s={type:t,numArgs:n.numArgs||0,allowedInText:!1,numOptionalArgs:0,handler:a},l=0;l1||!c)&&g.pop(),b.length0&&(x+=.25),m.push({pos:x,isDashed:e[t]})}for(w(o[0]),r=0;r0&&(M<(B+=y)&&(M=B),B=0),e.addJot&&(M+=f),z.height=S,z.depth=M,x+=S,z.pos=x,x+=M+B,h[r]=z,w(o[r+1])}var q,N,C=x/2+t.fontMetrics().axisHeight,I=e.cols||[],R=[],O=[];if(e.addEqnNum)for(r=0;r=s)){var G=void 0;(a>0||e.hskipBeforeAndAfter)&&0!==(G=l.deflt(D.pregap,p))&&((q=je.makeSpan(["arraycolsep"],[])).style.width=G+"em",R.push(q));var U=[];for(r=0;r0){for(var _=je.makeLineSpan("hline",t,c),j=je.makeLineSpan("hdashline",t,c),$=[{type:"elem",elem:h,shift:0}];m.length>0;){var Z=m.pop(),K=Z.pos-C;Z.isDashed?$.push({type:"elem",elem:j,shift:K}):$.push({type:"elem",elem:_,shift:K})}h=je.makeVList({positionType:"individualShift",children:$},t)}if(e.addEqnNum){var J=je.makeVList({positionType:"individualShift",children:O},t);return J=je.makeSpan(["tag"],[J],t),je.makeFragment([h,J])}return je.makeSpan(["mord"],[h],t)},Vr={c:"center ",l:"left ",r:"right "},Gr=function(e,t){for(var r=[],n=new Mt.MathNode("mtd",[],["mtr-glue"]),a=new Mt.MathNode("mtd",[],["mml-eqn-num"]),i=0;i0){var p=e.cols,d="",f=!1,g=0,v=p.length;"separator"===p[0].type&&(c+="top ",g=1),"separator"===p[p.length-1].type&&(c+="bottom ",v-=1);for(var b=g;b0?"left ":"",c+=S[S.length-1].length>0?"right ":"";for(var M=1;M-1?"alignat":"align",o=Dr(e.parser,{cols:a,addJot:!0,addEqnNum:"align"===e.envName||"alignat"===e.envName,emptySingleRow:!0,colSeparationType:i,maxNumCols:"split"===e.envName?2:void 0,leqno:e.parser.settings.leqno},"display"),s=0,l={type:"ordgroup",mode:e.mode,body:[]};if(t[0]&&"ordgroup"===t[0].type){for(var h="",m=0;m0&&c&&(d=1),a[u]={type:"align",align:p,pregap:d,postgap:0}}return o.colSeparationType=c?"align":"alignat",o};Er({type:"array",names:["array","darray"],props:{numArgs:1},handler:function(e,t){var r=(Gt(t[0])?[t[0]]:Ft(t[0],"ordgroup").body).map((function(e){var t=Vt(e).text;if(-1!=="lcr".indexOf(t))return{type:"align",align:t};if("|"===t)return{type:"separator",separator:"|"};if(":"===t)return{type:"separator",separator:":"};throw new n("Unknown column alignment: "+t,e)})),a={cols:r,hskipBeforeAndAfter:!0,maxNumCols:r.length};return Dr(e.parser,a,Pr(e.envName))},htmlBuilder:Fr,mathmlBuilder:Gr}),Er({type:"array",names:["matrix","pmatrix","bmatrix","Bmatrix","vmatrix","Vmatrix","matrix*","pmatrix*","bmatrix*","Bmatrix*","vmatrix*","Vmatrix*"],props:{numArgs:0},handler:function(e){var t={matrix:null,pmatrix:["(",")"],bmatrix:["[","]"],Bmatrix:["\\{","\\}"],vmatrix:["|","|"],Vmatrix:["\\Vert","\\Vert"]}[e.envName.replace("*","")],r="c",a={hskipBeforeAndAfter:!1,cols:[{type:"align",align:r}]};if("*"===e.envName.charAt(e.envName.length-1)){var i=e.parser;if(i.consumeSpaces(),"["===i.fetch().text){if(i.consume(),i.consumeSpaces(),r=i.fetch().text,-1==="lcr".indexOf(r))throw new n("Expected l or c or r",i.nextToken);i.consume(),i.consumeSpaces(),i.expect("]"),i.consume(),a.cols=[{type:"align",align:r}]}}var o=Dr(e.parser,a,Pr(e.envName));return o.cols=new Array(o.body[0].length).fill({type:"align",align:r}),t?{type:"leftright",mode:e.mode,body:[o],left:t[0],right:t[1],rightColor:void 0}:o},htmlBuilder:Fr,mathmlBuilder:Gr}),Er({type:"array",names:["smallmatrix"],props:{numArgs:0},handler:function(e){var t=Dr(e.parser,{arraystretch:.5},"script");return t.colSeparationType="small",t},htmlBuilder:Fr,mathmlBuilder:Gr}),Er({type:"array",names:["subarray"],props:{numArgs:1},handler:function(e,t){var r=(Gt(t[0])?[t[0]]:Ft(t[0],"ordgroup").body).map((function(e){var t=Vt(e).text;if(-1!=="lc".indexOf(t))return{type:"align",align:t};throw new n("Unknown column alignment: "+t,e)}));if(r.length>1)throw new n("{subarray} can contain only one column");var a={cols:r,hskipBeforeAndAfter:!1,arraystretch:.5};if((a=Dr(e.parser,a,"script")).body.length>0&&a.body[0].length>1)throw new n("{subarray} can contain only one column");return a},htmlBuilder:Fr,mathmlBuilder:Gr}),Er({type:"array",names:["cases","dcases","rcases","drcases"],props:{numArgs:0},handler:function(e){var t=Dr(e.parser,{arraystretch:1.2,cols:[{type:"align",align:"l",pregap:0,postgap:1},{type:"align",align:"l",pregap:0,postgap:0}]},Pr(e.envName));return{type:"leftright",mode:e.mode,body:[t],left:e.envName.indexOf("r")>-1?".":"\\{",right:e.envName.indexOf("r")>-1?"\\}":".",rightColor:void 0}},htmlBuilder:Fr,mathmlBuilder:Gr}),Er({type:"array",names:["align","align*","aligned","split"],props:{numArgs:0},handler:Ur,htmlBuilder:Fr,mathmlBuilder:Gr}),Er({type:"array",names:["gathered","gather","gather*"],props:{numArgs:0},handler:function(e){l.contains(["gather","gather*"],e.envName)&&Lr(e);var t={cols:[{type:"align",align:"c"}],addJot:!0,colSeparationType:"gather",addEqnNum:"gather"===e.envName,emptySingleRow:!0,leqno:e.parser.settings.leqno};return Dr(e.parser,t,"display")},htmlBuilder:Fr,mathmlBuilder:Gr}),Er({type:"array",names:["alignat","alignat*","alignedat"],props:{numArgs:1},handler:Ur,htmlBuilder:Fr,mathmlBuilder:Gr}),Er({type:"array",names:["equation","equation*"],props:{numArgs:0},handler:function(e){Lr(e);var t={addEqnNum:"equation"===e.envName,emptySingleRow:!0,singleRow:!0,maxNumCols:1,leqno:e.parser.settings.leqno};return Dr(e.parser,t,"display")},htmlBuilder:Fr,mathmlBuilder:Gr}),Er({type:"array",names:["CD"],props:{numArgs:0},handler:function(e){return Lr(e),function(e){var t=[];for(e.gullet.beginGroup(),e.gullet.macros.set("\\cr","\\\\\\relax"),e.gullet.beginGroup();;){t.push(e.parseExpression(!1,"\\\\")),e.gullet.endGroup(),e.gullet.beginGroup();var r=e.fetch().text;if("&"!==r&&"\\\\"!==r){if("\\end"===r){0===t[t.length-1].length&&t.pop();break}throw new n("Expected \\\\ or \\cr or \\end",e.nextToken)}e.consume()}for(var a,i,o=[],s=[o],l=0;l-1);else{if(!("<>AV".indexOf(u)>-1))throw new n('Expected one of "<>AV=|." after @',h[c]);for(var d=0;d<2;d++){for(var f=!0,g=c+1;g=b.SCRIPT.id?r.text():b.DISPLAY:"text"===e&&r.size===b.DISPLAY.size?r=b.TEXT:"script"===e?r=b.SCRIPT:"scriptscript"===e&&(r=b.SCRIPTSCRIPT),r},Qr=function(e,t){var r,n=Jr(e.size,t.style),a=n.fracNum(),i=n.fracDen();r=t.havingStyle(a);var o=bt(e.numer,r,t);if(e.continued){var s=8.5/t.fontMetrics().ptPerEm,l=3.5/t.fontMetrics().ptPerEm;o.height=o.height0?3*c:7*c,d=t.fontMetrics().denom1):(m>0?(u=t.fontMetrics().num2,p=c):(u=t.fontMetrics().num3,p=3*c),d=t.fontMetrics().denom2),h){var w=t.fontMetrics().axisHeight;u-o.depth-(w+.5*m)0&&(t="."===(t=e)?null:t),t};nt({type:"genfrac",names:["\\genfrac"],props:{numArgs:6,allowedInArgument:!0,argTypes:["math","math","size","text","math","math"]},handler:function(e,t){var r,n=e.parser,a=t[4],i=t[5],o=it(t[0]),s="atom"===o.type&&"open"===o.family?rn(o.text):null,l=it(t[1]),h="atom"===l.type&&"close"===l.family?rn(l.text):null,m=Ft(t[2],"size"),c=null;r=!!m.isBlank||(c=m.value).number>0;var u="auto",p=t[3];if("ordgroup"===p.type){if(p.body.length>0){var d=Ft(p.body[0],"textord");u=tn[Number(d.text)]}}else p=Ft(p,"textord"),u=tn[Number(p.text)];return{type:"genfrac",mode:n.mode,numer:a,denom:i,continued:!1,hasBarLine:r,barSize:c,leftDelim:s,rightDelim:h,size:u}},htmlBuilder:Qr,mathmlBuilder:en}),nt({type:"infix",names:["\\above"],props:{numArgs:1,argTypes:["size"],infix:!0},handler:function(e,t){var r=e.parser,n=(e.funcName,e.token);return{type:"infix",mode:r.mode,replaceWith:"\\\\abovefrac",size:Ft(t[0],"size").value,token:n}}}),nt({type:"genfrac",names:["\\\\abovefrac"],props:{numArgs:3,argTypes:["math","size","math"]},handler:function(e,t){var r=e.parser,n=(e.funcName,t[0]),a=function(e){if(!e)throw new Error("Expected non-null, but got "+String(e));return e}(Ft(t[1],"infix").size),i=t[2],o=a.number>0;return{type:"genfrac",mode:r.mode,numer:n,denom:i,continued:!1,hasBarLine:o,barSize:a,leftDelim:null,rightDelim:null,size:"auto"}},htmlBuilder:Qr,mathmlBuilder:en});var nn=function(e,t){var r,n,a=t.style;"supsub"===e.type?(r=e.sup?bt(e.sup,t.havingStyle(a.sup()),t):bt(e.sub,t.havingStyle(a.sub()),t),n=Ft(e.base,"horizBrace")):n=Ft(e,"horizBrace");var i,o=bt(n.base,t.havingBaseStyle(b.DISPLAY)),s=Pt(n,t);if(n.isOver?(i=je.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:o},{type:"kern",size:.1},{type:"elem",elem:s}]},t)).children[0].children[0].children[1].classes.push("svg-align"):(i=je.makeVList({positionType:"bottom",positionData:o.depth+.1+s.height,children:[{type:"elem",elem:s},{type:"kern",size:.1},{type:"elem",elem:o}]},t)).children[0].children[0].children[0].classes.push("svg-align"),r){var l=je.makeSpan(["mord",n.isOver?"mover":"munder"],[i],t);i=n.isOver?je.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:l},{type:"kern",size:.2},{type:"elem",elem:r}]},t):je.makeVList({positionType:"bottom",positionData:l.depth+.2+r.height+r.depth,children:[{type:"elem",elem:r},{type:"kern",size:.2},{type:"elem",elem:l}]},t)}return je.makeSpan(["mord",n.isOver?"mover":"munder"],[i],t)};nt({type:"horizBrace",names:["\\overbrace","\\underbrace"],props:{numArgs:1},handler:function(e,t){var r=e.parser,n=e.funcName;return{type:"horizBrace",mode:r.mode,label:n,isOver:/^\\over/.test(n),base:t[0]}},htmlBuilder:nn,mathmlBuilder:function(e,t){var r=Dt(e.label);return new Mt.MathNode(e.isOver?"mover":"munder",[Nt(e.base,t),r])}}),nt({type:"href",names:["\\href"],props:{numArgs:2,argTypes:["url","original"],allowedInText:!0},handler:function(e,t){var r=e.parser,n=t[1],a=Ft(t[0],"url").url;return r.settings.isTrusted({command:"\\href",url:a})?{type:"href",mode:r.mode,href:a,body:ot(n)}:r.formatUnsupportedCmd("\\href")},htmlBuilder:function(e,t){var r=ut(e.body,t,!1);return je.makeAnchor(e.href,[],r,t)},mathmlBuilder:function(e,t){var r=qt(e.body,t);return r instanceof kt||(r=new kt("mrow",[r])),r.setAttribute("href",e.href),r}}),nt({type:"href",names:["\\url"],props:{numArgs:1,argTypes:["url"],allowedInText:!0},handler:function(e,t){var r=e.parser,n=Ft(t[0],"url").url;if(!r.settings.isTrusted({command:"\\url",url:n}))return r.formatUnsupportedCmd("\\url");for(var a=[],i=0;i0&&(n=Le(e.totalheight,t)-r,n=Number(n.toFixed(2)));var a=0;e.width.number>0&&(a=Le(e.width,t));var i={height:r+n+"em"};a>0&&(i.width=a+"em"),n>0&&(i.verticalAlign=-n+"em");var o=new C(e.src,e.alt,i);return o.height=r,o.depth=n,o},mathmlBuilder:function(e,t){var r=new Mt.MathNode("mglyph",[]);r.setAttribute("alt",e.alt);var n=Le(e.height,t),a=0;if(e.totalheight.number>0&&(a=(a=Le(e.totalheight,t)-n).toFixed(2),r.setAttribute("valign","-"+a+"em")),r.setAttribute("height",n+a+"em"),e.width.number>0){var i=Le(e.width,t);r.setAttribute("width",i+"em")}return r.setAttribute("src",e.src),r}}),nt({type:"kern",names:["\\kern","\\mkern","\\hskip","\\mskip"],props:{numArgs:1,argTypes:["size"],primitive:!0,allowedInText:!0},handler:function(e,t){var r=e.parser,n=e.funcName,a=Ft(t[0],"size");if(r.settings.strict){var i="m"===n[1],o="mu"===a.value.unit;i?(o||r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" supports only mu units, not "+a.value.unit+" units"),"math"!==r.mode&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" works only in math mode")):o&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+n+" doesn't support mu units")}return{type:"kern",mode:r.mode,dimension:a.value}},htmlBuilder:function(e,t){return je.makeGlue(e.dimension,t)},mathmlBuilder:function(e,t){var r=Le(e.dimension,t);return new Mt.SpaceNode(r)}}),nt({type:"lap",names:["\\mathllap","\\mathrlap","\\mathclap"],props:{numArgs:1,allowedInText:!0},handler:function(e,t){var r=e.parser,n=e.funcName,a=t[0];return{type:"lap",mode:r.mode,alignment:n.slice(5),body:a}},htmlBuilder:function(e,t){var r;"clap"===e.alignment?(r=je.makeSpan([],[bt(e.body,t)]),r=je.makeSpan(["inner"],[r],t)):r=je.makeSpan(["inner"],[bt(e.body,t)]);var n=je.makeSpan(["fix"],[]),a=je.makeSpan([e.alignment],[r,n],t),i=je.makeSpan(["strut"]);return i.style.height=a.height+a.depth+"em",i.style.verticalAlign=-a.depth+"em",a.children.unshift(i),a=je.makeSpan(["thinbox"],[a],t),je.makeSpan(["mord","vbox"],[a],t)},mathmlBuilder:function(e,t){var r=new Mt.MathNode("mpadded",[Nt(e.body,t)]);if("rlap"!==e.alignment){var n="llap"===e.alignment?"-1":"-0.5";r.setAttribute("lspace",n+"width")}return r.setAttribute("width","0px"),r}}),nt({type:"styling",names:["\\(","$"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler:function(e,t){var r=e.funcName,n=e.parser,a=n.mode;n.switchMode("math");var i="\\("===r?"\\)":"$",o=n.parseExpression(!1,i);return n.expect(i),n.switchMode(a),{type:"styling",mode:n.mode,style:"text",body:o}}}),nt({type:"text",names:["\\)","\\]"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler:function(e,t){throw new n("Mismatched "+e.funcName)}});var on=function(e,t){switch(t.style.size){case b.DISPLAY.size:return e.display;case b.TEXT.size:return e.text;case b.SCRIPT.size:return e.script;case b.SCRIPTSCRIPT.size:return e.scriptscript;default:return e.text}};nt({type:"mathchoice",names:["\\mathchoice"],props:{numArgs:4,primitive:!0},handler:function(e,t){return{type:"mathchoice",mode:e.parser.mode,display:ot(t[0]),text:ot(t[1]),script:ot(t[2]),scriptscript:ot(t[3])}},htmlBuilder:function(e,t){var r=on(e,t),n=ut(r,t,!1);return je.makeFragment(n)},mathmlBuilder:function(e,t){var r=on(e,t);return qt(r,t)}});var sn=function(e,t,r,n,a,i,o){var s,l,h;if(e=je.makeSpan([],[e]),t){var m=bt(t,n.havingStyle(a.sup()),n);l={elem:m,kern:Math.max(n.fontMetrics().bigOpSpacing1,n.fontMetrics().bigOpSpacing3-m.depth)}}if(r){var c=bt(r,n.havingStyle(a.sub()),n);s={elem:c,kern:Math.max(n.fontMetrics().bigOpSpacing2,n.fontMetrics().bigOpSpacing4-c.height)}}if(l&&s){var u=n.fontMetrics().bigOpSpacing5+s.elem.height+s.elem.depth+s.kern+e.depth+o;h=je.makeVList({positionType:"bottom",positionData:u,children:[{type:"kern",size:n.fontMetrics().bigOpSpacing5},{type:"elem",elem:s.elem,marginLeft:-i+"em"},{type:"kern",size:s.kern},{type:"elem",elem:e},{type:"kern",size:l.kern},{type:"elem",elem:l.elem,marginLeft:i+"em"},{type:"kern",size:n.fontMetrics().bigOpSpacing5}]},n)}else if(s){var p=e.height-o;h=je.makeVList({positionType:"top",positionData:p,children:[{type:"kern",size:n.fontMetrics().bigOpSpacing5},{type:"elem",elem:s.elem,marginLeft:-i+"em"},{type:"kern",size:s.kern},{type:"elem",elem:e}]},n)}else{if(!l)return e;var d=e.depth+o;h=je.makeVList({positionType:"bottom",positionData:d,children:[{type:"elem",elem:e},{type:"kern",size:l.kern},{type:"elem",elem:l.elem,marginLeft:i+"em"},{type:"kern",size:n.fontMetrics().bigOpSpacing5}]},n)}return je.makeSpan(["mop","op-limits"],[h],n)},ln=["\\smallint"],hn=function(e,t){var r,n,a,i=!1;"supsub"===e.type?(r=e.sup,n=e.sub,a=Ft(e.base,"op"),i=!0):a=Ft(e,"op");var o,s=t.style,h=!1;if(s.size===b.DISPLAY.size&&a.symbol&&!l.contains(ln,a.name)&&(h=!0),a.symbol){var m=h?"Size2-Regular":"Size1-Regular",c="";if("\\oiint"!==a.name&&"\\oiiint"!==a.name||(c=a.name.substr(1),a.name="oiint"===c?"\\iint":"\\iiint"),o=je.makeSymbol(a.name,m,"math",t,["mop","op-symbol",h?"large-op":"small-op"]),c.length>0){var u=o.italic,p=je.staticSvg(c+"Size"+(h?"2":"1"),t);o=je.makeVList({positionType:"individualShift",children:[{type:"elem",elem:o,shift:0},{type:"elem",elem:p,shift:h?.08:0}]},t),a.name="\\"+c,o.classes.unshift("mop"),o.italic=u}}else if(a.body){var d=ut(a.body,t,!0);1===d.length&&d[0]instanceof R?(o=d[0]).classes[0]="mop":o=je.makeSpan(["mop"],d,t)}else{for(var f=[],g=1;g=t)throw new n("Invalid base-"+t+" digit "+r.text);for(var i;null!=(i=gn[e.future().text])&&i":"\\dotsb","-":"\\dotsb","*":"\\dotsb",":":"\\dotsb","\\DOTSB":"\\dotsb","\\coprod":"\\dotsb","\\bigvee":"\\dotsb","\\bigwedge":"\\dotsb","\\biguplus":"\\dotsb","\\bigcap":"\\dotsb","\\bigcup":"\\dotsb","\\prod":"\\dotsb","\\sum":"\\dotsb","\\bigotimes":"\\dotsb","\\bigoplus":"\\dotsb","\\bigodot":"\\dotsb","\\bigsqcup":"\\dotsb","\\And":"\\dotsb","\\longrightarrow":"\\dotsb","\\Longrightarrow":"\\dotsb","\\longleftarrow":"\\dotsb","\\Longleftarrow":"\\dotsb","\\longleftrightarrow":"\\dotsb","\\Longleftrightarrow":"\\dotsb","\\mapsto":"\\dotsb","\\longmapsto":"\\dotsb","\\hookrightarrow":"\\dotsb","\\doteq":"\\dotsb","\\mathbin":"\\dotsb","\\mathrel":"\\dotsb","\\relbar":"\\dotsb","\\Relbar":"\\dotsb","\\xrightarrow":"\\dotsb","\\xleftarrow":"\\dotsb","\\DOTSI":"\\dotsi","\\int":"\\dotsi","\\oint":"\\dotsi","\\iint":"\\dotsi","\\iiint":"\\dotsi","\\iiiint":"\\dotsi","\\idotsint":"\\dotsi","\\DOTSX":"\\dotsx"};fn("\\dots",(function(e){var t="\\dotso",r=e.expandAfterFuture().text;return r in bn?t=bn[r]:("\\not"===r.substr(0,4)||r in X.math&&l.contains(["bin","rel"],X.math[r].group))&&(t="\\dotsb"),t}));var yn={")":!0,"]":!0,"\\rbrack":!0,"\\}":!0,"\\rbrace":!0,"\\rangle":!0,"\\rceil":!0,"\\rfloor":!0,"\\rgroup":!0,"\\rmoustache":!0,"\\right":!0,"\\bigr":!0,"\\biggr":!0,"\\Bigr":!0,"\\Biggr":!0,$:!0,";":!0,".":!0,",":!0};fn("\\dotso",(function(e){return e.future().text in yn?"\\ldots\\,":"\\ldots"})),fn("\\dotsc",(function(e){var t=e.future().text;return t in yn&&","!==t?"\\ldots\\,":"\\ldots"})),fn("\\cdots",(function(e){return e.future().text in yn?"\\@cdots\\,":"\\@cdots"})),fn("\\dotsb","\\cdots"),fn("\\dotsm","\\cdots"),fn("\\dotsi","\\!\\cdots"),fn("\\dotsx","\\ldots\\,"),fn("\\DOTSI","\\relax"),fn("\\DOTSB","\\relax"),fn("\\DOTSX","\\relax"),fn("\\tmspace","\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax"),fn("\\,","\\tmspace+{3mu}{.1667em}"),fn("\\thinspace","\\,"),fn("\\>","\\mskip{4mu}"),fn("\\:","\\tmspace+{4mu}{.2222em}"),fn("\\medspace","\\:"),fn("\\;","\\tmspace+{5mu}{.2777em}"),fn("\\thickspace","\\;"),fn("\\!","\\tmspace-{3mu}{.1667em}"),fn("\\negthinspace","\\!"),fn("\\negmedspace","\\tmspace-{4mu}{.2222em}"),fn("\\negthickspace","\\tmspace-{5mu}{.277em}"),fn("\\enspace","\\kern.5em "),fn("\\enskip","\\hskip.5em\\relax"),fn("\\quad","\\hskip1em\\relax"),fn("\\qquad","\\hskip2em\\relax"),fn("\\tag","\\@ifstar\\tag@literal\\tag@paren"),fn("\\tag@paren","\\tag@literal{({#1})}"),fn("\\tag@literal",(function(e){if(e.macros.get("\\df@tag"))throw new n("Multiple \\tag");return"\\gdef\\df@tag{\\text{#1}}"})),fn("\\bmod","\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}\\mathbin{\\rm mod}\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}"),fn("\\pod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)"),fn("\\pmod","\\pod{{\\rm mod}\\mkern6mu#1}"),fn("\\mod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}{\\rm mod}\\,\\,#1"),fn("\\pmb","\\html@mathml{\\@binrel{#1}{\\mathrlap{#1}\\kern0.5px#1}}{\\mathbf{#1}}"),fn("\\newline","\\\\\\relax"),fn("\\TeX","\\textrm{\\html@mathml{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}{TeX}}");var xn=D["Main-Regular"]["T".charCodeAt(0)][1]-.7*D["Main-Regular"]["A".charCodeAt(0)][1]+"em";fn("\\LaTeX","\\textrm{\\html@mathml{L\\kern-.36em\\raisebox{"+xn+"}{\\scriptstyle A}\\kern-.15em\\TeX}{LaTeX}}"),fn("\\KaTeX","\\textrm{\\html@mathml{K\\kern-.17em\\raisebox{"+xn+"}{\\scriptstyle A}\\kern-.15em\\TeX}{KaTeX}}"),fn("\\hspace","\\@ifstar\\@hspacer\\@hspace"),fn("\\@hspace","\\hskip #1\\relax"),fn("\\@hspacer","\\rule{0pt}{0pt}\\hskip #1\\relax"),fn("\\ordinarycolon",":"),fn("\\vcentcolon","\\mathrel{\\mathop\\ordinarycolon}"),fn("\\dblcolon",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}{\\mathop{\\char"2237}}'),fn("\\coloneqq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2254}}'),fn("\\Coloneqq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2237\\char"3d}}'),fn("\\coloneq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"3a\\char"2212}}'),fn("\\Coloneq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"2237\\char"2212}}'),fn("\\eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2255}}'),fn("\\Eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"3d\\char"2237}}'),fn("\\eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2239}}'),fn("\\Eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"2212\\char"2237}}'),fn("\\colonapprox",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"3a\\char"2248}}'),fn("\\Colonapprox",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"2237\\char"2248}}'),fn("\\colonsim",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"3a\\char"223c}}'),fn("\\Colonsim",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"2237\\char"223c}}'),fn("\u2237","\\dblcolon"),fn("\u2239","\\eqcolon"),fn("\u2254","\\coloneqq"),fn("\u2255","\\eqqcolon"),fn("\u2a74","\\Coloneqq"),fn("\\ratio","\\vcentcolon"),fn("\\coloncolon","\\dblcolon"),fn("\\colonequals","\\coloneqq"),fn("\\coloncolonequals","\\Coloneqq"),fn("\\equalscolon","\\eqqcolon"),fn("\\equalscoloncolon","\\Eqqcolon"),fn("\\colonminus","\\coloneq"),fn("\\coloncolonminus","\\Coloneq"),fn("\\minuscolon","\\eqcolon"),fn("\\minuscoloncolon","\\Eqcolon"),fn("\\coloncolonapprox","\\Colonapprox"),fn("\\coloncolonsim","\\Colonsim"),fn("\\simcolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),fn("\\simcoloncolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}"),fn("\\approxcolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),fn("\\approxcoloncolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}"),fn("\\notni","\\html@mathml{\\not\\ni}{\\mathrel{\\char`\u220c}}"),fn("\\limsup","\\DOTSB\\operatorname*{lim\\,sup}"),fn("\\liminf","\\DOTSB\\operatorname*{lim\\,inf}"),fn("\\injlim","\\DOTSB\\operatorname*{inj\\,lim}"),fn("\\projlim","\\DOTSB\\operatorname*{proj\\,lim}"),fn("\\varlimsup","\\DOTSB\\operatorname*{\\overline{lim}}"),fn("\\varliminf","\\DOTSB\\operatorname*{\\underline{lim}}"),fn("\\varinjlim","\\DOTSB\\operatorname*{\\underrightarrow{lim}}"),fn("\\varprojlim","\\DOTSB\\operatorname*{\\underleftarrow{lim}}"),fn("\\gvertneqq","\\html@mathml{\\@gvertneqq}{\u2269}"),fn("\\lvertneqq","\\html@mathml{\\@lvertneqq}{\u2268}"),fn("\\ngeqq","\\html@mathml{\\@ngeqq}{\u2271}"),fn("\\ngeqslant","\\html@mathml{\\@ngeqslant}{\u2271}"),fn("\\nleqq","\\html@mathml{\\@nleqq}{\u2270}"),fn("\\nleqslant","\\html@mathml{\\@nleqslant}{\u2270}"),fn("\\nshortmid","\\html@mathml{\\@nshortmid}{\u2224}"),fn("\\nshortparallel","\\html@mathml{\\@nshortparallel}{\u2226}"),fn("\\nsubseteqq","\\html@mathml{\\@nsubseteqq}{\u2288}"),fn("\\nsupseteqq","\\html@mathml{\\@nsupseteqq}{\u2289}"),fn("\\varsubsetneq","\\html@mathml{\\@varsubsetneq}{\u228a}"),fn("\\varsubsetneqq","\\html@mathml{\\@varsubsetneqq}{\u2acb}"),fn("\\varsupsetneq","\\html@mathml{\\@varsupsetneq}{\u228b}"),fn("\\varsupsetneqq","\\html@mathml{\\@varsupsetneqq}{\u2acc}"),fn("\\imath","\\html@mathml{\\@imath}{\u0131}"),fn("\\jmath","\\html@mathml{\\@jmath}{\u0237}"),fn("\\llbracket","\\html@mathml{\\mathopen{[\\mkern-3.2mu[}}{\\mathopen{\\char`\u27e6}}"),fn("\\rrbracket","\\html@mathml{\\mathclose{]\\mkern-3.2mu]}}{\\mathclose{\\char`\u27e7}}"),fn("\u27e6","\\llbracket"),fn("\u27e7","\\rrbracket"),fn("\\lBrace","\\html@mathml{\\mathopen{\\{\\mkern-3.2mu[}}{\\mathopen{\\char`\u2983}}"),fn("\\rBrace","\\html@mathml{\\mathclose{]\\mkern-3.2mu\\}}}{\\mathclose{\\char`\u2984}}"),fn("\u2983","\\lBrace"),fn("\u2984","\\rBrace"),fn("\\minuso","\\mathbin{\\html@mathml{{\\mathrlap{\\mathchoice{\\kern{0.145em}}{\\kern{0.145em}}{\\kern{0.1015em}}{\\kern{0.0725em}}\\circ}{-}}}{\\char`\u29b5}}"),fn("\u29b5","\\minuso"),fn("\\darr","\\downarrow"),fn("\\dArr","\\Downarrow"),fn("\\Darr","\\Downarrow"),fn("\\lang","\\langle"),fn("\\rang","\\rangle"),fn("\\uarr","\\uparrow"),fn("\\uArr","\\Uparrow"),fn("\\Uarr","\\Uparrow"),fn("\\N","\\mathbb{N}"),fn("\\R","\\mathbb{R}"),fn("\\Z","\\mathbb{Z}"),fn("\\alef","\\aleph"),fn("\\alefsym","\\aleph"),fn("\\Alpha","\\mathrm{A}"),fn("\\Beta","\\mathrm{B}"),fn("\\bull","\\bullet"),fn("\\Chi","\\mathrm{X}"),fn("\\clubs","\\clubsuit"),fn("\\cnums","\\mathbb{C}"),fn("\\Complex","\\mathbb{C}"),fn("\\Dagger","\\ddagger"),fn("\\diamonds","\\diamondsuit"),fn("\\empty","\\emptyset"),fn("\\Epsilon","\\mathrm{E}"),fn("\\Eta","\\mathrm{H}"),fn("\\exist","\\exists"),fn("\\harr","\\leftrightarrow"),fn("\\hArr","\\Leftrightarrow"),fn("\\Harr","\\Leftrightarrow"),fn("\\hearts","\\heartsuit"),fn("\\image","\\Im"),fn("\\infin","\\infty"),fn("\\Iota","\\mathrm{I}"),fn("\\isin","\\in"),fn("\\Kappa","\\mathrm{K}"),fn("\\larr","\\leftarrow"),fn("\\lArr","\\Leftarrow"),fn("\\Larr","\\Leftarrow"),fn("\\lrarr","\\leftrightarrow"),fn("\\lrArr","\\Leftrightarrow"),fn("\\Lrarr","\\Leftrightarrow"),fn("\\Mu","\\mathrm{M}"),fn("\\natnums","\\mathbb{N}"),fn("\\Nu","\\mathrm{N}"),fn("\\Omicron","\\mathrm{O}"),fn("\\plusmn","\\pm"),fn("\\rarr","\\rightarrow"),fn("\\rArr","\\Rightarrow"),fn("\\Rarr","\\Rightarrow"),fn("\\real","\\Re"),fn("\\reals","\\mathbb{R}"),fn("\\Reals","\\mathbb{R}"),fn("\\Rho","\\mathrm{P}"),fn("\\sdot","\\cdot"),fn("\\sect","\\S"),fn("\\spades","\\spadesuit"),fn("\\sub","\\subset"),fn("\\sube","\\subseteq"),fn("\\supe","\\supseteq"),fn("\\Tau","\\mathrm{T}"),fn("\\thetasym","\\vartheta"),fn("\\weierp","\\wp"),fn("\\Zeta","\\mathrm{Z}"),fn("\\argmin","\\DOTSB\\operatorname*{arg\\,min}"),fn("\\argmax","\\DOTSB\\operatorname*{arg\\,max}"),fn("\\plim","\\DOTSB\\mathop{\\operatorname{plim}}\\limits"),fn("\\bra","\\mathinner{\\langle{#1}|}"),fn("\\ket","\\mathinner{|{#1}\\rangle}"),fn("\\braket","\\mathinner{\\langle{#1}\\rangle}"),fn("\\Bra","\\left\\langle#1\\right|"),fn("\\Ket","\\left|#1\\right\\rangle"),fn("\\angln","{\\angl n}"),fn("\\blue","\\textcolor{##6495ed}{#1}"),fn("\\orange","\\textcolor{##ffa500}{#1}"),fn("\\pink","\\textcolor{##ff00af}{#1}"),fn("\\red","\\textcolor{##df0030}{#1}"),fn("\\green","\\textcolor{##28ae7b}{#1}"),fn("\\gray","\\textcolor{gray}{#1}"),fn("\\purple","\\textcolor{##9d38bd}{#1}"),fn("\\blueA","\\textcolor{##ccfaff}{#1}"),fn("\\blueB","\\textcolor{##80f6ff}{#1}"),fn("\\blueC","\\textcolor{##63d9ea}{#1}"),fn("\\blueD","\\textcolor{##11accd}{#1}"),fn("\\blueE","\\textcolor{##0c7f99}{#1}"),fn("\\tealA","\\textcolor{##94fff5}{#1}"),fn("\\tealB","\\textcolor{##26edd5}{#1}"),fn("\\tealC","\\textcolor{##01d1c1}{#1}"),fn("\\tealD","\\textcolor{##01a995}{#1}"),fn("\\tealE","\\textcolor{##208170}{#1}"),fn("\\greenA","\\textcolor{##b6ffb0}{#1}"),fn("\\greenB","\\textcolor{##8af281}{#1}"),fn("\\greenC","\\textcolor{##74cf70}{#1}"),fn("\\greenD","\\textcolor{##1fab54}{#1}"),fn("\\greenE","\\textcolor{##0d923f}{#1}"),fn("\\goldA","\\textcolor{##ffd0a9}{#1}"),fn("\\goldB","\\textcolor{##ffbb71}{#1}"),fn("\\goldC","\\textcolor{##ff9c39}{#1}"),fn("\\goldD","\\textcolor{##e07d10}{#1}"),fn("\\goldE","\\textcolor{##a75a05}{#1}"),fn("\\redA","\\textcolor{##fca9a9}{#1}"),fn("\\redB","\\textcolor{##ff8482}{#1}"),fn("\\redC","\\textcolor{##f9685d}{#1}"),fn("\\redD","\\textcolor{##e84d39}{#1}"),fn("\\redE","\\textcolor{##bc2612}{#1}"),fn("\\maroonA","\\textcolor{##ffbde0}{#1}"),fn("\\maroonB","\\textcolor{##ff92c6}{#1}"),fn("\\maroonC","\\textcolor{##ed5fa6}{#1}"),fn("\\maroonD","\\textcolor{##ca337c}{#1}"),fn("\\maroonE","\\textcolor{##9e034e}{#1}"),fn("\\purpleA","\\textcolor{##ddd7ff}{#1}"),fn("\\purpleB","\\textcolor{##c6b9fc}{#1}"),fn("\\purpleC","\\textcolor{##aa87ff}{#1}"),fn("\\purpleD","\\textcolor{##7854ab}{#1}"),fn("\\purpleE","\\textcolor{##543b78}{#1}"),fn("\\mintA","\\textcolor{##f5f9e8}{#1}"),fn("\\mintB","\\textcolor{##edf2df}{#1}"),fn("\\mintC","\\textcolor{##e0e5cc}{#1}"),fn("\\grayA","\\textcolor{##f6f7f7}{#1}"),fn("\\grayB","\\textcolor{##f0f1f2}{#1}"),fn("\\grayC","\\textcolor{##e3e5e6}{#1}"),fn("\\grayD","\\textcolor{##d6d8da}{#1}"),fn("\\grayE","\\textcolor{##babec2}{#1}"),fn("\\grayF","\\textcolor{##888d93}{#1}"),fn("\\grayG","\\textcolor{##626569}{#1}"),fn("\\grayH","\\textcolor{##3b3e40}{#1}"),fn("\\grayI","\\textcolor{##21242c}{#1}"),fn("\\kaBlue","\\textcolor{##314453}{#1}"),fn("\\kaGreen","\\textcolor{##71B307}{#1}");var wn=function(e,t){var r,n,a,i,o=!1;if("supsub"===e.type?(r=e.sup,n=e.sub,a=Ft(e.base,"operatorname"),o=!0):a=Ft(e,"operatorname"),a.body.length>0){for(var s=a.body.map((function(e){var t=e.text;return"string"==typeof t?{type:"textord",mode:e.mode,text:t}:e})),l=ut(s,t.withFont("mathrm"),!0),h=0;h=0?s.setAttribute("height","+"+a+"em"):(s.setAttribute("height",a+"em"),s.setAttribute("depth","+"+-a+"em")),s.setAttribute("voffset",a+"em"),s}});var Sn=["\\tiny","\\sixptsize","\\scriptsize","\\footnotesize","\\small","\\normalsize","\\large","\\Large","\\LARGE","\\huge","\\Huge"];nt({type:"sizing",names:Sn,props:{numArgs:0,allowedInText:!0},handler:function(e,t){var r=e.breakOnTokenText,n=e.funcName,a=e.parser,i=a.parseExpression(!1,r);return{type:"sizing",mode:a.mode,size:Sn.indexOf(n)+1,body:i}},htmlBuilder:function(e,t){var r=t.havingSize(e.size);return kn(e.body,r,t)},mathmlBuilder:function(e,t){var r=t.havingSize(e.size),n=Bt(e.body,r),a=new Mt.MathNode("mstyle",n);return a.setAttribute("mathsize",r.sizeMultiplier+"em"),a}}),nt({type:"smash",names:["\\smash"],props:{numArgs:1,numOptionalArgs:1,allowedInText:!0},handler:function(e,t,r){var n=e.parser,a=!1,i=!1,o=r[0]&&Ft(r[0],"ordgroup");if(o)for(var s="",l=0;lr.height+r.depth+i&&(i=(i+c-r.height-r.depth)/2);var u=l.height-r.height-i-h;r.style.paddingLeft=m+"em";var p=je.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r,wrapperClasses:["svg-align"]},{type:"kern",size:-(r.height+u)},{type:"elem",elem:l},{type:"kern",size:h}]},t);if(e.index){var d=t.havingStyle(b.SCRIPTSCRIPT),f=bt(e.index,d,t),g=.6*(p.height-p.depth),v=je.makeVList({positionType:"shift",positionData:-g,children:[{type:"elem",elem:f}]},t),y=je.makeSpan(["root"],[v]);return je.makeSpan(["mord","sqrt"],[y,p],t)}return je.makeSpan(["mord","sqrt"],[p],t)},mathmlBuilder:function(e,t){var r=e.body,n=e.index;return n?new Mt.MathNode("mroot",[Nt(r,t),Nt(n,t)]):new Mt.MathNode("msqrt",[Nt(r,t)])}});var Mn={display:b.DISPLAY,text:b.TEXT,script:b.SCRIPT,scriptscript:b.SCRIPTSCRIPT};nt({type:"styling",names:["\\displaystyle","\\textstyle","\\scriptstyle","\\scriptscriptstyle"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler:function(e,t){var r=e.breakOnTokenText,n=e.funcName,a=e.parser,i=a.parseExpression(!0,r),o=n.slice(1,n.length-5);return{type:"styling",mode:a.mode,style:o,body:i}},htmlBuilder:function(e,t){var r=Mn[e.style],n=t.havingStyle(r).withFont("");return kn(e.body,n,t)},mathmlBuilder:function(e,t){var r=Mn[e.style],n=t.havingStyle(r),a=Bt(e.body,n),i=new Mt.MathNode("mstyle",a),o={display:["0","true"],text:["0","false"],script:["1","false"],scriptscript:["2","false"]}[e.style];return i.setAttribute("scriptlevel",o[0]),i.setAttribute("displaystyle",o[1]),i}});var zn=function(e,t){var r=e.base;return r?"op"===r.type?r.limits&&(t.style.size===b.DISPLAY.size||r.alwaysHandleSupSub)?hn:null:"operatorname"===r.type?r.alwaysHandleSupSub&&(t.style.size===b.DISPLAY.size||r.limits)?wn:null:"accent"===r.type?l.isCharacterBox(r.base)?Ut:null:"horizBrace"===r.type&&!e.sub===r.isOver?nn:null:null};at({type:"supsub",htmlBuilder:function(e,t){var r=zn(e,t);if(r)return r(e,t);var n,a,i,o=e.base,s=e.sup,h=e.sub,m=bt(o,t),c=t.fontMetrics(),u=0,p=0,d=o&&l.isCharacterBox(o);if(s){var f=t.havingStyle(t.style.sup());n=bt(s,f,t),d||(u=m.height-f.fontMetrics().supDrop*f.sizeMultiplier/t.sizeMultiplier)}if(h){var g=t.havingStyle(t.style.sub());a=bt(h,g,t),d||(p=m.depth+g.fontMetrics().subDrop*g.sizeMultiplier/t.sizeMultiplier)}i=t.style===b.DISPLAY?c.sup1:t.style.cramped?c.sup3:c.sup2;var v,y=t.sizeMultiplier,x=.5/c.ptPerEm/y+"em",w=null;if(a){var k=e.base&&"op"===e.base.type&&e.base.name&&("\\oiint"===e.base.name||"\\oiiint"===e.base.name);(m instanceof R||k)&&(w=-m.italic+"em")}if(n&&a){u=Math.max(u,i,n.depth+.25*c.xHeight),p=Math.max(p,c.sub2);var S=4*c.defaultRuleThickness;if(u-n.depth-(a.height-p)0&&(u+=M,p-=M)}var z=[{type:"elem",elem:a,shift:p,marginRight:x,marginLeft:w},{type:"elem",elem:n,shift:-u,marginRight:x}];v=je.makeVList({positionType:"individualShift",children:z},t)}else if(a){p=Math.max(p,c.sub1,a.height-.8*c.xHeight);var A=[{type:"elem",elem:a,marginLeft:w,marginRight:x}];v=je.makeVList({positionType:"shift",positionData:p,children:A},t)}else{if(!n)throw new Error("supsub must have either sup or sub.");u=Math.max(u,i,n.depth+.25*c.xHeight),v=je.makeVList({positionType:"shift",positionData:-u,children:[{type:"elem",elem:n,marginRight:x}]},t)}var T=gt(m,"right")||"mord";return je.makeSpan([T],[m,je.makeSpan(["msupsub"],[v])],t)},mathmlBuilder:function(e,t){var r,n=!1;e.base&&"horizBrace"===e.base.type&&!!e.sup===e.base.isOver&&(n=!0,r=e.base.isOver),!e.base||"op"!==e.base.type&&"operatorname"!==e.base.type||(e.base.parentIsSupSub=!0);var a,i=[Nt(e.base,t)];if(e.sub&&i.push(Nt(e.sub,t)),e.sup&&i.push(Nt(e.sup,t)),n)a=r?"mover":"munder";else if(e.sub)if(e.sup){var o=e.base;a=o&&"op"===o.type&&o.limits&&t.style===b.DISPLAY||o&&"operatorname"===o.type&&o.alwaysHandleSupSub&&(t.style===b.DISPLAY||o.limits)?"munderover":"msubsup"}else{var s=e.base;a=s&&"op"===s.type&&s.limits&&(t.style===b.DISPLAY||s.alwaysHandleSupSub)||s&&"operatorname"===s.type&&s.alwaysHandleSupSub&&(s.limits||t.style===b.DISPLAY)?"munder":"msub"}else{var l=e.base;a=l&&"op"===l.type&&l.limits&&(t.style===b.DISPLAY||l.alwaysHandleSupSub)||l&&"operatorname"===l.type&&l.alwaysHandleSupSub&&(l.limits||t.style===b.DISPLAY)?"mover":"msup"}return new Mt.MathNode(a,i)}}),at({type:"atom",htmlBuilder:function(e,t){return je.mathsym(e.text,e.mode,t,["m"+e.family])},mathmlBuilder:function(e,t){var r=new Mt.MathNode("mo",[zt(e.text,e.mode)]);if("bin"===e.family){var n=Tt(e,t);"bold-italic"===n&&r.setAttribute("mathvariant",n)}else"punct"===e.family?r.setAttribute("separator","true"):"open"!==e.family&&"close"!==e.family||r.setAttribute("stretchy","false");return r}});var An={mi:"italic",mn:"normal",mtext:"normal"};at({type:"mathord",htmlBuilder:function(e,t){return je.makeOrd(e,t,"mathord")},mathmlBuilder:function(e,t){var r=new Mt.MathNode("mi",[zt(e.text,e.mode,t)]),n=Tt(e,t)||"italic";return n!==An[r.type]&&r.setAttribute("mathvariant",n),r}}),at({type:"textord",htmlBuilder:function(e,t){return je.makeOrd(e,t,"textord")},mathmlBuilder:function(e,t){var r,n=zt(e.text,e.mode,t),a=Tt(e,t)||"normal";return r="text"===e.mode?new Mt.MathNode("mtext",[n]):/[0-9]/.test(e.text)?new Mt.MathNode("mn",[n]):"\\prime"===e.text?new Mt.MathNode("mo",[n]):new Mt.MathNode("mi",[n]),a!==An[r.type]&&r.setAttribute("mathvariant",a),r}});var Tn={"\\nobreak":"nobreak","\\allowbreak":"allowbreak"},Bn={" ":{},"\\ ":{},"~":{className:"nobreak"},"\\space":{},"\\nobreakspace":{className:"nobreak"}};at({type:"spacing",htmlBuilder:function(e,t){if(Bn.hasOwnProperty(e.text)){var r=Bn[e.text].className||"";if("text"===e.mode){var a=je.makeOrd(e,t,"textord");return a.classes.push(r),a}return je.makeSpan(["mspace",r],[je.mathsym(e.text,e.mode,t)],t)}if(Tn.hasOwnProperty(e.text))return je.makeSpan(["mspace",Tn[e.text]],[],t);throw new n('Unknown type of space "'+e.text+'"')},mathmlBuilder:function(e,t){if(!Bn.hasOwnProperty(e.text)){if(Tn.hasOwnProperty(e.text))return new Mt.MathNode("mspace");throw new n('Unknown type of space "'+e.text+'"')}return new Mt.MathNode("mtext",[new Mt.TextNode("\xa0")])}});var qn=function(){var e=new Mt.MathNode("mtd",[]);return e.setAttribute("width","50%"),e};at({type:"tag",mathmlBuilder:function(e,t){var r=new Mt.MathNode("mtable",[new Mt.MathNode("mtr",[qn(),new Mt.MathNode("mtd",[qt(e.body,t)]),qn(),new Mt.MathNode("mtd",[qt(e.tag,t)])])]);return r.setAttribute("width","100%"),r}});var Nn={"\\text":void 0,"\\textrm":"textrm","\\textsf":"textsf","\\texttt":"texttt","\\textnormal":"textrm"},Cn={"\\textbf":"textbf","\\textmd":"textmd"},In={"\\textit":"textit","\\textup":"textup"},Rn=function(e,t){var r=e.font;return r?Nn[r]?t.withTextFontFamily(Nn[r]):Cn[r]?t.withTextFontWeight(Cn[r]):t.withTextFontShape(In[r]):t};nt({type:"text",names:["\\text","\\textrm","\\textsf","\\texttt","\\textnormal","\\textbf","\\textmd","\\textit","\\textup"],props:{numArgs:1,argTypes:["text"],allowedInArgument:!0,allowedInText:!0},handler:function(e,t){var r=e.parser,n=e.funcName,a=t[0];return{type:"text",mode:r.mode,body:ot(a),font:n}},htmlBuilder:function(e,t){var r=Rn(e,t),n=ut(e.body,r,!0);return je.makeSpan(["mord","text"],n,r)},mathmlBuilder:function(e,t){var r=Rn(e,t);return qt(e.body,r)}}),nt({type:"underline",names:["\\underline"],props:{numArgs:1,allowedInText:!0},handler:function(e,t){return{type:"underline",mode:e.parser.mode,body:t[0]}},htmlBuilder:function(e,t){var r=bt(e.body,t),n=je.makeLineSpan("underline-line",t),a=t.fontMetrics().defaultRuleThickness,i=je.makeVList({positionType:"top",positionData:r.height,children:[{type:"kern",size:a},{type:"elem",elem:n},{type:"kern",size:3*a},{type:"elem",elem:r}]},t);return je.makeSpan(["mord","underline"],[i],t)},mathmlBuilder:function(e,t){var r=new Mt.MathNode("mo",[new Mt.TextNode("\u203e")]);r.setAttribute("stretchy","true");var n=new Mt.MathNode("munder",[Nt(e.body,t),r]);return n.setAttribute("accentunder","true"),n}}),nt({type:"vcenter",names:["\\vcenter"],props:{numArgs:1,argTypes:["original"],allowedInText:!1},handler:function(e,t){return{type:"vcenter",mode:e.parser.mode,body:t[0]}},htmlBuilder:function(e,t){var r=bt(e.body,t),n=t.fontMetrics().axisHeight,a=.5*(r.height-n-(r.depth+n));return je.makeVList({positionType:"shift",positionData:a,children:[{type:"elem",elem:r}]},t)},mathmlBuilder:function(e,t){return new Mt.MathNode("mpadded",[Nt(e.body,t)],["vcenter"])}}),nt({type:"verb",names:["\\verb"],props:{numArgs:0,allowedInText:!0},handler:function(e,t,r){throw new n("\\verb ended by end of line instead of matching delimiter")},htmlBuilder:function(e,t){for(var r=On(e),n=[],a=t.havingStyle(t.style.text()),i=0;i0&&(this.undefStack[this.undefStack.length-1][e]=t)}else{var a=this.undefStack[this.undefStack.length-1];a&&!a.hasOwnProperty(e)&&(a[e]=this.current[e])}this.current[e]=t},e}(),Vn={"\\relax":!0,"^":!0,_:!0,"\\limits":!0,"\\nolimits":!0},Gn=function(){function e(e,t,r){this.settings=void 0,this.expansionCount=void 0,this.lexer=void 0,this.macros=void 0,this.stack=void 0,this.mode=void 0,this.settings=t,this.expansionCount=0,this.feed(e),this.macros=new Fn(dn,t.macros),this.mode=r,this.stack=[]}var t=e.prototype;return t.feed=function(e){this.lexer=new Pn(e,this.settings)},t.switchMode=function(e){this.mode=e},t.beginGroup=function(){this.macros.beginGroup()},t.endGroup=function(){this.macros.endGroup()},t.future=function(){return 0===this.stack.length&&this.pushToken(this.lexer.lex()),this.stack[this.stack.length-1]},t.popToken=function(){return this.future(),this.stack.pop()},t.pushToken=function(e){this.stack.push(e)},t.pushTokens=function(e){var t;(t=this.stack).push.apply(t,e)},t.scanArgument=function(e){var t,r,n;if(e){if(this.consumeSpaces(),"["!==this.future().text)return null;t=this.popToken();var a=this.consumeArg(["]"]);n=a.tokens,r=a.end}else{var i=this.consumeArg();n=i.tokens,t=i.start,r=i.end}return this.pushToken(new Ln("EOF",r.loc)),this.pushTokens(n),t.range(r,"")},t.consumeSpaces=function(){for(;;){if(" "!==this.future().text)break;this.stack.pop()}},t.consumeArg=function(e){var t=[],r=e&&e.length>0;r||this.consumeSpaces();var a,i=this.future(),o=0,s=0;do{if(a=this.popToken(),t.push(a),"{"===a.text)++o;else if("}"===a.text){if(-1===--o)throw new n("Extra }",a)}else if("EOF"===a.text)throw new n("Unexpected end of input in a macro argument, expected '"+(e&&r?e[s]:"}")+"'",a);if(e&&r)if((0===o||1===o&&"{"===e[s])&&a.text===e[s]){if(++s===e.length){t.splice(-s,s);break}}else s=0}while(0!==o||r);return"{"===i.text&&"}"===t[t.length-1].text&&(t.pop(),t.shift()),t.reverse(),{tokens:t,start:i,end:a}},t.consumeArgs=function(e,t){if(t){if(t.length!==e+1)throw new n("The length of delimiters doesn't match the number of args!");for(var r=t[0],a=0;athis.settings.maxExpand)throw new n("Too many expansions: infinite loop or need to increase maxExpand setting");var i=a.tokens,o=this.consumeArgs(a.numArgs,a.delimiters);if(a.numArgs)for(var s=(i=i.slice()).length-1;s>=0;--s){var l=i[s];if("#"===l.text){if(0===s)throw new n("Incomplete placeholder at end of macro body",l);if("#"===(l=i[--s]).text)i.splice(s+1,1);else{if(!/^[1-9]$/.test(l.text))throw new n("Not a valid argument number",l);var h;(h=i).splice.apply(h,[s,2].concat(o[+l.text-1]))}}}return this.pushTokens(i),i},t.expandAfterFuture=function(){return this.expandOnce(),this.future()},t.expandNextToken=function(){for(;;){var e=this.expandOnce();if(e instanceof Ln){if("\\relax"!==e.text&&!e.treatAsRelax)return this.stack.pop();this.stack.pop()}}throw new Error},t.expandMacro=function(e){return this.macros.has(e)?this.expandTokens([new Ln(e)]):void 0},t.expandTokens=function(e){var t=[],r=this.stack.length;for(this.pushTokens(e);this.stack.length>r;){var n=this.expandOnce(!0);n instanceof Ln&&(n.treatAsRelax&&(n.noexpand=!1,n.treatAsRelax=!1),t.push(this.stack.pop()))}return t},t.expandMacroAsText=function(e){var t=this.expandMacro(e);return t?t.map((function(e){return e.text})).join(""):t},t._getExpansion=function(e){var t=this.macros.get(e);if(null==t)return t;if(1===e.length){var r=this.lexer.catcodes[e];if(null!=r&&13!==r)return}var n="function"==typeof t?t(this):t;if("string"==typeof n){var a=0;if(-1!==n.indexOf("#"))for(var i=n.replace(/##/g,"");-1!==i.indexOf("#"+(a+1));)++a;for(var o=new Pn(n,this.settings),s=[],l=o.lex();"EOF"!==l.text;)s.push(l),l=o.lex();return s.reverse(),{tokens:s,numArgs:a}}return n},t.isDefined=function(e){return this.macros.has(e)||En.hasOwnProperty(e)||X.math.hasOwnProperty(e)||X.text.hasOwnProperty(e)||Vn.hasOwnProperty(e)},t.isExpandable=function(e){var t=this.macros.get(e);return null!=t?"string"==typeof t||"function"==typeof t||!t.unexpandable:En.hasOwnProperty(e)&&!En[e].primitive},e}(),Un={"\u0301":{text:"\\'",math:"\\acute"},"\u0300":{text:"\\`",math:"\\grave"},"\u0308":{text:'\\"',math:"\\ddot"},"\u0303":{text:"\\~",math:"\\tilde"},"\u0304":{text:"\\=",math:"\\bar"},"\u0306":{text:"\\u",math:"\\breve"},"\u030c":{text:"\\v",math:"\\check"},"\u0302":{text:"\\^",math:"\\hat"},"\u0307":{text:"\\.",math:"\\dot"},"\u030a":{text:"\\r",math:"\\mathring"},"\u030b":{text:"\\H"}},Yn={"\xe1":"a\u0301","\xe0":"a\u0300","\xe4":"a\u0308","\u01df":"a\u0308\u0304","\xe3":"a\u0303","\u0101":"a\u0304","\u0103":"a\u0306","\u1eaf":"a\u0306\u0301","\u1eb1":"a\u0306\u0300","\u1eb5":"a\u0306\u0303","\u01ce":"a\u030c","\xe2":"a\u0302","\u1ea5":"a\u0302\u0301","\u1ea7":"a\u0302\u0300","\u1eab":"a\u0302\u0303","\u0227":"a\u0307","\u01e1":"a\u0307\u0304","\xe5":"a\u030a","\u01fb":"a\u030a\u0301","\u1e03":"b\u0307","\u0107":"c\u0301","\u010d":"c\u030c","\u0109":"c\u0302","\u010b":"c\u0307","\u010f":"d\u030c","\u1e0b":"d\u0307","\xe9":"e\u0301","\xe8":"e\u0300","\xeb":"e\u0308","\u1ebd":"e\u0303","\u0113":"e\u0304","\u1e17":"e\u0304\u0301","\u1e15":"e\u0304\u0300","\u0115":"e\u0306","\u011b":"e\u030c","\xea":"e\u0302","\u1ebf":"e\u0302\u0301","\u1ec1":"e\u0302\u0300","\u1ec5":"e\u0302\u0303","\u0117":"e\u0307","\u1e1f":"f\u0307","\u01f5":"g\u0301","\u1e21":"g\u0304","\u011f":"g\u0306","\u01e7":"g\u030c","\u011d":"g\u0302","\u0121":"g\u0307","\u1e27":"h\u0308","\u021f":"h\u030c","\u0125":"h\u0302","\u1e23":"h\u0307","\xed":"i\u0301","\xec":"i\u0300","\xef":"i\u0308","\u1e2f":"i\u0308\u0301","\u0129":"i\u0303","\u012b":"i\u0304","\u012d":"i\u0306","\u01d0":"i\u030c","\xee":"i\u0302","\u01f0":"j\u030c","\u0135":"j\u0302","\u1e31":"k\u0301","\u01e9":"k\u030c","\u013a":"l\u0301","\u013e":"l\u030c","\u1e3f":"m\u0301","\u1e41":"m\u0307","\u0144":"n\u0301","\u01f9":"n\u0300","\xf1":"n\u0303","\u0148":"n\u030c","\u1e45":"n\u0307","\xf3":"o\u0301","\xf2":"o\u0300","\xf6":"o\u0308","\u022b":"o\u0308\u0304","\xf5":"o\u0303","\u1e4d":"o\u0303\u0301","\u1e4f":"o\u0303\u0308","\u022d":"o\u0303\u0304","\u014d":"o\u0304","\u1e53":"o\u0304\u0301","\u1e51":"o\u0304\u0300","\u014f":"o\u0306","\u01d2":"o\u030c","\xf4":"o\u0302","\u1ed1":"o\u0302\u0301","\u1ed3":"o\u0302\u0300","\u1ed7":"o\u0302\u0303","\u022f":"o\u0307","\u0231":"o\u0307\u0304","\u0151":"o\u030b","\u1e55":"p\u0301","\u1e57":"p\u0307","\u0155":"r\u0301","\u0159":"r\u030c","\u1e59":"r\u0307","\u015b":"s\u0301","\u1e65":"s\u0301\u0307","\u0161":"s\u030c","\u1e67":"s\u030c\u0307","\u015d":"s\u0302","\u1e61":"s\u0307","\u1e97":"t\u0308","\u0165":"t\u030c","\u1e6b":"t\u0307","\xfa":"u\u0301","\xf9":"u\u0300","\xfc":"u\u0308","\u01d8":"u\u0308\u0301","\u01dc":"u\u0308\u0300","\u01d6":"u\u0308\u0304","\u01da":"u\u0308\u030c","\u0169":"u\u0303","\u1e79":"u\u0303\u0301","\u016b":"u\u0304","\u1e7b":"u\u0304\u0308","\u016d":"u\u0306","\u01d4":"u\u030c","\xfb":"u\u0302","\u016f":"u\u030a","\u0171":"u\u030b","\u1e7d":"v\u0303","\u1e83":"w\u0301","\u1e81":"w\u0300","\u1e85":"w\u0308","\u0175":"w\u0302","\u1e87":"w\u0307","\u1e98":"w\u030a","\u1e8d":"x\u0308","\u1e8b":"x\u0307","\xfd":"y\u0301","\u1ef3":"y\u0300","\xff":"y\u0308","\u1ef9":"y\u0303","\u0233":"y\u0304","\u0177":"y\u0302","\u1e8f":"y\u0307","\u1e99":"y\u030a","\u017a":"z\u0301","\u017e":"z\u030c","\u1e91":"z\u0302","\u017c":"z\u0307","\xc1":"A\u0301","\xc0":"A\u0300","\xc4":"A\u0308","\u01de":"A\u0308\u0304","\xc3":"A\u0303","\u0100":"A\u0304","\u0102":"A\u0306","\u1eae":"A\u0306\u0301","\u1eb0":"A\u0306\u0300","\u1eb4":"A\u0306\u0303","\u01cd":"A\u030c","\xc2":"A\u0302","\u1ea4":"A\u0302\u0301","\u1ea6":"A\u0302\u0300","\u1eaa":"A\u0302\u0303","\u0226":"A\u0307","\u01e0":"A\u0307\u0304","\xc5":"A\u030a","\u01fa":"A\u030a\u0301","\u1e02":"B\u0307","\u0106":"C\u0301","\u010c":"C\u030c","\u0108":"C\u0302","\u010a":"C\u0307","\u010e":"D\u030c","\u1e0a":"D\u0307","\xc9":"E\u0301","\xc8":"E\u0300","\xcb":"E\u0308","\u1ebc":"E\u0303","\u0112":"E\u0304","\u1e16":"E\u0304\u0301","\u1e14":"E\u0304\u0300","\u0114":"E\u0306","\u011a":"E\u030c","\xca":"E\u0302","\u1ebe":"E\u0302\u0301","\u1ec0":"E\u0302\u0300","\u1ec4":"E\u0302\u0303","\u0116":"E\u0307","\u1e1e":"F\u0307","\u01f4":"G\u0301","\u1e20":"G\u0304","\u011e":"G\u0306","\u01e6":"G\u030c","\u011c":"G\u0302","\u0120":"G\u0307","\u1e26":"H\u0308","\u021e":"H\u030c","\u0124":"H\u0302","\u1e22":"H\u0307","\xcd":"I\u0301","\xcc":"I\u0300","\xcf":"I\u0308","\u1e2e":"I\u0308\u0301","\u0128":"I\u0303","\u012a":"I\u0304","\u012c":"I\u0306","\u01cf":"I\u030c","\xce":"I\u0302","\u0130":"I\u0307","\u0134":"J\u0302","\u1e30":"K\u0301","\u01e8":"K\u030c","\u0139":"L\u0301","\u013d":"L\u030c","\u1e3e":"M\u0301","\u1e40":"M\u0307","\u0143":"N\u0301","\u01f8":"N\u0300","\xd1":"N\u0303","\u0147":"N\u030c","\u1e44":"N\u0307","\xd3":"O\u0301","\xd2":"O\u0300","\xd6":"O\u0308","\u022a":"O\u0308\u0304","\xd5":"O\u0303","\u1e4c":"O\u0303\u0301","\u1e4e":"O\u0303\u0308","\u022c":"O\u0303\u0304","\u014c":"O\u0304","\u1e52":"O\u0304\u0301","\u1e50":"O\u0304\u0300","\u014e":"O\u0306","\u01d1":"O\u030c","\xd4":"O\u0302","\u1ed0":"O\u0302\u0301","\u1ed2":"O\u0302\u0300","\u1ed6":"O\u0302\u0303","\u022e":"O\u0307","\u0230":"O\u0307\u0304","\u0150":"O\u030b","\u1e54":"P\u0301","\u1e56":"P\u0307","\u0154":"R\u0301","\u0158":"R\u030c","\u1e58":"R\u0307","\u015a":"S\u0301","\u1e64":"S\u0301\u0307","\u0160":"S\u030c","\u1e66":"S\u030c\u0307","\u015c":"S\u0302","\u1e60":"S\u0307","\u0164":"T\u030c","\u1e6a":"T\u0307","\xda":"U\u0301","\xd9":"U\u0300","\xdc":"U\u0308","\u01d7":"U\u0308\u0301","\u01db":"U\u0308\u0300","\u01d5":"U\u0308\u0304","\u01d9":"U\u0308\u030c","\u0168":"U\u0303","\u1e78":"U\u0303\u0301","\u016a":"U\u0304","\u1e7a":"U\u0304\u0308","\u016c":"U\u0306","\u01d3":"U\u030c","\xdb":"U\u0302","\u016e":"U\u030a","\u0170":"U\u030b","\u1e7c":"V\u0303","\u1e82":"W\u0301","\u1e80":"W\u0300","\u1e84":"W\u0308","\u0174":"W\u0302","\u1e86":"W\u0307","\u1e8c":"X\u0308","\u1e8a":"X\u0307","\xdd":"Y\u0301","\u1ef2":"Y\u0300","\u0178":"Y\u0308","\u1ef8":"Y\u0303","\u0232":"Y\u0304","\u0176":"Y\u0302","\u1e8e":"Y\u0307","\u0179":"Z\u0301","\u017d":"Z\u030c","\u1e90":"Z\u0302","\u017b":"Z\u0307","\u03ac":"\u03b1\u0301","\u1f70":"\u03b1\u0300","\u1fb1":"\u03b1\u0304","\u1fb0":"\u03b1\u0306","\u03ad":"\u03b5\u0301","\u1f72":"\u03b5\u0300","\u03ae":"\u03b7\u0301","\u1f74":"\u03b7\u0300","\u03af":"\u03b9\u0301","\u1f76":"\u03b9\u0300","\u03ca":"\u03b9\u0308","\u0390":"\u03b9\u0308\u0301","\u1fd2":"\u03b9\u0308\u0300","\u1fd1":"\u03b9\u0304","\u1fd0":"\u03b9\u0306","\u03cc":"\u03bf\u0301","\u1f78":"\u03bf\u0300","\u03cd":"\u03c5\u0301","\u1f7a":"\u03c5\u0300","\u03cb":"\u03c5\u0308","\u03b0":"\u03c5\u0308\u0301","\u1fe2":"\u03c5\u0308\u0300","\u1fe1":"\u03c5\u0304","\u1fe0":"\u03c5\u0306","\u03ce":"\u03c9\u0301","\u1f7c":"\u03c9\u0300","\u038e":"\u03a5\u0301","\u1fea":"\u03a5\u0300","\u03ab":"\u03a5\u0308","\u1fe9":"\u03a5\u0304","\u1fe8":"\u03a5\u0306","\u038f":"\u03a9\u0301","\u1ffa":"\u03a9\u0300"},Wn=function(){function e(e,t){this.mode=void 0,this.gullet=void 0,this.settings=void 0,this.leftrightDepth=void 0,this.nextToken=void 0,this.mode="math",this.gullet=new Gn(e,t,this.mode),this.settings=t,this.leftrightDepth=0}var t=e.prototype;return t.expect=function(e,t){if(void 0===t&&(t=!0),this.fetch().text!==e)throw new n("Expected '"+e+"', got '"+this.fetch().text+"'",this.fetch());t&&this.consume()},t.consume=function(){this.nextToken=null},t.fetch=function(){return null==this.nextToken&&(this.nextToken=this.gullet.expandNextToken()),this.nextToken},t.switchMode=function(e){this.mode=e,this.gullet.switchMode(e)},t.parse=function(){this.settings.globalGroup||this.gullet.beginGroup(),this.settings.colorIsTextColor&&this.gullet.macros.set("\\color","\\textcolor");var e=this.parseExpression(!1);return this.expect("EOF"),this.settings.globalGroup||this.gullet.endGroup(),e},t.parseExpression=function(t,r){for(var n=[];;){"math"===this.mode&&this.consumeSpaces();var a=this.fetch();if(-1!==e.endOfExpression.indexOf(a.text))break;if(r&&a.text===r)break;if(t&&En[a.text]&&En[a.text].infix)break;var i=this.parseAtom(r);if(!i)break;"internal"!==i.type&&n.push(i)}return"text"===this.mode&&this.formLigatures(n),this.handleInfixNodes(n)},t.handleInfixNodes=function(e){for(var t,r=-1,a=0;a=0&&this.settings.reportNonstrict("unicodeTextInMathMode",'Latin-1/Unicode text character "'+t[0]+'" used in math mode',e);var s,l=X[this.mode][t].group,h=Hn.range(e);if(U.hasOwnProperty(l)){var m=l;s={type:"atom",mode:this.mode,family:m,loc:h,text:t}}else s={type:l,mode:this.mode,loc:h,text:t};i=s}else{if(!(t.charCodeAt(0)>=128))return null;this.settings.strict&&(w(t.charCodeAt(0))?"math"===this.mode&&this.settings.reportNonstrict("unicodeTextInMathMode",'Unicode text character "'+t[0]+'" used in math mode',e):this.settings.reportNonstrict("unknownSymbol",'Unrecognized Unicode character "'+t[0]+'" ('+t.charCodeAt(0)+")",e)),i={type:"textord",mode:"text",loc:Hn.range(e),text:t}}if(this.consume(),o)for(var c=0;c 15) { - left = "…" + input.slice(start - 15, start); - } else { - left = input.slice(0, start); - } - let right; - if (end + 15 < input.length) { - right = input.slice(end, end + 15) + "…"; - } else { - right = input.slice(end); - } - error += left + underlined + right; - } - - // Some hackery to make ParseError a prototype of Error - // See http://stackoverflow.com/a/8460753 - const self = new Error(error); - self.name = "ParseError"; - self.__proto__ = ParseError.prototype; - self.position = start; - return self; - } -} - -ParseError.prototype.__proto__ = Error.prototype; - -// -/** - * This file contains a list of utility functions which are useful in other - * files. - */ - -/** - * Provide a default value if a setting is undefined - */ -const deflt = function(setting, defaultIfUndefined) { - return setting === undefined ? defaultIfUndefined : setting; -}; - -// hyphenate and escape adapted from Facebook's React under Apache 2 license - -const uppercase = /([A-Z])/g; -const hyphenate = function(str) { - return str.replace(uppercase, "-$1").toLowerCase(); -}; - -const ESCAPE_LOOKUP = { - "&": "&", - ">": ">", - "<": "<", - '"': """, - "'": "'" -}; - -const ESCAPE_REGEX = /[&><"']/g; - -/** - * Escapes text to prevent scripting attacks. - */ -function escape(text) { - return String(text).replace(ESCAPE_REGEX, (match) => ESCAPE_LOOKUP[match]); -} - -/** - * Sometimes we want to pull out the innermost element of a group. In most - * cases, this will just be the group itself, but when ordgroups and colors have - * a single element, we want to pull that out. - */ -const getBaseElem = function(group) { - if (group.type === "ordgroup") { - if (group.body.length === 1) { - return getBaseElem(group.body[0]); - } else { - return group; - } - } else if (group.type === "color") { - if (group.body.length === 1) { - return getBaseElem(group.body[0]); - } else { - return group; - } - } else if (group.type === "font") { - return getBaseElem(group.body); - } else { - return group; - } -}; - -/** - * TeXbook algorithms often reference "character boxes", which are simply groups - * with a single character in them. To decide if something is a character box, - * we find its innermost group, and see if it is a single character. - */ -const isCharacterBox = function(group) { - const baseElem = getBaseElem(group); - - // These are all the types of groups which hold single characters - return baseElem.type === "mathord" || baseElem.type === "textord" || baseElem.type === "atom" -}; - -const assert = function(value) { - if (!value) { - throw new Error("Expected non-null, but got " + String(value)); - } - return value; -}; - -/** - * Return the protocol of a URL, or "_relative" if the URL does not specify a - * protocol (and thus is relative), or `null` if URL has invalid protocol - * (so should be outright rejected). - */ -const protocolFromUrl = function(url) { - // Check for possible leading protocol. - // https://url.spec.whatwg.org/#url-parsing strips leading whitespace - // (\x00) or C0 control (\x00-\x1F) characters. - // eslint-disable-next-line no-control-regex - const protocol = /^[\x00-\x20]*([^\\/#?]*?)(:|�*58|�*3a|&colon)/i.exec(url); - if (!protocol) { - return "_relative"; - } - // Reject weird colons - if (protocol[2] !== ":") { - return null; - } - // Reject invalid characters in scheme according to - // https://datatracker.ietf.org/doc/html/rfc3986#section-3.1 - if (!/^[a-zA-Z][a-zA-Z0-9+\-.]*$/.test(protocol[1])) { - return null; - } - // Lowercase the protocol - return protocol[1].toLowerCase(); -}; - -/** - * Round `n` to 4 decimal places, or to the nearest 1/10,000th em. The TeXbook - * gives an acceptable rounding error of 100sp (which would be the nearest - * 1/6551.6em with our ptPerEm = 10): - * http://www.ctex.org/documents/shredder/src/texbook.pdf#page=69 - */ -const round = function(n) { - return +n.toFixed(4); -}; - -var utils = { - deflt, - escape, - hyphenate, - getBaseElem, - isCharacterBox, - protocolFromUrl, - round -}; - -/** - * This is a module for storing settings passed into Temml. It correctly handles - * default settings. - */ - -/** - * The main Settings object - */ -class Settings { - constructor(options) { - // allow null options - options = options || {}; - this.displayMode = utils.deflt(options.displayMode, false); // boolean - this.annotate = utils.deflt(options.annotate, false); // boolean - this.leqno = utils.deflt(options.leqno, false); // boolean - this.throwOnError = utils.deflt(options.throwOnError, false); // boolean - this.errorColor = utils.deflt(options.errorColor, "#b22222"); // string - this.macros = options.macros || {}; - this.wrap = utils.deflt(options.wrap, "tex"); // "tex" | "=" - this.xml = utils.deflt(options.xml, false); // boolean - this.colorIsTextColor = utils.deflt(options.colorIsTextColor, false); // booelean - this.strict = utils.deflt(options.strict, false); // boolean - this.trust = utils.deflt(options.trust, false); // trust context. See html.js. - this.maxSize = (options.maxSize === undefined - ? [Infinity, Infinity] - : Array.isArray(options.maxSize) - ? options.maxSize - : [Infinity, Infinity] - ); - this.maxExpand = Math.max(0, utils.deflt(options.maxExpand, 1000)); // number - } - - /** - * Check whether to test potentially dangerous input, and return - * `true` (trusted) or `false` (untrusted). The sole argument `context` - * should be an object with `command` field specifying the relevant LaTeX - * command (as a string starting with `\`), and any other arguments, etc. - * If `context` has a `url` field, a `protocol` field will automatically - * get added by this function (changing the specified object). - */ - isTrusted(context) { - if (context.url && !context.protocol) { - const protocol = utils.protocolFromUrl(context.url); - if (protocol == null) { - return false - } - context.protocol = protocol; - } - const trust = typeof this.trust === "function" ? this.trust(context) : this.trust; - return Boolean(trust); - } -} - -/** - * All registered functions. - * `functions.js` just exports this same dictionary again and makes it public. - * `Parser.js` requires this dictionary. - */ -const _functions = {}; - -/** - * All MathML builders. Should be only used in the `define*` and the `build*ML` - * functions. - */ -const _mathmlGroupBuilders = {}; - -function defineFunction({ - type, - names, - props, - handler, - mathmlBuilder -}) { - // Set default values of functions - const data = { - type, - numArgs: props.numArgs, - argTypes: props.argTypes, - allowedInArgument: !!props.allowedInArgument, - allowedInText: !!props.allowedInText, - allowedInMath: props.allowedInMath === undefined ? true : props.allowedInMath, - numOptionalArgs: props.numOptionalArgs || 0, - infix: !!props.infix, - primitive: !!props.primitive, - handler: handler - }; - for (let i = 0; i < names.length; ++i) { - _functions[names[i]] = data; - } - if (type) { - if (mathmlBuilder) { - _mathmlGroupBuilders[type] = mathmlBuilder; - } - } -} - -/** - * Use this to register only the MathML builder for a function(e.g. - * if the function's ParseNode is generated in Parser.js rather than via a - * stand-alone handler provided to `defineFunction`). - */ -function defineFunctionBuilders({ type, mathmlBuilder }) { - defineFunction({ - type, - names: [], - props: { numArgs: 0 }, - handler() { - throw new Error("Should never be called.") - }, - mathmlBuilder - }); -} - -const normalizeArgument = function(arg) { - return arg.type === "ordgroup" && arg.body.length === 1 ? arg.body[0] : arg -}; - -// Since the corresponding buildMathML function expects a -// list of elements, we normalize for different kinds of arguments -const ordargument = function(arg) { - return arg.type === "ordgroup" ? arg.body : [arg] -}; - -/** - * This node represents a document fragment, which contains elements, but when - * placed into the DOM doesn't have any representation itself. It only contains - * children and doesn't have any DOM node properties. - */ -class DocumentFragment { - constructor(children) { - this.children = children; - this.classes = []; - this.style = {}; - } - - hasClass(className) { - return this.classes.includes(className); - } - - /** Convert the fragment into a node. */ - toNode() { - const frag = document.createDocumentFragment(); - - for (let i = 0; i < this.children.length; i++) { - frag.appendChild(this.children[i].toNode()); - } - - return frag; - } - - /** Convert the fragment into HTML markup. */ - toMarkup() { - let markup = ""; - - // Simply concatenate the markup for the children together. - for (let i = 0; i < this.children.length; i++) { - markup += this.children[i].toMarkup(); - } - - return markup; - } - - /** - * Converts the math node into a string, similar to innerText. Applies to - * MathDomNode's only. - */ - toText() { - // To avoid this, we would subclass documentFragment separately for - // MathML, but polyfills for subclassing is expensive per PR 1469. - const toText = (child) => child.toText(); - return this.children.map(toText).join(""); - } -} - -/** - * These objects store the data about the DOM nodes we create, as well as some - * extra data. They can then be transformed into real DOM nodes with the - * `toNode` function or HTML markup using `toMarkup`. They are useful for both - * storing extra properties on the nodes, as well as providing a way to easily - * work with the DOM. - * - * Similar functions for working with MathML nodes exist in mathMLTree.js. - * - */ - -/** - * Create an HTML className based on a list of classes. In addition to joining - * with spaces, we also remove empty classes. - */ -const createClass = function(classes) { - return classes.filter((cls) => cls).join(" "); -}; - -const initNode = function(classes, style) { - this.classes = classes || []; - this.attributes = {}; - this.style = style || {}; -}; - -/** - * Convert into an HTML node - */ -const toNode = function(tagName) { - const node = document.createElement(tagName); - - // Apply the class - node.className = createClass(this.classes); - - // Apply inline styles - for (const style in this.style) { - if (Object.prototype.hasOwnProperty.call(this.style, style )) { - node.style[style] = this.style[style]; - } - } - - // Apply attributes - for (const attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr )) { - node.setAttribute(attr, this.attributes[attr]); - } - } - - // Append the children, also as HTML nodes - for (let i = 0; i < this.children.length; i++) { - node.appendChild(this.children[i].toNode()); - } - - return node; -}; - -/** - * Convert into an HTML markup string - */ -const toMarkup = function(tagName) { - let markup = `<${tagName}`; - - // Add the class - if (this.classes.length) { - markup += ` class="${utils.escape(createClass(this.classes))}"`; - } - - let styles = ""; - - // Add the styles, after hyphenation - for (const style in this.style) { - if (Object.prototype.hasOwnProperty.call(this.style, style )) { - styles += `${utils.hyphenate(style)}:${this.style[style]};`; - } - } - - if (styles) { - markup += ` style="${styles}"`; - } - - // Add the attributes - for (const attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr )) { - markup += ` ${attr}="${utils.escape(this.attributes[attr])}"`; - } - } - - markup += ">"; - - // Add the markup of the children, also as markup - for (let i = 0; i < this.children.length; i++) { - markup += this.children[i].toMarkup(); - } - - markup += ``; - - return markup; -}; - -/** - * This node represents a span node, with a className, a list of children, and - * an inline style. - * - */ -class Span { - constructor(classes, children, style) { - initNode.call(this, classes, style); - this.children = children || []; - } - - setAttribute(attribute, value) { - this.attributes[attribute] = value; - } - - toNode() { - return toNode.call(this, "span"); - } - - toMarkup() { - return toMarkup.call(this, "span"); - } -} - -class TextNode$1 { - constructor(text) { - this.text = text; - } - toNode() { - return document.createTextNode(this.text); - } - toMarkup() { - return utils.escape(this.text); - } -} - -/* - * This node represents an image embed () element. - */ -class Img { - constructor(src, alt, style) { - this.alt = alt; - this.src = src; - this.classes = ["mord"]; - this.style = style; - } - - hasClass(className) { - return this.classes.includes(className); - } - - toNode() { - const node = document.createElement("img"); - node.src = this.src; - node.alt = this.alt; - node.className = "mord"; - - // Apply inline styles - for (const style in this.style) { - if (Object.prototype.hasOwnProperty.call(this.style, style )) { - node.style[style] = this.style[style]; - } - } - - return node; - } - - toMarkup() { - let markup = `${this.alt}` and - * `` tags). - */ -class MathNode { - constructor(type, children, classes, style) { - this.type = type; - this.attributes = {}; - this.children = children || []; - this.classes = classes || []; - this.style = style || {}; // Used for elements - } - - /** - * Sets an attribute on a MathML node. MathML depends on attributes to convey a - * semantic content, so this is used heavily. - */ - setAttribute(name, value) { - this.attributes[name] = value; - } - - /** - * Gets an attribute on a MathML node. - */ - getAttribute(name) { - return this.attributes[name]; - } - - /** - * Converts the math node into a MathML-namespaced DOM element. - */ - toNode() { - const node = document.createElementNS("http://www.w3.org/1998/Math/MathML", this.type); - - for (const attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { - node.setAttribute(attr, this.attributes[attr]); - } - } - - if (this.classes.length > 0) { - node.className = createClass(this.classes); - } - - // Apply inline styles - for (const style in this.style) { - if (Object.prototype.hasOwnProperty.call(this.style, style )) { - node.style[style] = this.style[style]; - } - } - - for (let i = 0; i < this.children.length; i++) { - node.appendChild(this.children[i].toNode()); - } - - return node; - } - - /** - * Converts the math node into an HTML markup string. - */ - toMarkup() { - let markup = "<" + this.type; - - // Add the attributes - for (const attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { - markup += " " + attr + '="'; - markup += utils.escape(this.attributes[attr]); - markup += '"'; - } - } - - if (this.classes.length > 0) { - markup += ` class="${utils.escape(createClass(this.classes))}"`; - } - - let styles = ""; - - // Add the styles, after hyphenation - for (const style in this.style) { - if (Object.prototype.hasOwnProperty.call(this.style, style )) { - styles += `${utils.hyphenate(style)}:${this.style[style]};`; - } - } - - if (styles) { - markup += ` style="${styles}"`; - } - - markup += ">"; - - for (let i = 0; i < this.children.length; i++) { - markup += this.children[i].toMarkup(); - } - - markup += ""; - - return markup; - } - - /** - * Converts the math node into a string, similar to innerText, but escaped. - */ - toText() { - return this.children.map((child) => child.toText()).join(""); - } -} - -/** - * This node represents a piece of text. - */ -class TextNode { - constructor(text) { - this.text = text; - } - - /** - * Converts the text node into a DOM text node. - */ - toNode() { - return document.createTextNode(this.text); - } - - /** - * Converts the text node into escaped HTML markup - * (representing the text itself). - */ - toMarkup() { - return utils.escape(this.toText()); - } - - /** - * Converts the text node into a string - * (representing the text itself). - */ - toText() { - return this.text; - } -} - -// Do not make an the only child of a . -// An acts as its own implicit . -const wrapWithMstyle = expression => { - let node; - if (expression.length === 1 && expression[0].type === "mrow") { - node = expression.pop(); - node.type = "mstyle"; - } else { - node = new MathNode("mstyle", expression); - } - return node -}; - -var mathMLTree = { - MathNode, - TextNode, - newDocumentFragment -}; - -/** - * This file provides support for building horizontal stretchy elements. - */ - -// TODO: Remove when Chromium stretches \widetilde & \widehat -const estimatedWidth = node => { - let width = 0; - if (node.body) { - for (const item of node.body) { - width += estimatedWidth(item); - } - } else if (node.type === "supsub") { - width += estimatedWidth(node.base); - if (node.sub) { width += 0.7 * estimatedWidth(node.sub); } - if (node.sup) { width += 0.7 * estimatedWidth(node.sup); } - } else if (node.type === "mathord" || node.type === "textord") { - for (const ch of node.text.split('')) { - const codePoint = ch.codePointAt(0); - if ((0x60 < codePoint && codePoint < 0x7B) || (0x03B0 < codePoint && codePoint < 0x3CA)) { - width += 0.56; // lower case latin or greek. Use advance width of letter n - } else if (0x2F < codePoint && codePoint < 0x3A) { - width += 0.50; // numerals. - } else { - width += 0.92; // advance width of letter M - } - } - } else { - width += 1.0; - } - return width -}; - -const stretchyCodePoint = { - widehat: "^", - widecheck: "ˇ", - widetilde: "~", - wideparen: "⏜", // \u23dc - utilde: "~", - overleftarrow: "\u2190", - underleftarrow: "\u2190", - xleftarrow: "\u2190", - overrightarrow: "\u2192", - underrightarrow: "\u2192", - xrightarrow: "\u2192", - underbrace: "\u23df", - overbrace: "\u23de", - overgroup: "\u23e0", - overparen: "⏜", - undergroup: "\u23e1", - underparen: "\u23dd", - overleftrightarrow: "\u2194", - underleftrightarrow: "\u2194", - xleftrightarrow: "\u2194", - Overrightarrow: "\u21d2", - xRightarrow: "\u21d2", - overleftharpoon: "\u21bc", - xleftharpoonup: "\u21bc", - overrightharpoon: "\u21c0", - xrightharpoonup: "\u21c0", - xLeftarrow: "\u21d0", - xLeftrightarrow: "\u21d4", - xhookleftarrow: "\u21a9", - xhookrightarrow: "\u21aa", - xmapsto: "\u21a6", - xrightharpoondown: "\u21c1", - xleftharpoondown: "\u21bd", - xtwoheadleftarrow: "\u219e", - xtwoheadrightarrow: "\u21a0", - xlongequal: "=", - xrightleftarrows: "\u21c4", - yields: "\u2192", - yieldsLeft: "\u2190", - mesomerism: "\u2194", - longrightharpoonup: "\u21c0", - longleftharpoondown: "\u21bd", - eqrightharpoonup: "\u21c0", - eqleftharpoondown: "\u21bd", - "\\cdrightarrow": "\u2192", - "\\cdleftarrow": "\u2190", - "\\cdlongequal": "=" -}; - -const mathMLnode = function(label) { - const child = new mathMLTree.TextNode(stretchyCodePoint[label.slice(1)]); - const node = new mathMLTree.MathNode("mo", [child]); - node.setAttribute("stretchy", "true"); - return node -}; - -const crookedWides = ["\\widetilde", "\\widehat", "\\widecheck", "\\utilde"]; - -// TODO: Remove when Chromium stretches \widetilde & \widehat -const accentNode = (group) => { - const mo = mathMLnode(group.label); - if (crookedWides.includes(group.label)) { - const width = estimatedWidth(group.base); - if (1 < width && width < 1.6) { - mo.classes.push("tml-crooked-2"); - } else if (1.6 <= width && width < 2.5) { - mo.classes.push("tml-crooked-3"); - } else if (2.5 <= width) { - mo.classes.push("tml-crooked-4"); - } - } - return mo -}; - -var stretchy = { - mathMLnode, - accentNode -}; - -/** - * This file holds a list of all no-argument functions and single-character - * symbols (like 'a' or ';'). - * - * For each of the symbols, there are two properties they can have: - * - group (required): the ParseNode group type the symbol should have (i.e. - "textord", "mathord", etc). - * - replace: the character that this symbol or function should be - * replaced with (i.e. "\phi" has a replace value of "\u03d5", the phi - * character in the main font). - * - * The outermost map in the table indicates what mode the symbols should be - * accepted in (e.g. "math" or "text"). - */ - -// Some of these have a "-token" suffix since these are also used as `ParseNode` -// types for raw text tokens, and we want to avoid conflicts with higher-level -// `ParseNode` types. These `ParseNode`s are constructed within `Parser` by -// looking up the `symbols` map. -const ATOMS = { - bin: 1, - close: 1, - inner: 1, - open: 1, - punct: 1, - rel: 1 -}; -const NON_ATOMS = { - "accent-token": 1, - mathord: 1, - "op-token": 1, - spacing: 1, - textord: 1 -}; - -const symbols = { - math: {}, - text: {} -}; - -/** `acceptUnicodeChar = true` is only applicable if `replace` is set. */ -function defineSymbol(mode, group, replace, name, acceptUnicodeChar) { - symbols[mode][name] = { group, replace }; - - if (acceptUnicodeChar && replace) { - symbols[mode][replace] = symbols[mode][name]; - } -} - -// Some abbreviations for commonly used strings. -// This helps minify the code, and also spotting typos using jshint. - -// modes: -const math = "math"; -const text = "text"; - -// groups: -const accent = "accent-token"; -const bin = "bin"; -const close = "close"; -const inner = "inner"; -const mathord = "mathord"; -const op = "op-token"; -const open = "open"; -const punct = "punct"; -const rel = "rel"; -const spacing = "spacing"; -const textord = "textord"; - -// Now comes the symbol table - -// Relation Symbols -defineSymbol(math, rel, "\u2261", "\\equiv", true); -defineSymbol(math, rel, "\u227a", "\\prec", true); -defineSymbol(math, rel, "\u227b", "\\succ", true); -defineSymbol(math, rel, "\u223c", "\\sim", true); -defineSymbol(math, rel, "\u27c2", "\\perp", true); -defineSymbol(math, rel, "\u2aaf", "\\preceq", true); -defineSymbol(math, rel, "\u2ab0", "\\succeq", true); -defineSymbol(math, rel, "\u2243", "\\simeq", true); -defineSymbol(math, rel, "\u224c", "\\backcong", true); -defineSymbol(math, rel, "|", "\\mid", true); -defineSymbol(math, rel, "\u226a", "\\ll", true); -defineSymbol(math, rel, "\u226b", "\\gg", true); -defineSymbol(math, rel, "\u224d", "\\asymp", true); -defineSymbol(math, rel, "\u2225", "\\parallel"); -defineSymbol(math, rel, "\u2323", "\\smile", true); -defineSymbol(math, rel, "\u2291", "\\sqsubseteq", true); -defineSymbol(math, rel, "\u2292", "\\sqsupseteq", true); -defineSymbol(math, rel, "\u2250", "\\doteq", true); -defineSymbol(math, rel, "\u2322", "\\frown", true); -defineSymbol(math, rel, "\u220b", "\\ni", true); -defineSymbol(math, rel, "\u220c", "\\notni", true); -defineSymbol(math, rel, "\u221d", "\\propto", true); -defineSymbol(math, rel, "\u22a2", "\\vdash", true); -defineSymbol(math, rel, "\u22a3", "\\dashv", true); -defineSymbol(math, rel, "\u220b", "\\owns"); -defineSymbol(math, rel, "\u2258", "\\arceq", true); -defineSymbol(math, rel, "\u2259", "\\wedgeq", true); -defineSymbol(math, rel, "\u225a", "\\veeeq", true); -defineSymbol(math, rel, "\u225b", "\\stareq", true); -defineSymbol(math, rel, "\u225d", "\\eqdef", true); -defineSymbol(math, rel, "\u225e", "\\measeq", true); -defineSymbol(math, rel, "\u225f", "\\questeq", true); -defineSymbol(math, rel, "\u2260", "\\ne", true); -defineSymbol(math, rel, "\u2260", "\\neq"); -// unicodemath -defineSymbol(math, rel, "\u2a75", "\\eqeq", true); -defineSymbol(math, rel, "\u2a76", "\\eqeqeq", true); -// mathtools.sty -defineSymbol(math, rel, "\u2237", "\\dblcolon", true); -defineSymbol(math, rel, "\u2254", "\\coloneqq", true); -defineSymbol(math, rel, "\u2255", "\\eqqcolon", true); -defineSymbol(math, rel, "\u2239", "\\eqcolon", true); -defineSymbol(math, rel, "\u2A74", "\\Coloneqq", true); - -// Punctuation -defineSymbol(math, punct, "\u002e", "\\ldotp"); -defineSymbol(math, punct, "\u00b7", "\\cdotp"); - -// Misc Symbols -defineSymbol(math, textord, "\u0023", "\\#"); -defineSymbol(text, textord, "\u0023", "\\#"); -defineSymbol(math, textord, "\u0026", "\\&"); -defineSymbol(text, textord, "\u0026", "\\&"); -defineSymbol(math, textord, "\u2135", "\\aleph", true); -defineSymbol(math, textord, "\u2200", "\\forall", true); -defineSymbol(math, textord, "\u210f", "\\hbar", true); -defineSymbol(math, textord, "\u2203", "\\exists", true); -// ∇ is actually a unary operator, not binary. But this works. -defineSymbol(math, bin, "\u2207", "\\nabla", true); -defineSymbol(math, textord, "\u266d", "\\flat", true); -defineSymbol(math, textord, "\u2113", "\\ell", true); -defineSymbol(math, textord, "\u266e", "\\natural", true); -defineSymbol(math, textord, "Å", "\\Angstrom", true); -defineSymbol(text, textord, "Å", "\\Angstrom", true); -defineSymbol(math, textord, "\u2663", "\\clubsuit", true); -defineSymbol(math, textord, "\u2667", "\\varclubsuit", true); -defineSymbol(math, textord, "\u2118", "\\wp", true); -defineSymbol(math, textord, "\u266f", "\\sharp", true); -defineSymbol(math, textord, "\u2662", "\\diamondsuit", true); -defineSymbol(math, textord, "\u2666", "\\vardiamondsuit", true); -defineSymbol(math, textord, "\u211c", "\\Re", true); -defineSymbol(math, textord, "\u2661", "\\heartsuit", true); -defineSymbol(math, textord, "\u2665", "\\varheartsuit", true); -defineSymbol(math, textord, "\u2111", "\\Im", true); -defineSymbol(math, textord, "\u2660", "\\spadesuit", true); -defineSymbol(math, textord, "\u2664", "\\varspadesuit", true); -defineSymbol(math, textord, "\u2640", "\\female", true); -defineSymbol(math, textord, "\u2642", "\\male", true); -defineSymbol(math, textord, "\u00a7", "\\S", true); -defineSymbol(text, textord, "\u00a7", "\\S"); -defineSymbol(math, textord, "\u00b6", "\\P", true); -defineSymbol(text, textord, "\u00b6", "\\P"); -defineSymbol(text, textord, "\u263a", "\\smiley", true); -defineSymbol(math, textord, "\u263a", "\\smiley", true); - -// Math and Text -defineSymbol(math, textord, "\u2020", "\\dag"); -defineSymbol(text, textord, "\u2020", "\\dag"); -defineSymbol(text, textord, "\u2020", "\\textdagger"); -defineSymbol(math, textord, "\u2021", "\\ddag"); -defineSymbol(text, textord, "\u2021", "\\ddag"); -defineSymbol(text, textord, "\u2021", "\\textdaggerdbl"); - -// Large Delimiters -defineSymbol(math, close, "\u23b1", "\\rmoustache", true); -defineSymbol(math, open, "\u23b0", "\\lmoustache", true); -defineSymbol(math, close, "\u27ef", "\\rgroup", true); -defineSymbol(math, open, "\u27ee", "\\lgroup", true); - -// Binary Operators -defineSymbol(math, bin, "\u2213", "\\mp", true); -defineSymbol(math, bin, "\u2296", "\\ominus", true); -defineSymbol(math, bin, "\u228e", "\\uplus", true); -defineSymbol(math, bin, "\u2293", "\\sqcap", true); -defineSymbol(math, bin, "\u2217", "\\ast"); -defineSymbol(math, bin, "\u2294", "\\sqcup", true); -defineSymbol(math, bin, "\u25ef", "\\bigcirc", true); -defineSymbol(math, bin, "\u2219", "\\bullet", true); -defineSymbol(math, bin, "\u2021", "\\ddagger"); -defineSymbol(math, bin, "\u2240", "\\wr", true); -defineSymbol(math, bin, "\u2a3f", "\\amalg"); -defineSymbol(math, bin, "\u0026", "\\And"); // from amsmath -defineSymbol(math, bin, "\u2AFD", "\\sslash", true); // from stmaryrd - -// Arrow Symbols -defineSymbol(math, rel, "\u27f5", "\\longleftarrow", true); -defineSymbol(math, rel, "\u21d0", "\\Leftarrow", true); -defineSymbol(math, rel, "\u27f8", "\\Longleftarrow", true); -defineSymbol(math, rel, "\u27f6", "\\longrightarrow", true); -defineSymbol(math, rel, "\u21d2", "\\Rightarrow", true); -defineSymbol(math, rel, "\u27f9", "\\Longrightarrow", true); -defineSymbol(math, rel, "\u2194", "\\leftrightarrow", true); -defineSymbol(math, rel, "\u27f7", "\\longleftrightarrow", true); -defineSymbol(math, rel, "\u21d4", "\\Leftrightarrow", true); -defineSymbol(math, rel, "\u27fa", "\\Longleftrightarrow", true); -defineSymbol(math, rel, "\u21a4", "\\mapsfrom", true); -defineSymbol(math, rel, "\u21a6", "\\mapsto", true); -defineSymbol(math, rel, "\u27fc", "\\longmapsto", true); -defineSymbol(math, rel, "\u2197", "\\nearrow", true); -defineSymbol(math, rel, "\u21a9", "\\hookleftarrow", true); -defineSymbol(math, rel, "\u21aa", "\\hookrightarrow", true); -defineSymbol(math, rel, "\u2198", "\\searrow", true); -defineSymbol(math, rel, "\u21bc", "\\leftharpoonup", true); -defineSymbol(math, rel, "\u21c0", "\\rightharpoonup", true); -defineSymbol(math, rel, "\u2199", "\\swarrow", true); -defineSymbol(math, rel, "\u21bd", "\\leftharpoondown", true); -defineSymbol(math, rel, "\u21c1", "\\rightharpoondown", true); -defineSymbol(math, rel, "\u2196", "\\nwarrow", true); -defineSymbol(math, rel, "\u21cc", "\\rightleftharpoons", true); -defineSymbol(math, mathord, "\u21af", "\\lightning", true); -defineSymbol(math, mathord, "\u220E", "\\QED", true); -defineSymbol(math, mathord, "\u2030", "\\permil", true); -defineSymbol(text, textord, "\u2030", "\\permil"); -defineSymbol(math, mathord, "\u2609", "\\astrosun", true); -defineSymbol(math, mathord, "\u263c", "\\sun", true); -defineSymbol(math, mathord, "\u263e", "\\leftmoon", true); -defineSymbol(math, mathord, "\u263d", "\\rightmoon", true); -defineSymbol(math, mathord, "\u2295", "\\Earth"); - -// AMS Negated Binary Relations -defineSymbol(math, rel, "\u226e", "\\nless", true); -// Symbol names preceeded by "@" each have a corresponding macro. -defineSymbol(math, rel, "\u2a87", "\\lneq", true); -defineSymbol(math, rel, "\u2268", "\\lneqq", true); -defineSymbol(math, rel, "\u2268\ufe00", "\\lvertneqq"); -defineSymbol(math, rel, "\u22e6", "\\lnsim", true); -defineSymbol(math, rel, "\u2a89", "\\lnapprox", true); -defineSymbol(math, rel, "\u2280", "\\nprec", true); -// unicode-math maps \u22e0 to \npreccurlyeq. We'll use the AMS synonym. -defineSymbol(math, rel, "\u22e0", "\\npreceq", true); -defineSymbol(math, rel, "\u22e8", "\\precnsim", true); -defineSymbol(math, rel, "\u2ab9", "\\precnapprox", true); -defineSymbol(math, rel, "\u2241", "\\nsim", true); -defineSymbol(math, rel, "\u2224", "\\nmid", true); -defineSymbol(math, rel, "\u2224", "\\nshortmid"); -defineSymbol(math, rel, "\u22ac", "\\nvdash", true); -defineSymbol(math, rel, "\u22ad", "\\nvDash", true); -defineSymbol(math, rel, "\u22ea", "\\ntriangleleft"); -defineSymbol(math, rel, "\u22ec", "\\ntrianglelefteq", true); -defineSymbol(math, rel, "\u2284", "\\nsubset", true); -defineSymbol(math, rel, "\u2285", "\\nsupset", true); -defineSymbol(math, rel, "\u228a", "\\subsetneq", true); -defineSymbol(math, rel, "\u228a\ufe00", "\\varsubsetneq"); -defineSymbol(math, rel, "\u2acb", "\\subsetneqq", true); -defineSymbol(math, rel, "\u2acb\ufe00", "\\varsubsetneqq"); -defineSymbol(math, rel, "\u226f", "\\ngtr", true); -defineSymbol(math, rel, "\u2a88", "\\gneq", true); -defineSymbol(math, rel, "\u2269", "\\gneqq", true); -defineSymbol(math, rel, "\u2269\ufe00", "\\gvertneqq"); -defineSymbol(math, rel, "\u22e7", "\\gnsim", true); -defineSymbol(math, rel, "\u2a8a", "\\gnapprox", true); -defineSymbol(math, rel, "\u2281", "\\nsucc", true); -// unicode-math maps \u22e1 to \nsucccurlyeq. We'll use the AMS synonym. -defineSymbol(math, rel, "\u22e1", "\\nsucceq", true); -defineSymbol(math, rel, "\u22e9", "\\succnsim", true); -defineSymbol(math, rel, "\u2aba", "\\succnapprox", true); -// unicode-math maps \u2246 to \simneqq. We'll use the AMS synonym. -defineSymbol(math, rel, "\u2246", "\\ncong", true); -defineSymbol(math, rel, "\u2226", "\\nparallel", true); -defineSymbol(math, rel, "\u2226", "\\nshortparallel"); -defineSymbol(math, rel, "\u22af", "\\nVDash", true); -defineSymbol(math, rel, "\u22eb", "\\ntriangleright"); -defineSymbol(math, rel, "\u22ed", "\\ntrianglerighteq", true); -defineSymbol(math, rel, "\u228b", "\\supsetneq", true); -defineSymbol(math, rel, "\u228b", "\\varsupsetneq"); -defineSymbol(math, rel, "\u2acc", "\\supsetneqq", true); -defineSymbol(math, rel, "\u2acc\ufe00", "\\varsupsetneqq"); -defineSymbol(math, rel, "\u22ae", "\\nVdash", true); -defineSymbol(math, rel, "\u2ab5", "\\precneqq", true); -defineSymbol(math, rel, "\u2ab6", "\\succneqq", true); -defineSymbol(math, bin, "\u22b4", "\\unlhd"); -defineSymbol(math, bin, "\u22b5", "\\unrhd"); - -// AMS Negated Arrows -defineSymbol(math, rel, "\u219a", "\\nleftarrow", true); -defineSymbol(math, rel, "\u219b", "\\nrightarrow", true); -defineSymbol(math, rel, "\u21cd", "\\nLeftarrow", true); -defineSymbol(math, rel, "\u21cf", "\\nRightarrow", true); -defineSymbol(math, rel, "\u21ae", "\\nleftrightarrow", true); -defineSymbol(math, rel, "\u21ce", "\\nLeftrightarrow", true); - -// AMS Misc -defineSymbol(math, rel, "\u25b3", "\\vartriangle"); -defineSymbol(math, textord, "\u210f", "\\hslash"); -defineSymbol(math, textord, "\u25bd", "\\triangledown"); -defineSymbol(math, textord, "\u25ca", "\\lozenge"); -defineSymbol(math, textord, "\u24c8", "\\circledS"); -defineSymbol(math, textord, "\u00ae", "\\circledR", true); -defineSymbol(text, textord, "\u00ae", "\\circledR"); -defineSymbol(text, textord, "\u00ae", "\\textregistered"); -defineSymbol(math, textord, "\u2221", "\\measuredangle", true); -defineSymbol(math, textord, "\u2204", "\\nexists"); -defineSymbol(math, textord, "\u2127", "\\mho"); -defineSymbol(math, textord, "\u2132", "\\Finv", true); -defineSymbol(math, textord, "\u2141", "\\Game", true); -defineSymbol(math, textord, "\u2035", "\\backprime"); -defineSymbol(math, textord, "\u2036", "\\backdprime"); -defineSymbol(math, textord, "\u2037", "\\backtrprime"); -defineSymbol(math, textord, "\u25b2", "\\blacktriangle"); -defineSymbol(math, textord, "\u25bc", "\\blacktriangledown"); -defineSymbol(math, textord, "\u25a0", "\\blacksquare"); -defineSymbol(math, textord, "\u29eb", "\\blacklozenge"); -defineSymbol(math, textord, "\u2605", "\\bigstar"); -defineSymbol(math, textord, "\u2222", "\\sphericalangle", true); -defineSymbol(math, textord, "\u2201", "\\complement", true); -// unicode-math maps U+F0 to \matheth. We map to AMS function \eth -defineSymbol(math, textord, "\u00f0", "\\eth", true); -defineSymbol(text, textord, "\u00f0", "\u00f0"); -defineSymbol(math, textord, "\u2571", "\\diagup"); -defineSymbol(math, textord, "\u2572", "\\diagdown"); -defineSymbol(math, textord, "\u25a1", "\\square"); -defineSymbol(math, textord, "\u25a1", "\\Box"); -defineSymbol(math, textord, "\u25ca", "\\Diamond"); -// unicode-math maps U+A5 to \mathyen. We map to AMS function \yen -defineSymbol(math, textord, "\u00a5", "\\yen", true); -defineSymbol(text, textord, "\u00a5", "\\yen", true); -defineSymbol(math, textord, "\u2713", "\\checkmark", true); -defineSymbol(text, textord, "\u2713", "\\checkmark"); -defineSymbol(math, textord, "\u2717", "\\ballotx", true); -defineSymbol(text, textord, "\u2717", "\\ballotx"); -defineSymbol(text, textord, "\u2022", "\\textbullet"); - -// AMS Hebrew -defineSymbol(math, textord, "\u2136", "\\beth", true); -defineSymbol(math, textord, "\u2138", "\\daleth", true); -defineSymbol(math, textord, "\u2137", "\\gimel", true); - -// AMS Greek -defineSymbol(math, textord, "\u03dd", "\\digamma", true); -defineSymbol(math, textord, "\u03f0", "\\varkappa"); - -// AMS Delimiters -defineSymbol(math, open, "\u231C", "\\ulcorner", true); -defineSymbol(math, close, "\u231D", "\\urcorner", true); -defineSymbol(math, open, "\u231E", "\\llcorner", true); -defineSymbol(math, close, "\u231F", "\\lrcorner", true); - -// AMS Binary Relations -defineSymbol(math, rel, "\u2266", "\\leqq", true); -defineSymbol(math, rel, "\u2a7d", "\\leqslant", true); -defineSymbol(math, rel, "\u2a95", "\\eqslantless", true); -defineSymbol(math, rel, "\u2272", "\\lesssim", true); -defineSymbol(math, rel, "\u2a85", "\\lessapprox", true); -defineSymbol(math, rel, "\u224a", "\\approxeq", true); -defineSymbol(math, bin, "\u22d6", "\\lessdot"); -defineSymbol(math, rel, "\u22d8", "\\lll", true); -defineSymbol(math, rel, "\u2276", "\\lessgtr", true); -defineSymbol(math, rel, "\u22da", "\\lesseqgtr", true); -defineSymbol(math, rel, "\u2a8b", "\\lesseqqgtr", true); -defineSymbol(math, rel, "\u2251", "\\doteqdot"); -defineSymbol(math, rel, "\u2253", "\\risingdotseq", true); -defineSymbol(math, rel, "\u2252", "\\fallingdotseq", true); -defineSymbol(math, rel, "\u223d", "\\backsim", true); -defineSymbol(math, rel, "\u22cd", "\\backsimeq", true); -defineSymbol(math, rel, "\u2ac5", "\\subseteqq", true); -defineSymbol(math, rel, "\u22d0", "\\Subset", true); -defineSymbol(math, rel, "\u228f", "\\sqsubset", true); -defineSymbol(math, rel, "\u227c", "\\preccurlyeq", true); -defineSymbol(math, rel, "\u22de", "\\curlyeqprec", true); -defineSymbol(math, rel, "\u227e", "\\precsim", true); -defineSymbol(math, rel, "\u2ab7", "\\precapprox", true); -defineSymbol(math, rel, "\u22b2", "\\vartriangleleft"); -defineSymbol(math, rel, "\u22b4", "\\trianglelefteq"); -defineSymbol(math, rel, "\u22a8", "\\vDash", true); -defineSymbol(math, rel, "\u22ab", "\\VDash", true); -defineSymbol(math, rel, "\u22aa", "\\Vvdash", true); -defineSymbol(math, rel, "\u2323", "\\smallsmile"); -defineSymbol(math, rel, "\u2322", "\\smallfrown"); -defineSymbol(math, rel, "\u224f", "\\bumpeq", true); -defineSymbol(math, rel, "\u224e", "\\Bumpeq", true); -defineSymbol(math, rel, "\u2267", "\\geqq", true); -defineSymbol(math, rel, "\u2a7e", "\\geqslant", true); -defineSymbol(math, rel, "\u2a96", "\\eqslantgtr", true); -defineSymbol(math, rel, "\u2273", "\\gtrsim", true); -defineSymbol(math, rel, "\u2a86", "\\gtrapprox", true); -defineSymbol(math, bin, "\u22d7", "\\gtrdot"); -defineSymbol(math, rel, "\u22d9", "\\ggg", true); -defineSymbol(math, rel, "\u2277", "\\gtrless", true); -defineSymbol(math, rel, "\u22db", "\\gtreqless", true); -defineSymbol(math, rel, "\u2a8c", "\\gtreqqless", true); -defineSymbol(math, rel, "\u2256", "\\eqcirc", true); -defineSymbol(math, rel, "\u2257", "\\circeq", true); -defineSymbol(math, rel, "\u225c", "\\triangleq", true); -defineSymbol(math, rel, "\u223c", "\\thicksim"); -defineSymbol(math, rel, "\u2248", "\\thickapprox"); -defineSymbol(math, rel, "\u2ac6", "\\supseteqq", true); -defineSymbol(math, rel, "\u22d1", "\\Supset", true); -defineSymbol(math, rel, "\u2290", "\\sqsupset", true); -defineSymbol(math, rel, "\u227d", "\\succcurlyeq", true); -defineSymbol(math, rel, "\u22df", "\\curlyeqsucc", true); -defineSymbol(math, rel, "\u227f", "\\succsim", true); -defineSymbol(math, rel, "\u2ab8", "\\succapprox", true); -defineSymbol(math, rel, "\u22b3", "\\vartriangleright"); -defineSymbol(math, rel, "\u22b5", "\\trianglerighteq"); -defineSymbol(math, rel, "\u22a9", "\\Vdash", true); -defineSymbol(math, rel, "\u2223", "\\shortmid"); -defineSymbol(math, rel, "\u2225", "\\shortparallel"); -defineSymbol(math, rel, "\u226c", "\\between", true); -defineSymbol(math, rel, "\u22d4", "\\pitchfork", true); -defineSymbol(math, rel, "\u221d", "\\varpropto"); -defineSymbol(math, rel, "\u25c0", "\\blacktriangleleft"); -// unicode-math says that \therefore is a mathord atom. -// We kept the amssymb atom type, which is rel. -defineSymbol(math, rel, "\u2234", "\\therefore", true); -defineSymbol(math, rel, "\u220d", "\\backepsilon"); -defineSymbol(math, rel, "\u25b6", "\\blacktriangleright"); -// unicode-math says that \because is a mathord atom. -// We kept the amssymb atom type, which is rel. -defineSymbol(math, rel, "\u2235", "\\because", true); -defineSymbol(math, rel, "\u22d8", "\\llless"); -defineSymbol(math, rel, "\u22d9", "\\gggtr"); -defineSymbol(math, bin, "\u22b2", "\\lhd"); -defineSymbol(math, bin, "\u22b3", "\\rhd"); -defineSymbol(math, rel, "\u2242", "\\eqsim", true); -defineSymbol(math, rel, "\u2251", "\\Doteq", true); -defineSymbol(math, rel, "\u297d", "\\strictif", true); -defineSymbol(math, rel, "\u297c", "\\strictfi", true); - -// AMS Binary Operators -defineSymbol(math, bin, "\u2214", "\\dotplus", true); -defineSymbol(math, bin, "\u2216", "\\smallsetminus"); -defineSymbol(math, bin, "\u22d2", "\\Cap", true); -defineSymbol(math, bin, "\u22d3", "\\Cup", true); -defineSymbol(math, bin, "\u2a5e", "\\doublebarwedge", true); -defineSymbol(math, bin, "\u229f", "\\boxminus", true); -defineSymbol(math, bin, "\u229e", "\\boxplus", true); -defineSymbol(math, bin, "\u22c7", "\\divideontimes", true); -defineSymbol(math, bin, "\u22c9", "\\ltimes", true); -defineSymbol(math, bin, "\u22ca", "\\rtimes", true); -defineSymbol(math, bin, "\u22cb", "\\leftthreetimes", true); -defineSymbol(math, bin, "\u22cc", "\\rightthreetimes", true); -defineSymbol(math, bin, "\u22cf", "\\curlywedge", true); -defineSymbol(math, bin, "\u22ce", "\\curlyvee", true); -defineSymbol(math, bin, "\u229d", "\\circleddash", true); -defineSymbol(math, bin, "\u229b", "\\circledast", true); -defineSymbol(math, bin, "\u22ba", "\\intercal", true); -defineSymbol(math, bin, "\u22d2", "\\doublecap"); -defineSymbol(math, bin, "\u22d3", "\\doublecup"); -defineSymbol(math, bin, "\u22a0", "\\boxtimes", true); -defineSymbol(math, bin, "\u22c8", "\\bowtie", true); -defineSymbol(math, bin, "\u22c8", "\\Join"); -defineSymbol(math, bin, "\u27d5", "\\leftouterjoin", true); -defineSymbol(math, bin, "\u27d6", "\\rightouterjoin", true); -defineSymbol(math, bin, "\u27d7", "\\fullouterjoin", true); - -// stix Binary Operators -defineSymbol(math, bin, "\u2238", "\\dotminus", true); -defineSymbol(math, bin, "\u27D1", "\\wedgedot", true); -defineSymbol(math, bin, "\u27C7", "\\veedot", true); -defineSymbol(math, bin, "\u2A62", "\\doublebarvee", true); -defineSymbol(math, bin, "\u2A63", "\\veedoublebar", true); -defineSymbol(math, bin, "\u2A5F", "\\wedgebar", true); -defineSymbol(math, bin, "\u2A60", "\\wedgedoublebar", true); -defineSymbol(math, bin, "\u2A54", "\\Vee", true); -defineSymbol(math, bin, "\u2A53", "\\Wedge", true); -defineSymbol(math, bin, "\u2A43", "\\barcap", true); -defineSymbol(math, bin, "\u2A42", "\\barcup", true); -defineSymbol(math, bin, "\u2A48", "\\capbarcup", true); -defineSymbol(math, bin, "\u2A40", "\\capdot", true); -defineSymbol(math, bin, "\u2A47", "\\capovercup", true); -defineSymbol(math, bin, "\u2A46", "\\cupovercap", true); -defineSymbol(math, bin, "\u2A4D", "\\closedvarcap", true); -defineSymbol(math, bin, "\u2A4C", "\\closedvarcup", true); -defineSymbol(math, bin, "\u2A2A", "\\minusdot", true); -defineSymbol(math, bin, "\u2A2B", "\\minusfdots", true); -defineSymbol(math, bin, "\u2A2C", "\\minusrdots", true); -defineSymbol(math, bin, "\u22BB", "\\Xor", true); -defineSymbol(math, bin, "\u22BC", "\\Nand", true); -defineSymbol(math, bin, "\u22BD", "\\Nor", true); -defineSymbol(math, bin, "\u22BD", "\\barvee"); -defineSymbol(math, bin, "\u2AF4", "\\interleave", true); -defineSymbol(math, bin, "\u29E2", "\\shuffle", true); -defineSymbol(math, bin, "\u2AF6", "\\threedotcolon", true); -defineSymbol(math, bin, "\u2982", "\\typecolon", true); -defineSymbol(math, bin, "\u223E", "\\invlazys", true); -defineSymbol(math, bin, "\u2A4B", "\\twocaps", true); -defineSymbol(math, bin, "\u2A4A", "\\twocups", true); -defineSymbol(math, bin, "\u2A4E", "\\Sqcap", true); -defineSymbol(math, bin, "\u2A4F", "\\Sqcup", true); -defineSymbol(math, bin, "\u2A56", "\\veeonvee", true); -defineSymbol(math, bin, "\u2A55", "\\wedgeonwedge", true); -defineSymbol(math, bin, "\u29D7", "\\blackhourglass", true); -defineSymbol(math, bin, "\u29C6", "\\boxast", true); -defineSymbol(math, bin, "\u29C8", "\\boxbox", true); -defineSymbol(math, bin, "\u29C7", "\\boxcircle", true); -defineSymbol(math, bin, "\u229C", "\\circledequal", true); -defineSymbol(math, bin, "\u29B7", "\\circledparallel", true); -defineSymbol(math, bin, "\u29B6", "\\circledvert", true); -defineSymbol(math, bin, "\u29B5", "\\circlehbar", true); -defineSymbol(math, bin, "\u27E1", "\\concavediamond", true); -defineSymbol(math, bin, "\u27E2", "\\concavediamondtickleft", true); -defineSymbol(math, bin, "\u27E3", "\\concavediamondtickright", true); -defineSymbol(math, bin, "\u22C4", "\\diamond", true); -defineSymbol(math, bin, "\u29D6", "\\hourglass", true); -defineSymbol(math, bin, "\u27E0", "\\lozengeminus", true); -defineSymbol(math, bin, "\u233D", "\\obar", true); -defineSymbol(math, bin, "\u29B8", "\\obslash", true); -defineSymbol(math, bin, "\u2A38", "\\odiv", true); -defineSymbol(math, bin, "\u29C1", "\\ogreaterthan", true); -defineSymbol(math, bin, "\u29C0", "\\olessthan", true); -defineSymbol(math, bin, "\u29B9", "\\operp", true); -defineSymbol(math, bin, "\u2A37", "\\Otimes", true); -defineSymbol(math, bin, "\u2A36", "\\otimeshat", true); -defineSymbol(math, bin, "\u22C6", "\\star", true); -defineSymbol(math, bin, "\u25B3", "\\triangle", true); -defineSymbol(math, bin, "\u2A3A", "\\triangleminus", true); -defineSymbol(math, bin, "\u2A39", "\\triangleplus", true); -defineSymbol(math, bin, "\u2A3B", "\\triangletimes", true); -defineSymbol(math, bin, "\u27E4", "\\whitesquaretickleft", true); -defineSymbol(math, bin, "\u27E5", "\\whitesquaretickright", true); -defineSymbol(math, bin, "\u2A33", "\\smashtimes", true); - -// AMS Arrows -// Note: unicode-math maps \u21e2 to their own function \rightdasharrow. -// We'll map it to AMS function \dashrightarrow. It produces the same atom. -defineSymbol(math, rel, "\u21e2", "\\dashrightarrow", true); -// unicode-math maps \u21e0 to \leftdasharrow. We'll use the AMS synonym. -defineSymbol(math, rel, "\u21e0", "\\dashleftarrow", true); -defineSymbol(math, rel, "\u21c7", "\\leftleftarrows", true); -defineSymbol(math, rel, "\u21c6", "\\leftrightarrows", true); -defineSymbol(math, rel, "\u21da", "\\Lleftarrow", true); -defineSymbol(math, rel, "\u219e", "\\twoheadleftarrow", true); -defineSymbol(math, rel, "\u21a2", "\\leftarrowtail", true); -defineSymbol(math, rel, "\u21ab", "\\looparrowleft", true); -defineSymbol(math, rel, "\u21cb", "\\leftrightharpoons", true); -defineSymbol(math, rel, "\u21b6", "\\curvearrowleft", true); -// unicode-math maps \u21ba to \acwopencirclearrow. We'll use the AMS synonym. -defineSymbol(math, rel, "\u21ba", "\\circlearrowleft", true); -defineSymbol(math, rel, "\u21b0", "\\Lsh", true); -defineSymbol(math, rel, "\u21c8", "\\upuparrows", true); -defineSymbol(math, rel, "\u21bf", "\\upharpoonleft", true); -defineSymbol(math, rel, "\u21c3", "\\downharpoonleft", true); -defineSymbol(math, rel, "\u22b6", "\\origof", true); -defineSymbol(math, rel, "\u22b7", "\\imageof", true); -defineSymbol(math, rel, "\u22b8", "\\multimap", true); -defineSymbol(math, rel, "\u21ad", "\\leftrightsquigarrow", true); -defineSymbol(math, rel, "\u21c9", "\\rightrightarrows", true); -defineSymbol(math, rel, "\u21c4", "\\rightleftarrows", true); -defineSymbol(math, rel, "\u21a0", "\\twoheadrightarrow", true); -defineSymbol(math, rel, "\u21a3", "\\rightarrowtail", true); -defineSymbol(math, rel, "\u21ac", "\\looparrowright", true); -defineSymbol(math, rel, "\u21b7", "\\curvearrowright", true); -// unicode-math maps \u21bb to \cwopencirclearrow. We'll use the AMS synonym. -defineSymbol(math, rel, "\u21bb", "\\circlearrowright", true); -defineSymbol(math, rel, "\u21b1", "\\Rsh", true); -defineSymbol(math, rel, "\u21ca", "\\downdownarrows", true); -defineSymbol(math, rel, "\u21be", "\\upharpoonright", true); -defineSymbol(math, rel, "\u21c2", "\\downharpoonright", true); -defineSymbol(math, rel, "\u21dd", "\\rightsquigarrow", true); -defineSymbol(math, rel, "\u21dd", "\\leadsto"); -defineSymbol(math, rel, "\u21db", "\\Rrightarrow", true); -defineSymbol(math, rel, "\u21be", "\\restriction"); - -defineSymbol(math, textord, "\u2018", "`"); -defineSymbol(math, textord, "$", "\\$"); -defineSymbol(text, textord, "$", "\\$"); -defineSymbol(text, textord, "$", "\\textdollar"); -defineSymbol(math, textord, "¢", "\\cent"); -defineSymbol(text, textord, "¢", "\\cent"); -defineSymbol(math, textord, "%", "\\%"); -defineSymbol(text, textord, "%", "\\%"); -defineSymbol(math, textord, "_", "\\_"); -defineSymbol(text, textord, "_", "\\_"); -defineSymbol(text, textord, "_", "\\textunderscore"); -defineSymbol(text, textord, "\u2423", "\\textvisiblespace", true); -defineSymbol(math, textord, "\u2220", "\\angle", true); -defineSymbol(math, textord, "\u221e", "\\infty", true); -defineSymbol(math, textord, "\u2032", "\\prime"); -defineSymbol(math, textord, "\u2033", "\\dprime"); -defineSymbol(math, textord, "\u2034", "\\trprime"); -defineSymbol(math, textord, "\u2057", "\\qprime"); -defineSymbol(math, textord, "\u25b3", "\\triangle"); -defineSymbol(text, textord, "\u0391", "\\Alpha", true); -defineSymbol(text, textord, "\u0392", "\\Beta", true); -defineSymbol(text, textord, "\u0393", "\\Gamma", true); -defineSymbol(text, textord, "\u0394", "\\Delta", true); -defineSymbol(text, textord, "\u0395", "\\Epsilon", true); -defineSymbol(text, textord, "\u0396", "\\Zeta", true); -defineSymbol(text, textord, "\u0397", "\\Eta", true); -defineSymbol(text, textord, "\u0398", "\\Theta", true); -defineSymbol(text, textord, "\u0399", "\\Iota", true); -defineSymbol(text, textord, "\u039a", "\\Kappa", true); -defineSymbol(text, textord, "\u039b", "\\Lambda", true); -defineSymbol(text, textord, "\u039c", "\\Mu", true); -defineSymbol(text, textord, "\u039d", "\\Nu", true); -defineSymbol(text, textord, "\u039e", "\\Xi", true); -defineSymbol(text, textord, "\u039f", "\\Omicron", true); -defineSymbol(text, textord, "\u03a0", "\\Pi", true); -defineSymbol(text, textord, "\u03a1", "\\Rho", true); -defineSymbol(text, textord, "\u03a3", "\\Sigma", true); -defineSymbol(text, textord, "\u03a4", "\\Tau", true); -defineSymbol(text, textord, "\u03a5", "\\Upsilon", true); -defineSymbol(text, textord, "\u03a6", "\\Phi", true); -defineSymbol(text, textord, "\u03a7", "\\Chi", true); -defineSymbol(text, textord, "\u03a8", "\\Psi", true); -defineSymbol(text, textord, "\u03a9", "\\Omega", true); -defineSymbol(math, mathord, "\u0391", "\\Alpha", true); -defineSymbol(math, mathord, "\u0392", "\\Beta", true); -defineSymbol(math, mathord, "\u0393", "\\Gamma", true); -defineSymbol(math, mathord, "\u0394", "\\Delta", true); -defineSymbol(math, mathord, "\u0395", "\\Epsilon", true); -defineSymbol(math, mathord, "\u0396", "\\Zeta", true); -defineSymbol(math, mathord, "\u0397", "\\Eta", true); -defineSymbol(math, mathord, "\u0398", "\\Theta", true); -defineSymbol(math, mathord, "\u0399", "\\Iota", true); -defineSymbol(math, mathord, "\u039a", "\\Kappa", true); -defineSymbol(math, mathord, "\u039b", "\\Lambda", true); -defineSymbol(math, mathord, "\u039c", "\\Mu", true); -defineSymbol(math, mathord, "\u039d", "\\Nu", true); -defineSymbol(math, mathord, "\u039e", "\\Xi", true); -defineSymbol(math, mathord, "\u039f", "\\Omicron", true); -defineSymbol(math, mathord, "\u03a0", "\\Pi", true); -defineSymbol(math, mathord, "\u03a1", "\\Rho", true); -defineSymbol(math, mathord, "\u03a3", "\\Sigma", true); -defineSymbol(math, mathord, "\u03a4", "\\Tau", true); -defineSymbol(math, mathord, "\u03a5", "\\Upsilon", true); -defineSymbol(math, mathord, "\u03a6", "\\Phi", true); -defineSymbol(math, mathord, "\u03a7", "\\Chi", true); -defineSymbol(math, mathord, "\u03a8", "\\Psi", true); -defineSymbol(math, mathord, "\u03a9", "\\Omega", true); -defineSymbol(math, open, "\u00ac", "\\neg", true); -defineSymbol(math, open, "\u00ac", "\\lnot"); -defineSymbol(math, textord, "\u22a4", "\\top"); -defineSymbol(math, textord, "\u22a5", "\\bot"); -defineSymbol(math, textord, "\u2205", "\\emptyset"); -defineSymbol(math, textord, "\u2300", "\\varnothing"); -defineSymbol(math, mathord, "\u03b1", "\\alpha", true); -defineSymbol(math, mathord, "\u03b2", "\\beta", true); -defineSymbol(math, mathord, "\u03b3", "\\gamma", true); -defineSymbol(math, mathord, "\u03b4", "\\delta", true); -defineSymbol(math, mathord, "\u03f5", "\\epsilon", true); -defineSymbol(math, mathord, "\u03b6", "\\zeta", true); -defineSymbol(math, mathord, "\u03b7", "\\eta", true); -defineSymbol(math, mathord, "\u03b8", "\\theta", true); -defineSymbol(math, mathord, "\u03b9", "\\iota", true); -defineSymbol(math, mathord, "\u03ba", "\\kappa", true); -defineSymbol(math, mathord, "\u03bb", "\\lambda", true); -defineSymbol(math, mathord, "\u03bc", "\\mu", true); -defineSymbol(math, mathord, "\u03bd", "\\nu", true); -defineSymbol(math, mathord, "\u03be", "\\xi", true); -defineSymbol(math, mathord, "\u03bf", "\\omicron", true); -defineSymbol(math, mathord, "\u03c0", "\\pi", true); -defineSymbol(math, mathord, "\u03c1", "\\rho", true); -defineSymbol(math, mathord, "\u03c3", "\\sigma", true); -defineSymbol(math, mathord, "\u03c4", "\\tau", true); -defineSymbol(math, mathord, "\u03c5", "\\upsilon", true); -defineSymbol(math, mathord, "\u03d5", "\\phi", true); -defineSymbol(math, mathord, "\u03c7", "\\chi", true); -defineSymbol(math, mathord, "\u03c8", "\\psi", true); -defineSymbol(math, mathord, "\u03c9", "\\omega", true); -defineSymbol(math, mathord, "\u03b5", "\\varepsilon", true); -defineSymbol(math, mathord, "\u03d1", "\\vartheta", true); -defineSymbol(math, mathord, "\u03d6", "\\varpi", true); -defineSymbol(math, mathord, "\u03f1", "\\varrho", true); -defineSymbol(math, mathord, "\u03c2", "\\varsigma", true); -defineSymbol(math, mathord, "\u03c6", "\\varphi", true); -defineSymbol(math, mathord, "\u03d8", "\\Coppa", true); -defineSymbol(math, mathord, "\u03d9", "\\coppa", true); -defineSymbol(math, mathord, "\u03d9", "\\varcoppa", true); -defineSymbol(math, mathord, "\u03de", "\\Koppa", true); -defineSymbol(math, mathord, "\u03df", "\\koppa", true); -defineSymbol(math, mathord, "\u03e0", "\\Sampi", true); -defineSymbol(math, mathord, "\u03e1", "\\sampi", true); -defineSymbol(math, mathord, "\u03da", "\\Stigma", true); -defineSymbol(math, mathord, "\u03db", "\\stigma", true); -defineSymbol(math, mathord, "\u2aeb", "\\Bot"); -defineSymbol(math, bin, "\u2217", "\u2217", true); -defineSymbol(math, bin, "+", "+"); -defineSymbol(math, bin, "*", "*"); -defineSymbol(math, bin, "\u2044", "/", true); -defineSymbol(math, bin, "\u2044", "\u2044"); -defineSymbol(math, bin, "\u2212", "-", true); -defineSymbol(math, bin, "\u22c5", "\\cdot", true); -defineSymbol(math, bin, "\u2218", "\\circ", true); -defineSymbol(math, bin, "\u00f7", "\\div", true); -defineSymbol(math, bin, "\u00b1", "\\pm", true); -defineSymbol(math, bin, "\u00d7", "\\times", true); -defineSymbol(math, bin, "\u2229", "\\cap", true); -defineSymbol(math, bin, "\u222a", "\\cup", true); -defineSymbol(math, bin, "\u2216", "\\setminus", true); -defineSymbol(math, bin, "\u2227", "\\land"); -defineSymbol(math, bin, "\u2228", "\\lor"); -defineSymbol(math, bin, "\u2227", "\\wedge", true); -defineSymbol(math, bin, "\u2228", "\\vee", true); -defineSymbol(math, open, "\u27e6", "\\llbracket", true); // stmaryrd/semantic packages -defineSymbol(math, close, "\u27e7", "\\rrbracket", true); -defineSymbol(math, open, "\u27e8", "\\langle", true); -defineSymbol(math, open, "\u27ea", "\\lAngle", true); -defineSymbol(math, open, "\u2989", "\\llangle", true); -defineSymbol(math, open, "|", "\\lvert"); -defineSymbol(math, open, "\u2016", "\\lVert"); -defineSymbol(math, textord, "!", "\\oc"); // cmll package -defineSymbol(math, textord, "?", "\\wn"); -defineSymbol(math, textord, "\u2193", "\\shpos"); -defineSymbol(math, textord, "\u2195", "\\shift"); -defineSymbol(math, textord, "\u2191", "\\shneg"); -defineSymbol(math, close, "?", "?"); -defineSymbol(math, close, "!", "!"); -defineSymbol(math, close, "‼", "‼"); -defineSymbol(math, close, "\u27e9", "\\rangle", true); -defineSymbol(math, close, "\u27eb", "\\rAngle", true); -defineSymbol(math, close, "\u298a", "\\rrangle", true); -defineSymbol(math, close, "|", "\\rvert"); -defineSymbol(math, close, "\u2016", "\\rVert"); -defineSymbol(math, open, "\u2983", "\\lBrace", true); // stmaryrd/semantic packages -defineSymbol(math, close, "\u2984", "\\rBrace", true); -defineSymbol(math, rel, "=", "\\equal", true); -defineSymbol(math, rel, ":", ":"); -defineSymbol(math, rel, "\u2248", "\\approx", true); -defineSymbol(math, rel, "\u2245", "\\cong", true); -defineSymbol(math, rel, "\u2265", "\\ge"); -defineSymbol(math, rel, "\u2265", "\\geq", true); -defineSymbol(math, rel, "\u2190", "\\gets"); -defineSymbol(math, rel, ">", "\\gt", true); -defineSymbol(math, rel, "\u2208", "\\in", true); -defineSymbol(math, rel, "\u2209", "\\notin", true); -defineSymbol(math, rel, "\ue020", "\\@not"); -defineSymbol(math, rel, "\u2282", "\\subset", true); -defineSymbol(math, rel, "\u2283", "\\supset", true); -defineSymbol(math, rel, "\u2286", "\\subseteq", true); -defineSymbol(math, rel, "\u2287", "\\supseteq", true); -defineSymbol(math, rel, "\u2288", "\\nsubseteq", true); -defineSymbol(math, rel, "\u2288", "\\nsubseteqq"); -defineSymbol(math, rel, "\u2289", "\\nsupseteq", true); -defineSymbol(math, rel, "\u2289", "\\nsupseteqq"); -defineSymbol(math, rel, "\u22a8", "\\models"); -defineSymbol(math, rel, "\u2190", "\\leftarrow", true); -defineSymbol(math, rel, "\u2264", "\\le"); -defineSymbol(math, rel, "\u2264", "\\leq", true); -defineSymbol(math, rel, "<", "\\lt", true); -defineSymbol(math, rel, "\u2192", "\\rightarrow", true); -defineSymbol(math, rel, "\u2192", "\\to"); -defineSymbol(math, rel, "\u2271", "\\ngeq", true); -defineSymbol(math, rel, "\u2271", "\\ngeqq"); -defineSymbol(math, rel, "\u2271", "\\ngeqslant"); -defineSymbol(math, rel, "\u2270", "\\nleq", true); -defineSymbol(math, rel, "\u2270", "\\nleqq"); -defineSymbol(math, rel, "\u2270", "\\nleqslant"); -defineSymbol(math, rel, "\u2aeb", "\\Perp", true); //cmll package -defineSymbol(math, spacing, "\u00a0", "\\ "); -defineSymbol(math, spacing, "\u00a0", "\\space"); -// Ref: LaTeX Source 2e: \DeclareRobustCommand{\nobreakspace}{% -defineSymbol(math, spacing, "\u00a0", "\\nobreakspace"); -defineSymbol(text, spacing, "\u00a0", "\\ "); -defineSymbol(text, spacing, "\u00a0", " "); -defineSymbol(text, spacing, "\u00a0", "\\space"); -defineSymbol(text, spacing, "\u00a0", "\\nobreakspace"); -defineSymbol(math, spacing, null, "\\nobreak"); -defineSymbol(math, spacing, null, "\\allowbreak"); -defineSymbol(math, punct, ",", ","); -defineSymbol(text, punct, ":", ":"); -defineSymbol(math, punct, ";", ";"); -defineSymbol(math, bin, "\u22bc", "\\barwedge"); -defineSymbol(math, bin, "\u22bb", "\\veebar"); -defineSymbol(math, bin, "\u2299", "\\odot", true); -// Firefox turns ⊕ into an emoji. So append \uFE0E. Define Unicode character in macros, not here. -defineSymbol(math, bin, "\u2295\uFE0E", "\\oplus"); -defineSymbol(math, bin, "\u2297", "\\otimes", true); -defineSymbol(math, textord, "\u2202", "\\partial", true); -defineSymbol(math, bin, "\u2298", "\\oslash", true); -defineSymbol(math, bin, "\u229a", "\\circledcirc", true); -defineSymbol(math, bin, "\u22a1", "\\boxdot", true); -defineSymbol(math, bin, "\u25b3", "\\bigtriangleup"); -defineSymbol(math, bin, "\u25bd", "\\bigtriangledown"); -defineSymbol(math, bin, "\u2020", "\\dagger"); -defineSymbol(math, bin, "\u22c4", "\\diamond"); -defineSymbol(math, bin, "\u25c3", "\\triangleleft"); -defineSymbol(math, bin, "\u25b9", "\\triangleright"); -defineSymbol(math, open, "{", "\\{"); -defineSymbol(text, textord, "{", "\\{"); -defineSymbol(text, textord, "{", "\\textbraceleft"); -defineSymbol(math, close, "}", "\\}"); -defineSymbol(text, textord, "}", "\\}"); -defineSymbol(text, textord, "}", "\\textbraceright"); -defineSymbol(math, open, "{", "\\lbrace"); -defineSymbol(math, close, "}", "\\rbrace"); -defineSymbol(math, open, "[", "\\lbrack", true); -defineSymbol(text, textord, "[", "\\lbrack", true); -defineSymbol(math, close, "]", "\\rbrack", true); -defineSymbol(text, textord, "]", "\\rbrack", true); -defineSymbol(math, open, "(", "\\lparen", true); -defineSymbol(math, close, ")", "\\rparen", true); -defineSymbol(math, open, "⦇", "\\llparenthesis", true); -defineSymbol(math, close, "⦈", "\\rrparenthesis", true); -defineSymbol(text, textord, "<", "\\textless", true); // in T1 fontenc -defineSymbol(text, textord, ">", "\\textgreater", true); // in T1 fontenc -defineSymbol(math, open, "\u230a", "\\lfloor", true); -defineSymbol(math, close, "\u230b", "\\rfloor", true); -defineSymbol(math, open, "\u2308", "\\lceil", true); -defineSymbol(math, close, "\u2309", "\\rceil", true); -defineSymbol(math, textord, "\\", "\\backslash"); -defineSymbol(math, textord, "|", "|"); -defineSymbol(math, textord, "|", "\\vert"); -defineSymbol(text, textord, "|", "\\textbar", true); // in T1 fontenc -defineSymbol(math, textord, "\u2016", "\\|"); -defineSymbol(math, textord, "\u2016", "\\Vert"); -defineSymbol(text, textord, "\u2016", "\\textbardbl"); -defineSymbol(text, textord, "~", "\\textasciitilde"); -defineSymbol(text, textord, "\\", "\\textbackslash"); -defineSymbol(text, textord, "^", "\\textasciicircum"); -defineSymbol(math, rel, "\u2191", "\\uparrow", true); -defineSymbol(math, rel, "\u21d1", "\\Uparrow", true); -defineSymbol(math, rel, "\u2193", "\\downarrow", true); -defineSymbol(math, rel, "\u21d3", "\\Downarrow", true); -defineSymbol(math, rel, "\u2195", "\\updownarrow", true); -defineSymbol(math, rel, "\u21d5", "\\Updownarrow", true); -defineSymbol(math, op, "\u2210", "\\coprod"); -defineSymbol(math, op, "\u22c1", "\\bigvee"); -defineSymbol(math, op, "\u22c0", "\\bigwedge"); -defineSymbol(math, op, "\u2a04", "\\biguplus"); -defineSymbol(math, op, "\u22c2", "\\bigcap"); -defineSymbol(math, op, "\u22c3", "\\bigcup"); -defineSymbol(math, op, "\u222b", "\\int"); -defineSymbol(math, op, "\u222b", "\\intop"); -defineSymbol(math, op, "\u222c", "\\iint"); -defineSymbol(math, op, "\u222d", "\\iiint"); -defineSymbol(math, op, "\u220f", "\\prod"); -defineSymbol(math, op, "\u2211", "\\sum"); -defineSymbol(math, op, "\u2a02", "\\bigotimes"); -defineSymbol(math, op, "\u2a01", "\\bigoplus"); -defineSymbol(math, op, "\u2a00", "\\bigodot"); -defineSymbol(math, op, "\u2a09", "\\bigtimes"); -defineSymbol(math, op, "\u222e", "\\oint"); -defineSymbol(math, op, "\u222f", "\\oiint"); -defineSymbol(math, op, "\u2230", "\\oiiint"); -defineSymbol(math, op, "\u2231", "\\intclockwise"); -defineSymbol(math, op, "\u2232", "\\varointclockwise"); -defineSymbol(math, op, "\u2a0c", "\\iiiint"); -defineSymbol(math, op, "\u2a0d", "\\intbar"); -defineSymbol(math, op, "\u2a0e", "\\intBar"); -defineSymbol(math, op, "\u2a0f", "\\fint"); -defineSymbol(math, op, "\u2a12", "\\rppolint"); -defineSymbol(math, op, "\u2a13", "\\scpolint"); -defineSymbol(math, op, "\u2a15", "\\pointint"); -defineSymbol(math, op, "\u2a16", "\\sqint"); -defineSymbol(math, op, "\u2a17", "\\intlarhk"); -defineSymbol(math, op, "\u2a18", "\\intx"); -defineSymbol(math, op, "\u2a19", "\\intcap"); -defineSymbol(math, op, "\u2a1a", "\\intcup"); -defineSymbol(math, op, "\u2a05", "\\bigsqcap"); -defineSymbol(math, op, "\u2a06", "\\bigsqcup"); -defineSymbol(math, op, "\u222b", "\\smallint"); -defineSymbol(text, inner, "\u2026", "\\textellipsis"); -defineSymbol(math, inner, "\u2026", "\\mathellipsis"); -defineSymbol(text, inner, "\u2026", "\\ldots", true); -defineSymbol(math, inner, "\u2026", "\\ldots", true); -defineSymbol(math, inner, "\u22f0", "\\iddots", true); -defineSymbol(math, inner, "\u22ef", "\\@cdots", true); -defineSymbol(math, inner, "\u22f1", "\\ddots", true); -defineSymbol(math, textord, "\u22ee", "\\varvdots"); // \vdots is a macro -defineSymbol(math, accent, "\u02ca", "\\acute"); -defineSymbol(math, accent, "\u0060", "\\grave"); -defineSymbol(math, accent, "\u00a8", "\\ddot"); -defineSymbol(math, accent, "\u2026", "\\dddot"); -defineSymbol(math, accent, "\u2026\u002e", "\\ddddot"); -defineSymbol(math, accent, "\u007e", "\\tilde"); -defineSymbol(math, accent, "\u203e", "\\bar"); -defineSymbol(math, accent, "\u02d8", "\\breve"); -defineSymbol(math, accent, "\u02c7", "\\check"); -defineSymbol(math, accent, "\u005e", "\\hat"); -defineSymbol(math, accent, "\u2192", "\\vec"); -defineSymbol(math, accent, "\u02d9", "\\dot"); -defineSymbol(math, accent, "\u02da", "\\mathring"); -defineSymbol(math, mathord, "\u0131", "\\imath", true); -defineSymbol(math, mathord, "\u0237", "\\jmath", true); -defineSymbol(math, textord, "\u0131", "\u0131"); -defineSymbol(math, textord, "\u0237", "\u0237"); -defineSymbol(text, textord, "\u0131", "\\i", true); -defineSymbol(text, textord, "\u0237", "\\j", true); -defineSymbol(text, textord, "\u00df", "\\ss", true); -defineSymbol(text, textord, "\u00e6", "\\ae", true); -defineSymbol(text, textord, "\u0153", "\\oe", true); -defineSymbol(text, textord, "\u00f8", "\\o", true); -defineSymbol(math, mathord, "\u00f8", "\\o", true); -defineSymbol(text, textord, "\u00c6", "\\AE", true); -defineSymbol(text, textord, "\u0152", "\\OE", true); -defineSymbol(text, textord, "\u00d8", "\\O", true); -defineSymbol(math, mathord, "\u00d8", "\\O", true); -defineSymbol(text, accent, "\u02ca", "\\'"); // acute -defineSymbol(text, accent, "\u02cb", "\\`"); // grave -defineSymbol(text, accent, "\u02c6", "\\^"); // circumflex -defineSymbol(text, accent, "\u02dc", "\\~"); // tilde -defineSymbol(text, accent, "\u02c9", "\\="); // macron -defineSymbol(text, accent, "\u02d8", "\\u"); // breve -defineSymbol(text, accent, "\u02d9", "\\."); // dot above -defineSymbol(text, accent, "\u00b8", "\\c"); // cedilla -defineSymbol(text, accent, "\u02da", "\\r"); // ring above -defineSymbol(text, accent, "\u02c7", "\\v"); // caron -defineSymbol(text, accent, "\u00a8", '\\"'); // diaresis -defineSymbol(text, accent, "\u02dd", "\\H"); // double acute -defineSymbol(math, accent, "\u02ca", "\\'"); // acute -defineSymbol(math, accent, "\u02cb", "\\`"); // grave -defineSymbol(math, accent, "\u02c6", "\\^"); // circumflex -defineSymbol(math, accent, "\u02dc", "\\~"); // tilde -defineSymbol(math, accent, "\u02c9", "\\="); // macron -defineSymbol(math, accent, "\u02d8", "\\u"); // breve -defineSymbol(math, accent, "\u02d9", "\\."); // dot above -defineSymbol(math, accent, "\u00b8", "\\c"); // cedilla -defineSymbol(math, accent, "\u02da", "\\r"); // ring above -defineSymbol(math, accent, "\u02c7", "\\v"); // caron -defineSymbol(math, accent, "\u00a8", '\\"'); // diaresis -defineSymbol(math, accent, "\u02dd", "\\H"); // double acute - -// These ligatures are detected and created in Parser.js's `formLigatures`. -const ligatures = { - "--": true, - "---": true, - "``": true, - "''": true -}; - -defineSymbol(text, textord, "\u2013", "--", true); -defineSymbol(text, textord, "\u2013", "\\textendash"); -defineSymbol(text, textord, "\u2014", "---", true); -defineSymbol(text, textord, "\u2014", "\\textemdash"); -defineSymbol(text, textord, "\u2018", "`", true); -defineSymbol(text, textord, "\u2018", "\\textquoteleft"); -defineSymbol(text, textord, "\u2019", "'", true); -defineSymbol(text, textord, "\u2019", "\\textquoteright"); -defineSymbol(text, textord, "\u201c", "``", true); -defineSymbol(text, textord, "\u201c", "\\textquotedblleft"); -defineSymbol(text, textord, "\u201d", "''", true); -defineSymbol(text, textord, "\u201d", "\\textquotedblright"); -// \degree from gensymb package -defineSymbol(math, textord, "\u00b0", "\\degree", true); -defineSymbol(text, textord, "\u00b0", "\\degree"); -// \textdegree from inputenc package -defineSymbol(text, textord, "\u00b0", "\\textdegree", true); -// TODO: In LaTeX, \pounds can generate a different character in text and math -// mode, but among our fonts, only Main-Regular defines this character "163". -defineSymbol(math, textord, "\u00a3", "\\pounds"); -defineSymbol(math, textord, "\u00a3", "\\mathsterling", true); -defineSymbol(text, textord, "\u00a3", "\\pounds"); -defineSymbol(text, textord, "\u00a3", "\\textsterling", true); -defineSymbol(math, textord, "\u2720", "\\maltese"); -defineSymbol(text, textord, "\u2720", "\\maltese"); -defineSymbol(math, textord, "\u20ac", "\\euro", true); -defineSymbol(text, textord, "\u20ac", "\\euro", true); -defineSymbol(text, textord, "\u20ac", "\\texteuro"); -defineSymbol(math, textord, "\u00a9", "\\copyright", true); -defineSymbol(text, textord, "\u00a9", "\\textcopyright"); -defineSymbol(math, textord, "\u2300", "\\diameter", true); -defineSymbol(text, textord, "\u2300", "\\diameter"); - -// Italic Greek -defineSymbol(math, textord, "𝛤", "\\varGamma"); -defineSymbol(math, textord, "𝛥", "\\varDelta"); -defineSymbol(math, textord, "𝛩", "\\varTheta"); -defineSymbol(math, textord, "𝛬", "\\varLambda"); -defineSymbol(math, textord, "𝛯", "\\varXi"); -defineSymbol(math, textord, "𝛱", "\\varPi"); -defineSymbol(math, textord, "𝛴", "\\varSigma"); -defineSymbol(math, textord, "𝛶", "\\varUpsilon"); -defineSymbol(math, textord, "𝛷", "\\varPhi"); -defineSymbol(math, textord, "𝛹", "\\varPsi"); -defineSymbol(math, textord, "𝛺", "\\varOmega"); -defineSymbol(text, textord, "𝛤", "\\varGamma"); -defineSymbol(text, textord, "𝛥", "\\varDelta"); -defineSymbol(text, textord, "𝛩", "\\varTheta"); -defineSymbol(text, textord, "𝛬", "\\varLambda"); -defineSymbol(text, textord, "𝛯", "\\varXi"); -defineSymbol(text, textord, "𝛱", "\\varPi"); -defineSymbol(text, textord, "𝛴", "\\varSigma"); -defineSymbol(text, textord, "𝛶", "\\varUpsilon"); -defineSymbol(text, textord, "𝛷", "\\varPhi"); -defineSymbol(text, textord, "𝛹", "\\varPsi"); -defineSymbol(text, textord, "𝛺", "\\varOmega"); - - -// There are lots of symbols which are the same, so we add them in afterwards. -// All of these are textords in math mode -const mathTextSymbols = '0123456789/@."'; -for (let i = 0; i < mathTextSymbols.length; i++) { - const ch = mathTextSymbols.charAt(i); - defineSymbol(math, textord, ch, ch); -} - -// All of these are textords in text mode -const textSymbols = '0123456789!@*()-=+";:?/.,'; -for (let i = 0; i < textSymbols.length; i++) { - const ch = textSymbols.charAt(i); - defineSymbol(text, textord, ch, ch); -} - -// All of these are textords in text mode, and mathords in math mode -const letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; -for (let i = 0; i < letters.length; i++) { - const ch = letters.charAt(i); - defineSymbol(math, mathord, ch, ch); - defineSymbol(text, textord, ch, ch); -} - -// Some more letters in Unicode Basic Multilingual Plane. -const narrow = "ÇÐÞçþℂℍℕℙℚℝℤℎℏℊℋℌℐℑℒℓ℘ℛℜℬℰℱℳℭℨ"; -for (let i = 0; i < narrow.length; i++) { - const ch = narrow.charAt(i); - defineSymbol(math, mathord, ch, ch); - defineSymbol(text, textord, ch, ch); -} - -// The next loop loads wide (surrogate pair) characters. -// We support some letters in the Unicode range U+1D400 to U+1D7FF, -// Mathematical Alphanumeric Symbols. -let wideChar = ""; -for (let i = 0; i < letters.length; i++) { - // The hex numbers in the next line are a surrogate pair. - // 0xD835 is the high surrogate for all letters in the range we support. - // 0xDC00 is the low surrogate for bold A. - wideChar = String.fromCharCode(0xd835, 0xdc00 + i); // A-Z a-z bold - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xdc34 + i); // A-Z a-z italic - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xdc68 + i); // A-Z a-z bold italic - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xdd04 + i); // A-Z a-z Fractur - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xdda0 + i); // A-Z a-z sans-serif - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xddd4 + i); // A-Z a-z sans bold - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xde08 + i); // A-Z a-z sans italic - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xde70 + i); // A-Z a-z monospace - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xdd38 + i); // A-Z a-z double struck - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - const ch = letters.charAt(i); - wideChar = String.fromCharCode(0xd835, 0xdc9c + i); // A-Z a-z calligraphic - defineSymbol(math, mathord, ch, wideChar); - defineSymbol(text, textord, ch, wideChar); -} - -// Next, some wide character numerals -for (let i = 0; i < 10; i++) { - wideChar = String.fromCharCode(0xd835, 0xdfce + i); // 0-9 bold - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xdfe2 + i); // 0-9 sans serif - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xdfec + i); // 0-9 bold sans - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xdff6 + i); // 0-9 monospace - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); -} - -/* - * Neither Firefox nor Chrome support hard line breaks or soft line breaks. - * (Despite https://www.w3.org/Math/draft-spec/mathml.html#chapter3_presm.lbattrs) - * So Temml has work-arounds for both hard and soft breaks. - * The work-arounds sadly do not work simultaneously. Any top-level hard - * break makes soft line breaks impossible. - * - * Hard breaks are simulated by creating a and putting each line in its own . - * - * To create soft line breaks, Temml avoids using the and tags. - * Then the top level of a element can be occupied by elements, and the browser - * will break after a if the expression extends beyond the container limit. - * - * The default is for soft line breaks after each top-level binary or - * relational operator, per TeXbook p. 173. So we gather the expression into s so that - * each ends in a binary or relational operator. - * - * An option is for soft line breaks before an "=" sign. That changes the s. - * - * Soft line breaks will not work in Chromium and Safari, only Firefox. - * - * Hopefully browsers will someday do their own linebreaking and we will be able to delete - * much of this module. - */ - -const openDelims = "([{⌊⌈⟨⟮⎰⟦⦃"; -const closeDelims = ")]}⌋⌉⟩⟯⎱⟦⦄"; - -function setLineBreaks(expression, wrapMode, isDisplayMode) { - const mtrs = []; - let mrows = []; - let block = []; - let numTopLevelEquals = 0; - let i = 0; - let level = 0; - while (i < expression.length) { - while (expression[i] instanceof DocumentFragment) { - expression.splice(i, 1, ...expression[i].children); // Expand the fragment. - } - const node = expression[i]; - if (node.attributes && node.attributes.linebreak && - node.attributes.linebreak === "newline") { - // A hard line break. Create a for the current block. - if (block.length > 0) { - mrows.push(new mathMLTree.MathNode("mrow", block)); - } - mrows.push(node); - block = []; - const mtd = new mathMLTree.MathNode("mtd", mrows); - mtd.style.textAlign = "left"; - mtrs.push(new mathMLTree.MathNode("mtr", [mtd])); - mrows = []; - i += 1; - continue - } - block.push(node); - if (node.type && node.type === "mo" && node.children.length === 1 && - !Object.hasOwn(node.attributes, "movablelimits")) { - const ch = node.children[0].text; - if (openDelims.indexOf(ch) > -1) { - level += 1; - } else if (closeDelims.indexOf(ch) > -1) { - level -= 1; - } else if (level === 0 && wrapMode === "=" && ch === "=") { - numTopLevelEquals += 1; - if (numTopLevelEquals > 1) { - block.pop(); - // Start a new block. (Insert a soft linebreak.) - const element = new mathMLTree.MathNode("mrow", block); - mrows.push(element); - block = [node]; - } - } else if (level === 0 && wrapMode === "tex" && ch !== "∇") { - // Check if the following node is a \nobreak text node, e.g. "~"" - const next = i < expression.length - 1 ? expression[i + 1] : null; - let glueIsFreeOfNobreak = true; - if ( - !( - next && - next.type === "mtext" && - next.attributes.linebreak && - next.attributes.linebreak === "nobreak" - ) - ) { - // We may need to start a new block. - // First, put any post-operator glue on same line as operator. - for (let j = i + 1; j < expression.length; j++) { - const nd = expression[j]; - if ( - nd.type && - nd.type === "mspace" && - !(nd.attributes.linebreak && nd.attributes.linebreak === "newline") - ) { - block.push(nd); - i += 1; - if ( - nd.attributes && - nd.attributes.linebreak && - nd.attributes.linebreak === "nobreak" - ) { - glueIsFreeOfNobreak = false; - } - } else { - break; - } - } - } - if (glueIsFreeOfNobreak) { - // Start a new block. (Insert a soft linebreak.) - const element = new mathMLTree.MathNode("mrow", block); - mrows.push(element); - block = []; - } - } - } - i += 1; - } - if (block.length > 0) { - const element = new mathMLTree.MathNode("mrow", block); - mrows.push(element); - } - if (mtrs.length > 0) { - const mtd = new mathMLTree.MathNode("mtd", mrows); - mtd.style.textAlign = "left"; - const mtr = new mathMLTree.MathNode("mtr", [mtd]); - mtrs.push(mtr); - const mtable = new mathMLTree.MathNode("mtable", mtrs); - if (!isDisplayMode) { - mtable.setAttribute("columnalign", "left"); - mtable.setAttribute("rowspacing", "0em"); - } - return mtable - } - return mathMLTree.newDocumentFragment(mrows); -} - -/** - * This file converts a parse tree into a corresponding MathML tree. The main - * entry point is the `buildMathML` function, which takes a parse tree from the - * parser. - */ - -/** - * Takes a symbol and converts it into a MathML text node after performing - * optional replacement from symbols.js. - */ -const makeText = function(text, mode, style) { - if ( - symbols[mode][text] && - symbols[mode][text].replace && - text.charCodeAt(0) !== 0xd835 && - !( - Object.prototype.hasOwnProperty.call(ligatures, text) && - style && - ((style.fontFamily && style.fontFamily.slice(4, 6) === "tt") || - (style.font && style.font.slice(4, 6) === "tt")) - ) - ) { - text = symbols[mode][text].replace; - } - - return new mathMLTree.TextNode(text); -}; - -const consolidateText = mrow => { - // If possible, consolidate adjacent elements into a single element. - if (mrow.type !== "mrow" && mrow.type !== "mstyle") { return mrow } - if (mrow.children.length === 0) { return mrow } // empty group, e.g., \text{} - if (!mrow.children[0].attributes || mrow.children[0].type !== "mtext") { return mrow } - const variant = mrow.children[0].attributes.mathvariant || ""; - const mtext = new mathMLTree.MathNode( - "mtext", - [new mathMLTree.TextNode(mrow.children[0].children[0].text)] - ); - for (let i = 1; i < mrow.children.length; i++) { - // Check each child and, if possible, copy the character into child[0]. - const localVariant = mrow.children[i].attributes.mathvariant || ""; - if (mrow.children[i].type === "mrow") { - const childRow = mrow.children[i]; - for (let j = 0; j < childRow.children.length; j++) { - // We'll also check the children of a mrow. One level only. No recursion. - const childVariant = childRow.children[j].attributes.mathvariant || ""; - if (childVariant !== variant || childRow.children[j].type !== "mtext") { - return mrow // At least one element cannot be consolidated. Get out. - } else { - mtext.children[0].text += childRow.children[j].children[0].text; - } - } - } else if (localVariant !== variant || mrow.children[i].type !== "mtext") { - return mrow - } else { - mtext.children[0].text += mrow.children[i].children[0].text; - } - } - // Firefox does not render a space at either end of an string. - // To get proper rendering, we replace leading or trailing spaces with no-break spaces. - if (mtext.children[0].text.charAt(0) === " ") { - mtext.children[0].text = "\u00a0" + mtext.children[0].text.slice(1); - } - const L = mtext.children[0].text.length; - if (L > 0 && mtext.children[0].text.charAt(L - 1) === " ") { - mtext.children[0].text = mtext.children[0].text.slice(0, -1) + "\u00a0"; - } - for (const [key, value] of Object.entries(mrow.attributes)) { - mtext.attributes[key] = value; - } - return mtext -}; - -const numberRegEx$1 = /^[0-9]$/; -const isDotOrComma = (node, followingNode) => { - return ((node.type === "textord" && node.text === ".") || - (node.type === "atom" && node.text === ",")) && - // Don't consolidate if there is a space after the comma. - node.loc && followingNode.loc && node.loc.end === followingNode.loc.start -}; -const consolidateNumbers = expression => { - // Consolidate adjacent numbers. We want to return 1,506.3, - // not 1,506.3 - if (expression.length < 2) { return } - const nums = []; - let inNum = false; - // Find adjacent numerals - for (let i = 0; i < expression.length; i++) { - const node = expression[i]; - if (node.type === "textord" && numberRegEx$1.test(node.text)) { - if (!inNum) { nums.push({ start: i }); } - inNum = true; - } else { - if (inNum) { nums[nums.length - 1].end = i - 1; } - inNum = false; - } - } - if (inNum) { nums[nums.length - 1].end = expression.length - 1; } - - // Determine if numeral groups are separated by a comma or dot. - for (let i = nums.length - 1; i > 0; i--) { - if (nums[i - 1].end === nums[i].start - 2 && - isDotOrComma(expression[nums[i].start - 1], expression[nums[i].start])) { - // Merge the two groups. - nums[i - 1].end = nums[i].end; - nums.splice(i, 1); - } - } - - // Consolidate the number nodes - for (let i = nums.length - 1; i >= 0; i--) { - for (let j = nums[i].start + 1; j <= nums[i].end; j++) { - expression[nums[i].start].text += expression[j].text; - } - expression.splice(nums[i].start + 1, nums[i].end - nums[i].start); - // Check if the is followed by a numeric base in a supsub, e.g. the "3" in 123^4 - // If so, merge the first into the base. - if (expression.length > nums[i].start + 1) { - const nextTerm = expression[nums[i].start + 1]; - if (nextTerm.type === "supsub" && nextTerm.base && nextTerm.base.type === "textord" && - numberRegEx$1.test(nextTerm.base.text)) { - nextTerm.base.text = expression[nums[i].start].text + nextTerm.base.text; - expression.splice(nums[i].start, 1); - } - } - } -}; - -/** - * Wrap the given array of nodes in an node if needed, i.e., - * unless the array has length 1. Always returns a single node. - */ -const makeRow = function(body, semisimple = false) { - if (body.length === 1 && !(body[0] instanceof DocumentFragment)) { - return body[0]; - } else if (!semisimple) { - // Suppress spacing on nodes at both ends of the row. - if (body[0] instanceof MathNode && body[0].type === "mo" && !body[0].attributes.fence) { - body[0].attributes.lspace = "0em"; - body[0].attributes.rspace = "0em"; - } - const end = body.length - 1; - if (body[end] instanceof MathNode && body[end].type === "mo" && !body[end].attributes.fence) { - body[end].attributes.lspace = "0em"; - body[end].attributes.rspace = "0em"; - } - } - return new mathMLTree.MathNode("mrow", body); -}; - -const isRel = item => { - return (item.type === "atom" && item.family === "rel") || - (item.type === "mclass" && item.mclass === "mrel") -}; - -/** - * Takes a list of nodes, builds them, and returns a list of the generated - * MathML nodes. Also do a couple chores along the way: - * (1) Suppress spacing when an author wraps an operator w/braces, as in {=}. - * (2) Suppress spacing between two adjacent relations. - */ -const buildExpression = function(expression, style, semisimple = false) { - if (!semisimple && expression.length === 1) { - const group = buildGroup$1(expression[0], style); - if (group instanceof MathNode && group.type === "mo") { - // When TeX writers want to suppress spacing on an operator, - // they often put the operator by itself inside braces. - group.setAttribute("lspace", "0em"); - group.setAttribute("rspace", "0em"); - } - return [group]; - } - - consolidateNumbers(expression); - - const groups = []; - for (let i = 0; i < expression.length; i++) { - const group = buildGroup$1(expression[i], style); - // Suppress spacing between adjacent relations - if (i < expression.length - 1 && isRel(expression[i]) && isRel(expression[i + 1])) { - group.setAttribute("rspace", "0em"); - } - if (i > 0 && isRel(expression[i]) && isRel(expression[i - 1])) { - group.setAttribute("lspace", "0em"); - } - groups.push(group); - } - return groups; -}; - -/** - * Equivalent to buildExpression, but wraps the elements in an - * if there's more than one. Returns a single node instead of an array. - */ -const buildExpressionRow = function(expression, style, semisimple = false) { - return makeRow(buildExpression(expression, style, semisimple), semisimple); -}; - -/** - * Takes a group from the parser and calls the appropriate groupBuilders function - * on it to produce a MathML node. - */ -const buildGroup$1 = function(group, style) { - if (!group) { - return new mathMLTree.MathNode("mrow"); - } - - if (_mathmlGroupBuilders[group.type]) { - // Call the groupBuilders function - const result = _mathmlGroupBuilders[group.type](group, style); - return result; - } else { - throw new ParseError("Got group of unknown type: '" + group.type + "'"); - } -}; - -const glue$1 = _ => { - return new mathMLTree.MathNode("mtd", [], [], { padding: "0", width: "50%" }) -}; - -const taggedExpression = (expression, tag, style, leqno) => { - tag = buildExpressionRow(tag[0].body, style); - tag = consolidateText(tag); - tag.classes.push("tml-tag"); - - expression = new mathMLTree.MathNode("mtd", [expression]); - const rowArray = [glue$1(), expression, glue$1()]; - rowArray[leqno ? 0 : 2].classes.push(leqno ? "tml-left" : "tml-right"); - rowArray[leqno ? 0 : 2].children.push(tag); - const mtr = new mathMLTree.MathNode("mtr", rowArray, ["tml-tageqn"]); - const table = new mathMLTree.MathNode("mtable", [mtr]); - table.style.width = "100%"; - table.setAttribute("displaystyle", "true"); - return table -}; - -/** - * Takes a full parse tree and settings and builds a MathML representation of - * it. - */ -function buildMathML(tree, texExpression, style, settings) { - // Strip off outer tag wrapper for processing below. - let tag = null; - if (tree.length === 1 && tree[0].type === "tag") { - tag = tree[0].tag; - tree = tree[0].body; - } - - const expression = buildExpression(tree, style); - const wrap = (settings.displayMode || settings.annotate) ? "none" : settings.wrap; - - const n1 = expression.length === 0 ? null : expression[0]; - let wrapper = expression.length === 1 && tag === null && (n1 instanceof MathNode) - ? expression[0] - : setLineBreaks(expression, wrap, settings.displayMode); - - if (tag) { - wrapper = taggedExpression(wrapper, tag, style, settings.leqno); - } - - if (settings.annotate) { - // Build a TeX annotation of the source - const annotation = new mathMLTree.MathNode( - "annotation", [new mathMLTree.TextNode(texExpression)]); - annotation.setAttribute("encoding", "application/x-tex"); - wrapper = new mathMLTree.MathNode("semantics", [wrapper, annotation]); - } - - const math = new mathMLTree.MathNode("math", [wrapper]); - - if (settings.xml) { - math.setAttribute("xmlns", "http://www.w3.org/1998/Math/MathML"); - } - if (settings.displayMode) { - math.setAttribute("display", "block"); - math.style.display = "block math"; // necessary in Chromium. - // Firefox and Safari do not recognize display: "block math". - // Set a class so that the CSS file can set display: block. - math.classes = ["tml-display"]; - } - return math; -} - -const smalls = "acegıȷmnopqrsuvwxyzαγεηικμνοπρςστυχωϕ𝐚𝐜𝐞𝐠𝐦𝐧𝐨𝐩𝐪𝐫𝐬𝐮𝐯𝐰𝐱𝐲𝐳"; -const talls = "ABCDEFGHIJKLMNOPQRSTUVWXYZbdfhkltΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩβδλζφθψ" - + "𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙𝐛𝐝𝐟𝐡𝐤𝐥𝐭"; -const longSmalls = new Set(["\\alpha", "\\gamma", "\\delta", "\\epsilon", "\\eta", "\\iota", - "\\kappa", "\\mu", "\\nu", "\\pi", "\\rho", "\\sigma", "\\tau", "\\upsilon", "\\chi", "\\psi", - "\\omega", "\\imath", "\\jmath"]); -const longTalls = new Set(["\\Gamma", "\\Delta", "\\Sigma", "\\Omega", "\\beta", "\\delta", - "\\lambda", "\\theta", "\\psi"]); - -const mathmlBuilder$a = (group, style) => { - const accentNode = group.isStretchy - ? stretchy.accentNode(group) - : new mathMLTree.MathNode("mo", [makeText(group.label, group.mode)]); - - if (group.label === "\\vec") { - accentNode.style.transform = "scale(0.75) translate(10%, 30%)"; - } else { - accentNode.style.mathStyle = "normal"; - accentNode.style.mathDepth = "0"; - if (needWebkitShift.has(group.label) && utils.isCharacterBox(group.base)) { - let shift = ""; - const ch = group.base.text; - if (smalls.indexOf(ch) > -1 || longSmalls.has(ch)) { shift = "tml-xshift"; } - if (talls.indexOf(ch) > -1 || longTalls.has(ch)) { shift = "tml-capshift"; } - if (shift) { accentNode.classes.push(shift); } - } - } - if (!group.isStretchy) { - accentNode.setAttribute("stretchy", "false"); - } - - const node = new mathMLTree.MathNode((group.label === "\\c" ? "munder" : "mover"), - [buildGroup$1(group.base, style), accentNode] - ); - - return node; -}; - -const nonStretchyAccents = new Set([ - "\\acute", - "\\grave", - "\\ddot", - "\\dddot", - "\\ddddot", - "\\tilde", - "\\bar", - "\\breve", - "\\check", - "\\hat", - "\\vec", - "\\dot", - "\\mathring" -]); - -const needWebkitShift = new Set([ - "\\acute", - "\\bar", - "\\breve", - "\\check", - "\\dot", - "\\ddot", - "\\grave", - "\\hat", - "\\mathring", - "\\'", "\\^", "\\~", "\\=", "\\u", "\\.", '\\"', "\\r", "\\H", "\\v" -]); - -// Accents -defineFunction({ - type: "accent", - names: [ - "\\acute", - "\\grave", - "\\ddot", - "\\dddot", - "\\ddddot", - "\\tilde", - "\\bar", - "\\breve", - "\\check", - "\\hat", - "\\vec", - "\\dot", - "\\mathring", - "\\overparen", - "\\widecheck", - "\\widehat", - "\\wideparen", - "\\widetilde", - "\\overrightarrow", - "\\overleftarrow", - "\\Overrightarrow", - "\\overleftrightarrow", - "\\overgroup", - "\\overleftharpoon", - "\\overrightharpoon" - ], - props: { - numArgs: 1 - }, - handler: (context, args) => { - const base = normalizeArgument(args[0]); - - const isStretchy = !nonStretchyAccents.has(context.funcName); - - return { - type: "accent", - mode: context.parser.mode, - label: context.funcName, - isStretchy: isStretchy, - base: base - }; - }, - mathmlBuilder: mathmlBuilder$a -}); - -// Text-mode accents -defineFunction({ - type: "accent", - names: ["\\'", "\\`", "\\^", "\\~", "\\=", "\\c", "\\u", "\\.", '\\"', "\\r", "\\H", "\\v"], - props: { - numArgs: 1, - allowedInText: true, - allowedInMath: true, - argTypes: ["primitive"] - }, - handler: (context, args) => { - const base = normalizeArgument(args[0]); - const mode = context.parser.mode; - - if (mode === "math" && context.parser.settings.strict) { - // LaTeX only writes a warning. It doesn't stop. We'll issue the same warning. - // eslint-disable-next-line no-console - console.log(`Temml parse error: Command ${context.funcName} is invalid in math mode.`); - } - - return { - type: "accent", - mode: mode, - label: context.funcName, - isStretchy: false, - base: base - }; - }, - mathmlBuilder: mathmlBuilder$a -}); - -defineFunction({ - type: "accentUnder", - names: [ - "\\underleftarrow", - "\\underrightarrow", - "\\underleftrightarrow", - "\\undergroup", - "\\underparen", - "\\utilde" - ], - props: { - numArgs: 1 - }, - handler: ({ parser, funcName }, args) => { - const base = args[0]; - return { - type: "accentUnder", - mode: parser.mode, - label: funcName, - base: base - }; - }, - mathmlBuilder: (group, style) => { - const accentNode = stretchy.accentNode(group); - accentNode.style["math-depth"] = 0; - const node = new mathMLTree.MathNode("munder", [ - buildGroup$1(group.base, style), - accentNode - ]); - return node; - } -}); - -/** - * This file does conversion between units. In particular, it provides - * calculateSize to convert other units into CSS units. - */ - -const ptPerUnit = { - // Convert to CSS (Postscipt) points, not TeX points - // https://en.wikibooks.org/wiki/LaTeX/Lengths and - // https://tex.stackexchange.com/a/8263 - pt: 800 / 803, // convert TeX point to CSS (Postscript) point - pc: (12 * 800) / 803, // pica - dd: ((1238 / 1157) * 800) / 803, // didot - cc: ((14856 / 1157) * 800) / 803, // cicero (12 didot) - nd: ((685 / 642) * 800) / 803, // new didot - nc: ((1370 / 107) * 800) / 803, // new cicero (12 new didot) - sp: ((1 / 65536) * 800) / 803, // scaled point (TeX's internal smallest unit) - mm: (25.4 / 72), - cm: (2.54 / 72), - in: (1 / 72), - px: (96 / 72) -}; - -/** - * Determine whether the specified unit (either a string defining the unit - * or a "size" parse node containing a unit field) is valid. - */ -const validUnits = [ - "em", - "ex", - "mu", - "pt", - "mm", - "cm", - "in", - "px", - "bp", - "pc", - "dd", - "cc", - "nd", - "nc", - "sp" -]; - -const validUnit = function(unit) { - if (typeof unit !== "string") { - unit = unit.unit; - } - return validUnits.indexOf(unit) > -1 -}; - -const emScale = styleLevel => { - const scriptLevel = Math.max(styleLevel - 1, 0); - return [1, 0.7, 0.5][scriptLevel] -}; - -/* - * Convert a "size" parse node (with numeric "number" and string "unit" fields, - * as parsed by functions.js argType "size") into a CSS value. - */ -const calculateSize = function(sizeValue, style) { - let number = sizeValue.number; - if (style.maxSize[0] < 0 && number > 0) { - return { number: 0, unit: "em" } - } - const unit = sizeValue.unit; - switch (unit) { - case "mm": - case "cm": - case "in": - case "px": { - const numInCssPts = number * ptPerUnit[unit]; - if (numInCssPts > style.maxSize[1]) { - return { number: style.maxSize[1], unit: "pt" } - } - return { number, unit }; // absolute CSS units. - } - case "em": - case "ex": { - // In TeX, em and ex do not change size in \scriptstyle. - if (unit === "ex") { number *= 0.431; } - number = Math.min(number / emScale(style.level), style.maxSize[0]); - return { number: utils.round(number), unit: "em" }; - } - case "bp": { - if (number > style.maxSize[1]) { number = style.maxSize[1]; } - return { number, unit: "pt" }; // TeX bp is a CSS pt. (1/72 inch). - } - case "pt": - case "pc": - case "dd": - case "cc": - case "nd": - case "nc": - case "sp": { - number = Math.min(number * ptPerUnit[unit], style.maxSize[1]); - return { number: utils.round(number), unit: "pt" } - } - case "mu": { - number = Math.min(number / 18, style.maxSize[0]); - return { number: utils.round(number), unit: "em" } - } - default: - throw new ParseError("Invalid unit: '" + unit + "'") - } -}; - -// Helper functions - -const padding$2 = width => { - const node = new mathMLTree.MathNode("mspace"); - node.setAttribute("width", width + "em"); - return node -}; - -const paddedNode = (group, lspace = 0.3, rspace = 0) => { - if (group == null && rspace === 0) { return padding$2(lspace) } - const row = group ? [group] : []; - if (lspace !== 0) { row.unshift(padding$2(lspace)); } - if (rspace > 0) { row.push(padding$2(rspace)); } - return new mathMLTree.MathNode("mrow", row) -}; - -const labelSize = (size, scriptLevel) => Number(size) / emScale(scriptLevel); - -const munderoverNode = (fName, body, below, style) => { - const arrowNode = stretchy.mathMLnode(fName); - // Is this the short part of a mhchem equilibrium arrow? - const isEq = fName.slice(1, 3) === "eq"; - const minWidth = fName.charAt(1) === "x" - ? "1.75" // mathtools extensible arrows are ≥ 1.75em long - : fName.slice(2, 4) === "cd" - ? "3.0" // cd package arrows - : isEq - ? "1.0" // The shorter harpoon of a mhchem equilibrium arrow - : "2.0"; // other mhchem arrows - // TODO: When Firefox supports minsize, use the next line. - //arrowNode.setAttribute("minsize", String(minWidth) + "em") - arrowNode.setAttribute("lspace", "0"); - arrowNode.setAttribute("rspace", (isEq ? "0.5em" : "0")); - - // upper and lower labels are set to scriptlevel by MathML - // So we have to adjust our label dimensions accordingly. - const labelStyle = style.withLevel(style.level < 2 ? 2 : 3); - const minArrowWidth = labelSize(minWidth, labelStyle.level); - // The dummyNode will be inside a inside a - // So it will be at scriptlevel 3 - const dummyWidth = labelSize(minWidth, 3); - const emptyLabel = paddedNode(null, minArrowWidth.toFixed(4), 0); - const dummyNode = paddedNode(null, dummyWidth.toFixed(4), 0); - // The arrow is a little longer than the label. Set a spacer length. - const space = labelSize((isEq ? 0 : 0.3), labelStyle.level).toFixed(4); - let upperNode; - let lowerNode; - - const gotUpper = (body && body.body && - // \hphantom visible content - (body.body.body || body.body.length > 0)); - if (gotUpper) { - let label = buildGroup$1(body, labelStyle); - label = paddedNode(label, space, space); - // Since Firefox does not support minsize, stack a invisible node - // on top of the label. Its width will serve as a min-width. - // TODO: Refactor this after Firefox supports minsize. - upperNode = new mathMLTree.MathNode("mover", [label, dummyNode]); - } - const gotLower = (below && below.body && - (below.body.body || below.body.length > 0)); - if (gotLower) { - let label = buildGroup$1(below, labelStyle); - label = paddedNode(label, space, space); - lowerNode = new mathMLTree.MathNode("munder", [label, dummyNode]); - } - - let node; - if (!gotUpper && !gotLower) { - node = new mathMLTree.MathNode("mover", [arrowNode, emptyLabel]); - } else if (gotUpper && gotLower) { - node = new mathMLTree.MathNode("munderover", [arrowNode, lowerNode, upperNode]); - } else if (gotUpper) { - node = new mathMLTree.MathNode("mover", [arrowNode, upperNode]); - } else { - node = new mathMLTree.MathNode("munder", [arrowNode, lowerNode]); - } - if (minWidth === "3.0") { node.style.height = "1em"; } // CD environment - node.setAttribute("accent", "false"); // Necessary for MS Word - return node -}; - -// Stretchy arrows with an optional argument -defineFunction({ - type: "xArrow", - names: [ - "\\xleftarrow", - "\\xrightarrow", - "\\xLeftarrow", - "\\xRightarrow", - "\\xleftrightarrow", - "\\xLeftrightarrow", - "\\xhookleftarrow", - "\\xhookrightarrow", - "\\xmapsto", - "\\xrightharpoondown", - "\\xrightharpoonup", - "\\xleftharpoondown", - "\\xleftharpoonup", - "\\xlongequal", - "\\xtwoheadrightarrow", - "\\xtwoheadleftarrow", - // The next 5 functions are here only to support mhchem - "\\yields", - "\\yieldsLeft", - "\\mesomerism", - "\\longrightharpoonup", - "\\longleftharpoondown", - // The next 3 functions are here only to support the {CD} environment. - "\\\\cdrightarrow", - "\\\\cdleftarrow", - "\\\\cdlongequal" - ], - props: { - numArgs: 1, - numOptionalArgs: 1 - }, - handler({ parser, funcName }, args, optArgs) { - return { - type: "xArrow", - mode: parser.mode, - name: funcName, - body: args[0], - below: optArgs[0] - }; - }, - mathmlBuilder(group, style) { - // Build the arrow and its labels. - const node = munderoverNode(group.name, group.body, group.below, style); - // Create operator spacing for a relation. - const row = [node]; - row.unshift(padding$2(0.2778)); - row.push(padding$2(0.2778)); - return new mathMLTree.MathNode("mrow", row) - } -}); - -const arrowComponent = { - "\\xtofrom": ["\\xrightarrow", "\\xleftarrow"], - "\\xleftrightharpoons": ["\\xleftharpoonup", "\\xrightharpoondown"], - "\\xrightleftharpoons": ["\\xrightharpoonup", "\\xleftharpoondown"], - "\\yieldsLeftRight": ["\\yields", "\\yieldsLeft"], - // The next three all get the same harpoon glyphs. Only the lengths and paddings differ. - "\\equilibrium": ["\\longrightharpoonup", "\\longleftharpoondown"], - "\\equilibriumRight": ["\\longrightharpoonup", "\\eqleftharpoondown"], - "\\equilibriumLeft": ["\\eqrightharpoonup", "\\longleftharpoondown"] -}; - -// Browsers are not good at stretching a glyph that contains a pair of stacked arrows such as ⇄. -// So we stack a pair of single arrows. -defineFunction({ - type: "stackedArrow", - names: [ - "\\xtofrom", // expfeil - "\\xleftrightharpoons", // mathtools - "\\xrightleftharpoons", // mathtools - "\\yieldsLeftRight", // mhchem - "\\equilibrium", // mhchem - "\\equilibriumRight", - "\\equilibriumLeft" - ], - props: { - numArgs: 1, - numOptionalArgs: 1 - }, - handler({ parser, funcName }, args, optArgs) { - const lowerArrowBody = args[0] - ? { - type: "hphantom", - mode: parser.mode, - body: args[0] - } - : null; - const upperArrowBelow = optArgs[0] - ? { - type: "hphantom", - mode: parser.mode, - body: optArgs[0] - } - : null; - return { - type: "stackedArrow", - mode: parser.mode, - name: funcName, - body: args[0], - upperArrowBelow, - lowerArrowBody, - below: optArgs[0] - }; - }, - mathmlBuilder(group, style) { - const topLabel = arrowComponent[group.name][0]; - const botLabel = arrowComponent[group.name][1]; - const topArrow = munderoverNode(topLabel, group.body, group.upperArrowBelow, style); - const botArrow = munderoverNode(botLabel, group.lowerArrowBody, group.below, style); - let wrapper; - - const raiseNode = new mathMLTree.MathNode("mpadded", [topArrow]); - raiseNode.setAttribute("voffset", "0.3em"); - raiseNode.setAttribute("height", "+0.3em"); - raiseNode.setAttribute("depth", "-0.3em"); - // One of the arrows is given ~zero width. so the other has the same horzontal alignment. - if (group.name === "\\equilibriumLeft") { - const botNode = new mathMLTree.MathNode("mpadded", [botArrow]); - botNode.setAttribute("width", "0.5em"); - wrapper = new mathMLTree.MathNode( - "mpadded", - [padding$2(0.2778), botNode, raiseNode, padding$2(0.2778)] - ); - } else { - raiseNode.setAttribute("width", (group.name === "\\equilibriumRight" ? "0.5em" : "0")); - wrapper = new mathMLTree.MathNode( - "mpadded", - [padding$2(0.2778), raiseNode, botArrow, padding$2(0.2778)] - ); - } - - wrapper.setAttribute("voffset", "-0.18em"); - wrapper.setAttribute("height", "-0.18em"); - wrapper.setAttribute("depth", "+0.18em"); - return wrapper - } -}); - -/** - * Asserts that the node is of the given type and returns it with stricter - * typing. Throws if the node's type does not match. - */ -function assertNodeType(node, type) { - if (!node || node.type !== type) { - throw new Error( - `Expected node of type ${type}, but got ` + - (node ? `node of type ${node.type}` : String(node)) - ); - } - return node; -} - -/** - * Returns the node more strictly typed iff it is of the given type. Otherwise, - * returns null. - */ -function assertSymbolNodeType(node) { - const typedNode = checkSymbolNodeType(node); - if (!typedNode) { - throw new Error( - `Expected node of symbol group type, but got ` + - (node ? `node of type ${node.type}` : String(node)) - ); - } - return typedNode; -} - -/** - * Returns the node more strictly typed iff it is of the given type. Otherwise, - * returns null. - */ -function checkSymbolNodeType(node) { - if (node && (node.type === "atom" || - Object.prototype.hasOwnProperty.call(NON_ATOMS, node.type))) { - return node; - } - return null; -} - -const cdArrowFunctionName = { - ">": "\\\\cdrightarrow", - "<": "\\\\cdleftarrow", - "=": "\\\\cdlongequal", - A: "\\uparrow", - V: "\\downarrow", - "|": "\\Vert", - ".": "no arrow" -}; - -const newCell = () => { - // Create an empty cell, to be filled below with parse nodes. - return { type: "styling", body: [], mode: "math", scriptLevel: "display" }; -}; - -const isStartOfArrow = (node) => { - return node.type === "textord" && node.text === "@"; -}; - -const isLabelEnd = (node, endChar) => { - return (node.type === "mathord" || node.type === "atom") && node.text === endChar; -}; - -function cdArrow(arrowChar, labels, parser) { - // Return a parse tree of an arrow and its labels. - // This acts in a way similar to a macro expansion. - const funcName = cdArrowFunctionName[arrowChar]; - switch (funcName) { - case "\\\\cdrightarrow": - case "\\\\cdleftarrow": - return parser.callFunction(funcName, [labels[0]], [labels[1]]); - case "\\uparrow": - case "\\downarrow": { - const leftLabel = parser.callFunction("\\\\cdleft", [labels[0]], []); - const bareArrow = { - type: "atom", - text: funcName, - mode: "math", - family: "rel" - }; - const sizedArrow = parser.callFunction("\\Big", [bareArrow], []); - const rightLabel = parser.callFunction("\\\\cdright", [labels[1]], []); - const arrowGroup = { - type: "ordgroup", - mode: "math", - body: [leftLabel, sizedArrow, rightLabel], - semisimple: true - }; - return parser.callFunction("\\\\cdparent", [arrowGroup], []); - } - case "\\\\cdlongequal": - return parser.callFunction("\\\\cdlongequal", [], []); - case "\\Vert": { - const arrow = { type: "textord", text: "\\Vert", mode: "math" }; - return parser.callFunction("\\Big", [arrow], []); - } - default: - return { type: "textord", text: " ", mode: "math" }; - } -} - -function parseCD(parser) { - // Get the array's parse nodes with \\ temporarily mapped to \cr. - const parsedRows = []; - parser.gullet.beginGroup(); - parser.gullet.macros.set("\\cr", "\\\\\\relax"); - parser.gullet.beginGroup(); - while (true) { // eslint-disable-line no-constant-condition - // Get the parse nodes for the next row. - parsedRows.push(parser.parseExpression(false, "\\\\")); - parser.gullet.endGroup(); - parser.gullet.beginGroup(); - const next = parser.fetch().text; - if (next === "&" || next === "\\\\") { - parser.consume(); - } else if (next === "\\end") { - if (parsedRows[parsedRows.length - 1].length === 0) { - parsedRows.pop(); // final row ended in \\ - } - break; - } else { - throw new ParseError("Expected \\\\ or \\cr or \\end", parser.nextToken); - } - } - - let row = []; - const body = [row]; - - // Loop thru the parse nodes. Collect them into cells and arrows. - for (let i = 0; i < parsedRows.length; i++) { - // Start a new row. - const rowNodes = parsedRows[i]; - // Create the first cell. - let cell = newCell(); - - for (let j = 0; j < rowNodes.length; j++) { - if (!isStartOfArrow(rowNodes[j])) { - // If a parseNode is not an arrow, it goes into a cell. - cell.body.push(rowNodes[j]); - } else { - // Parse node j is an "@", the start of an arrow. - // Before starting on the arrow, push the cell into `row`. - row.push(cell); - - // Now collect parseNodes into an arrow. - // The character after "@" defines the arrow type. - j += 1; - const arrowChar = assertSymbolNodeType(rowNodes[j]).text; - - // Create two empty label nodes. We may or may not use them. - const labels = new Array(2); - labels[0] = { type: "ordgroup", mode: "math", body: [] }; - labels[1] = { type: "ordgroup", mode: "math", body: [] }; - - // Process the arrow. - if ("=|.".indexOf(arrowChar) > -1) ; else if ("<>AV".indexOf(arrowChar) > -1) { - // Four arrows, `@>>>`, `@<<<`, `@AAA`, and `@VVV`, each take - // two optional labels. E.g. the right-point arrow syntax is - // really: @>{optional label}>{optional label}> - // Collect parseNodes into labels. - for (let labelNum = 0; labelNum < 2; labelNum++) { - let inLabel = true; - for (let k = j + 1; k < rowNodes.length; k++) { - if (isLabelEnd(rowNodes[k], arrowChar)) { - inLabel = false; - j = k; - break; - } - if (isStartOfArrow(rowNodes[k])) { - throw new ParseError( - "Missing a " + arrowChar + " character to complete a CD arrow.", - rowNodes[k] - ); - } - - labels[labelNum].body.push(rowNodes[k]); - } - if (inLabel) { - // isLabelEnd never returned a true. - throw new ParseError( - "Missing a " + arrowChar + " character to complete a CD arrow.", - rowNodes[j] - ); - } - } - } else { - throw new ParseError(`Expected one of "<>AV=|." after @.`); - } - - // Now join the arrow to its labels. - const arrow = cdArrow(arrowChar, labels, parser); - - // Wrap the arrow in a styling node - row.push(arrow); - // In CD's syntax, cells are implicit. That is, everything that - // is not an arrow gets collected into a cell. So create an empty - // cell now. It will collect upcoming parseNodes. - cell = newCell(); - } - } - if (i % 2 === 0) { - // Even-numbered rows consist of: cell, arrow, cell, arrow, ... cell - // The last cell is not yet pushed into `row`, so: - row.push(cell); - } else { - // Odd-numbered rows consist of: vert arrow, empty cell, ... vert arrow - // Remove the empty cell that was placed at the beginning of `row`. - row.shift(); - } - row = []; - body.push(row); - } - body.pop(); - - // End row group - parser.gullet.endGroup(); - // End array group defining \\ - parser.gullet.endGroup(); - - return { - type: "array", - mode: "math", - body, - envClasses: ["jot", "cd"], - cols: [], - hLinesBeforeRow: new Array(body.length + 1).fill([]) - }; -} - -// The functions below are not available for general use. -// They are here only for internal use by the {CD} environment in placing labels -// next to vertical arrows. - -// We don't need any such functions for horizontal arrows because we can reuse -// the functionality that already exists for extensible arrows. - -defineFunction({ - type: "cdlabel", - names: ["\\\\cdleft", "\\\\cdright"], - props: { - numArgs: 1 - }, - handler({ parser, funcName }, args) { - return { - type: "cdlabel", - mode: parser.mode, - side: funcName.slice(4), - label: args[0] - }; - }, - mathmlBuilder(group, style) { - let label = new mathMLTree.MathNode("mrow", [buildGroup$1(group.label, style)]); - label = new mathMLTree.MathNode("mpadded", [label]); - label.setAttribute("width", "0"); - if (group.side === "left") { - label.setAttribute("lspace", "-1width"); - } - // We have to guess at vertical alignment. We know the arrow is 1.8em tall, - // But we don't know the height or depth of the label. - label.setAttribute("voffset", "0.7em"); - label = new mathMLTree.MathNode("mstyle", [label]); - label.setAttribute("displaystyle", "false"); - label.setAttribute("scriptlevel", "1"); - return label; - } -}); - -defineFunction({ - type: "cdlabelparent", - names: ["\\\\cdparent"], - props: { - numArgs: 1 - }, - handler({ parser }, args) { - return { - type: "cdlabelparent", - mode: parser.mode, - fragment: args[0] - }; - }, - mathmlBuilder(group, style) { - return new mathMLTree.MathNode("mrow", [buildGroup$1(group.fragment, style)]); - } -}); - -// \@char is an internal function that takes a grouped decimal argument like -// {123} and converts into symbol with code 123. It is used by the *macro* -// \char defined in macros.js. -defineFunction({ - type: "textord", - names: ["\\@char"], - props: { - numArgs: 1, - allowedInText: true - }, - handler({ parser, token }, args) { - const arg = assertNodeType(args[0], "ordgroup"); - const group = arg.body; - let number = ""; - for (let i = 0; i < group.length; i++) { - const node = assertNodeType(group[i], "textord"); - number += node.text; - } - const code = parseInt(number); - if (isNaN(code)) { - throw new ParseError(`\\@char has non-numeric argument ${number}`, token) - } - return { - type: "textord", - mode: parser.mode, - text: String.fromCodePoint(code) - } - } -}); - -// Helpers -const htmlRegEx = /^(#[a-f0-9]{3}|#?[a-f0-9]{6})$/i; -const htmlOrNameRegEx = /^(#[a-f0-9]{3}|#?[a-f0-9]{6}|[a-z]+)$/i; -const RGBregEx = /^ *\d{1,3} *(?:, *\d{1,3} *){2}$/; -const rgbRegEx = /^ *[10](?:\.\d*)? *(?:, *[10](?:\.\d*)? *){2}$/; -const xcolorHtmlRegEx = /^[a-f0-9]{6}$/i; -const toHex = num => { - let str = num.toString(16); - if (str.length === 1) { str = "0" + str; } - return str -}; - -// Colors from Tables 4.1 and 4.2 of the xcolor package. -// Table 4.1 (lower case) RGB values are taken from chroma and xcolor.dtx. -// Table 4.2 (Capitalizzed) values were sampled, because Chroma contains a unreliable -// conversion from cmyk to RGB. See https://tex.stackexchange.com/a/537274. -const xcolors = JSON.parse(`{ - "Apricot": "#ffb484", - "Aquamarine": "#08b4bc", - "Bittersweet": "#c84c14", - "blue": "#0000FF", - "Blue": "#303494", - "BlueGreen": "#08b4bc", - "BlueViolet": "#503c94", - "BrickRed": "#b8341c", - "brown": "#BF8040", - "Brown": "#802404", - "BurntOrange": "#f8941c", - "CadetBlue": "#78749c", - "CarnationPink": "#f884b4", - "Cerulean": "#08a4e4", - "CornflowerBlue": "#40ace4", - "cyan": "#00FFFF", - "Cyan": "#08acec", - "Dandelion": "#ffbc44", - "darkgray": "#404040", - "DarkOrchid": "#a8548c", - "Emerald": "#08ac9c", - "ForestGreen": "#089c54", - "Fuchsia": "#90348c", - "Goldenrod": "#ffdc44", - "gray": "#808080", - "Gray": "#98949c", - "green": "#00FF00", - "Green": "#08a44c", - "GreenYellow": "#e0e474", - "JungleGreen": "#08ac9c", - "Lavender": "#f89cc4", - "lightgray": "#c0c0c0", - "lime": "#BFFF00", - "LimeGreen": "#90c43c", - "magenta": "#FF00FF", - "Magenta": "#f0048c", - "Mahogany": "#b0341c", - "Maroon": "#b03434", - "Melon": "#f89c7c", - "MidnightBlue": "#086494", - "Mulberry": "#b03c94", - "NavyBlue": "#086cbc", - "olive": "#7F7F00", - "OliveGreen": "#407c34", - "orange": "#FF8000", - "Orange": "#f8843c", - "OrangeRed": "#f0145c", - "Orchid": "#b074ac", - "Peach": "#f8945c", - "Periwinkle": "#8074bc", - "PineGreen": "#088c74", - "pink": "#ff7f7f", - "Plum": "#98248c", - "ProcessBlue": "#08b4ec", - "purple": "#BF0040", - "Purple": "#a0449c", - "RawSienna": "#983c04", - "red": "#ff0000", - "Red": "#f01c24", - "RedOrange": "#f86434", - "RedViolet": "#a0246c", - "Rhodamine": "#f0549c", - "Royallue": "#0874bc", - "RoyalPurple": "#683c9c", - "RubineRed": "#f0047c", - "Salmon": "#f8948c", - "SeaGreen": "#30bc9c", - "Sepia": "#701404", - "SkyBlue": "#48c4dc", - "SpringGreen": "#c8dc64", - "Tan": "#e09c74", - "teal": "#007F7F", - "TealBlue": "#08acb4", - "Thistle": "#d884b4", - "Turquoise": "#08b4cc", - "violet": "#800080", - "Violet": "#60449c", - "VioletRed": "#f054a4", - "WildStrawberry": "#f0246c", - "yellow": "#FFFF00", - "Yellow": "#fff404", - "YellowGreen": "#98cc6c", - "YellowOrange": "#ffa41c" -}`); - -const colorFromSpec = (model, spec) => { - let color = ""; - if (model === "HTML") { - if (!htmlRegEx.test(spec)) { - throw new ParseError("Invalid HTML input.") - } - color = spec; - } else if (model === "RGB") { - if (!RGBregEx.test(spec)) { - throw new ParseError("Invalid RGB input.") - } - spec.split(",").map(e => { color += toHex(Number(e.trim())); }); - } else { - if (!rgbRegEx.test(spec)) { - throw new ParseError("Invalid rbg input.") - } - spec.split(",").map(e => { - const num = Number(e.trim()); - if (num > 1) { throw new ParseError("Color rgb input must be < 1.") } - color += toHex(Number((num * 255).toFixed(0))); - }); - } - if (color.charAt(0) !== "#") { color = "#" + color; } - return color -}; - -const validateColor = (color, macros, token) => { - const macroName = `\\\\color@${color}`; // from \defineColor. - const match = htmlOrNameRegEx.exec(color); - if (!match) { throw new ParseError("Invalid color: '" + color + "'", token) } - // We allow a 6-digit HTML color spec without a leading "#". - // This follows the xcolor package's HTML color model. - // Predefined color names are all missed by this RegEx pattern. - if (xcolorHtmlRegEx.test(color)) { - return "#" + color - } else if (color.charAt(0) === "#") { - return color - } else if (macros.has(macroName)) { - color = macros.get(macroName).tokens[0].text; - } else if (xcolors[color]) { - color = xcolors[color]; - } - return color -}; - -const mathmlBuilder$9 = (group, style) => { - // In LaTeX, color is not supposed to change the spacing of any node. - // So instead of wrapping the group in an , we apply - // the color individually to each node and return a document fragment. - let expr = buildExpression(group.body, style.withColor(group.color)); - expr = expr.map(e => { - e.style.color = group.color; - return e - }); - return mathMLTree.newDocumentFragment(expr) -}; - -defineFunction({ - type: "color", - names: ["\\textcolor"], - props: { - numArgs: 2, - numOptionalArgs: 1, - allowedInText: true, - argTypes: ["raw", "raw", "original"] - }, - handler({ parser, token }, args, optArgs) { - const model = optArgs[0] && assertNodeType(optArgs[0], "raw").string; - let color = ""; - if (model) { - const spec = assertNodeType(args[0], "raw").string; - color = colorFromSpec(model, spec); - } else { - color = validateColor(assertNodeType(args[0], "raw").string, parser.gullet.macros, token); - } - const body = args[1]; - return { - type: "color", - mode: parser.mode, - color, - body: ordargument(body) - } - }, - mathmlBuilder: mathmlBuilder$9 -}); - -defineFunction({ - type: "color", - names: ["\\color"], - props: { - numArgs: 1, - numOptionalArgs: 1, - allowedInText: true, - argTypes: ["raw", "raw"] - }, - handler({ parser, breakOnTokenText, token }, args, optArgs) { - const model = optArgs[0] && assertNodeType(optArgs[0], "raw").string; - let color = ""; - if (model) { - const spec = assertNodeType(args[0], "raw").string; - color = colorFromSpec(model, spec); - } else { - color = validateColor(assertNodeType(args[0], "raw").string, parser.gullet.macros, token); - } - - // Parse out the implicit body that should be colored. - const body = parser.parseExpression(true, breakOnTokenText, true); - - return { - type: "color", - mode: parser.mode, - color, - body - } - }, - mathmlBuilder: mathmlBuilder$9 -}); - -defineFunction({ - type: "color", - names: ["\\definecolor"], - props: { - numArgs: 3, - allowedInText: true, - argTypes: ["raw", "raw", "raw"] - }, - handler({ parser, funcName, token }, args) { - const name = assertNodeType(args[0], "raw").string; - if (!/^[A-Za-z]+$/.test(name)) { - throw new ParseError("Color name must be latin letters.", token) - } - const model = assertNodeType(args[1], "raw").string; - if (!["HTML", "RGB", "rgb"].includes(model)) { - throw new ParseError("Color model must be HTML, RGB, or rgb.", token) - } - const spec = assertNodeType(args[2], "raw").string; - const color = colorFromSpec(model, spec); - parser.gullet.macros.set(`\\\\color@${name}`, { tokens: [{ text: color }], numArgs: 0 }); - return { type: "internal", mode: parser.mode } - } - // No mathmlBuilder. The point of \definecolor is to set a macro. -}); - -// Row breaks within tabular environments, and line breaks at top level - -// \DeclareRobustCommand\\{...\@xnewline} -defineFunction({ - type: "cr", - names: ["\\\\"], - props: { - numArgs: 0, - numOptionalArgs: 0, - allowedInText: true - }, - - handler({ parser }, args, optArgs) { - const size = parser.gullet.future().text === "[" ? parser.parseSizeGroup(true) : null; - const newLine = !parser.settings.displayMode; - return { - type: "cr", - mode: parser.mode, - newLine, - size: size && assertNodeType(size, "size").value - } - }, - - // The following builder is called only at the top level, - // not within tabular/array environments. - - mathmlBuilder(group, style) { - // MathML 3.0 calls for newline to occur in an or an . - // Ref: https://www.w3.org/TR/MathML3/chapter3.html#presm.linebreaking - const node = new mathMLTree.MathNode("mo"); - if (group.newLine) { - node.setAttribute("linebreak", "newline"); - if (group.size) { - const size = calculateSize(group.size, style); - node.setAttribute("height", size.number + size.unit); - } - } - return node - } -}); - -const globalMap = { - "\\global": "\\global", - "\\long": "\\\\globallong", - "\\\\globallong": "\\\\globallong", - "\\def": "\\gdef", - "\\gdef": "\\gdef", - "\\edef": "\\xdef", - "\\xdef": "\\xdef", - "\\let": "\\\\globallet", - "\\futurelet": "\\\\globalfuture" -}; - -const checkControlSequence = (tok) => { - const name = tok.text; - if (/^(?:[\\{}$&#^_]|EOF)$/.test(name)) { - throw new ParseError("Expected a control sequence", tok); - } - return name; -}; - -const getRHS = (parser) => { - let tok = parser.gullet.popToken(); - if (tok.text === "=") { - // consume optional equals - tok = parser.gullet.popToken(); - if (tok.text === " ") { - // consume one optional space - tok = parser.gullet.popToken(); - } - } - return tok; -}; - -const letCommand = (parser, name, tok, global) => { - let macro = parser.gullet.macros.get(tok.text); - if (macro == null) { - // don't expand it later even if a macro with the same name is defined - // e.g., \let\foo=\frac \def\frac{\relax} \frac12 - tok.noexpand = true; - macro = { - tokens: [tok], - numArgs: 0, - // reproduce the same behavior in expansion - unexpandable: !parser.gullet.isExpandable(tok.text) - }; - } - parser.gullet.macros.set(name, macro, global); -}; - -// -> | -// -> |\global -// -> | -// -> \global|\long|\outer -defineFunction({ - type: "internal", - names: [ - "\\global", - "\\long", - "\\\\globallong" // can’t be entered directly - ], - props: { - numArgs: 0, - allowedInText: true - }, - handler({ parser, funcName }) { - parser.consumeSpaces(); - const token = parser.fetch(); - if (globalMap[token.text]) { - // Temml doesn't have \par, so ignore \long - if (funcName === "\\global" || funcName === "\\\\globallong") { - token.text = globalMap[token.text]; - } - return assertNodeType(parser.parseFunction(), "internal"); - } - throw new ParseError(`Invalid token after macro prefix`, token); - } -}); - -// Basic support for macro definitions: \def, \gdef, \edef, \xdef -// -> -// -> \def|\gdef|\edef|\xdef -// -> -defineFunction({ - type: "internal", - names: ["\\def", "\\gdef", "\\edef", "\\xdef"], - props: { - numArgs: 0, - allowedInText: true, - primitive: true - }, - handler({ parser, funcName }) { - let tok = parser.gullet.popToken(); - const name = tok.text; - if (/^(?:[\\{}$&#^_]|EOF)$/.test(name)) { - throw new ParseError("Expected a control sequence", tok); - } - - let numArgs = 0; - let insert; - const delimiters = [[]]; - // contains no braces - while (parser.gullet.future().text !== "{") { - tok = parser.gullet.popToken(); - if (tok.text === "#") { - // If the very last character of the is #, so that - // this # is immediately followed by {, TeX will behave as if the { - // had been inserted at the right end of both the parameter text - // and the replacement text. - if (parser.gullet.future().text === "{") { - insert = parser.gullet.future(); - delimiters[numArgs].push("{"); - break; - } - - // A parameter, the first appearance of # must be followed by 1, - // the next by 2, and so on; up to nine #’s are allowed - tok = parser.gullet.popToken(); - if (!/^[1-9]$/.test(tok.text)) { - throw new ParseError(`Invalid argument number "${tok.text}"`); - } - if (parseInt(tok.text) !== numArgs + 1) { - throw new ParseError(`Argument number "${tok.text}" out of order`); - } - numArgs++; - delimiters.push([]); - } else if (tok.text === "EOF") { - throw new ParseError("Expected a macro definition"); - } else { - delimiters[numArgs].push(tok.text); - } - } - // replacement text, enclosed in '{' and '}' and properly nested - let { tokens } = parser.gullet.consumeArg(); - if (insert) { - tokens.unshift(insert); - } - - if (funcName === "\\edef" || funcName === "\\xdef") { - tokens = parser.gullet.expandTokens(tokens); - if (tokens.length > parser.gullet.settings.maxExpand) { - throw new ParseError("Too many expansions in an " + funcName); - } - tokens.reverse(); // to fit in with stack order - } - // Final arg is the expansion of the macro - parser.gullet.macros.set( - name, - { tokens, numArgs, delimiters }, - funcName === globalMap[funcName] - ); - return { type: "internal", mode: parser.mode }; - } -}); - -// -> -// -> \futurelet -// | \let -// -> |= -defineFunction({ - type: "internal", - names: [ - "\\let", - "\\\\globallet" // can’t be entered directly - ], - props: { - numArgs: 0, - allowedInText: true, - primitive: true - }, - handler({ parser, funcName }) { - const name = checkControlSequence(parser.gullet.popToken()); - parser.gullet.consumeSpaces(); - const tok = getRHS(parser); - letCommand(parser, name, tok, funcName === "\\\\globallet"); - return { type: "internal", mode: parser.mode }; - } -}); - -// ref: https://www.tug.org/TUGboat/tb09-3/tb22bechtolsheim.pdf -defineFunction({ - type: "internal", - names: [ - "\\futurelet", - "\\\\globalfuture" // can’t be entered directly - ], - props: { - numArgs: 0, - allowedInText: true, - primitive: true - }, - handler({ parser, funcName }) { - const name = checkControlSequence(parser.gullet.popToken()); - const middle = parser.gullet.popToken(); - const tok = parser.gullet.popToken(); - letCommand(parser, name, tok, funcName === "\\\\globalfuture"); - parser.gullet.pushToken(tok); - parser.gullet.pushToken(middle); - return { type: "internal", mode: parser.mode }; - } -}); - -defineFunction({ - type: "internal", - names: ["\\newcommand", "\\renewcommand", "\\providecommand"], - props: { - numArgs: 0, - allowedInText: true, - primitive: true - }, - handler({ parser, funcName }) { - let name = ""; - const tok = parser.gullet.popToken(); - if (tok.text === "{") { - name = checkControlSequence(parser.gullet.popToken()); - parser.gullet.popToken(); - } else { - name = checkControlSequence(tok); - } - - const exists = parser.gullet.isDefined(name); - if (exists && funcName === "\\newcommand") { - throw new ParseError( - `\\newcommand{${name}} attempting to redefine ${name}; use \\renewcommand` - ); - } - if (!exists && funcName === "\\renewcommand") { - throw new ParseError( - `\\renewcommand{${name}} when command ${name} does not yet exist; use \\newcommand` - ); - } - - let numArgs = 0; - if (parser.gullet.future().text === "[") { - let tok = parser.gullet.popToken(); - tok = parser.gullet.popToken(); - if (!/^[0-9]$/.test(tok.text)) { - throw new ParseError(`Invalid number of arguments: "${tok.text}"`); - } - numArgs = parseInt(tok.text); - tok = parser.gullet.popToken(); - if (tok.text !== "]") { - throw new ParseError(`Invalid argument "${tok.text}"`); - } - } - - // replacement text, enclosed in '{' and '}' and properly nested - const { tokens } = parser.gullet.consumeArg(); - - parser.gullet.macros.set( - name, - { tokens, numArgs }, - !parser.settings.strict - ); - - return { type: "internal", mode: parser.mode }; - - } -}); - -// Extra data needed for the delimiter handler down below -const delimiterSizes = { - "\\bigl": { mclass: "mopen", size: 1 }, - "\\Bigl": { mclass: "mopen", size: 2 }, - "\\biggl": { mclass: "mopen", size: 3 }, - "\\Biggl": { mclass: "mopen", size: 4 }, - "\\bigr": { mclass: "mclose", size: 1 }, - "\\Bigr": { mclass: "mclose", size: 2 }, - "\\biggr": { mclass: "mclose", size: 3 }, - "\\Biggr": { mclass: "mclose", size: 4 }, - "\\bigm": { mclass: "mrel", size: 1 }, - "\\Bigm": { mclass: "mrel", size: 2 }, - "\\biggm": { mclass: "mrel", size: 3 }, - "\\Biggm": { mclass: "mrel", size: 4 }, - "\\big": { mclass: "mord", size: 1 }, - "\\Big": { mclass: "mord", size: 2 }, - "\\bigg": { mclass: "mord", size: 3 }, - "\\Bigg": { mclass: "mord", size: 4 } -}; - -const delimiters = [ - "(", - "\\lparen", - ")", - "\\rparen", - "[", - "\\lbrack", - "]", - "\\rbrack", - "\\{", - "\\lbrace", - "\\}", - "\\rbrace", - "⦇", - "\\llparenthesis", - "⦈", - "\\rrparenthesis", - "\\lfloor", - "\\rfloor", - "\u230a", - "\u230b", - "\\lceil", - "\\rceil", - "\u2308", - "\u2309", - "<", - ">", - "\\langle", - "\u27e8", - "\\rangle", - "\u27e9", - "\\lAngle", - "\u27ea", - "\\rAngle", - "\u27eb", - "\\llangle", - "⦉", - "\\rrangle", - "⦊", - "\\lt", - "\\gt", - "\\lvert", - "\\rvert", - "\\lVert", - "\\rVert", - "\\lgroup", - "\\rgroup", - "\u27ee", - "\u27ef", - "\\lmoustache", - "\\rmoustache", - "\u23b0", - "\u23b1", - "\\llbracket", - "\\rrbracket", - "\u27e6", - "\u27e6", - "\\lBrace", - "\\rBrace", - "\u2983", - "\u2984", - "/", - "\\backslash", - "|", - "\\vert", - "\\|", - "\\Vert", - "\\uparrow", - "\\Uparrow", - "\\downarrow", - "\\Downarrow", - "\\updownarrow", - "\\Updownarrow", - "." -]; - -// Export isDelimiter for benefit of parser. -const dels = ["}", "\\left", "\\middle", "\\right"]; -const isDelimiter = str => str.length > 0 && - (delimiters.includes(str) || delimiterSizes[str] || dels.includes(str)); - -// Metrics of the different sizes. Found by looking at TeX's output of -// $\bigl| // \Bigl| \biggl| \Biggl| \showlists$ -// Used to create stacked delimiters of appropriate sizes in makeSizedDelim. -const sizeToMaxHeight = [0, 1.2, 1.8, 2.4, 3.0]; - -// Delimiter functions -function checkDelimiter(delim, context) { - const symDelim = checkSymbolNodeType(delim); - if (symDelim && delimiters.includes(symDelim.text)) { - // If a character is not in the MathML operator dictionary, it will not stretch. - // Replace such characters w/characters that will stretch. - if (["/", "\u2044"].includes(symDelim.text)) { symDelim.text = "\u2215"; } - if (["<", "\\lt"].includes(symDelim.text)) { symDelim.text = "⟨"; } - if ([">", "\\gt"].includes(symDelim.text)) { symDelim.text = "⟩"; } - if (symDelim.text === "\\backslash") { symDelim.text = "\u2216"; } - return symDelim; - } else if (symDelim) { - throw new ParseError(`Invalid delimiter '${symDelim.text}' after '${context.funcName}'`, delim); - } else { - throw new ParseError(`Invalid delimiter type '${delim.type}'`, delim); - } -} - -defineFunction({ - type: "delimsizing", - names: [ - "\\bigl", - "\\Bigl", - "\\biggl", - "\\Biggl", - "\\bigr", - "\\Bigr", - "\\biggr", - "\\Biggr", - "\\bigm", - "\\Bigm", - "\\biggm", - "\\Biggm", - "\\big", - "\\Big", - "\\bigg", - "\\Bigg" - ], - props: { - numArgs: 1, - argTypes: ["primitive"] - }, - handler: (context, args) => { - const delim = checkDelimiter(args[0], context); - - return { - type: "delimsizing", - mode: context.parser.mode, - size: delimiterSizes[context.funcName].size, - mclass: delimiterSizes[context.funcName].mclass, - delim: delim.text - }; - }, - mathmlBuilder: (group) => { - const children = []; - - if (group.delim === ".") { group.delim = ""; } - children.push(makeText(group.delim, group.mode)); - - const node = new mathMLTree.MathNode("mo", children); - - if (group.mclass === "mopen" || group.mclass === "mclose") { - // Only some of the delimsizing functions act as fences, and they - // return "mopen" or "mclose" mclass. - node.setAttribute("fence", "true"); - } else { - // Explicitly disable fencing if it's not a fence, to override the - // defaults. - node.setAttribute("fence", "false"); - } - if (group.delim === "\u2216" || group.delim === "\\vert" || - group.delim === "|" || group.delim.indexOf("arrow") > -1) { - // We have to explicitly set stretchy to true. - node.setAttribute("stretchy", "true"); - } - node.setAttribute("symmetric", "true"); // Needed for tall arrows in Firefox. - node.setAttribute("minsize", sizeToMaxHeight[group.size] + "em"); - node.setAttribute("maxsize", sizeToMaxHeight[group.size] + "em"); - return node; - } -}); - -function assertParsed(group) { - if (!group.body) { - throw new Error("Bug: The leftright ParseNode wasn't fully parsed."); - } -} - -defineFunction({ - type: "leftright-right", - names: ["\\right"], - props: { - numArgs: 1, - argTypes: ["primitive"] - }, - handler: (context, args) => { - return { - type: "leftright-right", - mode: context.parser.mode, - delim: checkDelimiter(args[0], context).text - }; - } -}); - -defineFunction({ - type: "leftright", - names: ["\\left"], - props: { - numArgs: 1, - argTypes: ["primitive"] - }, - handler: (context, args) => { - const delim = checkDelimiter(args[0], context); - - const parser = context.parser; - // Parse out the implicit body - ++parser.leftrightDepth; - // parseExpression stops before '\\right' or `\\middle` - let body = parser.parseExpression(false, null, true); - let nextToken = parser.fetch(); - while (nextToken.text === "\\middle") { - // `\middle`, from the ε-TeX package, ends one group and starts another group. - // We had to parse this expression with `breakOnMiddle` enabled in order - // to get TeX-compliant parsing of \over. - // But we do not want, at this point, to end on \middle, so continue - // to parse until we fetch a `\right`. - parser.consume(); - const middle = parser.fetch().text; - if (!symbols.math[middle]) { - throw new ParseError(`Invalid delimiter '${middle}' after '\\middle'`); - } - checkDelimiter({ type: "atom", mode: "math", text: middle }, { funcName: "\\middle" }); - body.push({ type: "middle", mode: "math", delim: middle }); - parser.consume(); - body = body.concat(parser.parseExpression(false, null, true)); - nextToken = parser.fetch(); - } - --parser.leftrightDepth; - // Check the next token - parser.expect("\\right", false); - const right = assertNodeType(parser.parseFunction(), "leftright-right"); - return { - type: "leftright", - mode: parser.mode, - body, - left: delim.text, - right: right.delim - }; - }, - mathmlBuilder: (group, style) => { - assertParsed(group); - const inner = buildExpression(group.body, style); - - if (group.left === ".") { group.left = ""; } - const leftNode = new mathMLTree.MathNode("mo", [makeText(group.left, group.mode)]); - leftNode.setAttribute("fence", "true"); - leftNode.setAttribute("form", "prefix"); - if (group.left === "\u2216" || group.left.indexOf("arrow") > -1) { - leftNode.setAttribute("stretchy", "true"); - } - inner.unshift(leftNode); - - if (group.right === ".") { group.right = ""; } - const rightNode = new mathMLTree.MathNode("mo", [makeText(group.right, group.mode)]); - rightNode.setAttribute("fence", "true"); - rightNode.setAttribute("form", "postfix"); - if (group.right === "\u2216" || group.right.indexOf("arrow") > -1) { - rightNode.setAttribute("stretchy", "true"); - } - inner.push(rightNode); - - return makeRow(inner); - } -}); - -defineFunction({ - type: "middle", - names: ["\\middle"], - props: { - numArgs: 1, - argTypes: ["primitive"] - }, - handler: (context, args) => { - const delim = checkDelimiter(args[0], context); - if (!context.parser.leftrightDepth) { - throw new ParseError("\\middle without preceding \\left", delim); - } - - return { - type: "middle", - mode: context.parser.mode, - delim: delim.text - }; - }, - mathmlBuilder: (group, style) => { - const textNode = makeText(group.delim, group.mode); - const middleNode = new mathMLTree.MathNode("mo", [textNode]); - middleNode.setAttribute("fence", "true"); - if (group.delim.indexOf("arrow") > -1) { - middleNode.setAttribute("stretchy", "true"); - } - // The next line is not semantically correct, but - // Chromium fails to stretch if it is not there. - middleNode.setAttribute("form", "prefix"); - // MathML gives 5/18em spacing to each element. - // \middle should get delimiter spacing instead. - middleNode.setAttribute("lspace", "0.05em"); - middleNode.setAttribute("rspace", "0.05em"); - return middleNode; - } -}); - -const padding$1 = _ => { - const node = new mathMLTree.MathNode("mspace"); - node.setAttribute("width", "3pt"); - return node -}; - -const mathmlBuilder$8 = (group, style) => { - let node; - if (group.label.indexOf("colorbox") > -1 || group.label === "\\boxed") { - // MathML core does not support +width attribute in . - // Firefox does not reliably add side padding. - // Insert - node = new mathMLTree.MathNode("mrow", [ - padding$1(), - buildGroup$1(group.body, style), - padding$1() - ]); - } else { - node = new mathMLTree.MathNode("mrow", [buildGroup$1(group.body, style)]); - } - switch (group.label) { - case "\\overline": - node.style.padding = "0.1em 0 0 0"; - node.style.borderTop = "0.065em solid"; - break - case "\\underline": - node.style.padding = "0 0 0.1em 0"; - node.style.borderBottom = "0.065em solid"; - break - case "\\cancel": - // We can't use an inline background-gradient. It does not work client-side. - // So set a class and put the rule in the external CSS file. - node.classes.push("tml-cancel"); - break - case "\\bcancel": - node.classes.push("tml-bcancel"); - break - /* - case "\\longdiv": - node.setAttribute("notation", "longdiv"); - break - case "\\phase": - node.setAttribute("notation", "phasorangle"); - break */ - case "\\angl": - node.style.padding = "0.03889em 0.03889em 0 0.03889em"; - node.style.borderTop = "0.049em solid"; - node.style.borderRight = "0.049em solid"; - node.style.marginRight = "0.03889em"; - break - case "\\sout": - node.style.backgroundImage = 'linear-gradient(black, black)'; - node.style.backgroundRepeat = 'no-repeat'; - node.style.backgroundSize = '100% 1.5px'; - node.style.backgroundPosition = '0 center'; - break - case "\\boxed": - // \newcommand{\boxed}[1]{\fbox{\m@th$\displaystyle#1$}} from amsmath.sty - node.style = { padding: "3pt 0 3pt 0", border: "1px solid" }; - node.setAttribute("scriptlevel", "0"); - node.setAttribute("displaystyle", "true"); - break - case "\\fbox": - node.style = { padding: "3pt", border: "1px solid" }; - break - case "\\fcolorbox": - case "\\colorbox": { - // doesn't have a good notation option for \colorbox. - // So use instead. Set some attributes that come - // included with . - //const fboxsep = 3; // 3 pt from LaTeX source2e - //node.setAttribute("height", `+${2 * fboxsep}pt`) - //node.setAttribute("voffset", `${fboxsep}pt`) - const style = { padding: "3pt 0 3pt 0" }; - - if (group.label === "\\fcolorbox") { - style.border = "0.06em solid " + String(group.borderColor); - } - node.style = style; - break - } - case "\\xcancel": - node.classes.push("tml-xcancel"); - break - } - if (group.backgroundColor) { - node.setAttribute("mathbackground", group.backgroundColor); - } - return node; -}; - -defineFunction({ - type: "enclose", - names: ["\\colorbox"], - props: { - numArgs: 2, - numOptionalArgs: 1, - allowedInText: true, - argTypes: ["raw", "raw", "text"] - }, - handler({ parser, funcName }, args, optArgs) { - const model = optArgs[0] && assertNodeType(optArgs[0], "raw").string; - let color = ""; - if (model) { - const spec = assertNodeType(args[0], "raw").string; - color = colorFromSpec(model, spec); - } else { - color = validateColor(assertNodeType(args[0], "raw").string, parser.gullet.macros); - } - const body = args[1]; - return { - type: "enclose", - mode: parser.mode, - label: funcName, - backgroundColor: color, - body - }; - }, - mathmlBuilder: mathmlBuilder$8 -}); - -defineFunction({ - type: "enclose", - names: ["\\fcolorbox"], - props: { - numArgs: 3, - numOptionalArgs: 1, - allowedInText: true, - argTypes: ["raw", "raw", "raw", "text"] - }, - handler({ parser, funcName }, args, optArgs) { - const model = optArgs[0] && assertNodeType(optArgs[0], "raw").string; - let borderColor = ""; - let backgroundColor; - if (model) { - const borderSpec = assertNodeType(args[0], "raw").string; - const backgroundSpec = assertNodeType(args[0], "raw").string; - borderColor = colorFromSpec(model, borderSpec); - backgroundColor = colorFromSpec(model, backgroundSpec); - } else { - borderColor = validateColor(assertNodeType(args[0], "raw").string, parser.gullet.macros); - backgroundColor = validateColor(assertNodeType(args[1], "raw").string, parser.gullet.macros); - } - const body = args[2]; - return { - type: "enclose", - mode: parser.mode, - label: funcName, - backgroundColor, - borderColor, - body - }; - }, - mathmlBuilder: mathmlBuilder$8 -}); - -defineFunction({ - type: "enclose", - names: ["\\fbox"], - props: { - numArgs: 1, - argTypes: ["hbox"], - allowedInText: true - }, - handler({ parser }, args) { - return { - type: "enclose", - mode: parser.mode, - label: "\\fbox", - body: args[0] - }; - } -}); - -defineFunction({ - type: "enclose", - names: ["\\angl", "\\cancel", "\\bcancel", "\\xcancel", "\\sout", "\\overline", "\\boxed"], - // , "\\phase", "\\longdiv" - props: { - numArgs: 1 - }, - handler({ parser, funcName }, args) { - const body = args[0]; - return { - type: "enclose", - mode: parser.mode, - label: funcName, - body - }; - }, - mathmlBuilder: mathmlBuilder$8 -}); - -defineFunction({ - type: "enclose", - names: ["\\underline"], - props: { - numArgs: 1, - allowedInText: true - }, - handler({ parser, funcName }, args) { - const body = args[0]; - return { - type: "enclose", - mode: parser.mode, - label: funcName, - body - }; - }, - mathmlBuilder: mathmlBuilder$8 -}); - -/** - * All registered environments. - * `environments.js` exports this same dictionary again and makes it public. - * `Parser.js` requires this dictionary via `environments.js`. - */ -const _environments = {}; - -function defineEnvironment({ type, names, props, handler, mathmlBuilder }) { - // Set default values of environments. - const data = { - type, - numArgs: props.numArgs || 0, - allowedInText: false, - numOptionalArgs: 0, - handler - }; - for (let i = 0; i < names.length; ++i) { - _environments[names[i]] = data; - } - if (mathmlBuilder) { - _mathmlGroupBuilders[type] = mathmlBuilder; - } -} - -// In TeX, there are actually three sets of dimensions, one for each of - -// Math style is not quite the same thing as script level. -const StyleLevel = { - DISPLAY: 0, - TEXT: 1, - SCRIPT: 2, - SCRIPTSCRIPT: 3 -}; - -// Helper functions -function getHLines(parser) { - // Return an array. The array length = number of hlines. - // Each element in the array tells if the line is dashed. - const hlineInfo = []; - parser.consumeSpaces(); - let nxt = parser.fetch().text; - if (nxt === "\\relax") { - parser.consume(); - parser.consumeSpaces(); - nxt = parser.fetch().text; - } - while (nxt === "\\hline" || nxt === "\\hdashline") { - parser.consume(); - hlineInfo.push(nxt === "\\hdashline"); - parser.consumeSpaces(); - nxt = parser.fetch().text; - } - return hlineInfo; -} - -const validateAmsEnvironmentContext = context => { - const settings = context.parser.settings; - if (!settings.displayMode) { - throw new ParseError(`{${context.envName}} can be used only in display mode.`); - } -}; - -const getTag = (group, style, rowNum) => { - let tag; - const tagContents = group.tags.shift(); - if (tagContents) { - // The author has written a \tag or a \notag in this row. - if (tagContents.body) { - tag = buildExpressionRow(tagContents.body, style, true); - tag.classes = ["tml-tag"]; - } else { - // \notag. Return an empty span. - tag = new mathMLTree.MathNode("mtext", [], []); - return tag - } - } else if (group.envClasses.includes("multline") && - ((group.leqno && rowNum !== 0) || (!group.leqno && rowNum !== group.body.length - 1))) { - // A multiline that does not receive a tag. Return an empty cell. - tag = new mathMLTree.MathNode("mtext", [], []); - return tag - } else { - // AMS automatcally numbered equaton. - // Insert a class so the element can be populated by a CSS counter. - // WebKit will display the CSS counter only inside a span. - tag = new mathMLTree.MathNode("mtext", [new Span(["tml-eqn"])]); - } - return tag -}; - -/** - * Parse the body of the environment, with rows delimited by \\ and - * columns delimited by &, and create a nested list in row-major order - * with one group per cell. If given an optional argument scriptLevel - * ("text", "display", etc.), then each cell is cast into that scriptLevel. - */ -function parseArray( - parser, - { - cols, // [{ type: string , align: l|c|r|null }] - envClasses, // align(ed|at|edat) | array | cases | cd | small | multline - addEqnNum, // boolean - singleRow, // boolean - emptySingleRow, // boolean - maxNumCols, // number - leqno // boolean - }, - scriptLevel -) { - parser.gullet.beginGroup(); - if (!singleRow) { - // \cr is equivalent to \\ without the optional size argument (see below) - // TODO: provide helpful error when \cr is used outside array environment - parser.gullet.macros.set("\\cr", "\\\\\\relax"); - } - if (addEqnNum) { - parser.gullet.macros.set("\\tag", "\\@ifstar\\envtag@literal\\envtag@paren"); - parser.gullet.macros.set("\\envtag@paren", "\\env@tag{{(\\text{#1})}}"); - parser.gullet.macros.set("\\envtag@literal", "\\env@tag{\\text{#1}}"); - parser.gullet.macros.set("\\notag", "\\env@notag"); - parser.gullet.macros.set("\\nonumber", "\\env@notag"); - } - - // Start group for first cell - parser.gullet.beginGroup(); - - let row = []; - const body = [row]; - const rowGaps = []; - const tags = []; - let rowTag; - const hLinesBeforeRow = []; - - // Test for \hline at the top of the array. - hLinesBeforeRow.push(getHLines(parser)); - - // eslint-disable-next-line no-constant-condition - while (true) { - // Parse each cell in its own group (namespace) - let cell = parser.parseExpression(false, singleRow ? "\\end" : "\\\\"); - - if (addEqnNum && !rowTag) { - // Check if the author wrote a \tag{} inside this cell. - for (let i = 0; i < cell.length; i++) { - if (cell[i].type === "envTag" || cell[i].type === "noTag") { - // Get the contents of the \text{} nested inside the \env@Tag{} - rowTag = cell[i].type === "envTag" - ? cell.splice(i, 1)[0].body.body[0] - : { body: null }; - break - } - } - } - parser.gullet.endGroup(); - parser.gullet.beginGroup(); - - cell = { - type: "ordgroup", - mode: parser.mode, - body: cell, - semisimple: true - }; - row.push(cell); - const next = parser.fetch().text; - if (next === "&") { - if (maxNumCols && row.length === maxNumCols) { - if (envClasses.includes("array")) { - if (parser.settings.strict) { - throw new ParseError("Too few columns " + "specified in the {array} column argument.", - parser.nextToken) - } - } else if (maxNumCols === 2) { - throw new ParseError("The split environment accepts no more than two columns", - parser.nextToken); - } else { - throw new ParseError("The equation environment accepts only one column", - parser.nextToken) - } - } - parser.consume(); - } else if (next === "\\end") { - // Arrays terminate newlines with `\crcr` which consumes a `\cr` if - // the last line is empty. However, AMS environments keep the - // empty row if it's the only one. - // NOTE: Currently, `cell` is the last item added into `row`. - if (row.length === 1 && cell.body.length === 0 && (body.length > 1 || !emptySingleRow)) { - body.pop(); - } - if (hLinesBeforeRow.length < body.length + 1) { - hLinesBeforeRow.push([]); - } - break; - } else if (next === "\\\\") { - parser.consume(); - let size; - // \def\Let@{\let\\\math@cr} - // \def\math@cr{...\math@cr@} - // \def\math@cr@{\new@ifnextchar[\math@cr@@{\math@cr@@[\z@]}} - // \def\math@cr@@[#1]{...\math@cr@@@...} - // \def\math@cr@@@{\cr} - if (parser.gullet.future().text !== " ") { - size = parser.parseSizeGroup(true); - } - rowGaps.push(size ? size.value : null); - - tags.push(rowTag); - - // check for \hline(s) following the row separator - hLinesBeforeRow.push(getHLines(parser)); - - row = []; - rowTag = null; - body.push(row); - } else { - throw new ParseError("Expected & or \\\\ or \\cr or \\end", parser.nextToken); - } - } - - // End cell group - parser.gullet.endGroup(); - // End array group defining \cr - parser.gullet.endGroup(); - - tags.push(rowTag); - - return { - type: "array", - mode: parser.mode, - body, - cols, - rowGaps, - hLinesBeforeRow, - envClasses, - addEqnNum, - scriptLevel, - tags, - leqno - }; -} - -// Decides on a scriptLevel for cells in an array according to whether the given -// environment name starts with the letter 'd'. -function dCellStyle(envName) { - return envName.slice(0, 1) === "d" ? "display" : "text" -} - -const alignMap = { - c: "center ", - l: "left ", - r: "right " -}; - -const glue = group => { - const glueNode = new mathMLTree.MathNode("mtd", []); - glueNode.style = { padding: "0", width: "50%" }; - if (group.envClasses.includes("multline")) { - glueNode.style.width = "7.5%"; - } - return glueNode -}; - -const mathmlBuilder$7 = function(group, style) { - const tbl = []; - const numRows = group.body.length; - const hlines = group.hLinesBeforeRow; - - for (let i = 0; i < numRows; i++) { - const rw = group.body[i]; - const row = []; - const cellLevel = group.scriptLevel === "text" - ? StyleLevel.TEXT - : group.scriptLevel === "script" - ? StyleLevel.SCRIPT - : StyleLevel.DISPLAY; - - for (let j = 0; j < rw.length; j++) { - const mtd = new mathMLTree.MathNode( - "mtd", - [buildGroup$1(rw[j], style.withLevel(cellLevel))] - ); - - if (group.envClasses.includes("multline")) { - const align = i === 0 ? "left" : i === numRows - 1 ? "right" : "center"; - mtd.setAttribute("columnalign", align); - if (align !== "center") { - mtd.classes.push("tml-" + align); - } - } - row.push(mtd); - } - if (group.addEqnNum) { - row.unshift(glue(group)); - row.push(glue(group)); - const tag = getTag(group, style.withLevel(cellLevel), i); - if (group.leqno) { - row[0].children.push(tag); - row[0].classes.push("tml-left"); - } else { - row[row.length - 1].children.push(tag); - row[row.length - 1].classes.push("tml-right"); - } - } - const mtr = new mathMLTree.MathNode("mtr", row, []); - // Write horizontal rules - if (i === 0 && hlines[0].length > 0) { - if (hlines[0].length === 2) { - mtr.children.forEach(cell => { cell.style.borderTop = "0.15em double"; }); - } else { - mtr.children.forEach(cell => { - cell.style.borderTop = hlines[0][0] ? "0.06em dashed" : "0.06em solid"; - }); - } - } - if (hlines[i + 1].length > 0) { - if (hlines[i + 1].length === 2) { - mtr.children.forEach(cell => { cell.style.borderBottom = "0.15em double"; }); - } else { - mtr.children.forEach(cell => { - cell.style.borderBottom = hlines[i + 1][0] ? "0.06em dashed" : "0.06em solid"; - }); - } - } - tbl.push(mtr); - } - - if (group.envClasses.length > 0) { - const pad = group.envClasses.includes("jot") - ? "0.7" // 0.5ex + 0.09em top & bot padding - : group.envClasses.includes("small") - ? "0.35" - : "0.5"; // 0.5ex default top & bot padding - const sidePadding = group.envClasses.includes("abut") - ? "0" - : group.envClasses.includes("cases") - ? "0" - : group.envClasses.includes("small") - ? "0.1389" - : group.envClasses.includes("cd") - ? "0.25" - : "0.4"; // default side padding - - const numCols = tbl.length === 0 ? 0 : tbl[0].children.length; - - const sidePad = (j, hand) => { - if (j === 0 && hand === 0) { return "0" } - if (j === numCols - 1 && hand === 1) { return "0" } - if (group.envClasses[0] !== "align") { return sidePadding } - if (hand === 1) { return "0" } - if (group.addEqnNum) { - return (j % 2) ? "1" : "0" - } else { - return (j % 2) ? "0" : "1" - } - }; - - // Padding - for (let i = 0; i < tbl.length; i++) { - for (let j = 0; j < tbl[i].children.length; j++) { - tbl[i].children[j].style.padding = `${pad}ex ${sidePad(j, 1)}em ${pad}ex ${sidePad(j, 0)}em`; - } - } - - // Justification - const align = group.envClasses.includes("align") || group.envClasses.includes("alignat"); - for (let i = 0; i < tbl.length; i++) { - const row = tbl[i]; - if (align) { - for (let j = 0; j < row.children.length; j++) { - // Chromium does not recognize text-align: left. Use -webkit- - // TODO: Remove -webkit- when Chromium no longer needs it. - row.children[j].classes = ["tml-" + (j % 2 ? "left" : "right")]; - } - if (group.addEqnNum) { - const k = group.leqno ? 0 : row.children.length - 1; - row.children[k].classes = ["tml-" + (group.leqno ? "left" : "right")]; - } - } - if (row.children.length > 1 && group.envClasses.includes("cases")) { - row.children[1].style.padding = row.children[1].style.padding.replace(/0em$/, "1em"); - } - - if (group.envClasses.includes("cases") || group.envClasses.includes("subarray")) { - for (const cell of row.children) { - cell.classes.push("tml-left"); - } - } - } - } else { - // Set zero padding on side of the matrix - for (let i = 0; i < tbl.length; i++) { - tbl[i].children[0].style.paddingLeft = "0em"; - if (tbl[i].children.length === tbl[0].children.length) { - tbl[i].children[tbl[i].children.length - 1].style.paddingRight = "0em"; - } - } - } - - let table = new mathMLTree.MathNode("mtable", tbl); - if (group.scriptLevel === "display") { table.setAttribute("displaystyle", "true"); } - - if (group.addEqnNum || group.envClasses.includes("multline")) { - table.style.width = "100%"; - } - - // Column separator lines and column alignment - let align = ""; - - if (group.cols && group.cols.length > 0) { - const cols = group.cols; - let prevTypeWasAlign = false; - let iStart = 0; - let iEnd = cols.length; - - while (cols[iStart].type === "separator") { - iStart += 1; - } - while (cols[iEnd - 1].type === "separator") { - iEnd -= 1; - } - - if (cols[0].type === "separator") { - const sep = cols[1].type === "separator" - ? "0.15em double" - : cols[0].separator === "|" - ? "0.06em solid " - : "0.06em dashed "; - for (const row of table.children) { - row.children[0].style.borderLeft = sep; - } - } - let iCol = group.addEqnNum ? 0 : -1; - for (let i = iStart; i < iEnd; i++) { - if (cols[i].type === "align") { - const colAlign = alignMap[cols[i].align]; - align += colAlign; - iCol += 1; - for (const row of table.children) { - if (colAlign.trim() !== "center" && iCol < row.children.length) { - row.children[iCol].classes = ["tml-" + colAlign.trim()]; - } - } - prevTypeWasAlign = true; - } else if (cols[i].type === "separator") { - // MathML accepts only single lines between cells. - // So we read only the first of consecutive separators. - if (prevTypeWasAlign) { - const sep = cols[i + 1].type === "separator" - ? "0.15em double" - : cols[i].separator === "|" - ? "0.06em solid" - : "0.06em dashed"; - for (const row of table.children) { - if (iCol < row.children.length) { - row.children[iCol].style.borderRight = sep; - } - } - } - prevTypeWasAlign = false; - } - } - if (cols[cols.length - 1].type === "separator") { - const sep = cols[cols.length - 2].type === "separator" - ? "0.15em double" - : cols[cols.length - 1].separator === "|" - ? "0.06em solid" - : "0.06em dashed"; - for (const row of table.children) { - row.children[row.children.length - 1].style.borderRight = sep; - row.children[row.children.length - 1].style.paddingRight = "0.4em"; - } - } - } - if (group.addEqnNum) { - // allow for glue cells on each side - align = "left " + (align.length > 0 ? align : "center ") + "right "; - } - if (align) { - // Firefox reads this attribute, not the -webkit-left|right written above. - // TODO: When Chrome no longer needs "-webkit-", use CSS and delete the next line. - table.setAttribute("columnalign", align.trim()); - } - - if (group.envClasses.includes("small")) { - // A small array. Wrap in scriptstyle. - table = new mathMLTree.MathNode("mstyle", [table]); - table.setAttribute("scriptlevel", "1"); - } - - return table -}; - -// Convenience function for align, align*, aligned, alignat, alignat*, alignedat, split. -const alignedHandler = function(context, args) { - if (context.envName.indexOf("ed") === -1) { - validateAmsEnvironmentContext(context); - } - const cols = []; - const res = parseArray( - context.parser, - { - cols, - addEqnNum: context.envName === "align" || context.envName === "alignat", - emptySingleRow: true, - envClasses: ["abut", "jot"], // set row spacing & provisional column spacing - maxNumCols: context.envName === "split" ? 2 : undefined, - leqno: context.parser.settings.leqno - }, - "display" - ); - - // Determining number of columns. - // 1. If the first argument is given, we use it as a number of columns, - // and makes sure that each row doesn't exceed that number. - // 2. Otherwise, just count number of columns = maximum number - // of cells in each row ("aligned" mode -- isAligned will be true). - // - // At the same time, prepend empty group {} at beginning of every second - // cell in each row (starting with second cell) so that operators become - // binary. This behavior is implemented in amsmath's \start@aligned. - let numMaths; - let numCols = 0; - const isAlignedAt = context.envName.indexOf("at") > -1; - if (args[0] && isAlignedAt) { - // alignat environment takes an argument w/ number of columns - let arg0 = ""; - for (let i = 0; i < args[0].body.length; i++) { - const textord = assertNodeType(args[0].body[i], "textord"); - arg0 += textord.text; - } - if (isNaN(arg0)) { - throw new ParseError("The alignat enviroment requires a numeric first argument.") - } - numMaths = Number(arg0); - numCols = numMaths * 2; - } - res.body.forEach(function(row) { - if (isAlignedAt) { - // Case 1 - const curMaths = row.length / 2; - if (numMaths < curMaths) { - throw new ParseError( - "Too many math in a row: " + `expected ${numMaths}, but got ${curMaths}`, - row[0] - ); - } - } else if (numCols < row.length) { - // Case 2 - numCols = row.length; - } - }); - - // Adjusting alignment. - // In aligned mode, we add one \qquad between columns; - // otherwise we add nothing. - for (let i = 0; i < numCols; ++i) { - let align = "r"; - if (i % 2 === 1) { - align = "l"; - } - cols[i] = { - type: "align", - align: align - }; - } - if (context.envName === "split") ; else if (isAlignedAt) { - res.envClasses.push("alignat"); // Sets justification - } else { - res.envClasses[0] = "align"; // Sets column spacing & justification - } - return res; -}; - -// Arrays are part of LaTeX, defined in lttab.dtx so its documentation -// is part of the source2e.pdf file of LaTeX2e source documentation. -// {darray} is an {array} environment where cells are set in \displaystyle, -// as defined in nccmath.sty. -defineEnvironment({ - type: "array", - names: ["array", "darray"], - props: { - numArgs: 1 - }, - handler(context, args) { - // Since no types are specified above, the two possibilities are - // - The argument is wrapped in {} or [], in which case Parser's - // parseGroup() returns an "ordgroup" wrapping some symbol node. - // - The argument is a bare symbol node. - const symNode = checkSymbolNodeType(args[0]); - const colalign = symNode ? [args[0]] : assertNodeType(args[0], "ordgroup").body; - const cols = colalign.map(function(nde) { - const node = assertSymbolNodeType(nde); - const ca = node.text; - if ("lcr".indexOf(ca) !== -1) { - return { - type: "align", - align: ca - }; - } else if (ca === "|") { - return { - type: "separator", - separator: "|" - }; - } else if (ca === ":") { - return { - type: "separator", - separator: ":" - }; - } - throw new ParseError("Unknown column alignment: " + ca, nde); - }); - const res = { - cols, - envClasses: ["array"], - maxNumCols: cols.length - }; - return parseArray(context.parser, res, dCellStyle(context.envName)); - }, - mathmlBuilder: mathmlBuilder$7 -}); - -// The matrix environments of amsmath builds on the array environment -// of LaTeX, which is discussed above. -// The mathtools package adds starred versions of the same environments. -// These have an optional argument to choose left|center|right justification. -defineEnvironment({ - type: "array", - names: [ - "matrix", - "pmatrix", - "bmatrix", - "Bmatrix", - "vmatrix", - "Vmatrix", - "matrix*", - "pmatrix*", - "bmatrix*", - "Bmatrix*", - "vmatrix*", - "Vmatrix*" - ], - props: { - numArgs: 0 - }, - handler(context) { - const delimiters = { - matrix: null, - pmatrix: ["(", ")"], - bmatrix: ["[", "]"], - Bmatrix: ["\\{", "\\}"], - vmatrix: ["|", "|"], - Vmatrix: ["\\Vert", "\\Vert"] - }[context.envName.replace("*", "")]; - // \hskip -\arraycolsep in amsmath - let colAlign = "c"; - const payload = { - envClasses: [], - cols: [] - }; - if (context.envName.charAt(context.envName.length - 1) === "*") { - // It's one of the mathtools starred functions. - // Parse the optional alignment argument. - const parser = context.parser; - parser.consumeSpaces(); - if (parser.fetch().text === "[") { - parser.consume(); - parser.consumeSpaces(); - colAlign = parser.fetch().text; - if ("lcr".indexOf(colAlign) === -1) { - throw new ParseError("Expected l or c or r", parser.nextToken); - } - parser.consume(); - parser.consumeSpaces(); - parser.expect("]"); - parser.consume(); - payload.cols = []; - } - } - const res = parseArray(context.parser, payload, "text"); - res.cols = new Array(res.body[0].length).fill({ type: "align", align: colAlign }); - return delimiters - ? { - type: "leftright", - mode: context.mode, - body: [res], - left: delimiters[0], - right: delimiters[1], - rightColor: undefined // \right uninfluenced by \color in array - } - : res; - }, - mathmlBuilder: mathmlBuilder$7 -}); - -defineEnvironment({ - type: "array", - names: ["smallmatrix"], - props: { - numArgs: 0 - }, - handler(context) { - const payload = { type: "small" }; - const res = parseArray(context.parser, payload, "script"); - res.envClasses = ["small"]; - return res; - }, - mathmlBuilder: mathmlBuilder$7 -}); - -defineEnvironment({ - type: "array", - names: ["subarray"], - props: { - numArgs: 1 - }, - handler(context, args) { - // Parsing of {subarray} is similar to {array} - const symNode = checkSymbolNodeType(args[0]); - const colalign = symNode ? [args[0]] : assertNodeType(args[0], "ordgroup").body; - const cols = colalign.map(function(nde) { - const node = assertSymbolNodeType(nde); - const ca = node.text; - // {subarray} only recognizes "l" & "c" - if ("lc".indexOf(ca) !== -1) { - return { - type: "align", - align: ca - }; - } - throw new ParseError("Unknown column alignment: " + ca, nde); - }); - if (cols.length > 1) { - throw new ParseError("{subarray} can contain only one column"); - } - let res = { - cols, - envClasses: ["small"] - }; - res = parseArray(context.parser, res, "script"); - if (res.body.length > 0 && res.body[0].length > 1) { - throw new ParseError("{subarray} can contain only one column"); - } - return res; - }, - mathmlBuilder: mathmlBuilder$7 -}); - -// A cases environment (in amsmath.sty) is almost equivalent to -// \def -// \left\{\begin{array}{@{}l@{\quad}l@{}} … \end{array}\right. -// {dcases} is a {cases} environment where cells are set in \displaystyle, -// as defined in mathtools.sty. -// {rcases} is another mathtools environment. It's brace is on the right side. -defineEnvironment({ - type: "array", - names: ["cases", "dcases", "rcases", "drcases"], - props: { - numArgs: 0 - }, - handler(context) { - const payload = { - cols: [], - envClasses: ["cases"] - }; - const res = parseArray(context.parser, payload, dCellStyle(context.envName)); - return { - type: "leftright", - mode: context.mode, - body: [res], - left: context.envName.indexOf("r") > -1 ? "." : "\\{", - right: context.envName.indexOf("r") > -1 ? "\\}" : ".", - rightColor: undefined - }; - }, - mathmlBuilder: mathmlBuilder$7 -}); - -// In the align environment, one uses ampersands, &, to specify number of -// columns in each row, and to locate spacing between each column. -// align gets automatic numbering. align* and aligned do not. -// The alignedat environment can be used in math mode. -defineEnvironment({ - type: "array", - names: ["align", "align*", "aligned", "split"], - props: { - numArgs: 0 - }, - handler: alignedHandler, - mathmlBuilder: mathmlBuilder$7 -}); - -// alignat environment is like an align environment, but one must explicitly -// specify maximum number of columns in each row, and can adjust where spacing occurs. -defineEnvironment({ - type: "array", - names: ["alignat", "alignat*", "alignedat"], - props: { - numArgs: 1 - }, - handler: alignedHandler, - mathmlBuilder: mathmlBuilder$7 -}); - -// A gathered environment is like an array environment with one centered -// column, but where rows are considered lines so get \jot line spacing -// and contents are set in \displaystyle. -defineEnvironment({ - type: "array", - names: ["gathered", "gather", "gather*"], - props: { - numArgs: 0 - }, - handler(context) { - if (context.envName !== "gathered") { - validateAmsEnvironmentContext(context); - } - const res = { - cols: [], - envClasses: ["abut", "jot"], - addEqnNum: context.envName === "gather", - emptySingleRow: true, - leqno: context.parser.settings.leqno - }; - return parseArray(context.parser, res, "display"); - }, - mathmlBuilder: mathmlBuilder$7 -}); - -defineEnvironment({ - type: "array", - names: ["equation", "equation*"], - props: { - numArgs: 0 - }, - handler(context) { - validateAmsEnvironmentContext(context); - const res = { - addEqnNum: context.envName === "equation", - emptySingleRow: true, - singleRow: true, - maxNumCols: 1, - envClasses: ["align"], - leqno: context.parser.settings.leqno - }; - return parseArray(context.parser, res, "display"); - }, - mathmlBuilder: mathmlBuilder$7 -}); - -defineEnvironment({ - type: "array", - names: ["multline", "multline*"], - props: { - numArgs: 0 - }, - handler(context) { - validateAmsEnvironmentContext(context); - const res = { - addEqnNum: context.envName === "multline", - maxNumCols: 1, - envClasses: ["jot", "multline"], - leqno: context.parser.settings.leqno - }; - return parseArray(context.parser, res, "display"); - }, - mathmlBuilder: mathmlBuilder$7 -}); - -defineEnvironment({ - type: "array", - names: ["CD"], - props: { - numArgs: 0 - }, - handler(context) { - validateAmsEnvironmentContext(context); - return parseCD(context.parser); - }, - mathmlBuilder: mathmlBuilder$7 -}); - -// Catch \hline outside array environment -defineFunction({ - type: "text", // Doesn't matter what this is. - names: ["\\hline", "\\hdashline"], - props: { - numArgs: 0, - allowedInText: true, - allowedInMath: true - }, - handler(context, args) { - throw new ParseError(`${context.funcName} valid only within array environment`); - } -}); - -const environments = _environments; - -// Environment delimiters. HTML/MathML rendering is defined in the corresponding -// defineEnvironment definitions. -defineFunction({ - type: "environment", - names: ["\\begin", "\\end"], - props: { - numArgs: 1, - argTypes: ["text"] - }, - handler({ parser, funcName }, args) { - const nameGroup = args[0]; - if (nameGroup.type !== "ordgroup") { - throw new ParseError("Invalid environment name", nameGroup); - } - let envName = ""; - for (let i = 0; i < nameGroup.body.length; ++i) { - envName += assertNodeType(nameGroup.body[i], "textord").text; - } - - if (funcName === "\\begin") { - // begin...end is similar to left...right - if (!Object.prototype.hasOwnProperty.call(environments, envName )) { - throw new ParseError("No such environment: " + envName, nameGroup); - } - // Build the environment object. Arguments and other information will - // be made available to the begin and end methods using properties. - const env = environments[envName]; - const { args, optArgs } = parser.parseArguments("\\begin{" + envName + "}", env); - const context = { - mode: parser.mode, - envName, - parser - }; - const result = env.handler(context, args, optArgs); - parser.expect("\\end", false); - const endNameToken = parser.nextToken; - const end = assertNodeType(parser.parseFunction(), "environment"); - if (end.name !== envName) { - throw new ParseError( - `Mismatch: \\begin{${envName}} matched by \\end{${end.name}}`, - endNameToken - ); - } - return result; - } - - return { - type: "environment", - mode: parser.mode, - name: envName, - nameGroup - }; - } -}); - -defineFunction({ - type: "envTag", - names: ["\\env@tag"], - props: { - numArgs: 1, - argTypes: ["math"] - }, - handler({ parser }, args) { - return { - type: "envTag", - mode: parser.mode, - body: args[0] - }; - }, - mathmlBuilder(group, style) { - return new mathMLTree.MathNode("mrow"); - } -}); - -defineFunction({ - type: "noTag", - names: ["\\env@notag"], - props: { - numArgs: 0 - }, - handler({ parser }) { - return { - type: "noTag", - mode: parser.mode - }; - }, - mathmlBuilder(group, style) { - return new mathMLTree.MathNode("mrow"); - } -}); - -const isLongVariableName = (group, font) => { - if (font !== "mathrm" || group.body.type !== "ordgroup" || group.body.body.length === 1) { - return false - } - if (group.body.body[0].type !== "mathord") { return false } - for (let i = 1; i < group.body.body.length; i++) { - const parseNodeType = group.body.body[i].type; - if (!(parseNodeType === "mathord" || - (parseNodeType === "textord" && !isNaN(group.body.body[i].text)))) { - return false - } - } - return true -}; - -const mathmlBuilder$6 = (group, style) => { - const font = group.font; - const newStyle = style.withFont(font); - const mathGroup = buildGroup$1(group.body, newStyle); - - if (mathGroup.children.length === 0) { return mathGroup } // empty group, e.g., \mathrm{} - if (font === "boldsymbol" && ["mo", "mpadded", "mrow"].includes(mathGroup.type)) { - mathGroup.style.fontWeight = "bold"; - return mathGroup - } - // Check if it is possible to consolidate elements into a single element. - if (isLongVariableName(group, font)) { - // This is a \mathrm{…} group. It gets special treatment because symbolsOrd.js - // wraps elements with s to work around a Firefox bug. - const mi = mathGroup.children[0].children[0]; - delete mi.attributes.mathvariant; - for (let i = 1; i < mathGroup.children.length; i++) { - mi.children[0].text += mathGroup.children[i].type === "mn" - ? mathGroup.children[i].children[0].text - : mathGroup.children[i].children[0].children[0].text; - } - // Wrap in a to prevent the same Firefox bug. - const bogus = new mathMLTree.MathNode("mtext", new mathMLTree.TextNode("\u200b")); - return new mathMLTree.MathNode("mrow", [bogus, mi]) - } - let canConsolidate = mathGroup.children[0].type === "mo"; - for (let i = 1; i < mathGroup.children.length; i++) { - if (mathGroup.children[i].type === "mo" && font === "boldsymbol") { - mathGroup.children[i].style.fontWeight = "bold"; - } - if (mathGroup.children[i].type !== "mi") { canConsolidate = false; } - const localVariant = mathGroup.children[i].attributes && - mathGroup.children[i].attributes.mathvariant || ""; - if (localVariant !== "normal") { canConsolidate = false; } - } - if (!canConsolidate) { return mathGroup } - // Consolidate the elements. - const mi = mathGroup.children[0]; - for (let i = 1; i < mathGroup.children.length; i++) { - mi.children.push(mathGroup.children[i].children[0]); - } - if (mi.attributes.mathvariant && mi.attributes.mathvariant === "normal") { - // Workaround for a Firefox bug that renders spurious space around - // a - // Ref: https://bugs.webkit.org/show_bug.cgi?id=129097 - // We insert a text node that contains a zero-width space and wrap in an mrow. - // TODO: Get rid of this workaround when the Firefox bug is fixed. - const bogus = new mathMLTree.MathNode("mtext", new mathMLTree.TextNode("\u200b")); - return new mathMLTree.MathNode("mrow", [bogus, mi]) - } - return mi -}; - -const fontAliases = { - "\\Bbb": "\\mathbb", - "\\bold": "\\mathbf", - "\\frak": "\\mathfrak", - "\\bm": "\\boldsymbol" -}; - -defineFunction({ - type: "font", - names: [ - // styles - "\\mathrm", - "\\mathit", - "\\mathbf", - "\\mathnormal", - "\\up@greek", - "\\boldsymbol", - - // families - "\\mathbb", - "\\mathcal", - "\\mathfrak", - "\\mathscr", - "\\mathsf", - "\\mathtt", - - // aliases - "\\Bbb", - "\\bm", - "\\bold", - "\\frak" - ], - props: { - numArgs: 1, - allowedInArgument: true - }, - handler: ({ parser, funcName }, args) => { - const body = normalizeArgument(args[0]); - let func = funcName; - if (func in fontAliases) { - func = fontAliases[func]; - } - return { - type: "font", - mode: parser.mode, - font: func.slice(1), - body - }; - }, - mathmlBuilder: mathmlBuilder$6 -}); - -// Old font changing functions -defineFunction({ - type: "font", - names: ["\\rm", "\\sf", "\\tt", "\\bf", "\\it", "\\cal"], - props: { - numArgs: 0, - allowedInText: true - }, - handler: ({ parser, funcName, breakOnTokenText }, args) => { - const { mode } = parser; - const body = parser.parseExpression(true, breakOnTokenText, true); - const fontStyle = `math${funcName.slice(1)}`; - - return { - type: "font", - mode: mode, - font: fontStyle, - body: { - type: "ordgroup", - mode: parser.mode, - body - } - }; - }, - mathmlBuilder: mathmlBuilder$6 -}); - -const stylArray = ["display", "text", "script", "scriptscript"]; -const scriptLevel = { auto: -1, display: 0, text: 0, script: 1, scriptscript: 2 }; - -const mathmlBuilder$5 = (group, style) => { - // Track the scriptLevel of the numerator and denominator. - // We may need that info for \mathchoice or for adjusting em dimensions. - const childOptions = group.scriptLevel === "auto" - ? style.incrementLevel() - : group.scriptLevel === "display" - ? style.withLevel(StyleLevel.TEXT) - : group.scriptLevel === "text" - ? style.withLevel(StyleLevel.SCRIPT) - : style.withLevel(StyleLevel.SCRIPTSCRIPT); - - let node = new mathMLTree.MathNode("mfrac", [ - buildGroup$1(group.numer, childOptions), - buildGroup$1(group.denom, childOptions) - ]); - - if (!group.hasBarLine) { - node.setAttribute("linethickness", "0px"); - } else if (group.barSize) { - const ruleWidth = calculateSize(group.barSize, style); - node.setAttribute("linethickness", ruleWidth.number + ruleWidth.unit); - } - - if (group.leftDelim != null || group.rightDelim != null) { - const withDelims = []; - - if (group.leftDelim != null) { - const leftOp = new mathMLTree.MathNode("mo", [ - new mathMLTree.TextNode(group.leftDelim.replace("\\", "")) - ]); - leftOp.setAttribute("fence", "true"); - withDelims.push(leftOp); - } - - withDelims.push(node); - - if (group.rightDelim != null) { - const rightOp = new mathMLTree.MathNode("mo", [ - new mathMLTree.TextNode(group.rightDelim.replace("\\", "")) - ]); - rightOp.setAttribute("fence", "true"); - withDelims.push(rightOp); - } - - node = makeRow(withDelims); - } - - if (group.scriptLevel !== "auto") { - node = new mathMLTree.MathNode("mstyle", [node]); - node.setAttribute("displaystyle", String(group.scriptLevel === "display")); - node.setAttribute("scriptlevel", scriptLevel[group.scriptLevel]); - } - - return node; -}; - -defineFunction({ - type: "genfrac", - names: [ - "\\dfrac", - "\\frac", - "\\tfrac", - "\\dbinom", - "\\binom", - "\\tbinom", - "\\\\atopfrac", // can’t be entered directly - "\\\\bracefrac", - "\\\\brackfrac" // ditto - ], - props: { - numArgs: 2, - allowedInArgument: true - }, - handler: ({ parser, funcName }, args) => { - const numer = args[0]; - const denom = args[1]; - let hasBarLine = false; - let leftDelim = null; - let rightDelim = null; - let scriptLevel = "auto"; - - switch (funcName) { - case "\\dfrac": - case "\\frac": - case "\\tfrac": - hasBarLine = true; - break; - case "\\\\atopfrac": - hasBarLine = false; - break; - case "\\dbinom": - case "\\binom": - case "\\tbinom": - leftDelim = "("; - rightDelim = ")"; - break; - case "\\\\bracefrac": - leftDelim = "\\{"; - rightDelim = "\\}"; - break; - case "\\\\brackfrac": - leftDelim = "["; - rightDelim = "]"; - break; - default: - throw new Error("Unrecognized genfrac command"); - } - - switch (funcName) { - case "\\dfrac": - case "\\dbinom": - scriptLevel = "display"; - break; - case "\\tfrac": - case "\\tbinom": - scriptLevel = "text"; - break; - } - - return { - type: "genfrac", - mode: parser.mode, - continued: false, - numer, - denom, - hasBarLine, - leftDelim, - rightDelim, - scriptLevel, - barSize: null - }; - }, - mathmlBuilder: mathmlBuilder$5 -}); - -defineFunction({ - type: "genfrac", - names: ["\\cfrac"], - props: { - numArgs: 2 - }, - handler: ({ parser, funcName }, args) => { - const numer = args[0]; - const denom = args[1]; - - return { - type: "genfrac", - mode: parser.mode, - continued: true, - numer, - denom, - hasBarLine: true, - leftDelim: null, - rightDelim: null, - scriptLevel: "display", - barSize: null - }; - } -}); - -// Infix generalized fractions -- these are not rendered directly, but replaced -// immediately by one of the variants above. -defineFunction({ - type: "infix", - names: ["\\over", "\\choose", "\\atop", "\\brace", "\\brack"], - props: { - numArgs: 0, - infix: true - }, - handler({ parser, funcName, token }) { - let replaceWith; - switch (funcName) { - case "\\over": - replaceWith = "\\frac"; - break; - case "\\choose": - replaceWith = "\\binom"; - break; - case "\\atop": - replaceWith = "\\\\atopfrac"; - break; - case "\\brace": - replaceWith = "\\\\bracefrac"; - break; - case "\\brack": - replaceWith = "\\\\brackfrac"; - break; - default: - throw new Error("Unrecognized infix genfrac command"); - } - return { - type: "infix", - mode: parser.mode, - replaceWith, - token - }; - } -}); - -const delimFromValue = function(delimString) { - let delim = null; - if (delimString.length > 0) { - delim = delimString; - delim = delim === "." ? null : delim; - } - return delim; -}; - -defineFunction({ - type: "genfrac", - names: ["\\genfrac"], - props: { - numArgs: 6, - allowedInArgument: true, - argTypes: ["math", "math", "size", "text", "math", "math"] - }, - handler({ parser }, args) { - const numer = args[4]; - const denom = args[5]; - - // Look into the parse nodes to get the desired delimiters. - const leftNode = normalizeArgument(args[0]); - const leftDelim = leftNode.type === "atom" && leftNode.family === "open" - ? delimFromValue(leftNode.text) - : null; - const rightNode = normalizeArgument(args[1]); - const rightDelim = - rightNode.type === "atom" && rightNode.family === "close" - ? delimFromValue(rightNode.text) - : null; - - const barNode = assertNodeType(args[2], "size"); - let hasBarLine; - let barSize = null; - if (barNode.isBlank) { - // \genfrac acts differently than \above. - // \genfrac treats an empty size group as a signal to use a - // standard bar size. \above would see size = 0 and omit the bar. - hasBarLine = true; - } else { - barSize = barNode.value; - hasBarLine = barSize.number > 0; - } - - // Find out if we want displaystyle, textstyle, etc. - let scriptLevel = "auto"; - let styl = args[3]; - if (styl.type === "ordgroup") { - if (styl.body.length > 0) { - const textOrd = assertNodeType(styl.body[0], "textord"); - scriptLevel = stylArray[Number(textOrd.text)]; - } - } else { - styl = assertNodeType(styl, "textord"); - scriptLevel = stylArray[Number(styl.text)]; - } - - return { - type: "genfrac", - mode: parser.mode, - numer, - denom, - continued: false, - hasBarLine, - barSize, - leftDelim, - rightDelim, - scriptLevel - }; - }, - mathmlBuilder: mathmlBuilder$5 -}); - -// \above is an infix fraction that also defines a fraction bar size. -defineFunction({ - type: "infix", - names: ["\\above"], - props: { - numArgs: 1, - argTypes: ["size"], - infix: true - }, - handler({ parser, funcName, token }, args) { - return { - type: "infix", - mode: parser.mode, - replaceWith: "\\\\abovefrac", - barSize: assertNodeType(args[0], "size").value, - token - }; - } -}); - -defineFunction({ - type: "genfrac", - names: ["\\\\abovefrac"], - props: { - numArgs: 3, - argTypes: ["math", "size", "math"] - }, - handler: ({ parser, funcName }, args) => { - const numer = args[0]; - const barSize = assert(assertNodeType(args[1], "infix").barSize); - const denom = args[2]; - - const hasBarLine = barSize.number > 0; - return { - type: "genfrac", - mode: parser.mode, - numer, - denom, - continued: false, - hasBarLine, - barSize, - leftDelim: null, - rightDelim: null, - scriptLevel: "auto" - }; - }, - - mathmlBuilder: mathmlBuilder$5 -}); - -// \hbox is provided for compatibility with LaTeX functions that act on a box. -// This function by itself doesn't do anything but set scriptlevel to \textstyle -// and prevent a soft line break. - -defineFunction({ - type: "hbox", - names: ["\\hbox"], - props: { - numArgs: 1, - argTypes: ["hbox"], - allowedInArgument: true, - allowedInText: false - }, - handler({ parser }, args) { - return { - type: "hbox", - mode: parser.mode, - body: ordargument(args[0]) - }; - }, - mathmlBuilder(group, style) { - const newStyle = style.withLevel(StyleLevel.TEXT); - const mrow = buildExpressionRow(group.body, newStyle); - return consolidateText(mrow) - } -}); - -const mathmlBuilder$4 = (group, style) => { - const accentNode = stretchy.mathMLnode(group.label); - accentNode.style["math-depth"] = 0; - return new mathMLTree.MathNode(group.isOver ? "mover" : "munder", [ - buildGroup$1(group.base, style), - accentNode - ]); -}; - -// Horizontal stretchy braces -defineFunction({ - type: "horizBrace", - names: ["\\overbrace", "\\underbrace"], - props: { - numArgs: 1 - }, - handler({ parser, funcName }, args) { - return { - type: "horizBrace", - mode: parser.mode, - label: funcName, - isOver: /^\\over/.test(funcName), - base: args[0] - }; - }, - mathmlBuilder: mathmlBuilder$4 -}); - -defineFunction({ - type: "href", - names: ["\\href"], - props: { - numArgs: 2, - argTypes: ["url", "original"], - allowedInText: true - }, - handler: ({ parser, token }, args) => { - const body = args[1]; - const href = assertNodeType(args[0], "url").url; - - if ( - !parser.settings.isTrusted({ - command: "\\href", - url: href - }) - ) { - throw new ParseError(`Function "\\href" is not trusted`, token) - } - - return { - type: "href", - mode: parser.mode, - href, - body: ordargument(body) - }; - }, - mathmlBuilder: (group, style) => { - let math = buildExpressionRow(group.body, style); - if (!(math instanceof MathNode)) { - math = new MathNode("mrow", [math]); - } - math.setAttribute("href", group.href); - return math; - } -}); - -defineFunction({ - type: "href", - names: ["\\url"], - props: { - numArgs: 1, - argTypes: ["url"], - allowedInText: true - }, - handler: ({ parser, token }, args) => { - const href = assertNodeType(args[0], "url").url; - - if ( - !parser.settings.isTrusted({ - command: "\\url", - url: href - }) - ) { - throw new ParseError(`Function "\\url" is not trusted`, token) - } - - const chars = []; - for (let i = 0; i < href.length; i++) { - let c = href[i]; - if (c === "~") { - c = "\\textasciitilde"; - } - chars.push({ - type: "textord", - mode: "text", - text: c - }); - } - const body = { - type: "text", - mode: parser.mode, - font: "\\texttt", - body: chars - }; - return { - type: "href", - mode: parser.mode, - href, - body: ordargument(body) - }; - } -}); - -defineFunction({ - type: "html", - names: ["\\class", "\\id", "\\style", "\\data"], - props: { - numArgs: 2, - argTypes: ["raw", "original"], - allowedInText: true - }, - handler: ({ parser, funcName, token }, args) => { - const value = assertNodeType(args[0], "raw").string; - const body = args[1]; - - if (parser.settings.strict) { - throw new ParseError(`Function "${funcName}" is disabled in strict mode`, token) - } - - let trustContext; - const attributes = {}; - - switch (funcName) { - case "\\class": - attributes.class = value; - trustContext = { - command: "\\class", - class: value - }; - break; - case "\\id": - attributes.id = value; - trustContext = { - command: "\\id", - id: value - }; - break; - case "\\style": - attributes.style = value; - trustContext = { - command: "\\style", - style: value - }; - break; - case "\\data": { - const data = value.split(","); - for (let i = 0; i < data.length; i++) { - const keyVal = data[i].split("="); - if (keyVal.length !== 2) { - throw new ParseError("Error parsing key-value for \\data"); - } - attributes["data-" + keyVal[0].trim()] = keyVal[1].trim(); - } - - trustContext = { - command: "\\data", - attributes - }; - break; - } - default: - throw new Error("Unrecognized html command"); - } - - if (!parser.settings.isTrusted(trustContext)) { - throw new ParseError(`Function "${funcName}" is not trusted`, token) - } - return { - type: "html", - mode: parser.mode, - attributes, - body: ordargument(body) - }; - }, - mathmlBuilder: (group, style) => { - const element = buildExpressionRow(group.body, style); - - const classes = []; - if (group.attributes.class) { - classes.push(...group.attributes.class.trim().split(/\s+/)); - } - element.classes = classes; - - for (const attr in group.attributes) { - if (attr !== "class" && Object.prototype.hasOwnProperty.call(group.attributes, attr)) { - element.setAttribute(attr, group.attributes[attr]); - } - } - - return element; - } -}); - -const sizeData = function(str) { - if (/^[-+]? *(\d+(\.\d*)?|\.\d+)$/.test(str)) { - // str is a number with no unit specified. - // default unit is bp, per graphix package. - return { number: +str, unit: "bp" } - } else { - const match = /([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(str); - if (!match) { - throw new ParseError("Invalid size: '" + str + "' in \\includegraphics"); - } - const data = { - number: +(match[1] + match[2]), // sign + magnitude, cast to number - unit: match[3] - }; - if (!validUnit(data)) { - throw new ParseError("Invalid unit: '" + data.unit + "' in \\includegraphics."); - } - return data - } -}; - -defineFunction({ - type: "includegraphics", - names: ["\\includegraphics"], - props: { - numArgs: 1, - numOptionalArgs: 1, - argTypes: ["raw", "url"], - allowedInText: false - }, - handler: ({ parser, token }, args, optArgs) => { - let width = { number: 0, unit: "em" }; - let height = { number: 0.9, unit: "em" }; // sorta character sized. - let totalheight = { number: 0, unit: "em" }; - let alt = ""; - - if (optArgs[0]) { - const attributeStr = assertNodeType(optArgs[0], "raw").string; - - // Parser.js does not parse key/value pairs. We get a string. - const attributes = attributeStr.split(","); - for (let i = 0; i < attributes.length; i++) { - const keyVal = attributes[i].split("="); - if (keyVal.length === 2) { - const str = keyVal[1].trim(); - switch (keyVal[0].trim()) { - case "alt": - alt = str; - break - case "width": - width = sizeData(str); - break - case "height": - height = sizeData(str); - break - case "totalheight": - totalheight = sizeData(str); - break - default: - throw new ParseError("Invalid key: '" + keyVal[0] + "' in \\includegraphics.") - } - } - } - } - - const src = assertNodeType(args[0], "url").url; - - if (alt === "") { - // No alt given. Use the file name. Strip away the path. - alt = src; - alt = alt.replace(/^.*[\\/]/, ""); - alt = alt.substring(0, alt.lastIndexOf(".")); - } - - if ( - !parser.settings.isTrusted({ - command: "\\includegraphics", - url: src - }) - ) { - throw new ParseError(`Function "\\includegraphics" is not trusted`, token) - } - - return { - type: "includegraphics", - mode: parser.mode, - alt: alt, - width: width, - height: height, - totalheight: totalheight, - src: src - } - }, - mathmlBuilder: (group, style) => { - const height = calculateSize(group.height, style); - const depth = { number: 0, unit: "em" }; - - if (group.totalheight.number > 0) { - if (group.totalheight.unit === height.unit && - group.totalheight.number > height.number) { - depth.number = group.totalheight.number - height.number; - depth.unit = height.unit; - } - } - - let width = 0; - if (group.width.number > 0) { - width = calculateSize(group.width, style); - } - - const graphicStyle = { height: height.number + depth.number + "em" }; - if (width.number > 0) { - graphicStyle.width = width.number + width.unit; - } - if (depth.number > 0) { - graphicStyle.verticalAlign = -depth.number + depth.unit; - } - - const node = new Img(group.src, group.alt, graphicStyle); - node.height = height; - node.depth = depth; - return new mathMLTree.MathNode("mtext", [node]) - } -}); - -// Horizontal spacing commands - -// TODO: \hskip and \mskip should support plus and minus in lengths - -defineFunction({ - type: "kern", - names: ["\\kern", "\\mkern", "\\hskip", "\\mskip"], - props: { - numArgs: 1, - argTypes: ["size"], - primitive: true, - allowedInText: true - }, - handler({ parser, funcName, token }, args) { - const size = assertNodeType(args[0], "size"); - if (parser.settings.strict) { - const mathFunction = funcName[1] === "m"; // \mkern, \mskip - const muUnit = size.value.unit === "mu"; - if (mathFunction) { - if (!muUnit) { - throw new ParseError(`LaTeX's ${funcName} supports only mu units, ` + - `not ${size.value.unit} units`, token) - } - if (parser.mode !== "math") { - throw new ParseError(`LaTeX's ${funcName} works only in math mode`, token) - } - } else { - // !mathFunction - if (muUnit) { - throw new ParseError(`LaTeX's ${funcName} doesn't support mu units`, token) - } - } - } - return { - type: "kern", - mode: parser.mode, - dimension: size.value - }; - }, - mathmlBuilder(group, style) { - const dimension = calculateSize(group.dimension, style); - const ch = dimension.unit === "em" ? spaceCharacter(dimension.number) : ""; - if (group.mode === "text" && ch.length > 0) { - const character = new mathMLTree.TextNode(ch); - return new mathMLTree.MathNode("mtext", [character]); - } else { - const node = new mathMLTree.MathNode("mspace"); - node.setAttribute("width", dimension.number + dimension.unit); - if (dimension.number < 0) { - node.style.marginLeft = dimension.number + dimension.unit; - } - return node; - } - } -}); - -const spaceCharacter = function(width) { - if (width >= 0.05555 && width <= 0.05556) { - return "\u200a"; //   - } else if (width >= 0.1666 && width <= 0.1667) { - return "\u2009"; //   - } else if (width >= 0.2222 && width <= 0.2223) { - return "\u2005"; //   - } else if (width >= 0.2777 && width <= 0.2778) { - return "\u2005\u200a"; //    - } else { - return ""; - } -}; - -// Limit valid characters to a small set, for safety. -const invalidIdRegEx = /[^A-Za-z_0-9-]/g; - -defineFunction({ - type: "label", - names: ["\\label"], - props: { - numArgs: 1, - argTypes: ["raw"] - }, - handler({ parser }, args) { - return { - type: "label", - mode: parser.mode, - string: args[0].string.replace(invalidIdRegEx, "") - }; - }, - mathmlBuilder(group, style) { - // Return a no-width, no-ink element with an HTML id. - const node = new mathMLTree.MathNode("mrow", [], ["tml-label"]); - if (group.string.length > 0) { - node.setAttribute("id", group.string); - } - return node - } -}); - -// Horizontal overlap functions - -const textModeLap = ["\\clap", "\\llap", "\\rlap"]; - -defineFunction({ - type: "lap", - names: ["\\mathllap", "\\mathrlap", "\\mathclap", "\\clap", "\\llap", "\\rlap"], - props: { - numArgs: 1, - allowedInText: true - }, - handler: ({ parser, funcName, token }, args) => { - if (textModeLap.includes(funcName)) { - if (parser.settings.strict && parser.mode !== "text") { - throw new ParseError(`{${funcName}} can be used only in text mode. - Try \\math${funcName.slice(1)}`, token) - } - funcName = funcName.slice(1); - } else { - funcName = funcName.slice(5); - } - const body = args[0]; - return { - type: "lap", - mode: parser.mode, - alignment: funcName, - body - } - }, - mathmlBuilder: (group, style) => { - // mathllap, mathrlap, mathclap - let strut; - if (group.alignment === "llap") { - // We need an invisible strut with the same depth as the group. - // We can't just read the depth, so we use \vphantom methods. - const phantomInner = buildExpression(ordargument(group.body), style); - const phantom = new mathMLTree.MathNode("mphantom", phantomInner); - strut = new mathMLTree.MathNode("mpadded", [phantom]); - strut.setAttribute("width", "0px"); - } - - const inner = buildGroup$1(group.body, style); - let node; - if (group.alignment === "llap") { - inner.style.position = "absolute"; - inner.style.right = "0"; - inner.style.bottom = `0`; // If we could have read the ink depth, it would go here. - node = new mathMLTree.MathNode("mpadded", [strut, inner]); - } else { - node = new mathMLTree.MathNode("mpadded", [inner]); - } - - if (group.alignment === "rlap") { - if (group.body.body.length > 0 && group.body.body[0].type === "genfrac") { - // In Firefox, a squashes the 3/18em padding of a child \frac. Put it back. - node.setAttribute("lspace", "0.16667em"); - } - } else { - const offset = group.alignment === "llap" ? "-1" : "-0.5"; - node.setAttribute("lspace", offset + "width"); - if (group.alignment === "llap") { - node.style.position = "relative"; - } else { - node.style.display = "flex"; - node.style.justifyContent = "center"; - } - } - node.setAttribute("width", "0px"); - return node - } -}); - -// Switching from text mode back to math mode -defineFunction({ - type: "ordgroup", - names: ["\\(", "$"], - props: { - numArgs: 0, - allowedInText: true, - allowedInMath: false - }, - handler({ funcName, parser }, args) { - const outerMode = parser.mode; - parser.switchMode("math"); - const close = funcName === "\\(" ? "\\)" : "$"; - const body = parser.parseExpression(false, close); - parser.expect(close); - parser.switchMode(outerMode); - return { - type: "ordgroup", - mode: parser.mode, - body - }; - } -}); - -// Check for extra closing math delimiters -defineFunction({ - type: "text", // Doesn't matter what this is. - names: ["\\)", "\\]"], - props: { - numArgs: 0, - allowedInText: true, - allowedInMath: false - }, - handler(context, token) { - throw new ParseError(`Mismatched ${context.funcName}`, token); - } -}); - -const chooseStyle = (group, style) => { - switch (style.level) { - case StyleLevel.DISPLAY: // 0 - return group.display; - case StyleLevel.TEXT: // 1 - return group.text; - case StyleLevel.SCRIPT: // 2 - return group.script; - case StyleLevel.SCRIPTSCRIPT: // 3 - return group.scriptscript; - default: - return group.text; - } -}; - -defineFunction({ - type: "mathchoice", - names: ["\\mathchoice"], - props: { - numArgs: 4, - primitive: true - }, - handler: ({ parser }, args) => { - return { - type: "mathchoice", - mode: parser.mode, - display: ordargument(args[0]), - text: ordargument(args[1]), - script: ordargument(args[2]), - scriptscript: ordargument(args[3]) - }; - }, - mathmlBuilder: (group, style) => { - const body = chooseStyle(group, style); - return buildExpressionRow(body, style); - } -}); - -const textAtomTypes = ["text", "textord", "mathord", "atom"]; - -const padding = width => { - const node = new mathMLTree.MathNode("mspace"); - node.setAttribute("width", width + "em"); - return node -}; - -function mathmlBuilder$3(group, style) { - let node; - const inner = buildExpression(group.body, style); - - if (group.mclass === "minner") { - node = new mathMLTree.MathNode("mpadded", inner); - } else if (group.mclass === "mord") { - if (group.isCharacterBox || inner[0].type === "mathord") { - node = inner[0]; - node.type = "mi"; - if (node.children.length === 1 && node.children[0].text && node.children[0].text === "∇") { - node.setAttribute("mathvariant", "normal"); - } - } else { - node = new mathMLTree.MathNode("mi", inner); - } - } else { - node = new mathMLTree.MathNode("mrow", inner); - if (group.mustPromote) { - node = inner[0]; - node.type = "mo"; - if (group.isCharacterBox && group.body[0].text && /[A-Za-z]/.test(group.body[0].text)) { - node.setAttribute("mathvariant", "italic"); - } - } else { - node = new mathMLTree.MathNode("mrow", inner); - } - - // Set spacing based on what is the most likely adjacent atom type. - // See TeXbook p170. - const doSpacing = style.level < 2; // Operator spacing is zero inside a (sub|super)script. - if (node.type === "mrow") { - if (doSpacing ) { - if (group.mclass === "mbin") { - // medium space - node.children.unshift(padding(0.2222)); - node.children.push(padding(0.2222)); - } else if (group.mclass === "mrel") { - // thickspace - node.children.unshift(padding(0.2778)); - node.children.push(padding(0.2778)); - } else if (group.mclass === "mpunct") { - node.children.push(padding(0.1667)); - } else if (group.mclass === "minner") { - node.children.unshift(padding(0.0556)); // 1 mu is the most likely option - node.children.push(padding(0.0556)); - } - } - } else { - if (group.mclass === "mbin") { - // medium space - node.attributes.lspace = (doSpacing ? "0.2222em" : "0"); - node.attributes.rspace = (doSpacing ? "0.2222em" : "0"); - } else if (group.mclass === "mrel") { - // thickspace - node.attributes.lspace = (doSpacing ? "0.2778em" : "0"); - node.attributes.rspace = (doSpacing ? "0.2778em" : "0"); - } else if (group.mclass === "mpunct") { - node.attributes.lspace = "0em"; - node.attributes.rspace = (doSpacing ? "0.1667em" : "0"); - } else if (group.mclass === "mopen" || group.mclass === "mclose") { - node.attributes.lspace = "0em"; - node.attributes.rspace = "0em"; - } else if (group.mclass === "minner" && doSpacing) { - node.attributes.lspace = "0.0556em"; // 1 mu is the most likely option - node.attributes.width = "+0.1111em"; - } - } - - if (!(group.mclass === "mopen" || group.mclass === "mclose")) { - delete node.attributes.stretchy; - delete node.attributes.form; - } - } - return node; -} - -// Math class commands except \mathop -defineFunction({ - type: "mclass", - names: [ - "\\mathord", - "\\mathbin", - "\\mathrel", - "\\mathopen", - "\\mathclose", - "\\mathpunct", - "\\mathinner" - ], - props: { - numArgs: 1, - primitive: true - }, - handler({ parser, funcName }, args) { - const body = args[0]; - const isCharacterBox = utils.isCharacterBox(body); - // We should not wrap a around a or . That would be invalid MathML. - // In that case, we instead promote the text contents of the body to the parent. - let mustPromote = true; - const mord = { type: "mathord", text: "", mode: parser.mode }; - const arr = (body.body) ? body.body : [body]; - for (const arg of arr) { - if (textAtomTypes.includes(arg.type)) { - if (symbols[parser.mode][arg.text]) { - mord.text += symbols[parser.mode][arg.text].replace; - } else if (arg.text) { - mord.text += arg.text; - } else if (arg.body) { - arg.body.map(e => { mord.text += e.text; }); - } - } else { - mustPromote = false; - break - } - } - return { - type: "mclass", - mode: parser.mode, - mclass: "m" + funcName.slice(5), - body: ordargument(mustPromote ? mord : body), - isCharacterBox, - mustPromote - }; - }, - mathmlBuilder: mathmlBuilder$3 -}); - -const binrelClass = (arg) => { - // \binrel@ spacing varies with (bin|rel|ord) of the atom in the argument. - // (by rendering separately and with {}s before and after, and measuring - // the change in spacing). We'll do roughly the same by detecting the - // atom type directly. - const atom = arg.type === "ordgroup" && arg.body.length ? arg.body[0] : arg; - if (atom.type === "atom" && (atom.family === "bin" || atom.family === "rel")) { - return "m" + atom.family; - } else { - return "mord"; - } -}; - -// \@binrel{x}{y} renders like y but as mbin/mrel/mord if x is mbin/mrel/mord. -// This is equivalent to \binrel@{x}\binrel@@{y} in AMSTeX. -defineFunction({ - type: "mclass", - names: ["\\@binrel"], - props: { - numArgs: 2 - }, - handler({ parser }, args) { - return { - type: "mclass", - mode: parser.mode, - mclass: binrelClass(args[0]), - body: ordargument(args[1]), - isCharacterBox: utils.isCharacterBox(args[1]) - }; - } -}); - -// Build a relation or stacked op by placing one symbol on top of another -defineFunction({ - type: "mclass", - names: ["\\stackrel", "\\overset", "\\underset"], - props: { - numArgs: 2 - }, - handler({ parser, funcName }, args) { - const baseArg = args[1]; - const shiftedArg = args[0]; - - const baseOp = { - type: "op", - mode: baseArg.mode, - limits: true, - alwaysHandleSupSub: true, - parentIsSupSub: false, - symbol: false, - stack: true, - suppressBaseShift: funcName !== "\\stackrel", - body: ordargument(baseArg) - }; - - return { - type: "supsub", - mode: shiftedArg.mode, - base: baseOp, - sup: funcName === "\\underset" ? null : shiftedArg, - sub: funcName === "\\underset" ? shiftedArg : null - }; - }, - mathmlBuilder: mathmlBuilder$3 -}); - -// Helper function -const buildGroup = (el, style, noneNode) => { - if (!el) { return noneNode } - const node = buildGroup$1(el, style); - if (node.type === "mrow" && node.children.length === 0) { return noneNode } - return node -}; - -defineFunction({ - type: "multiscript", - names: ["\\sideset", "\\pres@cript"], // See macros.js for \prescript - props: { - numArgs: 3 - }, - handler({ parser, funcName, token }, args) { - if (args[2].body.length === 0) { - throw new ParseError(funcName + `cannot parse an empty base.`) - } - const base = args[2].body[0]; - if (parser.settings.strict && funcName === "\\sideset" && !base.symbol) { - throw new ParseError(`The base of \\sideset must be a big operator. Try \\prescript.`) - } - - if ((args[0].body.length > 0 && args[0].body[0].type !== "supsub") || - (args[1].body.length > 0 && args[1].body[0].type !== "supsub")) { - throw new ParseError("\\sideset can parse only subscripts and " + - "superscripts in its first two arguments", token) - } - - // The prescripts and postscripts come wrapped in a supsub. - const prescripts = args[0].body.length > 0 ? args[0].body[0] : null; - const postscripts = args[1].body.length > 0 ? args[1].body[0] : null; - - if (!prescripts && !postscripts) { - return base - } else if (!prescripts) { - // It's not a multi-script. Get a \textstyle supsub. - return { - type: "styling", - mode: parser.mode, - scriptLevel: "text", - body: [{ - type: "supsub", - mode: parser.mode, - base, - sup: postscripts.sup, - sub: postscripts.sub - }] - } - } else { - return { - type: "multiscript", - mode: parser.mode, - isSideset: funcName === "\\sideset", - prescripts, - postscripts, - base - } - } - }, - mathmlBuilder(group, style) { - const base = buildGroup$1(group.base, style); - - const prescriptsNode = new mathMLTree.MathNode("mprescripts"); - const noneNode = new mathMLTree.MathNode("none"); - let children = []; - - const preSub = buildGroup(group.prescripts.sub, style, noneNode); - const preSup = buildGroup(group.prescripts.sup, style, noneNode); - if (group.isSideset) { - // This seems silly, but LaTeX does this. Firefox ignores it, which does not make me sad. - preSub.setAttribute("style", "text-align: left;"); - preSup.setAttribute("style", "text-align: left;"); - } - - if (group.postscripts) { - const postSub = buildGroup(group.postscripts.sub, style, noneNode); - const postSup = buildGroup(group.postscripts.sup, style, noneNode); - children = [base, postSub, postSup, prescriptsNode, preSub, preSup]; - } else { - children = [base, prescriptsNode, preSub, preSup]; - } - - return new mathMLTree.MathNode("mmultiscripts", children); - } -}); - -defineFunction({ - type: "not", - names: ["\\not"], - props: { - numArgs: 1, - primitive: true, - allowedInText: false - }, - handler({ parser }, args) { - const isCharacterBox = utils.isCharacterBox(args[0]); - let body; - if (isCharacterBox) { - body = ordargument(args[0]); - if (body[0].text.charAt(0) === "\\") { - body[0].text = symbols.math[body[0].text].replace; - } - // \u0338 is the Unicode Combining Long Solidus Overlay - body[0].text = body[0].text.slice(0, 1) + "\u0338" + body[0].text.slice(1); - } else { - // When the argument is not a character box, TeX does an awkward, poorly placed overlay. - // We'll do the same. - const notNode = { type: "textord", mode: "math", text: "\u0338" }; - const kernNode = { type: "kern", mode: "math", dimension: { number: -0.6, unit: "em" } }; - body = [notNode, kernNode, args[0]]; - } - return { - type: "not", - mode: parser.mode, - body, - isCharacterBox - }; - }, - mathmlBuilder(group, style) { - if (group.isCharacterBox) { - const inner = buildExpression(group.body, style, true); - return inner[0] - } else { - return buildExpressionRow(group.body, style) - } - } -}); - -// Limits, symbols - -// Some helpers - -const ordAtomTypes = ["textord", "mathord", "atom"]; - -// Most operators have a large successor symbol, but these don't. -const noSuccessor = ["\\smallint"]; - -// Math operators (e.g. \sin) need a space between these types and themselves: -const ordTypes = ["textord", "mathord", "ordgroup", "close", "leftright"]; - -// NOTE: Unlike most `builders`s, this one handles not only "op", but also -// "supsub" since some of them (like \int) can affect super/subscripting. - -const setSpacing = node => { - // The user wrote a \mathop{…} function. Change spacing from default to OP spacing. - // The most likely spacing for an OP is a thin space per TeXbook p170. - node.attributes.lspace = "0.1667em"; - node.attributes.rspace = "0.1667em"; -}; - -const mathmlBuilder$2 = (group, style) => { - let node; - - if (group.symbol) { - // This is a symbol. Just add the symbol. - node = new MathNode("mo", [makeText(group.name, group.mode)]); - if (noSuccessor.includes(group.name)) { - node.setAttribute("largeop", "false"); - } else { - node.setAttribute("movablelimits", "false"); - } - if (group.fromMathOp) { setSpacing(node); } - } else if (group.body) { - // This is an operator with children. Add them. - node = new MathNode("mo", buildExpression(group.body, style)); - if (group.fromMathOp) { setSpacing(node); } - } else { - // This is a text operator. Add all of the characters from the operator's name. - node = new MathNode("mi", [new TextNode(group.name.slice(1))]); - - if (!group.parentIsSupSub) { - // Append an invisible . - // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4 - const operator = new MathNode("mo", [makeText("\u2061", "text")]); - const row = [node, operator]; - // Set spacing - if (group.needsLeadingSpace) { - const lead = new MathNode("mspace"); - lead.setAttribute("width", "0.1667em"); // thin space. - row.unshift(lead); - } - if (!group.isFollowedByDelimiter) { - const trail = new MathNode("mspace"); - trail.setAttribute("width", "0.1667em"); // thin space. - row.push(trail); - } - node = new MathNode("mrow", row); - } - } - - return node; -}; - -const singleCharBigOps = { - "\u220F": "\\prod", - "\u2210": "\\coprod", - "\u2211": "\\sum", - "\u22c0": "\\bigwedge", - "\u22c1": "\\bigvee", - "\u22c2": "\\bigcap", - "\u22c3": "\\bigcup", - "\u2a00": "\\bigodot", - "\u2a01": "\\bigoplus", - "\u2a02": "\\bigotimes", - "\u2a04": "\\biguplus", - "\u2a05": "\\bigsqcap", - "\u2a06": "\\bigsqcup", - "\u2a09": "\\bigtimes" -}; - -defineFunction({ - type: "op", - names: [ - "\\coprod", - "\\bigvee", - "\\bigwedge", - "\\biguplus", - "\\bigcap", - "\\bigcup", - "\\intop", - "\\prod", - "\\sum", - "\\bigotimes", - "\\bigoplus", - "\\bigodot", - "\\bigsqcap", - "\\bigsqcup", - "\\bigtimes", - "\\smallint", - "\u220F", - "\u2210", - "\u2211", - "\u22c0", - "\u22c1", - "\u22c2", - "\u22c3", - "\u2a00", - "\u2a01", - "\u2a02", - "\u2a04", - "\u2a06" - ], - props: { - numArgs: 0 - }, - handler: ({ parser, funcName }, args) => { - let fName = funcName; - if (fName.length === 1) { - fName = singleCharBigOps[fName]; - } - return { - type: "op", - mode: parser.mode, - limits: true, - parentIsSupSub: false, - symbol: true, - stack: false, // This is true for \stackrel{}, not here. - name: fName - }; - }, - mathmlBuilder: mathmlBuilder$2 -}); - -// Note: calling defineFunction with a type that's already been defined only -// works because the same mathmlBuilder is being used. -defineFunction({ - type: "op", - names: ["\\mathop"], - props: { - numArgs: 1, - primitive: true - }, - handler: ({ parser }, args) => { - const body = args[0]; - // It would be convienient to just wrap a around the argument. - // But if the argument is a or , that would be invalid MathML. - // In that case, we instead promote the text contents of the body to the parent. - const arr = (body.body) ? body.body : [body]; - const isSymbol = arr.length === 1 && ordAtomTypes.includes(arr[0].type); - return { - type: "op", - mode: parser.mode, - limits: true, - parentIsSupSub: false, - symbol: isSymbol, - fromMathOp: true, - stack: false, - name: isSymbol ? arr[0].text : null, - body: isSymbol ? null : ordargument(body) - }; - }, - mathmlBuilder: mathmlBuilder$2 -}); - -// There are 2 flags for operators; whether they produce limits in -// displaystyle, and whether they are symbols and should grow in -// displaystyle. These four groups cover the four possible choices. - -const singleCharIntegrals = { - "\u222b": "\\int", - "\u222c": "\\iint", - "\u222d": "\\iiint", - "\u222e": "\\oint", - "\u222f": "\\oiint", - "\u2230": "\\oiiint", - "\u2231": "\\intclockwise", - "\u2232": "\\varointclockwise", - "\u2a0c": "\\iiiint", - "\u2a0d": "\\intbar", - "\u2a0e": "\\intBar", - "\u2a0f": "\\fint", - "\u2a12": "\\rppolint", - "\u2a13": "\\scpolint", - "\u2a15": "\\pointint", - "\u2a16": "\\sqint", - "\u2a17": "\\intlarhk", - "\u2a18": "\\intx", - "\u2a19": "\\intcap", - "\u2a1a": "\\intcup" -}; - -// No limits, not symbols -defineFunction({ - type: "op", - names: [ - "\\arcsin", - "\\arccos", - "\\arctan", - "\\arctg", - "\\arcctg", - "\\arg", - "\\ch", - "\\cos", - "\\cosec", - "\\cosh", - "\\cot", - "\\cotg", - "\\coth", - "\\csc", - "\\ctg", - "\\cth", - "\\deg", - "\\dim", - "\\exp", - "\\hom", - "\\ker", - "\\lg", - "\\ln", - "\\log", - "\\sec", - "\\sin", - "\\sinh", - "\\sh", - "\\sgn", - "\\tan", - "\\tanh", - "\\tg", - "\\th" - ], - props: { - numArgs: 0 - }, - handler({ parser, funcName }) { - const prevAtomType = parser.prevAtomType; - const next = parser.gullet.future().text; - return { - type: "op", - mode: parser.mode, - limits: false, - parentIsSupSub: false, - symbol: false, - stack: false, - isFollowedByDelimiter: isDelimiter(next), - needsLeadingSpace: prevAtomType.length > 0 && ordTypes.includes(prevAtomType), - name: funcName - }; - }, - mathmlBuilder: mathmlBuilder$2 -}); - -// Limits, not symbols -defineFunction({ - type: "op", - names: ["\\det", "\\gcd", "\\inf", "\\lim", "\\max", "\\min", "\\Pr", "\\sup"], - props: { - numArgs: 0 - }, - handler({ parser, funcName }) { - const prevAtomType = parser.prevAtomType; - const next = parser.gullet.future().text; - return { - type: "op", - mode: parser.mode, - limits: true, - parentIsSupSub: false, - symbol: false, - stack: false, - isFollowedByDelimiter: isDelimiter(next), - needsLeadingSpace: prevAtomType.length > 0 && ordTypes.includes(prevAtomType), - name: funcName - }; - }, - mathmlBuilder: mathmlBuilder$2 -}); - -// No limits, symbols -defineFunction({ - type: "op", - names: [ - "\\int", - "\\iint", - "\\iiint", - "\\iiiint", - "\\oint", - "\\oiint", - "\\oiiint", - "\\intclockwise", - "\\varointclockwise", - "\\intbar", - "\\intBar", - "\\fint", - "\\rppolint", - "\\scpolint", - "\\pointint", - "\\sqint", - "\\intlarhk", - "\\intx", - "\\intcap", - "\\intcup", - "\u222b", - "\u222c", - "\u222d", - "\u222e", - "\u222f", - "\u2230", - "\u2231", - "\u2232", - "\u2a0c", - "\u2a0d", - "\u2a0e", - "\u2a0f", - "\u2a12", - "\u2a13", - "\u2a15", - "\u2a16", - "\u2a17", - "\u2a18", - "\u2a19", - "\u2a1a" - ], - props: { - numArgs: 0 - }, - handler({ parser, funcName }) { - let fName = funcName; - if (fName.length === 1) { - fName = singleCharIntegrals[fName]; - } - return { - type: "op", - mode: parser.mode, - limits: false, - parentIsSupSub: false, - symbol: true, - stack: false, - name: fName - }; - }, - mathmlBuilder: mathmlBuilder$2 -}); - -/** - * All registered global/built-in macros. - * `macros.js` exports this same dictionary again and makes it public. - * `Parser.js` requires this dictionary via `macros.js`. - */ -const _macros = {}; - -// This function might one day accept an additional argument and do more things. -function defineMacro(name, body) { - _macros[name] = body; -} - -// NOTE: Unlike most builders, this one handles not only -// "operatorname", but also "supsub" since \operatorname* can -// affect super/subscripting. - -const mathmlBuilder$1 = (group, style) => { - let expression = buildExpression(group.body, style.withFont("mathrm")); - - // Is expression a string or has it something like a fraction? - let isAllString = true; // default - for (let i = 0; i < expression.length; i++) { - let node = expression[i]; - if (node instanceof mathMLTree.MathNode) { - if (node.type === "mrow" && node.children.length === 1 && - node.children[0] instanceof mathMLTree.MathNode) { - node = node.children[0]; - } - switch (node.type) { - case "mi": - case "mn": - case "ms": - case "mtext": - break; // Do nothing yet. - case "mspace": - { - if (node.attributes.width) { - const width = node.attributes.width.replace("em", ""); - const ch = spaceCharacter(Number(width)); - if (ch === "") { - isAllString = false; - } else { - expression[i] = new mathMLTree.MathNode("mtext", [new mathMLTree.TextNode(ch)]); - } - } - } - break - case "mo": { - const child = node.children[0]; - if (node.children.length === 1 && child instanceof mathMLTree.TextNode) { - child.text = child.text.replace(/\u2212/, "-").replace(/\u2217/, "*"); - } else { - isAllString = false; - } - break - } - default: - isAllString = false; - } - } else { - isAllString = false; - } - } - - if (isAllString) { - // Write a single TextNode instead of multiple nested tags. - const word = expression.map((node) => node.toText()).join(""); - expression = [new mathMLTree.TextNode(word)]; - } else if ( - expression.length === 1 - && ["mover", "munder"].includes(expression[0].type) && - (expression[0].children[0].type === "mi" || expression[0].children[0].type === "mtext") - ) { - expression[0].children[0].type = "mi"; - if (group.parentIsSupSub) { - return new mathMLTree.MathNode("mrow", expression) - } else { - const operator = new mathMLTree.MathNode("mo", [makeText("\u2061", "text")]); - return mathMLTree.newDocumentFragment([expression[0], operator]) - } - } - - let wrapper; - if (isAllString) { - wrapper = new mathMLTree.MathNode("mi", expression); - if (expression[0].text.length === 1) { - wrapper.setAttribute("mathvariant", "normal"); - } - } else { - wrapper = new mathMLTree.MathNode("mrow", expression); - } - - if (!group.parentIsSupSub) { - // Append an . - // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4 - const operator = new mathMLTree.MathNode("mo", [makeText("\u2061", "text")]); - const fragment = [wrapper, operator]; - if (group.needsLeadingSpace) { - // LaTeX gives operator spacing, but a gets ord spacing. - // So add a leading space. - const space = new mathMLTree.MathNode("mspace"); - space.setAttribute("width", "0.1667em"); // thin space. - fragment.unshift(space); - } - if (!group.isFollowedByDelimiter) { - const trail = new mathMLTree.MathNode("mspace"); - trail.setAttribute("width", "0.1667em"); // thin space. - fragment.push(trail); - } - return mathMLTree.newDocumentFragment(fragment) - } - - return wrapper -}; - -// \operatorname -// amsopn.dtx: \mathop{#1\kern\z@\operator@font#3}\newmcodes@ -defineFunction({ - type: "operatorname", - names: ["\\operatorname@", "\\operatornamewithlimits"], - props: { - numArgs: 1, - allowedInArgument: true - }, - handler: ({ parser, funcName }, args) => { - const body = args[0]; - const prevAtomType = parser.prevAtomType; - const next = parser.gullet.future().text; - return { - type: "operatorname", - mode: parser.mode, - body: ordargument(body), - alwaysHandleSupSub: (funcName === "\\operatornamewithlimits"), - limits: false, - parentIsSupSub: false, - isFollowedByDelimiter: isDelimiter(next), - needsLeadingSpace: prevAtomType.length > 0 && ordTypes.includes(prevAtomType) - }; - }, - mathmlBuilder: mathmlBuilder$1 -}); - -defineMacro("\\operatorname", - "\\@ifstar\\operatornamewithlimits\\operatorname@"); - -defineFunctionBuilders({ - type: "ordgroup", - mathmlBuilder(group, style) { - return buildExpressionRow(group.body, style, group.semisimple); - } -}); - -defineFunction({ - type: "phantom", - names: ["\\phantom"], - props: { - numArgs: 1, - allowedInText: true - }, - handler: ({ parser }, args) => { - const body = args[0]; - return { - type: "phantom", - mode: parser.mode, - body: ordargument(body) - }; - }, - mathmlBuilder: (group, style) => { - const inner = buildExpression(group.body, style); - return new mathMLTree.MathNode("mphantom", inner); - } -}); - -defineFunction({ - type: "hphantom", - names: ["\\hphantom"], - props: { - numArgs: 1, - allowedInText: true - }, - handler: ({ parser }, args) => { - const body = args[0]; - return { - type: "hphantom", - mode: parser.mode, - body - }; - }, - mathmlBuilder: (group, style) => { - const inner = buildExpression(ordargument(group.body), style); - const phantom = new mathMLTree.MathNode("mphantom", inner); - const node = new mathMLTree.MathNode("mpadded", [phantom]); - node.setAttribute("height", "0px"); - node.setAttribute("depth", "0px"); - return node; - } -}); - -defineFunction({ - type: "vphantom", - names: ["\\vphantom"], - props: { - numArgs: 1, - allowedInText: true - }, - handler: ({ parser }, args) => { - const body = args[0]; - return { - type: "vphantom", - mode: parser.mode, - body - }; - }, - mathmlBuilder: (group, style) => { - const inner = buildExpression(ordargument(group.body), style); - const phantom = new mathMLTree.MathNode("mphantom", inner); - const node = new mathMLTree.MathNode("mpadded", [phantom]); - node.setAttribute("width", "0px"); - return node; - } -}); - -// In LaTeX, \pmb is a simulation of bold font. -// The version of \pmb in ambsy.sty works by typesetting three copies of the argument -// with small offsets. We use CSS font-weight:bold. - -defineFunction({ - type: "pmb", - names: ["\\pmb"], - props: { - numArgs: 1, - allowedInText: true - }, - handler({ parser }, args) { - return { - type: "pmb", - mode: parser.mode, - body: ordargument(args[0]) - } - }, - mathmlBuilder(group, style) { - const inner = buildExpression(group.body, style); - // Wrap with an element. - const node = wrapWithMstyle(inner); - node.setAttribute("style", "font-weight:bold"); - return node - } -}); - -// \raise, \lower, and \raisebox - -const mathmlBuilder = (group, style) => { - const newStyle = style.withLevel(StyleLevel.TEXT); - const node = new mathMLTree.MathNode("mpadded", [buildGroup$1(group.body, newStyle)]); - const dy = calculateSize(group.dy, style); - node.setAttribute("voffset", dy.number + dy.unit); - // Add padding, which acts to increase height in Chromium. - // TODO: Figure out some way to change height in Firefox w/o breaking Chromium. - if (dy.number > 0) { - node.style.padding = dy.number + dy.unit + " 0 0 0"; - } else { - node.style.padding = "0 0 " + Math.abs(dy.number) + dy.unit + " 0"; - } - return node -}; - -defineFunction({ - type: "raise", - names: ["\\raise", "\\lower"], - props: { - numArgs: 2, - argTypes: ["size", "primitive"], - primitive: true - }, - handler({ parser, funcName }, args) { - const amount = assertNodeType(args[0], "size").value; - if (funcName === "\\lower") { amount.number *= -1; } - const body = args[1]; - return { - type: "raise", - mode: parser.mode, - dy: amount, - body - }; - }, - mathmlBuilder -}); - - -defineFunction({ - type: "raise", - names: ["\\raisebox"], - props: { - numArgs: 2, - argTypes: ["size", "hbox"], - allowedInText: true - }, - handler({ parser, funcName }, args) { - const amount = assertNodeType(args[0], "size").value; - const body = args[1]; - return { - type: "raise", - mode: parser.mode, - dy: amount, - body - }; - }, - mathmlBuilder -}); - -defineFunction({ - type: "ref", - names: ["\\ref", "\\eqref"], - props: { - numArgs: 1, - argTypes: ["raw"] - }, - handler({ parser, funcName }, args) { - return { - type: "ref", - mode: parser.mode, - funcName, - string: args[0].string.replace(invalidIdRegEx, "") - }; - }, - mathmlBuilder(group, style) { - // Create an empty text node. Set a class and an href. - // The post-processor will populate with the target's tag or equation number. - const classes = group.funcName === "\\ref" ? ["tml-ref"] : ["tml-ref", "tml-eqref"]; - const node = new mathMLTree.MathNode("mtext", [new mathMLTree.TextNode("")], classes); - node.setAttribute("href", "#" + group.string); - return node - } -}); - -defineFunction({ - type: "reflect", - names: ["\\reflectbox"], - props: { - numArgs: 1, - argTypes: ["hbox"], - allowedInText: true - }, - handler({ parser }, args) { - return { - type: "reflect", - mode: parser.mode, - body: args[0] - }; - }, - mathmlBuilder(group, style) { - const node = buildGroup$1(group.body, style); - node.style.transform = "scaleX(-1)"; - return node - } -}); - -defineFunction({ - type: "internal", - names: ["\\relax"], - props: { - numArgs: 0, - allowedInText: true - }, - handler({ parser }) { - return { - type: "internal", - mode: parser.mode - }; - } -}); - -defineFunction({ - type: "rule", - names: ["\\rule"], - props: { - numArgs: 2, - numOptionalArgs: 1, - argTypes: ["size", "size", "size"] - }, - handler({ parser }, args, optArgs) { - const shift = optArgs[0]; - const width = assertNodeType(args[0], "size"); - const height = assertNodeType(args[1], "size"); - return { - type: "rule", - mode: parser.mode, - shift: shift && assertNodeType(shift, "size").value, - width: width.value, - height: height.value - }; - }, - mathmlBuilder(group, style) { - const width = calculateSize(group.width, style); - const height = calculateSize(group.height, style); - const shift = group.shift - ? calculateSize(group.shift, style) - : { number: 0, unit: "em" }; - const color = (style.color && style.getColor()) || "black"; - - const rule = new mathMLTree.MathNode("mspace"); - if (width.number > 0 && height.number > 0) { - rule.setAttribute("mathbackground", color); - } - rule.setAttribute("width", width.number + width.unit); - rule.setAttribute("height", height.number + height.unit); - if (shift.number === 0) { return rule } - - const wrapper = new mathMLTree.MathNode("mpadded", [rule]); - if (shift.number >= 0) { - wrapper.setAttribute("height", "+" + shift.number + shift.unit); - } else { - wrapper.setAttribute("height", shift.number + shift.unit); - wrapper.setAttribute("depth", "+" + -shift.number + shift.unit); - } - wrapper.setAttribute("voffset", shift.number + shift.unit); - return wrapper; - } -}); - -// The size mappings are taken from TeX with \normalsize=10pt. -// We don't have to track script level. MathML does that. -const sizeMap = { - "\\tiny": 0.5, - "\\sixptsize": 0.6, - "\\Tiny": 0.6, - "\\scriptsize": 0.7, - "\\footnotesize": 0.8, - "\\small": 0.9, - "\\normalsize": 1.0, - "\\large": 1.2, - "\\Large": 1.44, - "\\LARGE": 1.728, - "\\huge": 2.074, - "\\Huge": 2.488 -}; - -defineFunction({ - type: "sizing", - names: [ - "\\tiny", - "\\sixptsize", - "\\Tiny", - "\\scriptsize", - "\\footnotesize", - "\\small", - "\\normalsize", - "\\large", - "\\Large", - "\\LARGE", - "\\huge", - "\\Huge" - ], - props: { - numArgs: 0, - allowedInText: true - }, - handler: ({ breakOnTokenText, funcName, parser }, args) => { - if (parser.settings.strict && parser.mode === "math") { - // eslint-disable-next-line no-console - console.log(`Temml strict-mode warning: Command ${funcName} is invalid in math mode.`); - } - const body = parser.parseExpression(false, breakOnTokenText, true); - return { - type: "sizing", - mode: parser.mode, - funcName, - body - }; - }, - mathmlBuilder: (group, style) => { - const newStyle = style.withFontSize(sizeMap[group.funcName]); - const inner = buildExpression(group.body, newStyle); - // Wrap with an element. - const node = wrapWithMstyle(inner); - const factor = (sizeMap[group.funcName] / style.fontSize).toFixed(4); - node.setAttribute("mathsize", factor + "em"); - return node; - } -}); - -// smash, with optional [tb], as in AMS - -defineFunction({ - type: "smash", - names: ["\\smash"], - props: { - numArgs: 1, - numOptionalArgs: 1, - allowedInText: true - }, - handler: ({ parser }, args, optArgs) => { - let smashHeight = false; - let smashDepth = false; - const tbArg = optArgs[0] && assertNodeType(optArgs[0], "ordgroup"); - if (tbArg) { - // Optional [tb] argument is engaged. - // ref: amsmath: \renewcommand{\smash}[1][tb]{% - // def\mb@t{\ht}\def\mb@b{\dp}\def\mb@tb{\ht\z@\z@\dp}% - let letter = ""; - for (let i = 0; i < tbArg.body.length; ++i) { - const node = tbArg.body[i]; - // TODO: Write an AssertSymbolNode - letter = node.text; - if (letter === "t") { - smashHeight = true; - } else if (letter === "b") { - smashDepth = true; - } else { - smashHeight = false; - smashDepth = false; - break; - } - } - } else { - smashHeight = true; - smashDepth = true; - } - - const body = args[0]; - return { - type: "smash", - mode: parser.mode, - body, - smashHeight, - smashDepth - }; - }, - mathmlBuilder: (group, style) => { - const node = new mathMLTree.MathNode("mpadded", [buildGroup$1(group.body, style)]); - - if (group.smashHeight) { - node.setAttribute("height", "0px"); - } - - if (group.smashDepth) { - node.setAttribute("depth", "0px"); - } - - return node; - } -}); - -defineFunction({ - type: "sqrt", - names: ["\\sqrt"], - props: { - numArgs: 1, - numOptionalArgs: 1 - }, - handler({ parser }, args, optArgs) { - const index = optArgs[0]; - const body = args[0]; - return { - type: "sqrt", - mode: parser.mode, - body, - index - }; - }, - mathmlBuilder(group, style) { - const { body, index } = group; - return index - ? new mathMLTree.MathNode("mroot", [ - buildGroup$1(body, style), - buildGroup$1(index, style.incrementLevel()) - ]) - : new mathMLTree.MathNode("msqrt", [buildGroup$1(body, style)]); - } -}); - -const styleMap = { - display: 0, - text: 1, - script: 2, - scriptscript: 3 -}; - -const styleAttributes = { - display: ["0", "true"], - text: ["0", "false"], - script: ["1", "false"], - scriptscript: ["2", "false"] -}; - -defineFunction({ - type: "styling", - names: ["\\displaystyle", "\\textstyle", "\\scriptstyle", "\\scriptscriptstyle"], - props: { - numArgs: 0, - allowedInText: true, - primitive: true - }, - handler({ breakOnTokenText, funcName, parser }, args) { - // parse out the implicit body - const body = parser.parseExpression(true, breakOnTokenText, true); - - const scriptLevel = funcName.slice(1, funcName.length - 5); - return { - type: "styling", - mode: parser.mode, - // Figure out what scriptLevel to use by pulling out the scriptLevel from - // the function name - scriptLevel, - body - }; - }, - mathmlBuilder(group, style) { - // Figure out what scriptLevel we're changing to. - const newStyle = style.withLevel(styleMap[group.scriptLevel]); - // The style argument in the next line does NOT directly set a MathML script level. - // It just tracks the style level, in case we need to know it for supsub or mathchoice. - const inner = buildExpression(group.body, newStyle); - // Wrap with an element. - const node = wrapWithMstyle(inner); - - const attr = styleAttributes[group.scriptLevel]; - - // Here is where we set the MathML script level. - node.setAttribute("scriptlevel", attr[0]); - node.setAttribute("displaystyle", attr[1]); - - return node; - } -}); - -/** - * Sometimes, groups perform special rules when they have superscripts or - * subscripts attached to them. This function lets the `supsub` group know that - * Sometimes, groups perform special rules when they have superscripts or - * its inner element should handle the superscripts and subscripts instead of - * handling them itself. - */ - -// Helpers -const symbolRegEx = /^m(over|under|underover)$/; - -// Super scripts and subscripts, whose precise placement can depend on other -// functions that precede them. -defineFunctionBuilders({ - type: "supsub", - mathmlBuilder(group, style) { - // Is the inner group a relevant horizonal brace? - let isBrace = false; - let isOver; - let isSup; - let appendApplyFunction = false; - let appendSpace = false; - let needsLeadingSpace = false; - - if (group.base && group.base.type === "horizBrace") { - isSup = !!group.sup; - if (isSup === group.base.isOver) { - isBrace = true; - isOver = group.base.isOver; - } - } - - if (group.base && !group.base.stack && - (group.base.type === "op" || group.base.type === "operatorname")) { - group.base.parentIsSupSub = true; - appendApplyFunction = !group.base.symbol; - appendSpace = appendApplyFunction && !group.isFollowedByDelimiter; - needsLeadingSpace = group.base.needsLeadingSpace; - } - - const children = group.base && group.base.stack - ? [buildGroup$1(group.base.body[0], style)] - : [buildGroup$1(group.base, style)]; - - const childStyle = style.inSubOrSup(); - if (group.sub) { - children.push(buildGroup$1(group.sub, childStyle)); - } - - if (group.sup) { - const sup = buildGroup$1(group.sup, childStyle); - const testNode = sup.type === "mrow" ? sup.children[0] : sup; - if ((testNode.type === "mo" && testNode.classes.includes("tml-prime")) - && group.base && group.base.text && group.base.text === "f") { - // Chromium does not address italic correction on prime. Prevent f′ from overlapping. - testNode.classes.push("prime-pad"); - } - children.push(sup); - } - - let nodeType; - if (isBrace) { - nodeType = isOver ? "mover" : "munder"; - } else if (!group.sub) { - const base = group.base; - if ( - base && - base.type === "op" && - base.limits && - (style.level === StyleLevel.DISPLAY || base.alwaysHandleSupSub) - ) { - nodeType = "mover"; - } else if ( - base && - base.type === "operatorname" && - base.alwaysHandleSupSub && - (base.limits || style.level === StyleLevel.DISPLAY) - ) { - nodeType = "mover"; - } else { - nodeType = "msup"; - } - } else if (!group.sup) { - const base = group.base; - if ( - base && - base.type === "op" && - base.limits && - (style.level === StyleLevel.DISPLAY || base.alwaysHandleSupSub) - ) { - nodeType = "munder"; - } else if ( - base && - base.type === "operatorname" && - base.alwaysHandleSupSub && - (base.limits || style.level === StyleLevel.DISPLAY) - ) { - nodeType = "munder"; - } else { - nodeType = "msub"; - } - } else { - const base = group.base; - if (base && ((base.type === "op" && base.limits) || base.type === "multiscript") && - (style.level === StyleLevel.DISPLAY || base.alwaysHandleSupSub) - ) { - nodeType = "munderover"; - } else if ( - base && - base.type === "operatorname" && - base.alwaysHandleSupSub && - (style.level === StyleLevel.DISPLAY || base.limits) - ) { - nodeType = "munderover"; - } else { - nodeType = "msubsup"; - } - } - - let node = new mathMLTree.MathNode(nodeType, children); - if (appendApplyFunction) { - // Append an . - // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4 - const operator = new mathMLTree.MathNode("mo", [makeText("\u2061", "text")]); - if (needsLeadingSpace) { - const space = new mathMLTree.MathNode("mspace"); - space.setAttribute("width", "0.1667em"); // thin space. - node = mathMLTree.newDocumentFragment([space, node, operator]); - } else { - node = mathMLTree.newDocumentFragment([node, operator]); - } - if (appendSpace) { - const space = new mathMLTree.MathNode("mspace"); - space.setAttribute("width", "0.1667em"); // thin space. - node.children.push(space); - } - } else if (symbolRegEx.test(nodeType)) { - // Wrap in a . Otherwise Firefox stretchy parens will not stretch to include limits. - node = new mathMLTree.MathNode("mrow", [node]); - } - - return node - } -}); - -// Operator ParseNodes created in Parser.js from symbol Groups in src/symbols.js. - -const short = ["\\shortmid", "\\nshortmid", "\\shortparallel", - "\\nshortparallel", "\\smallsetminus"]; - -const arrows = ["\\Rsh", "\\Lsh", "\\restriction"]; - -const isArrow = str => { - if (str.length === 1) { - const codePoint = str.codePointAt(0); - return (0x218f < codePoint && codePoint < 0x2200) - } - return str.indexOf("arrow") > -1 || str.indexOf("harpoon") > -1 || arrows.includes(str) -}; - -defineFunctionBuilders({ - type: "atom", - mathmlBuilder(group, style) { - const node = new mathMLTree.MathNode("mo", [makeText(group.text, group.mode)]); - if (group.family === "punct") { - node.setAttribute("separator", "true"); - } else if (group.family === "open" || group.family === "close") { - // Delims built here should not stretch vertically. - // See delimsizing.js for stretchy delims. - if (group.family === "open") { - node.setAttribute("form", "prefix"); - // Set an explicit attribute for stretch. Otherwise Firefox may do it wrong. - node.setAttribute("stretchy", "false"); - } else if (group.family === "close") { - node.setAttribute("form", "postfix"); - node.setAttribute("stretchy", "false"); - } - } else if (group.text === "\\mid") { - // Firefox messes up this spacing if at the end of an . See it explicitly. - node.setAttribute("lspace", "0.22em"); // medium space - node.setAttribute("rspace", "0.22em"); - node.setAttribute("stretchy", "false"); - } else if (group.family === "rel" && isArrow(group.text)) { - node.setAttribute("stretchy", "false"); - } else if (short.includes(group.text)) { - node.setAttribute("mathsize", "70%"); - } else if (group.text === ":") { - // ":" is not in the MathML operator dictionary. Give it BIN spacing. - node.attributes.lspace = "0.2222em"; - node.attributes.rspace = "0.2222em"; - } - return node; - } -}); - -/** - * Maps TeX font commands to "mathvariant" attribute in buildMathML.js - */ -const fontMap = { - // styles - mathbf: "bold", - mathrm: "normal", - textit: "italic", - mathit: "italic", - mathnormal: "italic", - - // families - mathbb: "double-struck", - mathcal: "script", - mathfrak: "fraktur", - mathscr: "script", - mathsf: "sans-serif", - mathtt: "monospace" -}; - -/** - * Returns the math variant as a string or null if none is required. - */ -const getVariant = function(group, style) { - // Handle font specifiers as best we can. - // Chromium does not support the MathML mathvariant attribute. - // So we'll use Unicode replacement characters instead. - // But first, determine the math variant. - - // Deal with the \textit, \textbf, etc., functions. - if (style.fontFamily === "texttt") { - return "monospace" - } else if (style.fontFamily === "textsc") { - return "normal"; // handled via character substitution in symbolsOrd.js. - } else if (style.fontFamily === "textsf") { - if (style.fontShape === "textit" && style.fontWeight === "textbf") { - return "sans-serif-bold-italic" - } else if (style.fontShape === "textit") { - return "sans-serif-italic" - } else if (style.fontWeight === "textbf") { - return "sans-serif-bold" - } else { - return "sans-serif" - } - } else if (style.fontShape === "textit" && style.fontWeight === "textbf") { - return "bold-italic" - } else if (style.fontShape === "textit") { - return "italic" - } else if (style.fontWeight === "textbf") { - return "bold" - } - - // Deal with the \mathit, mathbf, etc, functions. - const font = style.font; - if (!font || font === "mathnormal") { - return null - } - - const mode = group.mode; - switch (font) { - case "mathit": - return "italic" - case "mathrm": { - const codePoint = group.text.codePointAt(0); - // LaTeX \mathrm returns italic for Greek characters. - return (0x03ab < codePoint && codePoint < 0x03cf) ? "italic" : "normal" - } - case "greekItalic": - return "italic" - case "up@greek": - return "normal" - case "boldsymbol": - case "mathboldsymbol": - return "bold-italic" - case "mathbf": - return "bold" - case "mathbb": - return "double-struck" - case "mathfrak": - return "fraktur" - case "mathscr": - case "mathcal": - return "script" - case "mathsf": - return "sans-serif" - case "mathtt": - return "monospace" - } - - let text = group.text; - if (symbols[mode][text] && symbols[mode][text].replace) { - text = symbols[mode][text].replace; - } - - return Object.prototype.hasOwnProperty.call(fontMap, font) ? fontMap[font] : null -}; - -// Chromium does not support the MathML `mathvariant` attribute. -// Instead, we replace ASCII characters with Unicode characters that -// are defined in the font as bold, italic, double-struck, etc. -// This module identifies those Unicode code points. - -// First, a few helpers. -const script = Object.freeze({ - B: 0x20EA, // Offset from ASCII B to Unicode script B - E: 0x20EB, - F: 0x20EB, - H: 0x20C3, - I: 0x20C7, - L: 0x20C6, - M: 0x20E6, - R: 0x20C9, - e: 0x20CA, - g: 0x20A3, - o: 0x20C5 -}); - -const frak = Object.freeze({ - C: 0x20EA, - H: 0x20C4, - I: 0x20C8, - R: 0x20CA, - Z: 0x20CE -}); - -const bbb = Object.freeze({ - C: 0x20BF, // blackboard bold - H: 0x20C5, - N: 0x20C7, - P: 0x20C9, - Q: 0x20C9, - R: 0x20CB, - Z: 0x20CA -}); - -const bold = Object.freeze({ - "\u03f5": 0x1D2E7, // lunate epsilon - "\u03d1": 0x1D30C, // vartheta - "\u03f0": 0x1D2EE, // varkappa - "\u03c6": 0x1D319, // varphi - "\u03f1": 0x1D2EF, // varrho - "\u03d6": 0x1D30B // varpi -}); - -const boldItalic = Object.freeze({ - "\u03f5": 0x1D35B, // lunate epsilon - "\u03d1": 0x1D380, // vartheta - "\u03f0": 0x1D362, // varkappa - "\u03c6": 0x1D38D, // varphi - "\u03f1": 0x1D363, // varrho - "\u03d6": 0x1D37F // varpi -}); - -const boldsf = Object.freeze({ - "\u03f5": 0x1D395, // lunate epsilon - "\u03d1": 0x1D3BA, // vartheta - "\u03f0": 0x1D39C, // varkappa - "\u03c6": 0x1D3C7, // varphi - "\u03f1": 0x1D39D, // varrho - "\u03d6": 0x1D3B9 // varpi -}); - -const bisf = Object.freeze({ - "\u03f5": 0x1D3CF, // lunate epsilon - "\u03d1": 0x1D3F4, // vartheta - "\u03f0": 0x1D3D6, // varkappa - "\u03c6": 0x1D401, // varphi - "\u03f1": 0x1D3D7, // varrho - "\u03d6": 0x1D3F3 // varpi -}); - -// Code point offsets below are derived from https://www.unicode.org/charts/PDF/U1D400.pdf -const offset = Object.freeze({ - upperCaseLatin: { // A-Z - "normal": ch => { return 0 }, - "bold": ch => { return 0x1D3BF }, - "italic": ch => { return 0x1D3F3 }, - "bold-italic": ch => { return 0x1D427 }, - "script": ch => { return script[ch] || 0x1D45B }, - "script-bold": ch => { return 0x1D48F }, - "fraktur": ch => { return frak[ch] || 0x1D4C3 }, - "fraktur-bold": ch => { return 0x1D52B }, - "double-struck": ch => { return bbb[ch] || 0x1D4F7 }, - "sans-serif": ch => { return 0x1D55F }, - "sans-serif-bold": ch => { return 0x1D593 }, - "sans-serif-italic": ch => { return 0x1D5C7 }, - "sans-serif-bold-italic": ch => { return 0x1D63C }, - "monospace": ch => { return 0x1D62F } - }, - lowerCaseLatin: { // a-z - "normal": ch => { return 0 }, - "bold": ch => { return 0x1D3B9 }, - "italic": ch => { return ch === "h" ? 0x20A6 : 0x1D3ED }, - "bold-italic": ch => { return 0x1D421 }, - "script": ch => { return script[ch] || 0x1D455 }, - "script-bold": ch => { return 0x1D489 }, - "fraktur": ch => { return 0x1D4BD }, - "fraktur-bold": ch => { return 0x1D525 }, - "double-struck": ch => { return 0x1D4F1 }, - "sans-serif": ch => { return 0x1D559 }, - "sans-serif-bold": ch => { return 0x1D58D }, - "sans-serif-italic": ch => { return 0x1D5C1 }, - "sans-serif-bold-italic": ch => { return 0x1D5F5 }, - "monospace": ch => { return 0x1D629 } - }, - upperCaseGreek: { // A-Ω - "normal": ch => { return 0 }, - "bold": ch => { return 0x1D317 }, - "italic": ch => { return 0x1D351 }, - // \boldsymbol actually returns upright bold for upperCaseGreek - "bold-italic": ch => { return 0x1D317 }, - "script": ch => { return 0 }, - "script-bold": ch => { return 0 }, - "fraktur": ch => { return 0 }, - "fraktur-bold": ch => { return 0 }, - "double-struck": ch => { return 0 }, - // Unicode has no code points for regular-weight san-serif Greek. Use bold. - "sans-serif": ch => { return 0x1D3C5 }, - "sans-serif-bold": ch => { return 0x1D3C5 }, - "sans-serif-italic": ch => { return 0 }, - "sans-serif-bold-italic": ch => { return 0x1D3FF }, - "monospace": ch => { return 0 } - }, - lowerCaseGreek: { // α-ω - "normal": ch => { return 0 }, - "bold": ch => { return 0x1D311 }, - "italic": ch => { return 0x1D34B }, - "bold-italic": ch => { return ch === "\u03d5" ? 0x1D37E : 0x1D385 }, - "script": ch => { return 0 }, - "script-bold": ch => { return 0 }, - "fraktur": ch => { return 0 }, - "fraktur-bold": ch => { return 0 }, - "double-struck": ch => { return 0 }, - // Unicode has no code points for regular-weight san-serif Greek. Use bold. - "sans-serif": ch => { return 0x1D3BF }, - "sans-serif-bold": ch => { return 0x1D3BF }, - "sans-serif-italic": ch => { return 0 }, - "sans-serif-bold-italic": ch => { return 0x1D3F9 }, - "monospace": ch => { return 0 } - }, - varGreek: { // \varGamma, etc - "normal": ch => { return 0 }, - "bold": ch => { return bold[ch] || -51 }, - "italic": ch => { return 0 }, - "bold-italic": ch => { return boldItalic[ch] || 0x3A }, - "script": ch => { return 0 }, - "script-bold": ch => { return 0 }, - "fraktur": ch => { return 0 }, - "fraktur-bold": ch => { return 0 }, - "double-struck": ch => { return 0 }, - "sans-serif": ch => { return boldsf[ch] || 0x74 }, - "sans-serif-bold": ch => { return boldsf[ch] || 0x74 }, - "sans-serif-italic": ch => { return 0 }, - "sans-serif-bold-italic": ch => { return bisf[ch] || 0xAE }, - "monospace": ch => { return 0 } - }, - numeral: { // 0-9 - "normal": ch => { return 0 }, - "bold": ch => { return 0x1D79E }, - "italic": ch => { return 0 }, - "bold-italic": ch => { return 0 }, - "script": ch => { return 0 }, - "script-bold": ch => { return 0 }, - "fraktur": ch => { return 0 }, - "fraktur-bold": ch => { return 0 }, - "double-struck": ch => { return 0x1D7A8 }, - "sans-serif": ch => { return 0x1D7B2 }, - "sans-serif-bold": ch => { return 0x1D7BC }, - "sans-serif-italic": ch => { return 0 }, - "sans-serif-bold-italic": ch => { return 0 }, - "monospace": ch => { return 0x1D7C6 } - } -}); - -const variantChar = (ch, variant) => { - const codePoint = ch.codePointAt(0); - const block = 0x40 < codePoint && codePoint < 0x5b - ? "upperCaseLatin" - : 0x60 < codePoint && codePoint < 0x7b - ? "lowerCaseLatin" - : (0x390 < codePoint && codePoint < 0x3AA) - ? "upperCaseGreek" - : 0x3B0 < codePoint && codePoint < 0x3CA || ch === "\u03d5" - ? "lowerCaseGreek" - : 0x1D6E1 < codePoint && codePoint < 0x1D6FC || bold[ch] - ? "varGreek" - : (0x2F < codePoint && codePoint < 0x3A) - ? "numeral" - : "other"; - return block === "other" - ? ch - : String.fromCodePoint(codePoint + offset[block][variant](ch)) -}; - -const smallCaps = Object.freeze({ - a: "ᴀ", - b: "ʙ", - c: "ᴄ", - d: "ᴅ", - e: "ᴇ", - f: "ꜰ", - g: "ɢ", - h: "ʜ", - i: "ɪ", - j: "ᴊ", - k: "ᴋ", - l: "ʟ", - m: "ᴍ", - n: "ɴ", - o: "ᴏ", - p: "ᴘ", - q: "ǫ", - r: "ʀ", - s: "s", - t: "ᴛ", - u: "ᴜ", - v: "ᴠ", - w: "ᴡ", - x: "x", - y: "ʏ", - z: "ᴢ" -}); - -// "mathord" and "textord" ParseNodes created in Parser.js from symbol Groups in -// src/symbols.js. - -const numberRegEx = /^\d(?:[\d,.]*\d)?$/; -const latinRegEx = /[A-Ba-z]/; -const primes = new Set(["\\prime", "\\dprime", "\\trprime", "\\qprime", - "\\backprime", "\\backdprime", "\\backtrprime"]); - -const italicNumber = (text, variant, tag) => { - const mn = new mathMLTree.MathNode(tag, [text]); - const wrapper = new mathMLTree.MathNode("mstyle", [mn]); - wrapper.style["font-style"] = "italic"; - wrapper.style["font-family"] = "Cambria, 'Times New Roman', serif"; - if (variant === "bold-italic") { wrapper.style["font-weight"] = "bold"; } - return wrapper -}; - -defineFunctionBuilders({ - type: "mathord", - mathmlBuilder(group, style) { - const text = makeText(group.text, group.mode, style); - const codePoint = text.text.codePointAt(0); - // Test for upper-case Greek - const defaultVariant = (0x0390 < codePoint && codePoint < 0x03aa) ? "normal" : "italic"; - const variant = getVariant(group, style) || defaultVariant; - if (variant === "script") { - text.text = variantChar(text.text, variant); - return new mathMLTree.MathNode("mi", [text], [style.font]) - } else if (variant !== "italic") { - text.text = variantChar(text.text, variant); - } - let node = new mathMLTree.MathNode("mi", [text]); - // TODO: Handle U+1D49C - U+1D4CF per https://www.unicode.org/charts/PDF/U1D400.pdf - if (variant === "normal") { - node.setAttribute("mathvariant", "normal"); - if (text.text.length === 1) { - // A Firefox bug will apply spacing here, but there should be none. Fix it. - node = new mathMLTree.MathNode("mrow", [node]); - } - } - return node - } -}); - -defineFunctionBuilders({ - type: "textord", - mathmlBuilder(group, style) { - let ch = group.text; - const codePoint = ch.codePointAt(0); - if (style.fontFamily === "textsc") { - // Convert small latin letters to small caps. - if (96 < codePoint && codePoint < 123) { - ch = smallCaps[ch]; - } - } - const text = makeText(ch, group.mode, style); - const variant = getVariant(group, style) || "normal"; - - let node; - if (numberRegEx.test(group.text)) { - const tag = group.mode === "text" ? "mtext" : "mn"; - if (variant === "italic" || variant === "bold-italic") { - return italicNumber(text, variant, tag) - } else { - if (variant !== "normal") { - text.text = text.text.split("").map(c => variantChar(c, variant)).join(""); - } - node = new mathMLTree.MathNode(tag, [text]); - } - } else if (group.mode === "text") { - if (variant !== "normal") { - text.text = variantChar(text.text, variant); - } - node = new mathMLTree.MathNode("mtext", [text]); - } else if (primes.has(group.text)) { - node = new mathMLTree.MathNode("mo", [text]); - // TODO: If/when Chromium uses ssty variant for prime, remove the next line. - node.classes.push("tml-prime"); - } else { - const origText = text.text; - if (variant !== "italic") { - text.text = variantChar(text.text, variant); - } - node = new mathMLTree.MathNode("mi", [text]); - if (text.text === origText && latinRegEx.test(origText)) { - node.setAttribute("mathvariant", "italic"); - } - } - return node - } -}); - -// A map of CSS-based spacing functions to their CSS class. -const cssSpace = { - "\\nobreak": "nobreak", - "\\allowbreak": "allowbreak" -}; - -// A lookup table to determine whether a spacing function/symbol should be -// treated like a regular space character. If a symbol or command is a key -// in this table, then it should be a regular space character. Furthermore, -// the associated value may have a `className` specifying an extra CSS class -// to add to the created `span`. -const regularSpace = { - " ": {}, - "\\ ": {}, - "~": { - className: "nobreak" - }, - "\\space": {}, - "\\nobreakspace": { - className: "nobreak" - } -}; - -// ParseNode<"spacing"> created in Parser.js from the "spacing" symbol Groups in -// src/symbols.js. -defineFunctionBuilders({ - type: "spacing", - mathmlBuilder(group, style) { - let node; - - if (Object.prototype.hasOwnProperty.call(regularSpace, group.text)) { - // Firefox does not render a space in a . So write a no-break space. - // TODO: If Firefox fixes that bug, uncomment the next line and write ch into the node. - //const ch = (regularSpace[group.text].className === "nobreak") ? "\u00a0" : " " - node = new mathMLTree.MathNode("mtext", [new mathMLTree.TextNode("\u00a0")]); - } else if (Object.prototype.hasOwnProperty.call(cssSpace, group.text)) { - // MathML 3.0 calls for nobreak to occur in an , not an - // Ref: https://www.w3.org/Math/draft-spec/mathml.html#chapter3_presm.lbattrs - node = new mathMLTree.MathNode("mo"); - if (group.text === "\\nobreak") { - node.setAttribute("linebreak", "nobreak"); - } - } else { - throw new ParseError(`Unknown type of space "${group.text}"`) - } - - return node - } -}); - -defineFunctionBuilders({ - type: "tag" -}); - -// For a \tag, the work usually done in a mathmlBuilder is instead done in buildMathML.js. -// That way, a \tag can be pulled out of the parse tree and wrapped around the outer node. - -// Non-mathy text, possibly in a font -const textFontFamilies = { - "\\text": undefined, - "\\textrm": "textrm", - "\\textsf": "textsf", - "\\texttt": "texttt", - "\\textnormal": "textrm", - "\\textsc": "textsc" // small caps -}; - -const textFontWeights = { - "\\textbf": "textbf", - "\\textmd": "textmd" -}; - -const textFontShapes = { - "\\textit": "textit", - "\\textup": "textup" -}; - -const styleWithFont = (group, style) => { - const font = group.font; - // Checks if the argument is a font family or a font style. - if (!font) { - return style; - } else if (textFontFamilies[font]) { - return style.withTextFontFamily(textFontFamilies[font]); - } else if (textFontWeights[font]) { - return style.withTextFontWeight(textFontWeights[font]); - } else { - return style.withTextFontShape(textFontShapes[font]); - } -}; - -defineFunction({ - type: "text", - names: [ - // Font families - "\\text", - "\\textrm", - "\\textsf", - "\\texttt", - "\\textnormal", - "\\textsc", - // Font weights - "\\textbf", - "\\textmd", - // Font Shapes - "\\textit", - "\\textup" - ], - props: { - numArgs: 1, - argTypes: ["text"], - allowedInArgument: true, - allowedInText: true - }, - handler({ parser, funcName }, args) { - const body = args[0]; - return { - type: "text", - mode: parser.mode, - body: ordargument(body), - font: funcName - }; - }, - mathmlBuilder(group, style) { - const newStyle = styleWithFont(group, style); - const mrow = buildExpressionRow(group.body, newStyle); - return consolidateText(mrow) - } -}); - -defineFunction({ - type: "verb", - names: ["\\verb"], - props: { - numArgs: 0, - allowedInText: true - }, - handler(context, args, optArgs) { - // \verb and \verb* are dealt with directly in Parser.js. - // If we end up here, it's because of a failure to match the two delimiters - // in the regex in Lexer.js. LaTeX raises the following error when \verb is - // terminated by end of line (or file). - throw new ParseError("\\verb ended by end of line instead of matching delimiter"); - }, - mathmlBuilder(group, style) { - const text = new mathMLTree.TextNode(makeVerb(group)); - const node = new mathMLTree.MathNode("mtext", [text]); - node.setAttribute("mathvariant", "monospace"); - return node; - } -}); - -/** - * Converts verb group into body string. - * - * \verb* replaces each space with an open box \u2423 - * \verb replaces each space with a no-break space \xA0 - */ -const makeVerb = (group) => group.body.replace(/ /g, group.star ? "\u2423" : "\xA0"); - -/** Include this to ensure that all functions are defined. */ - -const functions = _functions; - -/** - * Lexing or parsing positional information for error reporting. - * This object is immutable. - */ -class SourceLocation { - constructor(lexer, start, end) { - this.lexer = lexer; // Lexer holding the input string. - this.start = start; // Start offset, zero-based inclusive. - this.end = end; // End offset, zero-based exclusive. - } - - /** - * Merges two `SourceLocation`s from location providers, given they are - * provided in order of appearance. - * - Returns the first one's location if only the first is provided. - * - Returns a merged range of the first and the last if both are provided - * and their lexers match. - * - Otherwise, returns null. - */ - static range(first, second) { - if (!second) { - return first && first.loc; - } else if (!first || !first.loc || !second.loc || first.loc.lexer !== second.loc.lexer) { - return null; - } else { - return new SourceLocation(first.loc.lexer, first.loc.start, second.loc.end); - } - } -} - -/** - * Interface required to break circular dependency between Token, Lexer, and - * ParseError. - */ - -/** - * The resulting token returned from `lex`. - * - * It consists of the token text plus some position information. - * The position information is essentially a range in an input string, - * but instead of referencing the bare input string, we refer to the lexer. - * That way it is possible to attach extra metadata to the input string, - * like for example a file name or similar. - * - * The position information is optional, so it is OK to construct synthetic - * tokens if appropriate. Not providing available position information may - * lead to degraded error reporting, though. - */ -class Token { - constructor( - text, // the text of this token - loc - ) { - this.text = text; - this.loc = loc; - } - - /** - * Given a pair of tokens (this and endToken), compute a `Token` encompassing - * the whole input range enclosed by these two. - */ - range( - endToken, // last token of the range, inclusive - text // the text of the newly constructed token - ) { - return new Token(text, SourceLocation.range(this, endToken)); - } -} - -/** - * The Lexer class handles tokenizing the input in various ways. Since our - * parser expects us to be able to backtrack, the lexer allows lexing from any - * given starting point. - * - * Its main exposed function is the `lex` function, which takes a position to - * lex from and a type of token to lex. It defers to the appropriate `_innerLex` - * function. - * - * The various `_innerLex` functions perform the actual lexing of different - * kinds. - */ - -/* The following tokenRegex - * - matches typical whitespace (but not NBSP etc.) using its first two groups - * - does not match any control character \x00-\x1f except whitespace - * - does not match a bare backslash - * - matches any ASCII character except those just mentioned - * - does not match the BMP private use area \uE000-\uF8FF - * - does not match bare surrogate code units - * - matches any BMP character except for those just described - * - matches any valid Unicode surrogate pair - * - mathches numerals - * - matches a backslash followed by one or more whitespace characters - * - matches a backslash followed by one or more letters then whitespace - * - matches a backslash followed by any BMP character - * Capturing groups: - * [1] regular whitespace - * [2] backslash followed by whitespace - * [3] anything else, which may include: - * [4] left character of \verb* - * [5] left character of \verb - * [6] backslash followed by word, excluding any trailing whitespace - * Just because the Lexer matches something doesn't mean it's valid input: - * If there is no matching function or symbol definition, the Parser will - * still reject the input. - */ -const spaceRegexString = "[ \r\n\t]"; -const controlWordRegexString = "\\\\[a-zA-Z@]+"; -const controlSymbolRegexString = "\\\\[^\uD800-\uDFFF]"; -const controlWordWhitespaceRegexString = `(${controlWordRegexString})${spaceRegexString}*`; -const controlSpaceRegexString = "\\\\(\n|[ \r\t]+\n?)[ \r\t]*"; -const combiningDiacriticalMarkString = "[\u0300-\u036f]"; -const combiningDiacriticalMarksEndRegex = new RegExp(`${combiningDiacriticalMarkString}+$`); -const tokenRegexString = - `(${spaceRegexString}+)|` + // whitespace - `${controlSpaceRegexString}|` + // whitespace - "([!-\\[\\]-\u2027\u202A-\uD7FF\uF900-\uFFFF]" + // single codepoint - `${combiningDiacriticalMarkString}*` + // ...plus accents - "|[\uD800-\uDBFF][\uDC00-\uDFFF]" + // surrogate pair - `${combiningDiacriticalMarkString}*` + // ...plus accents - "|\\\\verb\\*([^]).*?\\4" + // \verb* - "|\\\\verb([^*a-zA-Z]).*?\\5" + // \verb unstarred - `|${controlWordWhitespaceRegexString}` + // \macroName + spaces - `|${controlSymbolRegexString})`; // \\, \', etc. - -/** Main Lexer class */ -class Lexer { - constructor(input, settings) { - // Separate accents from characters - this.input = input; - this.settings = settings; - this.tokenRegex = new RegExp(tokenRegexString, 'g'); - // Category codes. The lexer only supports comment characters (14) for now. - // MacroExpander additionally distinguishes active (13). - this.catcodes = { - "%": 14, // comment character - "~": 13 // active character - }; - } - - setCatcode(char, code) { - this.catcodes[char] = code; - } - - /** - * This function lexes a single token. - */ - lex() { - const input = this.input; - const pos = this.tokenRegex.lastIndex; - if (pos === input.length) { - return new Token("EOF", new SourceLocation(this, pos, pos)); - } - const match = this.tokenRegex.exec(input); - if (match === null || match.index !== pos) { - throw new ParseError( - `Unexpected character: '${input[pos]}'`, - new Token(input[pos], new SourceLocation(this, pos, pos + 1)) - ); - } - const text = match[6] || match[3] || (match[2] ? "\\ " : " "); - - if (this.catcodes[text] === 14) { - // comment character - const nlIndex = input.indexOf("\n", this.tokenRegex.lastIndex); - if (nlIndex === -1) { - this.tokenRegex.lastIndex = input.length; // EOF - if (this.settings.strict) { - throw new ParseError("% comment has no terminating newline; LaTeX would " + - "fail because of commenting the end of math mode") - } - } else { - this.tokenRegex.lastIndex = nlIndex + 1; - } - return this.lex(); - } - - return new Token(text, new SourceLocation(this, pos, this.tokenRegex.lastIndex)); - } -} - -/** - * A `Namespace` refers to a space of nameable things like macros or lengths, - * which can be `set` either globally or local to a nested group, using an - * undo stack similar to how TeX implements this functionality. - * Performance-wise, `get` and local `set` take constant time, while global - * `set` takes time proportional to the depth of group nesting. - */ - -class Namespace { - /** - * Both arguments are optional. The first argument is an object of - * built-in mappings which never change. The second argument is an object - * of initial (global-level) mappings, which will constantly change - * according to any global/top-level `set`s done. - */ - constructor(builtins = {}, globalMacros = {}) { - this.current = globalMacros; - this.builtins = builtins; - this.undefStack = []; - } - - /** - * Start a new nested group, affecting future local `set`s. - */ - beginGroup() { - this.undefStack.push({}); - } - - /** - * End current nested group, restoring values before the group began. - */ - endGroup() { - if (this.undefStack.length === 0) { - throw new ParseError( - "Unbalanced namespace destruction: attempt " + - "to pop global namespace; please report this as a bug" - ); - } - const undefs = this.undefStack.pop(); - for (const undef in undefs) { - if (Object.prototype.hasOwnProperty.call(undefs, undef )) { - if (undefs[undef] === undefined) { - delete this.current[undef]; - } else { - this.current[undef] = undefs[undef]; - } - } - } - } - - /** - * Detect whether `name` has a definition. Equivalent to - * `get(name) != null`. - */ - has(name) { - return Object.prototype.hasOwnProperty.call(this.current, name ) || - Object.prototype.hasOwnProperty.call(this.builtins, name ); - } - - /** - * Get the current value of a name, or `undefined` if there is no value. - * - * Note: Do not use `if (namespace.get(...))` to detect whether a macro - * is defined, as the definition may be the empty string which evaluates - * to `false` in JavaScript. Use `if (namespace.get(...) != null)` or - * `if (namespace.has(...))`. - */ - get(name) { - if (Object.prototype.hasOwnProperty.call(this.current, name )) { - return this.current[name]; - } else { - return this.builtins[name]; - } - } - - /** - * Set the current value of a name, and optionally set it globally too. - * Local set() sets the current value and (when appropriate) adds an undo - * operation to the undo stack. Global set() may change the undo - * operation at every level, so takes time linear in their number. - */ - set(name, value, global = false) { - if (global) { - // Global set is equivalent to setting in all groups. Simulate this - // by destroying any undos currently scheduled for this name, - // and adding an undo with the *new* value (in case it later gets - // locally reset within this environment). - for (let i = 0; i < this.undefStack.length; i++) { - delete this.undefStack[i][name]; - } - if (this.undefStack.length > 0) { - this.undefStack[this.undefStack.length - 1][name] = value; - } - } else { - // Undo this set at end of this group (possibly to `undefined`), - // unless an undo is already in place, in which case that older - // value is the correct one. - const top = this.undefStack[this.undefStack.length - 1]; - if (top && !Object.prototype.hasOwnProperty.call(top, name )) { - top[name] = this.current[name]; - } - } - this.current[name] = value; - } -} - -/** - * Predefined macros for Temml. - * This can be used to define some commands in terms of others. - */ -const macros = _macros; - -////////////////////////////////////////////////////////////////////// -// macro tools - -defineMacro("\\noexpand", function(context) { - // The expansion is the token itself; but that token is interpreted - // as if its meaning were ‘\relax’ if it is a control sequence that - // would ordinarily be expanded by TeX’s expansion rules. - const t = context.popToken(); - if (context.isExpandable(t.text)) { - t.noexpand = true; - t.treatAsRelax = true; - } - return { tokens: [t], numArgs: 0 }; -}); - -defineMacro("\\expandafter", function(context) { - // TeX first reads the token that comes immediately after \expandafter, - // without expanding it; let’s call this token t. Then TeX reads the - // token that comes after t (and possibly more tokens, if that token - // has an argument), replacing it by its expansion. Finally TeX puts - // t back in front of that expansion. - const t = context.popToken(); - context.expandOnce(true); // expand only an expandable token - return { tokens: [t], numArgs: 0 }; -}); - -// LaTeX's \@firstoftwo{#1}{#2} expands to #1, skipping #2 -// TeX source: \long\def\@firstoftwo#1#2{#1} -defineMacro("\\@firstoftwo", function(context) { - const args = context.consumeArgs(2); - return { tokens: args[0], numArgs: 0 }; -}); - -// LaTeX's \@secondoftwo{#1}{#2} expands to #2, skipping #1 -// TeX source: \long\def\@secondoftwo#1#2{#2} -defineMacro("\\@secondoftwo", function(context) { - const args = context.consumeArgs(2); - return { tokens: args[1], numArgs: 0 }; -}); - -// LaTeX's \@ifnextchar{#1}{#2}{#3} looks ahead to the next (unexpanded) -// symbol that isn't a space, consuming any spaces but not consuming the -// first nonspace character. If that nonspace character matches #1, then -// the macro expands to #2; otherwise, it expands to #3. -defineMacro("\\@ifnextchar", function(context) { - const args = context.consumeArgs(3); // symbol, if, else - context.consumeSpaces(); - const nextToken = context.future(); - if (args[0].length === 1 && args[0][0].text === nextToken.text) { - return { tokens: args[1], numArgs: 0 }; - } else { - return { tokens: args[2], numArgs: 0 }; - } -}); - -// LaTeX's \@ifstar{#1}{#2} looks ahead to the next (unexpanded) symbol. -// If it is `*`, then it consumes the symbol, and the macro expands to #1; -// otherwise, the macro expands to #2 (without consuming the symbol). -// TeX source: \def\@ifstar#1{\@ifnextchar *{\@firstoftwo{#1}}} -defineMacro("\\@ifstar", "\\@ifnextchar *{\\@firstoftwo{#1}}"); - -// LaTeX's \TextOrMath{#1}{#2} expands to #1 in text mode, #2 in math mode -defineMacro("\\TextOrMath", function(context) { - const args = context.consumeArgs(2); - if (context.mode === "text") { - return { tokens: args[0], numArgs: 0 }; - } else { - return { tokens: args[1], numArgs: 0 }; - } -}); - -const stringFromArg = arg => { - // Reverse the order of the arg and return a string. - let str = ""; - for (let i = arg.length - 1; i > -1; i--) { - str += arg[i].text; - } - return str -}; - -// Lookup table for parsing numbers in base 8 through 16 -const digitToNumber = { - 0: 0, - 1: 1, - 2: 2, - 3: 3, - 4: 4, - 5: 5, - 6: 6, - 7: 7, - 8: 8, - 9: 9, - a: 10, - A: 10, - b: 11, - B: 11, - c: 12, - C: 12, - d: 13, - D: 13, - e: 14, - E: 14, - f: 15, - F: 15 -}; - -const nextCharNumber = context => { - const numStr = context.future().text; - if (numStr === "EOF") { return [null, ""] } - return [digitToNumber[numStr.charAt(0)], numStr] -}; - -const appendCharNumbers = (number, numStr, base) => { - for (let i = 1; i < numStr.length; i++) { - const digit = digitToNumber[numStr.charAt(i)]; - number *= base; - number += digit; - } - return number -}; - -// TeX \char makes a literal character (catcode 12) using the following forms: -// (see The TeXBook, p. 43) -// \char123 -- decimal -// \char'123 -- octal -// \char"123 -- hex -// \char`x -- character that can be written (i.e. isn't active) -// \char`\x -- character that cannot be written (e.g. %) -// These all refer to characters from the font, so we turn them into special -// calls to a function \@char dealt with in the Parser. -defineMacro("\\char", function(context) { - let token = context.popToken(); - let base; - let number = ""; - if (token.text === "'") { - base = 8; - token = context.popToken(); - } else if (token.text === '"') { - base = 16; - token = context.popToken(); - } else if (token.text === "`") { - token = context.popToken(); - if (token.text[0] === "\\") { - number = token.text.charCodeAt(1); - } else if (token.text === "EOF") { - throw new ParseError("\\char` missing argument"); - } else { - number = token.text.charCodeAt(0); - } - } else { - base = 10; - } - if (base) { - // Parse a number in the given base, starting with first `token`. - let numStr = token.text; - number = digitToNumber[numStr.charAt(0)]; - if (number == null || number >= base) { - throw new ParseError(`Invalid base-${base} digit ${token.text}`); - } - number = appendCharNumbers(number, numStr, base); - let digit; - [digit, numStr] = nextCharNumber(context); - while (digit != null && digit < base) { - number *= base; - number += digit; - number = appendCharNumbers(number, numStr, base); - context.popToken(); - [digit, numStr] = nextCharNumber(context); - } - } - return `\\@char{${number}}`; -}); - -function recreateArgStr(context) { - // Recreate the macro's original argument string from the array of parse tokens. - const tokens = context.consumeArgs(1)[0]; - let str = ""; - let expectedLoc = tokens[tokens.length - 1].loc.start; - for (let i = tokens.length - 1; i >= 0; i--) { - const actualLoc = tokens[i].loc.start; - if (actualLoc > expectedLoc) { - // context.consumeArgs has eaten a space. - str += " "; - expectedLoc = actualLoc; - } - str += tokens[i].text; - expectedLoc += tokens[i].text.length; - } - return str -} - -// The Latin Modern font renders at the wrong vertical alignment. -// This macro provides a better rendering. -defineMacro("\\surd", '\\sqrt{\\vphantom{|}}'); - -// See comment for \oplus in symbols.js. -defineMacro("\u2295", "\\oplus"); - -// Since Temml has no \par, ignore \long. -defineMacro("\\long", ""); - -////////////////////////////////////////////////////////////////////// -// Grouping -// \let\bgroup={ \let\egroup=} -defineMacro("\\bgroup", "{"); -defineMacro("\\egroup", "}"); - -// Symbols from latex.ltx: -// \def~{\nobreakspace{}} -// \def\lq{`} -// \def\rq{'} -// \def \aa {\r a} -defineMacro("~", "\\nobreakspace"); -defineMacro("\\lq", "`"); -defineMacro("\\rq", "'"); -defineMacro("\\aa", "\\r a"); - -defineMacro("\\Bbbk", "\\Bbb{k}"); - -// \mathstrut from the TeXbook, p 360 -defineMacro("\\mathstrut", "\\vphantom{(}"); - -// \underbar from TeXbook p 353 -defineMacro("\\underbar", "\\underline{\\text{#1}}"); - -////////////////////////////////////////////////////////////////////// -// LaTeX_2ε - -// \vdots{\vbox{\baselineskip4\p@ \lineskiplimit\z@ -// \kern6\p@\hbox{.}\hbox{.}\hbox{.}}} -// We'll call \varvdots, which gets a glyph from symbols.js. -// The zero-width rule gets us an equivalent to the vertical 6pt kern. -defineMacro("\\vdots", "{\\varvdots\\rule{0pt}{15pt}}"); -defineMacro("\u22ee", "\\vdots"); - -////////////////////////////////////////////////////////////////////// -// amsmath.sty -// http://mirrors.concertpass.com/tex-archive/macros/latex/required/amsmath/amsmath.pdf - -//\newcommand{\substack}[1]{\subarray{c}#1\endsubarray} -defineMacro("\\substack", "\\begin{subarray}{c}#1\\end{subarray}"); - -// \def\iff{\DOTSB\;\Longleftrightarrow\;} -// \def\implies{\DOTSB\;\Longrightarrow\;} -// \def\impliedby{\DOTSB\;\Longleftarrow\;} -defineMacro("\\iff", "\\DOTSB\\;\\Longleftrightarrow\\;"); -defineMacro("\\implies", "\\DOTSB\\;\\Longrightarrow\\;"); -defineMacro("\\impliedby", "\\DOTSB\\;\\Longleftarrow\\;"); - -// AMSMath's automatic \dots, based on \mdots@@ macro. -const dotsByToken = { - ",": "\\dotsc", - "\\not": "\\dotsb", - // \keybin@ checks for the following: - "+": "\\dotsb", - "=": "\\dotsb", - "<": "\\dotsb", - ">": "\\dotsb", - "-": "\\dotsb", - "*": "\\dotsb", - ":": "\\dotsb", - // Symbols whose definition starts with \DOTSB: - "\\DOTSB": "\\dotsb", - "\\coprod": "\\dotsb", - "\\bigvee": "\\dotsb", - "\\bigwedge": "\\dotsb", - "\\biguplus": "\\dotsb", - "\\bigcap": "\\dotsb", - "\\bigcup": "\\dotsb", - "\\prod": "\\dotsb", - "\\sum": "\\dotsb", - "\\bigotimes": "\\dotsb", - "\\bigoplus": "\\dotsb", - "\\bigodot": "\\dotsb", - "\\bigsqcap": "\\dotsb", - "\\bigsqcup": "\\dotsb", - "\\bigtimes": "\\dotsb", - "\\And": "\\dotsb", - "\\longrightarrow": "\\dotsb", - "\\Longrightarrow": "\\dotsb", - "\\longleftarrow": "\\dotsb", - "\\Longleftarrow": "\\dotsb", - "\\longleftrightarrow": "\\dotsb", - "\\Longleftrightarrow": "\\dotsb", - "\\mapsto": "\\dotsb", - "\\longmapsto": "\\dotsb", - "\\hookrightarrow": "\\dotsb", - "\\doteq": "\\dotsb", - // Symbols whose definition starts with \mathbin: - "\\mathbin": "\\dotsb", - // Symbols whose definition starts with \mathrel: - "\\mathrel": "\\dotsb", - "\\relbar": "\\dotsb", - "\\Relbar": "\\dotsb", - "\\xrightarrow": "\\dotsb", - "\\xleftarrow": "\\dotsb", - // Symbols whose definition starts with \DOTSI: - "\\DOTSI": "\\dotsi", - "\\int": "\\dotsi", - "\\oint": "\\dotsi", - "\\iint": "\\dotsi", - "\\iiint": "\\dotsi", - "\\iiiint": "\\dotsi", - "\\idotsint": "\\dotsi", - // Symbols whose definition starts with \DOTSX: - "\\DOTSX": "\\dotsx" -}; - -defineMacro("\\dots", function(context) { - // TODO: If used in text mode, should expand to \textellipsis. - // However, in Temml, \textellipsis and \ldots behave the same - // (in text mode), and it's unlikely we'd see any of the math commands - // that affect the behavior of \dots when in text mode. So fine for now - // (until we support \ifmmode ... \else ... \fi). - let thedots = "\\dotso"; - const next = context.expandAfterFuture().text; - if (next in dotsByToken) { - thedots = dotsByToken[next]; - } else if (next.slice(0, 4) === "\\not") { - thedots = "\\dotsb"; - } else if (next in symbols.math) { - if (["bin", "rel"].includes(symbols.math[next].group)) { - thedots = "\\dotsb"; - } - } - return thedots; -}); - -const spaceAfterDots = { - // \rightdelim@ checks for the following: - ")": true, - "]": true, - "\\rbrack": true, - "\\}": true, - "\\rbrace": true, - "\\rangle": true, - "\\rceil": true, - "\\rfloor": true, - "\\rgroup": true, - "\\rmoustache": true, - "\\right": true, - "\\bigr": true, - "\\biggr": true, - "\\Bigr": true, - "\\Biggr": true, - // \extra@ also tests for the following: - $: true, - // \extrap@ checks for the following: - ";": true, - ".": true, - ",": true -}; - -defineMacro("\\dotso", function(context) { - const next = context.future().text; - if (next in spaceAfterDots) { - return "\\ldots\\,"; - } else { - return "\\ldots"; - } -}); - -defineMacro("\\dotsc", function(context) { - const next = context.future().text; - // \dotsc uses \extra@ but not \extrap@, instead specially checking for - // ';' and '.', but doesn't check for ','. - if (next in spaceAfterDots && next !== ",") { - return "\\ldots\\,"; - } else { - return "\\ldots"; - } -}); - -defineMacro("\\cdots", function(context) { - const next = context.future().text; - if (next in spaceAfterDots) { - return "\\@cdots\\,"; - } else { - return "\\@cdots"; - } -}); - -defineMacro("\\dotsb", "\\cdots"); -defineMacro("\\dotsm", "\\cdots"); -defineMacro("\\dotsi", "\\!\\cdots"); -defineMacro("\\idotsint", "\\dotsi"); -// amsmath doesn't actually define \dotsx, but \dots followed by a macro -// starting with \DOTSX implies \dotso, and then \extra@ detects this case -// and forces the added `\,`. -defineMacro("\\dotsx", "\\ldots\\,"); - -// \let\DOTSI\relax -// \let\DOTSB\relax -// \let\DOTSX\relax -defineMacro("\\DOTSI", "\\relax"); -defineMacro("\\DOTSB", "\\relax"); -defineMacro("\\DOTSX", "\\relax"); - -// Spacing, based on amsmath.sty's override of LaTeX defaults -// \DeclareRobustCommand{\tmspace}[3]{% -// \ifmmode\mskip#1#2\else\kern#1#3\fi\relax} -defineMacro("\\tmspace", "\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax"); -// \renewcommand{\,}{\tmspace+\thinmuskip{.1667em}} -// TODO: math mode should use \thinmuskip -defineMacro("\\,", "{\\tmspace+{3mu}{.1667em}}"); -// \let\thinspace\, -defineMacro("\\thinspace", "\\,"); -// \def\>{\mskip\medmuskip} -// \renewcommand{\:}{\tmspace+\medmuskip{.2222em}} -// TODO: \> and math mode of \: should use \medmuskip = 4mu plus 2mu minus 4mu -defineMacro("\\>", "\\mskip{4mu}"); -defineMacro("\\:", "{\\tmspace+{4mu}{.2222em}}"); -// \let\medspace\: -defineMacro("\\medspace", "\\:"); -// \renewcommand{\;}{\tmspace+\thickmuskip{.2777em}} -// TODO: math mode should use \thickmuskip = 5mu plus 5mu -defineMacro("\\;", "{\\tmspace+{5mu}{.2777em}}"); -// \let\thickspace\; -defineMacro("\\thickspace", "\\;"); -// \renewcommand{\!}{\tmspace-\thinmuskip{.1667em}} -// TODO: math mode should use \thinmuskip -defineMacro("\\!", "{\\tmspace-{3mu}{.1667em}}"); -// \let\negthinspace\! -defineMacro("\\negthinspace", "\\!"); -// \newcommand{\negmedspace}{\tmspace-\medmuskip{.2222em}} -// TODO: math mode should use \medmuskip -defineMacro("\\negmedspace", "{\\tmspace-{4mu}{.2222em}}"); -// \newcommand{\negthickspace}{\tmspace-\thickmuskip{.2777em}} -// TODO: math mode should use \thickmuskip -defineMacro("\\negthickspace", "{\\tmspace-{5mu}{.277em}}"); -// \def\enspace{\kern.5em } -defineMacro("\\enspace", "\\kern.5em "); -// \def\enskip{\hskip.5em\relax} -defineMacro("\\enskip", "\\hskip.5em\\relax"); -// \def\quad{\hskip1em\relax} -defineMacro("\\quad", "\\hskip1em\\relax"); -// \def\qquad{\hskip2em\relax} -defineMacro("\\qquad", "\\hskip2em\\relax"); - -defineMacro("\\AA", "\\TextOrMath{\\Angstrom}{\\mathring{A}}\\relax"); - -// \tag@in@display form of \tag -defineMacro("\\tag", "\\@ifstar\\tag@literal\\tag@paren"); -defineMacro("\\tag@paren", "\\tag@literal{({#1})}"); -defineMacro("\\tag@literal", (context) => { - if (context.macros.get("\\df@tag")) { - throw new ParseError("Multiple \\tag"); - } - return "\\def\\df@tag{\\text{#1}}"; -}); - -// \renewcommand{\bmod}{\nonscript\mskip-\medmuskip\mkern5mu\mathbin -// {\operator@font mod}\penalty900 -// \mkern5mu\nonscript\mskip-\medmuskip} -// \newcommand{\pod}[1]{\allowbreak -// \if@display\mkern18mu\else\mkern8mu\fi(#1)} -// \renewcommand{\pmod}[1]{\pod{{\operator@font mod}\mkern6mu#1}} -// \newcommand{\mod}[1]{\allowbreak\if@display\mkern18mu -// \else\mkern12mu\fi{\operator@font mod}\,\,#1} -// TODO: math mode should use \medmuskip = 4mu plus 2mu minus 4mu -defineMacro("\\bmod", "\\mathbin{\\text{mod}}"); -defineMacro( - "\\pod", - "\\allowbreak" + "\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)" -); -defineMacro("\\pmod", "\\pod{{\\rm mod}\\mkern6mu#1}"); -defineMacro( - "\\mod", - "\\allowbreak" + - "\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}" + - "{\\rm mod}\\,\\,#1" -); - -////////////////////////////////////////////////////////////////////// -// LaTeX source2e - -// \expandafter\let\expandafter\@normalcr -// \csname\expandafter\@gobble\string\\ \endcsname -// \DeclareRobustCommand\newline{\@normalcr\relax} -defineMacro("\\newline", "\\\\\\relax"); - -// \def\TeX{T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX\@} -// TODO: Doesn't normally work in math mode because \@ fails. -defineMacro("\\TeX", "\\textrm{T}\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125em\\textrm{X}"); - -defineMacro( - "\\LaTeX", - "\\textrm{L}\\kern-.35em\\raisebox{0.2em}{\\scriptstyle A}\\kern-.15em\\TeX" -); - -defineMacro( - "\\Temml", - // eslint-disable-next-line max-len - "\\textrm{T}\\kern-0.2em\\lower{0.2em}{\\textrm{E}}\\kern-0.08em{\\textrm{M}\\kern-0.08em\\raise{0.2em}\\textrm{M}\\kern-0.08em\\textrm{L}}" -); - -// \DeclareRobustCommand\hspace{\@ifstar\@hspacer\@hspace} -// \def\@hspace#1{\hskip #1\relax} -// \def\@hspacer#1{\vrule \@width\z@\nobreak -// \hskip #1\hskip \z@skip} -defineMacro("\\hspace", "\\@ifstar\\@hspacer\\@hspace"); -defineMacro("\\@hspace", "\\hskip #1\\relax"); -defineMacro("\\@hspacer", "\\rule{0pt}{0pt}\\hskip #1\\relax"); - -defineMacro("\\colon", `\\mathpunct{\\char"3a}`); - -////////////////////////////////////////////////////////////////////// -// mathtools.sty - -defineMacro("\\prescript", "\\pres@cript{_{#1}^{#2}}{}{#3}"); - -//\providecommand\ordinarycolon{:} -defineMacro("\\ordinarycolon", `\\char"3a`); -// Raise to center on the math axis, as closely as possible. -defineMacro("\\vcentcolon", "\\mathrel{\\raisebox{0.035em}{\\ordinarycolon}}"); -// \providecommand*\coloneq{\vcentcolon\mathrel{\mkern-1.2mu}\mathrel{-}} -defineMacro("\\coloneq", '\\mathrel{\\raisebox{0.035em}{\\ordinarycolon}\\char"2212}'); -// \providecommand*\Coloneq{\dblcolon\mathrel{\mkern-1.2mu}\mathrel{-}} -defineMacro("\\Coloneq", '\\mathrel{\\char"2237\\char"2212}'); -// \providecommand*\Eqqcolon{=\mathrel{\mkern-1.2mu}\dblcolon} -defineMacro("\\Eqqcolon", '\\mathrel{\\char"3d\\char"2237}'); -// \providecommand*\Eqcolon{\mathrel{-}\mathrel{\mkern-1.2mu}\dblcolon} -defineMacro("\\Eqcolon", '\\mathrel{\\char"2212\\char"2237}'); -// \providecommand*\colonapprox{\vcentcolon\mathrel{\mkern-1.2mu}\approx} -defineMacro("\\colonapprox", '\\mathrel{\\raisebox{0.035em}{\\ordinarycolon}\\char"2248}'); -// \providecommand*\Colonapprox{\dblcolon\mathrel{\mkern-1.2mu}\approx} -defineMacro("\\Colonapprox", '\\mathrel{\\char"2237\\char"2248}'); -// \providecommand*\colonsim{\vcentcolon\mathrel{\mkern-1.2mu}\sim} -defineMacro("\\colonsim", '\\mathrel{\\raisebox{0.035em}{\\ordinarycolon}\\char"223c}'); -// \providecommand*\Colonsim{\dblcolon\mathrel{\mkern-1.2mu}\sim} -defineMacro("\\Colonsim", '\\mathrel{\\raisebox{0.035em}{\\ordinarycolon}\\char"223c}'); - -////////////////////////////////////////////////////////////////////// -// colonequals.sty - -// Alternate names for mathtools's macros: -defineMacro("\\ratio", "\\vcentcolon"); -defineMacro("\\coloncolon", "\\dblcolon"); -defineMacro("\\colonequals", "\\coloneqq"); -defineMacro("\\coloncolonequals", "\\Coloneqq"); -defineMacro("\\equalscolon", "\\eqqcolon"); -defineMacro("\\equalscoloncolon", "\\Eqqcolon"); -defineMacro("\\colonminus", "\\coloneq"); -defineMacro("\\coloncolonminus", "\\Coloneq"); -defineMacro("\\minuscolon", "\\eqcolon"); -defineMacro("\\minuscoloncolon", "\\Eqcolon"); -// \colonapprox name is same in mathtools and colonequals. -defineMacro("\\coloncolonapprox", "\\Colonapprox"); -// \colonsim name is same in mathtools and colonequals. -defineMacro("\\coloncolonsim", "\\Colonsim"); - -// Present in newtxmath, pxfonts and txfonts -defineMacro("\\notni", "\\mathrel{\\char`\u220C}"); -defineMacro("\\limsup", "\\DOTSB\\operatorname*{lim\\,sup}"); -defineMacro("\\liminf", "\\DOTSB\\operatorname*{lim\\,inf}"); - -////////////////////////////////////////////////////////////////////// -// From amsopn.sty -defineMacro("\\injlim", "\\DOTSB\\operatorname*{inj\\,lim}"); -defineMacro("\\projlim", "\\DOTSB\\operatorname*{proj\\,lim}"); -defineMacro("\\varlimsup", "\\DOTSB\\operatorname*{\\overline{\\text{lim}}}"); -defineMacro("\\varliminf", "\\DOTSB\\operatorname*{\\underline{\\text{lim}}}"); -defineMacro("\\varinjlim", "\\DOTSB\\operatorname*{\\underrightarrow{\\text{lim}}}"); -defineMacro("\\varprojlim", "\\DOTSB\\operatorname*{\\underleftarrow{\\text{lim}}}"); - -defineMacro("\\centerdot", "{\\medspace\\rule{0.167em}{0.189em}\\medspace}"); - -////////////////////////////////////////////////////////////////////// -// statmath.sty -// https://ctan.math.illinois.edu/macros/latex/contrib/statmath/statmath.pdf - -defineMacro("\\argmin", "\\DOTSB\\operatorname*{arg\\,min}"); -defineMacro("\\argmax", "\\DOTSB\\operatorname*{arg\\,max}"); -defineMacro("\\plim", "\\DOTSB\\operatorname*{plim}"); - -////////////////////////////////////////////////////////////////////// -// MnSymbol.sty - -defineMacro("\\leftmodels", "\\mathop{\\reflectbox{$\\models$}}"); - -////////////////////////////////////////////////////////////////////// -// braket.sty -// http://ctan.math.washington.edu/tex-archive/macros/latex/contrib/braket/braket.pdf - -defineMacro("\\bra", "\\mathinner{\\langle{#1}|}"); -defineMacro("\\ket", "\\mathinner{|{#1}\\rangle}"); -defineMacro("\\braket", "\\mathinner{\\langle{#1}\\rangle}"); -defineMacro("\\Bra", "\\left\\langle#1\\right|"); -defineMacro("\\Ket", "\\left|#1\\right\\rangle"); -// A helper for \Braket and \Set -const replaceVert = (argStr, match) => { - const ch = match[0] === "|" ? "\\vert" : "\\Vert"; - const replaceStr = `}\\,\\middle${ch}\\,{`; - return argStr.slice(0, match.index) + replaceStr + argStr.slice(match.index + match[0].length) -}; -defineMacro("\\Braket", function(context) { - let argStr = recreateArgStr(context); - const regEx = /\|\||\||\\\|/g; - let match; - while ((match = regEx.exec(argStr)) !== null) { - argStr = replaceVert(argStr, match); - } - return "\\left\\langle{" + argStr + "}\\right\\rangle" -}); -defineMacro("\\Set", function(context) { - let argStr = recreateArgStr(context); - const match = /\|\||\||\\\|/.exec(argStr); - if (match) { - argStr = replaceVert(argStr, match); - } - return "\\left\\{\\:{" + argStr + "}\\:\\right\\}" -}); -defineMacro("\\set", function(context) { - const argStr = recreateArgStr(context); - return "\\{{" + argStr.replace(/\|/, "}\\mid{") + "}\\}" -}); - -////////////////////////////////////////////////////////////////////// -// actuarialangle.dtx -defineMacro("\\angln", "{\\angl n}"); - -////////////////////////////////////////////////////////////////////// -// derivative.sty -defineMacro("\\odv", "\\@ifstar\\odv@next\\odv@numerator"); -defineMacro("\\odv@numerator", "\\frac{\\mathrm{d}#1}{\\mathrm{d}#2}"); -defineMacro("\\odv@next", "\\frac{\\mathrm{d}}{\\mathrm{d}#2}#1"); -defineMacro("\\pdv", "\\@ifstar\\pdv@next\\pdv@numerator"); - -const pdvHelper = args => { - const numerator = args[0][0].text; - const denoms = stringFromArg(args[1]).split(","); - const power = String(denoms.length); - const numOp = power === "1" ? "\\partial" : `\\partial^${power}`; - let denominator = ""; - denoms.map(e => { denominator += "\\partial " + e.trim() + "\\,";}); - return [numerator, numOp, denominator.replace(/\\,$/, "")] -}; -defineMacro("\\pdv@numerator", function(context) { - const [numerator, numOp, denominator] = pdvHelper(context.consumeArgs(2)); - return `\\frac{${numOp} ${numerator}}{${denominator}}` -}); -defineMacro("\\pdv@next", function(context) { - const [numerator, numOp, denominator] = pdvHelper(context.consumeArgs(2)); - return `\\frac{${numOp}}{${denominator}} ${numerator}` -}); - -////////////////////////////////////////////////////////////////////// -// upgreek.dtx -defineMacro("\\upalpha", "\\up@greek{\\alpha}"); -defineMacro("\\upbeta", "\\up@greek{\\beta}"); -defineMacro("\\upgamma", "\\up@greek{\\gamma}"); -defineMacro("\\updelta", "\\up@greek{\\delta}"); -defineMacro("\\upepsilon", "\\up@greek{\\epsilon}"); -defineMacro("\\upzeta", "\\up@greek{\\zeta}"); -defineMacro("\\upeta", "\\up@greek{\\eta}"); -defineMacro("\\uptheta", "\\up@greek{\\theta}"); -defineMacro("\\upiota", "\\up@greek{\\iota}"); -defineMacro("\\upkappa", "\\up@greek{\\kappa}"); -defineMacro("\\uplambda", "\\up@greek{\\lambda}"); -defineMacro("\\upmu", "\\up@greek{\\mu}"); -defineMacro("\\upnu", "\\up@greek{\\nu}"); -defineMacro("\\upxi", "\\up@greek{\\xi}"); -defineMacro("\\upomicron", "\\up@greek{\\omicron}"); -defineMacro("\\uppi", "\\up@greek{\\pi}"); -defineMacro("\\upalpha", "\\up@greek{\\alpha}"); -defineMacro("\\uprho", "\\up@greek{\\rho}"); -defineMacro("\\upsigma", "\\up@greek{\\sigma}"); -defineMacro("\\uptau", "\\up@greek{\\tau}"); -defineMacro("\\upupsilon", "\\up@greek{\\upsilon}"); -defineMacro("\\upphi", "\\up@greek{\\phi}"); -defineMacro("\\upchi", "\\up@greek{\\chi}"); -defineMacro("\\uppsi", "\\up@greek{\\psi}"); -defineMacro("\\upomega", "\\up@greek{\\omega}"); - -////////////////////////////////////////////////////////////////////// -// cmll package -defineMacro("\\invamp", '\\mathbin{\\char"214b}'); -defineMacro("\\parr", '\\mathbin{\\char"214b}'); -defineMacro("\\with", '\\mathbin{\\char"26}'); -defineMacro("\\multimapinv", '\\mathrel{\\char"27dc}'); -defineMacro("\\multimapboth", '\\mathrel{\\char"29df}'); -defineMacro("\\scoh", '{\\mkern5mu\\char"2322\\mkern5mu}'); -defineMacro("\\sincoh", '{\\mkern5mu\\char"2323\\mkern5mu}'); -defineMacro("\\coh", `{\\mkern5mu\\rule{}{0.7em}\\mathrlap{\\smash{\\raise2mu{\\char"2322}}} -{\\smash{\\lower4mu{\\char"2323}}}\\mkern5mu}`); -defineMacro("\\incoh", `{\\mkern5mu\\rule{}{0.7em}\\mathrlap{\\smash{\\raise2mu{\\char"2323}}} -{\\smash{\\lower4mu{\\char"2322}}}\\mkern5mu}`); - - -////////////////////////////////////////////////////////////////////// -// chemstyle package -defineMacro("\\standardstate", "\\text{\\tiny\\char`⦵}"); - -/* eslint-disable */ -/* -*- Mode: JavaScript; indent-tabs-mode:nil; js-indent-level: 2 -*- */ -/* vim: set ts=2 et sw=2 tw=80: */ - -/************************************************************* - * - * Temml mhchem.js - * - * This file implements a Temml version of mhchem version 3.3.0. - * It is adapted from MathJax/extensions/TeX/mhchem.js - * It differs from the MathJax version as follows: - * 1. The interface is changed so that it can be called from Temml, not MathJax. - * 2. \rlap and \llap are replaced with \mathrlap and \mathllap. - * 3. The reaction arrow code is simplified. All reaction arrows are rendered - * using Temml extensible arrows instead of building non-extensible arrows. - * 4. The ~bond forms are composed entirely of \rule elements. - * 5. Two dashes in _getBond are wrapped in braces to suppress spacing. i.e., {-} - * 6. The electron dot uses \textbullet instead of \bullet. - * - * This code, as other Temml code, is released under the MIT license. - * - * /************************************************************* - * - * MathJax/extensions/TeX/mhchem.js - * - * Implements the \ce command for handling chemical formulas - * from the mhchem LaTeX package. - * - * --------------------------------------------------------------------- - * - * Copyright (c) 2011-2015 The MathJax Consortium - * Copyright (c) 2015-2018 Martin Hensel - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// -// Coding Style -// - use '' for identifiers that can by minified/uglified -// - use "" for strings that need to stay untouched - -// version: "3.3.0" for MathJax and Temml - - -// Add \ce, \pu, and \tripleDash to the Temml macros. - -defineMacro("\\ce", function(context) { - return chemParse(context.consumeArgs(1)[0], "ce") -}); - -defineMacro("\\pu", function(context) { - return chemParse(context.consumeArgs(1)[0], "pu"); -}); - -// Math fonts do not include glyphs for the ~ form of bonds. So we'll send path geometry -// So we'll compose characters built from \rule elements. -defineMacro("\\uniDash", `{\\rule{0.672em}{0.06em}}`) -defineMacro("\\triDash", `{\\rule{0.15em}{0.06em}\\kern2mu\\rule{0.15em}{0.06em}\\kern2mu\\rule{0.15em}{0.06em}}`) -defineMacro("\\tripleDash", `\\kern0.075em\\raise0.25em{\\triDash}\\kern0.075em`) -defineMacro("\\tripleDashOverLine", `\\kern0.075em\\mathrlap{\\raise0.125em{\\uniDash}}\\raise0.34em{\\triDash}\\kern0.075em`) -defineMacro("\\tripleDashOverDoubleLine", `\\kern0.075em\\mathrlap{\\mathrlap{\\raise0.48em{\\triDash}}\\raise0.27em{\\uniDash}}{\\raise0.05em{\\uniDash}}\\kern0.075em`) -defineMacro("\\tripleDashBetweenDoubleLine", `\\kern0.075em\\mathrlap{\\mathrlap{\\raise0.48em{\\uniDash}}\\raise0.27em{\\triDash}}{\\raise0.05em{\\uniDash}}\\kern0.075em`) - - // - // This is the main function for handing the \ce and \pu commands. - // It takes the argument to \ce or \pu and returns the corresponding TeX string. - // - - var chemParse = function (tokens, stateMachine) { - // Recreate the argument string from Temml's array of tokens. - var str = ""; - var expectedLoc = tokens.length && tokens[tokens.length - 1].loc.start - for (var i = tokens.length - 1; i >= 0; i--) { - if(tokens[i].loc.start > expectedLoc) { - // context.consumeArgs has eaten a space. - str += " "; - expectedLoc = tokens[i].loc.start; - } - str += tokens[i].text; - expectedLoc += tokens[i].text.length; - } - // Call the mhchem core parser. - var tex = texify.go(mhchemParser.go(str, stateMachine)); - return tex; - }; - - // - // Core parser for mhchem syntax (recursive) - // - /** @type {MhchemParser} */ - var mhchemParser = { - // - // Parses mchem \ce syntax - // - // Call like - // go("H2O"); - // - go: function (input, stateMachine) { - if (!input) { return []; } - if (stateMachine === undefined) { stateMachine = 'ce'; } - var state = '0'; - - // - // String buffers for parsing: - // - // buffer.a == amount - // buffer.o == element - // buffer.b == left-side superscript - // buffer.p == left-side subscript - // buffer.q == right-side subscript - // buffer.d == right-side superscript - // - // buffer.r == arrow - // buffer.rdt == arrow, script above, type - // buffer.rd == arrow, script above, content - // buffer.rqt == arrow, script below, type - // buffer.rq == arrow, script below, content - // - // buffer.text_ - // buffer.rm - // etc. - // - // buffer.parenthesisLevel == int, starting at 0 - // buffer.sb == bool, space before - // buffer.beginsWithBond == bool - // - // These letters are also used as state names. - // - // Other states: - // 0 == begin of main part (arrow/operator unlikely) - // 1 == next entity - // 2 == next entity (arrow/operator unlikely) - // 3 == next atom - // c == macro - // - /** @type {Buffer} */ - var buffer = {}; - buffer['parenthesisLevel'] = 0; - - input = input.replace(/\n/g, " "); - input = input.replace(/[\u2212\u2013\u2014\u2010]/g, "-"); - input = input.replace(/[\u2026]/g, "..."); - - // - // Looks through mhchemParser.transitions, to execute a matching action - // (recursive) - // - var lastInput; - var watchdog = 10; - /** @type {ParserOutput[]} */ - var output = []; - while (true) { - if (lastInput !== input) { - watchdog = 10; - lastInput = input; - } else { - watchdog--; - } - // - // Find actions in transition table - // - var machine = mhchemParser.stateMachines[stateMachine]; - var t = machine.transitions[state] || machine.transitions['*']; - iterateTransitions: - for (var i=0; i 0) { - if (!task.revisit) { - input = matches.remainder; - } - if (!task.toContinue) { - break iterateTransitions; - } - } else { - return output; - } - } - } - // - // Prevent infinite loop - // - if (watchdog <= 0) { - throw ["MhchemBugU", "mhchem bug U. Please report."]; // Unexpected character - } - } - }, - concatArray: function (a, b) { - if (b) { - if (Array.isArray(b)) { - for (var iB=0; iB': /^[=<>]/, - '#': /^[#\u2261]/, - '+': /^\+/, - '-$': /^-(?=[\s_},;\]/]|$|\([a-z]+\))/, // -space -, -; -] -/ -$ -state-of-aggregation - '-9': /^-(?=[0-9])/, - '- orbital overlap': /^-(?=(?:[spd]|sp)(?:$|[\s,;\)\]\}]))/, - '-': /^-/, - 'pm-operator': /^(?:\\pm|\$\\pm\$|\+-|\+\/-)/, - 'operator': /^(?:\+|(?:[\-=<>]|<<|>>|\\approx|\$\\approx\$)(?=\s|$|-?[0-9]))/, - 'arrowUpDown': /^(?:v|\(v\)|\^|\(\^\))(?=$|[\s,;\)\]\}])/, - '\\bond{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, "\\bond{", "", "", "}"); }, - '->': /^(?:<->|<-->|->|<-|<=>>|<<=>|<=>|[\u2192\u27F6\u21CC])/, - 'CMT': /^[CMT](?=\[)/, - '[(...)]': function (input) { return mhchemParser.patterns.findObserveGroups(input, "[", "", "", "]"); }, - '1st-level escape': /^(&|\\\\|\\hline)\s*/, - '\\,': /^(?:\\[,\ ;:])/, // \\x - but output no space before - '\\x{}{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, "", /^\\[a-zA-Z]+\{/, "}", "", "", "{", "}", "", true); }, - '\\x{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, "", /^\\[a-zA-Z]+\{/, "}", ""); }, - '\\ca': /^\\ca(?:\s+|(?![a-zA-Z]))/, - '\\x': /^(?:\\[a-zA-Z]+\s*|\\[_&{}%])/, - 'orbital': /^(?:[0-9]{1,2}[spdfgh]|[0-9]{0,2}sp)(?=$|[^a-zA-Z])/, // only those with numbers in front, because the others will be formatted correctly anyway - 'others': /^[\/~|]/, - '\\frac{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, "\\frac{", "", "", "}", "{", "", "", "}"); }, - '\\overset{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, "\\overset{", "", "", "}", "{", "", "", "}"); }, - '\\underset{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, "\\underset{", "", "", "}", "{", "", "", "}"); }, - '\\underbrace{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, "\\underbrace{", "", "", "}_", "{", "", "", "}"); }, - '\\color{(...)}0': function (input) { return mhchemParser.patterns.findObserveGroups(input, "\\color{", "", "", "}"); }, - '\\color{(...)}{(...)}1': function (input) { return mhchemParser.patterns.findObserveGroups(input, "\\color{", "", "", "}", "{", "", "", "}"); }, - '\\color(...){(...)}2': function (input) { return mhchemParser.patterns.findObserveGroups(input, "\\color", "\\", "", /^(?=\{)/, "{", "", "", "}"); }, - '\\ce{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, "\\ce{", "", "", "}"); }, - 'oxidation$': /^(?:[+-][IVX]+|\\pm\s*0|\$\\pm\$\s*0)$/, - 'd-oxidation$': /^(?:[+-]?\s?[IVX]+|\\pm\s*0|\$\\pm\$\s*0)$/, // 0 could be oxidation or charge - 'roman numeral': /^[IVX]+/, - '1/2$': /^[+\-]?(?:[0-9]+|\$[a-z]\$|[a-z])\/[0-9]+(?:\$[a-z]\$|[a-z])?$/, - 'amount': function (input) { - var match; - // e.g. 2, 0.5, 1/2, -2, n/2, +; $a$ could be added later in parsing - match = input.match(/^(?:(?:(?:\([+\-]?[0-9]+\/[0-9]+\)|[+\-]?(?:[0-9]+|\$[a-z]\$|[a-z])\/[0-9]+|[+\-]?[0-9]+[.,][0-9]+|[+\-]?\.[0-9]+|[+\-]?[0-9]+)(?:[a-z](?=\s*[A-Z]))?)|[+\-]?[a-z](?=\s*[A-Z])|\+(?!\s))/); - if (match) { - return { match_: match[0], remainder: input.substr(match[0].length) }; - } - var a = mhchemParser.patterns.findObserveGroups(input, "", "$", "$", ""); - if (a) { // e.g. $2n-1$, $-$ - match = a.match_.match(/^\$(?:\(?[+\-]?(?:[0-9]*[a-z]?[+\-])?[0-9]*[a-z](?:[+\-][0-9]*[a-z]?)?\)?|\+|-)\$$/); - if (match) { - return { match_: match[0], remainder: input.substr(match[0].length) }; - } - } - return null; - }, - 'amount2': function (input) { return this['amount'](input); }, - '(KV letters),': /^(?:[A-Z][a-z]{0,2}|i)(?=,)/, - 'formula$': function (input) { - if (input.match(/^\([a-z]+\)$/)) { return null; } // state of aggregation = no formula - var match = input.match(/^(?:[a-z]|(?:[0-9\ \+\-\,\.\(\)]+[a-z])+[0-9\ \+\-\,\.\(\)]*|(?:[a-z][0-9\ \+\-\,\.\(\)]+)+[a-z]?)$/); - if (match) { - return { match_: match[0], remainder: input.substr(match[0].length) }; - } - return null; - }, - 'uprightEntities': /^(?:pH|pOH|pC|pK|iPr|iBu)(?=$|[^a-zA-Z])/, - '/': /^\s*(\/)\s*/, - '//': /^\s*(\/\/)\s*/, - '*': /^\s*[*.]\s*/ - }, - findObserveGroups: function (input, begExcl, begIncl, endIncl, endExcl, beg2Excl, beg2Incl, end2Incl, end2Excl, combine) { - /** @type {{(input: string, pattern: string | RegExp): string | string[] | null;}} */ - var _match = function (input, pattern) { - if (typeof pattern === "string") { - if (input.indexOf(pattern) !== 0) { return null; } - return pattern; - } else { - var match = input.match(pattern); - if (!match) { return null; } - return match[0]; - } - }; - /** @type {{(input: string, i: number, endChars: string | RegExp): {endMatchBegin: number, endMatchEnd: number} | null;}} */ - var _findObserveGroups = function (input, i, endChars) { - var braces = 0; - while (i < input.length) { - var a = input.charAt(i); - var match = _match(input.substr(i), endChars); - if (match !== null && braces === 0) { - return { endMatchBegin: i, endMatchEnd: i + match.length }; - } else if (a === "{") { - braces++; - } else if (a === "}") { - if (braces === 0) { - throw ["ExtraCloseMissingOpen", "Extra close brace or missing open brace"]; - } else { - braces--; - } - } - i++; - } - if (braces > 0) { - return null; - } - return null; - }; - var match = _match(input, begExcl); - if (match === null) { return null; } - input = input.substr(match.length); - match = _match(input, begIncl); - if (match === null) { return null; } - var e = _findObserveGroups(input, match.length, endIncl || endExcl); - if (e === null) { return null; } - var match1 = input.substring(0, (endIncl ? e.endMatchEnd : e.endMatchBegin)); - if (!(beg2Excl || beg2Incl)) { - return { - match_: match1, - remainder: input.substr(e.endMatchEnd) - }; - } else { - var group2 = this.findObserveGroups(input.substr(e.endMatchEnd), beg2Excl, beg2Incl, end2Incl, end2Excl); - if (group2 === null) { return null; } - /** @type {string[]} */ - var matchRet = [match1, group2.match_]; - return { - match_: (combine ? matchRet.join("") : matchRet), - remainder: group2.remainder - }; - } - }, - - // - // Matching function - // e.g. match("a", input) will look for the regexp called "a" and see if it matches - // returns null or {match_:"a", remainder:"bc"} - // - match_: function (m, input) { - var pattern = mhchemParser.patterns.patterns[m]; - if (pattern === undefined) { - throw ["MhchemBugP", "mhchem bug P. Please report. (" + m + ")"]; // Trying to use non-existing pattern - } else if (typeof pattern === "function") { - return mhchemParser.patterns.patterns[m](input); // cannot use cached var pattern here, because some pattern functions need this===mhchemParser - } else { // RegExp - var match = input.match(pattern); - if (match) { - var mm; - if (match[2]) { - mm = [ match[1], match[2] ]; - } else if (match[1]) { - mm = match[1]; - } else { - mm = match[0]; - } - return { match_: mm, remainder: input.substr(match[0].length) }; - } - return null; - } - } - }, - - // - // Generic state machine actions - // - actions: { - 'a=': function (buffer, m) { buffer.a = (buffer.a || "") + m; }, - 'b=': function (buffer, m) { buffer.b = (buffer.b || "") + m; }, - 'p=': function (buffer, m) { buffer.p = (buffer.p || "") + m; }, - 'o=': function (buffer, m) { buffer.o = (buffer.o || "") + m; }, - 'q=': function (buffer, m) { buffer.q = (buffer.q || "") + m; }, - 'd=': function (buffer, m) { buffer.d = (buffer.d || "") + m; }, - 'rm=': function (buffer, m) { buffer.rm = (buffer.rm || "") + m; }, - 'text=': function (buffer, m) { buffer.text_ = (buffer.text_ || "") + m; }, - 'insert': function (buffer, m, a) { return { type_: a }; }, - 'insert+p1': function (buffer, m, a) { return { type_: a, p1: m }; }, - 'insert+p1+p2': function (buffer, m, a) { return { type_: a, p1: m[0], p2: m[1] }; }, - 'copy': function (buffer, m) { return m; }, - 'rm': function (buffer, m) { return { type_: 'rm', p1: m || ""}; }, - 'text': function (buffer, m) { return mhchemParser.go(m, 'text'); }, - '{text}': function (buffer, m) { - var ret = [ "{" ]; - mhchemParser.concatArray(ret, mhchemParser.go(m, 'text')); - ret.push("}"); - return ret; - }, - 'tex-math': function (buffer, m) { return mhchemParser.go(m, 'tex-math'); }, - 'tex-math tight': function (buffer, m) { return mhchemParser.go(m, 'tex-math tight'); }, - 'bond': function (buffer, m, k) { return { type_: 'bond', kind_: k || m }; }, - 'color0-output': function (buffer, m) { return { type_: 'color0', color: m[0] }; }, - 'ce': function (buffer, m) { return mhchemParser.go(m); }, - '1/2': function (buffer, m) { - /** @type {ParserOutput[]} */ - var ret = []; - if (m.match(/^[+\-]/)) { - ret.push(m.substr(0, 1)); - m = m.substr(1); - } - var n = m.match(/^([0-9]+|\$[a-z]\$|[a-z])\/([0-9]+)(\$[a-z]\$|[a-z])?$/); - n[1] = n[1].replace(/\$/g, ""); - ret.push({ type_: 'frac', p1: n[1], p2: n[2] }); - if (n[3]) { - n[3] = n[3].replace(/\$/g, ""); - ret.push({ type_: 'tex-math', p1: n[3] }); - } - return ret; - }, - '9,9': function (buffer, m) { return mhchemParser.go(m, '9,9'); } - }, - // - // createTransitions - // convert { 'letter': { 'state': { action_: 'output' } } } to { 'state' => [ { pattern: 'letter', task: { action_: [{type_: 'output'}] } } ] } - // with expansion of 'a|b' to 'a' and 'b' (at 2 places) - // - createTransitions: function (o) { - var pattern, state; - /** @type {string[]} */ - var stateArray; - var i; - // - // 1. Collect all states - // - /** @type {Transitions} */ - var transitions = {}; - for (pattern in o) { - for (state in o[pattern]) { - stateArray = state.split("|"); - o[pattern][state].stateArray = stateArray; - for (i=0; i': { - '0|1|2|3': { action_: 'r=', nextState: 'r' }, - 'a|as': { action_: [ 'output', 'r=' ], nextState: 'r' }, - '*': { action_: [ 'output', 'r=' ], nextState: 'r' } }, - '+': { - 'o': { action_: 'd= kv', nextState: 'd' }, - 'd|D': { action_: 'd=', nextState: 'd' }, - 'q': { action_: 'd=', nextState: 'qd' }, - 'qd|qD': { action_: 'd=', nextState: 'qd' }, - 'dq': { action_: [ 'output', 'd=' ], nextState: 'd' }, - '3': { action_: [ 'sb=false', 'output', 'operator' ], nextState: '0' } }, - 'amount': { - '0|2': { action_: 'a=', nextState: 'a' } }, - 'pm-operator': { - '0|1|2|a|as': { action_: [ 'sb=false', 'output', { type_: 'operator', option: '\\pm' } ], nextState: '0' } }, - 'operator': { - '0|1|2|a|as': { action_: [ 'sb=false', 'output', 'operator' ], nextState: '0' } }, - '-$': { - 'o|q': { action_: [ 'charge or bond', 'output' ], nextState: 'qd' }, - 'd': { action_: 'd=', nextState: 'd' }, - 'D': { action_: [ 'output', { type_: 'bond', option: "-" } ], nextState: '3' }, - 'q': { action_: 'd=', nextState: 'qd' }, - 'qd': { action_: 'd=', nextState: 'qd' }, - 'qD|dq': { action_: [ 'output', { type_: 'bond', option: "-" } ], nextState: '3' } }, - '-9': { - '3|o': { action_: [ 'output', { type_: 'insert', option: 'hyphen' } ], nextState: '3' } }, - '- orbital overlap': { - 'o': { action_: [ 'output', { type_: 'insert', option: 'hyphen' } ], nextState: '2' }, - 'd': { action_: [ 'output', { type_: 'insert', option: 'hyphen' } ], nextState: '2' } }, - '-': { - '0|1|2': { action_: [ { type_: 'output', option: 1 }, 'beginsWithBond=true', { type_: 'bond', option: "-" } ], nextState: '3' }, - '3': { action_: { type_: 'bond', option: "-" } }, - 'a': { action_: [ 'output', { type_: 'insert', option: 'hyphen' } ], nextState: '2' }, - 'as': { action_: [ { type_: 'output', option: 2 }, { type_: 'bond', option: "-" } ], nextState: '3' }, - 'b': { action_: 'b=' }, - 'o': { action_: { type_: '- after o/d', option: false }, nextState: '2' }, - 'q': { action_: { type_: '- after o/d', option: false }, nextState: '2' }, - 'd|qd|dq': { action_: { type_: '- after o/d', option: true }, nextState: '2' }, - 'D|qD|p': { action_: [ 'output', { type_: 'bond', option: "-" } ], nextState: '3' } }, - 'amount2': { - '1|3': { action_: 'a=', nextState: 'a' } }, - 'letters': { - '0|1|2|3|a|as|b|p|bp|o': { action_: 'o=', nextState: 'o' }, - 'q|dq': { action_: ['output', 'o='], nextState: 'o' }, - 'd|D|qd|qD': { action_: 'o after d', nextState: 'o' } }, - 'digits': { - 'o': { action_: 'q=', nextState: 'q' }, - 'd|D': { action_: 'q=', nextState: 'dq' }, - 'q': { action_: [ 'output', 'o=' ], nextState: 'o' }, - 'a': { action_: 'o=', nextState: 'o' } }, - 'space A': { - 'b|p|bp': {} }, - 'space': { - 'a': { nextState: 'as' }, - '0': { action_: 'sb=false' }, - '1|2': { action_: 'sb=true' }, - 'r|rt|rd|rdt|rdq': { action_: 'output', nextState: '0' }, - '*': { action_: [ 'output', 'sb=true' ], nextState: '1'} }, - '1st-level escape': { - '1|2': { action_: [ 'output', { type_: 'insert+p1', option: '1st-level escape' } ] }, - '*': { action_: [ 'output', { type_: 'insert+p1', option: '1st-level escape' } ], nextState: '0' } }, - '[(...)]': { - 'r|rt': { action_: 'rd=', nextState: 'rd' }, - 'rd|rdt': { action_: 'rq=', nextState: 'rdq' } }, - '...': { - 'o|d|D|dq|qd|qD': { action_: [ 'output', { type_: 'bond', option: "..." } ], nextState: '3' }, - '*': { action_: [ { type_: 'output', option: 1 }, { type_: 'insert', option: 'ellipsis' } ], nextState: '1' } }, - '. |* ': { - '*': { action_: [ 'output', { type_: 'insert', option: 'addition compound' } ], nextState: '1' } }, - 'state of aggregation $': { - '*': { action_: [ 'output', 'state of aggregation' ], nextState: '1' } }, - '{[(': { - 'a|as|o': { action_: [ 'o=', 'output', 'parenthesisLevel++' ], nextState: '2' }, - '0|1|2|3': { action_: [ 'o=', 'output', 'parenthesisLevel++' ], nextState: '2' }, - '*': { action_: [ 'output', 'o=', 'output', 'parenthesisLevel++' ], nextState: '2' } }, - ')]}': { - '0|1|2|3|b|p|bp|o': { action_: [ 'o=', 'parenthesisLevel--' ], nextState: 'o' }, - 'a|as|d|D|q|qd|qD|dq': { action_: [ 'output', 'o=', 'parenthesisLevel--' ], nextState: 'o' } }, - ', ': { - '*': { action_: [ 'output', 'comma' ], nextState: '0' } }, - '^_': { // ^ and _ without a sensible argument - '*': { } }, - '^{(...)}|^($...$)': { - '0|1|2|as': { action_: 'b=', nextState: 'b' }, - 'p': { action_: 'b=', nextState: 'bp' }, - '3|o': { action_: 'd= kv', nextState: 'D' }, - 'q': { action_: 'd=', nextState: 'qD' }, - 'd|D|qd|qD|dq': { action_: [ 'output', 'd=' ], nextState: 'D' } }, - '^a|^\\x{}{}|^\\x{}|^\\x|\'': { - '0|1|2|as': { action_: 'b=', nextState: 'b' }, - 'p': { action_: 'b=', nextState: 'bp' }, - '3|o': { action_: 'd= kv', nextState: 'd' }, - 'q': { action_: 'd=', nextState: 'qd' }, - 'd|qd|D|qD': { action_: 'd=' }, - 'dq': { action_: [ 'output', 'd=' ], nextState: 'd' } }, - '_{(state of aggregation)}$': { - 'd|D|q|qd|qD|dq': { action_: [ 'output', 'q=' ], nextState: 'q' } }, - '_{(...)}|_($...$)|_9|_\\x{}{}|_\\x{}|_\\x': { - '0|1|2|as': { action_: 'p=', nextState: 'p' }, - 'b': { action_: 'p=', nextState: 'bp' }, - '3|o': { action_: 'q=', nextState: 'q' }, - 'd|D': { action_: 'q=', nextState: 'dq' }, - 'q|qd|qD|dq': { action_: [ 'output', 'q=' ], nextState: 'q' } }, - '=<>': { - '0|1|2|3|a|as|o|q|d|D|qd|qD|dq': { action_: [ { type_: 'output', option: 2 }, 'bond' ], nextState: '3' } }, - '#': { - '0|1|2|3|a|as|o': { action_: [ { type_: 'output', option: 2 }, { type_: 'bond', option: "#" } ], nextState: '3' } }, - '{}': { - '*': { action_: { type_: 'output', option: 1 }, nextState: '1' } }, - '{...}': { - '0|1|2|3|a|as|b|p|bp': { action_: 'o=', nextState: 'o' }, - 'o|d|D|q|qd|qD|dq': { action_: [ 'output', 'o=' ], nextState: 'o' } }, - '$...$': { - 'a': { action_: 'a=' }, // 2$n$ - '0|1|2|3|as|b|p|bp|o': { action_: 'o=', nextState: 'o' }, // not 'amount' - 'as|o': { action_: 'o=' }, - 'q|d|D|qd|qD|dq': { action_: [ 'output', 'o=' ], nextState: 'o' } }, - '\\bond{(...)}': { - '*': { action_: [ { type_: 'output', option: 2 }, 'bond' ], nextState: "3" } }, - '\\frac{(...)}': { - '*': { action_: [ { type_: 'output', option: 1 }, 'frac-output' ], nextState: '3' } }, - '\\overset{(...)}': { - '*': { action_: [ { type_: 'output', option: 2 }, 'overset-output' ], nextState: '3' } }, - '\\underset{(...)}': { - '*': { action_: [ { type_: 'output', option: 2 }, 'underset-output' ], nextState: '3' } }, - '\\underbrace{(...)}': { - '*': { action_: [ { type_: 'output', option: 2 }, 'underbrace-output' ], nextState: '3' } }, - '\\color{(...)}{(...)}1|\\color(...){(...)}2': { - '*': { action_: [ { type_: 'output', option: 2 }, 'color-output' ], nextState: '3' } }, - '\\color{(...)}0': { - '*': { action_: [ { type_: 'output', option: 2 }, 'color0-output' ] } }, - '\\ce{(...)}': { - '*': { action_: [ { type_: 'output', option: 2 }, 'ce' ], nextState: '3' } }, - '\\,': { - '*': { action_: [ { type_: 'output', option: 1 }, 'copy' ], nextState: '1' } }, - '\\x{}{}|\\x{}|\\x': { - '0|1|2|3|a|as|b|p|bp|o|c0': { action_: [ 'o=', 'output' ], nextState: '3' }, - '*': { action_: ['output', 'o=', 'output' ], nextState: '3' } }, - 'others': { - '*': { action_: [ { type_: 'output', option: 1 }, 'copy' ], nextState: '3' } }, - 'else2': { - 'a': { action_: 'a to o', nextState: 'o', revisit: true }, - 'as': { action_: [ 'output', 'sb=true' ], nextState: '1', revisit: true }, - 'r|rt|rd|rdt|rdq': { action_: [ 'output' ], nextState: '0', revisit: true }, - '*': { action_: [ 'output', 'copy' ], nextState: '3' } } - }), - actions: { - 'o after d': function (buffer, m) { - var ret; - if ((buffer.d || "").match(/^[0-9]+$/)) { - var tmp = buffer.d; - buffer.d = undefined; - ret = this['output'](buffer); - buffer.b = tmp; - } else { - ret = this['output'](buffer); - } - mhchemParser.actions['o='](buffer, m); - return ret; - }, - 'd= kv': function (buffer, m) { - buffer.d = m; - buffer.dType = 'kv'; - }, - 'charge or bond': function (buffer, m) { - if (buffer['beginsWithBond']) { - /** @type {ParserOutput[]} */ - var ret = []; - mhchemParser.concatArray(ret, this['output'](buffer)); - mhchemParser.concatArray(ret, mhchemParser.actions['bond'](buffer, m, "-")); - return ret; - } else { - buffer.d = m; - } - }, - '- after o/d': function (buffer, m, isAfterD) { - var c1 = mhchemParser.patterns.match_('orbital', buffer.o || ""); - var c2 = mhchemParser.patterns.match_('one lowercase greek letter $', buffer.o || ""); - var c3 = mhchemParser.patterns.match_('one lowercase latin letter $', buffer.o || ""); - var c4 = mhchemParser.patterns.match_('$one lowercase latin letter$ $', buffer.o || ""); - var hyphenFollows = m==="-" && ( c1 && c1.remainder==="" || c2 || c3 || c4 ); - if (hyphenFollows && !buffer.a && !buffer.b && !buffer.p && !buffer.d && !buffer.q && !c1 && c3) { - buffer.o = '$' + buffer.o + '$'; - } - /** @type {ParserOutput[]} */ - var ret = []; - if (hyphenFollows) { - mhchemParser.concatArray(ret, this['output'](buffer)); - ret.push({ type_: 'hyphen' }); - } else { - c1 = mhchemParser.patterns.match_('digits', buffer.d || ""); - if (isAfterD && c1 && c1.remainder==='') { - mhchemParser.concatArray(ret, mhchemParser.actions['d='](buffer, m)); - mhchemParser.concatArray(ret, this['output'](buffer)); - } else { - mhchemParser.concatArray(ret, this['output'](buffer)); - mhchemParser.concatArray(ret, mhchemParser.actions['bond'](buffer, m, "-")); - } - } - return ret; - }, - 'a to o': function (buffer) { - buffer.o = buffer.a; - buffer.a = undefined; - }, - 'sb=true': function (buffer) { buffer.sb = true; }, - 'sb=false': function (buffer) { buffer.sb = false; }, - 'beginsWithBond=true': function (buffer) { buffer['beginsWithBond'] = true; }, - 'beginsWithBond=false': function (buffer) { buffer['beginsWithBond'] = false; }, - 'parenthesisLevel++': function (buffer) { buffer['parenthesisLevel']++; }, - 'parenthesisLevel--': function (buffer) { buffer['parenthesisLevel']--; }, - 'state of aggregation': function (buffer, m) { - return { type_: 'state of aggregation', p1: mhchemParser.go(m, 'o') }; - }, - 'comma': function (buffer, m) { - var a = m.replace(/\s*$/, ''); - var withSpace = (a !== m); - if (withSpace && buffer['parenthesisLevel'] === 0) { - return { type_: 'comma enumeration L', p1: a }; - } else { - return { type_: 'comma enumeration M', p1: a }; - } - }, - 'output': function (buffer, m, entityFollows) { - // entityFollows: - // undefined = if we have nothing else to output, also ignore the just read space (buffer.sb) - // 1 = an entity follows, never omit the space if there was one just read before (can only apply to state 1) - // 2 = 1 + the entity can have an amount, so output a\, instead of converting it to o (can only apply to states a|as) - /** @type {ParserOutput | ParserOutput[]} */ - var ret; - if (!buffer.r) { - ret = []; - if (!buffer.a && !buffer.b && !buffer.p && !buffer.o && !buffer.q && !buffer.d && !entityFollows) { - //ret = []; - } else { - if (buffer.sb) { - ret.push({ type_: 'entitySkip' }); - } - if (!buffer.o && !buffer.q && !buffer.d && !buffer.b && !buffer.p && entityFollows!==2) { - buffer.o = buffer.a; - buffer.a = undefined; - } else if (!buffer.o && !buffer.q && !buffer.d && (buffer.b || buffer.p)) { - buffer.o = buffer.a; - buffer.d = buffer.b; - buffer.q = buffer.p; - buffer.a = buffer.b = buffer.p = undefined; - } else { - if (buffer.o && buffer.dType==='kv' && mhchemParser.patterns.match_('d-oxidation$', buffer.d || "")) { - buffer.dType = 'oxidation'; - } else if (buffer.o && buffer.dType==='kv' && !buffer.q) { - buffer.dType = undefined; - } - } - ret.push({ - type_: 'chemfive', - a: mhchemParser.go(buffer.a, 'a'), - b: mhchemParser.go(buffer.b, 'bd'), - p: mhchemParser.go(buffer.p, 'pq'), - o: mhchemParser.go(buffer.o, 'o'), - q: mhchemParser.go(buffer.q, 'pq'), - d: mhchemParser.go(buffer.d, (buffer.dType === 'oxidation' ? 'oxidation' : 'bd')), - dType: buffer.dType - }); - } - } else { // r - /** @type {ParserOutput[]} */ - var rd; - if (buffer.rdt === 'M') { - rd = mhchemParser.go(buffer.rd, 'tex-math'); - } else if (buffer.rdt === 'T') { - rd = [ { type_: 'text', p1: buffer.rd || "" } ]; - } else { - rd = mhchemParser.go(buffer.rd); - } - /** @type {ParserOutput[]} */ - var rq; - if (buffer.rqt === 'M') { - rq = mhchemParser.go(buffer.rq, 'tex-math'); - } else if (buffer.rqt === 'T') { - rq = [ { type_: 'text', p1: buffer.rq || ""} ]; - } else { - rq = mhchemParser.go(buffer.rq); - } - ret = { - type_: 'arrow', - r: buffer.r, - rd: rd, - rq: rq - }; - } - for (var p in buffer) { - if (p !== 'parenthesisLevel' && p !== 'beginsWithBond') { - delete buffer[p]; - } - } - return ret; - }, - 'oxidation-output': function (buffer, m) { - var ret = [ "{" ]; - mhchemParser.concatArray(ret, mhchemParser.go(m, 'oxidation')); - ret.push("}"); - return ret; - }, - 'frac-output': function (buffer, m) { - return { type_: 'frac-ce', p1: mhchemParser.go(m[0]), p2: mhchemParser.go(m[1]) }; - }, - 'overset-output': function (buffer, m) { - return { type_: 'overset', p1: mhchemParser.go(m[0]), p2: mhchemParser.go(m[1]) }; - }, - 'underset-output': function (buffer, m) { - return { type_: 'underset', p1: mhchemParser.go(m[0]), p2: mhchemParser.go(m[1]) }; - }, - 'underbrace-output': function (buffer, m) { - return { type_: 'underbrace', p1: mhchemParser.go(m[0]), p2: mhchemParser.go(m[1]) }; - }, - 'color-output': function (buffer, m) { - return { type_: 'color', color1: m[0], color2: mhchemParser.go(m[1]) }; - }, - 'r=': function (buffer, m) { buffer.r = m; }, - 'rdt=': function (buffer, m) { buffer.rdt = m; }, - 'rd=': function (buffer, m) { buffer.rd = m; }, - 'rqt=': function (buffer, m) { buffer.rqt = m; }, - 'rq=': function (buffer, m) { buffer.rq = m; }, - 'operator': function (buffer, m, p1) { return { type_: 'operator', kind_: (p1 || m) }; } - } - }, - 'a': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': {} }, - '1/2$': { - '0': { action_: '1/2' } }, - 'else': { - '0': { nextState: '1', revisit: true } }, - '$(...)$': { - '*': { action_: 'tex-math tight', nextState: '1' } }, - ',': { - '*': { action_: { type_: 'insert', option: 'commaDecimal' } } }, - 'else2': { - '*': { action_: 'copy' } } - }), - actions: {} - }, - 'o': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': {} }, - '1/2$': { - '0': { action_: '1/2' } }, - 'else': { - '0': { nextState: '1', revisit: true } }, - 'letters': { - '*': { action_: 'rm' } }, - '\\ca': { - '*': { action_: { type_: 'insert', option: 'circa' } } }, - '\\x{}{}|\\x{}|\\x': { - '*': { action_: 'copy' } }, - '${(...)}$|$(...)$': { - '*': { action_: 'tex-math' } }, - '{(...)}': { - '*': { action_: '{text}' } }, - 'else2': { - '*': { action_: 'copy' } } - }), - actions: {} - }, - 'text': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': { action_: 'output' } }, - '{...}': { - '*': { action_: 'text=' } }, - '${(...)}$|$(...)$': { - '*': { action_: 'tex-math' } }, - '\\greek': { - '*': { action_: [ 'output', 'rm' ] } }, - '\\,|\\x{}{}|\\x{}|\\x': { - '*': { action_: [ 'output', 'copy' ] } }, - 'else': { - '*': { action_: 'text=' } } - }), - actions: { - 'output': function (buffer) { - if (buffer.text_) { - /** @type {ParserOutput} */ - var ret = { type_: 'text', p1: buffer.text_ }; - for (var p in buffer) { delete buffer[p]; } - return ret; - } - } - } - }, - 'pq': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': {} }, - 'state of aggregation $': { - '*': { action_: 'state of aggregation' } }, - 'i$': { - '0': { nextState: '!f', revisit: true } }, - '(KV letters),': { - '0': { action_: 'rm', nextState: '0' } }, - 'formula$': { - '0': { nextState: 'f', revisit: true } }, - '1/2$': { - '0': { action_: '1/2' } }, - 'else': { - '0': { nextState: '!f', revisit: true } }, - '${(...)}$|$(...)$': { - '*': { action_: 'tex-math' } }, - '{(...)}': { - '*': { action_: 'text' } }, - 'a-z': { - 'f': { action_: 'tex-math' } }, - 'letters': { - '*': { action_: 'rm' } }, - '-9.,9': { - '*': { action_: '9,9' } }, - ',': { - '*': { action_: { type_: 'insert+p1', option: 'comma enumeration S' } } }, - '\\color{(...)}{(...)}1|\\color(...){(...)}2': { - '*': { action_: 'color-output' } }, - '\\color{(...)}0': { - '*': { action_: 'color0-output' } }, - '\\ce{(...)}': { - '*': { action_: 'ce' } }, - '\\,|\\x{}{}|\\x{}|\\x': { - '*': { action_: 'copy' } }, - 'else2': { - '*': { action_: 'copy' } } - }), - actions: { - 'state of aggregation': function (buffer, m) { - return { type_: 'state of aggregation subscript', p1: mhchemParser.go(m, 'o') }; - }, - 'color-output': function (buffer, m) { - return { type_: 'color', color1: m[0], color2: mhchemParser.go(m[1], 'pq') }; - } - } - }, - 'bd': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': {} }, - 'x$': { - '0': { nextState: '!f', revisit: true } }, - 'formula$': { - '0': { nextState: 'f', revisit: true } }, - 'else': { - '0': { nextState: '!f', revisit: true } }, - '-9.,9 no missing 0': { - '*': { action_: '9,9' } }, - '.': { - '*': { action_: { type_: 'insert', option: 'electron dot' } } }, - 'a-z': { - 'f': { action_: 'tex-math' } }, - 'x': { - '*': { action_: { type_: 'insert', option: 'KV x' } } }, - 'letters': { - '*': { action_: 'rm' } }, - '\'': { - '*': { action_: { type_: 'insert', option: 'prime' } } }, - '${(...)}$|$(...)$': { - '*': { action_: 'tex-math' } }, - '{(...)}': { - '*': { action_: 'text' } }, - '\\color{(...)}{(...)}1|\\color(...){(...)}2': { - '*': { action_: 'color-output' } }, - '\\color{(...)}0': { - '*': { action_: 'color0-output' } }, - '\\ce{(...)}': { - '*': { action_: 'ce' } }, - '\\,|\\x{}{}|\\x{}|\\x': { - '*': { action_: 'copy' } }, - 'else2': { - '*': { action_: 'copy' } } - }), - actions: { - 'color-output': function (buffer, m) { - return { type_: 'color', color1: m[0], color2: mhchemParser.go(m[1], 'bd') }; - } - } - }, - 'oxidation': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': {} }, - 'roman numeral': { - '*': { action_: 'roman-numeral' } }, - '${(...)}$|$(...)$': { - '*': { action_: 'tex-math' } }, - 'else': { - '*': { action_: 'copy' } } - }), - actions: { - 'roman-numeral': function (buffer, m) { return { type_: 'roman numeral', p1: m || "" }; } - } - }, - 'tex-math': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': { action_: 'output' } }, - '\\ce{(...)}': { - '*': { action_: [ 'output', 'ce' ] } }, - '{...}|\\,|\\x{}{}|\\x{}|\\x': { - '*': { action_: 'o=' } }, - 'else': { - '*': { action_: 'o=' } } - }), - actions: { - 'output': function (buffer) { - if (buffer.o) { - /** @type {ParserOutput} */ - var ret = { type_: 'tex-math', p1: buffer.o }; - for (var p in buffer) { delete buffer[p]; } - return ret; - } - } - } - }, - 'tex-math tight': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': { action_: 'output' } }, - '\\ce{(...)}': { - '*': { action_: [ 'output', 'ce' ] } }, - '{...}|\\,|\\x{}{}|\\x{}|\\x': { - '*': { action_: 'o=' } }, - '-|+': { - '*': { action_: 'tight operator' } }, - 'else': { - '*': { action_: 'o=' } } - }), - actions: { - 'tight operator': function (buffer, m) { buffer.o = (buffer.o || "") + "{"+m+"}"; }, - 'output': function (buffer) { - if (buffer.o) { - /** @type {ParserOutput} */ - var ret = { type_: 'tex-math', p1: buffer.o }; - for (var p in buffer) { delete buffer[p]; } - return ret; - } - } - } - }, - '9,9': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': {} }, - ',': { - '*': { action_: 'comma' } }, - 'else': { - '*': { action_: 'copy' } } - }), - actions: { - 'comma': function () { return { type_: 'commaDecimal' }; } - } - }, - //#endregion - // - // \pu state machines - // - //#region pu - 'pu': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': { action_: 'output' } }, - 'space$': { - '*': { action_: [ 'output', 'space' ] } }, - '{[(|)]}': { - '0|a': { action_: 'copy' } }, - '(-)(9)^(-9)': { - '0': { action_: 'number^', nextState: 'a' } }, - '(-)(9.,9)(e)(99)': { - '0': { action_: 'enumber', nextState: 'a' } }, - 'space': { - '0|a': {} }, - 'pm-operator': { - '0|a': { action_: { type_: 'operator', option: '\\pm' }, nextState: '0' } }, - 'operator': { - '0|a': { action_: 'copy', nextState: '0' } }, - '//': { - 'd': { action_: 'o=', nextState: '/' } }, - '/': { - 'd': { action_: 'o=', nextState: '/' } }, - '{...}|else': { - '0|d': { action_: 'd=', nextState: 'd' }, - 'a': { action_: [ 'space', 'd=' ], nextState: 'd' }, - '/|q': { action_: 'q=', nextState: 'q' } } - }), - actions: { - 'enumber': function (buffer, m) { - /** @type {ParserOutput[]} */ - var ret = []; - if (m[0] === "+-" || m[0] === "+/-") { - ret.push("\\pm "); - } else if (m[0]) { - ret.push(m[0]); - } - if (m[1]) { - mhchemParser.concatArray(ret, mhchemParser.go(m[1], 'pu-9,9')); - if (m[2]) { - if (m[2].match(/[,.]/)) { - mhchemParser.concatArray(ret, mhchemParser.go(m[2], 'pu-9,9')); - } else { - ret.push(m[2]); - } - } - m[3] = m[4] || m[3]; - if (m[3]) { - m[3] = m[3].trim(); - if (m[3] === "e" || m[3].substr(0, 1) === "*") { - ret.push({ type_: 'cdot' }); - } else { - ret.push({ type_: 'times' }); - } - } - } - if (m[3]) { - ret.push("10^{"+m[5]+"}"); - } - return ret; - }, - 'number^': function (buffer, m) { - /** @type {ParserOutput[]} */ - var ret = []; - if (m[0] === "+-" || m[0] === "+/-") { - ret.push("\\pm "); - } else if (m[0]) { - ret.push(m[0]); - } - mhchemParser.concatArray(ret, mhchemParser.go(m[1], 'pu-9,9')); - ret.push("^{"+m[2]+"}"); - return ret; - }, - 'operator': function (buffer, m, p1) { return { type_: 'operator', kind_: (p1 || m) }; }, - 'space': function () { return { type_: 'pu-space-1' }; }, - 'output': function (buffer) { - /** @type {ParserOutput | ParserOutput[]} */ - var ret; - var md = mhchemParser.patterns.match_('{(...)}', buffer.d || ""); - if (md && md.remainder === '') { buffer.d = md.match_; } - var mq = mhchemParser.patterns.match_('{(...)}', buffer.q || ""); - if (mq && mq.remainder === '') { buffer.q = mq.match_; } - if (buffer.d) { - buffer.d = buffer.d.replace(/\u00B0C|\^oC|\^{o}C/g, "{}^{\\circ}C"); - buffer.d = buffer.d.replace(/\u00B0F|\^oF|\^{o}F/g, "{}^{\\circ}F"); - } - if (buffer.q) { // fraction - buffer.q = buffer.q.replace(/\u00B0C|\^oC|\^{o}C/g, "{}^{\\circ}C"); - buffer.q = buffer.q.replace(/\u00B0F|\^oF|\^{o}F/g, "{}^{\\circ}F"); - var b5 = { - d: mhchemParser.go(buffer.d, 'pu'), - q: mhchemParser.go(buffer.q, 'pu') - }; - if (buffer.o === '//') { - ret = { type_: 'pu-frac', p1: b5.d, p2: b5.q }; - } else { - ret = b5.d; - if (b5.d.length > 1 || b5.q.length > 1) { - ret.push({ type_: ' / ' }); - } else { - ret.push({ type_: '/' }); - } - mhchemParser.concatArray(ret, b5.q); - } - } else { // no fraction - ret = mhchemParser.go(buffer.d, 'pu-2'); - } - for (var p in buffer) { delete buffer[p]; } - return ret; - } - } - }, - 'pu-2': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': { action_: 'output' } }, - '*': { - '*': { action_: [ 'output', 'cdot' ], nextState: '0' } }, - '\\x': { - '*': { action_: 'rm=' } }, - 'space': { - '*': { action_: [ 'output', 'space' ], nextState: '0' } }, - '^{(...)}|^(-1)': { - '1': { action_: '^(-1)' } }, - '-9.,9': { - '0': { action_: 'rm=', nextState: '0' }, - '1': { action_: '^(-1)', nextState: '0' } }, - '{...}|else': { - '*': { action_: 'rm=', nextState: '1' } } - }), - actions: { - 'cdot': function () { return { type_: 'tight cdot' }; }, - '^(-1)': function (buffer, m) { buffer.rm += "^{"+m+"}"; }, - 'space': function () { return { type_: 'pu-space-2' }; }, - 'output': function (buffer) { - /** @type {ParserOutput | ParserOutput[]} */ - var ret = []; - if (buffer.rm) { - var mrm = mhchemParser.patterns.match_('{(...)}', buffer.rm || ""); - if (mrm && mrm.remainder === '') { - ret = mhchemParser.go(mrm.match_, 'pu'); - } else { - ret = { type_: 'rm', p1: buffer.rm }; - } - } - for (var p in buffer) { delete buffer[p]; } - return ret; - } - } - }, - 'pu-9,9': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '0': { action_: 'output-0' }, - 'o': { action_: 'output-o' } }, - ',': { - '0': { action_: [ 'output-0', 'comma' ], nextState: 'o' } }, - '.': { - '0': { action_: [ 'output-0', 'copy' ], nextState: 'o' } }, - 'else': { - '*': { action_: 'text=' } } - }), - actions: { - 'comma': function () { return { type_: 'commaDecimal' }; }, - 'output-0': function (buffer) { - /** @type {ParserOutput[]} */ - var ret = []; - buffer.text_ = buffer.text_ || ""; - if (buffer.text_.length > 4) { - var a = buffer.text_.length % 3; - if (a === 0) { a = 3; } - for (var i=buffer.text_.length-3; i>0; i-=3) { - ret.push(buffer.text_.substr(i, 3)); - ret.push({ type_: '1000 separator' }); - } - ret.push(buffer.text_.substr(0, a)); - ret.reverse(); - } else { - ret.push(buffer.text_); - } - for (var p in buffer) { delete buffer[p]; } - return ret; - }, - 'output-o': function (buffer) { - /** @type {ParserOutput[]} */ - var ret = []; - buffer.text_ = buffer.text_ || ""; - if (buffer.text_.length > 4) { - var a = buffer.text_.length - 3; - for (var i=0; i, so we change \vphantom{X} to {} - // TODO: Reinstate \vphantom{X} when the Firefox bug is fixed. -// res += "{\\vphantom{X}}"; - res += "{{}}"; - res += "_{\\smash[t]{"+b5.q+"}}"; - } - } else { - if (b5.q) { - // TODO: Reinstate \vphantom{X} when the Firefox bug is fixed. -// res += "{\\vphantom{X}}"; - res += "{{}}"; - res += "_{\\smash[t]{"+b5.q+"}}"; - } - if (b5.d) { - // TODO: Reinstate \vphantom{X} when the Firefox bug is fixed. -// res += "{\\vphantom{X}}"; - res += "{{}}"; - res += "^{"+b5.d+"}"; - } - } - break; - case 'rm': - res = "\\mathrm{"+buf.p1+"}"; - break; - case 'text': - if (buf.p1.match(/[\^_]/)) { - buf.p1 = buf.p1.replace(" ", "~").replace("-", "\\text{-}"); - res = "\\mathrm{"+buf.p1+"}"; - } else { - res = "\\text{"+buf.p1+"}"; - } - break; - case 'roman numeral': - res = "\\mathrm{"+buf.p1+"}"; - break; - case 'state of aggregation': - res = "\\mskip2mu "+texify._goInner(buf.p1); - break; - case 'state of aggregation subscript': - res = "\\mskip1mu "+texify._goInner(buf.p1); - break; - case 'bond': - res = texify._getBond(buf.kind_); - if (!res) { - throw ["MhchemErrorBond", "mhchem Error. Unknown bond type (" + buf.kind_ + ")"]; - } - break; - case 'frac': - var c = "\\frac{" + buf.p1 + "}{" + buf.p2 + "}"; - res = "\\mathchoice{\\textstyle"+c+"}{"+c+"}{"+c+"}{"+c+"}"; - break; - case 'pu-frac': - var d = "\\frac{" + texify._goInner(buf.p1) + "}{" + texify._goInner(buf.p2) + "}"; - res = "\\mathchoice{\\textstyle"+d+"}{"+d+"}{"+d+"}{"+d+"}"; - break; - case 'tex-math': - res = buf.p1 + " "; - break; - case 'frac-ce': - res = "\\frac{" + texify._goInner(buf.p1) + "}{" + texify._goInner(buf.p2) + "}"; - break; - case 'overset': - res = "\\overset{" + texify._goInner(buf.p1) + "}{" + texify._goInner(buf.p2) + "}"; - break; - case 'underset': - res = "\\underset{" + texify._goInner(buf.p1) + "}{" + texify._goInner(buf.p2) + "}"; - break; - case 'underbrace': - res = "\\underbrace{" + texify._goInner(buf.p1) + "}_{" + texify._goInner(buf.p2) + "}"; - break; - case 'color': - res = "{\\color{" + buf.color1 + "}{" + texify._goInner(buf.color2) + "}}"; - break; - case 'color0': - res = "\\color{" + buf.color + "}"; - break; - case 'arrow': - var b6 = { - rd: texify._goInner(buf.rd), - rq: texify._goInner(buf.rq) - }; - var arrow = texify._getArrow(buf.r); - if (b6.rq) { arrow += "[{\\rm " + b6.rq + "}]"; } - if (b6.rd) { - arrow += "{\\rm " + b6.rd + "}"; - } else { - arrow += "{}"; - } - res = arrow; - break; - case 'operator': - res = texify._getOperator(buf.kind_); - break; - case '1st-level escape': - res = buf.p1+" "; // &, \\\\, \\hlin - break; - case 'space': - res = " "; - break; - case 'entitySkip': - res = "~"; - break; - case 'pu-space-1': - res = "~"; - break; - case 'pu-space-2': - res = "\\mkern3mu "; - break; - case '1000 separator': - res = "\\mkern2mu "; - break; - case 'commaDecimal': - res = "{,}"; - break; - case 'comma enumeration L': - res = "{"+buf.p1+"}\\mkern6mu "; - break; - case 'comma enumeration M': - res = "{"+buf.p1+"}\\mkern3mu "; - break; - case 'comma enumeration S': - res = "{"+buf.p1+"}\\mkern1mu "; - break; - case 'hyphen': - res = "\\text{-}"; - break; - case 'addition compound': - res = "\\,{\\cdot}\\,"; - break; - case 'electron dot': - res = "\\mkern1mu \\text{\\textbullet}\\mkern1mu "; - break; - case 'KV x': - res = "{\\times}"; - break; - case 'prime': - res = "\\prime "; - break; - case 'cdot': - res = "\\cdot "; - break; - case 'tight cdot': - res = "\\mkern1mu{\\cdot}\\mkern1mu "; - break; - case 'times': - res = "\\times "; - break; - case 'circa': - res = "{\\sim}"; - break; - case '^': - res = "uparrow"; - break; - case 'v': - res = "downarrow"; - break; - case 'ellipsis': - res = "\\ldots "; - break; - case '/': - res = "/"; - break; - case ' / ': - res = "\\,/\\,"; - break; - default: - assertNever(buf); - throw ["MhchemBugT", "mhchem bug T. Please report."]; // Missing texify rule or unknown MhchemParser output - } - assertString(res); - return res; - }, - _getArrow: function (a) { - switch (a) { - case "->": return "\\yields"; - case "\u2192": return "\\yields"; - case "\u27F6": return "\\yields"; - case "<-": return "\\yieldsLeft"; - case "<->": return "\\mesomerism"; - case "<-->": return "\\yieldsLeftRight"; - case "<=>": return "\\equilibrium"; - case "\u21CC": return "\\equilibrium"; - case "<=>>": return "\\equilibriumRight"; - case "<<=>": return "\\equilibriumLeft"; - default: - assertNever(a); - throw ["MhchemBugT", "mhchem bug T. Please report."]; - } - }, - _getBond: function (a) { - switch (a) { - case "-": return "{-}"; - case "1": return "{-}"; - case "=": return "{=}"; - case "2": return "{=}"; - case "#": return "{\\equiv}"; - case "3": return "{\\equiv}"; - case "~": return "{\\tripleDash}"; - case "~-": return "{\\tripleDashOverLine}"; - case "~=": return "{\\tripleDashOverDoubleLine}"; - case "~--": return "{\\tripleDashOverDoubleLine}"; - case "-~-": return "{\\tripleDashBetweenDoubleLine}"; - case "...": return "{{\\cdot}{\\cdot}{\\cdot}}"; - case "....": return "{{\\cdot}{\\cdot}{\\cdot}{\\cdot}}"; - case "->": return "{\\rightarrow}"; - case "<-": return "{\\leftarrow}"; - case "<": return "{<}"; - case ">": return "{>}"; - default: - assertNever(a); - throw ["MhchemBugT", "mhchem bug T. Please report."]; - } - }, - _getOperator: function (a) { - switch (a) { - case "+": return " {}+{} "; - case "-": return " {}-{} "; - case "=": return " {}={} "; - case "<": return " {}<{} "; - case ">": return " {}>{} "; - case "<<": return " {}\\ll{} "; - case ">>": return " {}\\gg{} "; - case "\\pm": return " {}\\pm{} "; - case "\\approx": return " {}\\approx{} "; - case "$\\approx$": return " {}\\approx{} "; - case "v": return " \\downarrow{} "; - case "(v)": return " \\downarrow{} "; - case "^": return " \\uparrow{} "; - case "(^)": return " \\uparrow{} "; - default: - assertNever(a); - throw ["MhchemBugT", "mhchem bug T. Please report."]; - } - } - }; - - // - // Helpers for code analysis - // Will show type error at calling position - // - /** @param {number} a */ - function assertNever(a) {} - /** @param {string} a */ - function assertString(a) {} - -/* eslint-disable no-undef */ - -////////////////////////////////////////////////////////////////////// -// texvc.sty - -// The texvc package contains macros available in mediawiki pages. -// We omit the functions deprecated at -// https://en.wikipedia.org/wiki/Help:Displaying_a_formula#Deprecated_syntax - -// We also omit texvc's \O, which conflicts with \text{\O} - -defineMacro("\\darr", "\\downarrow"); -defineMacro("\\dArr", "\\Downarrow"); -defineMacro("\\Darr", "\\Downarrow"); -defineMacro("\\lang", "\\langle"); -defineMacro("\\rang", "\\rangle"); -defineMacro("\\uarr", "\\uparrow"); -defineMacro("\\uArr", "\\Uparrow"); -defineMacro("\\Uarr", "\\Uparrow"); -defineMacro("\\N", "\\mathbb{N}"); -defineMacro("\\R", "\\mathbb{R}"); -defineMacro("\\Z", "\\mathbb{Z}"); -defineMacro("\\alef", "\\aleph"); -defineMacro("\\alefsym", "\\aleph"); -defineMacro("\\bull", "\\bullet"); -defineMacro("\\clubs", "\\clubsuit"); -defineMacro("\\cnums", "\\mathbb{C}"); -defineMacro("\\Complex", "\\mathbb{C}"); -defineMacro("\\Dagger", "\\ddagger"); -defineMacro("\\diamonds", "\\diamondsuit"); -defineMacro("\\empty", "\\emptyset"); -defineMacro("\\exist", "\\exists"); -defineMacro("\\harr", "\\leftrightarrow"); -defineMacro("\\hArr", "\\Leftrightarrow"); -defineMacro("\\Harr", "\\Leftrightarrow"); -defineMacro("\\hearts", "\\heartsuit"); -defineMacro("\\image", "\\Im"); -defineMacro("\\infin", "\\infty"); -defineMacro("\\isin", "\\in"); -defineMacro("\\larr", "\\leftarrow"); -defineMacro("\\lArr", "\\Leftarrow"); -defineMacro("\\Larr", "\\Leftarrow"); -defineMacro("\\lrarr", "\\leftrightarrow"); -defineMacro("\\lrArr", "\\Leftrightarrow"); -defineMacro("\\Lrarr", "\\Leftrightarrow"); -defineMacro("\\natnums", "\\mathbb{N}"); -defineMacro("\\plusmn", "\\pm"); -defineMacro("\\rarr", "\\rightarrow"); -defineMacro("\\rArr", "\\Rightarrow"); -defineMacro("\\Rarr", "\\Rightarrow"); -defineMacro("\\real", "\\Re"); -defineMacro("\\reals", "\\mathbb{R}"); -defineMacro("\\Reals", "\\mathbb{R}"); -defineMacro("\\sdot", "\\cdot"); -defineMacro("\\sect", "\\S"); -defineMacro("\\spades", "\\spadesuit"); -defineMacro("\\sub", "\\subset"); -defineMacro("\\sube", "\\subseteq"); -defineMacro("\\supe", "\\supseteq"); -defineMacro("\\thetasym", "\\vartheta"); -defineMacro("\\weierp", "\\wp"); - -/* eslint-disable no-undef */ - -/**************************************************** - * - * physics.js - * - * Implements the Physics Package for LaTeX input. - * - * --------------------------------------------------------------------- - * - * The original version of this file is licensed as follows: - * Copyright (c) 2015-2016 Kolen Cheung . - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * --------------------------------------------------------------------- - * - * This file has been revised from the original in the following ways: - * 1. The interface is changed so that it can be called from Temml, not MathJax. - * 2. \Re and \Im are not used, to avoid conflict with existing LaTeX letters. - * - * This revision of the file is released under the MIT license. - * https://mit-license.org/ - */ -defineMacro("\\quantity", "{\\left\\{ #1 \\right\\}}"); -defineMacro("\\qty", "{\\left\\{ #1 \\right\\}}"); -defineMacro("\\pqty", "{\\left( #1 \\right)}"); -defineMacro("\\bqty", "{\\left[ #1 \\right]}"); -defineMacro("\\vqty", "{\\left\\vert #1 \\right\\vert}"); -defineMacro("\\Bqty", "{\\left\\{ #1 \\right\\}}"); -defineMacro("\\absolutevalue", "{\\left\\vert #1 \\right\\vert}"); -defineMacro("\\abs", "{\\left\\vert #1 \\right\\vert}"); -defineMacro("\\norm", "{\\left\\Vert #1 \\right\\Vert}"); -defineMacro("\\evaluated", "{\\left.#1 \\right\\vert}"); -defineMacro("\\eval", "{\\left.#1 \\right\\vert}"); -defineMacro("\\order", "{\\mathcal{O} \\left( #1 \\right)}"); -defineMacro("\\commutator", "{\\left[ #1 , #2 \\right]}"); -defineMacro("\\comm", "{\\left[ #1 , #2 \\right]}"); -defineMacro("\\anticommutator", "{\\left\\{ #1 , #2 \\right\\}}"); -defineMacro("\\acomm", "{\\left\\{ #1 , #2 \\right\\}}"); -defineMacro("\\poissonbracket", "{\\left\\{ #1 , #2 \\right\\}}"); -defineMacro("\\pb", "{\\left\\{ #1 , #2 \\right\\}}"); -defineMacro("\\vectorbold", "{\\boldsymbol{ #1 }}"); -defineMacro("\\vb", "{\\boldsymbol{ #1 }}"); -defineMacro("\\vectorarrow", "{\\vec{\\boldsymbol{ #1 }}}"); -defineMacro("\\va", "{\\vec{\\boldsymbol{ #1 }}}"); -defineMacro("\\vectorunit", "{{\\boldsymbol{\\hat{ #1 }}}}"); -defineMacro("\\vu", "{{\\boldsymbol{\\hat{ #1 }}}}"); -defineMacro("\\dotproduct", "\\mathbin{\\boldsymbol\\cdot}"); -defineMacro("\\vdot", "{\\boldsymbol\\cdot}"); -defineMacro("\\crossproduct", "\\mathbin{\\boldsymbol\\times}"); -defineMacro("\\cross", "\\mathbin{\\boldsymbol\\times}"); -defineMacro("\\cp", "\\mathbin{\\boldsymbol\\times}"); -defineMacro("\\gradient", "{\\boldsymbol\\nabla}"); -defineMacro("\\grad", "{\\boldsymbol\\nabla}"); -defineMacro("\\divergence", "{\\grad\\vdot}"); -//defineMacro("\\div", "{\\grad\\vdot}"); Not included in Temml. Conflicts w/LaTeX \div -defineMacro("\\curl", "{\\grad\\cross}"); -defineMacro("\\laplacian", "\\nabla^2"); -defineMacro("\\tr", "{\\operatorname{tr}}"); -defineMacro("\\Tr", "{\\operatorname{Tr}}"); -defineMacro("\\rank", "{\\operatorname{rank}}"); -defineMacro("\\erf", "{\\operatorname{erf}}"); -defineMacro("\\Res", "{\\operatorname{Res}}"); -defineMacro("\\principalvalue", "{\\mathcal{P}}"); -defineMacro("\\pv", "{\\mathcal{P}}"); -defineMacro("\\PV", "{\\operatorname{P.V.}}"); -// Temml does not use the next two lines. They conflict with LaTeX letters. -//defineMacro("\\Re", "{\\operatorname{Re} \\left\\{ #1 \\right\\}}"); -//defineMacro("\\Im", "{\\operatorname{Im} \\left\\{ #1 \\right\\}}"); -defineMacro("\\qqtext", "{\\quad\\text{ #1 }\\quad}"); -defineMacro("\\qq", "{\\quad\\text{ #1 }\\quad}"); -defineMacro("\\qcomma", "{\\text{,}\\quad}"); -defineMacro("\\qc", "{\\text{,}\\quad}"); -defineMacro("\\qcc", "{\\quad\\text{c.c.}\\quad}"); -defineMacro("\\qif", "{\\quad\\text{if}\\quad}"); -defineMacro("\\qthen", "{\\quad\\text{then}\\quad}"); -defineMacro("\\qelse", "{\\quad\\text{else}\\quad}"); -defineMacro("\\qotherwise", "{\\quad\\text{otherwise}\\quad}"); -defineMacro("\\qunless", "{\\quad\\text{unless}\\quad}"); -defineMacro("\\qgiven", "{\\quad\\text{given}\\quad}"); -defineMacro("\\qusing", "{\\quad\\text{using}\\quad}"); -defineMacro("\\qassume", "{\\quad\\text{assume}\\quad}"); -defineMacro("\\qsince", "{\\quad\\text{since}\\quad}"); -defineMacro("\\qlet", "{\\quad\\text{let}\\quad}"); -defineMacro("\\qfor", "{\\quad\\text{for}\\quad}"); -defineMacro("\\qall", "{\\quad\\text{all}\\quad}"); -defineMacro("\\qeven", "{\\quad\\text{even}\\quad}"); -defineMacro("\\qodd", "{\\quad\\text{odd}\\quad}"); -defineMacro("\\qinteger", "{\\quad\\text{integer}\\quad}"); -defineMacro("\\qand", "{\\quad\\text{and}\\quad}"); -defineMacro("\\qor", "{\\quad\\text{or}\\quad}"); -defineMacro("\\qas", "{\\quad\\text{as}\\quad}"); -defineMacro("\\qin", "{\\quad\\text{in}\\quad}"); -defineMacro("\\differential", "{\\text{d}}"); -defineMacro("\\dd", "{\\text{d}}"); -defineMacro("\\derivative", "{\\frac{\\text{d}{ #1 }}{\\text{d}{ #2 }}}"); -defineMacro("\\dv", "{\\frac{\\text{d}{ #1 }}{\\text{d}{ #2 }}}"); -defineMacro("\\partialderivative", "{\\frac{\\partial{ #1 }}{\\partial{ #2 }}}"); -defineMacro("\\variation", "{\\delta}"); -defineMacro("\\var", "{\\delta}"); -defineMacro("\\functionalderivative", "{\\frac{\\delta{ #1 }}{\\delta{ #2 }}}"); -defineMacro("\\fdv", "{\\frac{\\delta{ #1 }}{\\delta{ #2 }}}"); -defineMacro("\\innerproduct", "{\\left\\langle {#1} \\mid { #2} \\right\\rangle}"); -defineMacro("\\outerproduct", - "{\\left\\vert { #1 } \\right\\rangle\\left\\langle { #2} \\right\\vert}"); -defineMacro("\\dyad", - "{\\left\\vert { #1 } \\right\\rangle\\left\\langle { #2} \\right\\vert}"); -defineMacro("\\ketbra", - "{\\left\\vert { #1 } \\right\\rangle\\left\\langle { #2} \\right\\vert}"); -defineMacro("\\op", - "{\\left\\vert { #1 } \\right\\rangle\\left\\langle { #2} \\right\\vert}"); -defineMacro("\\expectationvalue", "{\\left\\langle {#1 } \\right\\rangle}"); -defineMacro("\\expval", "{\\left\\langle {#1 } \\right\\rangle}"); -defineMacro("\\ev", "{\\left\\langle {#1 } \\right\\rangle}"); -defineMacro("\\matrixelement", - "{\\left\\langle{ #1 }\\right\\vert{ #2 }\\left\\vert{#3}\\right\\rangle}"); -defineMacro("\\matrixel", - "{\\left\\langle{ #1 }\\right\\vert{ #2 }\\left\\vert{#3}\\right\\rangle}"); -defineMacro("\\mel", - "{\\left\\langle{ #1 }\\right\\vert{ #2 }\\left\\vert{#3}\\right\\rangle}"); - -/** - * This file contains the “gullet” where macros are expanded - * until only non-macro tokens remain. - */ - -// List of commands that act like macros but aren't defined as a macro, -// function, or symbol. Used in `isDefined`. -const implicitCommands = { - "^": true, // Parser.js - _: true, // Parser.js - "\\limits": true, // Parser.js - "\\nolimits": true // Parser.js -}; - -class MacroExpander { - constructor(input, settings, mode) { - this.settings = settings; - this.expansionCount = 0; - this.feed(input); - // Make new global namespace - this.macros = new Namespace(macros, settings.macros); - this.mode = mode; - this.stack = []; // contains tokens in REVERSE order - } - - /** - * Feed a new input string to the same MacroExpander - * (with existing macros etc.). - */ - feed(input) { - this.lexer = new Lexer(input, this.settings); - } - - /** - * Switches between "text" and "math" modes. - */ - switchMode(newMode) { - this.mode = newMode; - } - - /** - * Start a new group nesting within all namespaces. - */ - beginGroup() { - this.macros.beginGroup(); - } - - /** - * End current group nesting within all namespaces. - */ - endGroup() { - this.macros.endGroup(); - } - - /** - * Returns the topmost token on the stack, without expanding it. - * Similar in behavior to TeX's `\futurelet`. - */ - future() { - if (this.stack.length === 0) { - this.pushToken(this.lexer.lex()); - } - return this.stack[this.stack.length - 1] - } - - /** - * Remove and return the next unexpanded token. - */ - popToken() { - this.future(); // ensure non-empty stack - return this.stack.pop(); - } - - /** - * Add a given token to the token stack. In particular, this get be used - * to put back a token returned from one of the other methods. - */ - pushToken(token) { - this.stack.push(token); - } - - /** - * Append an array of tokens to the token stack. - */ - pushTokens(tokens) { - this.stack.push(...tokens); - } - - /** - * Find an macro argument without expanding tokens and append the array of - * tokens to the token stack. Uses Token as a container for the result. - */ - scanArgument(isOptional) { - let start; - let end; - let tokens; - if (isOptional) { - this.consumeSpaces(); // \@ifnextchar gobbles any space following it - if (this.future().text !== "[") { - return null; - } - start = this.popToken(); // don't include [ in tokens - ({ tokens, end } = this.consumeArg(["]"])); - } else { - ({ tokens, start, end } = this.consumeArg()); - } - - // indicate the end of an argument - this.pushToken(new Token("EOF", end.loc)); - - this.pushTokens(tokens); - return start.range(end, ""); - } - - /** - * Consume all following space tokens, without expansion. - */ - consumeSpaces() { - for (;;) { - const token = this.future(); - if (token.text === " ") { - this.stack.pop(); - } else { - break; - } - } - } - - /** - * Consume an argument from the token stream, and return the resulting array - * of tokens and start/end token. - */ - consumeArg(delims) { - // The argument for a delimited parameter is the shortest (possibly - // empty) sequence of tokens with properly nested {...} groups that is - // followed ... by this particular list of non-parameter tokens. - // The argument for an undelimited parameter is the next nonblank - // token, unless that token is ‘{’, when the argument will be the - // entire {...} group that follows. - const tokens = []; - const isDelimited = delims && delims.length > 0; - if (!isDelimited) { - // Ignore spaces between arguments. As the TeXbook says: - // "After you have said ‘\def\row#1#2{...}’, you are allowed to - // put spaces between the arguments (e.g., ‘\row x n’), because - // TeX doesn’t use single spaces as undelimited arguments." - this.consumeSpaces(); - } - const start = this.future(); - let tok; - let depth = 0; - let match = 0; - do { - tok = this.popToken(); - tokens.push(tok); - if (tok.text === "{") { - ++depth; - } else if (tok.text === "}") { - --depth; - if (depth === -1) { - throw new ParseError("Extra }", tok); - } - } else if (tok.text === "EOF") { - throw new ParseError( - "Unexpected end of input in a macro argument" + - ", expected '" + - (delims && isDelimited ? delims[match] : "}") + - "'", - tok - ); - } - if (delims && isDelimited) { - if ((depth === 0 || (depth === 1 && delims[match] === "{")) && tok.text === delims[match]) { - ++match; - if (match === delims.length) { - // don't include delims in tokens - tokens.splice(-match, match); - break; - } - } else { - match = 0; - } - } - } while (depth !== 0 || isDelimited); - // If the argument found ... has the form ‘{}’, - // ... the outermost braces enclosing the argument are removed - if (start.text === "{" && tokens[tokens.length - 1].text === "}") { - tokens.pop(); - tokens.shift(); - } - tokens.reverse(); // to fit in with stack order - return { tokens, start, end: tok }; - } - - /** - * Consume the specified number of (delimited) arguments from the token - * stream and return the resulting array of arguments. - */ - consumeArgs(numArgs, delimiters) { - if (delimiters) { - if (delimiters.length !== numArgs + 1) { - throw new ParseError("The length of delimiters doesn't match the number of args!"); - } - const delims = delimiters[0]; - for (let i = 0; i < delims.length; i++) { - const tok = this.popToken(); - if (delims[i] !== tok.text) { - throw new ParseError("Use of the macro doesn't match its definition", tok); - } - } - } - - const args = []; - for (let i = 0; i < numArgs; i++) { - args.push(this.consumeArg(delimiters && delimiters[i + 1]).tokens); - } - return args; - } - - /** - * Expand the next token only once if possible. - * - * If the token is expanded, the resulting tokens will be pushed onto - * the stack in reverse order, and the number of such tokens will be - * returned. This number might be zero or positive. - * - * If not, the return value is `false`, and the next token remains at the - * top of the stack. - * - * In either case, the next token will be on the top of the stack, - * or the stack will be empty (in case of empty expansion - * and no other tokens). - * - * Used to implement `expandAfterFuture` and `expandNextToken`. - * - * If expandableOnly, only expandable tokens are expanded and - * an undefined control sequence results in an error. - */ - expandOnce(expandableOnly) { - const topToken = this.popToken(); - const name = topToken.text; - const expansion = !topToken.noexpand ? this._getExpansion(name) : null; - if (expansion == null || (expandableOnly && expansion.unexpandable)) { - if (expandableOnly && expansion == null && name[0] === "\\" && !this.isDefined(name)) { - throw new ParseError("Undefined control sequence: " + name); - } - this.pushToken(topToken); - return false; - } - this.expansionCount++; - if (this.expansionCount > this.settings.maxExpand) { - throw new ParseError( - "Too many expansions: infinite loop or " + "need to increase maxExpand setting" - ); - } - let tokens = expansion.tokens; - const args = this.consumeArgs(expansion.numArgs, expansion.delimiters); - if (expansion.numArgs) { - // paste arguments in place of the placeholders - tokens = tokens.slice(); // make a shallow copy - for (let i = tokens.length - 1; i >= 0; --i) { - let tok = tokens[i]; - if (tok.text === "#") { - if (i === 0) { - throw new ParseError("Incomplete placeholder at end of macro body", tok); - } - tok = tokens[--i]; // next token on stack - if (tok.text === "#") { - // ## → # - tokens.splice(i + 1, 1); // drop first # - } else if (/^[1-9]$/.test(tok.text)) { - // replace the placeholder with the indicated argument - tokens.splice(i, 2, ...args[+tok.text - 1]); - } else { - throw new ParseError("Not a valid argument number", tok); - } - } - } - } - // Concatenate expansion onto top of stack. - this.pushTokens(tokens); - return tokens.length; - } - - /** - * Expand the next token only once (if possible), and return the resulting - * top token on the stack (without removing anything from the stack). - * Similar in behavior to TeX's `\expandafter\futurelet`. - * Equivalent to expandOnce() followed by future(). - */ - expandAfterFuture() { - this.expandOnce(); - return this.future(); - } - - /** - * Recursively expand first token, then return first non-expandable token. - */ - expandNextToken() { - for (;;) { - if (this.expandOnce() === false) { // fully expanded - const token = this.stack.pop(); - // The token after \noexpand is interpreted as if its meaning were ‘\relax’ - if (token.treatAsRelax) { - token.text = "\\relax"; - } - return token - } - } - - // This pathway is impossible. - throw new Error(); // eslint-disable-line no-unreachable - } - - /** - * Fully expand the given macro name and return the resulting list of - * tokens, or return `undefined` if no such macro is defined. - */ - expandMacro(name) { - return this.macros.has(name) ? this.expandTokens([new Token(name)]) : undefined; - } - - /** - * Fully expand the given token stream and return the resulting list of - * tokens. Note that the input tokens are in reverse order, but the - * output tokens are in forward order. - */ - expandTokens(tokens) { - const output = []; - const oldStackLength = this.stack.length; - this.pushTokens(tokens); - while (this.stack.length > oldStackLength) { - // Expand only expandable tokens - if (this.expandOnce(true) === false) { // fully expanded - const token = this.stack.pop(); - if (token.treatAsRelax) { - // the expansion of \noexpand is the token itself - token.noexpand = false; - token.treatAsRelax = false; - } - output.push(token); - } - } - return output; - } - - /** - * Fully expand the given macro name and return the result as a string, - * or return `undefined` if no such macro is defined. - */ - expandMacroAsText(name) { - const tokens = this.expandMacro(name); - if (tokens) { - return tokens.map((token) => token.text).join(""); - } else { - return tokens; - } - } - - /** - * Returns the expanded macro as a reversed array of tokens and a macro - * argument count. Or returns `null` if no such macro. - */ - _getExpansion(name) { - const definition = this.macros.get(name); - if (definition == null) { - // mainly checking for undefined here - return definition; - } - // If a single character has an associated catcode other than 13 - // (active character), then don't expand it. - if (name.length === 1) { - const catcode = this.lexer.catcodes[name]; - if (catcode != null && catcode !== 13) { - return - } - } - const expansion = typeof definition === "function" ? definition(this) : definition; - if (typeof expansion === "string") { - let numArgs = 0; - if (expansion.indexOf("#") !== -1) { - const stripped = expansion.replace(/##/g, ""); - while (stripped.indexOf("#" + (numArgs + 1)) !== -1) { - ++numArgs; - } - } - const bodyLexer = new Lexer(expansion, this.settings); - const tokens = []; - let tok = bodyLexer.lex(); - while (tok.text !== "EOF") { - tokens.push(tok); - tok = bodyLexer.lex(); - } - tokens.reverse(); // to fit in with stack using push and pop - const expanded = { tokens, numArgs }; - return expanded; - } - - return expansion; - } - - /** - * Determine whether a command is currently "defined" (has some - * functionality), meaning that it's a macro (in the current group), - * a function, a symbol, or one of the special commands listed in - * `implicitCommands`. - */ - isDefined(name) { - return ( - this.macros.has(name) || - Object.prototype.hasOwnProperty.call(functions, name ) || - Object.prototype.hasOwnProperty.call(symbols.math, name ) || - Object.prototype.hasOwnProperty.call(symbols.text, name ) || - Object.prototype.hasOwnProperty.call(implicitCommands, name ) - ); - } - - /** - * Determine whether a command is expandable. - */ - isExpandable(name) { - const macro = this.macros.get(name); - return macro != null - ? typeof macro === "string" || typeof macro === "function" || !macro.unexpandable - : Object.prototype.hasOwnProperty.call(functions, name ) && !functions[name].primitive; - } -} - -// Helpers for Parser.js handling of Unicode (sub|super)script characters. - -const unicodeSubRegEx = /^[₊₋₌₍₎₀₁₂₃₄₅₆₇₈₉ₐₑₕᵢⱼₖₗₘₙₒₚᵣₛₜᵤᵥₓᵦᵧᵨᵩᵪ]/; - -const uSubsAndSups = Object.freeze({ - '₊': '+', - '₋': '-', - '₌': '=', - '₍': '(', - '₎': ')', - '₀': '0', - '₁': '1', - '₂': '2', - '₃': '3', - '₄': '4', - '₅': '5', - '₆': '6', - '₇': '7', - '₈': '8', - '₉': '9', - '\u2090': 'a', - '\u2091': 'e', - '\u2095': 'h', - '\u1D62': 'i', - '\u2C7C': 'j', - '\u2096': 'k', - '\u2097': 'l', - '\u2098': 'm', - '\u2099': 'n', - '\u2092': 'o', - '\u209A': 'p', - '\u1D63': 'r', - '\u209B': 's', - '\u209C': 't', - '\u1D64': 'u', - '\u1D65': 'v', - '\u2093': 'x', - '\u1D66': 'β', - '\u1D67': 'γ', - '\u1D68': 'ρ', - '\u1D69': '\u03d5', - '\u1D6A': 'χ', - '⁺': '+', - '⁻': '-', - '⁼': '=', - '⁽': '(', - '⁾': ')', - '⁰': '0', - '¹': '1', - '²': '2', - '³': '3', - '⁴': '4', - '⁵': '5', - '⁶': '6', - '⁷': '7', - '⁸': '8', - '⁹': '9', - '\u1D2C': 'A', - '\u1D2E': 'B', - '\u1D30': 'D', - '\u1D31': 'E', - '\u1D33': 'G', - '\u1D34': 'H', - '\u1D35': 'I', - '\u1D36': 'J', - '\u1D37': 'K', - '\u1D38': 'L', - '\u1D39': 'M', - '\u1D3A': 'N', - '\u1D3C': 'O', - '\u1D3E': 'P', - '\u1D3F': 'R', - '\u1D40': 'T', - '\u1D41': 'U', - '\u2C7D': 'V', - '\u1D42': 'W', - '\u1D43': 'a', - '\u1D47': 'b', - '\u1D9C': 'c', - '\u1D48': 'd', - '\u1D49': 'e', - '\u1DA0': 'f', - '\u1D4D': 'g', - '\u02B0': 'h', - '\u2071': 'i', - '\u02B2': 'j', - '\u1D4F': 'k', - '\u02E1': 'l', - '\u1D50': 'm', - '\u207F': 'n', - '\u1D52': 'o', - '\u1D56': 'p', - '\u02B3': 'r', - '\u02E2': 's', - '\u1D57': 't', - '\u1D58': 'u', - '\u1D5B': 'v', - '\u02B7': 'w', - '\u02E3': 'x', - '\u02B8': 'y', - '\u1DBB': 'z', - '\u1D5D': 'β', - '\u1D5E': 'γ', - '\u1D5F': 'δ', - '\u1D60': '\u03d5', - '\u1D61': 'χ', - '\u1DBF': 'θ' -}); - -// Used for Unicode input of calligraphic and script letters -const asciiFromScript = Object.freeze({ - "\ud835\udc9c": "A", - "\u212c": "B", - "\ud835\udc9e": "C", - "\ud835\udc9f": "D", - "\u2130": "E", - "\u2131": "F", - "\ud835\udca2": "G", - "\u210B": "H", - "\u2110": "I", - "\ud835\udca5": "J", - "\ud835\udca6": "K", - "\u2112": "L", - "\u2133": "M", - "\ud835\udca9": "N", - "\ud835\udcaa": "O", - "\ud835\udcab": "P", - "\ud835\udcac": "Q", - "\u211B": "R", - "\ud835\udcae": "S", - "\ud835\udcaf": "T", - "\ud835\udcb0": "U", - "\ud835\udcb1": "V", - "\ud835\udcb2": "W", - "\ud835\udcb3": "X", - "\ud835\udcb4": "Y", - "\ud835\udcb5": "Z" -}); - -// Mapping of Unicode accent characters to their LaTeX equivalent in text and -// math mode (when they exist). -var unicodeAccents = { - "\u0301": { text: "\\'", math: "\\acute" }, - "\u0300": { text: "\\`", math: "\\grave" }, - "\u0308": { text: '\\"', math: "\\ddot" }, - "\u0303": { text: "\\~", math: "\\tilde" }, - "\u0304": { text: "\\=", math: "\\bar" }, - "\u0306": { text: "\\u", math: "\\breve" }, - "\u030c": { text: "\\v", math: "\\check" }, - "\u0302": { text: "\\^", math: "\\hat" }, - "\u0307": { text: "\\.", math: "\\dot" }, - "\u030a": { text: "\\r", math: "\\mathring" }, - "\u030b": { text: "\\H" }, - '\u0327': { text: '\\c' } -}; - -var unicodeSymbols = { - "á": "á", - "à": "à", - "ä": "ä", - "ǟ": "ǟ", - "ã": "ã", - "ā": "ā", - "ă": "ă", - "ắ": "ắ", - "ằ": "ằ", - "ẵ": "ẵ", - "ǎ": "ǎ", - "â": "â", - "ấ": "ấ", - "ầ": "ầ", - "ẫ": "ẫ", - "ȧ": "ȧ", - "ǡ": "ǡ", - "å": "å", - "ǻ": "ǻ", - "ḃ": "ḃ", - "ć": "ć", - "č": "č", - "ĉ": "ĉ", - "ċ": "ċ", - "ď": "ď", - "ḋ": "ḋ", - "é": "é", - "è": "è", - "ë": "ë", - "ẽ": "ẽ", - "ē": "ē", - "ḗ": "ḗ", - "ḕ": "ḕ", - "ĕ": "ĕ", - "ě": "ě", - "ê": "ê", - "ế": "ế", - "ề": "ề", - "ễ": "ễ", - "ė": "ė", - "ḟ": "ḟ", - "ǵ": "ǵ", - "ḡ": "ḡ", - "ğ": "ğ", - "ǧ": "ǧ", - "ĝ": "ĝ", - "ġ": "ġ", - "ḧ": "ḧ", - "ȟ": "ȟ", - "ĥ": "ĥ", - "ḣ": "ḣ", - "í": "í", - "ì": "ì", - "ï": "ï", - "ḯ": "ḯ", - "ĩ": "ĩ", - "ī": "ī", - "ĭ": "ĭ", - "ǐ": "ǐ", - "î": "î", - "ǰ": "ǰ", - "ĵ": "ĵ", - "ḱ": "ḱ", - "ǩ": "ǩ", - "ĺ": "ĺ", - "ľ": "ľ", - "ḿ": "ḿ", - "ṁ": "ṁ", - "ń": "ń", - "ǹ": "ǹ", - "ñ": "ñ", - "ň": "ň", - "ṅ": "ṅ", - "ó": "ó", - "ò": "ò", - "ö": "ö", - "ȫ": "ȫ", - "õ": "õ", - "ṍ": "ṍ", - "ṏ": "ṏ", - "ȭ": "ȭ", - "ō": "ō", - "ṓ": "ṓ", - "ṑ": "ṑ", - "ŏ": "ŏ", - "ǒ": "ǒ", - "ô": "ô", - "ố": "ố", - "ồ": "ồ", - "ỗ": "ỗ", - "ȯ": "ȯ", - "ȱ": "ȱ", - "ő": "ő", - "ṕ": "ṕ", - "ṗ": "ṗ", - "ŕ": "ŕ", - "ř": "ř", - "ṙ": "ṙ", - "ś": "ś", - "ṥ": "ṥ", - "š": "š", - "ṧ": "ṧ", - "ŝ": "ŝ", - "ṡ": "ṡ", - "ẗ": "ẗ", - "ť": "ť", - "ṫ": "ṫ", - "ú": "ú", - "ù": "ù", - "ü": "ü", - "ǘ": "ǘ", - "ǜ": "ǜ", - "ǖ": "ǖ", - "ǚ": "ǚ", - "ũ": "ũ", - "ṹ": "ṹ", - "ū": "ū", - "ṻ": "ṻ", - "ŭ": "ŭ", - "ǔ": "ǔ", - "û": "û", - "ů": "ů", - "ű": "ű", - "ṽ": "ṽ", - "ẃ": "ẃ", - "ẁ": "ẁ", - "ẅ": "ẅ", - "ŵ": "ŵ", - "ẇ": "ẇ", - "ẘ": "ẘ", - "ẍ": "ẍ", - "ẋ": "ẋ", - "ý": "ý", - "ỳ": "ỳ", - "ÿ": "ÿ", - "ỹ": "ỹ", - "ȳ": "ȳ", - "ŷ": "ŷ", - "ẏ": "ẏ", - "ẙ": "ẙ", - "ź": "ź", - "ž": "ž", - "ẑ": "ẑ", - "ż": "ż", - "Á": "Á", - "À": "À", - "Ä": "Ä", - "Ǟ": "Ǟ", - "Ã": "Ã", - "Ā": "Ā", - "Ă": "Ă", - "Ắ": "Ắ", - "Ằ": "Ằ", - "Ẵ": "Ẵ", - "Ǎ": "Ǎ", - "Â": "Â", - "Ấ": "Ấ", - "Ầ": "Ầ", - "Ẫ": "Ẫ", - "Ȧ": "Ȧ", - "Ǡ": "Ǡ", - "Å": "Å", - "Ǻ": "Ǻ", - "Ḃ": "Ḃ", - "Ć": "Ć", - "Č": "Č", - "Ĉ": "Ĉ", - "Ċ": "Ċ", - "Ď": "Ď", - "Ḋ": "Ḋ", - "É": "É", - "È": "È", - "Ë": "Ë", - "Ẽ": "Ẽ", - "Ē": "Ē", - "Ḗ": "Ḗ", - "Ḕ": "Ḕ", - "Ĕ": "Ĕ", - "Ě": "Ě", - "Ê": "Ê", - "Ế": "Ế", - "Ề": "Ề", - "Ễ": "Ễ", - "Ė": "Ė", - "Ḟ": "Ḟ", - "Ǵ": "Ǵ", - "Ḡ": "Ḡ", - "Ğ": "Ğ", - "Ǧ": "Ǧ", - "Ĝ": "Ĝ", - "Ġ": "Ġ", - "Ḧ": "Ḧ", - "Ȟ": "Ȟ", - "Ĥ": "Ĥ", - "Ḣ": "Ḣ", - "Í": "Í", - "Ì": "Ì", - "Ï": "Ï", - "Ḯ": "Ḯ", - "Ĩ": "Ĩ", - "Ī": "Ī", - "Ĭ": "Ĭ", - "Ǐ": "Ǐ", - "Î": "Î", - "İ": "İ", - "Ĵ": "Ĵ", - "Ḱ": "Ḱ", - "Ǩ": "Ǩ", - "Ĺ": "Ĺ", - "Ľ": "Ľ", - "Ḿ": "Ḿ", - "Ṁ": "Ṁ", - "Ń": "Ń", - "Ǹ": "Ǹ", - "Ñ": "Ñ", - "Ň": "Ň", - "Ṅ": "Ṅ", - "Ó": "Ó", - "Ò": "Ò", - "Ö": "Ö", - "Ȫ": "Ȫ", - "Õ": "Õ", - "Ṍ": "Ṍ", - "Ṏ": "Ṏ", - "Ȭ": "Ȭ", - "Ō": "Ō", - "Ṓ": "Ṓ", - "Ṑ": "Ṑ", - "Ŏ": "Ŏ", - "Ǒ": "Ǒ", - "Ô": "Ô", - "Ố": "Ố", - "Ồ": "Ồ", - "Ỗ": "Ỗ", - "Ȯ": "Ȯ", - "Ȱ": "Ȱ", - "Ő": "Ő", - "Ṕ": "Ṕ", - "Ṗ": "Ṗ", - "Ŕ": "Ŕ", - "Ř": "Ř", - "Ṙ": "Ṙ", - "Ś": "Ś", - "Ṥ": "Ṥ", - "Š": "Š", - "Ṧ": "Ṧ", - "Ŝ": "Ŝ", - "Ṡ": "Ṡ", - "Ť": "Ť", - "Ṫ": "Ṫ", - "Ú": "Ú", - "Ù": "Ù", - "Ü": "Ü", - "Ǘ": "Ǘ", - "Ǜ": "Ǜ", - "Ǖ": "Ǖ", - "Ǚ": "Ǚ", - "Ũ": "Ũ", - "Ṹ": "Ṹ", - "Ū": "Ū", - "Ṻ": "Ṻ", - "Ŭ": "Ŭ", - "Ǔ": "Ǔ", - "Û": "Û", - "Ů": "Ů", - "Ű": "Ű", - "Ṽ": "Ṽ", - "Ẃ": "Ẃ", - "Ẁ": "Ẁ", - "Ẅ": "Ẅ", - "Ŵ": "Ŵ", - "Ẇ": "Ẇ", - "Ẍ": "Ẍ", - "Ẋ": "Ẋ", - "Ý": "Ý", - "Ỳ": "Ỳ", - "Ÿ": "Ÿ", - "Ỹ": "Ỹ", - "Ȳ": "Ȳ", - "Ŷ": "Ŷ", - "Ẏ": "Ẏ", - "Ź": "Ź", - "Ž": "Ž", - "Ẑ": "Ẑ", - "Ż": "Ż", - "ά": "ά", - "ὰ": "ὰ", - "ᾱ": "ᾱ", - "ᾰ": "ᾰ", - "έ": "έ", - "ὲ": "ὲ", - "ή": "ή", - "ὴ": "ὴ", - "ί": "ί", - "ὶ": "ὶ", - "ϊ": "ϊ", - "ΐ": "ΐ", - "ῒ": "ῒ", - "ῑ": "ῑ", - "ῐ": "ῐ", - "ό": "ό", - "ὸ": "ὸ", - "ύ": "ύ", - "ὺ": "ὺ", - "ϋ": "ϋ", - "ΰ": "ΰ", - "ῢ": "ῢ", - "ῡ": "ῡ", - "ῠ": "ῠ", - "ώ": "ώ", - "ὼ": "ὼ", - "Ύ": "Ύ", - "Ὺ": "Ὺ", - "Ϋ": "Ϋ", - "Ῡ": "Ῡ", - "Ῠ": "Ῠ", - "Ώ": "Ώ", - "Ὼ": "Ὼ" -}; - -/* eslint no-constant-condition:0 */ - -const binLeftCancellers = ["bin", "op", "open", "punct", "rel"]; - -/** - * This file contains the parser used to parse out a TeX expression from the - * input. Since TeX isn't context-free, standard parsers don't work particularly - * well. - * - * The strategy of this parser is as such: - * - * The main functions (the `.parse...` ones) take a position in the current - * parse string to parse tokens from. The lexer (found in Lexer.js, stored at - * this.gullet.lexer) also supports pulling out tokens at arbitrary places. When - * individual tokens are needed at a position, the lexer is called to pull out a - * token, which is then used. - * - * The parser has a property called "mode" indicating the mode that - * the parser is currently in. Currently it has to be one of "math" or - * "text", which denotes whether the current environment is a math-y - * one or a text-y one (e.g. inside \text). Currently, this serves to - * limit the functions which can be used in text mode. - * - * The main functions then return an object which contains the useful data that - * was parsed at its given point, and a new position at the end of the parsed - * data. The main functions can call each other and continue the parsing by - * using the returned position as a new starting point. - * - * There are also extra `.handle...` functions, which pull out some reused - * functionality into self-contained functions. - * - * The functions return ParseNodes. - */ - -class Parser { - constructor(input, settings, isPreamble = false) { - // Start in math mode - this.mode = "math"; - // Create a new macro expander (gullet) and (indirectly via that) also a - // new lexer (mouth) for this parser (stomach, in the language of TeX) - this.gullet = new MacroExpander(input, settings, this.mode); - // Store the settings for use in parsing - this.settings = settings; - // Are we defining a preamble? - this.isPreamble = isPreamble; - // Count leftright depth (for \middle errors) - this.leftrightDepth = 0; - this.prevAtomType = ""; - } - - /** - * Checks a result to make sure it has the right type, and throws an - * appropriate error otherwise. - */ - expect(text, consume = true) { - if (this.fetch().text !== text) { - throw new ParseError(`Expected '${text}', got '${this.fetch().text}'`, this.fetch()); - } - if (consume) { - this.consume(); - } - } - - /** - * Discards the current lookahead token, considering it consumed. - */ - consume() { - this.nextToken = null; - } - - /** - * Return the current lookahead token, or if there isn't one (at the - * beginning, or if the previous lookahead token was consume()d), - * fetch the next token as the new lookahead token and return it. - */ - fetch() { - if (this.nextToken == null) { - this.nextToken = this.gullet.expandNextToken(); - } - return this.nextToken; - } - - /** - * Switches between "text" and "math" modes. - */ - switchMode(newMode) { - this.mode = newMode; - this.gullet.switchMode(newMode); - } - - /** - * Main parsing function, which parses an entire input. - */ - parse() { - // Create a group namespace for every $...$, $$...$$, \[...\].) - // A \def is then valid only within that pair of delimiters. - this.gullet.beginGroup(); - - if (this.settings.colorIsTextColor) { - // Use old \color behavior (same as LaTeX's \textcolor) if requested. - // We do this within the group for the math expression, so it doesn't - // pollute settings.macros. - this.gullet.macros.set("\\color", "\\textcolor"); - } - - // Try to parse the input - const parse = this.parseExpression(false); - - // If we succeeded, make sure there's an EOF at the end - this.expect("EOF"); - - if (this.isPreamble) { - const macros = Object.create(null); - Object.entries(this.gullet.macros.current).forEach(([key, value]) => { - macros[key] = value; - }); - this.gullet.endGroup(); - return macros - } - - // The only local macro that we want to save is from \tag. - const tag = this.gullet.macros.get("\\df@tag"); - - // End the group namespace for the expression - this.gullet.endGroup(); - - if (tag) { this.gullet.macros.current["\\df@tag"] = tag; } - - return parse; - } - - static get endOfExpression() { - return ["}", "\\endgroup", "\\end", "\\right", "\\endtoggle", "&"]; - } - - /** - * Fully parse a separate sequence of tokens as a separate job. - * Tokens should be specified in reverse order, as in a MacroDefinition. - */ - subparse(tokens) { - // Save the next token from the current job. - const oldToken = this.nextToken; - this.consume(); - - // Run the new job, terminating it with an excess '}' - this.gullet.pushToken(new Token("}")); - this.gullet.pushTokens(tokens); - const parse = this.parseExpression(false); - this.expect("}"); - - // Restore the next token from the current job. - this.nextToken = oldToken; - - return parse; - } - -/** - * Parses an "expression", which is a list of atoms. - * - * `breakOnInfix`: Should the parsing stop when we hit infix nodes? This - * happens when functions have higher precedence han infix - * nodes in implicit parses. - * - * `breakOnTokenText`: The text of the token that the expression should end - * with, or `null` if something else should end the - * expression. - * - * `breakOnMiddle`: \color, \over, and old styling functions work on an implicit group. - * These groups end just before the usual tokens, but they also - * end just before `\middle`. - */ - parseExpression(breakOnInfix, breakOnTokenText, breakOnMiddle) { - const body = []; - // Keep adding atoms to the body until we can't parse any more atoms (either - // we reached the end, a }, or a \right) - while (true) { - // Ignore spaces in math mode - if (this.mode === "math") { - this.consumeSpaces(); - } - const lex = this.fetch(); - if (Parser.endOfExpression.indexOf(lex.text) !== -1) { - break; - } - if (breakOnTokenText && lex.text === breakOnTokenText) { - break; - } - if (breakOnMiddle && lex.text === "\\middle") { - break - } - if (breakOnInfix && functions[lex.text] && functions[lex.text].infix) { - break; - } - const atom = this.parseAtom(breakOnTokenText); - if (!atom) { - break; - } else if (atom.type === "internal") { - continue; - } - body.push(atom); - // Keep a record of the atom type, so that op.js can set correct spacing. - this.prevAtomType = atom.type === "atom" ? atom.family : atom.type; - } - if (this.mode === "text") { - this.formLigatures(body); - } - return this.handleInfixNodes(body); - } - - /** - * Rewrites infix operators such as \over with corresponding commands such - * as \frac. - * - * There can only be one infix operator per group. If there's more than one - * then the expression is ambiguous. This can be resolved by adding {}. - */ - handleInfixNodes(body) { - let overIndex = -1; - let funcName; - - for (let i = 0; i < body.length; i++) { - if (body[i].type === "infix") { - if (overIndex !== -1) { - throw new ParseError("only one infix operator per group", body[i].token); - } - overIndex = i; - funcName = body[i].replaceWith; - } - } - - if (overIndex !== -1 && funcName) { - let numerNode; - let denomNode; - - const numerBody = body.slice(0, overIndex); - const denomBody = body.slice(overIndex + 1); - - if (numerBody.length === 1 && numerBody[0].type === "ordgroup") { - numerNode = numerBody[0]; - } else { - numerNode = { type: "ordgroup", mode: this.mode, body: numerBody }; - } - - if (denomBody.length === 1 && denomBody[0].type === "ordgroup") { - denomNode = denomBody[0]; - } else { - denomNode = { type: "ordgroup", mode: this.mode, body: denomBody }; - } - - let node; - if (funcName === "\\\\abovefrac") { - node = this.callFunction(funcName, [numerNode, body[overIndex], denomNode], []); - } else { - node = this.callFunction(funcName, [numerNode, denomNode], []); - } - return [node]; - } else { - return body; - } - } - - /** - * Handle a subscript or superscript with nice errors. - */ - handleSupSubscript( - name // For error reporting. - ) { - const symbolToken = this.fetch(); - const symbol = symbolToken.text; - this.consume(); - this.consumeSpaces(); // ignore spaces before sup/subscript argument - const group = this.parseGroup(name); - - if (!group) { - throw new ParseError("Expected group after '" + symbol + "'", symbolToken); - } - - return group; - } - - /** - * Converts the textual input of an unsupported command into a text node - * contained within a color node whose color is determined by errorColor - */ - formatUnsupportedCmd(text) { - const textordArray = []; - - for (let i = 0; i < text.length; i++) { - textordArray.push({ type: "textord", mode: "text", text: text[i] }); - } - - const textNode = { - type: "text", - mode: this.mode, - body: textordArray - }; - - const colorNode = { - type: "color", - mode: this.mode, - color: this.settings.errorColor, - body: [textNode] - }; - - return colorNode; - } - - /** - * Parses a group with optional super/subscripts. - */ - parseAtom(breakOnTokenText) { - // The body of an atom is an implicit group, so that things like - // \left(x\right)^2 work correctly. - const base = this.parseGroup("atom", breakOnTokenText); - - // In text mode, we don't have superscripts or subscripts - if (this.mode === "text") { - return base; - } - - // Note that base may be empty (i.e. null) at this point. - - let superscript; - let subscript; - while (true) { - // Guaranteed in math mode, so eat any spaces first. - this.consumeSpaces(); - - // Lex the first token - const lex = this.fetch(); - - if (lex.text === "\\limits" || lex.text === "\\nolimits") { - // We got a limit control - if (base && base.type === "op") { - const limits = lex.text === "\\limits"; - base.limits = limits; - base.alwaysHandleSupSub = true; - } else if (base && base.type === "operatorname") { - if (base.alwaysHandleSupSub) { - base.limits = lex.text === "\\limits"; - } - } else { - throw new ParseError("Limit controls must follow a math operator", lex); - } - this.consume(); - } else if (lex.text === "^") { - // We got a superscript start - if (superscript) { - throw new ParseError("Double superscript", lex); - } - superscript = this.handleSupSubscript("superscript"); - } else if (lex.text === "_") { - // We got a subscript start - if (subscript) { - throw new ParseError("Double subscript", lex); - } - subscript = this.handleSupSubscript("subscript"); - } else if (lex.text === "'") { - // We got a prime - if (superscript) { - throw new ParseError("Double superscript", lex); - } - const prime = { type: "textord", mode: this.mode, text: "\\prime" }; - - // Many primes can be grouped together, so we handle this here - const primes = [prime]; - this.consume(); - // Keep lexing tokens until we get something that's not a prime - while (this.fetch().text === "'") { - // For each one, add another prime to the list - primes.push(prime); - this.consume(); - } - // If there's a superscript following the primes, combine that - // superscript in with the primes. - if (this.fetch().text === "^") { - primes.push(this.handleSupSubscript("superscript")); - } - // Put everything into an ordgroup as the superscript - superscript = { type: "ordgroup", mode: this.mode, body: primes }; - } else if (uSubsAndSups[lex.text]) { - // A Unicode subscript or superscript character. - // We treat these similarly to the unicode-math package. - // So we render a string of Unicode (sub|super)scripts the - // same as a (sub|super)script of regular characters. - const isSub = unicodeSubRegEx.test(lex.text); - const subsupTokens = []; - subsupTokens.push(new Token(uSubsAndSups[lex.text])); - this.consume(); - // Continue fetching tokens to fill out the group. - while (true) { - const token = this.fetch().text; - if (!(uSubsAndSups[token])) { break } - if (unicodeSubRegEx.test(token) !== isSub) { break } - subsupTokens.unshift(new Token(uSubsAndSups[token])); - this.consume(); - } - // Now create a (sub|super)script. - const body = this.subparse(subsupTokens); - if (isSub) { - subscript = { type: "ordgroup", mode: "math", body }; - } else { - superscript = { type: "ordgroup", mode: "math", body }; - } - } else { - // If it wasn't ^, _, a Unicode (sub|super)script, or ', stop parsing super/subscripts - break; - } - } - - if (superscript || subscript) { - if (base && base.type === "multiscript" && !base.postscripts) { - // base is the result of a \prescript function. - // Write the sub- & superscripts into the multiscript element. - base.postscripts = { sup: superscript, sub: subscript }; - return base - } else { - // We got either a superscript or subscript, create a supsub - const isFollowedByDelimiter = (!base || base.type !== "op" && base.type !== "operatorname") - ? undefined - : isDelimiter(this.nextToken.text); - return { - type: "supsub", - mode: this.mode, - base: base, - sup: superscript, - sub: subscript, - isFollowedByDelimiter - } - } - } else { - // Otherwise return the original body - return base; - } - } - - /** - * Parses an entire function, including its base and all of its arguments. - */ - parseFunction( - breakOnTokenText, - name // For determining its context - ) { - const token = this.fetch(); - const func = token.text; - const funcData = functions[func]; - if (!funcData) { - return null; - } - this.consume(); // consume command token - - if (name && name !== "atom" && !funcData.allowedInArgument) { - throw new ParseError( - "Got function '" + func + "' with no arguments" + (name ? " as " + name : ""), - token - ); - } else if (this.mode === "text" && !funcData.allowedInText) { - throw new ParseError("Can't use function '" + func + "' in text mode", token); - } else if (this.mode === "math" && funcData.allowedInMath === false) { - throw new ParseError("Can't use function '" + func + "' in math mode", token); - } - - const prevAtomType = this.prevAtomType; - const { args, optArgs } = this.parseArguments(func, funcData); - this.prevAtomType = prevAtomType; - return this.callFunction(func, args, optArgs, token, breakOnTokenText); - } - - /** - * Call a function handler with a suitable context and arguments. - */ - callFunction(name, args, optArgs, token, breakOnTokenText) { - const context = { - funcName: name, - parser: this, - token, - breakOnTokenText - }; - const func = functions[name]; - if (func && func.handler) { - return func.handler(context, args, optArgs); - } else { - throw new ParseError(`No function handler for ${name}`); - } - } - - /** - * Parses the arguments of a function or environment - */ - parseArguments( - func, // Should look like "\name" or "\begin{name}". - funcData - ) { - const totalArgs = funcData.numArgs + funcData.numOptionalArgs; - if (totalArgs === 0) { - return { args: [], optArgs: [] }; - } - - const args = []; - const optArgs = []; - - for (let i = 0; i < totalArgs; i++) { - let argType = funcData.argTypes && funcData.argTypes[i]; - const isOptional = i < funcData.numOptionalArgs; - - if ( - (funcData.primitive && argType == null) || - // \sqrt expands into primitive if optional argument doesn't exist - (funcData.type === "sqrt" && i === 1 && optArgs[0] == null) - ) { - argType = "primitive"; - } - - const arg = this.parseGroupOfType(`argument to '${func}'`, argType, isOptional); - if (isOptional) { - optArgs.push(arg); - } else if (arg != null) { - args.push(arg); - } else { - // should be unreachable - throw new ParseError("Null argument, please report this as a bug"); - } - } - - return { args, optArgs }; - } - - /** - * Parses a group when the mode is changing. - */ - parseGroupOfType(name, type, optional) { - switch (type) { - case "size": - return this.parseSizeGroup(optional); - case "url": - return this.parseUrlGroup(optional); - case "math": - case "text": - return this.parseArgumentGroup(optional, type); - case "hbox": { - // hbox argument type wraps the argument in the equivalent of - // \hbox, which is like \text but switching to \textstyle size. - const group = this.parseArgumentGroup(optional, "text"); - return group != null - ? { - type: "styling", - mode: group.mode, - body: [group], - scriptLevel: "text" // simulate \textstyle - } - : null; - } - case "raw": { - const token = this.parseStringGroup("raw", optional); - return token != null - ? { - type: "raw", - mode: "text", - string: token.text - } - : null; - } - case "primitive": { - if (optional) { - throw new ParseError("A primitive argument cannot be optional"); - } - const group = this.parseGroup(name); - if (group == null) { - throw new ParseError("Expected group as " + name, this.fetch()); - } - return group; - } - case "original": - case null: - case undefined: - return this.parseArgumentGroup(optional); - default: - throw new ParseError("Unknown group type as " + name, this.fetch()); - } - } - - /** - * Discard any space tokens, fetching the next non-space token. - */ - consumeSpaces() { - while (true) { - const ch = this.fetch().text; - // \ufe0e is the Unicode variation selector to supress emoji. Ignore it. - if (ch === " " || ch === "\u00a0" || ch === "\ufe0e") { - this.consume(); - } else { - break - } - } - } - - /** - * Parses a group, essentially returning the string formed by the - * brace-enclosed tokens plus some position information. - */ - parseStringGroup( - modeName, // Used to describe the mode in error messages. - optional - ) { - const argToken = this.gullet.scanArgument(optional); - if (argToken == null) { - return null; - } - let str = ""; - let nextToken; - while ((nextToken = this.fetch()).text !== "EOF") { - str += nextToken.text; - this.consume(); - } - this.consume(); // consume the end of the argument - argToken.text = str; - return argToken; - } - - /** - * Parses a regex-delimited group: the largest sequence of tokens - * whose concatenated strings match `regex`. Returns the string - * formed by the tokens plus some position information. - */ - parseRegexGroup( - regex, - modeName // Used to describe the mode in error messages. - ) { - const firstToken = this.fetch(); - let lastToken = firstToken; - let str = ""; - let nextToken; - while ((nextToken = this.fetch()).text !== "EOF" && regex.test(str + nextToken.text)) { - lastToken = nextToken; - str += lastToken.text; - this.consume(); - } - if (str === "") { - throw new ParseError("Invalid " + modeName + ": '" + firstToken.text + "'", firstToken); - } - return firstToken.range(lastToken, str); - } - - /** - * Parses a size specification, consisting of magnitude and unit. - */ - parseSizeGroup(optional) { - let res; - let isBlank = false; - // don't expand before parseStringGroup - this.gullet.consumeSpaces(); - if (!optional && this.gullet.future().text !== "{") { - res = this.parseRegexGroup(/^[-+]? *(?:$|\d+|\d+\.\d*|\.\d*) *[a-z]{0,2} *$/, "size"); - } else { - res = this.parseStringGroup("size", optional); - } - if (!res) { - return null; - } - if (!optional && res.text.length === 0) { - // Because we've tested for what is !optional, this block won't - // affect \kern, \hspace, etc. It will capture the mandatory arguments - // to \genfrac and \above. - res.text = "0pt"; // Enable \above{} - isBlank = true; // This is here specifically for \genfrac - } - const match = /([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(res.text); - if (!match) { - throw new ParseError("Invalid size: '" + res.text + "'", res); - } - const data = { - number: +(match[1] + match[2]), // sign + magnitude, cast to number - unit: match[3] - }; - if (!validUnit(data)) { - throw new ParseError("Invalid unit: '" + data.unit + "'", res); - } - return { - type: "size", - mode: this.mode, - value: data, - isBlank - }; - } - - /** - * Parses an URL, checking escaped letters and allowed protocols, - * and setting the catcode of % as an active character (as in \hyperref). - */ - parseUrlGroup(optional) { - this.gullet.lexer.setCatcode("%", 13); // active character - this.gullet.lexer.setCatcode("~", 12); // other character - const res = this.parseStringGroup("url", optional); - this.gullet.lexer.setCatcode("%", 14); // comment character - this.gullet.lexer.setCatcode("~", 13); // active character - if (res == null) { - return null; - } - // hyperref package allows backslashes alone in href, but doesn't - // generate valid links in such cases; we interpret this as - // "undefined" behaviour, and keep them as-is. Some browser will - // replace backslashes with forward slashes. - let url = res.text.replace(/\\([#$%&~_^{}])/g, "$1"); - url = res.text.replace(/{\u2044}/g, "/"); - return { - type: "url", - mode: this.mode, - url - }; - } - - /** - * Parses an argument with the mode specified. - */ - parseArgumentGroup(optional, mode) { - const argToken = this.gullet.scanArgument(optional); - if (argToken == null) { - return null; - } - const outerMode = this.mode; - if (mode) { - // Switch to specified mode - this.switchMode(mode); - } - - this.gullet.beginGroup(); - const expression = this.parseExpression(false, "EOF"); - // TODO: find an alternative way to denote the end - this.expect("EOF"); // expect the end of the argument - this.gullet.endGroup(); - const result = { - type: "ordgroup", - mode: this.mode, - loc: argToken.loc, - body: expression - }; - - if (mode) { - // Switch mode back - this.switchMode(outerMode); - } - return result; - } - - /** - * Parses an ordinary group, which is either a single nucleus (like "x") - * or an expression in braces (like "{x+y}") or an implicit group, a group - * that starts at the current position, and ends right before a higher explicit - * group ends, or at EOF. - */ - parseGroup( - name, // For error reporting. - breakOnTokenText - ) { - const firstToken = this.fetch(); - const text = firstToken.text; - - let result; - // Try to parse an open brace or \begingroup - if (text === "{" || text === "\\begingroup" || text === "\\toggle") { - this.consume(); - const groupEnd = text === "{" - ? "}" - : text === "\\begingroup" - ? "\\endgroup" - : "\\endtoggle"; - - this.gullet.beginGroup(); - // If we get a brace, parse an expression - const expression = this.parseExpression(false, groupEnd); - const lastToken = this.fetch(); - this.expect(groupEnd); // Check that we got a matching closing brace - this.gullet.endGroup(); - result = { - type: (lastToken.text === "\\endtoggle" ? "toggle" : "ordgroup"), - mode: this.mode, - loc: SourceLocation.range(firstToken, lastToken), - body: expression, - // A group formed by \begingroup...\endgroup is a semi-simple group - // which doesn't affect spacing in math mode, i.e., is transparent. - // https://tex.stackexchange.com/questions/1930/ - semisimple: text === "\\begingroup" || undefined - }; - } else { - // If there exists a function with this name, parse the function. - // Otherwise, just return a nucleus - result = this.parseFunction(breakOnTokenText, name) || this.parseSymbol(); - if (result == null && text[0] === "\\" && - !Object.prototype.hasOwnProperty.call(implicitCommands, text )) { - result = this.formatUnsupportedCmd(text); - this.consume(); - } - } - return result; - } - - /** - * Form ligature-like combinations of characters for text mode. - * This includes inputs like "--", "---", "``" and "''". - * The result will simply replace multiple textord nodes with a single - * character in each value by a single textord node having multiple - * characters in its value. The representation is still ASCII source. - * The group will be modified in place. - */ - formLigatures(group) { - let n = group.length - 1; - for (let i = 0; i < n; ++i) { - const a = group[i]; - const v = a.text; - if (v === "-" && group[i + 1].text === "-") { - if (i + 1 < n && group[i + 2].text === "-") { - group.splice(i, 3, { - type: "textord", - mode: "text", - loc: SourceLocation.range(a, group[i + 2]), - text: "---" - }); - n -= 2; - } else { - group.splice(i, 2, { - type: "textord", - mode: "text", - loc: SourceLocation.range(a, group[i + 1]), - text: "--" - }); - n -= 1; - } - } - if ((v === "'" || v === "`") && group[i + 1].text === v) { - group.splice(i, 2, { - type: "textord", - mode: "text", - loc: SourceLocation.range(a, group[i + 1]), - text: v + v - }); - n -= 1; - } - } - } - - /** - * Parse a single symbol out of the string. Here, we handle single character - * symbols and special functions like \verb. - */ - parseSymbol() { - const nucleus = this.fetch(); - let text = nucleus.text; - - if (/^\\verb[^a-zA-Z]/.test(text)) { - this.consume(); - let arg = text.slice(5); - const star = arg.charAt(0) === "*"; - if (star) { - arg = arg.slice(1); - } - // Lexer's tokenRegex is constructed to always have matching - // first/last characters. - if (arg.length < 2 || arg.charAt(0) !== arg.slice(-1)) { - throw new ParseError(`\\verb assertion failed -- - please report what input caused this bug`); - } - arg = arg.slice(1, -1); // remove first and last char - return { - type: "verb", - mode: "text", - body: arg, - star - }; - } - // At this point, we should have a symbol, possibly with accents. - // First expand any accented base symbol according to unicodeSymbols. - if (Object.prototype.hasOwnProperty.call(unicodeSymbols, text[0]) && - !symbols[this.mode][text[0]]) { - // This behavior is not strict (XeTeX-compatible) in math mode. - if (this.settings.strict && this.mode === "math") { - throw new ParseError(`Accented Unicode text character "${text[0]}" used in ` + `math mode`, - nucleus - ); - } - text = unicodeSymbols[text[0]] + text.slice(1); - } - // Strip off any combining characters - const match = combiningDiacriticalMarksEndRegex.exec(text); - if (match) { - text = text.substring(0, match.index); - if (text === "i") { - text = "\u0131"; // dotless i, in math and text mode - } else if (text === "j") { - text = "\u0237"; // dotless j, in math and text mode - } - } - // Recognize base symbol - let symbol; - if (symbols[this.mode][text]) { - let group = symbols[this.mode][text].group; - if (group === "bin" && binLeftCancellers.includes(this.prevAtomType)) { - // Change from a binary operator to a unary (prefix) operator - group = "open"; - } - const loc = SourceLocation.range(nucleus); - let s; - if (Object.prototype.hasOwnProperty.call(ATOMS, group )) { - const family = group; - s = { - type: "atom", - mode: this.mode, - family, - loc, - text - }; - } else { - if (asciiFromScript[text]) { - // Unicode 14 disambiguates chancery from roundhand. - // See https://www.unicode.org/charts/PDF/U1D400.pdf - this.consume(); - const nextCode = this.fetch().text.charCodeAt(0); - // mathcal is Temml default. Use mathscript if called for. - const font = nextCode === 0xfe01 ? "mathscr" : "mathcal"; - if (nextCode === 0xfe00 || nextCode === 0xfe01) { this.consume(); } - return { - type: "font", - mode: "math", - font, - body: { type: "mathord", mode: "math", loc, text: asciiFromScript[text] } - } - } - // Default ord character. No disambiguation necessary. - s = { - type: group, - mode: this.mode, - loc, - text - }; - } - symbol = s; - } else if (text.charCodeAt(0) >= 0x80) { - // no symbol for e.g. ^ - if (this.settings.strict && this.mode === "math") { - throw new ParseError(`Unicode text character "${text[0]}" used in math mode`, nucleus) - } - // All nonmathematical Unicode characters are rendered as if they - // are in text mode (wrapped in \text) because that's what it - // takes to render them in LaTeX. - symbol = { - type: "textord", - mode: "text", - loc: SourceLocation.range(nucleus), - text - }; - } else { - return null; // EOF, ^, _, {, }, etc. - } - this.consume(); - // Transform combining characters into accents - if (match) { - for (let i = 0; i < match[0].length; i++) { - const accent = match[0][i]; - if (!unicodeAccents[accent]) { - throw new ParseError(`Unknown accent ' ${accent}'`, nucleus); - } - const command = unicodeAccents[accent][this.mode] || - unicodeAccents[accent].text; - if (!command) { - throw new ParseError(`Accent ${accent} unsupported in ${this.mode} mode`, nucleus); - } - symbol = { - type: "accent", - mode: this.mode, - loc: SourceLocation.range(nucleus), - label: command, - isStretchy: false, - base: symbol - }; - } - } - return symbol; - } -} - -/** - * Parses an expression using a Parser, then returns the parsed result. - */ -const parseTree = function(toParse, settings) { - if (!(typeof toParse === "string" || toParse instanceof String)) { - throw new TypeError("Temml can only parse string typed expression") - } - const parser = new Parser(toParse, settings); - // Blank out any \df@tag to avoid spurious "Duplicate \tag" errors - delete parser.gullet.macros.current["\\df@tag"]; - - let tree = parser.parse(); - - // LaTeX ignores a \tag placed outside an AMS environment. - if (!(tree.length > 0 && tree[0].type && tree[0].type === "array" && tree[0].addEqnNum)) { - // If the input used \tag, it will set the \df@tag macro to the tag. - // In this case, we separately parse the tag and wrap the tree. - if (parser.gullet.macros.get("\\df@tag")) { - if (!settings.displayMode) { - throw new ParseError("\\tag works only in display mode") - } - parser.gullet.feed("\\df@tag"); - tree = [ - { - type: "tag", - mode: "text", - body: tree, - tag: parser.parse() - } - ]; - } - } - - return tree -}; - -/** - * This file contains information about the style that the mathmlBuilder carries - * around with it. Data is held in an `Style` object, and when - * recursing, a new `Style` object can be created with the `.with*` functions. - */ - -const subOrSupLevel = [2, 2, 3, 3]; - -/** - * This is the main Style class. It contains the current style.level, color, and font. - * - * Style objects should not be modified. To create a new Style with - * different properties, call a `.with*` method. - */ -class Style { - constructor(data) { - // Style.level can be 0 | 1 | 2 | 3, which correspond to - // displaystyle, textstyle, scriptstyle, and scriptscriptstyle. - // style.level does not directly set MathML's script level. MathML does that itself. - // We use style.level to track, not set, math style so that we can get the - // correct scriptlevel when needed in supsub.js, mathchoice.js, or for dimensions in em. - this.level = data.level; - this.color = data.color; // string | void - // A font family applies to a group of fonts (i.e. SansSerif), while a font - // represents a specific font (i.e. SansSerif Bold). - // See: https://tex.stackexchange.com/questions/22350/difference-between-textrm-and-mathrm - this.font = data.font || ""; // string - this.fontFamily = data.fontFamily || ""; // string - this.fontSize = data.fontSize || 1.0; // number - this.fontWeight = data.fontWeight || ""; - this.fontShape = data.fontShape || ""; - this.maxSize = data.maxSize; // [number, number] - } - - /** - * Returns a new style object with the same properties as "this". Properties - * from "extension" will be copied to the new style object. - */ - extend(extension) { - const data = { - level: this.level, - color: this.color, - font: this.font, - fontFamily: this.fontFamily, - fontSize: this.fontSize, - fontWeight: this.fontWeight, - fontShape: this.fontShape, - maxSize: this.maxSize - }; - - for (const key in extension) { - if (Object.prototype.hasOwnProperty.call(extension, key)) { - data[key] = extension[key]; - } - } - - return new Style(data); - } - - withLevel(n) { - return this.extend({ - level: n - }); - } - - incrementLevel() { - return this.extend({ - level: Math.min(this.level + 1, 3) - }); - } - - inSubOrSup() { - return this.extend({ - level: subOrSupLevel[this.level] - }) - } - - /** - * Create a new style object with the given color. - */ - withColor(color) { - return this.extend({ - color: color - }); - } - - /** - * Creates a new style object with the given math font or old text font. - * @type {[type]} - */ - withFont(font) { - return this.extend({ - font - }); - } - - /** - * Create a new style objects with the given fontFamily. - */ - withTextFontFamily(fontFamily) { - return this.extend({ - fontFamily, - font: "" - }); - } - - /** - * Creates a new style object with the given font size - */ - withFontSize(num) { - return this.extend({ - fontSize: num - }); - } - - /** - * Creates a new style object with the given font weight - */ - withTextFontWeight(fontWeight) { - return this.extend({ - fontWeight, - font: "" - }); - } - - /** - * Creates a new style object with the given font weight - */ - withTextFontShape(fontShape) { - return this.extend({ - fontShape, - font: "" - }); - } - - /** - * Gets the CSS color of the current style object - */ - getColor() { - return this.color; - } -} - -/* Temml Post Process - * Perform two tasks not done by Temml when it created each individual Temml element. - * Given a block, - * 1. At each AMS auto-numbered environment, assign an id. - * 2. Populate the text contents of each \ref & \eqref - * - * As with other Temml code, this file is released under terms of the MIT license. - * https://mit-license.org/ - */ - -const version = "0.10.24"; - -function postProcess(block) { - const labelMap = {}; - let i = 0; - - // Get a collection of the parents of each \tag & auto-numbered equation - const parents = block.getElementsByClassName("tml-tageqn"); - for (const parent of parents) { - const eqns = parent.getElementsByClassName("tml-eqn"); - if (eqns. length > 0 ) { - // AMS automatically numbered equation. - // Assign an id. - i += 1; - eqns[0].id = "tml-eqn-" + i; - // No need to write a number into the text content of the element. - // A CSS counter does that even if this postProcess() function is not used. - } - // If there is a \label, add it to labelMap - const labels = parent.getElementsByClassName("tml-label"); - if (labels.length === 0) { continue } - if (eqns.length > 0) { - labelMap[labels[0].id] = String(i); - } else { - const tags = parent.getElementsByClassName("tml-tag"); - if (tags.length > 0) { - labelMap[labels[0].id] = tags[0].textContent; - } - } - } - - // Populate \ref & \eqref text content - const refs = block.getElementsByClassName("tml-ref"); - [...refs].forEach(ref => { - let str = labelMap[ref.getAttribute("href").slice(1)]; - if (ref.className.indexOf("tml-eqref") === -1) { - // \ref. Omit parens. - str = str.replace(/^\(/, ""); - str = str.replace(/\($/, ""); - } { - // \eqref. Include parens - if (str.charAt(0) !== "(") { str = "(" + str; } - if (str.slice(-1) !== ")") { str = str + ")"; } - } - ref.textContent = str; - }); -} - -/* eslint no-console:0 */ - -/** - * @type {import('./temml').render} - * Parse and build an expression, and place that expression in the DOM node - * given. - */ -let render = function(expression, baseNode, options = {}) { - baseNode.textContent = ""; - const alreadyInMathElement = baseNode.tagName.toLowerCase() === "math"; - if (alreadyInMathElement) { options.wrap = "none"; } - const math = renderToMathMLTree(expression, options); - if (alreadyInMathElement) { - // The element already exists. Populate it. - baseNode.textContent = ""; - math.children.forEach(e => { baseNode.appendChild(e.toNode()); }); - } else if (math.children.length > 1) { - baseNode.textContent = ""; - math.children.forEach(e => { baseNode.appendChild(e.toNode()); }); - } else { - baseNode.appendChild(math.toNode()); - } -}; - -// Temml's styles don't work properly in quirks mode. Print out an error, and -// disable rendering. -if (typeof document !== "undefined") { - if (document.compatMode !== "CSS1Compat") { - typeof console !== "undefined" && - console.warn( - "Warning: Temml doesn't work in quirks mode. Make sure your " + - "website has a suitable doctype." - ); - - render = function() { - throw new ParseError("Temml doesn't work in quirks mode."); - }; - } -} - -/** - * @type {import('./temml').renderToString} - * Parse and build an expression, and return the markup for that. - */ -const renderToString = function(expression, options) { - const markup = renderToMathMLTree(expression, options).toMarkup(); - return markup; -}; - -/** - * @type {import('./temml').generateParseTree} - * Parse an expression and return the parse tree. - */ -const generateParseTree = function(expression, options) { - const settings = new Settings(options); - return parseTree(expression, settings); -}; - -/** - * @type {import('./temml').definePreamble} - * Take an expression which contains a preamble. - * Parse it and return the macros. - */ -const definePreamble = function(expression, options) { - const settings = new Settings(options); - settings.macros = {}; - if (!(typeof expression === "string" || expression instanceof String)) { - throw new TypeError("Temml can only parse string typed expression") - } - const parser = new Parser(expression, settings, true); - // Blank out any \df@tag to avoid spurious "Duplicate \tag" errors - delete parser.gullet.macros.current["\\df@tag"]; - const macros = parser.parse(); - return macros -}; - -/** - * If the given error is a Temml ParseError, - * renders the invalid LaTeX as a span with hover title giving the Temml - * error message. Otherwise, simply throws the error. - */ -const renderError = function(error, expression, options) { - if (options.throwOnError || !(error instanceof ParseError)) { - throw error; - } - const node = new Span(["temml-error"], [new TextNode$1(expression + "\n" + error.toString())]); - node.style.color = options.errorColor; - node.style.whiteSpace = "pre-line"; - return node; -}; - -/** - * @type {import('./temml').renderToMathMLTree} - * Generates and returns the Temml build tree. This is used for advanced - * use cases (like rendering to custom output). - */ -const renderToMathMLTree = function(expression, options) { - const settings = new Settings(options); - try { - const tree = parseTree(expression, settings); - const style = new Style({ - level: settings.displayMode ? StyleLevel.DISPLAY : StyleLevel.TEXT, - maxSize: settings.maxSize - }); - return buildMathML(tree, expression, style, settings); - } catch (error) { - return renderError(error, expression, settings); - } -}; - -/** @type {import('./temml').default} */ -var temml = { - /** - * Current Temml version - */ - version: version, - /** - * Renders the given LaTeX into MathML, and adds - * it as a child to the specified DOM node. - */ - render, - /** - * Renders the given LaTeX into MathML string, - * for sending to the client. - */ - renderToString, - /** - * Post-process an entire HTML block. - * Writes AMS auto-numbers and implements \ref{}. - * Typcally called once, after a loop has rendered many individual spans. - */ - postProcess, - /** - * Temml error, usually during parsing. - */ - ParseError, - /** - * Creates a set of macros with document-wide scope. - */ - definePreamble, - /** - * Parses the given LaTeX into Temml's internal parse tree structure, - * without rendering to HTML or MathML. - * - * NOTE: This method is not currently recommended for public use. - * The internal tree representation is unstable and is very likely - * to change. Use at your own risk. - */ - __parse: generateParseTree, - /** - * Renders the given LaTeX into a MathML internal DOM tree - * representation, without flattening that representation to a string. - * - * NOTE: This method is not currently recommended for public use. - * The internal tree representation is unstable and is very likely - * to change. Use at your own risk. - */ - __renderToMathMLTree: renderToMathMLTree, - /** - * adds a new symbol to builtin symbols table - */ - __defineSymbol: defineSymbol, - /** - * adds a new macro to builtin macro list - */ - __defineMacro: defineMacro -}; - -module.exports = temml; diff --git a/utils/temml.mjs b/utils/temml.mjs deleted file mode 100644 index 374b91c5..00000000 --- a/utils/temml.mjs +++ /dev/null @@ -1,13529 +0,0 @@ -/** - * This is the ParseError class, which is the main error thrown by Temml - * functions when something has gone wrong. This is used to distinguish internal - * errors from errors in the expression that the user provided. - * - * If possible, a caller should provide a Token or ParseNode with information - * about where in the source string the problem occurred. - */ -class ParseError { - constructor( - message, // The error message - token // An object providing position information - ) { - let error = " " + message; - let start; - - const loc = token && token.loc; - if (loc && loc.start <= loc.end) { - // If we have the input and a position, make the error a bit fancier - - // Get the input - const input = loc.lexer.input; - - // Prepend some information - start = loc.start; - const end = loc.end; - if (start === input.length) { - error += " at end of input: "; - } else { - error += " at position " + (start + 1) + ": "; - } - - // Underline token in question using combining underscores - const underlined = input.slice(start, end).replace(/[^]/g, "$&\u0332"); - - // Extract some context from the input and add it to the error - let left; - if (start > 15) { - left = "…" + input.slice(start - 15, start); - } else { - left = input.slice(0, start); - } - let right; - if (end + 15 < input.length) { - right = input.slice(end, end + 15) + "…"; - } else { - right = input.slice(end); - } - error += left + underlined + right; - } - - // Some hackery to make ParseError a prototype of Error - // See http://stackoverflow.com/a/8460753 - const self = new Error(error); - self.name = "ParseError"; - self.__proto__ = ParseError.prototype; - self.position = start; - return self; - } -} - -ParseError.prototype.__proto__ = Error.prototype; - -// -/** - * This file contains a list of utility functions which are useful in other - * files. - */ - -/** - * Provide a default value if a setting is undefined - */ -const deflt = function(setting, defaultIfUndefined) { - return setting === undefined ? defaultIfUndefined : setting; -}; - -// hyphenate and escape adapted from Facebook's React under Apache 2 license - -const uppercase = /([A-Z])/g; -const hyphenate = function(str) { - return str.replace(uppercase, "-$1").toLowerCase(); -}; - -const ESCAPE_LOOKUP = { - "&": "&", - ">": ">", - "<": "<", - '"': """, - "'": "'" -}; - -const ESCAPE_REGEX = /[&><"']/g; - -/** - * Escapes text to prevent scripting attacks. - */ -function escape(text) { - return String(text).replace(ESCAPE_REGEX, (match) => ESCAPE_LOOKUP[match]); -} - -/** - * Sometimes we want to pull out the innermost element of a group. In most - * cases, this will just be the group itself, but when ordgroups and colors have - * a single element, we want to pull that out. - */ -const getBaseElem = function(group) { - if (group.type === "ordgroup") { - if (group.body.length === 1) { - return getBaseElem(group.body[0]); - } else { - return group; - } - } else if (group.type === "color") { - if (group.body.length === 1) { - return getBaseElem(group.body[0]); - } else { - return group; - } - } else if (group.type === "font") { - return getBaseElem(group.body); - } else { - return group; - } -}; - -/** - * TeXbook algorithms often reference "character boxes", which are simply groups - * with a single character in them. To decide if something is a character box, - * we find its innermost group, and see if it is a single character. - */ -const isCharacterBox = function(group) { - const baseElem = getBaseElem(group); - - // These are all the types of groups which hold single characters - return baseElem.type === "mathord" || baseElem.type === "textord" || baseElem.type === "atom" -}; - -const assert = function(value) { - if (!value) { - throw new Error("Expected non-null, but got " + String(value)); - } - return value; -}; - -/** - * Return the protocol of a URL, or "_relative" if the URL does not specify a - * protocol (and thus is relative), or `null` if URL has invalid protocol - * (so should be outright rejected). - */ -const protocolFromUrl = function(url) { - // Check for possible leading protocol. - // https://url.spec.whatwg.org/#url-parsing strips leading whitespace - // (\x00) or C0 control (\x00-\x1F) characters. - // eslint-disable-next-line no-control-regex - const protocol = /^[\x00-\x20]*([^\\/#?]*?)(:|�*58|�*3a|&colon)/i.exec(url); - if (!protocol) { - return "_relative"; - } - // Reject weird colons - if (protocol[2] !== ":") { - return null; - } - // Reject invalid characters in scheme according to - // https://datatracker.ietf.org/doc/html/rfc3986#section-3.1 - if (!/^[a-zA-Z][a-zA-Z0-9+\-.]*$/.test(protocol[1])) { - return null; - } - // Lowercase the protocol - return protocol[1].toLowerCase(); -}; - -/** - * Round `n` to 4 decimal places, or to the nearest 1/10,000th em. The TeXbook - * gives an acceptable rounding error of 100sp (which would be the nearest - * 1/6551.6em with our ptPerEm = 10): - * http://www.ctex.org/documents/shredder/src/texbook.pdf#page=69 - */ -const round = function(n) { - return +n.toFixed(4); -}; - -var utils = { - deflt, - escape, - hyphenate, - getBaseElem, - isCharacterBox, - protocolFromUrl, - round -}; - -/** - * This is a module for storing settings passed into Temml. It correctly handles - * default settings. - */ - -/** - * The main Settings object - */ -class Settings { - constructor(options) { - // allow null options - options = options || {}; - this.displayMode = utils.deflt(options.displayMode, false); // boolean - this.annotate = utils.deflt(options.annotate, false); // boolean - this.leqno = utils.deflt(options.leqno, false); // boolean - this.throwOnError = utils.deflt(options.throwOnError, false); // boolean - this.errorColor = utils.deflt(options.errorColor, "#b22222"); // string - this.macros = options.macros || {}; - this.wrap = utils.deflt(options.wrap, "tex"); // "tex" | "=" - this.xml = utils.deflt(options.xml, false); // boolean - this.colorIsTextColor = utils.deflt(options.colorIsTextColor, false); // booelean - this.strict = utils.deflt(options.strict, false); // boolean - this.trust = utils.deflt(options.trust, false); // trust context. See html.js. - this.maxSize = (options.maxSize === undefined - ? [Infinity, Infinity] - : Array.isArray(options.maxSize) - ? options.maxSize - : [Infinity, Infinity] - ); - this.maxExpand = Math.max(0, utils.deflt(options.maxExpand, 1000)); // number - } - - /** - * Check whether to test potentially dangerous input, and return - * `true` (trusted) or `false` (untrusted). The sole argument `context` - * should be an object with `command` field specifying the relevant LaTeX - * command (as a string starting with `\`), and any other arguments, etc. - * If `context` has a `url` field, a `protocol` field will automatically - * get added by this function (changing the specified object). - */ - isTrusted(context) { - if (context.url && !context.protocol) { - const protocol = utils.protocolFromUrl(context.url); - if (protocol == null) { - return false - } - context.protocol = protocol; - } - const trust = typeof this.trust === "function" ? this.trust(context) : this.trust; - return Boolean(trust); - } -} - -/** - * All registered functions. - * `functions.js` just exports this same dictionary again and makes it public. - * `Parser.js` requires this dictionary. - */ -const _functions = {}; - -/** - * All MathML builders. Should be only used in the `define*` and the `build*ML` - * functions. - */ -const _mathmlGroupBuilders = {}; - -function defineFunction({ - type, - names, - props, - handler, - mathmlBuilder -}) { - // Set default values of functions - const data = { - type, - numArgs: props.numArgs, - argTypes: props.argTypes, - allowedInArgument: !!props.allowedInArgument, - allowedInText: !!props.allowedInText, - allowedInMath: props.allowedInMath === undefined ? true : props.allowedInMath, - numOptionalArgs: props.numOptionalArgs || 0, - infix: !!props.infix, - primitive: !!props.primitive, - handler: handler - }; - for (let i = 0; i < names.length; ++i) { - _functions[names[i]] = data; - } - if (type) { - if (mathmlBuilder) { - _mathmlGroupBuilders[type] = mathmlBuilder; - } - } -} - -/** - * Use this to register only the MathML builder for a function(e.g. - * if the function's ParseNode is generated in Parser.js rather than via a - * stand-alone handler provided to `defineFunction`). - */ -function defineFunctionBuilders({ type, mathmlBuilder }) { - defineFunction({ - type, - names: [], - props: { numArgs: 0 }, - handler() { - throw new Error("Should never be called.") - }, - mathmlBuilder - }); -} - -const normalizeArgument = function(arg) { - return arg.type === "ordgroup" && arg.body.length === 1 ? arg.body[0] : arg -}; - -// Since the corresponding buildMathML function expects a -// list of elements, we normalize for different kinds of arguments -const ordargument = function(arg) { - return arg.type === "ordgroup" ? arg.body : [arg] -}; - -/** - * This node represents a document fragment, which contains elements, but when - * placed into the DOM doesn't have any representation itself. It only contains - * children and doesn't have any DOM node properties. - */ -class DocumentFragment { - constructor(children) { - this.children = children; - this.classes = []; - this.style = {}; - } - - hasClass(className) { - return this.classes.includes(className); - } - - /** Convert the fragment into a node. */ - toNode() { - const frag = document.createDocumentFragment(); - - for (let i = 0; i < this.children.length; i++) { - frag.appendChild(this.children[i].toNode()); - } - - return frag; - } - - /** Convert the fragment into HTML markup. */ - toMarkup() { - let markup = ""; - - // Simply concatenate the markup for the children together. - for (let i = 0; i < this.children.length; i++) { - markup += this.children[i].toMarkup(); - } - - return markup; - } - - /** - * Converts the math node into a string, similar to innerText. Applies to - * MathDomNode's only. - */ - toText() { - // To avoid this, we would subclass documentFragment separately for - // MathML, but polyfills for subclassing is expensive per PR 1469. - const toText = (child) => child.toText(); - return this.children.map(toText).join(""); - } -} - -/** - * These objects store the data about the DOM nodes we create, as well as some - * extra data. They can then be transformed into real DOM nodes with the - * `toNode` function or HTML markup using `toMarkup`. They are useful for both - * storing extra properties on the nodes, as well as providing a way to easily - * work with the DOM. - * - * Similar functions for working with MathML nodes exist in mathMLTree.js. - * - */ - -/** - * Create an HTML className based on a list of classes. In addition to joining - * with spaces, we also remove empty classes. - */ -const createClass = function(classes) { - return classes.filter((cls) => cls).join(" "); -}; - -const initNode = function(classes, style) { - this.classes = classes || []; - this.attributes = {}; - this.style = style || {}; -}; - -/** - * Convert into an HTML node - */ -const toNode = function(tagName) { - const node = document.createElement(tagName); - - // Apply the class - node.className = createClass(this.classes); - - // Apply inline styles - for (const style in this.style) { - if (Object.prototype.hasOwnProperty.call(this.style, style )) { - node.style[style] = this.style[style]; - } - } - - // Apply attributes - for (const attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr )) { - node.setAttribute(attr, this.attributes[attr]); - } - } - - // Append the children, also as HTML nodes - for (let i = 0; i < this.children.length; i++) { - node.appendChild(this.children[i].toNode()); - } - - return node; -}; - -/** - * Convert into an HTML markup string - */ -const toMarkup = function(tagName) { - let markup = `<${tagName}`; - - // Add the class - if (this.classes.length) { - markup += ` class="${utils.escape(createClass(this.classes))}"`; - } - - let styles = ""; - - // Add the styles, after hyphenation - for (const style in this.style) { - if (Object.prototype.hasOwnProperty.call(this.style, style )) { - styles += `${utils.hyphenate(style)}:${this.style[style]};`; - } - } - - if (styles) { - markup += ` style="${styles}"`; - } - - // Add the attributes - for (const attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr )) { - markup += ` ${attr}="${utils.escape(this.attributes[attr])}"`; - } - } - - markup += ">"; - - // Add the markup of the children, also as markup - for (let i = 0; i < this.children.length; i++) { - markup += this.children[i].toMarkup(); - } - - markup += ``; - - return markup; -}; - -/** - * This node represents a span node, with a className, a list of children, and - * an inline style. - * - */ -class Span { - constructor(classes, children, style) { - initNode.call(this, classes, style); - this.children = children || []; - } - - setAttribute(attribute, value) { - this.attributes[attribute] = value; - } - - toNode() { - return toNode.call(this, "span"); - } - - toMarkup() { - return toMarkup.call(this, "span"); - } -} - -class TextNode$1 { - constructor(text) { - this.text = text; - } - toNode() { - return document.createTextNode(this.text); - } - toMarkup() { - return utils.escape(this.text); - } -} - -/* - * This node represents an image embed () element. - */ -class Img { - constructor(src, alt, style) { - this.alt = alt; - this.src = src; - this.classes = ["mord"]; - this.style = style; - } - - hasClass(className) { - return this.classes.includes(className); - } - - toNode() { - const node = document.createElement("img"); - node.src = this.src; - node.alt = this.alt; - node.className = "mord"; - - // Apply inline styles - for (const style in this.style) { - if (Object.prototype.hasOwnProperty.call(this.style, style )) { - node.style[style] = this.style[style]; - } - } - - return node; - } - - toMarkup() { - let markup = `${this.alt}` and - * `` tags). - */ -class MathNode { - constructor(type, children, classes, style) { - this.type = type; - this.attributes = {}; - this.children = children || []; - this.classes = classes || []; - this.style = style || {}; // Used for elements - } - - /** - * Sets an attribute on a MathML node. MathML depends on attributes to convey a - * semantic content, so this is used heavily. - */ - setAttribute(name, value) { - this.attributes[name] = value; - } - - /** - * Gets an attribute on a MathML node. - */ - getAttribute(name) { - return this.attributes[name]; - } - - /** - * Converts the math node into a MathML-namespaced DOM element. - */ - toNode() { - const node = document.createElementNS("http://www.w3.org/1998/Math/MathML", this.type); - - for (const attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { - node.setAttribute(attr, this.attributes[attr]); - } - } - - if (this.classes.length > 0) { - node.className = createClass(this.classes); - } - - // Apply inline styles - for (const style in this.style) { - if (Object.prototype.hasOwnProperty.call(this.style, style )) { - node.style[style] = this.style[style]; - } - } - - for (let i = 0; i < this.children.length; i++) { - node.appendChild(this.children[i].toNode()); - } - - return node; - } - - /** - * Converts the math node into an HTML markup string. - */ - toMarkup() { - let markup = "<" + this.type; - - // Add the attributes - for (const attr in this.attributes) { - if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) { - markup += " " + attr + '="'; - markup += utils.escape(this.attributes[attr]); - markup += '"'; - } - } - - if (this.classes.length > 0) { - markup += ` class="${utils.escape(createClass(this.classes))}"`; - } - - let styles = ""; - - // Add the styles, after hyphenation - for (const style in this.style) { - if (Object.prototype.hasOwnProperty.call(this.style, style )) { - styles += `${utils.hyphenate(style)}:${this.style[style]};`; - } - } - - if (styles) { - markup += ` style="${styles}"`; - } - - markup += ">"; - - for (let i = 0; i < this.children.length; i++) { - markup += this.children[i].toMarkup(); - } - - markup += ""; - - return markup; - } - - /** - * Converts the math node into a string, similar to innerText, but escaped. - */ - toText() { - return this.children.map((child) => child.toText()).join(""); - } -} - -/** - * This node represents a piece of text. - */ -class TextNode { - constructor(text) { - this.text = text; - } - - /** - * Converts the text node into a DOM text node. - */ - toNode() { - return document.createTextNode(this.text); - } - - /** - * Converts the text node into escaped HTML markup - * (representing the text itself). - */ - toMarkup() { - return utils.escape(this.toText()); - } - - /** - * Converts the text node into a string - * (representing the text itself). - */ - toText() { - return this.text; - } -} - -// Do not make an the only child of a . -// An acts as its own implicit . -const wrapWithMstyle = expression => { - let node; - if (expression.length === 1 && expression[0].type === "mrow") { - node = expression.pop(); - node.type = "mstyle"; - } else { - node = new MathNode("mstyle", expression); - } - return node -}; - -var mathMLTree = { - MathNode, - TextNode, - newDocumentFragment -}; - -/** - * This file provides support for building horizontal stretchy elements. - */ - -// TODO: Remove when Chromium stretches \widetilde & \widehat -const estimatedWidth = node => { - let width = 0; - if (node.body) { - for (const item of node.body) { - width += estimatedWidth(item); - } - } else if (node.type === "supsub") { - width += estimatedWidth(node.base); - if (node.sub) { width += 0.7 * estimatedWidth(node.sub); } - if (node.sup) { width += 0.7 * estimatedWidth(node.sup); } - } else if (node.type === "mathord" || node.type === "textord") { - for (const ch of node.text.split('')) { - const codePoint = ch.codePointAt(0); - if ((0x60 < codePoint && codePoint < 0x7B) || (0x03B0 < codePoint && codePoint < 0x3CA)) { - width += 0.56; // lower case latin or greek. Use advance width of letter n - } else if (0x2F < codePoint && codePoint < 0x3A) { - width += 0.50; // numerals. - } else { - width += 0.92; // advance width of letter M - } - } - } else { - width += 1.0; - } - return width -}; - -const stretchyCodePoint = { - widehat: "^", - widecheck: "ˇ", - widetilde: "~", - wideparen: "⏜", // \u23dc - utilde: "~", - overleftarrow: "\u2190", - underleftarrow: "\u2190", - xleftarrow: "\u2190", - overrightarrow: "\u2192", - underrightarrow: "\u2192", - xrightarrow: "\u2192", - underbrace: "\u23df", - overbrace: "\u23de", - overgroup: "\u23e0", - overparen: "⏜", - undergroup: "\u23e1", - underparen: "\u23dd", - overleftrightarrow: "\u2194", - underleftrightarrow: "\u2194", - xleftrightarrow: "\u2194", - Overrightarrow: "\u21d2", - xRightarrow: "\u21d2", - overleftharpoon: "\u21bc", - xleftharpoonup: "\u21bc", - overrightharpoon: "\u21c0", - xrightharpoonup: "\u21c0", - xLeftarrow: "\u21d0", - xLeftrightarrow: "\u21d4", - xhookleftarrow: "\u21a9", - xhookrightarrow: "\u21aa", - xmapsto: "\u21a6", - xrightharpoondown: "\u21c1", - xleftharpoondown: "\u21bd", - xtwoheadleftarrow: "\u219e", - xtwoheadrightarrow: "\u21a0", - xlongequal: "=", - xrightleftarrows: "\u21c4", - yields: "\u2192", - yieldsLeft: "\u2190", - mesomerism: "\u2194", - longrightharpoonup: "\u21c0", - longleftharpoondown: "\u21bd", - eqrightharpoonup: "\u21c0", - eqleftharpoondown: "\u21bd", - "\\cdrightarrow": "\u2192", - "\\cdleftarrow": "\u2190", - "\\cdlongequal": "=" -}; - -const mathMLnode = function(label) { - const child = new mathMLTree.TextNode(stretchyCodePoint[label.slice(1)]); - const node = new mathMLTree.MathNode("mo", [child]); - node.setAttribute("stretchy", "true"); - return node -}; - -const crookedWides = ["\\widetilde", "\\widehat", "\\widecheck", "\\utilde"]; - -// TODO: Remove when Chromium stretches \widetilde & \widehat -const accentNode = (group) => { - const mo = mathMLnode(group.label); - if (crookedWides.includes(group.label)) { - const width = estimatedWidth(group.base); - if (1 < width && width < 1.6) { - mo.classes.push("tml-crooked-2"); - } else if (1.6 <= width && width < 2.5) { - mo.classes.push("tml-crooked-3"); - } else if (2.5 <= width) { - mo.classes.push("tml-crooked-4"); - } - } - return mo -}; - -var stretchy = { - mathMLnode, - accentNode -}; - -/** - * This file holds a list of all no-argument functions and single-character - * symbols (like 'a' or ';'). - * - * For each of the symbols, there are two properties they can have: - * - group (required): the ParseNode group type the symbol should have (i.e. - "textord", "mathord", etc). - * - replace: the character that this symbol or function should be - * replaced with (i.e. "\phi" has a replace value of "\u03d5", the phi - * character in the main font). - * - * The outermost map in the table indicates what mode the symbols should be - * accepted in (e.g. "math" or "text"). - */ - -// Some of these have a "-token" suffix since these are also used as `ParseNode` -// types for raw text tokens, and we want to avoid conflicts with higher-level -// `ParseNode` types. These `ParseNode`s are constructed within `Parser` by -// looking up the `symbols` map. -const ATOMS = { - bin: 1, - close: 1, - inner: 1, - open: 1, - punct: 1, - rel: 1 -}; -const NON_ATOMS = { - "accent-token": 1, - mathord: 1, - "op-token": 1, - spacing: 1, - textord: 1 -}; - -const symbols = { - math: {}, - text: {} -}; - -/** `acceptUnicodeChar = true` is only applicable if `replace` is set. */ -function defineSymbol(mode, group, replace, name, acceptUnicodeChar) { - symbols[mode][name] = { group, replace }; - - if (acceptUnicodeChar && replace) { - symbols[mode][replace] = symbols[mode][name]; - } -} - -// Some abbreviations for commonly used strings. -// This helps minify the code, and also spotting typos using jshint. - -// modes: -const math = "math"; -const text = "text"; - -// groups: -const accent = "accent-token"; -const bin = "bin"; -const close = "close"; -const inner = "inner"; -const mathord = "mathord"; -const op = "op-token"; -const open = "open"; -const punct = "punct"; -const rel = "rel"; -const spacing = "spacing"; -const textord = "textord"; - -// Now comes the symbol table - -// Relation Symbols -defineSymbol(math, rel, "\u2261", "\\equiv", true); -defineSymbol(math, rel, "\u227a", "\\prec", true); -defineSymbol(math, rel, "\u227b", "\\succ", true); -defineSymbol(math, rel, "\u223c", "\\sim", true); -defineSymbol(math, rel, "\u27c2", "\\perp", true); -defineSymbol(math, rel, "\u2aaf", "\\preceq", true); -defineSymbol(math, rel, "\u2ab0", "\\succeq", true); -defineSymbol(math, rel, "\u2243", "\\simeq", true); -defineSymbol(math, rel, "\u224c", "\\backcong", true); -defineSymbol(math, rel, "|", "\\mid", true); -defineSymbol(math, rel, "\u226a", "\\ll", true); -defineSymbol(math, rel, "\u226b", "\\gg", true); -defineSymbol(math, rel, "\u224d", "\\asymp", true); -defineSymbol(math, rel, "\u2225", "\\parallel"); -defineSymbol(math, rel, "\u2323", "\\smile", true); -defineSymbol(math, rel, "\u2291", "\\sqsubseteq", true); -defineSymbol(math, rel, "\u2292", "\\sqsupseteq", true); -defineSymbol(math, rel, "\u2250", "\\doteq", true); -defineSymbol(math, rel, "\u2322", "\\frown", true); -defineSymbol(math, rel, "\u220b", "\\ni", true); -defineSymbol(math, rel, "\u220c", "\\notni", true); -defineSymbol(math, rel, "\u221d", "\\propto", true); -defineSymbol(math, rel, "\u22a2", "\\vdash", true); -defineSymbol(math, rel, "\u22a3", "\\dashv", true); -defineSymbol(math, rel, "\u220b", "\\owns"); -defineSymbol(math, rel, "\u2258", "\\arceq", true); -defineSymbol(math, rel, "\u2259", "\\wedgeq", true); -defineSymbol(math, rel, "\u225a", "\\veeeq", true); -defineSymbol(math, rel, "\u225b", "\\stareq", true); -defineSymbol(math, rel, "\u225d", "\\eqdef", true); -defineSymbol(math, rel, "\u225e", "\\measeq", true); -defineSymbol(math, rel, "\u225f", "\\questeq", true); -defineSymbol(math, rel, "\u2260", "\\ne", true); -defineSymbol(math, rel, "\u2260", "\\neq"); -// unicodemath -defineSymbol(math, rel, "\u2a75", "\\eqeq", true); -defineSymbol(math, rel, "\u2a76", "\\eqeqeq", true); -// mathtools.sty -defineSymbol(math, rel, "\u2237", "\\dblcolon", true); -defineSymbol(math, rel, "\u2254", "\\coloneqq", true); -defineSymbol(math, rel, "\u2255", "\\eqqcolon", true); -defineSymbol(math, rel, "\u2239", "\\eqcolon", true); -defineSymbol(math, rel, "\u2A74", "\\Coloneqq", true); - -// Punctuation -defineSymbol(math, punct, "\u002e", "\\ldotp"); -defineSymbol(math, punct, "\u00b7", "\\cdotp"); - -// Misc Symbols -defineSymbol(math, textord, "\u0023", "\\#"); -defineSymbol(text, textord, "\u0023", "\\#"); -defineSymbol(math, textord, "\u0026", "\\&"); -defineSymbol(text, textord, "\u0026", "\\&"); -defineSymbol(math, textord, "\u2135", "\\aleph", true); -defineSymbol(math, textord, "\u2200", "\\forall", true); -defineSymbol(math, textord, "\u210f", "\\hbar", true); -defineSymbol(math, textord, "\u2203", "\\exists", true); -// ∇ is actually a unary operator, not binary. But this works. -defineSymbol(math, bin, "\u2207", "\\nabla", true); -defineSymbol(math, textord, "\u266d", "\\flat", true); -defineSymbol(math, textord, "\u2113", "\\ell", true); -defineSymbol(math, textord, "\u266e", "\\natural", true); -defineSymbol(math, textord, "Å", "\\Angstrom", true); -defineSymbol(text, textord, "Å", "\\Angstrom", true); -defineSymbol(math, textord, "\u2663", "\\clubsuit", true); -defineSymbol(math, textord, "\u2667", "\\varclubsuit", true); -defineSymbol(math, textord, "\u2118", "\\wp", true); -defineSymbol(math, textord, "\u266f", "\\sharp", true); -defineSymbol(math, textord, "\u2662", "\\diamondsuit", true); -defineSymbol(math, textord, "\u2666", "\\vardiamondsuit", true); -defineSymbol(math, textord, "\u211c", "\\Re", true); -defineSymbol(math, textord, "\u2661", "\\heartsuit", true); -defineSymbol(math, textord, "\u2665", "\\varheartsuit", true); -defineSymbol(math, textord, "\u2111", "\\Im", true); -defineSymbol(math, textord, "\u2660", "\\spadesuit", true); -defineSymbol(math, textord, "\u2664", "\\varspadesuit", true); -defineSymbol(math, textord, "\u2640", "\\female", true); -defineSymbol(math, textord, "\u2642", "\\male", true); -defineSymbol(math, textord, "\u00a7", "\\S", true); -defineSymbol(text, textord, "\u00a7", "\\S"); -defineSymbol(math, textord, "\u00b6", "\\P", true); -defineSymbol(text, textord, "\u00b6", "\\P"); -defineSymbol(text, textord, "\u263a", "\\smiley", true); -defineSymbol(math, textord, "\u263a", "\\smiley", true); - -// Math and Text -defineSymbol(math, textord, "\u2020", "\\dag"); -defineSymbol(text, textord, "\u2020", "\\dag"); -defineSymbol(text, textord, "\u2020", "\\textdagger"); -defineSymbol(math, textord, "\u2021", "\\ddag"); -defineSymbol(text, textord, "\u2021", "\\ddag"); -defineSymbol(text, textord, "\u2021", "\\textdaggerdbl"); - -// Large Delimiters -defineSymbol(math, close, "\u23b1", "\\rmoustache", true); -defineSymbol(math, open, "\u23b0", "\\lmoustache", true); -defineSymbol(math, close, "\u27ef", "\\rgroup", true); -defineSymbol(math, open, "\u27ee", "\\lgroup", true); - -// Binary Operators -defineSymbol(math, bin, "\u2213", "\\mp", true); -defineSymbol(math, bin, "\u2296", "\\ominus", true); -defineSymbol(math, bin, "\u228e", "\\uplus", true); -defineSymbol(math, bin, "\u2293", "\\sqcap", true); -defineSymbol(math, bin, "\u2217", "\\ast"); -defineSymbol(math, bin, "\u2294", "\\sqcup", true); -defineSymbol(math, bin, "\u25ef", "\\bigcirc", true); -defineSymbol(math, bin, "\u2219", "\\bullet", true); -defineSymbol(math, bin, "\u2021", "\\ddagger"); -defineSymbol(math, bin, "\u2240", "\\wr", true); -defineSymbol(math, bin, "\u2a3f", "\\amalg"); -defineSymbol(math, bin, "\u0026", "\\And"); // from amsmath -defineSymbol(math, bin, "\u2AFD", "\\sslash", true); // from stmaryrd - -// Arrow Symbols -defineSymbol(math, rel, "\u27f5", "\\longleftarrow", true); -defineSymbol(math, rel, "\u21d0", "\\Leftarrow", true); -defineSymbol(math, rel, "\u27f8", "\\Longleftarrow", true); -defineSymbol(math, rel, "\u27f6", "\\longrightarrow", true); -defineSymbol(math, rel, "\u21d2", "\\Rightarrow", true); -defineSymbol(math, rel, "\u27f9", "\\Longrightarrow", true); -defineSymbol(math, rel, "\u2194", "\\leftrightarrow", true); -defineSymbol(math, rel, "\u27f7", "\\longleftrightarrow", true); -defineSymbol(math, rel, "\u21d4", "\\Leftrightarrow", true); -defineSymbol(math, rel, "\u27fa", "\\Longleftrightarrow", true); -defineSymbol(math, rel, "\u21a4", "\\mapsfrom", true); -defineSymbol(math, rel, "\u21a6", "\\mapsto", true); -defineSymbol(math, rel, "\u27fc", "\\longmapsto", true); -defineSymbol(math, rel, "\u2197", "\\nearrow", true); -defineSymbol(math, rel, "\u21a9", "\\hookleftarrow", true); -defineSymbol(math, rel, "\u21aa", "\\hookrightarrow", true); -defineSymbol(math, rel, "\u2198", "\\searrow", true); -defineSymbol(math, rel, "\u21bc", "\\leftharpoonup", true); -defineSymbol(math, rel, "\u21c0", "\\rightharpoonup", true); -defineSymbol(math, rel, "\u2199", "\\swarrow", true); -defineSymbol(math, rel, "\u21bd", "\\leftharpoondown", true); -defineSymbol(math, rel, "\u21c1", "\\rightharpoondown", true); -defineSymbol(math, rel, "\u2196", "\\nwarrow", true); -defineSymbol(math, rel, "\u21cc", "\\rightleftharpoons", true); -defineSymbol(math, mathord, "\u21af", "\\lightning", true); -defineSymbol(math, mathord, "\u220E", "\\QED", true); -defineSymbol(math, mathord, "\u2030", "\\permil", true); -defineSymbol(text, textord, "\u2030", "\\permil"); -defineSymbol(math, mathord, "\u2609", "\\astrosun", true); -defineSymbol(math, mathord, "\u263c", "\\sun", true); -defineSymbol(math, mathord, "\u263e", "\\leftmoon", true); -defineSymbol(math, mathord, "\u263d", "\\rightmoon", true); -defineSymbol(math, mathord, "\u2295", "\\Earth"); - -// AMS Negated Binary Relations -defineSymbol(math, rel, "\u226e", "\\nless", true); -// Symbol names preceeded by "@" each have a corresponding macro. -defineSymbol(math, rel, "\u2a87", "\\lneq", true); -defineSymbol(math, rel, "\u2268", "\\lneqq", true); -defineSymbol(math, rel, "\u2268\ufe00", "\\lvertneqq"); -defineSymbol(math, rel, "\u22e6", "\\lnsim", true); -defineSymbol(math, rel, "\u2a89", "\\lnapprox", true); -defineSymbol(math, rel, "\u2280", "\\nprec", true); -// unicode-math maps \u22e0 to \npreccurlyeq. We'll use the AMS synonym. -defineSymbol(math, rel, "\u22e0", "\\npreceq", true); -defineSymbol(math, rel, "\u22e8", "\\precnsim", true); -defineSymbol(math, rel, "\u2ab9", "\\precnapprox", true); -defineSymbol(math, rel, "\u2241", "\\nsim", true); -defineSymbol(math, rel, "\u2224", "\\nmid", true); -defineSymbol(math, rel, "\u2224", "\\nshortmid"); -defineSymbol(math, rel, "\u22ac", "\\nvdash", true); -defineSymbol(math, rel, "\u22ad", "\\nvDash", true); -defineSymbol(math, rel, "\u22ea", "\\ntriangleleft"); -defineSymbol(math, rel, "\u22ec", "\\ntrianglelefteq", true); -defineSymbol(math, rel, "\u2284", "\\nsubset", true); -defineSymbol(math, rel, "\u2285", "\\nsupset", true); -defineSymbol(math, rel, "\u228a", "\\subsetneq", true); -defineSymbol(math, rel, "\u228a\ufe00", "\\varsubsetneq"); -defineSymbol(math, rel, "\u2acb", "\\subsetneqq", true); -defineSymbol(math, rel, "\u2acb\ufe00", "\\varsubsetneqq"); -defineSymbol(math, rel, "\u226f", "\\ngtr", true); -defineSymbol(math, rel, "\u2a88", "\\gneq", true); -defineSymbol(math, rel, "\u2269", "\\gneqq", true); -defineSymbol(math, rel, "\u2269\ufe00", "\\gvertneqq"); -defineSymbol(math, rel, "\u22e7", "\\gnsim", true); -defineSymbol(math, rel, "\u2a8a", "\\gnapprox", true); -defineSymbol(math, rel, "\u2281", "\\nsucc", true); -// unicode-math maps \u22e1 to \nsucccurlyeq. We'll use the AMS synonym. -defineSymbol(math, rel, "\u22e1", "\\nsucceq", true); -defineSymbol(math, rel, "\u22e9", "\\succnsim", true); -defineSymbol(math, rel, "\u2aba", "\\succnapprox", true); -// unicode-math maps \u2246 to \simneqq. We'll use the AMS synonym. -defineSymbol(math, rel, "\u2246", "\\ncong", true); -defineSymbol(math, rel, "\u2226", "\\nparallel", true); -defineSymbol(math, rel, "\u2226", "\\nshortparallel"); -defineSymbol(math, rel, "\u22af", "\\nVDash", true); -defineSymbol(math, rel, "\u22eb", "\\ntriangleright"); -defineSymbol(math, rel, "\u22ed", "\\ntrianglerighteq", true); -defineSymbol(math, rel, "\u228b", "\\supsetneq", true); -defineSymbol(math, rel, "\u228b", "\\varsupsetneq"); -defineSymbol(math, rel, "\u2acc", "\\supsetneqq", true); -defineSymbol(math, rel, "\u2acc\ufe00", "\\varsupsetneqq"); -defineSymbol(math, rel, "\u22ae", "\\nVdash", true); -defineSymbol(math, rel, "\u2ab5", "\\precneqq", true); -defineSymbol(math, rel, "\u2ab6", "\\succneqq", true); -defineSymbol(math, bin, "\u22b4", "\\unlhd"); -defineSymbol(math, bin, "\u22b5", "\\unrhd"); - -// AMS Negated Arrows -defineSymbol(math, rel, "\u219a", "\\nleftarrow", true); -defineSymbol(math, rel, "\u219b", "\\nrightarrow", true); -defineSymbol(math, rel, "\u21cd", "\\nLeftarrow", true); -defineSymbol(math, rel, "\u21cf", "\\nRightarrow", true); -defineSymbol(math, rel, "\u21ae", "\\nleftrightarrow", true); -defineSymbol(math, rel, "\u21ce", "\\nLeftrightarrow", true); - -// AMS Misc -defineSymbol(math, rel, "\u25b3", "\\vartriangle"); -defineSymbol(math, textord, "\u210f", "\\hslash"); -defineSymbol(math, textord, "\u25bd", "\\triangledown"); -defineSymbol(math, textord, "\u25ca", "\\lozenge"); -defineSymbol(math, textord, "\u24c8", "\\circledS"); -defineSymbol(math, textord, "\u00ae", "\\circledR", true); -defineSymbol(text, textord, "\u00ae", "\\circledR"); -defineSymbol(text, textord, "\u00ae", "\\textregistered"); -defineSymbol(math, textord, "\u2221", "\\measuredangle", true); -defineSymbol(math, textord, "\u2204", "\\nexists"); -defineSymbol(math, textord, "\u2127", "\\mho"); -defineSymbol(math, textord, "\u2132", "\\Finv", true); -defineSymbol(math, textord, "\u2141", "\\Game", true); -defineSymbol(math, textord, "\u2035", "\\backprime"); -defineSymbol(math, textord, "\u2036", "\\backdprime"); -defineSymbol(math, textord, "\u2037", "\\backtrprime"); -defineSymbol(math, textord, "\u25b2", "\\blacktriangle"); -defineSymbol(math, textord, "\u25bc", "\\blacktriangledown"); -defineSymbol(math, textord, "\u25a0", "\\blacksquare"); -defineSymbol(math, textord, "\u29eb", "\\blacklozenge"); -defineSymbol(math, textord, "\u2605", "\\bigstar"); -defineSymbol(math, textord, "\u2222", "\\sphericalangle", true); -defineSymbol(math, textord, "\u2201", "\\complement", true); -// unicode-math maps U+F0 to \matheth. We map to AMS function \eth -defineSymbol(math, textord, "\u00f0", "\\eth", true); -defineSymbol(text, textord, "\u00f0", "\u00f0"); -defineSymbol(math, textord, "\u2571", "\\diagup"); -defineSymbol(math, textord, "\u2572", "\\diagdown"); -defineSymbol(math, textord, "\u25a1", "\\square"); -defineSymbol(math, textord, "\u25a1", "\\Box"); -defineSymbol(math, textord, "\u25ca", "\\Diamond"); -// unicode-math maps U+A5 to \mathyen. We map to AMS function \yen -defineSymbol(math, textord, "\u00a5", "\\yen", true); -defineSymbol(text, textord, "\u00a5", "\\yen", true); -defineSymbol(math, textord, "\u2713", "\\checkmark", true); -defineSymbol(text, textord, "\u2713", "\\checkmark"); -defineSymbol(math, textord, "\u2717", "\\ballotx", true); -defineSymbol(text, textord, "\u2717", "\\ballotx"); -defineSymbol(text, textord, "\u2022", "\\textbullet"); - -// AMS Hebrew -defineSymbol(math, textord, "\u2136", "\\beth", true); -defineSymbol(math, textord, "\u2138", "\\daleth", true); -defineSymbol(math, textord, "\u2137", "\\gimel", true); - -// AMS Greek -defineSymbol(math, textord, "\u03dd", "\\digamma", true); -defineSymbol(math, textord, "\u03f0", "\\varkappa"); - -// AMS Delimiters -defineSymbol(math, open, "\u231C", "\\ulcorner", true); -defineSymbol(math, close, "\u231D", "\\urcorner", true); -defineSymbol(math, open, "\u231E", "\\llcorner", true); -defineSymbol(math, close, "\u231F", "\\lrcorner", true); - -// AMS Binary Relations -defineSymbol(math, rel, "\u2266", "\\leqq", true); -defineSymbol(math, rel, "\u2a7d", "\\leqslant", true); -defineSymbol(math, rel, "\u2a95", "\\eqslantless", true); -defineSymbol(math, rel, "\u2272", "\\lesssim", true); -defineSymbol(math, rel, "\u2a85", "\\lessapprox", true); -defineSymbol(math, rel, "\u224a", "\\approxeq", true); -defineSymbol(math, bin, "\u22d6", "\\lessdot"); -defineSymbol(math, rel, "\u22d8", "\\lll", true); -defineSymbol(math, rel, "\u2276", "\\lessgtr", true); -defineSymbol(math, rel, "\u22da", "\\lesseqgtr", true); -defineSymbol(math, rel, "\u2a8b", "\\lesseqqgtr", true); -defineSymbol(math, rel, "\u2251", "\\doteqdot"); -defineSymbol(math, rel, "\u2253", "\\risingdotseq", true); -defineSymbol(math, rel, "\u2252", "\\fallingdotseq", true); -defineSymbol(math, rel, "\u223d", "\\backsim", true); -defineSymbol(math, rel, "\u22cd", "\\backsimeq", true); -defineSymbol(math, rel, "\u2ac5", "\\subseteqq", true); -defineSymbol(math, rel, "\u22d0", "\\Subset", true); -defineSymbol(math, rel, "\u228f", "\\sqsubset", true); -defineSymbol(math, rel, "\u227c", "\\preccurlyeq", true); -defineSymbol(math, rel, "\u22de", "\\curlyeqprec", true); -defineSymbol(math, rel, "\u227e", "\\precsim", true); -defineSymbol(math, rel, "\u2ab7", "\\precapprox", true); -defineSymbol(math, rel, "\u22b2", "\\vartriangleleft"); -defineSymbol(math, rel, "\u22b4", "\\trianglelefteq"); -defineSymbol(math, rel, "\u22a8", "\\vDash", true); -defineSymbol(math, rel, "\u22ab", "\\VDash", true); -defineSymbol(math, rel, "\u22aa", "\\Vvdash", true); -defineSymbol(math, rel, "\u2323", "\\smallsmile"); -defineSymbol(math, rel, "\u2322", "\\smallfrown"); -defineSymbol(math, rel, "\u224f", "\\bumpeq", true); -defineSymbol(math, rel, "\u224e", "\\Bumpeq", true); -defineSymbol(math, rel, "\u2267", "\\geqq", true); -defineSymbol(math, rel, "\u2a7e", "\\geqslant", true); -defineSymbol(math, rel, "\u2a96", "\\eqslantgtr", true); -defineSymbol(math, rel, "\u2273", "\\gtrsim", true); -defineSymbol(math, rel, "\u2a86", "\\gtrapprox", true); -defineSymbol(math, bin, "\u22d7", "\\gtrdot"); -defineSymbol(math, rel, "\u22d9", "\\ggg", true); -defineSymbol(math, rel, "\u2277", "\\gtrless", true); -defineSymbol(math, rel, "\u22db", "\\gtreqless", true); -defineSymbol(math, rel, "\u2a8c", "\\gtreqqless", true); -defineSymbol(math, rel, "\u2256", "\\eqcirc", true); -defineSymbol(math, rel, "\u2257", "\\circeq", true); -defineSymbol(math, rel, "\u225c", "\\triangleq", true); -defineSymbol(math, rel, "\u223c", "\\thicksim"); -defineSymbol(math, rel, "\u2248", "\\thickapprox"); -defineSymbol(math, rel, "\u2ac6", "\\supseteqq", true); -defineSymbol(math, rel, "\u22d1", "\\Supset", true); -defineSymbol(math, rel, "\u2290", "\\sqsupset", true); -defineSymbol(math, rel, "\u227d", "\\succcurlyeq", true); -defineSymbol(math, rel, "\u22df", "\\curlyeqsucc", true); -defineSymbol(math, rel, "\u227f", "\\succsim", true); -defineSymbol(math, rel, "\u2ab8", "\\succapprox", true); -defineSymbol(math, rel, "\u22b3", "\\vartriangleright"); -defineSymbol(math, rel, "\u22b5", "\\trianglerighteq"); -defineSymbol(math, rel, "\u22a9", "\\Vdash", true); -defineSymbol(math, rel, "\u2223", "\\shortmid"); -defineSymbol(math, rel, "\u2225", "\\shortparallel"); -defineSymbol(math, rel, "\u226c", "\\between", true); -defineSymbol(math, rel, "\u22d4", "\\pitchfork", true); -defineSymbol(math, rel, "\u221d", "\\varpropto"); -defineSymbol(math, rel, "\u25c0", "\\blacktriangleleft"); -// unicode-math says that \therefore is a mathord atom. -// We kept the amssymb atom type, which is rel. -defineSymbol(math, rel, "\u2234", "\\therefore", true); -defineSymbol(math, rel, "\u220d", "\\backepsilon"); -defineSymbol(math, rel, "\u25b6", "\\blacktriangleright"); -// unicode-math says that \because is a mathord atom. -// We kept the amssymb atom type, which is rel. -defineSymbol(math, rel, "\u2235", "\\because", true); -defineSymbol(math, rel, "\u22d8", "\\llless"); -defineSymbol(math, rel, "\u22d9", "\\gggtr"); -defineSymbol(math, bin, "\u22b2", "\\lhd"); -defineSymbol(math, bin, "\u22b3", "\\rhd"); -defineSymbol(math, rel, "\u2242", "\\eqsim", true); -defineSymbol(math, rel, "\u2251", "\\Doteq", true); -defineSymbol(math, rel, "\u297d", "\\strictif", true); -defineSymbol(math, rel, "\u297c", "\\strictfi", true); - -// AMS Binary Operators -defineSymbol(math, bin, "\u2214", "\\dotplus", true); -defineSymbol(math, bin, "\u2216", "\\smallsetminus"); -defineSymbol(math, bin, "\u22d2", "\\Cap", true); -defineSymbol(math, bin, "\u22d3", "\\Cup", true); -defineSymbol(math, bin, "\u2a5e", "\\doublebarwedge", true); -defineSymbol(math, bin, "\u229f", "\\boxminus", true); -defineSymbol(math, bin, "\u229e", "\\boxplus", true); -defineSymbol(math, bin, "\u22c7", "\\divideontimes", true); -defineSymbol(math, bin, "\u22c9", "\\ltimes", true); -defineSymbol(math, bin, "\u22ca", "\\rtimes", true); -defineSymbol(math, bin, "\u22cb", "\\leftthreetimes", true); -defineSymbol(math, bin, "\u22cc", "\\rightthreetimes", true); -defineSymbol(math, bin, "\u22cf", "\\curlywedge", true); -defineSymbol(math, bin, "\u22ce", "\\curlyvee", true); -defineSymbol(math, bin, "\u229d", "\\circleddash", true); -defineSymbol(math, bin, "\u229b", "\\circledast", true); -defineSymbol(math, bin, "\u22ba", "\\intercal", true); -defineSymbol(math, bin, "\u22d2", "\\doublecap"); -defineSymbol(math, bin, "\u22d3", "\\doublecup"); -defineSymbol(math, bin, "\u22a0", "\\boxtimes", true); -defineSymbol(math, bin, "\u22c8", "\\bowtie", true); -defineSymbol(math, bin, "\u22c8", "\\Join"); -defineSymbol(math, bin, "\u27d5", "\\leftouterjoin", true); -defineSymbol(math, bin, "\u27d6", "\\rightouterjoin", true); -defineSymbol(math, bin, "\u27d7", "\\fullouterjoin", true); - -// stix Binary Operators -defineSymbol(math, bin, "\u2238", "\\dotminus", true); -defineSymbol(math, bin, "\u27D1", "\\wedgedot", true); -defineSymbol(math, bin, "\u27C7", "\\veedot", true); -defineSymbol(math, bin, "\u2A62", "\\doublebarvee", true); -defineSymbol(math, bin, "\u2A63", "\\veedoublebar", true); -defineSymbol(math, bin, "\u2A5F", "\\wedgebar", true); -defineSymbol(math, bin, "\u2A60", "\\wedgedoublebar", true); -defineSymbol(math, bin, "\u2A54", "\\Vee", true); -defineSymbol(math, bin, "\u2A53", "\\Wedge", true); -defineSymbol(math, bin, "\u2A43", "\\barcap", true); -defineSymbol(math, bin, "\u2A42", "\\barcup", true); -defineSymbol(math, bin, "\u2A48", "\\capbarcup", true); -defineSymbol(math, bin, "\u2A40", "\\capdot", true); -defineSymbol(math, bin, "\u2A47", "\\capovercup", true); -defineSymbol(math, bin, "\u2A46", "\\cupovercap", true); -defineSymbol(math, bin, "\u2A4D", "\\closedvarcap", true); -defineSymbol(math, bin, "\u2A4C", "\\closedvarcup", true); -defineSymbol(math, bin, "\u2A2A", "\\minusdot", true); -defineSymbol(math, bin, "\u2A2B", "\\minusfdots", true); -defineSymbol(math, bin, "\u2A2C", "\\minusrdots", true); -defineSymbol(math, bin, "\u22BB", "\\Xor", true); -defineSymbol(math, bin, "\u22BC", "\\Nand", true); -defineSymbol(math, bin, "\u22BD", "\\Nor", true); -defineSymbol(math, bin, "\u22BD", "\\barvee"); -defineSymbol(math, bin, "\u2AF4", "\\interleave", true); -defineSymbol(math, bin, "\u29E2", "\\shuffle", true); -defineSymbol(math, bin, "\u2AF6", "\\threedotcolon", true); -defineSymbol(math, bin, "\u2982", "\\typecolon", true); -defineSymbol(math, bin, "\u223E", "\\invlazys", true); -defineSymbol(math, bin, "\u2A4B", "\\twocaps", true); -defineSymbol(math, bin, "\u2A4A", "\\twocups", true); -defineSymbol(math, bin, "\u2A4E", "\\Sqcap", true); -defineSymbol(math, bin, "\u2A4F", "\\Sqcup", true); -defineSymbol(math, bin, "\u2A56", "\\veeonvee", true); -defineSymbol(math, bin, "\u2A55", "\\wedgeonwedge", true); -defineSymbol(math, bin, "\u29D7", "\\blackhourglass", true); -defineSymbol(math, bin, "\u29C6", "\\boxast", true); -defineSymbol(math, bin, "\u29C8", "\\boxbox", true); -defineSymbol(math, bin, "\u29C7", "\\boxcircle", true); -defineSymbol(math, bin, "\u229C", "\\circledequal", true); -defineSymbol(math, bin, "\u29B7", "\\circledparallel", true); -defineSymbol(math, bin, "\u29B6", "\\circledvert", true); -defineSymbol(math, bin, "\u29B5", "\\circlehbar", true); -defineSymbol(math, bin, "\u27E1", "\\concavediamond", true); -defineSymbol(math, bin, "\u27E2", "\\concavediamondtickleft", true); -defineSymbol(math, bin, "\u27E3", "\\concavediamondtickright", true); -defineSymbol(math, bin, "\u22C4", "\\diamond", true); -defineSymbol(math, bin, "\u29D6", "\\hourglass", true); -defineSymbol(math, bin, "\u27E0", "\\lozengeminus", true); -defineSymbol(math, bin, "\u233D", "\\obar", true); -defineSymbol(math, bin, "\u29B8", "\\obslash", true); -defineSymbol(math, bin, "\u2A38", "\\odiv", true); -defineSymbol(math, bin, "\u29C1", "\\ogreaterthan", true); -defineSymbol(math, bin, "\u29C0", "\\olessthan", true); -defineSymbol(math, bin, "\u29B9", "\\operp", true); -defineSymbol(math, bin, "\u2A37", "\\Otimes", true); -defineSymbol(math, bin, "\u2A36", "\\otimeshat", true); -defineSymbol(math, bin, "\u22C6", "\\star", true); -defineSymbol(math, bin, "\u25B3", "\\triangle", true); -defineSymbol(math, bin, "\u2A3A", "\\triangleminus", true); -defineSymbol(math, bin, "\u2A39", "\\triangleplus", true); -defineSymbol(math, bin, "\u2A3B", "\\triangletimes", true); -defineSymbol(math, bin, "\u27E4", "\\whitesquaretickleft", true); -defineSymbol(math, bin, "\u27E5", "\\whitesquaretickright", true); -defineSymbol(math, bin, "\u2A33", "\\smashtimes", true); - -// AMS Arrows -// Note: unicode-math maps \u21e2 to their own function \rightdasharrow. -// We'll map it to AMS function \dashrightarrow. It produces the same atom. -defineSymbol(math, rel, "\u21e2", "\\dashrightarrow", true); -// unicode-math maps \u21e0 to \leftdasharrow. We'll use the AMS synonym. -defineSymbol(math, rel, "\u21e0", "\\dashleftarrow", true); -defineSymbol(math, rel, "\u21c7", "\\leftleftarrows", true); -defineSymbol(math, rel, "\u21c6", "\\leftrightarrows", true); -defineSymbol(math, rel, "\u21da", "\\Lleftarrow", true); -defineSymbol(math, rel, "\u219e", "\\twoheadleftarrow", true); -defineSymbol(math, rel, "\u21a2", "\\leftarrowtail", true); -defineSymbol(math, rel, "\u21ab", "\\looparrowleft", true); -defineSymbol(math, rel, "\u21cb", "\\leftrightharpoons", true); -defineSymbol(math, rel, "\u21b6", "\\curvearrowleft", true); -// unicode-math maps \u21ba to \acwopencirclearrow. We'll use the AMS synonym. -defineSymbol(math, rel, "\u21ba", "\\circlearrowleft", true); -defineSymbol(math, rel, "\u21b0", "\\Lsh", true); -defineSymbol(math, rel, "\u21c8", "\\upuparrows", true); -defineSymbol(math, rel, "\u21bf", "\\upharpoonleft", true); -defineSymbol(math, rel, "\u21c3", "\\downharpoonleft", true); -defineSymbol(math, rel, "\u22b6", "\\origof", true); -defineSymbol(math, rel, "\u22b7", "\\imageof", true); -defineSymbol(math, rel, "\u22b8", "\\multimap", true); -defineSymbol(math, rel, "\u21ad", "\\leftrightsquigarrow", true); -defineSymbol(math, rel, "\u21c9", "\\rightrightarrows", true); -defineSymbol(math, rel, "\u21c4", "\\rightleftarrows", true); -defineSymbol(math, rel, "\u21a0", "\\twoheadrightarrow", true); -defineSymbol(math, rel, "\u21a3", "\\rightarrowtail", true); -defineSymbol(math, rel, "\u21ac", "\\looparrowright", true); -defineSymbol(math, rel, "\u21b7", "\\curvearrowright", true); -// unicode-math maps \u21bb to \cwopencirclearrow. We'll use the AMS synonym. -defineSymbol(math, rel, "\u21bb", "\\circlearrowright", true); -defineSymbol(math, rel, "\u21b1", "\\Rsh", true); -defineSymbol(math, rel, "\u21ca", "\\downdownarrows", true); -defineSymbol(math, rel, "\u21be", "\\upharpoonright", true); -defineSymbol(math, rel, "\u21c2", "\\downharpoonright", true); -defineSymbol(math, rel, "\u21dd", "\\rightsquigarrow", true); -defineSymbol(math, rel, "\u21dd", "\\leadsto"); -defineSymbol(math, rel, "\u21db", "\\Rrightarrow", true); -defineSymbol(math, rel, "\u21be", "\\restriction"); - -defineSymbol(math, textord, "\u2018", "`"); -defineSymbol(math, textord, "$", "\\$"); -defineSymbol(text, textord, "$", "\\$"); -defineSymbol(text, textord, "$", "\\textdollar"); -defineSymbol(math, textord, "¢", "\\cent"); -defineSymbol(text, textord, "¢", "\\cent"); -defineSymbol(math, textord, "%", "\\%"); -defineSymbol(text, textord, "%", "\\%"); -defineSymbol(math, textord, "_", "\\_"); -defineSymbol(text, textord, "_", "\\_"); -defineSymbol(text, textord, "_", "\\textunderscore"); -defineSymbol(text, textord, "\u2423", "\\textvisiblespace", true); -defineSymbol(math, textord, "\u2220", "\\angle", true); -defineSymbol(math, textord, "\u221e", "\\infty", true); -defineSymbol(math, textord, "\u2032", "\\prime"); -defineSymbol(math, textord, "\u2033", "\\dprime"); -defineSymbol(math, textord, "\u2034", "\\trprime"); -defineSymbol(math, textord, "\u2057", "\\qprime"); -defineSymbol(math, textord, "\u25b3", "\\triangle"); -defineSymbol(text, textord, "\u0391", "\\Alpha", true); -defineSymbol(text, textord, "\u0392", "\\Beta", true); -defineSymbol(text, textord, "\u0393", "\\Gamma", true); -defineSymbol(text, textord, "\u0394", "\\Delta", true); -defineSymbol(text, textord, "\u0395", "\\Epsilon", true); -defineSymbol(text, textord, "\u0396", "\\Zeta", true); -defineSymbol(text, textord, "\u0397", "\\Eta", true); -defineSymbol(text, textord, "\u0398", "\\Theta", true); -defineSymbol(text, textord, "\u0399", "\\Iota", true); -defineSymbol(text, textord, "\u039a", "\\Kappa", true); -defineSymbol(text, textord, "\u039b", "\\Lambda", true); -defineSymbol(text, textord, "\u039c", "\\Mu", true); -defineSymbol(text, textord, "\u039d", "\\Nu", true); -defineSymbol(text, textord, "\u039e", "\\Xi", true); -defineSymbol(text, textord, "\u039f", "\\Omicron", true); -defineSymbol(text, textord, "\u03a0", "\\Pi", true); -defineSymbol(text, textord, "\u03a1", "\\Rho", true); -defineSymbol(text, textord, "\u03a3", "\\Sigma", true); -defineSymbol(text, textord, "\u03a4", "\\Tau", true); -defineSymbol(text, textord, "\u03a5", "\\Upsilon", true); -defineSymbol(text, textord, "\u03a6", "\\Phi", true); -defineSymbol(text, textord, "\u03a7", "\\Chi", true); -defineSymbol(text, textord, "\u03a8", "\\Psi", true); -defineSymbol(text, textord, "\u03a9", "\\Omega", true); -defineSymbol(math, mathord, "\u0391", "\\Alpha", true); -defineSymbol(math, mathord, "\u0392", "\\Beta", true); -defineSymbol(math, mathord, "\u0393", "\\Gamma", true); -defineSymbol(math, mathord, "\u0394", "\\Delta", true); -defineSymbol(math, mathord, "\u0395", "\\Epsilon", true); -defineSymbol(math, mathord, "\u0396", "\\Zeta", true); -defineSymbol(math, mathord, "\u0397", "\\Eta", true); -defineSymbol(math, mathord, "\u0398", "\\Theta", true); -defineSymbol(math, mathord, "\u0399", "\\Iota", true); -defineSymbol(math, mathord, "\u039a", "\\Kappa", true); -defineSymbol(math, mathord, "\u039b", "\\Lambda", true); -defineSymbol(math, mathord, "\u039c", "\\Mu", true); -defineSymbol(math, mathord, "\u039d", "\\Nu", true); -defineSymbol(math, mathord, "\u039e", "\\Xi", true); -defineSymbol(math, mathord, "\u039f", "\\Omicron", true); -defineSymbol(math, mathord, "\u03a0", "\\Pi", true); -defineSymbol(math, mathord, "\u03a1", "\\Rho", true); -defineSymbol(math, mathord, "\u03a3", "\\Sigma", true); -defineSymbol(math, mathord, "\u03a4", "\\Tau", true); -defineSymbol(math, mathord, "\u03a5", "\\Upsilon", true); -defineSymbol(math, mathord, "\u03a6", "\\Phi", true); -defineSymbol(math, mathord, "\u03a7", "\\Chi", true); -defineSymbol(math, mathord, "\u03a8", "\\Psi", true); -defineSymbol(math, mathord, "\u03a9", "\\Omega", true); -defineSymbol(math, open, "\u00ac", "\\neg", true); -defineSymbol(math, open, "\u00ac", "\\lnot"); -defineSymbol(math, textord, "\u22a4", "\\top"); -defineSymbol(math, textord, "\u22a5", "\\bot"); -defineSymbol(math, textord, "\u2205", "\\emptyset"); -defineSymbol(math, textord, "\u2300", "\\varnothing"); -defineSymbol(math, mathord, "\u03b1", "\\alpha", true); -defineSymbol(math, mathord, "\u03b2", "\\beta", true); -defineSymbol(math, mathord, "\u03b3", "\\gamma", true); -defineSymbol(math, mathord, "\u03b4", "\\delta", true); -defineSymbol(math, mathord, "\u03f5", "\\epsilon", true); -defineSymbol(math, mathord, "\u03b6", "\\zeta", true); -defineSymbol(math, mathord, "\u03b7", "\\eta", true); -defineSymbol(math, mathord, "\u03b8", "\\theta", true); -defineSymbol(math, mathord, "\u03b9", "\\iota", true); -defineSymbol(math, mathord, "\u03ba", "\\kappa", true); -defineSymbol(math, mathord, "\u03bb", "\\lambda", true); -defineSymbol(math, mathord, "\u03bc", "\\mu", true); -defineSymbol(math, mathord, "\u03bd", "\\nu", true); -defineSymbol(math, mathord, "\u03be", "\\xi", true); -defineSymbol(math, mathord, "\u03bf", "\\omicron", true); -defineSymbol(math, mathord, "\u03c0", "\\pi", true); -defineSymbol(math, mathord, "\u03c1", "\\rho", true); -defineSymbol(math, mathord, "\u03c3", "\\sigma", true); -defineSymbol(math, mathord, "\u03c4", "\\tau", true); -defineSymbol(math, mathord, "\u03c5", "\\upsilon", true); -defineSymbol(math, mathord, "\u03d5", "\\phi", true); -defineSymbol(math, mathord, "\u03c7", "\\chi", true); -defineSymbol(math, mathord, "\u03c8", "\\psi", true); -defineSymbol(math, mathord, "\u03c9", "\\omega", true); -defineSymbol(math, mathord, "\u03b5", "\\varepsilon", true); -defineSymbol(math, mathord, "\u03d1", "\\vartheta", true); -defineSymbol(math, mathord, "\u03d6", "\\varpi", true); -defineSymbol(math, mathord, "\u03f1", "\\varrho", true); -defineSymbol(math, mathord, "\u03c2", "\\varsigma", true); -defineSymbol(math, mathord, "\u03c6", "\\varphi", true); -defineSymbol(math, mathord, "\u03d8", "\\Coppa", true); -defineSymbol(math, mathord, "\u03d9", "\\coppa", true); -defineSymbol(math, mathord, "\u03d9", "\\varcoppa", true); -defineSymbol(math, mathord, "\u03de", "\\Koppa", true); -defineSymbol(math, mathord, "\u03df", "\\koppa", true); -defineSymbol(math, mathord, "\u03e0", "\\Sampi", true); -defineSymbol(math, mathord, "\u03e1", "\\sampi", true); -defineSymbol(math, mathord, "\u03da", "\\Stigma", true); -defineSymbol(math, mathord, "\u03db", "\\stigma", true); -defineSymbol(math, mathord, "\u2aeb", "\\Bot"); -defineSymbol(math, bin, "\u2217", "\u2217", true); -defineSymbol(math, bin, "+", "+"); -defineSymbol(math, bin, "*", "*"); -defineSymbol(math, bin, "\u2044", "/", true); -defineSymbol(math, bin, "\u2044", "\u2044"); -defineSymbol(math, bin, "\u2212", "-", true); -defineSymbol(math, bin, "\u22c5", "\\cdot", true); -defineSymbol(math, bin, "\u2218", "\\circ", true); -defineSymbol(math, bin, "\u00f7", "\\div", true); -defineSymbol(math, bin, "\u00b1", "\\pm", true); -defineSymbol(math, bin, "\u00d7", "\\times", true); -defineSymbol(math, bin, "\u2229", "\\cap", true); -defineSymbol(math, bin, "\u222a", "\\cup", true); -defineSymbol(math, bin, "\u2216", "\\setminus", true); -defineSymbol(math, bin, "\u2227", "\\land"); -defineSymbol(math, bin, "\u2228", "\\lor"); -defineSymbol(math, bin, "\u2227", "\\wedge", true); -defineSymbol(math, bin, "\u2228", "\\vee", true); -defineSymbol(math, open, "\u27e6", "\\llbracket", true); // stmaryrd/semantic packages -defineSymbol(math, close, "\u27e7", "\\rrbracket", true); -defineSymbol(math, open, "\u27e8", "\\langle", true); -defineSymbol(math, open, "\u27ea", "\\lAngle", true); -defineSymbol(math, open, "\u2989", "\\llangle", true); -defineSymbol(math, open, "|", "\\lvert"); -defineSymbol(math, open, "\u2016", "\\lVert"); -defineSymbol(math, textord, "!", "\\oc"); // cmll package -defineSymbol(math, textord, "?", "\\wn"); -defineSymbol(math, textord, "\u2193", "\\shpos"); -defineSymbol(math, textord, "\u2195", "\\shift"); -defineSymbol(math, textord, "\u2191", "\\shneg"); -defineSymbol(math, close, "?", "?"); -defineSymbol(math, close, "!", "!"); -defineSymbol(math, close, "‼", "‼"); -defineSymbol(math, close, "\u27e9", "\\rangle", true); -defineSymbol(math, close, "\u27eb", "\\rAngle", true); -defineSymbol(math, close, "\u298a", "\\rrangle", true); -defineSymbol(math, close, "|", "\\rvert"); -defineSymbol(math, close, "\u2016", "\\rVert"); -defineSymbol(math, open, "\u2983", "\\lBrace", true); // stmaryrd/semantic packages -defineSymbol(math, close, "\u2984", "\\rBrace", true); -defineSymbol(math, rel, "=", "\\equal", true); -defineSymbol(math, rel, ":", ":"); -defineSymbol(math, rel, "\u2248", "\\approx", true); -defineSymbol(math, rel, "\u2245", "\\cong", true); -defineSymbol(math, rel, "\u2265", "\\ge"); -defineSymbol(math, rel, "\u2265", "\\geq", true); -defineSymbol(math, rel, "\u2190", "\\gets"); -defineSymbol(math, rel, ">", "\\gt", true); -defineSymbol(math, rel, "\u2208", "\\in", true); -defineSymbol(math, rel, "\u2209", "\\notin", true); -defineSymbol(math, rel, "\ue020", "\\@not"); -defineSymbol(math, rel, "\u2282", "\\subset", true); -defineSymbol(math, rel, "\u2283", "\\supset", true); -defineSymbol(math, rel, "\u2286", "\\subseteq", true); -defineSymbol(math, rel, "\u2287", "\\supseteq", true); -defineSymbol(math, rel, "\u2288", "\\nsubseteq", true); -defineSymbol(math, rel, "\u2288", "\\nsubseteqq"); -defineSymbol(math, rel, "\u2289", "\\nsupseteq", true); -defineSymbol(math, rel, "\u2289", "\\nsupseteqq"); -defineSymbol(math, rel, "\u22a8", "\\models"); -defineSymbol(math, rel, "\u2190", "\\leftarrow", true); -defineSymbol(math, rel, "\u2264", "\\le"); -defineSymbol(math, rel, "\u2264", "\\leq", true); -defineSymbol(math, rel, "<", "\\lt", true); -defineSymbol(math, rel, "\u2192", "\\rightarrow", true); -defineSymbol(math, rel, "\u2192", "\\to"); -defineSymbol(math, rel, "\u2271", "\\ngeq", true); -defineSymbol(math, rel, "\u2271", "\\ngeqq"); -defineSymbol(math, rel, "\u2271", "\\ngeqslant"); -defineSymbol(math, rel, "\u2270", "\\nleq", true); -defineSymbol(math, rel, "\u2270", "\\nleqq"); -defineSymbol(math, rel, "\u2270", "\\nleqslant"); -defineSymbol(math, rel, "\u2aeb", "\\Perp", true); //cmll package -defineSymbol(math, spacing, "\u00a0", "\\ "); -defineSymbol(math, spacing, "\u00a0", "\\space"); -// Ref: LaTeX Source 2e: \DeclareRobustCommand{\nobreakspace}{% -defineSymbol(math, spacing, "\u00a0", "\\nobreakspace"); -defineSymbol(text, spacing, "\u00a0", "\\ "); -defineSymbol(text, spacing, "\u00a0", " "); -defineSymbol(text, spacing, "\u00a0", "\\space"); -defineSymbol(text, spacing, "\u00a0", "\\nobreakspace"); -defineSymbol(math, spacing, null, "\\nobreak"); -defineSymbol(math, spacing, null, "\\allowbreak"); -defineSymbol(math, punct, ",", ","); -defineSymbol(text, punct, ":", ":"); -defineSymbol(math, punct, ";", ";"); -defineSymbol(math, bin, "\u22bc", "\\barwedge"); -defineSymbol(math, bin, "\u22bb", "\\veebar"); -defineSymbol(math, bin, "\u2299", "\\odot", true); -// Firefox turns ⊕ into an emoji. So append \uFE0E. Define Unicode character in macros, not here. -defineSymbol(math, bin, "\u2295\uFE0E", "\\oplus"); -defineSymbol(math, bin, "\u2297", "\\otimes", true); -defineSymbol(math, textord, "\u2202", "\\partial", true); -defineSymbol(math, bin, "\u2298", "\\oslash", true); -defineSymbol(math, bin, "\u229a", "\\circledcirc", true); -defineSymbol(math, bin, "\u22a1", "\\boxdot", true); -defineSymbol(math, bin, "\u25b3", "\\bigtriangleup"); -defineSymbol(math, bin, "\u25bd", "\\bigtriangledown"); -defineSymbol(math, bin, "\u2020", "\\dagger"); -defineSymbol(math, bin, "\u22c4", "\\diamond"); -defineSymbol(math, bin, "\u25c3", "\\triangleleft"); -defineSymbol(math, bin, "\u25b9", "\\triangleright"); -defineSymbol(math, open, "{", "\\{"); -defineSymbol(text, textord, "{", "\\{"); -defineSymbol(text, textord, "{", "\\textbraceleft"); -defineSymbol(math, close, "}", "\\}"); -defineSymbol(text, textord, "}", "\\}"); -defineSymbol(text, textord, "}", "\\textbraceright"); -defineSymbol(math, open, "{", "\\lbrace"); -defineSymbol(math, close, "}", "\\rbrace"); -defineSymbol(math, open, "[", "\\lbrack", true); -defineSymbol(text, textord, "[", "\\lbrack", true); -defineSymbol(math, close, "]", "\\rbrack", true); -defineSymbol(text, textord, "]", "\\rbrack", true); -defineSymbol(math, open, "(", "\\lparen", true); -defineSymbol(math, close, ")", "\\rparen", true); -defineSymbol(math, open, "⦇", "\\llparenthesis", true); -defineSymbol(math, close, "⦈", "\\rrparenthesis", true); -defineSymbol(text, textord, "<", "\\textless", true); // in T1 fontenc -defineSymbol(text, textord, ">", "\\textgreater", true); // in T1 fontenc -defineSymbol(math, open, "\u230a", "\\lfloor", true); -defineSymbol(math, close, "\u230b", "\\rfloor", true); -defineSymbol(math, open, "\u2308", "\\lceil", true); -defineSymbol(math, close, "\u2309", "\\rceil", true); -defineSymbol(math, textord, "\\", "\\backslash"); -defineSymbol(math, textord, "|", "|"); -defineSymbol(math, textord, "|", "\\vert"); -defineSymbol(text, textord, "|", "\\textbar", true); // in T1 fontenc -defineSymbol(math, textord, "\u2016", "\\|"); -defineSymbol(math, textord, "\u2016", "\\Vert"); -defineSymbol(text, textord, "\u2016", "\\textbardbl"); -defineSymbol(text, textord, "~", "\\textasciitilde"); -defineSymbol(text, textord, "\\", "\\textbackslash"); -defineSymbol(text, textord, "^", "\\textasciicircum"); -defineSymbol(math, rel, "\u2191", "\\uparrow", true); -defineSymbol(math, rel, "\u21d1", "\\Uparrow", true); -defineSymbol(math, rel, "\u2193", "\\downarrow", true); -defineSymbol(math, rel, "\u21d3", "\\Downarrow", true); -defineSymbol(math, rel, "\u2195", "\\updownarrow", true); -defineSymbol(math, rel, "\u21d5", "\\Updownarrow", true); -defineSymbol(math, op, "\u2210", "\\coprod"); -defineSymbol(math, op, "\u22c1", "\\bigvee"); -defineSymbol(math, op, "\u22c0", "\\bigwedge"); -defineSymbol(math, op, "\u2a04", "\\biguplus"); -defineSymbol(math, op, "\u22c2", "\\bigcap"); -defineSymbol(math, op, "\u22c3", "\\bigcup"); -defineSymbol(math, op, "\u222b", "\\int"); -defineSymbol(math, op, "\u222b", "\\intop"); -defineSymbol(math, op, "\u222c", "\\iint"); -defineSymbol(math, op, "\u222d", "\\iiint"); -defineSymbol(math, op, "\u220f", "\\prod"); -defineSymbol(math, op, "\u2211", "\\sum"); -defineSymbol(math, op, "\u2a02", "\\bigotimes"); -defineSymbol(math, op, "\u2a01", "\\bigoplus"); -defineSymbol(math, op, "\u2a00", "\\bigodot"); -defineSymbol(math, op, "\u2a09", "\\bigtimes"); -defineSymbol(math, op, "\u222e", "\\oint"); -defineSymbol(math, op, "\u222f", "\\oiint"); -defineSymbol(math, op, "\u2230", "\\oiiint"); -defineSymbol(math, op, "\u2231", "\\intclockwise"); -defineSymbol(math, op, "\u2232", "\\varointclockwise"); -defineSymbol(math, op, "\u2a0c", "\\iiiint"); -defineSymbol(math, op, "\u2a0d", "\\intbar"); -defineSymbol(math, op, "\u2a0e", "\\intBar"); -defineSymbol(math, op, "\u2a0f", "\\fint"); -defineSymbol(math, op, "\u2a12", "\\rppolint"); -defineSymbol(math, op, "\u2a13", "\\scpolint"); -defineSymbol(math, op, "\u2a15", "\\pointint"); -defineSymbol(math, op, "\u2a16", "\\sqint"); -defineSymbol(math, op, "\u2a17", "\\intlarhk"); -defineSymbol(math, op, "\u2a18", "\\intx"); -defineSymbol(math, op, "\u2a19", "\\intcap"); -defineSymbol(math, op, "\u2a1a", "\\intcup"); -defineSymbol(math, op, "\u2a05", "\\bigsqcap"); -defineSymbol(math, op, "\u2a06", "\\bigsqcup"); -defineSymbol(math, op, "\u222b", "\\smallint"); -defineSymbol(text, inner, "\u2026", "\\textellipsis"); -defineSymbol(math, inner, "\u2026", "\\mathellipsis"); -defineSymbol(text, inner, "\u2026", "\\ldots", true); -defineSymbol(math, inner, "\u2026", "\\ldots", true); -defineSymbol(math, inner, "\u22f0", "\\iddots", true); -defineSymbol(math, inner, "\u22ef", "\\@cdots", true); -defineSymbol(math, inner, "\u22f1", "\\ddots", true); -defineSymbol(math, textord, "\u22ee", "\\varvdots"); // \vdots is a macro -defineSymbol(math, accent, "\u02ca", "\\acute"); -defineSymbol(math, accent, "\u0060", "\\grave"); -defineSymbol(math, accent, "\u00a8", "\\ddot"); -defineSymbol(math, accent, "\u2026", "\\dddot"); -defineSymbol(math, accent, "\u2026\u002e", "\\ddddot"); -defineSymbol(math, accent, "\u007e", "\\tilde"); -defineSymbol(math, accent, "\u203e", "\\bar"); -defineSymbol(math, accent, "\u02d8", "\\breve"); -defineSymbol(math, accent, "\u02c7", "\\check"); -defineSymbol(math, accent, "\u005e", "\\hat"); -defineSymbol(math, accent, "\u2192", "\\vec"); -defineSymbol(math, accent, "\u02d9", "\\dot"); -defineSymbol(math, accent, "\u02da", "\\mathring"); -defineSymbol(math, mathord, "\u0131", "\\imath", true); -defineSymbol(math, mathord, "\u0237", "\\jmath", true); -defineSymbol(math, textord, "\u0131", "\u0131"); -defineSymbol(math, textord, "\u0237", "\u0237"); -defineSymbol(text, textord, "\u0131", "\\i", true); -defineSymbol(text, textord, "\u0237", "\\j", true); -defineSymbol(text, textord, "\u00df", "\\ss", true); -defineSymbol(text, textord, "\u00e6", "\\ae", true); -defineSymbol(text, textord, "\u0153", "\\oe", true); -defineSymbol(text, textord, "\u00f8", "\\o", true); -defineSymbol(math, mathord, "\u00f8", "\\o", true); -defineSymbol(text, textord, "\u00c6", "\\AE", true); -defineSymbol(text, textord, "\u0152", "\\OE", true); -defineSymbol(text, textord, "\u00d8", "\\O", true); -defineSymbol(math, mathord, "\u00d8", "\\O", true); -defineSymbol(text, accent, "\u02ca", "\\'"); // acute -defineSymbol(text, accent, "\u02cb", "\\`"); // grave -defineSymbol(text, accent, "\u02c6", "\\^"); // circumflex -defineSymbol(text, accent, "\u02dc", "\\~"); // tilde -defineSymbol(text, accent, "\u02c9", "\\="); // macron -defineSymbol(text, accent, "\u02d8", "\\u"); // breve -defineSymbol(text, accent, "\u02d9", "\\."); // dot above -defineSymbol(text, accent, "\u00b8", "\\c"); // cedilla -defineSymbol(text, accent, "\u02da", "\\r"); // ring above -defineSymbol(text, accent, "\u02c7", "\\v"); // caron -defineSymbol(text, accent, "\u00a8", '\\"'); // diaresis -defineSymbol(text, accent, "\u02dd", "\\H"); // double acute -defineSymbol(math, accent, "\u02ca", "\\'"); // acute -defineSymbol(math, accent, "\u02cb", "\\`"); // grave -defineSymbol(math, accent, "\u02c6", "\\^"); // circumflex -defineSymbol(math, accent, "\u02dc", "\\~"); // tilde -defineSymbol(math, accent, "\u02c9", "\\="); // macron -defineSymbol(math, accent, "\u02d8", "\\u"); // breve -defineSymbol(math, accent, "\u02d9", "\\."); // dot above -defineSymbol(math, accent, "\u00b8", "\\c"); // cedilla -defineSymbol(math, accent, "\u02da", "\\r"); // ring above -defineSymbol(math, accent, "\u02c7", "\\v"); // caron -defineSymbol(math, accent, "\u00a8", '\\"'); // diaresis -defineSymbol(math, accent, "\u02dd", "\\H"); // double acute - -// These ligatures are detected and created in Parser.js's `formLigatures`. -const ligatures = { - "--": true, - "---": true, - "``": true, - "''": true -}; - -defineSymbol(text, textord, "\u2013", "--", true); -defineSymbol(text, textord, "\u2013", "\\textendash"); -defineSymbol(text, textord, "\u2014", "---", true); -defineSymbol(text, textord, "\u2014", "\\textemdash"); -defineSymbol(text, textord, "\u2018", "`", true); -defineSymbol(text, textord, "\u2018", "\\textquoteleft"); -defineSymbol(text, textord, "\u2019", "'", true); -defineSymbol(text, textord, "\u2019", "\\textquoteright"); -defineSymbol(text, textord, "\u201c", "``", true); -defineSymbol(text, textord, "\u201c", "\\textquotedblleft"); -defineSymbol(text, textord, "\u201d", "''", true); -defineSymbol(text, textord, "\u201d", "\\textquotedblright"); -// \degree from gensymb package -defineSymbol(math, textord, "\u00b0", "\\degree", true); -defineSymbol(text, textord, "\u00b0", "\\degree"); -// \textdegree from inputenc package -defineSymbol(text, textord, "\u00b0", "\\textdegree", true); -// TODO: In LaTeX, \pounds can generate a different character in text and math -// mode, but among our fonts, only Main-Regular defines this character "163". -defineSymbol(math, textord, "\u00a3", "\\pounds"); -defineSymbol(math, textord, "\u00a3", "\\mathsterling", true); -defineSymbol(text, textord, "\u00a3", "\\pounds"); -defineSymbol(text, textord, "\u00a3", "\\textsterling", true); -defineSymbol(math, textord, "\u2720", "\\maltese"); -defineSymbol(text, textord, "\u2720", "\\maltese"); -defineSymbol(math, textord, "\u20ac", "\\euro", true); -defineSymbol(text, textord, "\u20ac", "\\euro", true); -defineSymbol(text, textord, "\u20ac", "\\texteuro"); -defineSymbol(math, textord, "\u00a9", "\\copyright", true); -defineSymbol(text, textord, "\u00a9", "\\textcopyright"); -defineSymbol(math, textord, "\u2300", "\\diameter", true); -defineSymbol(text, textord, "\u2300", "\\diameter"); - -// Italic Greek -defineSymbol(math, textord, "𝛤", "\\varGamma"); -defineSymbol(math, textord, "𝛥", "\\varDelta"); -defineSymbol(math, textord, "𝛩", "\\varTheta"); -defineSymbol(math, textord, "𝛬", "\\varLambda"); -defineSymbol(math, textord, "𝛯", "\\varXi"); -defineSymbol(math, textord, "𝛱", "\\varPi"); -defineSymbol(math, textord, "𝛴", "\\varSigma"); -defineSymbol(math, textord, "𝛶", "\\varUpsilon"); -defineSymbol(math, textord, "𝛷", "\\varPhi"); -defineSymbol(math, textord, "𝛹", "\\varPsi"); -defineSymbol(math, textord, "𝛺", "\\varOmega"); -defineSymbol(text, textord, "𝛤", "\\varGamma"); -defineSymbol(text, textord, "𝛥", "\\varDelta"); -defineSymbol(text, textord, "𝛩", "\\varTheta"); -defineSymbol(text, textord, "𝛬", "\\varLambda"); -defineSymbol(text, textord, "𝛯", "\\varXi"); -defineSymbol(text, textord, "𝛱", "\\varPi"); -defineSymbol(text, textord, "𝛴", "\\varSigma"); -defineSymbol(text, textord, "𝛶", "\\varUpsilon"); -defineSymbol(text, textord, "𝛷", "\\varPhi"); -defineSymbol(text, textord, "𝛹", "\\varPsi"); -defineSymbol(text, textord, "𝛺", "\\varOmega"); - - -// There are lots of symbols which are the same, so we add them in afterwards. -// All of these are textords in math mode -const mathTextSymbols = '0123456789/@."'; -for (let i = 0; i < mathTextSymbols.length; i++) { - const ch = mathTextSymbols.charAt(i); - defineSymbol(math, textord, ch, ch); -} - -// All of these are textords in text mode -const textSymbols = '0123456789!@*()-=+";:?/.,'; -for (let i = 0; i < textSymbols.length; i++) { - const ch = textSymbols.charAt(i); - defineSymbol(text, textord, ch, ch); -} - -// All of these are textords in text mode, and mathords in math mode -const letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; -for (let i = 0; i < letters.length; i++) { - const ch = letters.charAt(i); - defineSymbol(math, mathord, ch, ch); - defineSymbol(text, textord, ch, ch); -} - -// Some more letters in Unicode Basic Multilingual Plane. -const narrow = "ÇÐÞçþℂℍℕℙℚℝℤℎℏℊℋℌℐℑℒℓ℘ℛℜℬℰℱℳℭℨ"; -for (let i = 0; i < narrow.length; i++) { - const ch = narrow.charAt(i); - defineSymbol(math, mathord, ch, ch); - defineSymbol(text, textord, ch, ch); -} - -// The next loop loads wide (surrogate pair) characters. -// We support some letters in the Unicode range U+1D400 to U+1D7FF, -// Mathematical Alphanumeric Symbols. -let wideChar = ""; -for (let i = 0; i < letters.length; i++) { - // The hex numbers in the next line are a surrogate pair. - // 0xD835 is the high surrogate for all letters in the range we support. - // 0xDC00 is the low surrogate for bold A. - wideChar = String.fromCharCode(0xd835, 0xdc00 + i); // A-Z a-z bold - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xdc34 + i); // A-Z a-z italic - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xdc68 + i); // A-Z a-z bold italic - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xdd04 + i); // A-Z a-z Fractur - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xdda0 + i); // A-Z a-z sans-serif - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xddd4 + i); // A-Z a-z sans bold - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xde08 + i); // A-Z a-z sans italic - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xde70 + i); // A-Z a-z monospace - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xdd38 + i); // A-Z a-z double struck - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - const ch = letters.charAt(i); - wideChar = String.fromCharCode(0xd835, 0xdc9c + i); // A-Z a-z calligraphic - defineSymbol(math, mathord, ch, wideChar); - defineSymbol(text, textord, ch, wideChar); -} - -// Next, some wide character numerals -for (let i = 0; i < 10; i++) { - wideChar = String.fromCharCode(0xd835, 0xdfce + i); // 0-9 bold - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xdfe2 + i); // 0-9 sans serif - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xdfec + i); // 0-9 bold sans - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); - - wideChar = String.fromCharCode(0xd835, 0xdff6 + i); // 0-9 monospace - defineSymbol(math, mathord, wideChar, wideChar); - defineSymbol(text, textord, wideChar, wideChar); -} - -/* - * Neither Firefox nor Chrome support hard line breaks or soft line breaks. - * (Despite https://www.w3.org/Math/draft-spec/mathml.html#chapter3_presm.lbattrs) - * So Temml has work-arounds for both hard and soft breaks. - * The work-arounds sadly do not work simultaneously. Any top-level hard - * break makes soft line breaks impossible. - * - * Hard breaks are simulated by creating a and putting each line in its own . - * - * To create soft line breaks, Temml avoids using the and tags. - * Then the top level of a element can be occupied by elements, and the browser - * will break after a if the expression extends beyond the container limit. - * - * The default is for soft line breaks after each top-level binary or - * relational operator, per TeXbook p. 173. So we gather the expression into s so that - * each ends in a binary or relational operator. - * - * An option is for soft line breaks before an "=" sign. That changes the s. - * - * Soft line breaks will not work in Chromium and Safari, only Firefox. - * - * Hopefully browsers will someday do their own linebreaking and we will be able to delete - * much of this module. - */ - -const openDelims = "([{⌊⌈⟨⟮⎰⟦⦃"; -const closeDelims = ")]}⌋⌉⟩⟯⎱⟦⦄"; - -function setLineBreaks(expression, wrapMode, isDisplayMode) { - const mtrs = []; - let mrows = []; - let block = []; - let numTopLevelEquals = 0; - let i = 0; - let level = 0; - while (i < expression.length) { - while (expression[i] instanceof DocumentFragment) { - expression.splice(i, 1, ...expression[i].children); // Expand the fragment. - } - const node = expression[i]; - if (node.attributes && node.attributes.linebreak && - node.attributes.linebreak === "newline") { - // A hard line break. Create a for the current block. - if (block.length > 0) { - mrows.push(new mathMLTree.MathNode("mrow", block)); - } - mrows.push(node); - block = []; - const mtd = new mathMLTree.MathNode("mtd", mrows); - mtd.style.textAlign = "left"; - mtrs.push(new mathMLTree.MathNode("mtr", [mtd])); - mrows = []; - i += 1; - continue - } - block.push(node); - if (node.type && node.type === "mo" && node.children.length === 1 && - !Object.hasOwn(node.attributes, "movablelimits")) { - const ch = node.children[0].text; - if (openDelims.indexOf(ch) > -1) { - level += 1; - } else if (closeDelims.indexOf(ch) > -1) { - level -= 1; - } else if (level === 0 && wrapMode === "=" && ch === "=") { - numTopLevelEquals += 1; - if (numTopLevelEquals > 1) { - block.pop(); - // Start a new block. (Insert a soft linebreak.) - const element = new mathMLTree.MathNode("mrow", block); - mrows.push(element); - block = [node]; - } - } else if (level === 0 && wrapMode === "tex" && ch !== "∇") { - // Check if the following node is a \nobreak text node, e.g. "~"" - const next = i < expression.length - 1 ? expression[i + 1] : null; - let glueIsFreeOfNobreak = true; - if ( - !( - next && - next.type === "mtext" && - next.attributes.linebreak && - next.attributes.linebreak === "nobreak" - ) - ) { - // We may need to start a new block. - // First, put any post-operator glue on same line as operator. - for (let j = i + 1; j < expression.length; j++) { - const nd = expression[j]; - if ( - nd.type && - nd.type === "mspace" && - !(nd.attributes.linebreak && nd.attributes.linebreak === "newline") - ) { - block.push(nd); - i += 1; - if ( - nd.attributes && - nd.attributes.linebreak && - nd.attributes.linebreak === "nobreak" - ) { - glueIsFreeOfNobreak = false; - } - } else { - break; - } - } - } - if (glueIsFreeOfNobreak) { - // Start a new block. (Insert a soft linebreak.) - const element = new mathMLTree.MathNode("mrow", block); - mrows.push(element); - block = []; - } - } - } - i += 1; - } - if (block.length > 0) { - const element = new mathMLTree.MathNode("mrow", block); - mrows.push(element); - } - if (mtrs.length > 0) { - const mtd = new mathMLTree.MathNode("mtd", mrows); - mtd.style.textAlign = "left"; - const mtr = new mathMLTree.MathNode("mtr", [mtd]); - mtrs.push(mtr); - const mtable = new mathMLTree.MathNode("mtable", mtrs); - if (!isDisplayMode) { - mtable.setAttribute("columnalign", "left"); - mtable.setAttribute("rowspacing", "0em"); - } - return mtable - } - return mathMLTree.newDocumentFragment(mrows); -} - -/** - * This file converts a parse tree into a corresponding MathML tree. The main - * entry point is the `buildMathML` function, which takes a parse tree from the - * parser. - */ - -/** - * Takes a symbol and converts it into a MathML text node after performing - * optional replacement from symbols.js. - */ -const makeText = function(text, mode, style) { - if ( - symbols[mode][text] && - symbols[mode][text].replace && - text.charCodeAt(0) !== 0xd835 && - !( - Object.prototype.hasOwnProperty.call(ligatures, text) && - style && - ((style.fontFamily && style.fontFamily.slice(4, 6) === "tt") || - (style.font && style.font.slice(4, 6) === "tt")) - ) - ) { - text = symbols[mode][text].replace; - } - - return new mathMLTree.TextNode(text); -}; - -const consolidateText = mrow => { - // If possible, consolidate adjacent elements into a single element. - if (mrow.type !== "mrow" && mrow.type !== "mstyle") { return mrow } - if (mrow.children.length === 0) { return mrow } // empty group, e.g., \text{} - if (!mrow.children[0].attributes || mrow.children[0].type !== "mtext") { return mrow } - const variant = mrow.children[0].attributes.mathvariant || ""; - const mtext = new mathMLTree.MathNode( - "mtext", - [new mathMLTree.TextNode(mrow.children[0].children[0].text)] - ); - for (let i = 1; i < mrow.children.length; i++) { - // Check each child and, if possible, copy the character into child[0]. - const localVariant = mrow.children[i].attributes.mathvariant || ""; - if (mrow.children[i].type === "mrow") { - const childRow = mrow.children[i]; - for (let j = 0; j < childRow.children.length; j++) { - // We'll also check the children of a mrow. One level only. No recursion. - const childVariant = childRow.children[j].attributes.mathvariant || ""; - if (childVariant !== variant || childRow.children[j].type !== "mtext") { - return mrow // At least one element cannot be consolidated. Get out. - } else { - mtext.children[0].text += childRow.children[j].children[0].text; - } - } - } else if (localVariant !== variant || mrow.children[i].type !== "mtext") { - return mrow - } else { - mtext.children[0].text += mrow.children[i].children[0].text; - } - } - // Firefox does not render a space at either end of an string. - // To get proper rendering, we replace leading or trailing spaces with no-break spaces. - if (mtext.children[0].text.charAt(0) === " ") { - mtext.children[0].text = "\u00a0" + mtext.children[0].text.slice(1); - } - const L = mtext.children[0].text.length; - if (L > 0 && mtext.children[0].text.charAt(L - 1) === " ") { - mtext.children[0].text = mtext.children[0].text.slice(0, -1) + "\u00a0"; - } - for (const [key, value] of Object.entries(mrow.attributes)) { - mtext.attributes[key] = value; - } - return mtext -}; - -const numberRegEx$1 = /^[0-9]$/; -const isDotOrComma = (node, followingNode) => { - return ((node.type === "textord" && node.text === ".") || - (node.type === "atom" && node.text === ",")) && - // Don't consolidate if there is a space after the comma. - node.loc && followingNode.loc && node.loc.end === followingNode.loc.start -}; -const consolidateNumbers = expression => { - // Consolidate adjacent numbers. We want to return 1,506.3, - // not 1,506.3 - if (expression.length < 2) { return } - const nums = []; - let inNum = false; - // Find adjacent numerals - for (let i = 0; i < expression.length; i++) { - const node = expression[i]; - if (node.type === "textord" && numberRegEx$1.test(node.text)) { - if (!inNum) { nums.push({ start: i }); } - inNum = true; - } else { - if (inNum) { nums[nums.length - 1].end = i - 1; } - inNum = false; - } - } - if (inNum) { nums[nums.length - 1].end = expression.length - 1; } - - // Determine if numeral groups are separated by a comma or dot. - for (let i = nums.length - 1; i > 0; i--) { - if (nums[i - 1].end === nums[i].start - 2 && - isDotOrComma(expression[nums[i].start - 1], expression[nums[i].start])) { - // Merge the two groups. - nums[i - 1].end = nums[i].end; - nums.splice(i, 1); - } - } - - // Consolidate the number nodes - for (let i = nums.length - 1; i >= 0; i--) { - for (let j = nums[i].start + 1; j <= nums[i].end; j++) { - expression[nums[i].start].text += expression[j].text; - } - expression.splice(nums[i].start + 1, nums[i].end - nums[i].start); - // Check if the is followed by a numeric base in a supsub, e.g. the "3" in 123^4 - // If so, merge the first into the base. - if (expression.length > nums[i].start + 1) { - const nextTerm = expression[nums[i].start + 1]; - if (nextTerm.type === "supsub" && nextTerm.base && nextTerm.base.type === "textord" && - numberRegEx$1.test(nextTerm.base.text)) { - nextTerm.base.text = expression[nums[i].start].text + nextTerm.base.text; - expression.splice(nums[i].start, 1); - } - } - } -}; - -/** - * Wrap the given array of nodes in an node if needed, i.e., - * unless the array has length 1. Always returns a single node. - */ -const makeRow = function(body, semisimple = false) { - if (body.length === 1 && !(body[0] instanceof DocumentFragment)) { - return body[0]; - } else if (!semisimple) { - // Suppress spacing on nodes at both ends of the row. - if (body[0] instanceof MathNode && body[0].type === "mo" && !body[0].attributes.fence) { - body[0].attributes.lspace = "0em"; - body[0].attributes.rspace = "0em"; - } - const end = body.length - 1; - if (body[end] instanceof MathNode && body[end].type === "mo" && !body[end].attributes.fence) { - body[end].attributes.lspace = "0em"; - body[end].attributes.rspace = "0em"; - } - } - return new mathMLTree.MathNode("mrow", body); -}; - -const isRel = item => { - return (item.type === "atom" && item.family === "rel") || - (item.type === "mclass" && item.mclass === "mrel") -}; - -/** - * Takes a list of nodes, builds them, and returns a list of the generated - * MathML nodes. Also do a couple chores along the way: - * (1) Suppress spacing when an author wraps an operator w/braces, as in {=}. - * (2) Suppress spacing between two adjacent relations. - */ -const buildExpression = function(expression, style, semisimple = false) { - if (!semisimple && expression.length === 1) { - const group = buildGroup$1(expression[0], style); - if (group instanceof MathNode && group.type === "mo") { - // When TeX writers want to suppress spacing on an operator, - // they often put the operator by itself inside braces. - group.setAttribute("lspace", "0em"); - group.setAttribute("rspace", "0em"); - } - return [group]; - } - - consolidateNumbers(expression); - - const groups = []; - for (let i = 0; i < expression.length; i++) { - const group = buildGroup$1(expression[i], style); - // Suppress spacing between adjacent relations - if (i < expression.length - 1 && isRel(expression[i]) && isRel(expression[i + 1])) { - group.setAttribute("rspace", "0em"); - } - if (i > 0 && isRel(expression[i]) && isRel(expression[i - 1])) { - group.setAttribute("lspace", "0em"); - } - groups.push(group); - } - return groups; -}; - -/** - * Equivalent to buildExpression, but wraps the elements in an - * if there's more than one. Returns a single node instead of an array. - */ -const buildExpressionRow = function(expression, style, semisimple = false) { - return makeRow(buildExpression(expression, style, semisimple), semisimple); -}; - -/** - * Takes a group from the parser and calls the appropriate groupBuilders function - * on it to produce a MathML node. - */ -const buildGroup$1 = function(group, style) { - if (!group) { - return new mathMLTree.MathNode("mrow"); - } - - if (_mathmlGroupBuilders[group.type]) { - // Call the groupBuilders function - const result = _mathmlGroupBuilders[group.type](group, style); - return result; - } else { - throw new ParseError("Got group of unknown type: '" + group.type + "'"); - } -}; - -const glue$1 = _ => { - return new mathMLTree.MathNode("mtd", [], [], { padding: "0", width: "50%" }) -}; - -const taggedExpression = (expression, tag, style, leqno) => { - tag = buildExpressionRow(tag[0].body, style); - tag = consolidateText(tag); - tag.classes.push("tml-tag"); - - expression = new mathMLTree.MathNode("mtd", [expression]); - const rowArray = [glue$1(), expression, glue$1()]; - rowArray[leqno ? 0 : 2].classes.push(leqno ? "tml-left" : "tml-right"); - rowArray[leqno ? 0 : 2].children.push(tag); - const mtr = new mathMLTree.MathNode("mtr", rowArray, ["tml-tageqn"]); - const table = new mathMLTree.MathNode("mtable", [mtr]); - table.style.width = "100%"; - table.setAttribute("displaystyle", "true"); - return table -}; - -/** - * Takes a full parse tree and settings and builds a MathML representation of - * it. - */ -function buildMathML(tree, texExpression, style, settings) { - // Strip off outer tag wrapper for processing below. - let tag = null; - if (tree.length === 1 && tree[0].type === "tag") { - tag = tree[0].tag; - tree = tree[0].body; - } - - const expression = buildExpression(tree, style); - const wrap = (settings.displayMode || settings.annotate) ? "none" : settings.wrap; - - const n1 = expression.length === 0 ? null : expression[0]; - let wrapper = expression.length === 1 && tag === null && (n1 instanceof MathNode) - ? expression[0] - : setLineBreaks(expression, wrap, settings.displayMode); - - if (tag) { - wrapper = taggedExpression(wrapper, tag, style, settings.leqno); - } - - if (settings.annotate) { - // Build a TeX annotation of the source - const annotation = new mathMLTree.MathNode( - "annotation", [new mathMLTree.TextNode(texExpression)]); - annotation.setAttribute("encoding", "application/x-tex"); - wrapper = new mathMLTree.MathNode("semantics", [wrapper, annotation]); - } - - const math = new mathMLTree.MathNode("math", [wrapper]); - - if (settings.xml) { - math.setAttribute("xmlns", "http://www.w3.org/1998/Math/MathML"); - } - if (settings.displayMode) { - math.setAttribute("display", "block"); - math.style.display = "block math"; // necessary in Chromium. - // Firefox and Safari do not recognize display: "block math". - // Set a class so that the CSS file can set display: block. - math.classes = ["tml-display"]; - } - return math; -} - -const smalls = "acegıȷmnopqrsuvwxyzαγεηικμνοπρςστυχωϕ𝐚𝐜𝐞𝐠𝐦𝐧𝐨𝐩𝐪𝐫𝐬𝐮𝐯𝐰𝐱𝐲𝐳"; -const talls = "ABCDEFGHIJKLMNOPQRSTUVWXYZbdfhkltΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩβδλζφθψ" - + "𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙𝐛𝐝𝐟𝐡𝐤𝐥𝐭"; -const longSmalls = new Set(["\\alpha", "\\gamma", "\\delta", "\\epsilon", "\\eta", "\\iota", - "\\kappa", "\\mu", "\\nu", "\\pi", "\\rho", "\\sigma", "\\tau", "\\upsilon", "\\chi", "\\psi", - "\\omega", "\\imath", "\\jmath"]); -const longTalls = new Set(["\\Gamma", "\\Delta", "\\Sigma", "\\Omega", "\\beta", "\\delta", - "\\lambda", "\\theta", "\\psi"]); - -const mathmlBuilder$a = (group, style) => { - const accentNode = group.isStretchy - ? stretchy.accentNode(group) - : new mathMLTree.MathNode("mo", [makeText(group.label, group.mode)]); - - if (group.label === "\\vec") { - accentNode.style.transform = "scale(0.75) translate(10%, 30%)"; - } else { - accentNode.style.mathStyle = "normal"; - accentNode.style.mathDepth = "0"; - if (needWebkitShift.has(group.label) && utils.isCharacterBox(group.base)) { - let shift = ""; - const ch = group.base.text; - if (smalls.indexOf(ch) > -1 || longSmalls.has(ch)) { shift = "tml-xshift"; } - if (talls.indexOf(ch) > -1 || longTalls.has(ch)) { shift = "tml-capshift"; } - if (shift) { accentNode.classes.push(shift); } - } - } - if (!group.isStretchy) { - accentNode.setAttribute("stretchy", "false"); - } - - const node = new mathMLTree.MathNode((group.label === "\\c" ? "munder" : "mover"), - [buildGroup$1(group.base, style), accentNode] - ); - - return node; -}; - -const nonStretchyAccents = new Set([ - "\\acute", - "\\grave", - "\\ddot", - "\\dddot", - "\\ddddot", - "\\tilde", - "\\bar", - "\\breve", - "\\check", - "\\hat", - "\\vec", - "\\dot", - "\\mathring" -]); - -const needWebkitShift = new Set([ - "\\acute", - "\\bar", - "\\breve", - "\\check", - "\\dot", - "\\ddot", - "\\grave", - "\\hat", - "\\mathring", - "\\'", "\\^", "\\~", "\\=", "\\u", "\\.", '\\"', "\\r", "\\H", "\\v" -]); - -// Accents -defineFunction({ - type: "accent", - names: [ - "\\acute", - "\\grave", - "\\ddot", - "\\dddot", - "\\ddddot", - "\\tilde", - "\\bar", - "\\breve", - "\\check", - "\\hat", - "\\vec", - "\\dot", - "\\mathring", - "\\overparen", - "\\widecheck", - "\\widehat", - "\\wideparen", - "\\widetilde", - "\\overrightarrow", - "\\overleftarrow", - "\\Overrightarrow", - "\\overleftrightarrow", - "\\overgroup", - "\\overleftharpoon", - "\\overrightharpoon" - ], - props: { - numArgs: 1 - }, - handler: (context, args) => { - const base = normalizeArgument(args[0]); - - const isStretchy = !nonStretchyAccents.has(context.funcName); - - return { - type: "accent", - mode: context.parser.mode, - label: context.funcName, - isStretchy: isStretchy, - base: base - }; - }, - mathmlBuilder: mathmlBuilder$a -}); - -// Text-mode accents -defineFunction({ - type: "accent", - names: ["\\'", "\\`", "\\^", "\\~", "\\=", "\\c", "\\u", "\\.", '\\"', "\\r", "\\H", "\\v"], - props: { - numArgs: 1, - allowedInText: true, - allowedInMath: true, - argTypes: ["primitive"] - }, - handler: (context, args) => { - const base = normalizeArgument(args[0]); - const mode = context.parser.mode; - - if (mode === "math" && context.parser.settings.strict) { - // LaTeX only writes a warning. It doesn't stop. We'll issue the same warning. - // eslint-disable-next-line no-console - console.log(`Temml parse error: Command ${context.funcName} is invalid in math mode.`); - } - - return { - type: "accent", - mode: mode, - label: context.funcName, - isStretchy: false, - base: base - }; - }, - mathmlBuilder: mathmlBuilder$a -}); - -defineFunction({ - type: "accentUnder", - names: [ - "\\underleftarrow", - "\\underrightarrow", - "\\underleftrightarrow", - "\\undergroup", - "\\underparen", - "\\utilde" - ], - props: { - numArgs: 1 - }, - handler: ({ parser, funcName }, args) => { - const base = args[0]; - return { - type: "accentUnder", - mode: parser.mode, - label: funcName, - base: base - }; - }, - mathmlBuilder: (group, style) => { - const accentNode = stretchy.accentNode(group); - accentNode.style["math-depth"] = 0; - const node = new mathMLTree.MathNode("munder", [ - buildGroup$1(group.base, style), - accentNode - ]); - return node; - } -}); - -/** - * This file does conversion between units. In particular, it provides - * calculateSize to convert other units into CSS units. - */ - -const ptPerUnit = { - // Convert to CSS (Postscipt) points, not TeX points - // https://en.wikibooks.org/wiki/LaTeX/Lengths and - // https://tex.stackexchange.com/a/8263 - pt: 800 / 803, // convert TeX point to CSS (Postscript) point - pc: (12 * 800) / 803, // pica - dd: ((1238 / 1157) * 800) / 803, // didot - cc: ((14856 / 1157) * 800) / 803, // cicero (12 didot) - nd: ((685 / 642) * 800) / 803, // new didot - nc: ((1370 / 107) * 800) / 803, // new cicero (12 new didot) - sp: ((1 / 65536) * 800) / 803, // scaled point (TeX's internal smallest unit) - mm: (25.4 / 72), - cm: (2.54 / 72), - in: (1 / 72), - px: (96 / 72) -}; - -/** - * Determine whether the specified unit (either a string defining the unit - * or a "size" parse node containing a unit field) is valid. - */ -const validUnits = [ - "em", - "ex", - "mu", - "pt", - "mm", - "cm", - "in", - "px", - "bp", - "pc", - "dd", - "cc", - "nd", - "nc", - "sp" -]; - -const validUnit = function(unit) { - if (typeof unit !== "string") { - unit = unit.unit; - } - return validUnits.indexOf(unit) > -1 -}; - -const emScale = styleLevel => { - const scriptLevel = Math.max(styleLevel - 1, 0); - return [1, 0.7, 0.5][scriptLevel] -}; - -/* - * Convert a "size" parse node (with numeric "number" and string "unit" fields, - * as parsed by functions.js argType "size") into a CSS value. - */ -const calculateSize = function(sizeValue, style) { - let number = sizeValue.number; - if (style.maxSize[0] < 0 && number > 0) { - return { number: 0, unit: "em" } - } - const unit = sizeValue.unit; - switch (unit) { - case "mm": - case "cm": - case "in": - case "px": { - const numInCssPts = number * ptPerUnit[unit]; - if (numInCssPts > style.maxSize[1]) { - return { number: style.maxSize[1], unit: "pt" } - } - return { number, unit }; // absolute CSS units. - } - case "em": - case "ex": { - // In TeX, em and ex do not change size in \scriptstyle. - if (unit === "ex") { number *= 0.431; } - number = Math.min(number / emScale(style.level), style.maxSize[0]); - return { number: utils.round(number), unit: "em" }; - } - case "bp": { - if (number > style.maxSize[1]) { number = style.maxSize[1]; } - return { number, unit: "pt" }; // TeX bp is a CSS pt. (1/72 inch). - } - case "pt": - case "pc": - case "dd": - case "cc": - case "nd": - case "nc": - case "sp": { - number = Math.min(number * ptPerUnit[unit], style.maxSize[1]); - return { number: utils.round(number), unit: "pt" } - } - case "mu": { - number = Math.min(number / 18, style.maxSize[0]); - return { number: utils.round(number), unit: "em" } - } - default: - throw new ParseError("Invalid unit: '" + unit + "'") - } -}; - -// Helper functions - -const padding$2 = width => { - const node = new mathMLTree.MathNode("mspace"); - node.setAttribute("width", width + "em"); - return node -}; - -const paddedNode = (group, lspace = 0.3, rspace = 0) => { - if (group == null && rspace === 0) { return padding$2(lspace) } - const row = group ? [group] : []; - if (lspace !== 0) { row.unshift(padding$2(lspace)); } - if (rspace > 0) { row.push(padding$2(rspace)); } - return new mathMLTree.MathNode("mrow", row) -}; - -const labelSize = (size, scriptLevel) => Number(size) / emScale(scriptLevel); - -const munderoverNode = (fName, body, below, style) => { - const arrowNode = stretchy.mathMLnode(fName); - // Is this the short part of a mhchem equilibrium arrow? - const isEq = fName.slice(1, 3) === "eq"; - const minWidth = fName.charAt(1) === "x" - ? "1.75" // mathtools extensible arrows are ≥ 1.75em long - : fName.slice(2, 4) === "cd" - ? "3.0" // cd package arrows - : isEq - ? "1.0" // The shorter harpoon of a mhchem equilibrium arrow - : "2.0"; // other mhchem arrows - // TODO: When Firefox supports minsize, use the next line. - //arrowNode.setAttribute("minsize", String(minWidth) + "em") - arrowNode.setAttribute("lspace", "0"); - arrowNode.setAttribute("rspace", (isEq ? "0.5em" : "0")); - - // upper and lower labels are set to scriptlevel by MathML - // So we have to adjust our label dimensions accordingly. - const labelStyle = style.withLevel(style.level < 2 ? 2 : 3); - const minArrowWidth = labelSize(minWidth, labelStyle.level); - // The dummyNode will be inside a inside a - // So it will be at scriptlevel 3 - const dummyWidth = labelSize(minWidth, 3); - const emptyLabel = paddedNode(null, minArrowWidth.toFixed(4), 0); - const dummyNode = paddedNode(null, dummyWidth.toFixed(4), 0); - // The arrow is a little longer than the label. Set a spacer length. - const space = labelSize((isEq ? 0 : 0.3), labelStyle.level).toFixed(4); - let upperNode; - let lowerNode; - - const gotUpper = (body && body.body && - // \hphantom visible content - (body.body.body || body.body.length > 0)); - if (gotUpper) { - let label = buildGroup$1(body, labelStyle); - label = paddedNode(label, space, space); - // Since Firefox does not support minsize, stack a invisible node - // on top of the label. Its width will serve as a min-width. - // TODO: Refactor this after Firefox supports minsize. - upperNode = new mathMLTree.MathNode("mover", [label, dummyNode]); - } - const gotLower = (below && below.body && - (below.body.body || below.body.length > 0)); - if (gotLower) { - let label = buildGroup$1(below, labelStyle); - label = paddedNode(label, space, space); - lowerNode = new mathMLTree.MathNode("munder", [label, dummyNode]); - } - - let node; - if (!gotUpper && !gotLower) { - node = new mathMLTree.MathNode("mover", [arrowNode, emptyLabel]); - } else if (gotUpper && gotLower) { - node = new mathMLTree.MathNode("munderover", [arrowNode, lowerNode, upperNode]); - } else if (gotUpper) { - node = new mathMLTree.MathNode("mover", [arrowNode, upperNode]); - } else { - node = new mathMLTree.MathNode("munder", [arrowNode, lowerNode]); - } - if (minWidth === "3.0") { node.style.height = "1em"; } // CD environment - node.setAttribute("accent", "false"); // Necessary for MS Word - return node -}; - -// Stretchy arrows with an optional argument -defineFunction({ - type: "xArrow", - names: [ - "\\xleftarrow", - "\\xrightarrow", - "\\xLeftarrow", - "\\xRightarrow", - "\\xleftrightarrow", - "\\xLeftrightarrow", - "\\xhookleftarrow", - "\\xhookrightarrow", - "\\xmapsto", - "\\xrightharpoondown", - "\\xrightharpoonup", - "\\xleftharpoondown", - "\\xleftharpoonup", - "\\xlongequal", - "\\xtwoheadrightarrow", - "\\xtwoheadleftarrow", - // The next 5 functions are here only to support mhchem - "\\yields", - "\\yieldsLeft", - "\\mesomerism", - "\\longrightharpoonup", - "\\longleftharpoondown", - // The next 3 functions are here only to support the {CD} environment. - "\\\\cdrightarrow", - "\\\\cdleftarrow", - "\\\\cdlongequal" - ], - props: { - numArgs: 1, - numOptionalArgs: 1 - }, - handler({ parser, funcName }, args, optArgs) { - return { - type: "xArrow", - mode: parser.mode, - name: funcName, - body: args[0], - below: optArgs[0] - }; - }, - mathmlBuilder(group, style) { - // Build the arrow and its labels. - const node = munderoverNode(group.name, group.body, group.below, style); - // Create operator spacing for a relation. - const row = [node]; - row.unshift(padding$2(0.2778)); - row.push(padding$2(0.2778)); - return new mathMLTree.MathNode("mrow", row) - } -}); - -const arrowComponent = { - "\\xtofrom": ["\\xrightarrow", "\\xleftarrow"], - "\\xleftrightharpoons": ["\\xleftharpoonup", "\\xrightharpoondown"], - "\\xrightleftharpoons": ["\\xrightharpoonup", "\\xleftharpoondown"], - "\\yieldsLeftRight": ["\\yields", "\\yieldsLeft"], - // The next three all get the same harpoon glyphs. Only the lengths and paddings differ. - "\\equilibrium": ["\\longrightharpoonup", "\\longleftharpoondown"], - "\\equilibriumRight": ["\\longrightharpoonup", "\\eqleftharpoondown"], - "\\equilibriumLeft": ["\\eqrightharpoonup", "\\longleftharpoondown"] -}; - -// Browsers are not good at stretching a glyph that contains a pair of stacked arrows such as ⇄. -// So we stack a pair of single arrows. -defineFunction({ - type: "stackedArrow", - names: [ - "\\xtofrom", // expfeil - "\\xleftrightharpoons", // mathtools - "\\xrightleftharpoons", // mathtools - "\\yieldsLeftRight", // mhchem - "\\equilibrium", // mhchem - "\\equilibriumRight", - "\\equilibriumLeft" - ], - props: { - numArgs: 1, - numOptionalArgs: 1 - }, - handler({ parser, funcName }, args, optArgs) { - const lowerArrowBody = args[0] - ? { - type: "hphantom", - mode: parser.mode, - body: args[0] - } - : null; - const upperArrowBelow = optArgs[0] - ? { - type: "hphantom", - mode: parser.mode, - body: optArgs[0] - } - : null; - return { - type: "stackedArrow", - mode: parser.mode, - name: funcName, - body: args[0], - upperArrowBelow, - lowerArrowBody, - below: optArgs[0] - }; - }, - mathmlBuilder(group, style) { - const topLabel = arrowComponent[group.name][0]; - const botLabel = arrowComponent[group.name][1]; - const topArrow = munderoverNode(topLabel, group.body, group.upperArrowBelow, style); - const botArrow = munderoverNode(botLabel, group.lowerArrowBody, group.below, style); - let wrapper; - - const raiseNode = new mathMLTree.MathNode("mpadded", [topArrow]); - raiseNode.setAttribute("voffset", "0.3em"); - raiseNode.setAttribute("height", "+0.3em"); - raiseNode.setAttribute("depth", "-0.3em"); - // One of the arrows is given ~zero width. so the other has the same horzontal alignment. - if (group.name === "\\equilibriumLeft") { - const botNode = new mathMLTree.MathNode("mpadded", [botArrow]); - botNode.setAttribute("width", "0.5em"); - wrapper = new mathMLTree.MathNode( - "mpadded", - [padding$2(0.2778), botNode, raiseNode, padding$2(0.2778)] - ); - } else { - raiseNode.setAttribute("width", (group.name === "\\equilibriumRight" ? "0.5em" : "0")); - wrapper = new mathMLTree.MathNode( - "mpadded", - [padding$2(0.2778), raiseNode, botArrow, padding$2(0.2778)] - ); - } - - wrapper.setAttribute("voffset", "-0.18em"); - wrapper.setAttribute("height", "-0.18em"); - wrapper.setAttribute("depth", "+0.18em"); - return wrapper - } -}); - -/** - * Asserts that the node is of the given type and returns it with stricter - * typing. Throws if the node's type does not match. - */ -function assertNodeType(node, type) { - if (!node || node.type !== type) { - throw new Error( - `Expected node of type ${type}, but got ` + - (node ? `node of type ${node.type}` : String(node)) - ); - } - return node; -} - -/** - * Returns the node more strictly typed iff it is of the given type. Otherwise, - * returns null. - */ -function assertSymbolNodeType(node) { - const typedNode = checkSymbolNodeType(node); - if (!typedNode) { - throw new Error( - `Expected node of symbol group type, but got ` + - (node ? `node of type ${node.type}` : String(node)) - ); - } - return typedNode; -} - -/** - * Returns the node more strictly typed iff it is of the given type. Otherwise, - * returns null. - */ -function checkSymbolNodeType(node) { - if (node && (node.type === "atom" || - Object.prototype.hasOwnProperty.call(NON_ATOMS, node.type))) { - return node; - } - return null; -} - -const cdArrowFunctionName = { - ">": "\\\\cdrightarrow", - "<": "\\\\cdleftarrow", - "=": "\\\\cdlongequal", - A: "\\uparrow", - V: "\\downarrow", - "|": "\\Vert", - ".": "no arrow" -}; - -const newCell = () => { - // Create an empty cell, to be filled below with parse nodes. - return { type: "styling", body: [], mode: "math", scriptLevel: "display" }; -}; - -const isStartOfArrow = (node) => { - return node.type === "textord" && node.text === "@"; -}; - -const isLabelEnd = (node, endChar) => { - return (node.type === "mathord" || node.type === "atom") && node.text === endChar; -}; - -function cdArrow(arrowChar, labels, parser) { - // Return a parse tree of an arrow and its labels. - // This acts in a way similar to a macro expansion. - const funcName = cdArrowFunctionName[arrowChar]; - switch (funcName) { - case "\\\\cdrightarrow": - case "\\\\cdleftarrow": - return parser.callFunction(funcName, [labels[0]], [labels[1]]); - case "\\uparrow": - case "\\downarrow": { - const leftLabel = parser.callFunction("\\\\cdleft", [labels[0]], []); - const bareArrow = { - type: "atom", - text: funcName, - mode: "math", - family: "rel" - }; - const sizedArrow = parser.callFunction("\\Big", [bareArrow], []); - const rightLabel = parser.callFunction("\\\\cdright", [labels[1]], []); - const arrowGroup = { - type: "ordgroup", - mode: "math", - body: [leftLabel, sizedArrow, rightLabel], - semisimple: true - }; - return parser.callFunction("\\\\cdparent", [arrowGroup], []); - } - case "\\\\cdlongequal": - return parser.callFunction("\\\\cdlongequal", [], []); - case "\\Vert": { - const arrow = { type: "textord", text: "\\Vert", mode: "math" }; - return parser.callFunction("\\Big", [arrow], []); - } - default: - return { type: "textord", text: " ", mode: "math" }; - } -} - -function parseCD(parser) { - // Get the array's parse nodes with \\ temporarily mapped to \cr. - const parsedRows = []; - parser.gullet.beginGroup(); - parser.gullet.macros.set("\\cr", "\\\\\\relax"); - parser.gullet.beginGroup(); - while (true) { // eslint-disable-line no-constant-condition - // Get the parse nodes for the next row. - parsedRows.push(parser.parseExpression(false, "\\\\")); - parser.gullet.endGroup(); - parser.gullet.beginGroup(); - const next = parser.fetch().text; - if (next === "&" || next === "\\\\") { - parser.consume(); - } else if (next === "\\end") { - if (parsedRows[parsedRows.length - 1].length === 0) { - parsedRows.pop(); // final row ended in \\ - } - break; - } else { - throw new ParseError("Expected \\\\ or \\cr or \\end", parser.nextToken); - } - } - - let row = []; - const body = [row]; - - // Loop thru the parse nodes. Collect them into cells and arrows. - for (let i = 0; i < parsedRows.length; i++) { - // Start a new row. - const rowNodes = parsedRows[i]; - // Create the first cell. - let cell = newCell(); - - for (let j = 0; j < rowNodes.length; j++) { - if (!isStartOfArrow(rowNodes[j])) { - // If a parseNode is not an arrow, it goes into a cell. - cell.body.push(rowNodes[j]); - } else { - // Parse node j is an "@", the start of an arrow. - // Before starting on the arrow, push the cell into `row`. - row.push(cell); - - // Now collect parseNodes into an arrow. - // The character after "@" defines the arrow type. - j += 1; - const arrowChar = assertSymbolNodeType(rowNodes[j]).text; - - // Create two empty label nodes. We may or may not use them. - const labels = new Array(2); - labels[0] = { type: "ordgroup", mode: "math", body: [] }; - labels[1] = { type: "ordgroup", mode: "math", body: [] }; - - // Process the arrow. - if ("=|.".indexOf(arrowChar) > -1) ; else if ("<>AV".indexOf(arrowChar) > -1) { - // Four arrows, `@>>>`, `@<<<`, `@AAA`, and `@VVV`, each take - // two optional labels. E.g. the right-point arrow syntax is - // really: @>{optional label}>{optional label}> - // Collect parseNodes into labels. - for (let labelNum = 0; labelNum < 2; labelNum++) { - let inLabel = true; - for (let k = j + 1; k < rowNodes.length; k++) { - if (isLabelEnd(rowNodes[k], arrowChar)) { - inLabel = false; - j = k; - break; - } - if (isStartOfArrow(rowNodes[k])) { - throw new ParseError( - "Missing a " + arrowChar + " character to complete a CD arrow.", - rowNodes[k] - ); - } - - labels[labelNum].body.push(rowNodes[k]); - } - if (inLabel) { - // isLabelEnd never returned a true. - throw new ParseError( - "Missing a " + arrowChar + " character to complete a CD arrow.", - rowNodes[j] - ); - } - } - } else { - throw new ParseError(`Expected one of "<>AV=|." after @.`); - } - - // Now join the arrow to its labels. - const arrow = cdArrow(arrowChar, labels, parser); - - // Wrap the arrow in a styling node - row.push(arrow); - // In CD's syntax, cells are implicit. That is, everything that - // is not an arrow gets collected into a cell. So create an empty - // cell now. It will collect upcoming parseNodes. - cell = newCell(); - } - } - if (i % 2 === 0) { - // Even-numbered rows consist of: cell, arrow, cell, arrow, ... cell - // The last cell is not yet pushed into `row`, so: - row.push(cell); - } else { - // Odd-numbered rows consist of: vert arrow, empty cell, ... vert arrow - // Remove the empty cell that was placed at the beginning of `row`. - row.shift(); - } - row = []; - body.push(row); - } - body.pop(); - - // End row group - parser.gullet.endGroup(); - // End array group defining \\ - parser.gullet.endGroup(); - - return { - type: "array", - mode: "math", - body, - envClasses: ["jot", "cd"], - cols: [], - hLinesBeforeRow: new Array(body.length + 1).fill([]) - }; -} - -// The functions below are not available for general use. -// They are here only for internal use by the {CD} environment in placing labels -// next to vertical arrows. - -// We don't need any such functions for horizontal arrows because we can reuse -// the functionality that already exists for extensible arrows. - -defineFunction({ - type: "cdlabel", - names: ["\\\\cdleft", "\\\\cdright"], - props: { - numArgs: 1 - }, - handler({ parser, funcName }, args) { - return { - type: "cdlabel", - mode: parser.mode, - side: funcName.slice(4), - label: args[0] - }; - }, - mathmlBuilder(group, style) { - let label = new mathMLTree.MathNode("mrow", [buildGroup$1(group.label, style)]); - label = new mathMLTree.MathNode("mpadded", [label]); - label.setAttribute("width", "0"); - if (group.side === "left") { - label.setAttribute("lspace", "-1width"); - } - // We have to guess at vertical alignment. We know the arrow is 1.8em tall, - // But we don't know the height or depth of the label. - label.setAttribute("voffset", "0.7em"); - label = new mathMLTree.MathNode("mstyle", [label]); - label.setAttribute("displaystyle", "false"); - label.setAttribute("scriptlevel", "1"); - return label; - } -}); - -defineFunction({ - type: "cdlabelparent", - names: ["\\\\cdparent"], - props: { - numArgs: 1 - }, - handler({ parser }, args) { - return { - type: "cdlabelparent", - mode: parser.mode, - fragment: args[0] - }; - }, - mathmlBuilder(group, style) { - return new mathMLTree.MathNode("mrow", [buildGroup$1(group.fragment, style)]); - } -}); - -// \@char is an internal function that takes a grouped decimal argument like -// {123} and converts into symbol with code 123. It is used by the *macro* -// \char defined in macros.js. -defineFunction({ - type: "textord", - names: ["\\@char"], - props: { - numArgs: 1, - allowedInText: true - }, - handler({ parser, token }, args) { - const arg = assertNodeType(args[0], "ordgroup"); - const group = arg.body; - let number = ""; - for (let i = 0; i < group.length; i++) { - const node = assertNodeType(group[i], "textord"); - number += node.text; - } - const code = parseInt(number); - if (isNaN(code)) { - throw new ParseError(`\\@char has non-numeric argument ${number}`, token) - } - return { - type: "textord", - mode: parser.mode, - text: String.fromCodePoint(code) - } - } -}); - -// Helpers -const htmlRegEx = /^(#[a-f0-9]{3}|#?[a-f0-9]{6})$/i; -const htmlOrNameRegEx = /^(#[a-f0-9]{3}|#?[a-f0-9]{6}|[a-z]+)$/i; -const RGBregEx = /^ *\d{1,3} *(?:, *\d{1,3} *){2}$/; -const rgbRegEx = /^ *[10](?:\.\d*)? *(?:, *[10](?:\.\d*)? *){2}$/; -const xcolorHtmlRegEx = /^[a-f0-9]{6}$/i; -const toHex = num => { - let str = num.toString(16); - if (str.length === 1) { str = "0" + str; } - return str -}; - -// Colors from Tables 4.1 and 4.2 of the xcolor package. -// Table 4.1 (lower case) RGB values are taken from chroma and xcolor.dtx. -// Table 4.2 (Capitalizzed) values were sampled, because Chroma contains a unreliable -// conversion from cmyk to RGB. See https://tex.stackexchange.com/a/537274. -const xcolors = JSON.parse(`{ - "Apricot": "#ffb484", - "Aquamarine": "#08b4bc", - "Bittersweet": "#c84c14", - "blue": "#0000FF", - "Blue": "#303494", - "BlueGreen": "#08b4bc", - "BlueViolet": "#503c94", - "BrickRed": "#b8341c", - "brown": "#BF8040", - "Brown": "#802404", - "BurntOrange": "#f8941c", - "CadetBlue": "#78749c", - "CarnationPink": "#f884b4", - "Cerulean": "#08a4e4", - "CornflowerBlue": "#40ace4", - "cyan": "#00FFFF", - "Cyan": "#08acec", - "Dandelion": "#ffbc44", - "darkgray": "#404040", - "DarkOrchid": "#a8548c", - "Emerald": "#08ac9c", - "ForestGreen": "#089c54", - "Fuchsia": "#90348c", - "Goldenrod": "#ffdc44", - "gray": "#808080", - "Gray": "#98949c", - "green": "#00FF00", - "Green": "#08a44c", - "GreenYellow": "#e0e474", - "JungleGreen": "#08ac9c", - "Lavender": "#f89cc4", - "lightgray": "#c0c0c0", - "lime": "#BFFF00", - "LimeGreen": "#90c43c", - "magenta": "#FF00FF", - "Magenta": "#f0048c", - "Mahogany": "#b0341c", - "Maroon": "#b03434", - "Melon": "#f89c7c", - "MidnightBlue": "#086494", - "Mulberry": "#b03c94", - "NavyBlue": "#086cbc", - "olive": "#7F7F00", - "OliveGreen": "#407c34", - "orange": "#FF8000", - "Orange": "#f8843c", - "OrangeRed": "#f0145c", - "Orchid": "#b074ac", - "Peach": "#f8945c", - "Periwinkle": "#8074bc", - "PineGreen": "#088c74", - "pink": "#ff7f7f", - "Plum": "#98248c", - "ProcessBlue": "#08b4ec", - "purple": "#BF0040", - "Purple": "#a0449c", - "RawSienna": "#983c04", - "red": "#ff0000", - "Red": "#f01c24", - "RedOrange": "#f86434", - "RedViolet": "#a0246c", - "Rhodamine": "#f0549c", - "Royallue": "#0874bc", - "RoyalPurple": "#683c9c", - "RubineRed": "#f0047c", - "Salmon": "#f8948c", - "SeaGreen": "#30bc9c", - "Sepia": "#701404", - "SkyBlue": "#48c4dc", - "SpringGreen": "#c8dc64", - "Tan": "#e09c74", - "teal": "#007F7F", - "TealBlue": "#08acb4", - "Thistle": "#d884b4", - "Turquoise": "#08b4cc", - "violet": "#800080", - "Violet": "#60449c", - "VioletRed": "#f054a4", - "WildStrawberry": "#f0246c", - "yellow": "#FFFF00", - "Yellow": "#fff404", - "YellowGreen": "#98cc6c", - "YellowOrange": "#ffa41c" -}`); - -const colorFromSpec = (model, spec) => { - let color = ""; - if (model === "HTML") { - if (!htmlRegEx.test(spec)) { - throw new ParseError("Invalid HTML input.") - } - color = spec; - } else if (model === "RGB") { - if (!RGBregEx.test(spec)) { - throw new ParseError("Invalid RGB input.") - } - spec.split(",").map(e => { color += toHex(Number(e.trim())); }); - } else { - if (!rgbRegEx.test(spec)) { - throw new ParseError("Invalid rbg input.") - } - spec.split(",").map(e => { - const num = Number(e.trim()); - if (num > 1) { throw new ParseError("Color rgb input must be < 1.") } - color += toHex(Number((num * 255).toFixed(0))); - }); - } - if (color.charAt(0) !== "#") { color = "#" + color; } - return color -}; - -const validateColor = (color, macros, token) => { - const macroName = `\\\\color@${color}`; // from \defineColor. - const match = htmlOrNameRegEx.exec(color); - if (!match) { throw new ParseError("Invalid color: '" + color + "'", token) } - // We allow a 6-digit HTML color spec without a leading "#". - // This follows the xcolor package's HTML color model. - // Predefined color names are all missed by this RegEx pattern. - if (xcolorHtmlRegEx.test(color)) { - return "#" + color - } else if (color.charAt(0) === "#") { - return color - } else if (macros.has(macroName)) { - color = macros.get(macroName).tokens[0].text; - } else if (xcolors[color]) { - color = xcolors[color]; - } - return color -}; - -const mathmlBuilder$9 = (group, style) => { - // In LaTeX, color is not supposed to change the spacing of any node. - // So instead of wrapping the group in an , we apply - // the color individually to each node and return a document fragment. - let expr = buildExpression(group.body, style.withColor(group.color)); - expr = expr.map(e => { - e.style.color = group.color; - return e - }); - return mathMLTree.newDocumentFragment(expr) -}; - -defineFunction({ - type: "color", - names: ["\\textcolor"], - props: { - numArgs: 2, - numOptionalArgs: 1, - allowedInText: true, - argTypes: ["raw", "raw", "original"] - }, - handler({ parser, token }, args, optArgs) { - const model = optArgs[0] && assertNodeType(optArgs[0], "raw").string; - let color = ""; - if (model) { - const spec = assertNodeType(args[0], "raw").string; - color = colorFromSpec(model, spec); - } else { - color = validateColor(assertNodeType(args[0], "raw").string, parser.gullet.macros, token); - } - const body = args[1]; - return { - type: "color", - mode: parser.mode, - color, - body: ordargument(body) - } - }, - mathmlBuilder: mathmlBuilder$9 -}); - -defineFunction({ - type: "color", - names: ["\\color"], - props: { - numArgs: 1, - numOptionalArgs: 1, - allowedInText: true, - argTypes: ["raw", "raw"] - }, - handler({ parser, breakOnTokenText, token }, args, optArgs) { - const model = optArgs[0] && assertNodeType(optArgs[0], "raw").string; - let color = ""; - if (model) { - const spec = assertNodeType(args[0], "raw").string; - color = colorFromSpec(model, spec); - } else { - color = validateColor(assertNodeType(args[0], "raw").string, parser.gullet.macros, token); - } - - // Parse out the implicit body that should be colored. - const body = parser.parseExpression(true, breakOnTokenText, true); - - return { - type: "color", - mode: parser.mode, - color, - body - } - }, - mathmlBuilder: mathmlBuilder$9 -}); - -defineFunction({ - type: "color", - names: ["\\definecolor"], - props: { - numArgs: 3, - allowedInText: true, - argTypes: ["raw", "raw", "raw"] - }, - handler({ parser, funcName, token }, args) { - const name = assertNodeType(args[0], "raw").string; - if (!/^[A-Za-z]+$/.test(name)) { - throw new ParseError("Color name must be latin letters.", token) - } - const model = assertNodeType(args[1], "raw").string; - if (!["HTML", "RGB", "rgb"].includes(model)) { - throw new ParseError("Color model must be HTML, RGB, or rgb.", token) - } - const spec = assertNodeType(args[2], "raw").string; - const color = colorFromSpec(model, spec); - parser.gullet.macros.set(`\\\\color@${name}`, { tokens: [{ text: color }], numArgs: 0 }); - return { type: "internal", mode: parser.mode } - } - // No mathmlBuilder. The point of \definecolor is to set a macro. -}); - -// Row breaks within tabular environments, and line breaks at top level - -// \DeclareRobustCommand\\{...\@xnewline} -defineFunction({ - type: "cr", - names: ["\\\\"], - props: { - numArgs: 0, - numOptionalArgs: 0, - allowedInText: true - }, - - handler({ parser }, args, optArgs) { - const size = parser.gullet.future().text === "[" ? parser.parseSizeGroup(true) : null; - const newLine = !parser.settings.displayMode; - return { - type: "cr", - mode: parser.mode, - newLine, - size: size && assertNodeType(size, "size").value - } - }, - - // The following builder is called only at the top level, - // not within tabular/array environments. - - mathmlBuilder(group, style) { - // MathML 3.0 calls for newline to occur in an or an . - // Ref: https://www.w3.org/TR/MathML3/chapter3.html#presm.linebreaking - const node = new mathMLTree.MathNode("mo"); - if (group.newLine) { - node.setAttribute("linebreak", "newline"); - if (group.size) { - const size = calculateSize(group.size, style); - node.setAttribute("height", size.number + size.unit); - } - } - return node - } -}); - -const globalMap = { - "\\global": "\\global", - "\\long": "\\\\globallong", - "\\\\globallong": "\\\\globallong", - "\\def": "\\gdef", - "\\gdef": "\\gdef", - "\\edef": "\\xdef", - "\\xdef": "\\xdef", - "\\let": "\\\\globallet", - "\\futurelet": "\\\\globalfuture" -}; - -const checkControlSequence = (tok) => { - const name = tok.text; - if (/^(?:[\\{}$&#^_]|EOF)$/.test(name)) { - throw new ParseError("Expected a control sequence", tok); - } - return name; -}; - -const getRHS = (parser) => { - let tok = parser.gullet.popToken(); - if (tok.text === "=") { - // consume optional equals - tok = parser.gullet.popToken(); - if (tok.text === " ") { - // consume one optional space - tok = parser.gullet.popToken(); - } - } - return tok; -}; - -const letCommand = (parser, name, tok, global) => { - let macro = parser.gullet.macros.get(tok.text); - if (macro == null) { - // don't expand it later even if a macro with the same name is defined - // e.g., \let\foo=\frac \def\frac{\relax} \frac12 - tok.noexpand = true; - macro = { - tokens: [tok], - numArgs: 0, - // reproduce the same behavior in expansion - unexpandable: !parser.gullet.isExpandable(tok.text) - }; - } - parser.gullet.macros.set(name, macro, global); -}; - -// -> | -// -> |\global -// -> | -// -> \global|\long|\outer -defineFunction({ - type: "internal", - names: [ - "\\global", - "\\long", - "\\\\globallong" // can’t be entered directly - ], - props: { - numArgs: 0, - allowedInText: true - }, - handler({ parser, funcName }) { - parser.consumeSpaces(); - const token = parser.fetch(); - if (globalMap[token.text]) { - // Temml doesn't have \par, so ignore \long - if (funcName === "\\global" || funcName === "\\\\globallong") { - token.text = globalMap[token.text]; - } - return assertNodeType(parser.parseFunction(), "internal"); - } - throw new ParseError(`Invalid token after macro prefix`, token); - } -}); - -// Basic support for macro definitions: \def, \gdef, \edef, \xdef -// -> -// -> \def|\gdef|\edef|\xdef -// -> -defineFunction({ - type: "internal", - names: ["\\def", "\\gdef", "\\edef", "\\xdef"], - props: { - numArgs: 0, - allowedInText: true, - primitive: true - }, - handler({ parser, funcName }) { - let tok = parser.gullet.popToken(); - const name = tok.text; - if (/^(?:[\\{}$&#^_]|EOF)$/.test(name)) { - throw new ParseError("Expected a control sequence", tok); - } - - let numArgs = 0; - let insert; - const delimiters = [[]]; - // contains no braces - while (parser.gullet.future().text !== "{") { - tok = parser.gullet.popToken(); - if (tok.text === "#") { - // If the very last character of the is #, so that - // this # is immediately followed by {, TeX will behave as if the { - // had been inserted at the right end of both the parameter text - // and the replacement text. - if (parser.gullet.future().text === "{") { - insert = parser.gullet.future(); - delimiters[numArgs].push("{"); - break; - } - - // A parameter, the first appearance of # must be followed by 1, - // the next by 2, and so on; up to nine #’s are allowed - tok = parser.gullet.popToken(); - if (!/^[1-9]$/.test(tok.text)) { - throw new ParseError(`Invalid argument number "${tok.text}"`); - } - if (parseInt(tok.text) !== numArgs + 1) { - throw new ParseError(`Argument number "${tok.text}" out of order`); - } - numArgs++; - delimiters.push([]); - } else if (tok.text === "EOF") { - throw new ParseError("Expected a macro definition"); - } else { - delimiters[numArgs].push(tok.text); - } - } - // replacement text, enclosed in '{' and '}' and properly nested - let { tokens } = parser.gullet.consumeArg(); - if (insert) { - tokens.unshift(insert); - } - - if (funcName === "\\edef" || funcName === "\\xdef") { - tokens = parser.gullet.expandTokens(tokens); - if (tokens.length > parser.gullet.settings.maxExpand) { - throw new ParseError("Too many expansions in an " + funcName); - } - tokens.reverse(); // to fit in with stack order - } - // Final arg is the expansion of the macro - parser.gullet.macros.set( - name, - { tokens, numArgs, delimiters }, - funcName === globalMap[funcName] - ); - return { type: "internal", mode: parser.mode }; - } -}); - -// -> -// -> \futurelet -// | \let -// -> |= -defineFunction({ - type: "internal", - names: [ - "\\let", - "\\\\globallet" // can’t be entered directly - ], - props: { - numArgs: 0, - allowedInText: true, - primitive: true - }, - handler({ parser, funcName }) { - const name = checkControlSequence(parser.gullet.popToken()); - parser.gullet.consumeSpaces(); - const tok = getRHS(parser); - letCommand(parser, name, tok, funcName === "\\\\globallet"); - return { type: "internal", mode: parser.mode }; - } -}); - -// ref: https://www.tug.org/TUGboat/tb09-3/tb22bechtolsheim.pdf -defineFunction({ - type: "internal", - names: [ - "\\futurelet", - "\\\\globalfuture" // can’t be entered directly - ], - props: { - numArgs: 0, - allowedInText: true, - primitive: true - }, - handler({ parser, funcName }) { - const name = checkControlSequence(parser.gullet.popToken()); - const middle = parser.gullet.popToken(); - const tok = parser.gullet.popToken(); - letCommand(parser, name, tok, funcName === "\\\\globalfuture"); - parser.gullet.pushToken(tok); - parser.gullet.pushToken(middle); - return { type: "internal", mode: parser.mode }; - } -}); - -defineFunction({ - type: "internal", - names: ["\\newcommand", "\\renewcommand", "\\providecommand"], - props: { - numArgs: 0, - allowedInText: true, - primitive: true - }, - handler({ parser, funcName }) { - let name = ""; - const tok = parser.gullet.popToken(); - if (tok.text === "{") { - name = checkControlSequence(parser.gullet.popToken()); - parser.gullet.popToken(); - } else { - name = checkControlSequence(tok); - } - - const exists = parser.gullet.isDefined(name); - if (exists && funcName === "\\newcommand") { - throw new ParseError( - `\\newcommand{${name}} attempting to redefine ${name}; use \\renewcommand` - ); - } - if (!exists && funcName === "\\renewcommand") { - throw new ParseError( - `\\renewcommand{${name}} when command ${name} does not yet exist; use \\newcommand` - ); - } - - let numArgs = 0; - if (parser.gullet.future().text === "[") { - let tok = parser.gullet.popToken(); - tok = parser.gullet.popToken(); - if (!/^[0-9]$/.test(tok.text)) { - throw new ParseError(`Invalid number of arguments: "${tok.text}"`); - } - numArgs = parseInt(tok.text); - tok = parser.gullet.popToken(); - if (tok.text !== "]") { - throw new ParseError(`Invalid argument "${tok.text}"`); - } - } - - // replacement text, enclosed in '{' and '}' and properly nested - const { tokens } = parser.gullet.consumeArg(); - - parser.gullet.macros.set( - name, - { tokens, numArgs }, - !parser.settings.strict - ); - - return { type: "internal", mode: parser.mode }; - - } -}); - -// Extra data needed for the delimiter handler down below -const delimiterSizes = { - "\\bigl": { mclass: "mopen", size: 1 }, - "\\Bigl": { mclass: "mopen", size: 2 }, - "\\biggl": { mclass: "mopen", size: 3 }, - "\\Biggl": { mclass: "mopen", size: 4 }, - "\\bigr": { mclass: "mclose", size: 1 }, - "\\Bigr": { mclass: "mclose", size: 2 }, - "\\biggr": { mclass: "mclose", size: 3 }, - "\\Biggr": { mclass: "mclose", size: 4 }, - "\\bigm": { mclass: "mrel", size: 1 }, - "\\Bigm": { mclass: "mrel", size: 2 }, - "\\biggm": { mclass: "mrel", size: 3 }, - "\\Biggm": { mclass: "mrel", size: 4 }, - "\\big": { mclass: "mord", size: 1 }, - "\\Big": { mclass: "mord", size: 2 }, - "\\bigg": { mclass: "mord", size: 3 }, - "\\Bigg": { mclass: "mord", size: 4 } -}; - -const delimiters = [ - "(", - "\\lparen", - ")", - "\\rparen", - "[", - "\\lbrack", - "]", - "\\rbrack", - "\\{", - "\\lbrace", - "\\}", - "\\rbrace", - "⦇", - "\\llparenthesis", - "⦈", - "\\rrparenthesis", - "\\lfloor", - "\\rfloor", - "\u230a", - "\u230b", - "\\lceil", - "\\rceil", - "\u2308", - "\u2309", - "<", - ">", - "\\langle", - "\u27e8", - "\\rangle", - "\u27e9", - "\\lAngle", - "\u27ea", - "\\rAngle", - "\u27eb", - "\\llangle", - "⦉", - "\\rrangle", - "⦊", - "\\lt", - "\\gt", - "\\lvert", - "\\rvert", - "\\lVert", - "\\rVert", - "\\lgroup", - "\\rgroup", - "\u27ee", - "\u27ef", - "\\lmoustache", - "\\rmoustache", - "\u23b0", - "\u23b1", - "\\llbracket", - "\\rrbracket", - "\u27e6", - "\u27e6", - "\\lBrace", - "\\rBrace", - "\u2983", - "\u2984", - "/", - "\\backslash", - "|", - "\\vert", - "\\|", - "\\Vert", - "\\uparrow", - "\\Uparrow", - "\\downarrow", - "\\Downarrow", - "\\updownarrow", - "\\Updownarrow", - "." -]; - -// Export isDelimiter for benefit of parser. -const dels = ["}", "\\left", "\\middle", "\\right"]; -const isDelimiter = str => str.length > 0 && - (delimiters.includes(str) || delimiterSizes[str] || dels.includes(str)); - -// Metrics of the different sizes. Found by looking at TeX's output of -// $\bigl| // \Bigl| \biggl| \Biggl| \showlists$ -// Used to create stacked delimiters of appropriate sizes in makeSizedDelim. -const sizeToMaxHeight = [0, 1.2, 1.8, 2.4, 3.0]; - -// Delimiter functions -function checkDelimiter(delim, context) { - const symDelim = checkSymbolNodeType(delim); - if (symDelim && delimiters.includes(symDelim.text)) { - // If a character is not in the MathML operator dictionary, it will not stretch. - // Replace such characters w/characters that will stretch. - if (["/", "\u2044"].includes(symDelim.text)) { symDelim.text = "\u2215"; } - if (["<", "\\lt"].includes(symDelim.text)) { symDelim.text = "⟨"; } - if ([">", "\\gt"].includes(symDelim.text)) { symDelim.text = "⟩"; } - if (symDelim.text === "\\backslash") { symDelim.text = "\u2216"; } - return symDelim; - } else if (symDelim) { - throw new ParseError(`Invalid delimiter '${symDelim.text}' after '${context.funcName}'`, delim); - } else { - throw new ParseError(`Invalid delimiter type '${delim.type}'`, delim); - } -} - -defineFunction({ - type: "delimsizing", - names: [ - "\\bigl", - "\\Bigl", - "\\biggl", - "\\Biggl", - "\\bigr", - "\\Bigr", - "\\biggr", - "\\Biggr", - "\\bigm", - "\\Bigm", - "\\biggm", - "\\Biggm", - "\\big", - "\\Big", - "\\bigg", - "\\Bigg" - ], - props: { - numArgs: 1, - argTypes: ["primitive"] - }, - handler: (context, args) => { - const delim = checkDelimiter(args[0], context); - - return { - type: "delimsizing", - mode: context.parser.mode, - size: delimiterSizes[context.funcName].size, - mclass: delimiterSizes[context.funcName].mclass, - delim: delim.text - }; - }, - mathmlBuilder: (group) => { - const children = []; - - if (group.delim === ".") { group.delim = ""; } - children.push(makeText(group.delim, group.mode)); - - const node = new mathMLTree.MathNode("mo", children); - - if (group.mclass === "mopen" || group.mclass === "mclose") { - // Only some of the delimsizing functions act as fences, and they - // return "mopen" or "mclose" mclass. - node.setAttribute("fence", "true"); - } else { - // Explicitly disable fencing if it's not a fence, to override the - // defaults. - node.setAttribute("fence", "false"); - } - if (group.delim === "\u2216" || group.delim === "\\vert" || - group.delim === "|" || group.delim.indexOf("arrow") > -1) { - // We have to explicitly set stretchy to true. - node.setAttribute("stretchy", "true"); - } - node.setAttribute("symmetric", "true"); // Needed for tall arrows in Firefox. - node.setAttribute("minsize", sizeToMaxHeight[group.size] + "em"); - node.setAttribute("maxsize", sizeToMaxHeight[group.size] + "em"); - return node; - } -}); - -function assertParsed(group) { - if (!group.body) { - throw new Error("Bug: The leftright ParseNode wasn't fully parsed."); - } -} - -defineFunction({ - type: "leftright-right", - names: ["\\right"], - props: { - numArgs: 1, - argTypes: ["primitive"] - }, - handler: (context, args) => { - return { - type: "leftright-right", - mode: context.parser.mode, - delim: checkDelimiter(args[0], context).text - }; - } -}); - -defineFunction({ - type: "leftright", - names: ["\\left"], - props: { - numArgs: 1, - argTypes: ["primitive"] - }, - handler: (context, args) => { - const delim = checkDelimiter(args[0], context); - - const parser = context.parser; - // Parse out the implicit body - ++parser.leftrightDepth; - // parseExpression stops before '\\right' or `\\middle` - let body = parser.parseExpression(false, null, true); - let nextToken = parser.fetch(); - while (nextToken.text === "\\middle") { - // `\middle`, from the ε-TeX package, ends one group and starts another group. - // We had to parse this expression with `breakOnMiddle` enabled in order - // to get TeX-compliant parsing of \over. - // But we do not want, at this point, to end on \middle, so continue - // to parse until we fetch a `\right`. - parser.consume(); - const middle = parser.fetch().text; - if (!symbols.math[middle]) { - throw new ParseError(`Invalid delimiter '${middle}' after '\\middle'`); - } - checkDelimiter({ type: "atom", mode: "math", text: middle }, { funcName: "\\middle" }); - body.push({ type: "middle", mode: "math", delim: middle }); - parser.consume(); - body = body.concat(parser.parseExpression(false, null, true)); - nextToken = parser.fetch(); - } - --parser.leftrightDepth; - // Check the next token - parser.expect("\\right", false); - const right = assertNodeType(parser.parseFunction(), "leftright-right"); - return { - type: "leftright", - mode: parser.mode, - body, - left: delim.text, - right: right.delim - }; - }, - mathmlBuilder: (group, style) => { - assertParsed(group); - const inner = buildExpression(group.body, style); - - if (group.left === ".") { group.left = ""; } - const leftNode = new mathMLTree.MathNode("mo", [makeText(group.left, group.mode)]); - leftNode.setAttribute("fence", "true"); - leftNode.setAttribute("form", "prefix"); - if (group.left === "\u2216" || group.left.indexOf("arrow") > -1) { - leftNode.setAttribute("stretchy", "true"); - } - inner.unshift(leftNode); - - if (group.right === ".") { group.right = ""; } - const rightNode = new mathMLTree.MathNode("mo", [makeText(group.right, group.mode)]); - rightNode.setAttribute("fence", "true"); - rightNode.setAttribute("form", "postfix"); - if (group.right === "\u2216" || group.right.indexOf("arrow") > -1) { - rightNode.setAttribute("stretchy", "true"); - } - inner.push(rightNode); - - return makeRow(inner); - } -}); - -defineFunction({ - type: "middle", - names: ["\\middle"], - props: { - numArgs: 1, - argTypes: ["primitive"] - }, - handler: (context, args) => { - const delim = checkDelimiter(args[0], context); - if (!context.parser.leftrightDepth) { - throw new ParseError("\\middle without preceding \\left", delim); - } - - return { - type: "middle", - mode: context.parser.mode, - delim: delim.text - }; - }, - mathmlBuilder: (group, style) => { - const textNode = makeText(group.delim, group.mode); - const middleNode = new mathMLTree.MathNode("mo", [textNode]); - middleNode.setAttribute("fence", "true"); - if (group.delim.indexOf("arrow") > -1) { - middleNode.setAttribute("stretchy", "true"); - } - // The next line is not semantically correct, but - // Chromium fails to stretch if it is not there. - middleNode.setAttribute("form", "prefix"); - // MathML gives 5/18em spacing to each element. - // \middle should get delimiter spacing instead. - middleNode.setAttribute("lspace", "0.05em"); - middleNode.setAttribute("rspace", "0.05em"); - return middleNode; - } -}); - -const padding$1 = _ => { - const node = new mathMLTree.MathNode("mspace"); - node.setAttribute("width", "3pt"); - return node -}; - -const mathmlBuilder$8 = (group, style) => { - let node; - if (group.label.indexOf("colorbox") > -1 || group.label === "\\boxed") { - // MathML core does not support +width attribute in . - // Firefox does not reliably add side padding. - // Insert - node = new mathMLTree.MathNode("mrow", [ - padding$1(), - buildGroup$1(group.body, style), - padding$1() - ]); - } else { - node = new mathMLTree.MathNode("mrow", [buildGroup$1(group.body, style)]); - } - switch (group.label) { - case "\\overline": - node.style.padding = "0.1em 0 0 0"; - node.style.borderTop = "0.065em solid"; - break - case "\\underline": - node.style.padding = "0 0 0.1em 0"; - node.style.borderBottom = "0.065em solid"; - break - case "\\cancel": - // We can't use an inline background-gradient. It does not work client-side. - // So set a class and put the rule in the external CSS file. - node.classes.push("tml-cancel"); - break - case "\\bcancel": - node.classes.push("tml-bcancel"); - break - /* - case "\\longdiv": - node.setAttribute("notation", "longdiv"); - break - case "\\phase": - node.setAttribute("notation", "phasorangle"); - break */ - case "\\angl": - node.style.padding = "0.03889em 0.03889em 0 0.03889em"; - node.style.borderTop = "0.049em solid"; - node.style.borderRight = "0.049em solid"; - node.style.marginRight = "0.03889em"; - break - case "\\sout": - node.style.backgroundImage = 'linear-gradient(black, black)'; - node.style.backgroundRepeat = 'no-repeat'; - node.style.backgroundSize = '100% 1.5px'; - node.style.backgroundPosition = '0 center'; - break - case "\\boxed": - // \newcommand{\boxed}[1]{\fbox{\m@th$\displaystyle#1$}} from amsmath.sty - node.style = { padding: "3pt 0 3pt 0", border: "1px solid" }; - node.setAttribute("scriptlevel", "0"); - node.setAttribute("displaystyle", "true"); - break - case "\\fbox": - node.style = { padding: "3pt", border: "1px solid" }; - break - case "\\fcolorbox": - case "\\colorbox": { - // doesn't have a good notation option for \colorbox. - // So use instead. Set some attributes that come - // included with . - //const fboxsep = 3; // 3 pt from LaTeX source2e - //node.setAttribute("height", `+${2 * fboxsep}pt`) - //node.setAttribute("voffset", `${fboxsep}pt`) - const style = { padding: "3pt 0 3pt 0" }; - - if (group.label === "\\fcolorbox") { - style.border = "0.06em solid " + String(group.borderColor); - } - node.style = style; - break - } - case "\\xcancel": - node.classes.push("tml-xcancel"); - break - } - if (group.backgroundColor) { - node.setAttribute("mathbackground", group.backgroundColor); - } - return node; -}; - -defineFunction({ - type: "enclose", - names: ["\\colorbox"], - props: { - numArgs: 2, - numOptionalArgs: 1, - allowedInText: true, - argTypes: ["raw", "raw", "text"] - }, - handler({ parser, funcName }, args, optArgs) { - const model = optArgs[0] && assertNodeType(optArgs[0], "raw").string; - let color = ""; - if (model) { - const spec = assertNodeType(args[0], "raw").string; - color = colorFromSpec(model, spec); - } else { - color = validateColor(assertNodeType(args[0], "raw").string, parser.gullet.macros); - } - const body = args[1]; - return { - type: "enclose", - mode: parser.mode, - label: funcName, - backgroundColor: color, - body - }; - }, - mathmlBuilder: mathmlBuilder$8 -}); - -defineFunction({ - type: "enclose", - names: ["\\fcolorbox"], - props: { - numArgs: 3, - numOptionalArgs: 1, - allowedInText: true, - argTypes: ["raw", "raw", "raw", "text"] - }, - handler({ parser, funcName }, args, optArgs) { - const model = optArgs[0] && assertNodeType(optArgs[0], "raw").string; - let borderColor = ""; - let backgroundColor; - if (model) { - const borderSpec = assertNodeType(args[0], "raw").string; - const backgroundSpec = assertNodeType(args[0], "raw").string; - borderColor = colorFromSpec(model, borderSpec); - backgroundColor = colorFromSpec(model, backgroundSpec); - } else { - borderColor = validateColor(assertNodeType(args[0], "raw").string, parser.gullet.macros); - backgroundColor = validateColor(assertNodeType(args[1], "raw").string, parser.gullet.macros); - } - const body = args[2]; - return { - type: "enclose", - mode: parser.mode, - label: funcName, - backgroundColor, - borderColor, - body - }; - }, - mathmlBuilder: mathmlBuilder$8 -}); - -defineFunction({ - type: "enclose", - names: ["\\fbox"], - props: { - numArgs: 1, - argTypes: ["hbox"], - allowedInText: true - }, - handler({ parser }, args) { - return { - type: "enclose", - mode: parser.mode, - label: "\\fbox", - body: args[0] - }; - } -}); - -defineFunction({ - type: "enclose", - names: ["\\angl", "\\cancel", "\\bcancel", "\\xcancel", "\\sout", "\\overline", "\\boxed"], - // , "\\phase", "\\longdiv" - props: { - numArgs: 1 - }, - handler({ parser, funcName }, args) { - const body = args[0]; - return { - type: "enclose", - mode: parser.mode, - label: funcName, - body - }; - }, - mathmlBuilder: mathmlBuilder$8 -}); - -defineFunction({ - type: "enclose", - names: ["\\underline"], - props: { - numArgs: 1, - allowedInText: true - }, - handler({ parser, funcName }, args) { - const body = args[0]; - return { - type: "enclose", - mode: parser.mode, - label: funcName, - body - }; - }, - mathmlBuilder: mathmlBuilder$8 -}); - -/** - * All registered environments. - * `environments.js` exports this same dictionary again and makes it public. - * `Parser.js` requires this dictionary via `environments.js`. - */ -const _environments = {}; - -function defineEnvironment({ type, names, props, handler, mathmlBuilder }) { - // Set default values of environments. - const data = { - type, - numArgs: props.numArgs || 0, - allowedInText: false, - numOptionalArgs: 0, - handler - }; - for (let i = 0; i < names.length; ++i) { - _environments[names[i]] = data; - } - if (mathmlBuilder) { - _mathmlGroupBuilders[type] = mathmlBuilder; - } -} - -// In TeX, there are actually three sets of dimensions, one for each of - -// Math style is not quite the same thing as script level. -const StyleLevel = { - DISPLAY: 0, - TEXT: 1, - SCRIPT: 2, - SCRIPTSCRIPT: 3 -}; - -// Helper functions -function getHLines(parser) { - // Return an array. The array length = number of hlines. - // Each element in the array tells if the line is dashed. - const hlineInfo = []; - parser.consumeSpaces(); - let nxt = parser.fetch().text; - if (nxt === "\\relax") { - parser.consume(); - parser.consumeSpaces(); - nxt = parser.fetch().text; - } - while (nxt === "\\hline" || nxt === "\\hdashline") { - parser.consume(); - hlineInfo.push(nxt === "\\hdashline"); - parser.consumeSpaces(); - nxt = parser.fetch().text; - } - return hlineInfo; -} - -const validateAmsEnvironmentContext = context => { - const settings = context.parser.settings; - if (!settings.displayMode) { - throw new ParseError(`{${context.envName}} can be used only in display mode.`); - } -}; - -const getTag = (group, style, rowNum) => { - let tag; - const tagContents = group.tags.shift(); - if (tagContents) { - // The author has written a \tag or a \notag in this row. - if (tagContents.body) { - tag = buildExpressionRow(tagContents.body, style, true); - tag.classes = ["tml-tag"]; - } else { - // \notag. Return an empty span. - tag = new mathMLTree.MathNode("mtext", [], []); - return tag - } - } else if (group.envClasses.includes("multline") && - ((group.leqno && rowNum !== 0) || (!group.leqno && rowNum !== group.body.length - 1))) { - // A multiline that does not receive a tag. Return an empty cell. - tag = new mathMLTree.MathNode("mtext", [], []); - return tag - } else { - // AMS automatcally numbered equaton. - // Insert a class so the element can be populated by a CSS counter. - // WebKit will display the CSS counter only inside a span. - tag = new mathMLTree.MathNode("mtext", [new Span(["tml-eqn"])]); - } - return tag -}; - -/** - * Parse the body of the environment, with rows delimited by \\ and - * columns delimited by &, and create a nested list in row-major order - * with one group per cell. If given an optional argument scriptLevel - * ("text", "display", etc.), then each cell is cast into that scriptLevel. - */ -function parseArray( - parser, - { - cols, // [{ type: string , align: l|c|r|null }] - envClasses, // align(ed|at|edat) | array | cases | cd | small | multline - addEqnNum, // boolean - singleRow, // boolean - emptySingleRow, // boolean - maxNumCols, // number - leqno // boolean - }, - scriptLevel -) { - parser.gullet.beginGroup(); - if (!singleRow) { - // \cr is equivalent to \\ without the optional size argument (see below) - // TODO: provide helpful error when \cr is used outside array environment - parser.gullet.macros.set("\\cr", "\\\\\\relax"); - } - if (addEqnNum) { - parser.gullet.macros.set("\\tag", "\\@ifstar\\envtag@literal\\envtag@paren"); - parser.gullet.macros.set("\\envtag@paren", "\\env@tag{{(\\text{#1})}}"); - parser.gullet.macros.set("\\envtag@literal", "\\env@tag{\\text{#1}}"); - parser.gullet.macros.set("\\notag", "\\env@notag"); - parser.gullet.macros.set("\\nonumber", "\\env@notag"); - } - - // Start group for first cell - parser.gullet.beginGroup(); - - let row = []; - const body = [row]; - const rowGaps = []; - const tags = []; - let rowTag; - const hLinesBeforeRow = []; - - // Test for \hline at the top of the array. - hLinesBeforeRow.push(getHLines(parser)); - - // eslint-disable-next-line no-constant-condition - while (true) { - // Parse each cell in its own group (namespace) - let cell = parser.parseExpression(false, singleRow ? "\\end" : "\\\\"); - - if (addEqnNum && !rowTag) { - // Check if the author wrote a \tag{} inside this cell. - for (let i = 0; i < cell.length; i++) { - if (cell[i].type === "envTag" || cell[i].type === "noTag") { - // Get the contents of the \text{} nested inside the \env@Tag{} - rowTag = cell[i].type === "envTag" - ? cell.splice(i, 1)[0].body.body[0] - : { body: null }; - break - } - } - } - parser.gullet.endGroup(); - parser.gullet.beginGroup(); - - cell = { - type: "ordgroup", - mode: parser.mode, - body: cell, - semisimple: true - }; - row.push(cell); - const next = parser.fetch().text; - if (next === "&") { - if (maxNumCols && row.length === maxNumCols) { - if (envClasses.includes("array")) { - if (parser.settings.strict) { - throw new ParseError("Too few columns " + "specified in the {array} column argument.", - parser.nextToken) - } - } else if (maxNumCols === 2) { - throw new ParseError("The split environment accepts no more than two columns", - parser.nextToken); - } else { - throw new ParseError("The equation environment accepts only one column", - parser.nextToken) - } - } - parser.consume(); - } else if (next === "\\end") { - // Arrays terminate newlines with `\crcr` which consumes a `\cr` if - // the last line is empty. However, AMS environments keep the - // empty row if it's the only one. - // NOTE: Currently, `cell` is the last item added into `row`. - if (row.length === 1 && cell.body.length === 0 && (body.length > 1 || !emptySingleRow)) { - body.pop(); - } - if (hLinesBeforeRow.length < body.length + 1) { - hLinesBeforeRow.push([]); - } - break; - } else if (next === "\\\\") { - parser.consume(); - let size; - // \def\Let@{\let\\\math@cr} - // \def\math@cr{...\math@cr@} - // \def\math@cr@{\new@ifnextchar[\math@cr@@{\math@cr@@[\z@]}} - // \def\math@cr@@[#1]{...\math@cr@@@...} - // \def\math@cr@@@{\cr} - if (parser.gullet.future().text !== " ") { - size = parser.parseSizeGroup(true); - } - rowGaps.push(size ? size.value : null); - - tags.push(rowTag); - - // check for \hline(s) following the row separator - hLinesBeforeRow.push(getHLines(parser)); - - row = []; - rowTag = null; - body.push(row); - } else { - throw new ParseError("Expected & or \\\\ or \\cr or \\end", parser.nextToken); - } - } - - // End cell group - parser.gullet.endGroup(); - // End array group defining \cr - parser.gullet.endGroup(); - - tags.push(rowTag); - - return { - type: "array", - mode: parser.mode, - body, - cols, - rowGaps, - hLinesBeforeRow, - envClasses, - addEqnNum, - scriptLevel, - tags, - leqno - }; -} - -// Decides on a scriptLevel for cells in an array according to whether the given -// environment name starts with the letter 'd'. -function dCellStyle(envName) { - return envName.slice(0, 1) === "d" ? "display" : "text" -} - -const alignMap = { - c: "center ", - l: "left ", - r: "right " -}; - -const glue = group => { - const glueNode = new mathMLTree.MathNode("mtd", []); - glueNode.style = { padding: "0", width: "50%" }; - if (group.envClasses.includes("multline")) { - glueNode.style.width = "7.5%"; - } - return glueNode -}; - -const mathmlBuilder$7 = function(group, style) { - const tbl = []; - const numRows = group.body.length; - const hlines = group.hLinesBeforeRow; - - for (let i = 0; i < numRows; i++) { - const rw = group.body[i]; - const row = []; - const cellLevel = group.scriptLevel === "text" - ? StyleLevel.TEXT - : group.scriptLevel === "script" - ? StyleLevel.SCRIPT - : StyleLevel.DISPLAY; - - for (let j = 0; j < rw.length; j++) { - const mtd = new mathMLTree.MathNode( - "mtd", - [buildGroup$1(rw[j], style.withLevel(cellLevel))] - ); - - if (group.envClasses.includes("multline")) { - const align = i === 0 ? "left" : i === numRows - 1 ? "right" : "center"; - mtd.setAttribute("columnalign", align); - if (align !== "center") { - mtd.classes.push("tml-" + align); - } - } - row.push(mtd); - } - if (group.addEqnNum) { - row.unshift(glue(group)); - row.push(glue(group)); - const tag = getTag(group, style.withLevel(cellLevel), i); - if (group.leqno) { - row[0].children.push(tag); - row[0].classes.push("tml-left"); - } else { - row[row.length - 1].children.push(tag); - row[row.length - 1].classes.push("tml-right"); - } - } - const mtr = new mathMLTree.MathNode("mtr", row, []); - // Write horizontal rules - if (i === 0 && hlines[0].length > 0) { - if (hlines[0].length === 2) { - mtr.children.forEach(cell => { cell.style.borderTop = "0.15em double"; }); - } else { - mtr.children.forEach(cell => { - cell.style.borderTop = hlines[0][0] ? "0.06em dashed" : "0.06em solid"; - }); - } - } - if (hlines[i + 1].length > 0) { - if (hlines[i + 1].length === 2) { - mtr.children.forEach(cell => { cell.style.borderBottom = "0.15em double"; }); - } else { - mtr.children.forEach(cell => { - cell.style.borderBottom = hlines[i + 1][0] ? "0.06em dashed" : "0.06em solid"; - }); - } - } - tbl.push(mtr); - } - - if (group.envClasses.length > 0) { - const pad = group.envClasses.includes("jot") - ? "0.7" // 0.5ex + 0.09em top & bot padding - : group.envClasses.includes("small") - ? "0.35" - : "0.5"; // 0.5ex default top & bot padding - const sidePadding = group.envClasses.includes("abut") - ? "0" - : group.envClasses.includes("cases") - ? "0" - : group.envClasses.includes("small") - ? "0.1389" - : group.envClasses.includes("cd") - ? "0.25" - : "0.4"; // default side padding - - const numCols = tbl.length === 0 ? 0 : tbl[0].children.length; - - const sidePad = (j, hand) => { - if (j === 0 && hand === 0) { return "0" } - if (j === numCols - 1 && hand === 1) { return "0" } - if (group.envClasses[0] !== "align") { return sidePadding } - if (hand === 1) { return "0" } - if (group.addEqnNum) { - return (j % 2) ? "1" : "0" - } else { - return (j % 2) ? "0" : "1" - } - }; - - // Padding - for (let i = 0; i < tbl.length; i++) { - for (let j = 0; j < tbl[i].children.length; j++) { - tbl[i].children[j].style.padding = `${pad}ex ${sidePad(j, 1)}em ${pad}ex ${sidePad(j, 0)}em`; - } - } - - // Justification - const align = group.envClasses.includes("align") || group.envClasses.includes("alignat"); - for (let i = 0; i < tbl.length; i++) { - const row = tbl[i]; - if (align) { - for (let j = 0; j < row.children.length; j++) { - // Chromium does not recognize text-align: left. Use -webkit- - // TODO: Remove -webkit- when Chromium no longer needs it. - row.children[j].classes = ["tml-" + (j % 2 ? "left" : "right")]; - } - if (group.addEqnNum) { - const k = group.leqno ? 0 : row.children.length - 1; - row.children[k].classes = ["tml-" + (group.leqno ? "left" : "right")]; - } - } - if (row.children.length > 1 && group.envClasses.includes("cases")) { - row.children[1].style.padding = row.children[1].style.padding.replace(/0em$/, "1em"); - } - - if (group.envClasses.includes("cases") || group.envClasses.includes("subarray")) { - for (const cell of row.children) { - cell.classes.push("tml-left"); - } - } - } - } else { - // Set zero padding on side of the matrix - for (let i = 0; i < tbl.length; i++) { - tbl[i].children[0].style.paddingLeft = "0em"; - if (tbl[i].children.length === tbl[0].children.length) { - tbl[i].children[tbl[i].children.length - 1].style.paddingRight = "0em"; - } - } - } - - let table = new mathMLTree.MathNode("mtable", tbl); - if (group.scriptLevel === "display") { table.setAttribute("displaystyle", "true"); } - - if (group.addEqnNum || group.envClasses.includes("multline")) { - table.style.width = "100%"; - } - - // Column separator lines and column alignment - let align = ""; - - if (group.cols && group.cols.length > 0) { - const cols = group.cols; - let prevTypeWasAlign = false; - let iStart = 0; - let iEnd = cols.length; - - while (cols[iStart].type === "separator") { - iStart += 1; - } - while (cols[iEnd - 1].type === "separator") { - iEnd -= 1; - } - - if (cols[0].type === "separator") { - const sep = cols[1].type === "separator" - ? "0.15em double" - : cols[0].separator === "|" - ? "0.06em solid " - : "0.06em dashed "; - for (const row of table.children) { - row.children[0].style.borderLeft = sep; - } - } - let iCol = group.addEqnNum ? 0 : -1; - for (let i = iStart; i < iEnd; i++) { - if (cols[i].type === "align") { - const colAlign = alignMap[cols[i].align]; - align += colAlign; - iCol += 1; - for (const row of table.children) { - if (colAlign.trim() !== "center" && iCol < row.children.length) { - row.children[iCol].classes = ["tml-" + colAlign.trim()]; - } - } - prevTypeWasAlign = true; - } else if (cols[i].type === "separator") { - // MathML accepts only single lines between cells. - // So we read only the first of consecutive separators. - if (prevTypeWasAlign) { - const sep = cols[i + 1].type === "separator" - ? "0.15em double" - : cols[i].separator === "|" - ? "0.06em solid" - : "0.06em dashed"; - for (const row of table.children) { - if (iCol < row.children.length) { - row.children[iCol].style.borderRight = sep; - } - } - } - prevTypeWasAlign = false; - } - } - if (cols[cols.length - 1].type === "separator") { - const sep = cols[cols.length - 2].type === "separator" - ? "0.15em double" - : cols[cols.length - 1].separator === "|" - ? "0.06em solid" - : "0.06em dashed"; - for (const row of table.children) { - row.children[row.children.length - 1].style.borderRight = sep; - row.children[row.children.length - 1].style.paddingRight = "0.4em"; - } - } - } - if (group.addEqnNum) { - // allow for glue cells on each side - align = "left " + (align.length > 0 ? align : "center ") + "right "; - } - if (align) { - // Firefox reads this attribute, not the -webkit-left|right written above. - // TODO: When Chrome no longer needs "-webkit-", use CSS and delete the next line. - table.setAttribute("columnalign", align.trim()); - } - - if (group.envClasses.includes("small")) { - // A small array. Wrap in scriptstyle. - table = new mathMLTree.MathNode("mstyle", [table]); - table.setAttribute("scriptlevel", "1"); - } - - return table -}; - -// Convenience function for align, align*, aligned, alignat, alignat*, alignedat, split. -const alignedHandler = function(context, args) { - if (context.envName.indexOf("ed") === -1) { - validateAmsEnvironmentContext(context); - } - const cols = []; - const res = parseArray( - context.parser, - { - cols, - addEqnNum: context.envName === "align" || context.envName === "alignat", - emptySingleRow: true, - envClasses: ["abut", "jot"], // set row spacing & provisional column spacing - maxNumCols: context.envName === "split" ? 2 : undefined, - leqno: context.parser.settings.leqno - }, - "display" - ); - - // Determining number of columns. - // 1. If the first argument is given, we use it as a number of columns, - // and makes sure that each row doesn't exceed that number. - // 2. Otherwise, just count number of columns = maximum number - // of cells in each row ("aligned" mode -- isAligned will be true). - // - // At the same time, prepend empty group {} at beginning of every second - // cell in each row (starting with second cell) so that operators become - // binary. This behavior is implemented in amsmath's \start@aligned. - let numMaths; - let numCols = 0; - const isAlignedAt = context.envName.indexOf("at") > -1; - if (args[0] && isAlignedAt) { - // alignat environment takes an argument w/ number of columns - let arg0 = ""; - for (let i = 0; i < args[0].body.length; i++) { - const textord = assertNodeType(args[0].body[i], "textord"); - arg0 += textord.text; - } - if (isNaN(arg0)) { - throw new ParseError("The alignat enviroment requires a numeric first argument.") - } - numMaths = Number(arg0); - numCols = numMaths * 2; - } - res.body.forEach(function(row) { - if (isAlignedAt) { - // Case 1 - const curMaths = row.length / 2; - if (numMaths < curMaths) { - throw new ParseError( - "Too many math in a row: " + `expected ${numMaths}, but got ${curMaths}`, - row[0] - ); - } - } else if (numCols < row.length) { - // Case 2 - numCols = row.length; - } - }); - - // Adjusting alignment. - // In aligned mode, we add one \qquad between columns; - // otherwise we add nothing. - for (let i = 0; i < numCols; ++i) { - let align = "r"; - if (i % 2 === 1) { - align = "l"; - } - cols[i] = { - type: "align", - align: align - }; - } - if (context.envName === "split") ; else if (isAlignedAt) { - res.envClasses.push("alignat"); // Sets justification - } else { - res.envClasses[0] = "align"; // Sets column spacing & justification - } - return res; -}; - -// Arrays are part of LaTeX, defined in lttab.dtx so its documentation -// is part of the source2e.pdf file of LaTeX2e source documentation. -// {darray} is an {array} environment where cells are set in \displaystyle, -// as defined in nccmath.sty. -defineEnvironment({ - type: "array", - names: ["array", "darray"], - props: { - numArgs: 1 - }, - handler(context, args) { - // Since no types are specified above, the two possibilities are - // - The argument is wrapped in {} or [], in which case Parser's - // parseGroup() returns an "ordgroup" wrapping some symbol node. - // - The argument is a bare symbol node. - const symNode = checkSymbolNodeType(args[0]); - const colalign = symNode ? [args[0]] : assertNodeType(args[0], "ordgroup").body; - const cols = colalign.map(function(nde) { - const node = assertSymbolNodeType(nde); - const ca = node.text; - if ("lcr".indexOf(ca) !== -1) { - return { - type: "align", - align: ca - }; - } else if (ca === "|") { - return { - type: "separator", - separator: "|" - }; - } else if (ca === ":") { - return { - type: "separator", - separator: ":" - }; - } - throw new ParseError("Unknown column alignment: " + ca, nde); - }); - const res = { - cols, - envClasses: ["array"], - maxNumCols: cols.length - }; - return parseArray(context.parser, res, dCellStyle(context.envName)); - }, - mathmlBuilder: mathmlBuilder$7 -}); - -// The matrix environments of amsmath builds on the array environment -// of LaTeX, which is discussed above. -// The mathtools package adds starred versions of the same environments. -// These have an optional argument to choose left|center|right justification. -defineEnvironment({ - type: "array", - names: [ - "matrix", - "pmatrix", - "bmatrix", - "Bmatrix", - "vmatrix", - "Vmatrix", - "matrix*", - "pmatrix*", - "bmatrix*", - "Bmatrix*", - "vmatrix*", - "Vmatrix*" - ], - props: { - numArgs: 0 - }, - handler(context) { - const delimiters = { - matrix: null, - pmatrix: ["(", ")"], - bmatrix: ["[", "]"], - Bmatrix: ["\\{", "\\}"], - vmatrix: ["|", "|"], - Vmatrix: ["\\Vert", "\\Vert"] - }[context.envName.replace("*", "")]; - // \hskip -\arraycolsep in amsmath - let colAlign = "c"; - const payload = { - envClasses: [], - cols: [] - }; - if (context.envName.charAt(context.envName.length - 1) === "*") { - // It's one of the mathtools starred functions. - // Parse the optional alignment argument. - const parser = context.parser; - parser.consumeSpaces(); - if (parser.fetch().text === "[") { - parser.consume(); - parser.consumeSpaces(); - colAlign = parser.fetch().text; - if ("lcr".indexOf(colAlign) === -1) { - throw new ParseError("Expected l or c or r", parser.nextToken); - } - parser.consume(); - parser.consumeSpaces(); - parser.expect("]"); - parser.consume(); - payload.cols = []; - } - } - const res = parseArray(context.parser, payload, "text"); - res.cols = new Array(res.body[0].length).fill({ type: "align", align: colAlign }); - return delimiters - ? { - type: "leftright", - mode: context.mode, - body: [res], - left: delimiters[0], - right: delimiters[1], - rightColor: undefined // \right uninfluenced by \color in array - } - : res; - }, - mathmlBuilder: mathmlBuilder$7 -}); - -defineEnvironment({ - type: "array", - names: ["smallmatrix"], - props: { - numArgs: 0 - }, - handler(context) { - const payload = { type: "small" }; - const res = parseArray(context.parser, payload, "script"); - res.envClasses = ["small"]; - return res; - }, - mathmlBuilder: mathmlBuilder$7 -}); - -defineEnvironment({ - type: "array", - names: ["subarray"], - props: { - numArgs: 1 - }, - handler(context, args) { - // Parsing of {subarray} is similar to {array} - const symNode = checkSymbolNodeType(args[0]); - const colalign = symNode ? [args[0]] : assertNodeType(args[0], "ordgroup").body; - const cols = colalign.map(function(nde) { - const node = assertSymbolNodeType(nde); - const ca = node.text; - // {subarray} only recognizes "l" & "c" - if ("lc".indexOf(ca) !== -1) { - return { - type: "align", - align: ca - }; - } - throw new ParseError("Unknown column alignment: " + ca, nde); - }); - if (cols.length > 1) { - throw new ParseError("{subarray} can contain only one column"); - } - let res = { - cols, - envClasses: ["small"] - }; - res = parseArray(context.parser, res, "script"); - if (res.body.length > 0 && res.body[0].length > 1) { - throw new ParseError("{subarray} can contain only one column"); - } - return res; - }, - mathmlBuilder: mathmlBuilder$7 -}); - -// A cases environment (in amsmath.sty) is almost equivalent to -// \def -// \left\{\begin{array}{@{}l@{\quad}l@{}} … \end{array}\right. -// {dcases} is a {cases} environment where cells are set in \displaystyle, -// as defined in mathtools.sty. -// {rcases} is another mathtools environment. It's brace is on the right side. -defineEnvironment({ - type: "array", - names: ["cases", "dcases", "rcases", "drcases"], - props: { - numArgs: 0 - }, - handler(context) { - const payload = { - cols: [], - envClasses: ["cases"] - }; - const res = parseArray(context.parser, payload, dCellStyle(context.envName)); - return { - type: "leftright", - mode: context.mode, - body: [res], - left: context.envName.indexOf("r") > -1 ? "." : "\\{", - right: context.envName.indexOf("r") > -1 ? "\\}" : ".", - rightColor: undefined - }; - }, - mathmlBuilder: mathmlBuilder$7 -}); - -// In the align environment, one uses ampersands, &, to specify number of -// columns in each row, and to locate spacing between each column. -// align gets automatic numbering. align* and aligned do not. -// The alignedat environment can be used in math mode. -defineEnvironment({ - type: "array", - names: ["align", "align*", "aligned", "split"], - props: { - numArgs: 0 - }, - handler: alignedHandler, - mathmlBuilder: mathmlBuilder$7 -}); - -// alignat environment is like an align environment, but one must explicitly -// specify maximum number of columns in each row, and can adjust where spacing occurs. -defineEnvironment({ - type: "array", - names: ["alignat", "alignat*", "alignedat"], - props: { - numArgs: 1 - }, - handler: alignedHandler, - mathmlBuilder: mathmlBuilder$7 -}); - -// A gathered environment is like an array environment with one centered -// column, but where rows are considered lines so get \jot line spacing -// and contents are set in \displaystyle. -defineEnvironment({ - type: "array", - names: ["gathered", "gather", "gather*"], - props: { - numArgs: 0 - }, - handler(context) { - if (context.envName !== "gathered") { - validateAmsEnvironmentContext(context); - } - const res = { - cols: [], - envClasses: ["abut", "jot"], - addEqnNum: context.envName === "gather", - emptySingleRow: true, - leqno: context.parser.settings.leqno - }; - return parseArray(context.parser, res, "display"); - }, - mathmlBuilder: mathmlBuilder$7 -}); - -defineEnvironment({ - type: "array", - names: ["equation", "equation*"], - props: { - numArgs: 0 - }, - handler(context) { - validateAmsEnvironmentContext(context); - const res = { - addEqnNum: context.envName === "equation", - emptySingleRow: true, - singleRow: true, - maxNumCols: 1, - envClasses: ["align"], - leqno: context.parser.settings.leqno - }; - return parseArray(context.parser, res, "display"); - }, - mathmlBuilder: mathmlBuilder$7 -}); - -defineEnvironment({ - type: "array", - names: ["multline", "multline*"], - props: { - numArgs: 0 - }, - handler(context) { - validateAmsEnvironmentContext(context); - const res = { - addEqnNum: context.envName === "multline", - maxNumCols: 1, - envClasses: ["jot", "multline"], - leqno: context.parser.settings.leqno - }; - return parseArray(context.parser, res, "display"); - }, - mathmlBuilder: mathmlBuilder$7 -}); - -defineEnvironment({ - type: "array", - names: ["CD"], - props: { - numArgs: 0 - }, - handler(context) { - validateAmsEnvironmentContext(context); - return parseCD(context.parser); - }, - mathmlBuilder: mathmlBuilder$7 -}); - -// Catch \hline outside array environment -defineFunction({ - type: "text", // Doesn't matter what this is. - names: ["\\hline", "\\hdashline"], - props: { - numArgs: 0, - allowedInText: true, - allowedInMath: true - }, - handler(context, args) { - throw new ParseError(`${context.funcName} valid only within array environment`); - } -}); - -const environments = _environments; - -// Environment delimiters. HTML/MathML rendering is defined in the corresponding -// defineEnvironment definitions. -defineFunction({ - type: "environment", - names: ["\\begin", "\\end"], - props: { - numArgs: 1, - argTypes: ["text"] - }, - handler({ parser, funcName }, args) { - const nameGroup = args[0]; - if (nameGroup.type !== "ordgroup") { - throw new ParseError("Invalid environment name", nameGroup); - } - let envName = ""; - for (let i = 0; i < nameGroup.body.length; ++i) { - envName += assertNodeType(nameGroup.body[i], "textord").text; - } - - if (funcName === "\\begin") { - // begin...end is similar to left...right - if (!Object.prototype.hasOwnProperty.call(environments, envName )) { - throw new ParseError("No such environment: " + envName, nameGroup); - } - // Build the environment object. Arguments and other information will - // be made available to the begin and end methods using properties. - const env = environments[envName]; - const { args, optArgs } = parser.parseArguments("\\begin{" + envName + "}", env); - const context = { - mode: parser.mode, - envName, - parser - }; - const result = env.handler(context, args, optArgs); - parser.expect("\\end", false); - const endNameToken = parser.nextToken; - const end = assertNodeType(parser.parseFunction(), "environment"); - if (end.name !== envName) { - throw new ParseError( - `Mismatch: \\begin{${envName}} matched by \\end{${end.name}}`, - endNameToken - ); - } - return result; - } - - return { - type: "environment", - mode: parser.mode, - name: envName, - nameGroup - }; - } -}); - -defineFunction({ - type: "envTag", - names: ["\\env@tag"], - props: { - numArgs: 1, - argTypes: ["math"] - }, - handler({ parser }, args) { - return { - type: "envTag", - mode: parser.mode, - body: args[0] - }; - }, - mathmlBuilder(group, style) { - return new mathMLTree.MathNode("mrow"); - } -}); - -defineFunction({ - type: "noTag", - names: ["\\env@notag"], - props: { - numArgs: 0 - }, - handler({ parser }) { - return { - type: "noTag", - mode: parser.mode - }; - }, - mathmlBuilder(group, style) { - return new mathMLTree.MathNode("mrow"); - } -}); - -const isLongVariableName = (group, font) => { - if (font !== "mathrm" || group.body.type !== "ordgroup" || group.body.body.length === 1) { - return false - } - if (group.body.body[0].type !== "mathord") { return false } - for (let i = 1; i < group.body.body.length; i++) { - const parseNodeType = group.body.body[i].type; - if (!(parseNodeType === "mathord" || - (parseNodeType === "textord" && !isNaN(group.body.body[i].text)))) { - return false - } - } - return true -}; - -const mathmlBuilder$6 = (group, style) => { - const font = group.font; - const newStyle = style.withFont(font); - const mathGroup = buildGroup$1(group.body, newStyle); - - if (mathGroup.children.length === 0) { return mathGroup } // empty group, e.g., \mathrm{} - if (font === "boldsymbol" && ["mo", "mpadded", "mrow"].includes(mathGroup.type)) { - mathGroup.style.fontWeight = "bold"; - return mathGroup - } - // Check if it is possible to consolidate elements into a single element. - if (isLongVariableName(group, font)) { - // This is a \mathrm{…} group. It gets special treatment because symbolsOrd.js - // wraps elements with s to work around a Firefox bug. - const mi = mathGroup.children[0].children[0]; - delete mi.attributes.mathvariant; - for (let i = 1; i < mathGroup.children.length; i++) { - mi.children[0].text += mathGroup.children[i].type === "mn" - ? mathGroup.children[i].children[0].text - : mathGroup.children[i].children[0].children[0].text; - } - // Wrap in a to prevent the same Firefox bug. - const bogus = new mathMLTree.MathNode("mtext", new mathMLTree.TextNode("\u200b")); - return new mathMLTree.MathNode("mrow", [bogus, mi]) - } - let canConsolidate = mathGroup.children[0].type === "mo"; - for (let i = 1; i < mathGroup.children.length; i++) { - if (mathGroup.children[i].type === "mo" && font === "boldsymbol") { - mathGroup.children[i].style.fontWeight = "bold"; - } - if (mathGroup.children[i].type !== "mi") { canConsolidate = false; } - const localVariant = mathGroup.children[i].attributes && - mathGroup.children[i].attributes.mathvariant || ""; - if (localVariant !== "normal") { canConsolidate = false; } - } - if (!canConsolidate) { return mathGroup } - // Consolidate the elements. - const mi = mathGroup.children[0]; - for (let i = 1; i < mathGroup.children.length; i++) { - mi.children.push(mathGroup.children[i].children[0]); - } - if (mi.attributes.mathvariant && mi.attributes.mathvariant === "normal") { - // Workaround for a Firefox bug that renders spurious space around - // a - // Ref: https://bugs.webkit.org/show_bug.cgi?id=129097 - // We insert a text node that contains a zero-width space and wrap in an mrow. - // TODO: Get rid of this workaround when the Firefox bug is fixed. - const bogus = new mathMLTree.MathNode("mtext", new mathMLTree.TextNode("\u200b")); - return new mathMLTree.MathNode("mrow", [bogus, mi]) - } - return mi -}; - -const fontAliases = { - "\\Bbb": "\\mathbb", - "\\bold": "\\mathbf", - "\\frak": "\\mathfrak", - "\\bm": "\\boldsymbol" -}; - -defineFunction({ - type: "font", - names: [ - // styles - "\\mathrm", - "\\mathit", - "\\mathbf", - "\\mathnormal", - "\\up@greek", - "\\boldsymbol", - - // families - "\\mathbb", - "\\mathcal", - "\\mathfrak", - "\\mathscr", - "\\mathsf", - "\\mathtt", - - // aliases - "\\Bbb", - "\\bm", - "\\bold", - "\\frak" - ], - props: { - numArgs: 1, - allowedInArgument: true - }, - handler: ({ parser, funcName }, args) => { - const body = normalizeArgument(args[0]); - let func = funcName; - if (func in fontAliases) { - func = fontAliases[func]; - } - return { - type: "font", - mode: parser.mode, - font: func.slice(1), - body - }; - }, - mathmlBuilder: mathmlBuilder$6 -}); - -// Old font changing functions -defineFunction({ - type: "font", - names: ["\\rm", "\\sf", "\\tt", "\\bf", "\\it", "\\cal"], - props: { - numArgs: 0, - allowedInText: true - }, - handler: ({ parser, funcName, breakOnTokenText }, args) => { - const { mode } = parser; - const body = parser.parseExpression(true, breakOnTokenText, true); - const fontStyle = `math${funcName.slice(1)}`; - - return { - type: "font", - mode: mode, - font: fontStyle, - body: { - type: "ordgroup", - mode: parser.mode, - body - } - }; - }, - mathmlBuilder: mathmlBuilder$6 -}); - -const stylArray = ["display", "text", "script", "scriptscript"]; -const scriptLevel = { auto: -1, display: 0, text: 0, script: 1, scriptscript: 2 }; - -const mathmlBuilder$5 = (group, style) => { - // Track the scriptLevel of the numerator and denominator. - // We may need that info for \mathchoice or for adjusting em dimensions. - const childOptions = group.scriptLevel === "auto" - ? style.incrementLevel() - : group.scriptLevel === "display" - ? style.withLevel(StyleLevel.TEXT) - : group.scriptLevel === "text" - ? style.withLevel(StyleLevel.SCRIPT) - : style.withLevel(StyleLevel.SCRIPTSCRIPT); - - let node = new mathMLTree.MathNode("mfrac", [ - buildGroup$1(group.numer, childOptions), - buildGroup$1(group.denom, childOptions) - ]); - - if (!group.hasBarLine) { - node.setAttribute("linethickness", "0px"); - } else if (group.barSize) { - const ruleWidth = calculateSize(group.barSize, style); - node.setAttribute("linethickness", ruleWidth.number + ruleWidth.unit); - } - - if (group.leftDelim != null || group.rightDelim != null) { - const withDelims = []; - - if (group.leftDelim != null) { - const leftOp = new mathMLTree.MathNode("mo", [ - new mathMLTree.TextNode(group.leftDelim.replace("\\", "")) - ]); - leftOp.setAttribute("fence", "true"); - withDelims.push(leftOp); - } - - withDelims.push(node); - - if (group.rightDelim != null) { - const rightOp = new mathMLTree.MathNode("mo", [ - new mathMLTree.TextNode(group.rightDelim.replace("\\", "")) - ]); - rightOp.setAttribute("fence", "true"); - withDelims.push(rightOp); - } - - node = makeRow(withDelims); - } - - if (group.scriptLevel !== "auto") { - node = new mathMLTree.MathNode("mstyle", [node]); - node.setAttribute("displaystyle", String(group.scriptLevel === "display")); - node.setAttribute("scriptlevel", scriptLevel[group.scriptLevel]); - } - - return node; -}; - -defineFunction({ - type: "genfrac", - names: [ - "\\dfrac", - "\\frac", - "\\tfrac", - "\\dbinom", - "\\binom", - "\\tbinom", - "\\\\atopfrac", // can’t be entered directly - "\\\\bracefrac", - "\\\\brackfrac" // ditto - ], - props: { - numArgs: 2, - allowedInArgument: true - }, - handler: ({ parser, funcName }, args) => { - const numer = args[0]; - const denom = args[1]; - let hasBarLine = false; - let leftDelim = null; - let rightDelim = null; - let scriptLevel = "auto"; - - switch (funcName) { - case "\\dfrac": - case "\\frac": - case "\\tfrac": - hasBarLine = true; - break; - case "\\\\atopfrac": - hasBarLine = false; - break; - case "\\dbinom": - case "\\binom": - case "\\tbinom": - leftDelim = "("; - rightDelim = ")"; - break; - case "\\\\bracefrac": - leftDelim = "\\{"; - rightDelim = "\\}"; - break; - case "\\\\brackfrac": - leftDelim = "["; - rightDelim = "]"; - break; - default: - throw new Error("Unrecognized genfrac command"); - } - - switch (funcName) { - case "\\dfrac": - case "\\dbinom": - scriptLevel = "display"; - break; - case "\\tfrac": - case "\\tbinom": - scriptLevel = "text"; - break; - } - - return { - type: "genfrac", - mode: parser.mode, - continued: false, - numer, - denom, - hasBarLine, - leftDelim, - rightDelim, - scriptLevel, - barSize: null - }; - }, - mathmlBuilder: mathmlBuilder$5 -}); - -defineFunction({ - type: "genfrac", - names: ["\\cfrac"], - props: { - numArgs: 2 - }, - handler: ({ parser, funcName }, args) => { - const numer = args[0]; - const denom = args[1]; - - return { - type: "genfrac", - mode: parser.mode, - continued: true, - numer, - denom, - hasBarLine: true, - leftDelim: null, - rightDelim: null, - scriptLevel: "display", - barSize: null - }; - } -}); - -// Infix generalized fractions -- these are not rendered directly, but replaced -// immediately by one of the variants above. -defineFunction({ - type: "infix", - names: ["\\over", "\\choose", "\\atop", "\\brace", "\\brack"], - props: { - numArgs: 0, - infix: true - }, - handler({ parser, funcName, token }) { - let replaceWith; - switch (funcName) { - case "\\over": - replaceWith = "\\frac"; - break; - case "\\choose": - replaceWith = "\\binom"; - break; - case "\\atop": - replaceWith = "\\\\atopfrac"; - break; - case "\\brace": - replaceWith = "\\\\bracefrac"; - break; - case "\\brack": - replaceWith = "\\\\brackfrac"; - break; - default: - throw new Error("Unrecognized infix genfrac command"); - } - return { - type: "infix", - mode: parser.mode, - replaceWith, - token - }; - } -}); - -const delimFromValue = function(delimString) { - let delim = null; - if (delimString.length > 0) { - delim = delimString; - delim = delim === "." ? null : delim; - } - return delim; -}; - -defineFunction({ - type: "genfrac", - names: ["\\genfrac"], - props: { - numArgs: 6, - allowedInArgument: true, - argTypes: ["math", "math", "size", "text", "math", "math"] - }, - handler({ parser }, args) { - const numer = args[4]; - const denom = args[5]; - - // Look into the parse nodes to get the desired delimiters. - const leftNode = normalizeArgument(args[0]); - const leftDelim = leftNode.type === "atom" && leftNode.family === "open" - ? delimFromValue(leftNode.text) - : null; - const rightNode = normalizeArgument(args[1]); - const rightDelim = - rightNode.type === "atom" && rightNode.family === "close" - ? delimFromValue(rightNode.text) - : null; - - const barNode = assertNodeType(args[2], "size"); - let hasBarLine; - let barSize = null; - if (barNode.isBlank) { - // \genfrac acts differently than \above. - // \genfrac treats an empty size group as a signal to use a - // standard bar size. \above would see size = 0 and omit the bar. - hasBarLine = true; - } else { - barSize = barNode.value; - hasBarLine = barSize.number > 0; - } - - // Find out if we want displaystyle, textstyle, etc. - let scriptLevel = "auto"; - let styl = args[3]; - if (styl.type === "ordgroup") { - if (styl.body.length > 0) { - const textOrd = assertNodeType(styl.body[0], "textord"); - scriptLevel = stylArray[Number(textOrd.text)]; - } - } else { - styl = assertNodeType(styl, "textord"); - scriptLevel = stylArray[Number(styl.text)]; - } - - return { - type: "genfrac", - mode: parser.mode, - numer, - denom, - continued: false, - hasBarLine, - barSize, - leftDelim, - rightDelim, - scriptLevel - }; - }, - mathmlBuilder: mathmlBuilder$5 -}); - -// \above is an infix fraction that also defines a fraction bar size. -defineFunction({ - type: "infix", - names: ["\\above"], - props: { - numArgs: 1, - argTypes: ["size"], - infix: true - }, - handler({ parser, funcName, token }, args) { - return { - type: "infix", - mode: parser.mode, - replaceWith: "\\\\abovefrac", - barSize: assertNodeType(args[0], "size").value, - token - }; - } -}); - -defineFunction({ - type: "genfrac", - names: ["\\\\abovefrac"], - props: { - numArgs: 3, - argTypes: ["math", "size", "math"] - }, - handler: ({ parser, funcName }, args) => { - const numer = args[0]; - const barSize = assert(assertNodeType(args[1], "infix").barSize); - const denom = args[2]; - - const hasBarLine = barSize.number > 0; - return { - type: "genfrac", - mode: parser.mode, - numer, - denom, - continued: false, - hasBarLine, - barSize, - leftDelim: null, - rightDelim: null, - scriptLevel: "auto" - }; - }, - - mathmlBuilder: mathmlBuilder$5 -}); - -// \hbox is provided for compatibility with LaTeX functions that act on a box. -// This function by itself doesn't do anything but set scriptlevel to \textstyle -// and prevent a soft line break. - -defineFunction({ - type: "hbox", - names: ["\\hbox"], - props: { - numArgs: 1, - argTypes: ["hbox"], - allowedInArgument: true, - allowedInText: false - }, - handler({ parser }, args) { - return { - type: "hbox", - mode: parser.mode, - body: ordargument(args[0]) - }; - }, - mathmlBuilder(group, style) { - const newStyle = style.withLevel(StyleLevel.TEXT); - const mrow = buildExpressionRow(group.body, newStyle); - return consolidateText(mrow) - } -}); - -const mathmlBuilder$4 = (group, style) => { - const accentNode = stretchy.mathMLnode(group.label); - accentNode.style["math-depth"] = 0; - return new mathMLTree.MathNode(group.isOver ? "mover" : "munder", [ - buildGroup$1(group.base, style), - accentNode - ]); -}; - -// Horizontal stretchy braces -defineFunction({ - type: "horizBrace", - names: ["\\overbrace", "\\underbrace"], - props: { - numArgs: 1 - }, - handler({ parser, funcName }, args) { - return { - type: "horizBrace", - mode: parser.mode, - label: funcName, - isOver: /^\\over/.test(funcName), - base: args[0] - }; - }, - mathmlBuilder: mathmlBuilder$4 -}); - -defineFunction({ - type: "href", - names: ["\\href"], - props: { - numArgs: 2, - argTypes: ["url", "original"], - allowedInText: true - }, - handler: ({ parser, token }, args) => { - const body = args[1]; - const href = assertNodeType(args[0], "url").url; - - if ( - !parser.settings.isTrusted({ - command: "\\href", - url: href - }) - ) { - throw new ParseError(`Function "\\href" is not trusted`, token) - } - - return { - type: "href", - mode: parser.mode, - href, - body: ordargument(body) - }; - }, - mathmlBuilder: (group, style) => { - let math = buildExpressionRow(group.body, style); - if (!(math instanceof MathNode)) { - math = new MathNode("mrow", [math]); - } - math.setAttribute("href", group.href); - return math; - } -}); - -defineFunction({ - type: "href", - names: ["\\url"], - props: { - numArgs: 1, - argTypes: ["url"], - allowedInText: true - }, - handler: ({ parser, token }, args) => { - const href = assertNodeType(args[0], "url").url; - - if ( - !parser.settings.isTrusted({ - command: "\\url", - url: href - }) - ) { - throw new ParseError(`Function "\\url" is not trusted`, token) - } - - const chars = []; - for (let i = 0; i < href.length; i++) { - let c = href[i]; - if (c === "~") { - c = "\\textasciitilde"; - } - chars.push({ - type: "textord", - mode: "text", - text: c - }); - } - const body = { - type: "text", - mode: parser.mode, - font: "\\texttt", - body: chars - }; - return { - type: "href", - mode: parser.mode, - href, - body: ordargument(body) - }; - } -}); - -defineFunction({ - type: "html", - names: ["\\class", "\\id", "\\style", "\\data"], - props: { - numArgs: 2, - argTypes: ["raw", "original"], - allowedInText: true - }, - handler: ({ parser, funcName, token }, args) => { - const value = assertNodeType(args[0], "raw").string; - const body = args[1]; - - if (parser.settings.strict) { - throw new ParseError(`Function "${funcName}" is disabled in strict mode`, token) - } - - let trustContext; - const attributes = {}; - - switch (funcName) { - case "\\class": - attributes.class = value; - trustContext = { - command: "\\class", - class: value - }; - break; - case "\\id": - attributes.id = value; - trustContext = { - command: "\\id", - id: value - }; - break; - case "\\style": - attributes.style = value; - trustContext = { - command: "\\style", - style: value - }; - break; - case "\\data": { - const data = value.split(","); - for (let i = 0; i < data.length; i++) { - const keyVal = data[i].split("="); - if (keyVal.length !== 2) { - throw new ParseError("Error parsing key-value for \\data"); - } - attributes["data-" + keyVal[0].trim()] = keyVal[1].trim(); - } - - trustContext = { - command: "\\data", - attributes - }; - break; - } - default: - throw new Error("Unrecognized html command"); - } - - if (!parser.settings.isTrusted(trustContext)) { - throw new ParseError(`Function "${funcName}" is not trusted`, token) - } - return { - type: "html", - mode: parser.mode, - attributes, - body: ordargument(body) - }; - }, - mathmlBuilder: (group, style) => { - const element = buildExpressionRow(group.body, style); - - const classes = []; - if (group.attributes.class) { - classes.push(...group.attributes.class.trim().split(/\s+/)); - } - element.classes = classes; - - for (const attr in group.attributes) { - if (attr !== "class" && Object.prototype.hasOwnProperty.call(group.attributes, attr)) { - element.setAttribute(attr, group.attributes[attr]); - } - } - - return element; - } -}); - -const sizeData = function(str) { - if (/^[-+]? *(\d+(\.\d*)?|\.\d+)$/.test(str)) { - // str is a number with no unit specified. - // default unit is bp, per graphix package. - return { number: +str, unit: "bp" } - } else { - const match = /([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(str); - if (!match) { - throw new ParseError("Invalid size: '" + str + "' in \\includegraphics"); - } - const data = { - number: +(match[1] + match[2]), // sign + magnitude, cast to number - unit: match[3] - }; - if (!validUnit(data)) { - throw new ParseError("Invalid unit: '" + data.unit + "' in \\includegraphics."); - } - return data - } -}; - -defineFunction({ - type: "includegraphics", - names: ["\\includegraphics"], - props: { - numArgs: 1, - numOptionalArgs: 1, - argTypes: ["raw", "url"], - allowedInText: false - }, - handler: ({ parser, token }, args, optArgs) => { - let width = { number: 0, unit: "em" }; - let height = { number: 0.9, unit: "em" }; // sorta character sized. - let totalheight = { number: 0, unit: "em" }; - let alt = ""; - - if (optArgs[0]) { - const attributeStr = assertNodeType(optArgs[0], "raw").string; - - // Parser.js does not parse key/value pairs. We get a string. - const attributes = attributeStr.split(","); - for (let i = 0; i < attributes.length; i++) { - const keyVal = attributes[i].split("="); - if (keyVal.length === 2) { - const str = keyVal[1].trim(); - switch (keyVal[0].trim()) { - case "alt": - alt = str; - break - case "width": - width = sizeData(str); - break - case "height": - height = sizeData(str); - break - case "totalheight": - totalheight = sizeData(str); - break - default: - throw new ParseError("Invalid key: '" + keyVal[0] + "' in \\includegraphics.") - } - } - } - } - - const src = assertNodeType(args[0], "url").url; - - if (alt === "") { - // No alt given. Use the file name. Strip away the path. - alt = src; - alt = alt.replace(/^.*[\\/]/, ""); - alt = alt.substring(0, alt.lastIndexOf(".")); - } - - if ( - !parser.settings.isTrusted({ - command: "\\includegraphics", - url: src - }) - ) { - throw new ParseError(`Function "\\includegraphics" is not trusted`, token) - } - - return { - type: "includegraphics", - mode: parser.mode, - alt: alt, - width: width, - height: height, - totalheight: totalheight, - src: src - } - }, - mathmlBuilder: (group, style) => { - const height = calculateSize(group.height, style); - const depth = { number: 0, unit: "em" }; - - if (group.totalheight.number > 0) { - if (group.totalheight.unit === height.unit && - group.totalheight.number > height.number) { - depth.number = group.totalheight.number - height.number; - depth.unit = height.unit; - } - } - - let width = 0; - if (group.width.number > 0) { - width = calculateSize(group.width, style); - } - - const graphicStyle = { height: height.number + depth.number + "em" }; - if (width.number > 0) { - graphicStyle.width = width.number + width.unit; - } - if (depth.number > 0) { - graphicStyle.verticalAlign = -depth.number + depth.unit; - } - - const node = new Img(group.src, group.alt, graphicStyle); - node.height = height; - node.depth = depth; - return new mathMLTree.MathNode("mtext", [node]) - } -}); - -// Horizontal spacing commands - -// TODO: \hskip and \mskip should support plus and minus in lengths - -defineFunction({ - type: "kern", - names: ["\\kern", "\\mkern", "\\hskip", "\\mskip"], - props: { - numArgs: 1, - argTypes: ["size"], - primitive: true, - allowedInText: true - }, - handler({ parser, funcName, token }, args) { - const size = assertNodeType(args[0], "size"); - if (parser.settings.strict) { - const mathFunction = funcName[1] === "m"; // \mkern, \mskip - const muUnit = size.value.unit === "mu"; - if (mathFunction) { - if (!muUnit) { - throw new ParseError(`LaTeX's ${funcName} supports only mu units, ` + - `not ${size.value.unit} units`, token) - } - if (parser.mode !== "math") { - throw new ParseError(`LaTeX's ${funcName} works only in math mode`, token) - } - } else { - // !mathFunction - if (muUnit) { - throw new ParseError(`LaTeX's ${funcName} doesn't support mu units`, token) - } - } - } - return { - type: "kern", - mode: parser.mode, - dimension: size.value - }; - }, - mathmlBuilder(group, style) { - const dimension = calculateSize(group.dimension, style); - const ch = dimension.unit === "em" ? spaceCharacter(dimension.number) : ""; - if (group.mode === "text" && ch.length > 0) { - const character = new mathMLTree.TextNode(ch); - return new mathMLTree.MathNode("mtext", [character]); - } else { - const node = new mathMLTree.MathNode("mspace"); - node.setAttribute("width", dimension.number + dimension.unit); - if (dimension.number < 0) { - node.style.marginLeft = dimension.number + dimension.unit; - } - return node; - } - } -}); - -const spaceCharacter = function(width) { - if (width >= 0.05555 && width <= 0.05556) { - return "\u200a"; //   - } else if (width >= 0.1666 && width <= 0.1667) { - return "\u2009"; //   - } else if (width >= 0.2222 && width <= 0.2223) { - return "\u2005"; //   - } else if (width >= 0.2777 && width <= 0.2778) { - return "\u2005\u200a"; //    - } else { - return ""; - } -}; - -// Limit valid characters to a small set, for safety. -const invalidIdRegEx = /[^A-Za-z_0-9-]/g; - -defineFunction({ - type: "label", - names: ["\\label"], - props: { - numArgs: 1, - argTypes: ["raw"] - }, - handler({ parser }, args) { - return { - type: "label", - mode: parser.mode, - string: args[0].string.replace(invalidIdRegEx, "") - }; - }, - mathmlBuilder(group, style) { - // Return a no-width, no-ink element with an HTML id. - const node = new mathMLTree.MathNode("mrow", [], ["tml-label"]); - if (group.string.length > 0) { - node.setAttribute("id", group.string); - } - return node - } -}); - -// Horizontal overlap functions - -const textModeLap = ["\\clap", "\\llap", "\\rlap"]; - -defineFunction({ - type: "lap", - names: ["\\mathllap", "\\mathrlap", "\\mathclap", "\\clap", "\\llap", "\\rlap"], - props: { - numArgs: 1, - allowedInText: true - }, - handler: ({ parser, funcName, token }, args) => { - if (textModeLap.includes(funcName)) { - if (parser.settings.strict && parser.mode !== "text") { - throw new ParseError(`{${funcName}} can be used only in text mode. - Try \\math${funcName.slice(1)}`, token) - } - funcName = funcName.slice(1); - } else { - funcName = funcName.slice(5); - } - const body = args[0]; - return { - type: "lap", - mode: parser.mode, - alignment: funcName, - body - } - }, - mathmlBuilder: (group, style) => { - // mathllap, mathrlap, mathclap - let strut; - if (group.alignment === "llap") { - // We need an invisible strut with the same depth as the group. - // We can't just read the depth, so we use \vphantom methods. - const phantomInner = buildExpression(ordargument(group.body), style); - const phantom = new mathMLTree.MathNode("mphantom", phantomInner); - strut = new mathMLTree.MathNode("mpadded", [phantom]); - strut.setAttribute("width", "0px"); - } - - const inner = buildGroup$1(group.body, style); - let node; - if (group.alignment === "llap") { - inner.style.position = "absolute"; - inner.style.right = "0"; - inner.style.bottom = `0`; // If we could have read the ink depth, it would go here. - node = new mathMLTree.MathNode("mpadded", [strut, inner]); - } else { - node = new mathMLTree.MathNode("mpadded", [inner]); - } - - if (group.alignment === "rlap") { - if (group.body.body.length > 0 && group.body.body[0].type === "genfrac") { - // In Firefox, a squashes the 3/18em padding of a child \frac. Put it back. - node.setAttribute("lspace", "0.16667em"); - } - } else { - const offset = group.alignment === "llap" ? "-1" : "-0.5"; - node.setAttribute("lspace", offset + "width"); - if (group.alignment === "llap") { - node.style.position = "relative"; - } else { - node.style.display = "flex"; - node.style.justifyContent = "center"; - } - } - node.setAttribute("width", "0px"); - return node - } -}); - -// Switching from text mode back to math mode -defineFunction({ - type: "ordgroup", - names: ["\\(", "$"], - props: { - numArgs: 0, - allowedInText: true, - allowedInMath: false - }, - handler({ funcName, parser }, args) { - const outerMode = parser.mode; - parser.switchMode("math"); - const close = funcName === "\\(" ? "\\)" : "$"; - const body = parser.parseExpression(false, close); - parser.expect(close); - parser.switchMode(outerMode); - return { - type: "ordgroup", - mode: parser.mode, - body - }; - } -}); - -// Check for extra closing math delimiters -defineFunction({ - type: "text", // Doesn't matter what this is. - names: ["\\)", "\\]"], - props: { - numArgs: 0, - allowedInText: true, - allowedInMath: false - }, - handler(context, token) { - throw new ParseError(`Mismatched ${context.funcName}`, token); - } -}); - -const chooseStyle = (group, style) => { - switch (style.level) { - case StyleLevel.DISPLAY: // 0 - return group.display; - case StyleLevel.TEXT: // 1 - return group.text; - case StyleLevel.SCRIPT: // 2 - return group.script; - case StyleLevel.SCRIPTSCRIPT: // 3 - return group.scriptscript; - default: - return group.text; - } -}; - -defineFunction({ - type: "mathchoice", - names: ["\\mathchoice"], - props: { - numArgs: 4, - primitive: true - }, - handler: ({ parser }, args) => { - return { - type: "mathchoice", - mode: parser.mode, - display: ordargument(args[0]), - text: ordargument(args[1]), - script: ordargument(args[2]), - scriptscript: ordargument(args[3]) - }; - }, - mathmlBuilder: (group, style) => { - const body = chooseStyle(group, style); - return buildExpressionRow(body, style); - } -}); - -const textAtomTypes = ["text", "textord", "mathord", "atom"]; - -const padding = width => { - const node = new mathMLTree.MathNode("mspace"); - node.setAttribute("width", width + "em"); - return node -}; - -function mathmlBuilder$3(group, style) { - let node; - const inner = buildExpression(group.body, style); - - if (group.mclass === "minner") { - node = new mathMLTree.MathNode("mpadded", inner); - } else if (group.mclass === "mord") { - if (group.isCharacterBox || inner[0].type === "mathord") { - node = inner[0]; - node.type = "mi"; - if (node.children.length === 1 && node.children[0].text && node.children[0].text === "∇") { - node.setAttribute("mathvariant", "normal"); - } - } else { - node = new mathMLTree.MathNode("mi", inner); - } - } else { - node = new mathMLTree.MathNode("mrow", inner); - if (group.mustPromote) { - node = inner[0]; - node.type = "mo"; - if (group.isCharacterBox && group.body[0].text && /[A-Za-z]/.test(group.body[0].text)) { - node.setAttribute("mathvariant", "italic"); - } - } else { - node = new mathMLTree.MathNode("mrow", inner); - } - - // Set spacing based on what is the most likely adjacent atom type. - // See TeXbook p170. - const doSpacing = style.level < 2; // Operator spacing is zero inside a (sub|super)script. - if (node.type === "mrow") { - if (doSpacing ) { - if (group.mclass === "mbin") { - // medium space - node.children.unshift(padding(0.2222)); - node.children.push(padding(0.2222)); - } else if (group.mclass === "mrel") { - // thickspace - node.children.unshift(padding(0.2778)); - node.children.push(padding(0.2778)); - } else if (group.mclass === "mpunct") { - node.children.push(padding(0.1667)); - } else if (group.mclass === "minner") { - node.children.unshift(padding(0.0556)); // 1 mu is the most likely option - node.children.push(padding(0.0556)); - } - } - } else { - if (group.mclass === "mbin") { - // medium space - node.attributes.lspace = (doSpacing ? "0.2222em" : "0"); - node.attributes.rspace = (doSpacing ? "0.2222em" : "0"); - } else if (group.mclass === "mrel") { - // thickspace - node.attributes.lspace = (doSpacing ? "0.2778em" : "0"); - node.attributes.rspace = (doSpacing ? "0.2778em" : "0"); - } else if (group.mclass === "mpunct") { - node.attributes.lspace = "0em"; - node.attributes.rspace = (doSpacing ? "0.1667em" : "0"); - } else if (group.mclass === "mopen" || group.mclass === "mclose") { - node.attributes.lspace = "0em"; - node.attributes.rspace = "0em"; - } else if (group.mclass === "minner" && doSpacing) { - node.attributes.lspace = "0.0556em"; // 1 mu is the most likely option - node.attributes.width = "+0.1111em"; - } - } - - if (!(group.mclass === "mopen" || group.mclass === "mclose")) { - delete node.attributes.stretchy; - delete node.attributes.form; - } - } - return node; -} - -// Math class commands except \mathop -defineFunction({ - type: "mclass", - names: [ - "\\mathord", - "\\mathbin", - "\\mathrel", - "\\mathopen", - "\\mathclose", - "\\mathpunct", - "\\mathinner" - ], - props: { - numArgs: 1, - primitive: true - }, - handler({ parser, funcName }, args) { - const body = args[0]; - const isCharacterBox = utils.isCharacterBox(body); - // We should not wrap a around a or . That would be invalid MathML. - // In that case, we instead promote the text contents of the body to the parent. - let mustPromote = true; - const mord = { type: "mathord", text: "", mode: parser.mode }; - const arr = (body.body) ? body.body : [body]; - for (const arg of arr) { - if (textAtomTypes.includes(arg.type)) { - if (symbols[parser.mode][arg.text]) { - mord.text += symbols[parser.mode][arg.text].replace; - } else if (arg.text) { - mord.text += arg.text; - } else if (arg.body) { - arg.body.map(e => { mord.text += e.text; }); - } - } else { - mustPromote = false; - break - } - } - return { - type: "mclass", - mode: parser.mode, - mclass: "m" + funcName.slice(5), - body: ordargument(mustPromote ? mord : body), - isCharacterBox, - mustPromote - }; - }, - mathmlBuilder: mathmlBuilder$3 -}); - -const binrelClass = (arg) => { - // \binrel@ spacing varies with (bin|rel|ord) of the atom in the argument. - // (by rendering separately and with {}s before and after, and measuring - // the change in spacing). We'll do roughly the same by detecting the - // atom type directly. - const atom = arg.type === "ordgroup" && arg.body.length ? arg.body[0] : arg; - if (atom.type === "atom" && (atom.family === "bin" || atom.family === "rel")) { - return "m" + atom.family; - } else { - return "mord"; - } -}; - -// \@binrel{x}{y} renders like y but as mbin/mrel/mord if x is mbin/mrel/mord. -// This is equivalent to \binrel@{x}\binrel@@{y} in AMSTeX. -defineFunction({ - type: "mclass", - names: ["\\@binrel"], - props: { - numArgs: 2 - }, - handler({ parser }, args) { - return { - type: "mclass", - mode: parser.mode, - mclass: binrelClass(args[0]), - body: ordargument(args[1]), - isCharacterBox: utils.isCharacterBox(args[1]) - }; - } -}); - -// Build a relation or stacked op by placing one symbol on top of another -defineFunction({ - type: "mclass", - names: ["\\stackrel", "\\overset", "\\underset"], - props: { - numArgs: 2 - }, - handler({ parser, funcName }, args) { - const baseArg = args[1]; - const shiftedArg = args[0]; - - const baseOp = { - type: "op", - mode: baseArg.mode, - limits: true, - alwaysHandleSupSub: true, - parentIsSupSub: false, - symbol: false, - stack: true, - suppressBaseShift: funcName !== "\\stackrel", - body: ordargument(baseArg) - }; - - return { - type: "supsub", - mode: shiftedArg.mode, - base: baseOp, - sup: funcName === "\\underset" ? null : shiftedArg, - sub: funcName === "\\underset" ? shiftedArg : null - }; - }, - mathmlBuilder: mathmlBuilder$3 -}); - -// Helper function -const buildGroup = (el, style, noneNode) => { - if (!el) { return noneNode } - const node = buildGroup$1(el, style); - if (node.type === "mrow" && node.children.length === 0) { return noneNode } - return node -}; - -defineFunction({ - type: "multiscript", - names: ["\\sideset", "\\pres@cript"], // See macros.js for \prescript - props: { - numArgs: 3 - }, - handler({ parser, funcName, token }, args) { - if (args[2].body.length === 0) { - throw new ParseError(funcName + `cannot parse an empty base.`) - } - const base = args[2].body[0]; - if (parser.settings.strict && funcName === "\\sideset" && !base.symbol) { - throw new ParseError(`The base of \\sideset must be a big operator. Try \\prescript.`) - } - - if ((args[0].body.length > 0 && args[0].body[0].type !== "supsub") || - (args[1].body.length > 0 && args[1].body[0].type !== "supsub")) { - throw new ParseError("\\sideset can parse only subscripts and " + - "superscripts in its first two arguments", token) - } - - // The prescripts and postscripts come wrapped in a supsub. - const prescripts = args[0].body.length > 0 ? args[0].body[0] : null; - const postscripts = args[1].body.length > 0 ? args[1].body[0] : null; - - if (!prescripts && !postscripts) { - return base - } else if (!prescripts) { - // It's not a multi-script. Get a \textstyle supsub. - return { - type: "styling", - mode: parser.mode, - scriptLevel: "text", - body: [{ - type: "supsub", - mode: parser.mode, - base, - sup: postscripts.sup, - sub: postscripts.sub - }] - } - } else { - return { - type: "multiscript", - mode: parser.mode, - isSideset: funcName === "\\sideset", - prescripts, - postscripts, - base - } - } - }, - mathmlBuilder(group, style) { - const base = buildGroup$1(group.base, style); - - const prescriptsNode = new mathMLTree.MathNode("mprescripts"); - const noneNode = new mathMLTree.MathNode("none"); - let children = []; - - const preSub = buildGroup(group.prescripts.sub, style, noneNode); - const preSup = buildGroup(group.prescripts.sup, style, noneNode); - if (group.isSideset) { - // This seems silly, but LaTeX does this. Firefox ignores it, which does not make me sad. - preSub.setAttribute("style", "text-align: left;"); - preSup.setAttribute("style", "text-align: left;"); - } - - if (group.postscripts) { - const postSub = buildGroup(group.postscripts.sub, style, noneNode); - const postSup = buildGroup(group.postscripts.sup, style, noneNode); - children = [base, postSub, postSup, prescriptsNode, preSub, preSup]; - } else { - children = [base, prescriptsNode, preSub, preSup]; - } - - return new mathMLTree.MathNode("mmultiscripts", children); - } -}); - -defineFunction({ - type: "not", - names: ["\\not"], - props: { - numArgs: 1, - primitive: true, - allowedInText: false - }, - handler({ parser }, args) { - const isCharacterBox = utils.isCharacterBox(args[0]); - let body; - if (isCharacterBox) { - body = ordargument(args[0]); - if (body[0].text.charAt(0) === "\\") { - body[0].text = symbols.math[body[0].text].replace; - } - // \u0338 is the Unicode Combining Long Solidus Overlay - body[0].text = body[0].text.slice(0, 1) + "\u0338" + body[0].text.slice(1); - } else { - // When the argument is not a character box, TeX does an awkward, poorly placed overlay. - // We'll do the same. - const notNode = { type: "textord", mode: "math", text: "\u0338" }; - const kernNode = { type: "kern", mode: "math", dimension: { number: -0.6, unit: "em" } }; - body = [notNode, kernNode, args[0]]; - } - return { - type: "not", - mode: parser.mode, - body, - isCharacterBox - }; - }, - mathmlBuilder(group, style) { - if (group.isCharacterBox) { - const inner = buildExpression(group.body, style, true); - return inner[0] - } else { - return buildExpressionRow(group.body, style) - } - } -}); - -// Limits, symbols - -// Some helpers - -const ordAtomTypes = ["textord", "mathord", "atom"]; - -// Most operators have a large successor symbol, but these don't. -const noSuccessor = ["\\smallint"]; - -// Math operators (e.g. \sin) need a space between these types and themselves: -const ordTypes = ["textord", "mathord", "ordgroup", "close", "leftright"]; - -// NOTE: Unlike most `builders`s, this one handles not only "op", but also -// "supsub" since some of them (like \int) can affect super/subscripting. - -const setSpacing = node => { - // The user wrote a \mathop{…} function. Change spacing from default to OP spacing. - // The most likely spacing for an OP is a thin space per TeXbook p170. - node.attributes.lspace = "0.1667em"; - node.attributes.rspace = "0.1667em"; -}; - -const mathmlBuilder$2 = (group, style) => { - let node; - - if (group.symbol) { - // This is a symbol. Just add the symbol. - node = new MathNode("mo", [makeText(group.name, group.mode)]); - if (noSuccessor.includes(group.name)) { - node.setAttribute("largeop", "false"); - } else { - node.setAttribute("movablelimits", "false"); - } - if (group.fromMathOp) { setSpacing(node); } - } else if (group.body) { - // This is an operator with children. Add them. - node = new MathNode("mo", buildExpression(group.body, style)); - if (group.fromMathOp) { setSpacing(node); } - } else { - // This is a text operator. Add all of the characters from the operator's name. - node = new MathNode("mi", [new TextNode(group.name.slice(1))]); - - if (!group.parentIsSupSub) { - // Append an invisible . - // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4 - const operator = new MathNode("mo", [makeText("\u2061", "text")]); - const row = [node, operator]; - // Set spacing - if (group.needsLeadingSpace) { - const lead = new MathNode("mspace"); - lead.setAttribute("width", "0.1667em"); // thin space. - row.unshift(lead); - } - if (!group.isFollowedByDelimiter) { - const trail = new MathNode("mspace"); - trail.setAttribute("width", "0.1667em"); // thin space. - row.push(trail); - } - node = new MathNode("mrow", row); - } - } - - return node; -}; - -const singleCharBigOps = { - "\u220F": "\\prod", - "\u2210": "\\coprod", - "\u2211": "\\sum", - "\u22c0": "\\bigwedge", - "\u22c1": "\\bigvee", - "\u22c2": "\\bigcap", - "\u22c3": "\\bigcup", - "\u2a00": "\\bigodot", - "\u2a01": "\\bigoplus", - "\u2a02": "\\bigotimes", - "\u2a04": "\\biguplus", - "\u2a05": "\\bigsqcap", - "\u2a06": "\\bigsqcup", - "\u2a09": "\\bigtimes" -}; - -defineFunction({ - type: "op", - names: [ - "\\coprod", - "\\bigvee", - "\\bigwedge", - "\\biguplus", - "\\bigcap", - "\\bigcup", - "\\intop", - "\\prod", - "\\sum", - "\\bigotimes", - "\\bigoplus", - "\\bigodot", - "\\bigsqcap", - "\\bigsqcup", - "\\bigtimes", - "\\smallint", - "\u220F", - "\u2210", - "\u2211", - "\u22c0", - "\u22c1", - "\u22c2", - "\u22c3", - "\u2a00", - "\u2a01", - "\u2a02", - "\u2a04", - "\u2a06" - ], - props: { - numArgs: 0 - }, - handler: ({ parser, funcName }, args) => { - let fName = funcName; - if (fName.length === 1) { - fName = singleCharBigOps[fName]; - } - return { - type: "op", - mode: parser.mode, - limits: true, - parentIsSupSub: false, - symbol: true, - stack: false, // This is true for \stackrel{}, not here. - name: fName - }; - }, - mathmlBuilder: mathmlBuilder$2 -}); - -// Note: calling defineFunction with a type that's already been defined only -// works because the same mathmlBuilder is being used. -defineFunction({ - type: "op", - names: ["\\mathop"], - props: { - numArgs: 1, - primitive: true - }, - handler: ({ parser }, args) => { - const body = args[0]; - // It would be convienient to just wrap a around the argument. - // But if the argument is a or , that would be invalid MathML. - // In that case, we instead promote the text contents of the body to the parent. - const arr = (body.body) ? body.body : [body]; - const isSymbol = arr.length === 1 && ordAtomTypes.includes(arr[0].type); - return { - type: "op", - mode: parser.mode, - limits: true, - parentIsSupSub: false, - symbol: isSymbol, - fromMathOp: true, - stack: false, - name: isSymbol ? arr[0].text : null, - body: isSymbol ? null : ordargument(body) - }; - }, - mathmlBuilder: mathmlBuilder$2 -}); - -// There are 2 flags for operators; whether they produce limits in -// displaystyle, and whether they are symbols and should grow in -// displaystyle. These four groups cover the four possible choices. - -const singleCharIntegrals = { - "\u222b": "\\int", - "\u222c": "\\iint", - "\u222d": "\\iiint", - "\u222e": "\\oint", - "\u222f": "\\oiint", - "\u2230": "\\oiiint", - "\u2231": "\\intclockwise", - "\u2232": "\\varointclockwise", - "\u2a0c": "\\iiiint", - "\u2a0d": "\\intbar", - "\u2a0e": "\\intBar", - "\u2a0f": "\\fint", - "\u2a12": "\\rppolint", - "\u2a13": "\\scpolint", - "\u2a15": "\\pointint", - "\u2a16": "\\sqint", - "\u2a17": "\\intlarhk", - "\u2a18": "\\intx", - "\u2a19": "\\intcap", - "\u2a1a": "\\intcup" -}; - -// No limits, not symbols -defineFunction({ - type: "op", - names: [ - "\\arcsin", - "\\arccos", - "\\arctan", - "\\arctg", - "\\arcctg", - "\\arg", - "\\ch", - "\\cos", - "\\cosec", - "\\cosh", - "\\cot", - "\\cotg", - "\\coth", - "\\csc", - "\\ctg", - "\\cth", - "\\deg", - "\\dim", - "\\exp", - "\\hom", - "\\ker", - "\\lg", - "\\ln", - "\\log", - "\\sec", - "\\sin", - "\\sinh", - "\\sh", - "\\sgn", - "\\tan", - "\\tanh", - "\\tg", - "\\th" - ], - props: { - numArgs: 0 - }, - handler({ parser, funcName }) { - const prevAtomType = parser.prevAtomType; - const next = parser.gullet.future().text; - return { - type: "op", - mode: parser.mode, - limits: false, - parentIsSupSub: false, - symbol: false, - stack: false, - isFollowedByDelimiter: isDelimiter(next), - needsLeadingSpace: prevAtomType.length > 0 && ordTypes.includes(prevAtomType), - name: funcName - }; - }, - mathmlBuilder: mathmlBuilder$2 -}); - -// Limits, not symbols -defineFunction({ - type: "op", - names: ["\\det", "\\gcd", "\\inf", "\\lim", "\\max", "\\min", "\\Pr", "\\sup"], - props: { - numArgs: 0 - }, - handler({ parser, funcName }) { - const prevAtomType = parser.prevAtomType; - const next = parser.gullet.future().text; - return { - type: "op", - mode: parser.mode, - limits: true, - parentIsSupSub: false, - symbol: false, - stack: false, - isFollowedByDelimiter: isDelimiter(next), - needsLeadingSpace: prevAtomType.length > 0 && ordTypes.includes(prevAtomType), - name: funcName - }; - }, - mathmlBuilder: mathmlBuilder$2 -}); - -// No limits, symbols -defineFunction({ - type: "op", - names: [ - "\\int", - "\\iint", - "\\iiint", - "\\iiiint", - "\\oint", - "\\oiint", - "\\oiiint", - "\\intclockwise", - "\\varointclockwise", - "\\intbar", - "\\intBar", - "\\fint", - "\\rppolint", - "\\scpolint", - "\\pointint", - "\\sqint", - "\\intlarhk", - "\\intx", - "\\intcap", - "\\intcup", - "\u222b", - "\u222c", - "\u222d", - "\u222e", - "\u222f", - "\u2230", - "\u2231", - "\u2232", - "\u2a0c", - "\u2a0d", - "\u2a0e", - "\u2a0f", - "\u2a12", - "\u2a13", - "\u2a15", - "\u2a16", - "\u2a17", - "\u2a18", - "\u2a19", - "\u2a1a" - ], - props: { - numArgs: 0 - }, - handler({ parser, funcName }) { - let fName = funcName; - if (fName.length === 1) { - fName = singleCharIntegrals[fName]; - } - return { - type: "op", - mode: parser.mode, - limits: false, - parentIsSupSub: false, - symbol: true, - stack: false, - name: fName - }; - }, - mathmlBuilder: mathmlBuilder$2 -}); - -/** - * All registered global/built-in macros. - * `macros.js` exports this same dictionary again and makes it public. - * `Parser.js` requires this dictionary via `macros.js`. - */ -const _macros = {}; - -// This function might one day accept an additional argument and do more things. -function defineMacro(name, body) { - _macros[name] = body; -} - -// NOTE: Unlike most builders, this one handles not only -// "operatorname", but also "supsub" since \operatorname* can -// affect super/subscripting. - -const mathmlBuilder$1 = (group, style) => { - let expression = buildExpression(group.body, style.withFont("mathrm")); - - // Is expression a string or has it something like a fraction? - let isAllString = true; // default - for (let i = 0; i < expression.length; i++) { - let node = expression[i]; - if (node instanceof mathMLTree.MathNode) { - if (node.type === "mrow" && node.children.length === 1 && - node.children[0] instanceof mathMLTree.MathNode) { - node = node.children[0]; - } - switch (node.type) { - case "mi": - case "mn": - case "ms": - case "mtext": - break; // Do nothing yet. - case "mspace": - { - if (node.attributes.width) { - const width = node.attributes.width.replace("em", ""); - const ch = spaceCharacter(Number(width)); - if (ch === "") { - isAllString = false; - } else { - expression[i] = new mathMLTree.MathNode("mtext", [new mathMLTree.TextNode(ch)]); - } - } - } - break - case "mo": { - const child = node.children[0]; - if (node.children.length === 1 && child instanceof mathMLTree.TextNode) { - child.text = child.text.replace(/\u2212/, "-").replace(/\u2217/, "*"); - } else { - isAllString = false; - } - break - } - default: - isAllString = false; - } - } else { - isAllString = false; - } - } - - if (isAllString) { - // Write a single TextNode instead of multiple nested tags. - const word = expression.map((node) => node.toText()).join(""); - expression = [new mathMLTree.TextNode(word)]; - } else if ( - expression.length === 1 - && ["mover", "munder"].includes(expression[0].type) && - (expression[0].children[0].type === "mi" || expression[0].children[0].type === "mtext") - ) { - expression[0].children[0].type = "mi"; - if (group.parentIsSupSub) { - return new mathMLTree.MathNode("mrow", expression) - } else { - const operator = new mathMLTree.MathNode("mo", [makeText("\u2061", "text")]); - return mathMLTree.newDocumentFragment([expression[0], operator]) - } - } - - let wrapper; - if (isAllString) { - wrapper = new mathMLTree.MathNode("mi", expression); - if (expression[0].text.length === 1) { - wrapper.setAttribute("mathvariant", "normal"); - } - } else { - wrapper = new mathMLTree.MathNode("mrow", expression); - } - - if (!group.parentIsSupSub) { - // Append an . - // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4 - const operator = new mathMLTree.MathNode("mo", [makeText("\u2061", "text")]); - const fragment = [wrapper, operator]; - if (group.needsLeadingSpace) { - // LaTeX gives operator spacing, but a gets ord spacing. - // So add a leading space. - const space = new mathMLTree.MathNode("mspace"); - space.setAttribute("width", "0.1667em"); // thin space. - fragment.unshift(space); - } - if (!group.isFollowedByDelimiter) { - const trail = new mathMLTree.MathNode("mspace"); - trail.setAttribute("width", "0.1667em"); // thin space. - fragment.push(trail); - } - return mathMLTree.newDocumentFragment(fragment) - } - - return wrapper -}; - -// \operatorname -// amsopn.dtx: \mathop{#1\kern\z@\operator@font#3}\newmcodes@ -defineFunction({ - type: "operatorname", - names: ["\\operatorname@", "\\operatornamewithlimits"], - props: { - numArgs: 1, - allowedInArgument: true - }, - handler: ({ parser, funcName }, args) => { - const body = args[0]; - const prevAtomType = parser.prevAtomType; - const next = parser.gullet.future().text; - return { - type: "operatorname", - mode: parser.mode, - body: ordargument(body), - alwaysHandleSupSub: (funcName === "\\operatornamewithlimits"), - limits: false, - parentIsSupSub: false, - isFollowedByDelimiter: isDelimiter(next), - needsLeadingSpace: prevAtomType.length > 0 && ordTypes.includes(prevAtomType) - }; - }, - mathmlBuilder: mathmlBuilder$1 -}); - -defineMacro("\\operatorname", - "\\@ifstar\\operatornamewithlimits\\operatorname@"); - -defineFunctionBuilders({ - type: "ordgroup", - mathmlBuilder(group, style) { - return buildExpressionRow(group.body, style, group.semisimple); - } -}); - -defineFunction({ - type: "phantom", - names: ["\\phantom"], - props: { - numArgs: 1, - allowedInText: true - }, - handler: ({ parser }, args) => { - const body = args[0]; - return { - type: "phantom", - mode: parser.mode, - body: ordargument(body) - }; - }, - mathmlBuilder: (group, style) => { - const inner = buildExpression(group.body, style); - return new mathMLTree.MathNode("mphantom", inner); - } -}); - -defineFunction({ - type: "hphantom", - names: ["\\hphantom"], - props: { - numArgs: 1, - allowedInText: true - }, - handler: ({ parser }, args) => { - const body = args[0]; - return { - type: "hphantom", - mode: parser.mode, - body - }; - }, - mathmlBuilder: (group, style) => { - const inner = buildExpression(ordargument(group.body), style); - const phantom = new mathMLTree.MathNode("mphantom", inner); - const node = new mathMLTree.MathNode("mpadded", [phantom]); - node.setAttribute("height", "0px"); - node.setAttribute("depth", "0px"); - return node; - } -}); - -defineFunction({ - type: "vphantom", - names: ["\\vphantom"], - props: { - numArgs: 1, - allowedInText: true - }, - handler: ({ parser }, args) => { - const body = args[0]; - return { - type: "vphantom", - mode: parser.mode, - body - }; - }, - mathmlBuilder: (group, style) => { - const inner = buildExpression(ordargument(group.body), style); - const phantom = new mathMLTree.MathNode("mphantom", inner); - const node = new mathMLTree.MathNode("mpadded", [phantom]); - node.setAttribute("width", "0px"); - return node; - } -}); - -// In LaTeX, \pmb is a simulation of bold font. -// The version of \pmb in ambsy.sty works by typesetting three copies of the argument -// with small offsets. We use CSS font-weight:bold. - -defineFunction({ - type: "pmb", - names: ["\\pmb"], - props: { - numArgs: 1, - allowedInText: true - }, - handler({ parser }, args) { - return { - type: "pmb", - mode: parser.mode, - body: ordargument(args[0]) - } - }, - mathmlBuilder(group, style) { - const inner = buildExpression(group.body, style); - // Wrap with an element. - const node = wrapWithMstyle(inner); - node.setAttribute("style", "font-weight:bold"); - return node - } -}); - -// \raise, \lower, and \raisebox - -const mathmlBuilder = (group, style) => { - const newStyle = style.withLevel(StyleLevel.TEXT); - const node = new mathMLTree.MathNode("mpadded", [buildGroup$1(group.body, newStyle)]); - const dy = calculateSize(group.dy, style); - node.setAttribute("voffset", dy.number + dy.unit); - // Add padding, which acts to increase height in Chromium. - // TODO: Figure out some way to change height in Firefox w/o breaking Chromium. - if (dy.number > 0) { - node.style.padding = dy.number + dy.unit + " 0 0 0"; - } else { - node.style.padding = "0 0 " + Math.abs(dy.number) + dy.unit + " 0"; - } - return node -}; - -defineFunction({ - type: "raise", - names: ["\\raise", "\\lower"], - props: { - numArgs: 2, - argTypes: ["size", "primitive"], - primitive: true - }, - handler({ parser, funcName }, args) { - const amount = assertNodeType(args[0], "size").value; - if (funcName === "\\lower") { amount.number *= -1; } - const body = args[1]; - return { - type: "raise", - mode: parser.mode, - dy: amount, - body - }; - }, - mathmlBuilder -}); - - -defineFunction({ - type: "raise", - names: ["\\raisebox"], - props: { - numArgs: 2, - argTypes: ["size", "hbox"], - allowedInText: true - }, - handler({ parser, funcName }, args) { - const amount = assertNodeType(args[0], "size").value; - const body = args[1]; - return { - type: "raise", - mode: parser.mode, - dy: amount, - body - }; - }, - mathmlBuilder -}); - -defineFunction({ - type: "ref", - names: ["\\ref", "\\eqref"], - props: { - numArgs: 1, - argTypes: ["raw"] - }, - handler({ parser, funcName }, args) { - return { - type: "ref", - mode: parser.mode, - funcName, - string: args[0].string.replace(invalidIdRegEx, "") - }; - }, - mathmlBuilder(group, style) { - // Create an empty text node. Set a class and an href. - // The post-processor will populate with the target's tag or equation number. - const classes = group.funcName === "\\ref" ? ["tml-ref"] : ["tml-ref", "tml-eqref"]; - const node = new mathMLTree.MathNode("mtext", [new mathMLTree.TextNode("")], classes); - node.setAttribute("href", "#" + group.string); - return node - } -}); - -defineFunction({ - type: "reflect", - names: ["\\reflectbox"], - props: { - numArgs: 1, - argTypes: ["hbox"], - allowedInText: true - }, - handler({ parser }, args) { - return { - type: "reflect", - mode: parser.mode, - body: args[0] - }; - }, - mathmlBuilder(group, style) { - const node = buildGroup$1(group.body, style); - node.style.transform = "scaleX(-1)"; - return node - } -}); - -defineFunction({ - type: "internal", - names: ["\\relax"], - props: { - numArgs: 0, - allowedInText: true - }, - handler({ parser }) { - return { - type: "internal", - mode: parser.mode - }; - } -}); - -defineFunction({ - type: "rule", - names: ["\\rule"], - props: { - numArgs: 2, - numOptionalArgs: 1, - argTypes: ["size", "size", "size"] - }, - handler({ parser }, args, optArgs) { - const shift = optArgs[0]; - const width = assertNodeType(args[0], "size"); - const height = assertNodeType(args[1], "size"); - return { - type: "rule", - mode: parser.mode, - shift: shift && assertNodeType(shift, "size").value, - width: width.value, - height: height.value - }; - }, - mathmlBuilder(group, style) { - const width = calculateSize(group.width, style); - const height = calculateSize(group.height, style); - const shift = group.shift - ? calculateSize(group.shift, style) - : { number: 0, unit: "em" }; - const color = (style.color && style.getColor()) || "black"; - - const rule = new mathMLTree.MathNode("mspace"); - if (width.number > 0 && height.number > 0) { - rule.setAttribute("mathbackground", color); - } - rule.setAttribute("width", width.number + width.unit); - rule.setAttribute("height", height.number + height.unit); - if (shift.number === 0) { return rule } - - const wrapper = new mathMLTree.MathNode("mpadded", [rule]); - if (shift.number >= 0) { - wrapper.setAttribute("height", "+" + shift.number + shift.unit); - } else { - wrapper.setAttribute("height", shift.number + shift.unit); - wrapper.setAttribute("depth", "+" + -shift.number + shift.unit); - } - wrapper.setAttribute("voffset", shift.number + shift.unit); - return wrapper; - } -}); - -// The size mappings are taken from TeX with \normalsize=10pt. -// We don't have to track script level. MathML does that. -const sizeMap = { - "\\tiny": 0.5, - "\\sixptsize": 0.6, - "\\Tiny": 0.6, - "\\scriptsize": 0.7, - "\\footnotesize": 0.8, - "\\small": 0.9, - "\\normalsize": 1.0, - "\\large": 1.2, - "\\Large": 1.44, - "\\LARGE": 1.728, - "\\huge": 2.074, - "\\Huge": 2.488 -}; - -defineFunction({ - type: "sizing", - names: [ - "\\tiny", - "\\sixptsize", - "\\Tiny", - "\\scriptsize", - "\\footnotesize", - "\\small", - "\\normalsize", - "\\large", - "\\Large", - "\\LARGE", - "\\huge", - "\\Huge" - ], - props: { - numArgs: 0, - allowedInText: true - }, - handler: ({ breakOnTokenText, funcName, parser }, args) => { - if (parser.settings.strict && parser.mode === "math") { - // eslint-disable-next-line no-console - console.log(`Temml strict-mode warning: Command ${funcName} is invalid in math mode.`); - } - const body = parser.parseExpression(false, breakOnTokenText, true); - return { - type: "sizing", - mode: parser.mode, - funcName, - body - }; - }, - mathmlBuilder: (group, style) => { - const newStyle = style.withFontSize(sizeMap[group.funcName]); - const inner = buildExpression(group.body, newStyle); - // Wrap with an element. - const node = wrapWithMstyle(inner); - const factor = (sizeMap[group.funcName] / style.fontSize).toFixed(4); - node.setAttribute("mathsize", factor + "em"); - return node; - } -}); - -// smash, with optional [tb], as in AMS - -defineFunction({ - type: "smash", - names: ["\\smash"], - props: { - numArgs: 1, - numOptionalArgs: 1, - allowedInText: true - }, - handler: ({ parser }, args, optArgs) => { - let smashHeight = false; - let smashDepth = false; - const tbArg = optArgs[0] && assertNodeType(optArgs[0], "ordgroup"); - if (tbArg) { - // Optional [tb] argument is engaged. - // ref: amsmath: \renewcommand{\smash}[1][tb]{% - // def\mb@t{\ht}\def\mb@b{\dp}\def\mb@tb{\ht\z@\z@\dp}% - let letter = ""; - for (let i = 0; i < tbArg.body.length; ++i) { - const node = tbArg.body[i]; - // TODO: Write an AssertSymbolNode - letter = node.text; - if (letter === "t") { - smashHeight = true; - } else if (letter === "b") { - smashDepth = true; - } else { - smashHeight = false; - smashDepth = false; - break; - } - } - } else { - smashHeight = true; - smashDepth = true; - } - - const body = args[0]; - return { - type: "smash", - mode: parser.mode, - body, - smashHeight, - smashDepth - }; - }, - mathmlBuilder: (group, style) => { - const node = new mathMLTree.MathNode("mpadded", [buildGroup$1(group.body, style)]); - - if (group.smashHeight) { - node.setAttribute("height", "0px"); - } - - if (group.smashDepth) { - node.setAttribute("depth", "0px"); - } - - return node; - } -}); - -defineFunction({ - type: "sqrt", - names: ["\\sqrt"], - props: { - numArgs: 1, - numOptionalArgs: 1 - }, - handler({ parser }, args, optArgs) { - const index = optArgs[0]; - const body = args[0]; - return { - type: "sqrt", - mode: parser.mode, - body, - index - }; - }, - mathmlBuilder(group, style) { - const { body, index } = group; - return index - ? new mathMLTree.MathNode("mroot", [ - buildGroup$1(body, style), - buildGroup$1(index, style.incrementLevel()) - ]) - : new mathMLTree.MathNode("msqrt", [buildGroup$1(body, style)]); - } -}); - -const styleMap = { - display: 0, - text: 1, - script: 2, - scriptscript: 3 -}; - -const styleAttributes = { - display: ["0", "true"], - text: ["0", "false"], - script: ["1", "false"], - scriptscript: ["2", "false"] -}; - -defineFunction({ - type: "styling", - names: ["\\displaystyle", "\\textstyle", "\\scriptstyle", "\\scriptscriptstyle"], - props: { - numArgs: 0, - allowedInText: true, - primitive: true - }, - handler({ breakOnTokenText, funcName, parser }, args) { - // parse out the implicit body - const body = parser.parseExpression(true, breakOnTokenText, true); - - const scriptLevel = funcName.slice(1, funcName.length - 5); - return { - type: "styling", - mode: parser.mode, - // Figure out what scriptLevel to use by pulling out the scriptLevel from - // the function name - scriptLevel, - body - }; - }, - mathmlBuilder(group, style) { - // Figure out what scriptLevel we're changing to. - const newStyle = style.withLevel(styleMap[group.scriptLevel]); - // The style argument in the next line does NOT directly set a MathML script level. - // It just tracks the style level, in case we need to know it for supsub or mathchoice. - const inner = buildExpression(group.body, newStyle); - // Wrap with an element. - const node = wrapWithMstyle(inner); - - const attr = styleAttributes[group.scriptLevel]; - - // Here is where we set the MathML script level. - node.setAttribute("scriptlevel", attr[0]); - node.setAttribute("displaystyle", attr[1]); - - return node; - } -}); - -/** - * Sometimes, groups perform special rules when they have superscripts or - * subscripts attached to them. This function lets the `supsub` group know that - * Sometimes, groups perform special rules when they have superscripts or - * its inner element should handle the superscripts and subscripts instead of - * handling them itself. - */ - -// Helpers -const symbolRegEx = /^m(over|under|underover)$/; - -// Super scripts and subscripts, whose precise placement can depend on other -// functions that precede them. -defineFunctionBuilders({ - type: "supsub", - mathmlBuilder(group, style) { - // Is the inner group a relevant horizonal brace? - let isBrace = false; - let isOver; - let isSup; - let appendApplyFunction = false; - let appendSpace = false; - let needsLeadingSpace = false; - - if (group.base && group.base.type === "horizBrace") { - isSup = !!group.sup; - if (isSup === group.base.isOver) { - isBrace = true; - isOver = group.base.isOver; - } - } - - if (group.base && !group.base.stack && - (group.base.type === "op" || group.base.type === "operatorname")) { - group.base.parentIsSupSub = true; - appendApplyFunction = !group.base.symbol; - appendSpace = appendApplyFunction && !group.isFollowedByDelimiter; - needsLeadingSpace = group.base.needsLeadingSpace; - } - - const children = group.base && group.base.stack - ? [buildGroup$1(group.base.body[0], style)] - : [buildGroup$1(group.base, style)]; - - const childStyle = style.inSubOrSup(); - if (group.sub) { - children.push(buildGroup$1(group.sub, childStyle)); - } - - if (group.sup) { - const sup = buildGroup$1(group.sup, childStyle); - const testNode = sup.type === "mrow" ? sup.children[0] : sup; - if ((testNode.type === "mo" && testNode.classes.includes("tml-prime")) - && group.base && group.base.text && group.base.text === "f") { - // Chromium does not address italic correction on prime. Prevent f′ from overlapping. - testNode.classes.push("prime-pad"); - } - children.push(sup); - } - - let nodeType; - if (isBrace) { - nodeType = isOver ? "mover" : "munder"; - } else if (!group.sub) { - const base = group.base; - if ( - base && - base.type === "op" && - base.limits && - (style.level === StyleLevel.DISPLAY || base.alwaysHandleSupSub) - ) { - nodeType = "mover"; - } else if ( - base && - base.type === "operatorname" && - base.alwaysHandleSupSub && - (base.limits || style.level === StyleLevel.DISPLAY) - ) { - nodeType = "mover"; - } else { - nodeType = "msup"; - } - } else if (!group.sup) { - const base = group.base; - if ( - base && - base.type === "op" && - base.limits && - (style.level === StyleLevel.DISPLAY || base.alwaysHandleSupSub) - ) { - nodeType = "munder"; - } else if ( - base && - base.type === "operatorname" && - base.alwaysHandleSupSub && - (base.limits || style.level === StyleLevel.DISPLAY) - ) { - nodeType = "munder"; - } else { - nodeType = "msub"; - } - } else { - const base = group.base; - if (base && ((base.type === "op" && base.limits) || base.type === "multiscript") && - (style.level === StyleLevel.DISPLAY || base.alwaysHandleSupSub) - ) { - nodeType = "munderover"; - } else if ( - base && - base.type === "operatorname" && - base.alwaysHandleSupSub && - (style.level === StyleLevel.DISPLAY || base.limits) - ) { - nodeType = "munderover"; - } else { - nodeType = "msubsup"; - } - } - - let node = new mathMLTree.MathNode(nodeType, children); - if (appendApplyFunction) { - // Append an . - // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4 - const operator = new mathMLTree.MathNode("mo", [makeText("\u2061", "text")]); - if (needsLeadingSpace) { - const space = new mathMLTree.MathNode("mspace"); - space.setAttribute("width", "0.1667em"); // thin space. - node = mathMLTree.newDocumentFragment([space, node, operator]); - } else { - node = mathMLTree.newDocumentFragment([node, operator]); - } - if (appendSpace) { - const space = new mathMLTree.MathNode("mspace"); - space.setAttribute("width", "0.1667em"); // thin space. - node.children.push(space); - } - } else if (symbolRegEx.test(nodeType)) { - // Wrap in a . Otherwise Firefox stretchy parens will not stretch to include limits. - node = new mathMLTree.MathNode("mrow", [node]); - } - - return node - } -}); - -// Operator ParseNodes created in Parser.js from symbol Groups in src/symbols.js. - -const short = ["\\shortmid", "\\nshortmid", "\\shortparallel", - "\\nshortparallel", "\\smallsetminus"]; - -const arrows = ["\\Rsh", "\\Lsh", "\\restriction"]; - -const isArrow = str => { - if (str.length === 1) { - const codePoint = str.codePointAt(0); - return (0x218f < codePoint && codePoint < 0x2200) - } - return str.indexOf("arrow") > -1 || str.indexOf("harpoon") > -1 || arrows.includes(str) -}; - -defineFunctionBuilders({ - type: "atom", - mathmlBuilder(group, style) { - const node = new mathMLTree.MathNode("mo", [makeText(group.text, group.mode)]); - if (group.family === "punct") { - node.setAttribute("separator", "true"); - } else if (group.family === "open" || group.family === "close") { - // Delims built here should not stretch vertically. - // See delimsizing.js for stretchy delims. - if (group.family === "open") { - node.setAttribute("form", "prefix"); - // Set an explicit attribute for stretch. Otherwise Firefox may do it wrong. - node.setAttribute("stretchy", "false"); - } else if (group.family === "close") { - node.setAttribute("form", "postfix"); - node.setAttribute("stretchy", "false"); - } - } else if (group.text === "\\mid") { - // Firefox messes up this spacing if at the end of an . See it explicitly. - node.setAttribute("lspace", "0.22em"); // medium space - node.setAttribute("rspace", "0.22em"); - node.setAttribute("stretchy", "false"); - } else if (group.family === "rel" && isArrow(group.text)) { - node.setAttribute("stretchy", "false"); - } else if (short.includes(group.text)) { - node.setAttribute("mathsize", "70%"); - } else if (group.text === ":") { - // ":" is not in the MathML operator dictionary. Give it BIN spacing. - node.attributes.lspace = "0.2222em"; - node.attributes.rspace = "0.2222em"; - } - return node; - } -}); - -/** - * Maps TeX font commands to "mathvariant" attribute in buildMathML.js - */ -const fontMap = { - // styles - mathbf: "bold", - mathrm: "normal", - textit: "italic", - mathit: "italic", - mathnormal: "italic", - - // families - mathbb: "double-struck", - mathcal: "script", - mathfrak: "fraktur", - mathscr: "script", - mathsf: "sans-serif", - mathtt: "monospace" -}; - -/** - * Returns the math variant as a string or null if none is required. - */ -const getVariant = function(group, style) { - // Handle font specifiers as best we can. - // Chromium does not support the MathML mathvariant attribute. - // So we'll use Unicode replacement characters instead. - // But first, determine the math variant. - - // Deal with the \textit, \textbf, etc., functions. - if (style.fontFamily === "texttt") { - return "monospace" - } else if (style.fontFamily === "textsc") { - return "normal"; // handled via character substitution in symbolsOrd.js. - } else if (style.fontFamily === "textsf") { - if (style.fontShape === "textit" && style.fontWeight === "textbf") { - return "sans-serif-bold-italic" - } else if (style.fontShape === "textit") { - return "sans-serif-italic" - } else if (style.fontWeight === "textbf") { - return "sans-serif-bold" - } else { - return "sans-serif" - } - } else if (style.fontShape === "textit" && style.fontWeight === "textbf") { - return "bold-italic" - } else if (style.fontShape === "textit") { - return "italic" - } else if (style.fontWeight === "textbf") { - return "bold" - } - - // Deal with the \mathit, mathbf, etc, functions. - const font = style.font; - if (!font || font === "mathnormal") { - return null - } - - const mode = group.mode; - switch (font) { - case "mathit": - return "italic" - case "mathrm": { - const codePoint = group.text.codePointAt(0); - // LaTeX \mathrm returns italic for Greek characters. - return (0x03ab < codePoint && codePoint < 0x03cf) ? "italic" : "normal" - } - case "greekItalic": - return "italic" - case "up@greek": - return "normal" - case "boldsymbol": - case "mathboldsymbol": - return "bold-italic" - case "mathbf": - return "bold" - case "mathbb": - return "double-struck" - case "mathfrak": - return "fraktur" - case "mathscr": - case "mathcal": - return "script" - case "mathsf": - return "sans-serif" - case "mathtt": - return "monospace" - } - - let text = group.text; - if (symbols[mode][text] && symbols[mode][text].replace) { - text = symbols[mode][text].replace; - } - - return Object.prototype.hasOwnProperty.call(fontMap, font) ? fontMap[font] : null -}; - -// Chromium does not support the MathML `mathvariant` attribute. -// Instead, we replace ASCII characters with Unicode characters that -// are defined in the font as bold, italic, double-struck, etc. -// This module identifies those Unicode code points. - -// First, a few helpers. -const script = Object.freeze({ - B: 0x20EA, // Offset from ASCII B to Unicode script B - E: 0x20EB, - F: 0x20EB, - H: 0x20C3, - I: 0x20C7, - L: 0x20C6, - M: 0x20E6, - R: 0x20C9, - e: 0x20CA, - g: 0x20A3, - o: 0x20C5 -}); - -const frak = Object.freeze({ - C: 0x20EA, - H: 0x20C4, - I: 0x20C8, - R: 0x20CA, - Z: 0x20CE -}); - -const bbb = Object.freeze({ - C: 0x20BF, // blackboard bold - H: 0x20C5, - N: 0x20C7, - P: 0x20C9, - Q: 0x20C9, - R: 0x20CB, - Z: 0x20CA -}); - -const bold = Object.freeze({ - "\u03f5": 0x1D2E7, // lunate epsilon - "\u03d1": 0x1D30C, // vartheta - "\u03f0": 0x1D2EE, // varkappa - "\u03c6": 0x1D319, // varphi - "\u03f1": 0x1D2EF, // varrho - "\u03d6": 0x1D30B // varpi -}); - -const boldItalic = Object.freeze({ - "\u03f5": 0x1D35B, // lunate epsilon - "\u03d1": 0x1D380, // vartheta - "\u03f0": 0x1D362, // varkappa - "\u03c6": 0x1D38D, // varphi - "\u03f1": 0x1D363, // varrho - "\u03d6": 0x1D37F // varpi -}); - -const boldsf = Object.freeze({ - "\u03f5": 0x1D395, // lunate epsilon - "\u03d1": 0x1D3BA, // vartheta - "\u03f0": 0x1D39C, // varkappa - "\u03c6": 0x1D3C7, // varphi - "\u03f1": 0x1D39D, // varrho - "\u03d6": 0x1D3B9 // varpi -}); - -const bisf = Object.freeze({ - "\u03f5": 0x1D3CF, // lunate epsilon - "\u03d1": 0x1D3F4, // vartheta - "\u03f0": 0x1D3D6, // varkappa - "\u03c6": 0x1D401, // varphi - "\u03f1": 0x1D3D7, // varrho - "\u03d6": 0x1D3F3 // varpi -}); - -// Code point offsets below are derived from https://www.unicode.org/charts/PDF/U1D400.pdf -const offset = Object.freeze({ - upperCaseLatin: { // A-Z - "normal": ch => { return 0 }, - "bold": ch => { return 0x1D3BF }, - "italic": ch => { return 0x1D3F3 }, - "bold-italic": ch => { return 0x1D427 }, - "script": ch => { return script[ch] || 0x1D45B }, - "script-bold": ch => { return 0x1D48F }, - "fraktur": ch => { return frak[ch] || 0x1D4C3 }, - "fraktur-bold": ch => { return 0x1D52B }, - "double-struck": ch => { return bbb[ch] || 0x1D4F7 }, - "sans-serif": ch => { return 0x1D55F }, - "sans-serif-bold": ch => { return 0x1D593 }, - "sans-serif-italic": ch => { return 0x1D5C7 }, - "sans-serif-bold-italic": ch => { return 0x1D63C }, - "monospace": ch => { return 0x1D62F } - }, - lowerCaseLatin: { // a-z - "normal": ch => { return 0 }, - "bold": ch => { return 0x1D3B9 }, - "italic": ch => { return ch === "h" ? 0x20A6 : 0x1D3ED }, - "bold-italic": ch => { return 0x1D421 }, - "script": ch => { return script[ch] || 0x1D455 }, - "script-bold": ch => { return 0x1D489 }, - "fraktur": ch => { return 0x1D4BD }, - "fraktur-bold": ch => { return 0x1D525 }, - "double-struck": ch => { return 0x1D4F1 }, - "sans-serif": ch => { return 0x1D559 }, - "sans-serif-bold": ch => { return 0x1D58D }, - "sans-serif-italic": ch => { return 0x1D5C1 }, - "sans-serif-bold-italic": ch => { return 0x1D5F5 }, - "monospace": ch => { return 0x1D629 } - }, - upperCaseGreek: { // A-Ω - "normal": ch => { return 0 }, - "bold": ch => { return 0x1D317 }, - "italic": ch => { return 0x1D351 }, - // \boldsymbol actually returns upright bold for upperCaseGreek - "bold-italic": ch => { return 0x1D317 }, - "script": ch => { return 0 }, - "script-bold": ch => { return 0 }, - "fraktur": ch => { return 0 }, - "fraktur-bold": ch => { return 0 }, - "double-struck": ch => { return 0 }, - // Unicode has no code points for regular-weight san-serif Greek. Use bold. - "sans-serif": ch => { return 0x1D3C5 }, - "sans-serif-bold": ch => { return 0x1D3C5 }, - "sans-serif-italic": ch => { return 0 }, - "sans-serif-bold-italic": ch => { return 0x1D3FF }, - "monospace": ch => { return 0 } - }, - lowerCaseGreek: { // α-ω - "normal": ch => { return 0 }, - "bold": ch => { return 0x1D311 }, - "italic": ch => { return 0x1D34B }, - "bold-italic": ch => { return ch === "\u03d5" ? 0x1D37E : 0x1D385 }, - "script": ch => { return 0 }, - "script-bold": ch => { return 0 }, - "fraktur": ch => { return 0 }, - "fraktur-bold": ch => { return 0 }, - "double-struck": ch => { return 0 }, - // Unicode has no code points for regular-weight san-serif Greek. Use bold. - "sans-serif": ch => { return 0x1D3BF }, - "sans-serif-bold": ch => { return 0x1D3BF }, - "sans-serif-italic": ch => { return 0 }, - "sans-serif-bold-italic": ch => { return 0x1D3F9 }, - "monospace": ch => { return 0 } - }, - varGreek: { // \varGamma, etc - "normal": ch => { return 0 }, - "bold": ch => { return bold[ch] || -51 }, - "italic": ch => { return 0 }, - "bold-italic": ch => { return boldItalic[ch] || 0x3A }, - "script": ch => { return 0 }, - "script-bold": ch => { return 0 }, - "fraktur": ch => { return 0 }, - "fraktur-bold": ch => { return 0 }, - "double-struck": ch => { return 0 }, - "sans-serif": ch => { return boldsf[ch] || 0x74 }, - "sans-serif-bold": ch => { return boldsf[ch] || 0x74 }, - "sans-serif-italic": ch => { return 0 }, - "sans-serif-bold-italic": ch => { return bisf[ch] || 0xAE }, - "monospace": ch => { return 0 } - }, - numeral: { // 0-9 - "normal": ch => { return 0 }, - "bold": ch => { return 0x1D79E }, - "italic": ch => { return 0 }, - "bold-italic": ch => { return 0 }, - "script": ch => { return 0 }, - "script-bold": ch => { return 0 }, - "fraktur": ch => { return 0 }, - "fraktur-bold": ch => { return 0 }, - "double-struck": ch => { return 0x1D7A8 }, - "sans-serif": ch => { return 0x1D7B2 }, - "sans-serif-bold": ch => { return 0x1D7BC }, - "sans-serif-italic": ch => { return 0 }, - "sans-serif-bold-italic": ch => { return 0 }, - "monospace": ch => { return 0x1D7C6 } - } -}); - -const variantChar = (ch, variant) => { - const codePoint = ch.codePointAt(0); - const block = 0x40 < codePoint && codePoint < 0x5b - ? "upperCaseLatin" - : 0x60 < codePoint && codePoint < 0x7b - ? "lowerCaseLatin" - : (0x390 < codePoint && codePoint < 0x3AA) - ? "upperCaseGreek" - : 0x3B0 < codePoint && codePoint < 0x3CA || ch === "\u03d5" - ? "lowerCaseGreek" - : 0x1D6E1 < codePoint && codePoint < 0x1D6FC || bold[ch] - ? "varGreek" - : (0x2F < codePoint && codePoint < 0x3A) - ? "numeral" - : "other"; - return block === "other" - ? ch - : String.fromCodePoint(codePoint + offset[block][variant](ch)) -}; - -const smallCaps = Object.freeze({ - a: "ᴀ", - b: "ʙ", - c: "ᴄ", - d: "ᴅ", - e: "ᴇ", - f: "ꜰ", - g: "ɢ", - h: "ʜ", - i: "ɪ", - j: "ᴊ", - k: "ᴋ", - l: "ʟ", - m: "ᴍ", - n: "ɴ", - o: "ᴏ", - p: "ᴘ", - q: "ǫ", - r: "ʀ", - s: "s", - t: "ᴛ", - u: "ᴜ", - v: "ᴠ", - w: "ᴡ", - x: "x", - y: "ʏ", - z: "ᴢ" -}); - -// "mathord" and "textord" ParseNodes created in Parser.js from symbol Groups in -// src/symbols.js. - -const numberRegEx = /^\d(?:[\d,.]*\d)?$/; -const latinRegEx = /[A-Ba-z]/; -const primes = new Set(["\\prime", "\\dprime", "\\trprime", "\\qprime", - "\\backprime", "\\backdprime", "\\backtrprime"]); - -const italicNumber = (text, variant, tag) => { - const mn = new mathMLTree.MathNode(tag, [text]); - const wrapper = new mathMLTree.MathNode("mstyle", [mn]); - wrapper.style["font-style"] = "italic"; - wrapper.style["font-family"] = "Cambria, 'Times New Roman', serif"; - if (variant === "bold-italic") { wrapper.style["font-weight"] = "bold"; } - return wrapper -}; - -defineFunctionBuilders({ - type: "mathord", - mathmlBuilder(group, style) { - const text = makeText(group.text, group.mode, style); - const codePoint = text.text.codePointAt(0); - // Test for upper-case Greek - const defaultVariant = (0x0390 < codePoint && codePoint < 0x03aa) ? "normal" : "italic"; - const variant = getVariant(group, style) || defaultVariant; - if (variant === "script") { - text.text = variantChar(text.text, variant); - return new mathMLTree.MathNode("mi", [text], [style.font]) - } else if (variant !== "italic") { - text.text = variantChar(text.text, variant); - } - let node = new mathMLTree.MathNode("mi", [text]); - // TODO: Handle U+1D49C - U+1D4CF per https://www.unicode.org/charts/PDF/U1D400.pdf - if (variant === "normal") { - node.setAttribute("mathvariant", "normal"); - if (text.text.length === 1) { - // A Firefox bug will apply spacing here, but there should be none. Fix it. - node = new mathMLTree.MathNode("mrow", [node]); - } - } - return node - } -}); - -defineFunctionBuilders({ - type: "textord", - mathmlBuilder(group, style) { - let ch = group.text; - const codePoint = ch.codePointAt(0); - if (style.fontFamily === "textsc") { - // Convert small latin letters to small caps. - if (96 < codePoint && codePoint < 123) { - ch = smallCaps[ch]; - } - } - const text = makeText(ch, group.mode, style); - const variant = getVariant(group, style) || "normal"; - - let node; - if (numberRegEx.test(group.text)) { - const tag = group.mode === "text" ? "mtext" : "mn"; - if (variant === "italic" || variant === "bold-italic") { - return italicNumber(text, variant, tag) - } else { - if (variant !== "normal") { - text.text = text.text.split("").map(c => variantChar(c, variant)).join(""); - } - node = new mathMLTree.MathNode(tag, [text]); - } - } else if (group.mode === "text") { - if (variant !== "normal") { - text.text = variantChar(text.text, variant); - } - node = new mathMLTree.MathNode("mtext", [text]); - } else if (primes.has(group.text)) { - node = new mathMLTree.MathNode("mo", [text]); - // TODO: If/when Chromium uses ssty variant for prime, remove the next line. - node.classes.push("tml-prime"); - } else { - const origText = text.text; - if (variant !== "italic") { - text.text = variantChar(text.text, variant); - } - node = new mathMLTree.MathNode("mi", [text]); - if (text.text === origText && latinRegEx.test(origText)) { - node.setAttribute("mathvariant", "italic"); - } - } - return node - } -}); - -// A map of CSS-based spacing functions to their CSS class. -const cssSpace = { - "\\nobreak": "nobreak", - "\\allowbreak": "allowbreak" -}; - -// A lookup table to determine whether a spacing function/symbol should be -// treated like a regular space character. If a symbol or command is a key -// in this table, then it should be a regular space character. Furthermore, -// the associated value may have a `className` specifying an extra CSS class -// to add to the created `span`. -const regularSpace = { - " ": {}, - "\\ ": {}, - "~": { - className: "nobreak" - }, - "\\space": {}, - "\\nobreakspace": { - className: "nobreak" - } -}; - -// ParseNode<"spacing"> created in Parser.js from the "spacing" symbol Groups in -// src/symbols.js. -defineFunctionBuilders({ - type: "spacing", - mathmlBuilder(group, style) { - let node; - - if (Object.prototype.hasOwnProperty.call(regularSpace, group.text)) { - // Firefox does not render a space in a . So write a no-break space. - // TODO: If Firefox fixes that bug, uncomment the next line and write ch into the node. - //const ch = (regularSpace[group.text].className === "nobreak") ? "\u00a0" : " " - node = new mathMLTree.MathNode("mtext", [new mathMLTree.TextNode("\u00a0")]); - } else if (Object.prototype.hasOwnProperty.call(cssSpace, group.text)) { - // MathML 3.0 calls for nobreak to occur in an , not an - // Ref: https://www.w3.org/Math/draft-spec/mathml.html#chapter3_presm.lbattrs - node = new mathMLTree.MathNode("mo"); - if (group.text === "\\nobreak") { - node.setAttribute("linebreak", "nobreak"); - } - } else { - throw new ParseError(`Unknown type of space "${group.text}"`) - } - - return node - } -}); - -defineFunctionBuilders({ - type: "tag" -}); - -// For a \tag, the work usually done in a mathmlBuilder is instead done in buildMathML.js. -// That way, a \tag can be pulled out of the parse tree and wrapped around the outer node. - -// Non-mathy text, possibly in a font -const textFontFamilies = { - "\\text": undefined, - "\\textrm": "textrm", - "\\textsf": "textsf", - "\\texttt": "texttt", - "\\textnormal": "textrm", - "\\textsc": "textsc" // small caps -}; - -const textFontWeights = { - "\\textbf": "textbf", - "\\textmd": "textmd" -}; - -const textFontShapes = { - "\\textit": "textit", - "\\textup": "textup" -}; - -const styleWithFont = (group, style) => { - const font = group.font; - // Checks if the argument is a font family or a font style. - if (!font) { - return style; - } else if (textFontFamilies[font]) { - return style.withTextFontFamily(textFontFamilies[font]); - } else if (textFontWeights[font]) { - return style.withTextFontWeight(textFontWeights[font]); - } else { - return style.withTextFontShape(textFontShapes[font]); - } -}; - -defineFunction({ - type: "text", - names: [ - // Font families - "\\text", - "\\textrm", - "\\textsf", - "\\texttt", - "\\textnormal", - "\\textsc", - // Font weights - "\\textbf", - "\\textmd", - // Font Shapes - "\\textit", - "\\textup" - ], - props: { - numArgs: 1, - argTypes: ["text"], - allowedInArgument: true, - allowedInText: true - }, - handler({ parser, funcName }, args) { - const body = args[0]; - return { - type: "text", - mode: parser.mode, - body: ordargument(body), - font: funcName - }; - }, - mathmlBuilder(group, style) { - const newStyle = styleWithFont(group, style); - const mrow = buildExpressionRow(group.body, newStyle); - return consolidateText(mrow) - } -}); - -defineFunction({ - type: "verb", - names: ["\\verb"], - props: { - numArgs: 0, - allowedInText: true - }, - handler(context, args, optArgs) { - // \verb and \verb* are dealt with directly in Parser.js. - // If we end up here, it's because of a failure to match the two delimiters - // in the regex in Lexer.js. LaTeX raises the following error when \verb is - // terminated by end of line (or file). - throw new ParseError("\\verb ended by end of line instead of matching delimiter"); - }, - mathmlBuilder(group, style) { - const text = new mathMLTree.TextNode(makeVerb(group)); - const node = new mathMLTree.MathNode("mtext", [text]); - node.setAttribute("mathvariant", "monospace"); - return node; - } -}); - -/** - * Converts verb group into body string. - * - * \verb* replaces each space with an open box \u2423 - * \verb replaces each space with a no-break space \xA0 - */ -const makeVerb = (group) => group.body.replace(/ /g, group.star ? "\u2423" : "\xA0"); - -/** Include this to ensure that all functions are defined. */ - -const functions = _functions; - -/** - * Lexing or parsing positional information for error reporting. - * This object is immutable. - */ -class SourceLocation { - constructor(lexer, start, end) { - this.lexer = lexer; // Lexer holding the input string. - this.start = start; // Start offset, zero-based inclusive. - this.end = end; // End offset, zero-based exclusive. - } - - /** - * Merges two `SourceLocation`s from location providers, given they are - * provided in order of appearance. - * - Returns the first one's location if only the first is provided. - * - Returns a merged range of the first and the last if both are provided - * and their lexers match. - * - Otherwise, returns null. - */ - static range(first, second) { - if (!second) { - return first && first.loc; - } else if (!first || !first.loc || !second.loc || first.loc.lexer !== second.loc.lexer) { - return null; - } else { - return new SourceLocation(first.loc.lexer, first.loc.start, second.loc.end); - } - } -} - -/** - * Interface required to break circular dependency between Token, Lexer, and - * ParseError. - */ - -/** - * The resulting token returned from `lex`. - * - * It consists of the token text plus some position information. - * The position information is essentially a range in an input string, - * but instead of referencing the bare input string, we refer to the lexer. - * That way it is possible to attach extra metadata to the input string, - * like for example a file name or similar. - * - * The position information is optional, so it is OK to construct synthetic - * tokens if appropriate. Not providing available position information may - * lead to degraded error reporting, though. - */ -class Token { - constructor( - text, // the text of this token - loc - ) { - this.text = text; - this.loc = loc; - } - - /** - * Given a pair of tokens (this and endToken), compute a `Token` encompassing - * the whole input range enclosed by these two. - */ - range( - endToken, // last token of the range, inclusive - text // the text of the newly constructed token - ) { - return new Token(text, SourceLocation.range(this, endToken)); - } -} - -/** - * The Lexer class handles tokenizing the input in various ways. Since our - * parser expects us to be able to backtrack, the lexer allows lexing from any - * given starting point. - * - * Its main exposed function is the `lex` function, which takes a position to - * lex from and a type of token to lex. It defers to the appropriate `_innerLex` - * function. - * - * The various `_innerLex` functions perform the actual lexing of different - * kinds. - */ - -/* The following tokenRegex - * - matches typical whitespace (but not NBSP etc.) using its first two groups - * - does not match any control character \x00-\x1f except whitespace - * - does not match a bare backslash - * - matches any ASCII character except those just mentioned - * - does not match the BMP private use area \uE000-\uF8FF - * - does not match bare surrogate code units - * - matches any BMP character except for those just described - * - matches any valid Unicode surrogate pair - * - mathches numerals - * - matches a backslash followed by one or more whitespace characters - * - matches a backslash followed by one or more letters then whitespace - * - matches a backslash followed by any BMP character - * Capturing groups: - * [1] regular whitespace - * [2] backslash followed by whitespace - * [3] anything else, which may include: - * [4] left character of \verb* - * [5] left character of \verb - * [6] backslash followed by word, excluding any trailing whitespace - * Just because the Lexer matches something doesn't mean it's valid input: - * If there is no matching function or symbol definition, the Parser will - * still reject the input. - */ -const spaceRegexString = "[ \r\n\t]"; -const controlWordRegexString = "\\\\[a-zA-Z@]+"; -const controlSymbolRegexString = "\\\\[^\uD800-\uDFFF]"; -const controlWordWhitespaceRegexString = `(${controlWordRegexString})${spaceRegexString}*`; -const controlSpaceRegexString = "\\\\(\n|[ \r\t]+\n?)[ \r\t]*"; -const combiningDiacriticalMarkString = "[\u0300-\u036f]"; -const combiningDiacriticalMarksEndRegex = new RegExp(`${combiningDiacriticalMarkString}+$`); -const tokenRegexString = - `(${spaceRegexString}+)|` + // whitespace - `${controlSpaceRegexString}|` + // whitespace - "([!-\\[\\]-\u2027\u202A-\uD7FF\uF900-\uFFFF]" + // single codepoint - `${combiningDiacriticalMarkString}*` + // ...plus accents - "|[\uD800-\uDBFF][\uDC00-\uDFFF]" + // surrogate pair - `${combiningDiacriticalMarkString}*` + // ...plus accents - "|\\\\verb\\*([^]).*?\\4" + // \verb* - "|\\\\verb([^*a-zA-Z]).*?\\5" + // \verb unstarred - `|${controlWordWhitespaceRegexString}` + // \macroName + spaces - `|${controlSymbolRegexString})`; // \\, \', etc. - -/** Main Lexer class */ -class Lexer { - constructor(input, settings) { - // Separate accents from characters - this.input = input; - this.settings = settings; - this.tokenRegex = new RegExp(tokenRegexString, 'g'); - // Category codes. The lexer only supports comment characters (14) for now. - // MacroExpander additionally distinguishes active (13). - this.catcodes = { - "%": 14, // comment character - "~": 13 // active character - }; - } - - setCatcode(char, code) { - this.catcodes[char] = code; - } - - /** - * This function lexes a single token. - */ - lex() { - const input = this.input; - const pos = this.tokenRegex.lastIndex; - if (pos === input.length) { - return new Token("EOF", new SourceLocation(this, pos, pos)); - } - const match = this.tokenRegex.exec(input); - if (match === null || match.index !== pos) { - throw new ParseError( - `Unexpected character: '${input[pos]}'`, - new Token(input[pos], new SourceLocation(this, pos, pos + 1)) - ); - } - const text = match[6] || match[3] || (match[2] ? "\\ " : " "); - - if (this.catcodes[text] === 14) { - // comment character - const nlIndex = input.indexOf("\n", this.tokenRegex.lastIndex); - if (nlIndex === -1) { - this.tokenRegex.lastIndex = input.length; // EOF - if (this.settings.strict) { - throw new ParseError("% comment has no terminating newline; LaTeX would " + - "fail because of commenting the end of math mode") - } - } else { - this.tokenRegex.lastIndex = nlIndex + 1; - } - return this.lex(); - } - - return new Token(text, new SourceLocation(this, pos, this.tokenRegex.lastIndex)); - } -} - -/** - * A `Namespace` refers to a space of nameable things like macros or lengths, - * which can be `set` either globally or local to a nested group, using an - * undo stack similar to how TeX implements this functionality. - * Performance-wise, `get` and local `set` take constant time, while global - * `set` takes time proportional to the depth of group nesting. - */ - -class Namespace { - /** - * Both arguments are optional. The first argument is an object of - * built-in mappings which never change. The second argument is an object - * of initial (global-level) mappings, which will constantly change - * according to any global/top-level `set`s done. - */ - constructor(builtins = {}, globalMacros = {}) { - this.current = globalMacros; - this.builtins = builtins; - this.undefStack = []; - } - - /** - * Start a new nested group, affecting future local `set`s. - */ - beginGroup() { - this.undefStack.push({}); - } - - /** - * End current nested group, restoring values before the group began. - */ - endGroup() { - if (this.undefStack.length === 0) { - throw new ParseError( - "Unbalanced namespace destruction: attempt " + - "to pop global namespace; please report this as a bug" - ); - } - const undefs = this.undefStack.pop(); - for (const undef in undefs) { - if (Object.prototype.hasOwnProperty.call(undefs, undef )) { - if (undefs[undef] === undefined) { - delete this.current[undef]; - } else { - this.current[undef] = undefs[undef]; - } - } - } - } - - /** - * Detect whether `name` has a definition. Equivalent to - * `get(name) != null`. - */ - has(name) { - return Object.prototype.hasOwnProperty.call(this.current, name ) || - Object.prototype.hasOwnProperty.call(this.builtins, name ); - } - - /** - * Get the current value of a name, or `undefined` if there is no value. - * - * Note: Do not use `if (namespace.get(...))` to detect whether a macro - * is defined, as the definition may be the empty string which evaluates - * to `false` in JavaScript. Use `if (namespace.get(...) != null)` or - * `if (namespace.has(...))`. - */ - get(name) { - if (Object.prototype.hasOwnProperty.call(this.current, name )) { - return this.current[name]; - } else { - return this.builtins[name]; - } - } - - /** - * Set the current value of a name, and optionally set it globally too. - * Local set() sets the current value and (when appropriate) adds an undo - * operation to the undo stack. Global set() may change the undo - * operation at every level, so takes time linear in their number. - */ - set(name, value, global = false) { - if (global) { - // Global set is equivalent to setting in all groups. Simulate this - // by destroying any undos currently scheduled for this name, - // and adding an undo with the *new* value (in case it later gets - // locally reset within this environment). - for (let i = 0; i < this.undefStack.length; i++) { - delete this.undefStack[i][name]; - } - if (this.undefStack.length > 0) { - this.undefStack[this.undefStack.length - 1][name] = value; - } - } else { - // Undo this set at end of this group (possibly to `undefined`), - // unless an undo is already in place, in which case that older - // value is the correct one. - const top = this.undefStack[this.undefStack.length - 1]; - if (top && !Object.prototype.hasOwnProperty.call(top, name )) { - top[name] = this.current[name]; - } - } - this.current[name] = value; - } -} - -/** - * Predefined macros for Temml. - * This can be used to define some commands in terms of others. - */ -const macros = _macros; - -////////////////////////////////////////////////////////////////////// -// macro tools - -defineMacro("\\noexpand", function(context) { - // The expansion is the token itself; but that token is interpreted - // as if its meaning were ‘\relax’ if it is a control sequence that - // would ordinarily be expanded by TeX’s expansion rules. - const t = context.popToken(); - if (context.isExpandable(t.text)) { - t.noexpand = true; - t.treatAsRelax = true; - } - return { tokens: [t], numArgs: 0 }; -}); - -defineMacro("\\expandafter", function(context) { - // TeX first reads the token that comes immediately after \expandafter, - // without expanding it; let’s call this token t. Then TeX reads the - // token that comes after t (and possibly more tokens, if that token - // has an argument), replacing it by its expansion. Finally TeX puts - // t back in front of that expansion. - const t = context.popToken(); - context.expandOnce(true); // expand only an expandable token - return { tokens: [t], numArgs: 0 }; -}); - -// LaTeX's \@firstoftwo{#1}{#2} expands to #1, skipping #2 -// TeX source: \long\def\@firstoftwo#1#2{#1} -defineMacro("\\@firstoftwo", function(context) { - const args = context.consumeArgs(2); - return { tokens: args[0], numArgs: 0 }; -}); - -// LaTeX's \@secondoftwo{#1}{#2} expands to #2, skipping #1 -// TeX source: \long\def\@secondoftwo#1#2{#2} -defineMacro("\\@secondoftwo", function(context) { - const args = context.consumeArgs(2); - return { tokens: args[1], numArgs: 0 }; -}); - -// LaTeX's \@ifnextchar{#1}{#2}{#3} looks ahead to the next (unexpanded) -// symbol that isn't a space, consuming any spaces but not consuming the -// first nonspace character. If that nonspace character matches #1, then -// the macro expands to #2; otherwise, it expands to #3. -defineMacro("\\@ifnextchar", function(context) { - const args = context.consumeArgs(3); // symbol, if, else - context.consumeSpaces(); - const nextToken = context.future(); - if (args[0].length === 1 && args[0][0].text === nextToken.text) { - return { tokens: args[1], numArgs: 0 }; - } else { - return { tokens: args[2], numArgs: 0 }; - } -}); - -// LaTeX's \@ifstar{#1}{#2} looks ahead to the next (unexpanded) symbol. -// If it is `*`, then it consumes the symbol, and the macro expands to #1; -// otherwise, the macro expands to #2 (without consuming the symbol). -// TeX source: \def\@ifstar#1{\@ifnextchar *{\@firstoftwo{#1}}} -defineMacro("\\@ifstar", "\\@ifnextchar *{\\@firstoftwo{#1}}"); - -// LaTeX's \TextOrMath{#1}{#2} expands to #1 in text mode, #2 in math mode -defineMacro("\\TextOrMath", function(context) { - const args = context.consumeArgs(2); - if (context.mode === "text") { - return { tokens: args[0], numArgs: 0 }; - } else { - return { tokens: args[1], numArgs: 0 }; - } -}); - -const stringFromArg = arg => { - // Reverse the order of the arg and return a string. - let str = ""; - for (let i = arg.length - 1; i > -1; i--) { - str += arg[i].text; - } - return str -}; - -// Lookup table for parsing numbers in base 8 through 16 -const digitToNumber = { - 0: 0, - 1: 1, - 2: 2, - 3: 3, - 4: 4, - 5: 5, - 6: 6, - 7: 7, - 8: 8, - 9: 9, - a: 10, - A: 10, - b: 11, - B: 11, - c: 12, - C: 12, - d: 13, - D: 13, - e: 14, - E: 14, - f: 15, - F: 15 -}; - -const nextCharNumber = context => { - const numStr = context.future().text; - if (numStr === "EOF") { return [null, ""] } - return [digitToNumber[numStr.charAt(0)], numStr] -}; - -const appendCharNumbers = (number, numStr, base) => { - for (let i = 1; i < numStr.length; i++) { - const digit = digitToNumber[numStr.charAt(i)]; - number *= base; - number += digit; - } - return number -}; - -// TeX \char makes a literal character (catcode 12) using the following forms: -// (see The TeXBook, p. 43) -// \char123 -- decimal -// \char'123 -- octal -// \char"123 -- hex -// \char`x -- character that can be written (i.e. isn't active) -// \char`\x -- character that cannot be written (e.g. %) -// These all refer to characters from the font, so we turn them into special -// calls to a function \@char dealt with in the Parser. -defineMacro("\\char", function(context) { - let token = context.popToken(); - let base; - let number = ""; - if (token.text === "'") { - base = 8; - token = context.popToken(); - } else if (token.text === '"') { - base = 16; - token = context.popToken(); - } else if (token.text === "`") { - token = context.popToken(); - if (token.text[0] === "\\") { - number = token.text.charCodeAt(1); - } else if (token.text === "EOF") { - throw new ParseError("\\char` missing argument"); - } else { - number = token.text.charCodeAt(0); - } - } else { - base = 10; - } - if (base) { - // Parse a number in the given base, starting with first `token`. - let numStr = token.text; - number = digitToNumber[numStr.charAt(0)]; - if (number == null || number >= base) { - throw new ParseError(`Invalid base-${base} digit ${token.text}`); - } - number = appendCharNumbers(number, numStr, base); - let digit; - [digit, numStr] = nextCharNumber(context); - while (digit != null && digit < base) { - number *= base; - number += digit; - number = appendCharNumbers(number, numStr, base); - context.popToken(); - [digit, numStr] = nextCharNumber(context); - } - } - return `\\@char{${number}}`; -}); - -function recreateArgStr(context) { - // Recreate the macro's original argument string from the array of parse tokens. - const tokens = context.consumeArgs(1)[0]; - let str = ""; - let expectedLoc = tokens[tokens.length - 1].loc.start; - for (let i = tokens.length - 1; i >= 0; i--) { - const actualLoc = tokens[i].loc.start; - if (actualLoc > expectedLoc) { - // context.consumeArgs has eaten a space. - str += " "; - expectedLoc = actualLoc; - } - str += tokens[i].text; - expectedLoc += tokens[i].text.length; - } - return str -} - -// The Latin Modern font renders at the wrong vertical alignment. -// This macro provides a better rendering. -defineMacro("\\surd", '\\sqrt{\\vphantom{|}}'); - -// See comment for \oplus in symbols.js. -defineMacro("\u2295", "\\oplus"); - -// Since Temml has no \par, ignore \long. -defineMacro("\\long", ""); - -////////////////////////////////////////////////////////////////////// -// Grouping -// \let\bgroup={ \let\egroup=} -defineMacro("\\bgroup", "{"); -defineMacro("\\egroup", "}"); - -// Symbols from latex.ltx: -// \def~{\nobreakspace{}} -// \def\lq{`} -// \def\rq{'} -// \def \aa {\r a} -defineMacro("~", "\\nobreakspace"); -defineMacro("\\lq", "`"); -defineMacro("\\rq", "'"); -defineMacro("\\aa", "\\r a"); - -defineMacro("\\Bbbk", "\\Bbb{k}"); - -// \mathstrut from the TeXbook, p 360 -defineMacro("\\mathstrut", "\\vphantom{(}"); - -// \underbar from TeXbook p 353 -defineMacro("\\underbar", "\\underline{\\text{#1}}"); - -////////////////////////////////////////////////////////////////////// -// LaTeX_2ε - -// \vdots{\vbox{\baselineskip4\p@ \lineskiplimit\z@ -// \kern6\p@\hbox{.}\hbox{.}\hbox{.}}} -// We'll call \varvdots, which gets a glyph from symbols.js. -// The zero-width rule gets us an equivalent to the vertical 6pt kern. -defineMacro("\\vdots", "{\\varvdots\\rule{0pt}{15pt}}"); -defineMacro("\u22ee", "\\vdots"); - -////////////////////////////////////////////////////////////////////// -// amsmath.sty -// http://mirrors.concertpass.com/tex-archive/macros/latex/required/amsmath/amsmath.pdf - -//\newcommand{\substack}[1]{\subarray{c}#1\endsubarray} -defineMacro("\\substack", "\\begin{subarray}{c}#1\\end{subarray}"); - -// \def\iff{\DOTSB\;\Longleftrightarrow\;} -// \def\implies{\DOTSB\;\Longrightarrow\;} -// \def\impliedby{\DOTSB\;\Longleftarrow\;} -defineMacro("\\iff", "\\DOTSB\\;\\Longleftrightarrow\\;"); -defineMacro("\\implies", "\\DOTSB\\;\\Longrightarrow\\;"); -defineMacro("\\impliedby", "\\DOTSB\\;\\Longleftarrow\\;"); - -// AMSMath's automatic \dots, based on \mdots@@ macro. -const dotsByToken = { - ",": "\\dotsc", - "\\not": "\\dotsb", - // \keybin@ checks for the following: - "+": "\\dotsb", - "=": "\\dotsb", - "<": "\\dotsb", - ">": "\\dotsb", - "-": "\\dotsb", - "*": "\\dotsb", - ":": "\\dotsb", - // Symbols whose definition starts with \DOTSB: - "\\DOTSB": "\\dotsb", - "\\coprod": "\\dotsb", - "\\bigvee": "\\dotsb", - "\\bigwedge": "\\dotsb", - "\\biguplus": "\\dotsb", - "\\bigcap": "\\dotsb", - "\\bigcup": "\\dotsb", - "\\prod": "\\dotsb", - "\\sum": "\\dotsb", - "\\bigotimes": "\\dotsb", - "\\bigoplus": "\\dotsb", - "\\bigodot": "\\dotsb", - "\\bigsqcap": "\\dotsb", - "\\bigsqcup": "\\dotsb", - "\\bigtimes": "\\dotsb", - "\\And": "\\dotsb", - "\\longrightarrow": "\\dotsb", - "\\Longrightarrow": "\\dotsb", - "\\longleftarrow": "\\dotsb", - "\\Longleftarrow": "\\dotsb", - "\\longleftrightarrow": "\\dotsb", - "\\Longleftrightarrow": "\\dotsb", - "\\mapsto": "\\dotsb", - "\\longmapsto": "\\dotsb", - "\\hookrightarrow": "\\dotsb", - "\\doteq": "\\dotsb", - // Symbols whose definition starts with \mathbin: - "\\mathbin": "\\dotsb", - // Symbols whose definition starts with \mathrel: - "\\mathrel": "\\dotsb", - "\\relbar": "\\dotsb", - "\\Relbar": "\\dotsb", - "\\xrightarrow": "\\dotsb", - "\\xleftarrow": "\\dotsb", - // Symbols whose definition starts with \DOTSI: - "\\DOTSI": "\\dotsi", - "\\int": "\\dotsi", - "\\oint": "\\dotsi", - "\\iint": "\\dotsi", - "\\iiint": "\\dotsi", - "\\iiiint": "\\dotsi", - "\\idotsint": "\\dotsi", - // Symbols whose definition starts with \DOTSX: - "\\DOTSX": "\\dotsx" -}; - -defineMacro("\\dots", function(context) { - // TODO: If used in text mode, should expand to \textellipsis. - // However, in Temml, \textellipsis and \ldots behave the same - // (in text mode), and it's unlikely we'd see any of the math commands - // that affect the behavior of \dots when in text mode. So fine for now - // (until we support \ifmmode ... \else ... \fi). - let thedots = "\\dotso"; - const next = context.expandAfterFuture().text; - if (next in dotsByToken) { - thedots = dotsByToken[next]; - } else if (next.slice(0, 4) === "\\not") { - thedots = "\\dotsb"; - } else if (next in symbols.math) { - if (["bin", "rel"].includes(symbols.math[next].group)) { - thedots = "\\dotsb"; - } - } - return thedots; -}); - -const spaceAfterDots = { - // \rightdelim@ checks for the following: - ")": true, - "]": true, - "\\rbrack": true, - "\\}": true, - "\\rbrace": true, - "\\rangle": true, - "\\rceil": true, - "\\rfloor": true, - "\\rgroup": true, - "\\rmoustache": true, - "\\right": true, - "\\bigr": true, - "\\biggr": true, - "\\Bigr": true, - "\\Biggr": true, - // \extra@ also tests for the following: - $: true, - // \extrap@ checks for the following: - ";": true, - ".": true, - ",": true -}; - -defineMacro("\\dotso", function(context) { - const next = context.future().text; - if (next in spaceAfterDots) { - return "\\ldots\\,"; - } else { - return "\\ldots"; - } -}); - -defineMacro("\\dotsc", function(context) { - const next = context.future().text; - // \dotsc uses \extra@ but not \extrap@, instead specially checking for - // ';' and '.', but doesn't check for ','. - if (next in spaceAfterDots && next !== ",") { - return "\\ldots\\,"; - } else { - return "\\ldots"; - } -}); - -defineMacro("\\cdots", function(context) { - const next = context.future().text; - if (next in spaceAfterDots) { - return "\\@cdots\\,"; - } else { - return "\\@cdots"; - } -}); - -defineMacro("\\dotsb", "\\cdots"); -defineMacro("\\dotsm", "\\cdots"); -defineMacro("\\dotsi", "\\!\\cdots"); -defineMacro("\\idotsint", "\\dotsi"); -// amsmath doesn't actually define \dotsx, but \dots followed by a macro -// starting with \DOTSX implies \dotso, and then \extra@ detects this case -// and forces the added `\,`. -defineMacro("\\dotsx", "\\ldots\\,"); - -// \let\DOTSI\relax -// \let\DOTSB\relax -// \let\DOTSX\relax -defineMacro("\\DOTSI", "\\relax"); -defineMacro("\\DOTSB", "\\relax"); -defineMacro("\\DOTSX", "\\relax"); - -// Spacing, based on amsmath.sty's override of LaTeX defaults -// \DeclareRobustCommand{\tmspace}[3]{% -// \ifmmode\mskip#1#2\else\kern#1#3\fi\relax} -defineMacro("\\tmspace", "\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax"); -// \renewcommand{\,}{\tmspace+\thinmuskip{.1667em}} -// TODO: math mode should use \thinmuskip -defineMacro("\\,", "{\\tmspace+{3mu}{.1667em}}"); -// \let\thinspace\, -defineMacro("\\thinspace", "\\,"); -// \def\>{\mskip\medmuskip} -// \renewcommand{\:}{\tmspace+\medmuskip{.2222em}} -// TODO: \> and math mode of \: should use \medmuskip = 4mu plus 2mu minus 4mu -defineMacro("\\>", "\\mskip{4mu}"); -defineMacro("\\:", "{\\tmspace+{4mu}{.2222em}}"); -// \let\medspace\: -defineMacro("\\medspace", "\\:"); -// \renewcommand{\;}{\tmspace+\thickmuskip{.2777em}} -// TODO: math mode should use \thickmuskip = 5mu plus 5mu -defineMacro("\\;", "{\\tmspace+{5mu}{.2777em}}"); -// \let\thickspace\; -defineMacro("\\thickspace", "\\;"); -// \renewcommand{\!}{\tmspace-\thinmuskip{.1667em}} -// TODO: math mode should use \thinmuskip -defineMacro("\\!", "{\\tmspace-{3mu}{.1667em}}"); -// \let\negthinspace\! -defineMacro("\\negthinspace", "\\!"); -// \newcommand{\negmedspace}{\tmspace-\medmuskip{.2222em}} -// TODO: math mode should use \medmuskip -defineMacro("\\negmedspace", "{\\tmspace-{4mu}{.2222em}}"); -// \newcommand{\negthickspace}{\tmspace-\thickmuskip{.2777em}} -// TODO: math mode should use \thickmuskip -defineMacro("\\negthickspace", "{\\tmspace-{5mu}{.277em}}"); -// \def\enspace{\kern.5em } -defineMacro("\\enspace", "\\kern.5em "); -// \def\enskip{\hskip.5em\relax} -defineMacro("\\enskip", "\\hskip.5em\\relax"); -// \def\quad{\hskip1em\relax} -defineMacro("\\quad", "\\hskip1em\\relax"); -// \def\qquad{\hskip2em\relax} -defineMacro("\\qquad", "\\hskip2em\\relax"); - -defineMacro("\\AA", "\\TextOrMath{\\Angstrom}{\\mathring{A}}\\relax"); - -// \tag@in@display form of \tag -defineMacro("\\tag", "\\@ifstar\\tag@literal\\tag@paren"); -defineMacro("\\tag@paren", "\\tag@literal{({#1})}"); -defineMacro("\\tag@literal", (context) => { - if (context.macros.get("\\df@tag")) { - throw new ParseError("Multiple \\tag"); - } - return "\\def\\df@tag{\\text{#1}}"; -}); - -// \renewcommand{\bmod}{\nonscript\mskip-\medmuskip\mkern5mu\mathbin -// {\operator@font mod}\penalty900 -// \mkern5mu\nonscript\mskip-\medmuskip} -// \newcommand{\pod}[1]{\allowbreak -// \if@display\mkern18mu\else\mkern8mu\fi(#1)} -// \renewcommand{\pmod}[1]{\pod{{\operator@font mod}\mkern6mu#1}} -// \newcommand{\mod}[1]{\allowbreak\if@display\mkern18mu -// \else\mkern12mu\fi{\operator@font mod}\,\,#1} -// TODO: math mode should use \medmuskip = 4mu plus 2mu minus 4mu -defineMacro("\\bmod", "\\mathbin{\\text{mod}}"); -defineMacro( - "\\pod", - "\\allowbreak" + "\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)" -); -defineMacro("\\pmod", "\\pod{{\\rm mod}\\mkern6mu#1}"); -defineMacro( - "\\mod", - "\\allowbreak" + - "\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}" + - "{\\rm mod}\\,\\,#1" -); - -////////////////////////////////////////////////////////////////////// -// LaTeX source2e - -// \expandafter\let\expandafter\@normalcr -// \csname\expandafter\@gobble\string\\ \endcsname -// \DeclareRobustCommand\newline{\@normalcr\relax} -defineMacro("\\newline", "\\\\\\relax"); - -// \def\TeX{T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX\@} -// TODO: Doesn't normally work in math mode because \@ fails. -defineMacro("\\TeX", "\\textrm{T}\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125em\\textrm{X}"); - -defineMacro( - "\\LaTeX", - "\\textrm{L}\\kern-.35em\\raisebox{0.2em}{\\scriptstyle A}\\kern-.15em\\TeX" -); - -defineMacro( - "\\Temml", - // eslint-disable-next-line max-len - "\\textrm{T}\\kern-0.2em\\lower{0.2em}{\\textrm{E}}\\kern-0.08em{\\textrm{M}\\kern-0.08em\\raise{0.2em}\\textrm{M}\\kern-0.08em\\textrm{L}}" -); - -// \DeclareRobustCommand\hspace{\@ifstar\@hspacer\@hspace} -// \def\@hspace#1{\hskip #1\relax} -// \def\@hspacer#1{\vrule \@width\z@\nobreak -// \hskip #1\hskip \z@skip} -defineMacro("\\hspace", "\\@ifstar\\@hspacer\\@hspace"); -defineMacro("\\@hspace", "\\hskip #1\\relax"); -defineMacro("\\@hspacer", "\\rule{0pt}{0pt}\\hskip #1\\relax"); - -defineMacro("\\colon", `\\mathpunct{\\char"3a}`); - -////////////////////////////////////////////////////////////////////// -// mathtools.sty - -defineMacro("\\prescript", "\\pres@cript{_{#1}^{#2}}{}{#3}"); - -//\providecommand\ordinarycolon{:} -defineMacro("\\ordinarycolon", `\\char"3a`); -// Raise to center on the math axis, as closely as possible. -defineMacro("\\vcentcolon", "\\mathrel{\\raisebox{0.035em}{\\ordinarycolon}}"); -// \providecommand*\coloneq{\vcentcolon\mathrel{\mkern-1.2mu}\mathrel{-}} -defineMacro("\\coloneq", '\\mathrel{\\raisebox{0.035em}{\\ordinarycolon}\\char"2212}'); -// \providecommand*\Coloneq{\dblcolon\mathrel{\mkern-1.2mu}\mathrel{-}} -defineMacro("\\Coloneq", '\\mathrel{\\char"2237\\char"2212}'); -// \providecommand*\Eqqcolon{=\mathrel{\mkern-1.2mu}\dblcolon} -defineMacro("\\Eqqcolon", '\\mathrel{\\char"3d\\char"2237}'); -// \providecommand*\Eqcolon{\mathrel{-}\mathrel{\mkern-1.2mu}\dblcolon} -defineMacro("\\Eqcolon", '\\mathrel{\\char"2212\\char"2237}'); -// \providecommand*\colonapprox{\vcentcolon\mathrel{\mkern-1.2mu}\approx} -defineMacro("\\colonapprox", '\\mathrel{\\raisebox{0.035em}{\\ordinarycolon}\\char"2248}'); -// \providecommand*\Colonapprox{\dblcolon\mathrel{\mkern-1.2mu}\approx} -defineMacro("\\Colonapprox", '\\mathrel{\\char"2237\\char"2248}'); -// \providecommand*\colonsim{\vcentcolon\mathrel{\mkern-1.2mu}\sim} -defineMacro("\\colonsim", '\\mathrel{\\raisebox{0.035em}{\\ordinarycolon}\\char"223c}'); -// \providecommand*\Colonsim{\dblcolon\mathrel{\mkern-1.2mu}\sim} -defineMacro("\\Colonsim", '\\mathrel{\\raisebox{0.035em}{\\ordinarycolon}\\char"223c}'); - -////////////////////////////////////////////////////////////////////// -// colonequals.sty - -// Alternate names for mathtools's macros: -defineMacro("\\ratio", "\\vcentcolon"); -defineMacro("\\coloncolon", "\\dblcolon"); -defineMacro("\\colonequals", "\\coloneqq"); -defineMacro("\\coloncolonequals", "\\Coloneqq"); -defineMacro("\\equalscolon", "\\eqqcolon"); -defineMacro("\\equalscoloncolon", "\\Eqqcolon"); -defineMacro("\\colonminus", "\\coloneq"); -defineMacro("\\coloncolonminus", "\\Coloneq"); -defineMacro("\\minuscolon", "\\eqcolon"); -defineMacro("\\minuscoloncolon", "\\Eqcolon"); -// \colonapprox name is same in mathtools and colonequals. -defineMacro("\\coloncolonapprox", "\\Colonapprox"); -// \colonsim name is same in mathtools and colonequals. -defineMacro("\\coloncolonsim", "\\Colonsim"); - -// Present in newtxmath, pxfonts and txfonts -defineMacro("\\notni", "\\mathrel{\\char`\u220C}"); -defineMacro("\\limsup", "\\DOTSB\\operatorname*{lim\\,sup}"); -defineMacro("\\liminf", "\\DOTSB\\operatorname*{lim\\,inf}"); - -////////////////////////////////////////////////////////////////////// -// From amsopn.sty -defineMacro("\\injlim", "\\DOTSB\\operatorname*{inj\\,lim}"); -defineMacro("\\projlim", "\\DOTSB\\operatorname*{proj\\,lim}"); -defineMacro("\\varlimsup", "\\DOTSB\\operatorname*{\\overline{\\text{lim}}}"); -defineMacro("\\varliminf", "\\DOTSB\\operatorname*{\\underline{\\text{lim}}}"); -defineMacro("\\varinjlim", "\\DOTSB\\operatorname*{\\underrightarrow{\\text{lim}}}"); -defineMacro("\\varprojlim", "\\DOTSB\\operatorname*{\\underleftarrow{\\text{lim}}}"); - -defineMacro("\\centerdot", "{\\medspace\\rule{0.167em}{0.189em}\\medspace}"); - -////////////////////////////////////////////////////////////////////// -// statmath.sty -// https://ctan.math.illinois.edu/macros/latex/contrib/statmath/statmath.pdf - -defineMacro("\\argmin", "\\DOTSB\\operatorname*{arg\\,min}"); -defineMacro("\\argmax", "\\DOTSB\\operatorname*{arg\\,max}"); -defineMacro("\\plim", "\\DOTSB\\operatorname*{plim}"); - -////////////////////////////////////////////////////////////////////// -// MnSymbol.sty - -defineMacro("\\leftmodels", "\\mathop{\\reflectbox{$\\models$}}"); - -////////////////////////////////////////////////////////////////////// -// braket.sty -// http://ctan.math.washington.edu/tex-archive/macros/latex/contrib/braket/braket.pdf - -defineMacro("\\bra", "\\mathinner{\\langle{#1}|}"); -defineMacro("\\ket", "\\mathinner{|{#1}\\rangle}"); -defineMacro("\\braket", "\\mathinner{\\langle{#1}\\rangle}"); -defineMacro("\\Bra", "\\left\\langle#1\\right|"); -defineMacro("\\Ket", "\\left|#1\\right\\rangle"); -// A helper for \Braket and \Set -const replaceVert = (argStr, match) => { - const ch = match[0] === "|" ? "\\vert" : "\\Vert"; - const replaceStr = `}\\,\\middle${ch}\\,{`; - return argStr.slice(0, match.index) + replaceStr + argStr.slice(match.index + match[0].length) -}; -defineMacro("\\Braket", function(context) { - let argStr = recreateArgStr(context); - const regEx = /\|\||\||\\\|/g; - let match; - while ((match = regEx.exec(argStr)) !== null) { - argStr = replaceVert(argStr, match); - } - return "\\left\\langle{" + argStr + "}\\right\\rangle" -}); -defineMacro("\\Set", function(context) { - let argStr = recreateArgStr(context); - const match = /\|\||\||\\\|/.exec(argStr); - if (match) { - argStr = replaceVert(argStr, match); - } - return "\\left\\{\\:{" + argStr + "}\\:\\right\\}" -}); -defineMacro("\\set", function(context) { - const argStr = recreateArgStr(context); - return "\\{{" + argStr.replace(/\|/, "}\\mid{") + "}\\}" -}); - -////////////////////////////////////////////////////////////////////// -// actuarialangle.dtx -defineMacro("\\angln", "{\\angl n}"); - -////////////////////////////////////////////////////////////////////// -// derivative.sty -defineMacro("\\odv", "\\@ifstar\\odv@next\\odv@numerator"); -defineMacro("\\odv@numerator", "\\frac{\\mathrm{d}#1}{\\mathrm{d}#2}"); -defineMacro("\\odv@next", "\\frac{\\mathrm{d}}{\\mathrm{d}#2}#1"); -defineMacro("\\pdv", "\\@ifstar\\pdv@next\\pdv@numerator"); - -const pdvHelper = args => { - const numerator = args[0][0].text; - const denoms = stringFromArg(args[1]).split(","); - const power = String(denoms.length); - const numOp = power === "1" ? "\\partial" : `\\partial^${power}`; - let denominator = ""; - denoms.map(e => { denominator += "\\partial " + e.trim() + "\\,";}); - return [numerator, numOp, denominator.replace(/\\,$/, "")] -}; -defineMacro("\\pdv@numerator", function(context) { - const [numerator, numOp, denominator] = pdvHelper(context.consumeArgs(2)); - return `\\frac{${numOp} ${numerator}}{${denominator}}` -}); -defineMacro("\\pdv@next", function(context) { - const [numerator, numOp, denominator] = pdvHelper(context.consumeArgs(2)); - return `\\frac{${numOp}}{${denominator}} ${numerator}` -}); - -////////////////////////////////////////////////////////////////////// -// upgreek.dtx -defineMacro("\\upalpha", "\\up@greek{\\alpha}"); -defineMacro("\\upbeta", "\\up@greek{\\beta}"); -defineMacro("\\upgamma", "\\up@greek{\\gamma}"); -defineMacro("\\updelta", "\\up@greek{\\delta}"); -defineMacro("\\upepsilon", "\\up@greek{\\epsilon}"); -defineMacro("\\upzeta", "\\up@greek{\\zeta}"); -defineMacro("\\upeta", "\\up@greek{\\eta}"); -defineMacro("\\uptheta", "\\up@greek{\\theta}"); -defineMacro("\\upiota", "\\up@greek{\\iota}"); -defineMacro("\\upkappa", "\\up@greek{\\kappa}"); -defineMacro("\\uplambda", "\\up@greek{\\lambda}"); -defineMacro("\\upmu", "\\up@greek{\\mu}"); -defineMacro("\\upnu", "\\up@greek{\\nu}"); -defineMacro("\\upxi", "\\up@greek{\\xi}"); -defineMacro("\\upomicron", "\\up@greek{\\omicron}"); -defineMacro("\\uppi", "\\up@greek{\\pi}"); -defineMacro("\\upalpha", "\\up@greek{\\alpha}"); -defineMacro("\\uprho", "\\up@greek{\\rho}"); -defineMacro("\\upsigma", "\\up@greek{\\sigma}"); -defineMacro("\\uptau", "\\up@greek{\\tau}"); -defineMacro("\\upupsilon", "\\up@greek{\\upsilon}"); -defineMacro("\\upphi", "\\up@greek{\\phi}"); -defineMacro("\\upchi", "\\up@greek{\\chi}"); -defineMacro("\\uppsi", "\\up@greek{\\psi}"); -defineMacro("\\upomega", "\\up@greek{\\omega}"); - -////////////////////////////////////////////////////////////////////// -// cmll package -defineMacro("\\invamp", '\\mathbin{\\char"214b}'); -defineMacro("\\parr", '\\mathbin{\\char"214b}'); -defineMacro("\\with", '\\mathbin{\\char"26}'); -defineMacro("\\multimapinv", '\\mathrel{\\char"27dc}'); -defineMacro("\\multimapboth", '\\mathrel{\\char"29df}'); -defineMacro("\\scoh", '{\\mkern5mu\\char"2322\\mkern5mu}'); -defineMacro("\\sincoh", '{\\mkern5mu\\char"2323\\mkern5mu}'); -defineMacro("\\coh", `{\\mkern5mu\\rule{}{0.7em}\\mathrlap{\\smash{\\raise2mu{\\char"2322}}} -{\\smash{\\lower4mu{\\char"2323}}}\\mkern5mu}`); -defineMacro("\\incoh", `{\\mkern5mu\\rule{}{0.7em}\\mathrlap{\\smash{\\raise2mu{\\char"2323}}} -{\\smash{\\lower4mu{\\char"2322}}}\\mkern5mu}`); - - -////////////////////////////////////////////////////////////////////// -// chemstyle package -defineMacro("\\standardstate", "\\text{\\tiny\\char`⦵}"); - -/* eslint-disable */ -/* -*- Mode: JavaScript; indent-tabs-mode:nil; js-indent-level: 2 -*- */ -/* vim: set ts=2 et sw=2 tw=80: */ - -/************************************************************* - * - * Temml mhchem.js - * - * This file implements a Temml version of mhchem version 3.3.0. - * It is adapted from MathJax/extensions/TeX/mhchem.js - * It differs from the MathJax version as follows: - * 1. The interface is changed so that it can be called from Temml, not MathJax. - * 2. \rlap and \llap are replaced with \mathrlap and \mathllap. - * 3. The reaction arrow code is simplified. All reaction arrows are rendered - * using Temml extensible arrows instead of building non-extensible arrows. - * 4. The ~bond forms are composed entirely of \rule elements. - * 5. Two dashes in _getBond are wrapped in braces to suppress spacing. i.e., {-} - * 6. The electron dot uses \textbullet instead of \bullet. - * - * This code, as other Temml code, is released under the MIT license. - * - * /************************************************************* - * - * MathJax/extensions/TeX/mhchem.js - * - * Implements the \ce command for handling chemical formulas - * from the mhchem LaTeX package. - * - * --------------------------------------------------------------------- - * - * Copyright (c) 2011-2015 The MathJax Consortium - * Copyright (c) 2015-2018 Martin Hensel - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// -// Coding Style -// - use '' for identifiers that can by minified/uglified -// - use "" for strings that need to stay untouched - -// version: "3.3.0" for MathJax and Temml - - -// Add \ce, \pu, and \tripleDash to the Temml macros. - -defineMacro("\\ce", function(context) { - return chemParse(context.consumeArgs(1)[0], "ce") -}); - -defineMacro("\\pu", function(context) { - return chemParse(context.consumeArgs(1)[0], "pu"); -}); - -// Math fonts do not include glyphs for the ~ form of bonds. So we'll send path geometry -// So we'll compose characters built from \rule elements. -defineMacro("\\uniDash", `{\\rule{0.672em}{0.06em}}`) -defineMacro("\\triDash", `{\\rule{0.15em}{0.06em}\\kern2mu\\rule{0.15em}{0.06em}\\kern2mu\\rule{0.15em}{0.06em}}`) -defineMacro("\\tripleDash", `\\kern0.075em\\raise0.25em{\\triDash}\\kern0.075em`) -defineMacro("\\tripleDashOverLine", `\\kern0.075em\\mathrlap{\\raise0.125em{\\uniDash}}\\raise0.34em{\\triDash}\\kern0.075em`) -defineMacro("\\tripleDashOverDoubleLine", `\\kern0.075em\\mathrlap{\\mathrlap{\\raise0.48em{\\triDash}}\\raise0.27em{\\uniDash}}{\\raise0.05em{\\uniDash}}\\kern0.075em`) -defineMacro("\\tripleDashBetweenDoubleLine", `\\kern0.075em\\mathrlap{\\mathrlap{\\raise0.48em{\\uniDash}}\\raise0.27em{\\triDash}}{\\raise0.05em{\\uniDash}}\\kern0.075em`) - - // - // This is the main function for handing the \ce and \pu commands. - // It takes the argument to \ce or \pu and returns the corresponding TeX string. - // - - var chemParse = function (tokens, stateMachine) { - // Recreate the argument string from Temml's array of tokens. - var str = ""; - var expectedLoc = tokens.length && tokens[tokens.length - 1].loc.start - for (var i = tokens.length - 1; i >= 0; i--) { - if(tokens[i].loc.start > expectedLoc) { - // context.consumeArgs has eaten a space. - str += " "; - expectedLoc = tokens[i].loc.start; - } - str += tokens[i].text; - expectedLoc += tokens[i].text.length; - } - // Call the mhchem core parser. - var tex = texify.go(mhchemParser.go(str, stateMachine)); - return tex; - }; - - // - // Core parser for mhchem syntax (recursive) - // - /** @type {MhchemParser} */ - var mhchemParser = { - // - // Parses mchem \ce syntax - // - // Call like - // go("H2O"); - // - go: function (input, stateMachine) { - if (!input) { return []; } - if (stateMachine === undefined) { stateMachine = 'ce'; } - var state = '0'; - - // - // String buffers for parsing: - // - // buffer.a == amount - // buffer.o == element - // buffer.b == left-side superscript - // buffer.p == left-side subscript - // buffer.q == right-side subscript - // buffer.d == right-side superscript - // - // buffer.r == arrow - // buffer.rdt == arrow, script above, type - // buffer.rd == arrow, script above, content - // buffer.rqt == arrow, script below, type - // buffer.rq == arrow, script below, content - // - // buffer.text_ - // buffer.rm - // etc. - // - // buffer.parenthesisLevel == int, starting at 0 - // buffer.sb == bool, space before - // buffer.beginsWithBond == bool - // - // These letters are also used as state names. - // - // Other states: - // 0 == begin of main part (arrow/operator unlikely) - // 1 == next entity - // 2 == next entity (arrow/operator unlikely) - // 3 == next atom - // c == macro - // - /** @type {Buffer} */ - var buffer = {}; - buffer['parenthesisLevel'] = 0; - - input = input.replace(/\n/g, " "); - input = input.replace(/[\u2212\u2013\u2014\u2010]/g, "-"); - input = input.replace(/[\u2026]/g, "..."); - - // - // Looks through mhchemParser.transitions, to execute a matching action - // (recursive) - // - var lastInput; - var watchdog = 10; - /** @type {ParserOutput[]} */ - var output = []; - while (true) { - if (lastInput !== input) { - watchdog = 10; - lastInput = input; - } else { - watchdog--; - } - // - // Find actions in transition table - // - var machine = mhchemParser.stateMachines[stateMachine]; - var t = machine.transitions[state] || machine.transitions['*']; - iterateTransitions: - for (var i=0; i 0) { - if (!task.revisit) { - input = matches.remainder; - } - if (!task.toContinue) { - break iterateTransitions; - } - } else { - return output; - } - } - } - // - // Prevent infinite loop - // - if (watchdog <= 0) { - throw ["MhchemBugU", "mhchem bug U. Please report."]; // Unexpected character - } - } - }, - concatArray: function (a, b) { - if (b) { - if (Array.isArray(b)) { - for (var iB=0; iB': /^[=<>]/, - '#': /^[#\u2261]/, - '+': /^\+/, - '-$': /^-(?=[\s_},;\]/]|$|\([a-z]+\))/, // -space -, -; -] -/ -$ -state-of-aggregation - '-9': /^-(?=[0-9])/, - '- orbital overlap': /^-(?=(?:[spd]|sp)(?:$|[\s,;\)\]\}]))/, - '-': /^-/, - 'pm-operator': /^(?:\\pm|\$\\pm\$|\+-|\+\/-)/, - 'operator': /^(?:\+|(?:[\-=<>]|<<|>>|\\approx|\$\\approx\$)(?=\s|$|-?[0-9]))/, - 'arrowUpDown': /^(?:v|\(v\)|\^|\(\^\))(?=$|[\s,;\)\]\}])/, - '\\bond{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, "\\bond{", "", "", "}"); }, - '->': /^(?:<->|<-->|->|<-|<=>>|<<=>|<=>|[\u2192\u27F6\u21CC])/, - 'CMT': /^[CMT](?=\[)/, - '[(...)]': function (input) { return mhchemParser.patterns.findObserveGroups(input, "[", "", "", "]"); }, - '1st-level escape': /^(&|\\\\|\\hline)\s*/, - '\\,': /^(?:\\[,\ ;:])/, // \\x - but output no space before - '\\x{}{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, "", /^\\[a-zA-Z]+\{/, "}", "", "", "{", "}", "", true); }, - '\\x{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, "", /^\\[a-zA-Z]+\{/, "}", ""); }, - '\\ca': /^\\ca(?:\s+|(?![a-zA-Z]))/, - '\\x': /^(?:\\[a-zA-Z]+\s*|\\[_&{}%])/, - 'orbital': /^(?:[0-9]{1,2}[spdfgh]|[0-9]{0,2}sp)(?=$|[^a-zA-Z])/, // only those with numbers in front, because the others will be formatted correctly anyway - 'others': /^[\/~|]/, - '\\frac{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, "\\frac{", "", "", "}", "{", "", "", "}"); }, - '\\overset{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, "\\overset{", "", "", "}", "{", "", "", "}"); }, - '\\underset{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, "\\underset{", "", "", "}", "{", "", "", "}"); }, - '\\underbrace{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, "\\underbrace{", "", "", "}_", "{", "", "", "}"); }, - '\\color{(...)}0': function (input) { return mhchemParser.patterns.findObserveGroups(input, "\\color{", "", "", "}"); }, - '\\color{(...)}{(...)}1': function (input) { return mhchemParser.patterns.findObserveGroups(input, "\\color{", "", "", "}", "{", "", "", "}"); }, - '\\color(...){(...)}2': function (input) { return mhchemParser.patterns.findObserveGroups(input, "\\color", "\\", "", /^(?=\{)/, "{", "", "", "}"); }, - '\\ce{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, "\\ce{", "", "", "}"); }, - 'oxidation$': /^(?:[+-][IVX]+|\\pm\s*0|\$\\pm\$\s*0)$/, - 'd-oxidation$': /^(?:[+-]?\s?[IVX]+|\\pm\s*0|\$\\pm\$\s*0)$/, // 0 could be oxidation or charge - 'roman numeral': /^[IVX]+/, - '1/2$': /^[+\-]?(?:[0-9]+|\$[a-z]\$|[a-z])\/[0-9]+(?:\$[a-z]\$|[a-z])?$/, - 'amount': function (input) { - var match; - // e.g. 2, 0.5, 1/2, -2, n/2, +; $a$ could be added later in parsing - match = input.match(/^(?:(?:(?:\([+\-]?[0-9]+\/[0-9]+\)|[+\-]?(?:[0-9]+|\$[a-z]\$|[a-z])\/[0-9]+|[+\-]?[0-9]+[.,][0-9]+|[+\-]?\.[0-9]+|[+\-]?[0-9]+)(?:[a-z](?=\s*[A-Z]))?)|[+\-]?[a-z](?=\s*[A-Z])|\+(?!\s))/); - if (match) { - return { match_: match[0], remainder: input.substr(match[0].length) }; - } - var a = mhchemParser.patterns.findObserveGroups(input, "", "$", "$", ""); - if (a) { // e.g. $2n-1$, $-$ - match = a.match_.match(/^\$(?:\(?[+\-]?(?:[0-9]*[a-z]?[+\-])?[0-9]*[a-z](?:[+\-][0-9]*[a-z]?)?\)?|\+|-)\$$/); - if (match) { - return { match_: match[0], remainder: input.substr(match[0].length) }; - } - } - return null; - }, - 'amount2': function (input) { return this['amount'](input); }, - '(KV letters),': /^(?:[A-Z][a-z]{0,2}|i)(?=,)/, - 'formula$': function (input) { - if (input.match(/^\([a-z]+\)$/)) { return null; } // state of aggregation = no formula - var match = input.match(/^(?:[a-z]|(?:[0-9\ \+\-\,\.\(\)]+[a-z])+[0-9\ \+\-\,\.\(\)]*|(?:[a-z][0-9\ \+\-\,\.\(\)]+)+[a-z]?)$/); - if (match) { - return { match_: match[0], remainder: input.substr(match[0].length) }; - } - return null; - }, - 'uprightEntities': /^(?:pH|pOH|pC|pK|iPr|iBu)(?=$|[^a-zA-Z])/, - '/': /^\s*(\/)\s*/, - '//': /^\s*(\/\/)\s*/, - '*': /^\s*[*.]\s*/ - }, - findObserveGroups: function (input, begExcl, begIncl, endIncl, endExcl, beg2Excl, beg2Incl, end2Incl, end2Excl, combine) { - /** @type {{(input: string, pattern: string | RegExp): string | string[] | null;}} */ - var _match = function (input, pattern) { - if (typeof pattern === "string") { - if (input.indexOf(pattern) !== 0) { return null; } - return pattern; - } else { - var match = input.match(pattern); - if (!match) { return null; } - return match[0]; - } - }; - /** @type {{(input: string, i: number, endChars: string | RegExp): {endMatchBegin: number, endMatchEnd: number} | null;}} */ - var _findObserveGroups = function (input, i, endChars) { - var braces = 0; - while (i < input.length) { - var a = input.charAt(i); - var match = _match(input.substr(i), endChars); - if (match !== null && braces === 0) { - return { endMatchBegin: i, endMatchEnd: i + match.length }; - } else if (a === "{") { - braces++; - } else if (a === "}") { - if (braces === 0) { - throw ["ExtraCloseMissingOpen", "Extra close brace or missing open brace"]; - } else { - braces--; - } - } - i++; - } - if (braces > 0) { - return null; - } - return null; - }; - var match = _match(input, begExcl); - if (match === null) { return null; } - input = input.substr(match.length); - match = _match(input, begIncl); - if (match === null) { return null; } - var e = _findObserveGroups(input, match.length, endIncl || endExcl); - if (e === null) { return null; } - var match1 = input.substring(0, (endIncl ? e.endMatchEnd : e.endMatchBegin)); - if (!(beg2Excl || beg2Incl)) { - return { - match_: match1, - remainder: input.substr(e.endMatchEnd) - }; - } else { - var group2 = this.findObserveGroups(input.substr(e.endMatchEnd), beg2Excl, beg2Incl, end2Incl, end2Excl); - if (group2 === null) { return null; } - /** @type {string[]} */ - var matchRet = [match1, group2.match_]; - return { - match_: (combine ? matchRet.join("") : matchRet), - remainder: group2.remainder - }; - } - }, - - // - // Matching function - // e.g. match("a", input) will look for the regexp called "a" and see if it matches - // returns null or {match_:"a", remainder:"bc"} - // - match_: function (m, input) { - var pattern = mhchemParser.patterns.patterns[m]; - if (pattern === undefined) { - throw ["MhchemBugP", "mhchem bug P. Please report. (" + m + ")"]; // Trying to use non-existing pattern - } else if (typeof pattern === "function") { - return mhchemParser.patterns.patterns[m](input); // cannot use cached var pattern here, because some pattern functions need this===mhchemParser - } else { // RegExp - var match = input.match(pattern); - if (match) { - var mm; - if (match[2]) { - mm = [ match[1], match[2] ]; - } else if (match[1]) { - mm = match[1]; - } else { - mm = match[0]; - } - return { match_: mm, remainder: input.substr(match[0].length) }; - } - return null; - } - } - }, - - // - // Generic state machine actions - // - actions: { - 'a=': function (buffer, m) { buffer.a = (buffer.a || "") + m; }, - 'b=': function (buffer, m) { buffer.b = (buffer.b || "") + m; }, - 'p=': function (buffer, m) { buffer.p = (buffer.p || "") + m; }, - 'o=': function (buffer, m) { buffer.o = (buffer.o || "") + m; }, - 'q=': function (buffer, m) { buffer.q = (buffer.q || "") + m; }, - 'd=': function (buffer, m) { buffer.d = (buffer.d || "") + m; }, - 'rm=': function (buffer, m) { buffer.rm = (buffer.rm || "") + m; }, - 'text=': function (buffer, m) { buffer.text_ = (buffer.text_ || "") + m; }, - 'insert': function (buffer, m, a) { return { type_: a }; }, - 'insert+p1': function (buffer, m, a) { return { type_: a, p1: m }; }, - 'insert+p1+p2': function (buffer, m, a) { return { type_: a, p1: m[0], p2: m[1] }; }, - 'copy': function (buffer, m) { return m; }, - 'rm': function (buffer, m) { return { type_: 'rm', p1: m || ""}; }, - 'text': function (buffer, m) { return mhchemParser.go(m, 'text'); }, - '{text}': function (buffer, m) { - var ret = [ "{" ]; - mhchemParser.concatArray(ret, mhchemParser.go(m, 'text')); - ret.push("}"); - return ret; - }, - 'tex-math': function (buffer, m) { return mhchemParser.go(m, 'tex-math'); }, - 'tex-math tight': function (buffer, m) { return mhchemParser.go(m, 'tex-math tight'); }, - 'bond': function (buffer, m, k) { return { type_: 'bond', kind_: k || m }; }, - 'color0-output': function (buffer, m) { return { type_: 'color0', color: m[0] }; }, - 'ce': function (buffer, m) { return mhchemParser.go(m); }, - '1/2': function (buffer, m) { - /** @type {ParserOutput[]} */ - var ret = []; - if (m.match(/^[+\-]/)) { - ret.push(m.substr(0, 1)); - m = m.substr(1); - } - var n = m.match(/^([0-9]+|\$[a-z]\$|[a-z])\/([0-9]+)(\$[a-z]\$|[a-z])?$/); - n[1] = n[1].replace(/\$/g, ""); - ret.push({ type_: 'frac', p1: n[1], p2: n[2] }); - if (n[3]) { - n[3] = n[3].replace(/\$/g, ""); - ret.push({ type_: 'tex-math', p1: n[3] }); - } - return ret; - }, - '9,9': function (buffer, m) { return mhchemParser.go(m, '9,9'); } - }, - // - // createTransitions - // convert { 'letter': { 'state': { action_: 'output' } } } to { 'state' => [ { pattern: 'letter', task: { action_: [{type_: 'output'}] } } ] } - // with expansion of 'a|b' to 'a' and 'b' (at 2 places) - // - createTransitions: function (o) { - var pattern, state; - /** @type {string[]} */ - var stateArray; - var i; - // - // 1. Collect all states - // - /** @type {Transitions} */ - var transitions = {}; - for (pattern in o) { - for (state in o[pattern]) { - stateArray = state.split("|"); - o[pattern][state].stateArray = stateArray; - for (i=0; i': { - '0|1|2|3': { action_: 'r=', nextState: 'r' }, - 'a|as': { action_: [ 'output', 'r=' ], nextState: 'r' }, - '*': { action_: [ 'output', 'r=' ], nextState: 'r' } }, - '+': { - 'o': { action_: 'd= kv', nextState: 'd' }, - 'd|D': { action_: 'd=', nextState: 'd' }, - 'q': { action_: 'd=', nextState: 'qd' }, - 'qd|qD': { action_: 'd=', nextState: 'qd' }, - 'dq': { action_: [ 'output', 'd=' ], nextState: 'd' }, - '3': { action_: [ 'sb=false', 'output', 'operator' ], nextState: '0' } }, - 'amount': { - '0|2': { action_: 'a=', nextState: 'a' } }, - 'pm-operator': { - '0|1|2|a|as': { action_: [ 'sb=false', 'output', { type_: 'operator', option: '\\pm' } ], nextState: '0' } }, - 'operator': { - '0|1|2|a|as': { action_: [ 'sb=false', 'output', 'operator' ], nextState: '0' } }, - '-$': { - 'o|q': { action_: [ 'charge or bond', 'output' ], nextState: 'qd' }, - 'd': { action_: 'd=', nextState: 'd' }, - 'D': { action_: [ 'output', { type_: 'bond', option: "-" } ], nextState: '3' }, - 'q': { action_: 'd=', nextState: 'qd' }, - 'qd': { action_: 'd=', nextState: 'qd' }, - 'qD|dq': { action_: [ 'output', { type_: 'bond', option: "-" } ], nextState: '3' } }, - '-9': { - '3|o': { action_: [ 'output', { type_: 'insert', option: 'hyphen' } ], nextState: '3' } }, - '- orbital overlap': { - 'o': { action_: [ 'output', { type_: 'insert', option: 'hyphen' } ], nextState: '2' }, - 'd': { action_: [ 'output', { type_: 'insert', option: 'hyphen' } ], nextState: '2' } }, - '-': { - '0|1|2': { action_: [ { type_: 'output', option: 1 }, 'beginsWithBond=true', { type_: 'bond', option: "-" } ], nextState: '3' }, - '3': { action_: { type_: 'bond', option: "-" } }, - 'a': { action_: [ 'output', { type_: 'insert', option: 'hyphen' } ], nextState: '2' }, - 'as': { action_: [ { type_: 'output', option: 2 }, { type_: 'bond', option: "-" } ], nextState: '3' }, - 'b': { action_: 'b=' }, - 'o': { action_: { type_: '- after o/d', option: false }, nextState: '2' }, - 'q': { action_: { type_: '- after o/d', option: false }, nextState: '2' }, - 'd|qd|dq': { action_: { type_: '- after o/d', option: true }, nextState: '2' }, - 'D|qD|p': { action_: [ 'output', { type_: 'bond', option: "-" } ], nextState: '3' } }, - 'amount2': { - '1|3': { action_: 'a=', nextState: 'a' } }, - 'letters': { - '0|1|2|3|a|as|b|p|bp|o': { action_: 'o=', nextState: 'o' }, - 'q|dq': { action_: ['output', 'o='], nextState: 'o' }, - 'd|D|qd|qD': { action_: 'o after d', nextState: 'o' } }, - 'digits': { - 'o': { action_: 'q=', nextState: 'q' }, - 'd|D': { action_: 'q=', nextState: 'dq' }, - 'q': { action_: [ 'output', 'o=' ], nextState: 'o' }, - 'a': { action_: 'o=', nextState: 'o' } }, - 'space A': { - 'b|p|bp': {} }, - 'space': { - 'a': { nextState: 'as' }, - '0': { action_: 'sb=false' }, - '1|2': { action_: 'sb=true' }, - 'r|rt|rd|rdt|rdq': { action_: 'output', nextState: '0' }, - '*': { action_: [ 'output', 'sb=true' ], nextState: '1'} }, - '1st-level escape': { - '1|2': { action_: [ 'output', { type_: 'insert+p1', option: '1st-level escape' } ] }, - '*': { action_: [ 'output', { type_: 'insert+p1', option: '1st-level escape' } ], nextState: '0' } }, - '[(...)]': { - 'r|rt': { action_: 'rd=', nextState: 'rd' }, - 'rd|rdt': { action_: 'rq=', nextState: 'rdq' } }, - '...': { - 'o|d|D|dq|qd|qD': { action_: [ 'output', { type_: 'bond', option: "..." } ], nextState: '3' }, - '*': { action_: [ { type_: 'output', option: 1 }, { type_: 'insert', option: 'ellipsis' } ], nextState: '1' } }, - '. |* ': { - '*': { action_: [ 'output', { type_: 'insert', option: 'addition compound' } ], nextState: '1' } }, - 'state of aggregation $': { - '*': { action_: [ 'output', 'state of aggregation' ], nextState: '1' } }, - '{[(': { - 'a|as|o': { action_: [ 'o=', 'output', 'parenthesisLevel++' ], nextState: '2' }, - '0|1|2|3': { action_: [ 'o=', 'output', 'parenthesisLevel++' ], nextState: '2' }, - '*': { action_: [ 'output', 'o=', 'output', 'parenthesisLevel++' ], nextState: '2' } }, - ')]}': { - '0|1|2|3|b|p|bp|o': { action_: [ 'o=', 'parenthesisLevel--' ], nextState: 'o' }, - 'a|as|d|D|q|qd|qD|dq': { action_: [ 'output', 'o=', 'parenthesisLevel--' ], nextState: 'o' } }, - ', ': { - '*': { action_: [ 'output', 'comma' ], nextState: '0' } }, - '^_': { // ^ and _ without a sensible argument - '*': { } }, - '^{(...)}|^($...$)': { - '0|1|2|as': { action_: 'b=', nextState: 'b' }, - 'p': { action_: 'b=', nextState: 'bp' }, - '3|o': { action_: 'd= kv', nextState: 'D' }, - 'q': { action_: 'd=', nextState: 'qD' }, - 'd|D|qd|qD|dq': { action_: [ 'output', 'd=' ], nextState: 'D' } }, - '^a|^\\x{}{}|^\\x{}|^\\x|\'': { - '0|1|2|as': { action_: 'b=', nextState: 'b' }, - 'p': { action_: 'b=', nextState: 'bp' }, - '3|o': { action_: 'd= kv', nextState: 'd' }, - 'q': { action_: 'd=', nextState: 'qd' }, - 'd|qd|D|qD': { action_: 'd=' }, - 'dq': { action_: [ 'output', 'd=' ], nextState: 'd' } }, - '_{(state of aggregation)}$': { - 'd|D|q|qd|qD|dq': { action_: [ 'output', 'q=' ], nextState: 'q' } }, - '_{(...)}|_($...$)|_9|_\\x{}{}|_\\x{}|_\\x': { - '0|1|2|as': { action_: 'p=', nextState: 'p' }, - 'b': { action_: 'p=', nextState: 'bp' }, - '3|o': { action_: 'q=', nextState: 'q' }, - 'd|D': { action_: 'q=', nextState: 'dq' }, - 'q|qd|qD|dq': { action_: [ 'output', 'q=' ], nextState: 'q' } }, - '=<>': { - '0|1|2|3|a|as|o|q|d|D|qd|qD|dq': { action_: [ { type_: 'output', option: 2 }, 'bond' ], nextState: '3' } }, - '#': { - '0|1|2|3|a|as|o': { action_: [ { type_: 'output', option: 2 }, { type_: 'bond', option: "#" } ], nextState: '3' } }, - '{}': { - '*': { action_: { type_: 'output', option: 1 }, nextState: '1' } }, - '{...}': { - '0|1|2|3|a|as|b|p|bp': { action_: 'o=', nextState: 'o' }, - 'o|d|D|q|qd|qD|dq': { action_: [ 'output', 'o=' ], nextState: 'o' } }, - '$...$': { - 'a': { action_: 'a=' }, // 2$n$ - '0|1|2|3|as|b|p|bp|o': { action_: 'o=', nextState: 'o' }, // not 'amount' - 'as|o': { action_: 'o=' }, - 'q|d|D|qd|qD|dq': { action_: [ 'output', 'o=' ], nextState: 'o' } }, - '\\bond{(...)}': { - '*': { action_: [ { type_: 'output', option: 2 }, 'bond' ], nextState: "3" } }, - '\\frac{(...)}': { - '*': { action_: [ { type_: 'output', option: 1 }, 'frac-output' ], nextState: '3' } }, - '\\overset{(...)}': { - '*': { action_: [ { type_: 'output', option: 2 }, 'overset-output' ], nextState: '3' } }, - '\\underset{(...)}': { - '*': { action_: [ { type_: 'output', option: 2 }, 'underset-output' ], nextState: '3' } }, - '\\underbrace{(...)}': { - '*': { action_: [ { type_: 'output', option: 2 }, 'underbrace-output' ], nextState: '3' } }, - '\\color{(...)}{(...)}1|\\color(...){(...)}2': { - '*': { action_: [ { type_: 'output', option: 2 }, 'color-output' ], nextState: '3' } }, - '\\color{(...)}0': { - '*': { action_: [ { type_: 'output', option: 2 }, 'color0-output' ] } }, - '\\ce{(...)}': { - '*': { action_: [ { type_: 'output', option: 2 }, 'ce' ], nextState: '3' } }, - '\\,': { - '*': { action_: [ { type_: 'output', option: 1 }, 'copy' ], nextState: '1' } }, - '\\x{}{}|\\x{}|\\x': { - '0|1|2|3|a|as|b|p|bp|o|c0': { action_: [ 'o=', 'output' ], nextState: '3' }, - '*': { action_: ['output', 'o=', 'output' ], nextState: '3' } }, - 'others': { - '*': { action_: [ { type_: 'output', option: 1 }, 'copy' ], nextState: '3' } }, - 'else2': { - 'a': { action_: 'a to o', nextState: 'o', revisit: true }, - 'as': { action_: [ 'output', 'sb=true' ], nextState: '1', revisit: true }, - 'r|rt|rd|rdt|rdq': { action_: [ 'output' ], nextState: '0', revisit: true }, - '*': { action_: [ 'output', 'copy' ], nextState: '3' } } - }), - actions: { - 'o after d': function (buffer, m) { - var ret; - if ((buffer.d || "").match(/^[0-9]+$/)) { - var tmp = buffer.d; - buffer.d = undefined; - ret = this['output'](buffer); - buffer.b = tmp; - } else { - ret = this['output'](buffer); - } - mhchemParser.actions['o='](buffer, m); - return ret; - }, - 'd= kv': function (buffer, m) { - buffer.d = m; - buffer.dType = 'kv'; - }, - 'charge or bond': function (buffer, m) { - if (buffer['beginsWithBond']) { - /** @type {ParserOutput[]} */ - var ret = []; - mhchemParser.concatArray(ret, this['output'](buffer)); - mhchemParser.concatArray(ret, mhchemParser.actions['bond'](buffer, m, "-")); - return ret; - } else { - buffer.d = m; - } - }, - '- after o/d': function (buffer, m, isAfterD) { - var c1 = mhchemParser.patterns.match_('orbital', buffer.o || ""); - var c2 = mhchemParser.patterns.match_('one lowercase greek letter $', buffer.o || ""); - var c3 = mhchemParser.patterns.match_('one lowercase latin letter $', buffer.o || ""); - var c4 = mhchemParser.patterns.match_('$one lowercase latin letter$ $', buffer.o || ""); - var hyphenFollows = m==="-" && ( c1 && c1.remainder==="" || c2 || c3 || c4 ); - if (hyphenFollows && !buffer.a && !buffer.b && !buffer.p && !buffer.d && !buffer.q && !c1 && c3) { - buffer.o = '$' + buffer.o + '$'; - } - /** @type {ParserOutput[]} */ - var ret = []; - if (hyphenFollows) { - mhchemParser.concatArray(ret, this['output'](buffer)); - ret.push({ type_: 'hyphen' }); - } else { - c1 = mhchemParser.patterns.match_('digits', buffer.d || ""); - if (isAfterD && c1 && c1.remainder==='') { - mhchemParser.concatArray(ret, mhchemParser.actions['d='](buffer, m)); - mhchemParser.concatArray(ret, this['output'](buffer)); - } else { - mhchemParser.concatArray(ret, this['output'](buffer)); - mhchemParser.concatArray(ret, mhchemParser.actions['bond'](buffer, m, "-")); - } - } - return ret; - }, - 'a to o': function (buffer) { - buffer.o = buffer.a; - buffer.a = undefined; - }, - 'sb=true': function (buffer) { buffer.sb = true; }, - 'sb=false': function (buffer) { buffer.sb = false; }, - 'beginsWithBond=true': function (buffer) { buffer['beginsWithBond'] = true; }, - 'beginsWithBond=false': function (buffer) { buffer['beginsWithBond'] = false; }, - 'parenthesisLevel++': function (buffer) { buffer['parenthesisLevel']++; }, - 'parenthesisLevel--': function (buffer) { buffer['parenthesisLevel']--; }, - 'state of aggregation': function (buffer, m) { - return { type_: 'state of aggregation', p1: mhchemParser.go(m, 'o') }; - }, - 'comma': function (buffer, m) { - var a = m.replace(/\s*$/, ''); - var withSpace = (a !== m); - if (withSpace && buffer['parenthesisLevel'] === 0) { - return { type_: 'comma enumeration L', p1: a }; - } else { - return { type_: 'comma enumeration M', p1: a }; - } - }, - 'output': function (buffer, m, entityFollows) { - // entityFollows: - // undefined = if we have nothing else to output, also ignore the just read space (buffer.sb) - // 1 = an entity follows, never omit the space if there was one just read before (can only apply to state 1) - // 2 = 1 + the entity can have an amount, so output a\, instead of converting it to o (can only apply to states a|as) - /** @type {ParserOutput | ParserOutput[]} */ - var ret; - if (!buffer.r) { - ret = []; - if (!buffer.a && !buffer.b && !buffer.p && !buffer.o && !buffer.q && !buffer.d && !entityFollows) { - //ret = []; - } else { - if (buffer.sb) { - ret.push({ type_: 'entitySkip' }); - } - if (!buffer.o && !buffer.q && !buffer.d && !buffer.b && !buffer.p && entityFollows!==2) { - buffer.o = buffer.a; - buffer.a = undefined; - } else if (!buffer.o && !buffer.q && !buffer.d && (buffer.b || buffer.p)) { - buffer.o = buffer.a; - buffer.d = buffer.b; - buffer.q = buffer.p; - buffer.a = buffer.b = buffer.p = undefined; - } else { - if (buffer.o && buffer.dType==='kv' && mhchemParser.patterns.match_('d-oxidation$', buffer.d || "")) { - buffer.dType = 'oxidation'; - } else if (buffer.o && buffer.dType==='kv' && !buffer.q) { - buffer.dType = undefined; - } - } - ret.push({ - type_: 'chemfive', - a: mhchemParser.go(buffer.a, 'a'), - b: mhchemParser.go(buffer.b, 'bd'), - p: mhchemParser.go(buffer.p, 'pq'), - o: mhchemParser.go(buffer.o, 'o'), - q: mhchemParser.go(buffer.q, 'pq'), - d: mhchemParser.go(buffer.d, (buffer.dType === 'oxidation' ? 'oxidation' : 'bd')), - dType: buffer.dType - }); - } - } else { // r - /** @type {ParserOutput[]} */ - var rd; - if (buffer.rdt === 'M') { - rd = mhchemParser.go(buffer.rd, 'tex-math'); - } else if (buffer.rdt === 'T') { - rd = [ { type_: 'text', p1: buffer.rd || "" } ]; - } else { - rd = mhchemParser.go(buffer.rd); - } - /** @type {ParserOutput[]} */ - var rq; - if (buffer.rqt === 'M') { - rq = mhchemParser.go(buffer.rq, 'tex-math'); - } else if (buffer.rqt === 'T') { - rq = [ { type_: 'text', p1: buffer.rq || ""} ]; - } else { - rq = mhchemParser.go(buffer.rq); - } - ret = { - type_: 'arrow', - r: buffer.r, - rd: rd, - rq: rq - }; - } - for (var p in buffer) { - if (p !== 'parenthesisLevel' && p !== 'beginsWithBond') { - delete buffer[p]; - } - } - return ret; - }, - 'oxidation-output': function (buffer, m) { - var ret = [ "{" ]; - mhchemParser.concatArray(ret, mhchemParser.go(m, 'oxidation')); - ret.push("}"); - return ret; - }, - 'frac-output': function (buffer, m) { - return { type_: 'frac-ce', p1: mhchemParser.go(m[0]), p2: mhchemParser.go(m[1]) }; - }, - 'overset-output': function (buffer, m) { - return { type_: 'overset', p1: mhchemParser.go(m[0]), p2: mhchemParser.go(m[1]) }; - }, - 'underset-output': function (buffer, m) { - return { type_: 'underset', p1: mhchemParser.go(m[0]), p2: mhchemParser.go(m[1]) }; - }, - 'underbrace-output': function (buffer, m) { - return { type_: 'underbrace', p1: mhchemParser.go(m[0]), p2: mhchemParser.go(m[1]) }; - }, - 'color-output': function (buffer, m) { - return { type_: 'color', color1: m[0], color2: mhchemParser.go(m[1]) }; - }, - 'r=': function (buffer, m) { buffer.r = m; }, - 'rdt=': function (buffer, m) { buffer.rdt = m; }, - 'rd=': function (buffer, m) { buffer.rd = m; }, - 'rqt=': function (buffer, m) { buffer.rqt = m; }, - 'rq=': function (buffer, m) { buffer.rq = m; }, - 'operator': function (buffer, m, p1) { return { type_: 'operator', kind_: (p1 || m) }; } - } - }, - 'a': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': {} }, - '1/2$': { - '0': { action_: '1/2' } }, - 'else': { - '0': { nextState: '1', revisit: true } }, - '$(...)$': { - '*': { action_: 'tex-math tight', nextState: '1' } }, - ',': { - '*': { action_: { type_: 'insert', option: 'commaDecimal' } } }, - 'else2': { - '*': { action_: 'copy' } } - }), - actions: {} - }, - 'o': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': {} }, - '1/2$': { - '0': { action_: '1/2' } }, - 'else': { - '0': { nextState: '1', revisit: true } }, - 'letters': { - '*': { action_: 'rm' } }, - '\\ca': { - '*': { action_: { type_: 'insert', option: 'circa' } } }, - '\\x{}{}|\\x{}|\\x': { - '*': { action_: 'copy' } }, - '${(...)}$|$(...)$': { - '*': { action_: 'tex-math' } }, - '{(...)}': { - '*': { action_: '{text}' } }, - 'else2': { - '*': { action_: 'copy' } } - }), - actions: {} - }, - 'text': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': { action_: 'output' } }, - '{...}': { - '*': { action_: 'text=' } }, - '${(...)}$|$(...)$': { - '*': { action_: 'tex-math' } }, - '\\greek': { - '*': { action_: [ 'output', 'rm' ] } }, - '\\,|\\x{}{}|\\x{}|\\x': { - '*': { action_: [ 'output', 'copy' ] } }, - 'else': { - '*': { action_: 'text=' } } - }), - actions: { - 'output': function (buffer) { - if (buffer.text_) { - /** @type {ParserOutput} */ - var ret = { type_: 'text', p1: buffer.text_ }; - for (var p in buffer) { delete buffer[p]; } - return ret; - } - } - } - }, - 'pq': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': {} }, - 'state of aggregation $': { - '*': { action_: 'state of aggregation' } }, - 'i$': { - '0': { nextState: '!f', revisit: true } }, - '(KV letters),': { - '0': { action_: 'rm', nextState: '0' } }, - 'formula$': { - '0': { nextState: 'f', revisit: true } }, - '1/2$': { - '0': { action_: '1/2' } }, - 'else': { - '0': { nextState: '!f', revisit: true } }, - '${(...)}$|$(...)$': { - '*': { action_: 'tex-math' } }, - '{(...)}': { - '*': { action_: 'text' } }, - 'a-z': { - 'f': { action_: 'tex-math' } }, - 'letters': { - '*': { action_: 'rm' } }, - '-9.,9': { - '*': { action_: '9,9' } }, - ',': { - '*': { action_: { type_: 'insert+p1', option: 'comma enumeration S' } } }, - '\\color{(...)}{(...)}1|\\color(...){(...)}2': { - '*': { action_: 'color-output' } }, - '\\color{(...)}0': { - '*': { action_: 'color0-output' } }, - '\\ce{(...)}': { - '*': { action_: 'ce' } }, - '\\,|\\x{}{}|\\x{}|\\x': { - '*': { action_: 'copy' } }, - 'else2': { - '*': { action_: 'copy' } } - }), - actions: { - 'state of aggregation': function (buffer, m) { - return { type_: 'state of aggregation subscript', p1: mhchemParser.go(m, 'o') }; - }, - 'color-output': function (buffer, m) { - return { type_: 'color', color1: m[0], color2: mhchemParser.go(m[1], 'pq') }; - } - } - }, - 'bd': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': {} }, - 'x$': { - '0': { nextState: '!f', revisit: true } }, - 'formula$': { - '0': { nextState: 'f', revisit: true } }, - 'else': { - '0': { nextState: '!f', revisit: true } }, - '-9.,9 no missing 0': { - '*': { action_: '9,9' } }, - '.': { - '*': { action_: { type_: 'insert', option: 'electron dot' } } }, - 'a-z': { - 'f': { action_: 'tex-math' } }, - 'x': { - '*': { action_: { type_: 'insert', option: 'KV x' } } }, - 'letters': { - '*': { action_: 'rm' } }, - '\'': { - '*': { action_: { type_: 'insert', option: 'prime' } } }, - '${(...)}$|$(...)$': { - '*': { action_: 'tex-math' } }, - '{(...)}': { - '*': { action_: 'text' } }, - '\\color{(...)}{(...)}1|\\color(...){(...)}2': { - '*': { action_: 'color-output' } }, - '\\color{(...)}0': { - '*': { action_: 'color0-output' } }, - '\\ce{(...)}': { - '*': { action_: 'ce' } }, - '\\,|\\x{}{}|\\x{}|\\x': { - '*': { action_: 'copy' } }, - 'else2': { - '*': { action_: 'copy' } } - }), - actions: { - 'color-output': function (buffer, m) { - return { type_: 'color', color1: m[0], color2: mhchemParser.go(m[1], 'bd') }; - } - } - }, - 'oxidation': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': {} }, - 'roman numeral': { - '*': { action_: 'roman-numeral' } }, - '${(...)}$|$(...)$': { - '*': { action_: 'tex-math' } }, - 'else': { - '*': { action_: 'copy' } } - }), - actions: { - 'roman-numeral': function (buffer, m) { return { type_: 'roman numeral', p1: m || "" }; } - } - }, - 'tex-math': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': { action_: 'output' } }, - '\\ce{(...)}': { - '*': { action_: [ 'output', 'ce' ] } }, - '{...}|\\,|\\x{}{}|\\x{}|\\x': { - '*': { action_: 'o=' } }, - 'else': { - '*': { action_: 'o=' } } - }), - actions: { - 'output': function (buffer) { - if (buffer.o) { - /** @type {ParserOutput} */ - var ret = { type_: 'tex-math', p1: buffer.o }; - for (var p in buffer) { delete buffer[p]; } - return ret; - } - } - } - }, - 'tex-math tight': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': { action_: 'output' } }, - '\\ce{(...)}': { - '*': { action_: [ 'output', 'ce' ] } }, - '{...}|\\,|\\x{}{}|\\x{}|\\x': { - '*': { action_: 'o=' } }, - '-|+': { - '*': { action_: 'tight operator' } }, - 'else': { - '*': { action_: 'o=' } } - }), - actions: { - 'tight operator': function (buffer, m) { buffer.o = (buffer.o || "") + "{"+m+"}"; }, - 'output': function (buffer) { - if (buffer.o) { - /** @type {ParserOutput} */ - var ret = { type_: 'tex-math', p1: buffer.o }; - for (var p in buffer) { delete buffer[p]; } - return ret; - } - } - } - }, - '9,9': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': {} }, - ',': { - '*': { action_: 'comma' } }, - 'else': { - '*': { action_: 'copy' } } - }), - actions: { - 'comma': function () { return { type_: 'commaDecimal' }; } - } - }, - //#endregion - // - // \pu state machines - // - //#region pu - 'pu': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': { action_: 'output' } }, - 'space$': { - '*': { action_: [ 'output', 'space' ] } }, - '{[(|)]}': { - '0|a': { action_: 'copy' } }, - '(-)(9)^(-9)': { - '0': { action_: 'number^', nextState: 'a' } }, - '(-)(9.,9)(e)(99)': { - '0': { action_: 'enumber', nextState: 'a' } }, - 'space': { - '0|a': {} }, - 'pm-operator': { - '0|a': { action_: { type_: 'operator', option: '\\pm' }, nextState: '0' } }, - 'operator': { - '0|a': { action_: 'copy', nextState: '0' } }, - '//': { - 'd': { action_: 'o=', nextState: '/' } }, - '/': { - 'd': { action_: 'o=', nextState: '/' } }, - '{...}|else': { - '0|d': { action_: 'd=', nextState: 'd' }, - 'a': { action_: [ 'space', 'd=' ], nextState: 'd' }, - '/|q': { action_: 'q=', nextState: 'q' } } - }), - actions: { - 'enumber': function (buffer, m) { - /** @type {ParserOutput[]} */ - var ret = []; - if (m[0] === "+-" || m[0] === "+/-") { - ret.push("\\pm "); - } else if (m[0]) { - ret.push(m[0]); - } - if (m[1]) { - mhchemParser.concatArray(ret, mhchemParser.go(m[1], 'pu-9,9')); - if (m[2]) { - if (m[2].match(/[,.]/)) { - mhchemParser.concatArray(ret, mhchemParser.go(m[2], 'pu-9,9')); - } else { - ret.push(m[2]); - } - } - m[3] = m[4] || m[3]; - if (m[3]) { - m[3] = m[3].trim(); - if (m[3] === "e" || m[3].substr(0, 1) === "*") { - ret.push({ type_: 'cdot' }); - } else { - ret.push({ type_: 'times' }); - } - } - } - if (m[3]) { - ret.push("10^{"+m[5]+"}"); - } - return ret; - }, - 'number^': function (buffer, m) { - /** @type {ParserOutput[]} */ - var ret = []; - if (m[0] === "+-" || m[0] === "+/-") { - ret.push("\\pm "); - } else if (m[0]) { - ret.push(m[0]); - } - mhchemParser.concatArray(ret, mhchemParser.go(m[1], 'pu-9,9')); - ret.push("^{"+m[2]+"}"); - return ret; - }, - 'operator': function (buffer, m, p1) { return { type_: 'operator', kind_: (p1 || m) }; }, - 'space': function () { return { type_: 'pu-space-1' }; }, - 'output': function (buffer) { - /** @type {ParserOutput | ParserOutput[]} */ - var ret; - var md = mhchemParser.patterns.match_('{(...)}', buffer.d || ""); - if (md && md.remainder === '') { buffer.d = md.match_; } - var mq = mhchemParser.patterns.match_('{(...)}', buffer.q || ""); - if (mq && mq.remainder === '') { buffer.q = mq.match_; } - if (buffer.d) { - buffer.d = buffer.d.replace(/\u00B0C|\^oC|\^{o}C/g, "{}^{\\circ}C"); - buffer.d = buffer.d.replace(/\u00B0F|\^oF|\^{o}F/g, "{}^{\\circ}F"); - } - if (buffer.q) { // fraction - buffer.q = buffer.q.replace(/\u00B0C|\^oC|\^{o}C/g, "{}^{\\circ}C"); - buffer.q = buffer.q.replace(/\u00B0F|\^oF|\^{o}F/g, "{}^{\\circ}F"); - var b5 = { - d: mhchemParser.go(buffer.d, 'pu'), - q: mhchemParser.go(buffer.q, 'pu') - }; - if (buffer.o === '//') { - ret = { type_: 'pu-frac', p1: b5.d, p2: b5.q }; - } else { - ret = b5.d; - if (b5.d.length > 1 || b5.q.length > 1) { - ret.push({ type_: ' / ' }); - } else { - ret.push({ type_: '/' }); - } - mhchemParser.concatArray(ret, b5.q); - } - } else { // no fraction - ret = mhchemParser.go(buffer.d, 'pu-2'); - } - for (var p in buffer) { delete buffer[p]; } - return ret; - } - } - }, - 'pu-2': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '*': { action_: 'output' } }, - '*': { - '*': { action_: [ 'output', 'cdot' ], nextState: '0' } }, - '\\x': { - '*': { action_: 'rm=' } }, - 'space': { - '*': { action_: [ 'output', 'space' ], nextState: '0' } }, - '^{(...)}|^(-1)': { - '1': { action_: '^(-1)' } }, - '-9.,9': { - '0': { action_: 'rm=', nextState: '0' }, - '1': { action_: '^(-1)', nextState: '0' } }, - '{...}|else': { - '*': { action_: 'rm=', nextState: '1' } } - }), - actions: { - 'cdot': function () { return { type_: 'tight cdot' }; }, - '^(-1)': function (buffer, m) { buffer.rm += "^{"+m+"}"; }, - 'space': function () { return { type_: 'pu-space-2' }; }, - 'output': function (buffer) { - /** @type {ParserOutput | ParserOutput[]} */ - var ret = []; - if (buffer.rm) { - var mrm = mhchemParser.patterns.match_('{(...)}', buffer.rm || ""); - if (mrm && mrm.remainder === '') { - ret = mhchemParser.go(mrm.match_, 'pu'); - } else { - ret = { type_: 'rm', p1: buffer.rm }; - } - } - for (var p in buffer) { delete buffer[p]; } - return ret; - } - } - }, - 'pu-9,9': { - transitions: mhchemParser.createTransitions({ - 'empty': { - '0': { action_: 'output-0' }, - 'o': { action_: 'output-o' } }, - ',': { - '0': { action_: [ 'output-0', 'comma' ], nextState: 'o' } }, - '.': { - '0': { action_: [ 'output-0', 'copy' ], nextState: 'o' } }, - 'else': { - '*': { action_: 'text=' } } - }), - actions: { - 'comma': function () { return { type_: 'commaDecimal' }; }, - 'output-0': function (buffer) { - /** @type {ParserOutput[]} */ - var ret = []; - buffer.text_ = buffer.text_ || ""; - if (buffer.text_.length > 4) { - var a = buffer.text_.length % 3; - if (a === 0) { a = 3; } - for (var i=buffer.text_.length-3; i>0; i-=3) { - ret.push(buffer.text_.substr(i, 3)); - ret.push({ type_: '1000 separator' }); - } - ret.push(buffer.text_.substr(0, a)); - ret.reverse(); - } else { - ret.push(buffer.text_); - } - for (var p in buffer) { delete buffer[p]; } - return ret; - }, - 'output-o': function (buffer) { - /** @type {ParserOutput[]} */ - var ret = []; - buffer.text_ = buffer.text_ || ""; - if (buffer.text_.length > 4) { - var a = buffer.text_.length - 3; - for (var i=0; i, so we change \vphantom{X} to {} - // TODO: Reinstate \vphantom{X} when the Firefox bug is fixed. -// res += "{\\vphantom{X}}"; - res += "{{}}"; - res += "_{\\smash[t]{"+b5.q+"}}"; - } - } else { - if (b5.q) { - // TODO: Reinstate \vphantom{X} when the Firefox bug is fixed. -// res += "{\\vphantom{X}}"; - res += "{{}}"; - res += "_{\\smash[t]{"+b5.q+"}}"; - } - if (b5.d) { - // TODO: Reinstate \vphantom{X} when the Firefox bug is fixed. -// res += "{\\vphantom{X}}"; - res += "{{}}"; - res += "^{"+b5.d+"}"; - } - } - break; - case 'rm': - res = "\\mathrm{"+buf.p1+"}"; - break; - case 'text': - if (buf.p1.match(/[\^_]/)) { - buf.p1 = buf.p1.replace(" ", "~").replace("-", "\\text{-}"); - res = "\\mathrm{"+buf.p1+"}"; - } else { - res = "\\text{"+buf.p1+"}"; - } - break; - case 'roman numeral': - res = "\\mathrm{"+buf.p1+"}"; - break; - case 'state of aggregation': - res = "\\mskip2mu "+texify._goInner(buf.p1); - break; - case 'state of aggregation subscript': - res = "\\mskip1mu "+texify._goInner(buf.p1); - break; - case 'bond': - res = texify._getBond(buf.kind_); - if (!res) { - throw ["MhchemErrorBond", "mhchem Error. Unknown bond type (" + buf.kind_ + ")"]; - } - break; - case 'frac': - var c = "\\frac{" + buf.p1 + "}{" + buf.p2 + "}"; - res = "\\mathchoice{\\textstyle"+c+"}{"+c+"}{"+c+"}{"+c+"}"; - break; - case 'pu-frac': - var d = "\\frac{" + texify._goInner(buf.p1) + "}{" + texify._goInner(buf.p2) + "}"; - res = "\\mathchoice{\\textstyle"+d+"}{"+d+"}{"+d+"}{"+d+"}"; - break; - case 'tex-math': - res = buf.p1 + " "; - break; - case 'frac-ce': - res = "\\frac{" + texify._goInner(buf.p1) + "}{" + texify._goInner(buf.p2) + "}"; - break; - case 'overset': - res = "\\overset{" + texify._goInner(buf.p1) + "}{" + texify._goInner(buf.p2) + "}"; - break; - case 'underset': - res = "\\underset{" + texify._goInner(buf.p1) + "}{" + texify._goInner(buf.p2) + "}"; - break; - case 'underbrace': - res = "\\underbrace{" + texify._goInner(buf.p1) + "}_{" + texify._goInner(buf.p2) + "}"; - break; - case 'color': - res = "{\\color{" + buf.color1 + "}{" + texify._goInner(buf.color2) + "}}"; - break; - case 'color0': - res = "\\color{" + buf.color + "}"; - break; - case 'arrow': - var b6 = { - rd: texify._goInner(buf.rd), - rq: texify._goInner(buf.rq) - }; - var arrow = texify._getArrow(buf.r); - if (b6.rq) { arrow += "[{\\rm " + b6.rq + "}]"; } - if (b6.rd) { - arrow += "{\\rm " + b6.rd + "}"; - } else { - arrow += "{}"; - } - res = arrow; - break; - case 'operator': - res = texify._getOperator(buf.kind_); - break; - case '1st-level escape': - res = buf.p1+" "; // &, \\\\, \\hlin - break; - case 'space': - res = " "; - break; - case 'entitySkip': - res = "~"; - break; - case 'pu-space-1': - res = "~"; - break; - case 'pu-space-2': - res = "\\mkern3mu "; - break; - case '1000 separator': - res = "\\mkern2mu "; - break; - case 'commaDecimal': - res = "{,}"; - break; - case 'comma enumeration L': - res = "{"+buf.p1+"}\\mkern6mu "; - break; - case 'comma enumeration M': - res = "{"+buf.p1+"}\\mkern3mu "; - break; - case 'comma enumeration S': - res = "{"+buf.p1+"}\\mkern1mu "; - break; - case 'hyphen': - res = "\\text{-}"; - break; - case 'addition compound': - res = "\\,{\\cdot}\\,"; - break; - case 'electron dot': - res = "\\mkern1mu \\text{\\textbullet}\\mkern1mu "; - break; - case 'KV x': - res = "{\\times}"; - break; - case 'prime': - res = "\\prime "; - break; - case 'cdot': - res = "\\cdot "; - break; - case 'tight cdot': - res = "\\mkern1mu{\\cdot}\\mkern1mu "; - break; - case 'times': - res = "\\times "; - break; - case 'circa': - res = "{\\sim}"; - break; - case '^': - res = "uparrow"; - break; - case 'v': - res = "downarrow"; - break; - case 'ellipsis': - res = "\\ldots "; - break; - case '/': - res = "/"; - break; - case ' / ': - res = "\\,/\\,"; - break; - default: - assertNever(buf); - throw ["MhchemBugT", "mhchem bug T. Please report."]; // Missing texify rule or unknown MhchemParser output - } - assertString(res); - return res; - }, - _getArrow: function (a) { - switch (a) { - case "->": return "\\yields"; - case "\u2192": return "\\yields"; - case "\u27F6": return "\\yields"; - case "<-": return "\\yieldsLeft"; - case "<->": return "\\mesomerism"; - case "<-->": return "\\yieldsLeftRight"; - case "<=>": return "\\equilibrium"; - case "\u21CC": return "\\equilibrium"; - case "<=>>": return "\\equilibriumRight"; - case "<<=>": return "\\equilibriumLeft"; - default: - assertNever(a); - throw ["MhchemBugT", "mhchem bug T. Please report."]; - } - }, - _getBond: function (a) { - switch (a) { - case "-": return "{-}"; - case "1": return "{-}"; - case "=": return "{=}"; - case "2": return "{=}"; - case "#": return "{\\equiv}"; - case "3": return "{\\equiv}"; - case "~": return "{\\tripleDash}"; - case "~-": return "{\\tripleDashOverLine}"; - case "~=": return "{\\tripleDashOverDoubleLine}"; - case "~--": return "{\\tripleDashOverDoubleLine}"; - case "-~-": return "{\\tripleDashBetweenDoubleLine}"; - case "...": return "{{\\cdot}{\\cdot}{\\cdot}}"; - case "....": return "{{\\cdot}{\\cdot}{\\cdot}{\\cdot}}"; - case "->": return "{\\rightarrow}"; - case "<-": return "{\\leftarrow}"; - case "<": return "{<}"; - case ">": return "{>}"; - default: - assertNever(a); - throw ["MhchemBugT", "mhchem bug T. Please report."]; - } - }, - _getOperator: function (a) { - switch (a) { - case "+": return " {}+{} "; - case "-": return " {}-{} "; - case "=": return " {}={} "; - case "<": return " {}<{} "; - case ">": return " {}>{} "; - case "<<": return " {}\\ll{} "; - case ">>": return " {}\\gg{} "; - case "\\pm": return " {}\\pm{} "; - case "\\approx": return " {}\\approx{} "; - case "$\\approx$": return " {}\\approx{} "; - case "v": return " \\downarrow{} "; - case "(v)": return " \\downarrow{} "; - case "^": return " \\uparrow{} "; - case "(^)": return " \\uparrow{} "; - default: - assertNever(a); - throw ["MhchemBugT", "mhchem bug T. Please report."]; - } - } - }; - - // - // Helpers for code analysis - // Will show type error at calling position - // - /** @param {number} a */ - function assertNever(a) {} - /** @param {string} a */ - function assertString(a) {} - -/* eslint-disable no-undef */ - -////////////////////////////////////////////////////////////////////// -// texvc.sty - -// The texvc package contains macros available in mediawiki pages. -// We omit the functions deprecated at -// https://en.wikipedia.org/wiki/Help:Displaying_a_formula#Deprecated_syntax - -// We also omit texvc's \O, which conflicts with \text{\O} - -defineMacro("\\darr", "\\downarrow"); -defineMacro("\\dArr", "\\Downarrow"); -defineMacro("\\Darr", "\\Downarrow"); -defineMacro("\\lang", "\\langle"); -defineMacro("\\rang", "\\rangle"); -defineMacro("\\uarr", "\\uparrow"); -defineMacro("\\uArr", "\\Uparrow"); -defineMacro("\\Uarr", "\\Uparrow"); -defineMacro("\\N", "\\mathbb{N}"); -defineMacro("\\R", "\\mathbb{R}"); -defineMacro("\\Z", "\\mathbb{Z}"); -defineMacro("\\alef", "\\aleph"); -defineMacro("\\alefsym", "\\aleph"); -defineMacro("\\bull", "\\bullet"); -defineMacro("\\clubs", "\\clubsuit"); -defineMacro("\\cnums", "\\mathbb{C}"); -defineMacro("\\Complex", "\\mathbb{C}"); -defineMacro("\\Dagger", "\\ddagger"); -defineMacro("\\diamonds", "\\diamondsuit"); -defineMacro("\\empty", "\\emptyset"); -defineMacro("\\exist", "\\exists"); -defineMacro("\\harr", "\\leftrightarrow"); -defineMacro("\\hArr", "\\Leftrightarrow"); -defineMacro("\\Harr", "\\Leftrightarrow"); -defineMacro("\\hearts", "\\heartsuit"); -defineMacro("\\image", "\\Im"); -defineMacro("\\infin", "\\infty"); -defineMacro("\\isin", "\\in"); -defineMacro("\\larr", "\\leftarrow"); -defineMacro("\\lArr", "\\Leftarrow"); -defineMacro("\\Larr", "\\Leftarrow"); -defineMacro("\\lrarr", "\\leftrightarrow"); -defineMacro("\\lrArr", "\\Leftrightarrow"); -defineMacro("\\Lrarr", "\\Leftrightarrow"); -defineMacro("\\natnums", "\\mathbb{N}"); -defineMacro("\\plusmn", "\\pm"); -defineMacro("\\rarr", "\\rightarrow"); -defineMacro("\\rArr", "\\Rightarrow"); -defineMacro("\\Rarr", "\\Rightarrow"); -defineMacro("\\real", "\\Re"); -defineMacro("\\reals", "\\mathbb{R}"); -defineMacro("\\Reals", "\\mathbb{R}"); -defineMacro("\\sdot", "\\cdot"); -defineMacro("\\sect", "\\S"); -defineMacro("\\spades", "\\spadesuit"); -defineMacro("\\sub", "\\subset"); -defineMacro("\\sube", "\\subseteq"); -defineMacro("\\supe", "\\supseteq"); -defineMacro("\\thetasym", "\\vartheta"); -defineMacro("\\weierp", "\\wp"); - -/* eslint-disable no-undef */ - -/**************************************************** - * - * physics.js - * - * Implements the Physics Package for LaTeX input. - * - * --------------------------------------------------------------------- - * - * The original version of this file is licensed as follows: - * Copyright (c) 2015-2016 Kolen Cheung . - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * --------------------------------------------------------------------- - * - * This file has been revised from the original in the following ways: - * 1. The interface is changed so that it can be called from Temml, not MathJax. - * 2. \Re and \Im are not used, to avoid conflict with existing LaTeX letters. - * - * This revision of the file is released under the MIT license. - * https://mit-license.org/ - */ -defineMacro("\\quantity", "{\\left\\{ #1 \\right\\}}"); -defineMacro("\\qty", "{\\left\\{ #1 \\right\\}}"); -defineMacro("\\pqty", "{\\left( #1 \\right)}"); -defineMacro("\\bqty", "{\\left[ #1 \\right]}"); -defineMacro("\\vqty", "{\\left\\vert #1 \\right\\vert}"); -defineMacro("\\Bqty", "{\\left\\{ #1 \\right\\}}"); -defineMacro("\\absolutevalue", "{\\left\\vert #1 \\right\\vert}"); -defineMacro("\\abs", "{\\left\\vert #1 \\right\\vert}"); -defineMacro("\\norm", "{\\left\\Vert #1 \\right\\Vert}"); -defineMacro("\\evaluated", "{\\left.#1 \\right\\vert}"); -defineMacro("\\eval", "{\\left.#1 \\right\\vert}"); -defineMacro("\\order", "{\\mathcal{O} \\left( #1 \\right)}"); -defineMacro("\\commutator", "{\\left[ #1 , #2 \\right]}"); -defineMacro("\\comm", "{\\left[ #1 , #2 \\right]}"); -defineMacro("\\anticommutator", "{\\left\\{ #1 , #2 \\right\\}}"); -defineMacro("\\acomm", "{\\left\\{ #1 , #2 \\right\\}}"); -defineMacro("\\poissonbracket", "{\\left\\{ #1 , #2 \\right\\}}"); -defineMacro("\\pb", "{\\left\\{ #1 , #2 \\right\\}}"); -defineMacro("\\vectorbold", "{\\boldsymbol{ #1 }}"); -defineMacro("\\vb", "{\\boldsymbol{ #1 }}"); -defineMacro("\\vectorarrow", "{\\vec{\\boldsymbol{ #1 }}}"); -defineMacro("\\va", "{\\vec{\\boldsymbol{ #1 }}}"); -defineMacro("\\vectorunit", "{{\\boldsymbol{\\hat{ #1 }}}}"); -defineMacro("\\vu", "{{\\boldsymbol{\\hat{ #1 }}}}"); -defineMacro("\\dotproduct", "\\mathbin{\\boldsymbol\\cdot}"); -defineMacro("\\vdot", "{\\boldsymbol\\cdot}"); -defineMacro("\\crossproduct", "\\mathbin{\\boldsymbol\\times}"); -defineMacro("\\cross", "\\mathbin{\\boldsymbol\\times}"); -defineMacro("\\cp", "\\mathbin{\\boldsymbol\\times}"); -defineMacro("\\gradient", "{\\boldsymbol\\nabla}"); -defineMacro("\\grad", "{\\boldsymbol\\nabla}"); -defineMacro("\\divergence", "{\\grad\\vdot}"); -//defineMacro("\\div", "{\\grad\\vdot}"); Not included in Temml. Conflicts w/LaTeX \div -defineMacro("\\curl", "{\\grad\\cross}"); -defineMacro("\\laplacian", "\\nabla^2"); -defineMacro("\\tr", "{\\operatorname{tr}}"); -defineMacro("\\Tr", "{\\operatorname{Tr}}"); -defineMacro("\\rank", "{\\operatorname{rank}}"); -defineMacro("\\erf", "{\\operatorname{erf}}"); -defineMacro("\\Res", "{\\operatorname{Res}}"); -defineMacro("\\principalvalue", "{\\mathcal{P}}"); -defineMacro("\\pv", "{\\mathcal{P}}"); -defineMacro("\\PV", "{\\operatorname{P.V.}}"); -// Temml does not use the next two lines. They conflict with LaTeX letters. -//defineMacro("\\Re", "{\\operatorname{Re} \\left\\{ #1 \\right\\}}"); -//defineMacro("\\Im", "{\\operatorname{Im} \\left\\{ #1 \\right\\}}"); -defineMacro("\\qqtext", "{\\quad\\text{ #1 }\\quad}"); -defineMacro("\\qq", "{\\quad\\text{ #1 }\\quad}"); -defineMacro("\\qcomma", "{\\text{,}\\quad}"); -defineMacro("\\qc", "{\\text{,}\\quad}"); -defineMacro("\\qcc", "{\\quad\\text{c.c.}\\quad}"); -defineMacro("\\qif", "{\\quad\\text{if}\\quad}"); -defineMacro("\\qthen", "{\\quad\\text{then}\\quad}"); -defineMacro("\\qelse", "{\\quad\\text{else}\\quad}"); -defineMacro("\\qotherwise", "{\\quad\\text{otherwise}\\quad}"); -defineMacro("\\qunless", "{\\quad\\text{unless}\\quad}"); -defineMacro("\\qgiven", "{\\quad\\text{given}\\quad}"); -defineMacro("\\qusing", "{\\quad\\text{using}\\quad}"); -defineMacro("\\qassume", "{\\quad\\text{assume}\\quad}"); -defineMacro("\\qsince", "{\\quad\\text{since}\\quad}"); -defineMacro("\\qlet", "{\\quad\\text{let}\\quad}"); -defineMacro("\\qfor", "{\\quad\\text{for}\\quad}"); -defineMacro("\\qall", "{\\quad\\text{all}\\quad}"); -defineMacro("\\qeven", "{\\quad\\text{even}\\quad}"); -defineMacro("\\qodd", "{\\quad\\text{odd}\\quad}"); -defineMacro("\\qinteger", "{\\quad\\text{integer}\\quad}"); -defineMacro("\\qand", "{\\quad\\text{and}\\quad}"); -defineMacro("\\qor", "{\\quad\\text{or}\\quad}"); -defineMacro("\\qas", "{\\quad\\text{as}\\quad}"); -defineMacro("\\qin", "{\\quad\\text{in}\\quad}"); -defineMacro("\\differential", "{\\text{d}}"); -defineMacro("\\dd", "{\\text{d}}"); -defineMacro("\\derivative", "{\\frac{\\text{d}{ #1 }}{\\text{d}{ #2 }}}"); -defineMacro("\\dv", "{\\frac{\\text{d}{ #1 }}{\\text{d}{ #2 }}}"); -defineMacro("\\partialderivative", "{\\frac{\\partial{ #1 }}{\\partial{ #2 }}}"); -defineMacro("\\variation", "{\\delta}"); -defineMacro("\\var", "{\\delta}"); -defineMacro("\\functionalderivative", "{\\frac{\\delta{ #1 }}{\\delta{ #2 }}}"); -defineMacro("\\fdv", "{\\frac{\\delta{ #1 }}{\\delta{ #2 }}}"); -defineMacro("\\innerproduct", "{\\left\\langle {#1} \\mid { #2} \\right\\rangle}"); -defineMacro("\\outerproduct", - "{\\left\\vert { #1 } \\right\\rangle\\left\\langle { #2} \\right\\vert}"); -defineMacro("\\dyad", - "{\\left\\vert { #1 } \\right\\rangle\\left\\langle { #2} \\right\\vert}"); -defineMacro("\\ketbra", - "{\\left\\vert { #1 } \\right\\rangle\\left\\langle { #2} \\right\\vert}"); -defineMacro("\\op", - "{\\left\\vert { #1 } \\right\\rangle\\left\\langle { #2} \\right\\vert}"); -defineMacro("\\expectationvalue", "{\\left\\langle {#1 } \\right\\rangle}"); -defineMacro("\\expval", "{\\left\\langle {#1 } \\right\\rangle}"); -defineMacro("\\ev", "{\\left\\langle {#1 } \\right\\rangle}"); -defineMacro("\\matrixelement", - "{\\left\\langle{ #1 }\\right\\vert{ #2 }\\left\\vert{#3}\\right\\rangle}"); -defineMacro("\\matrixel", - "{\\left\\langle{ #1 }\\right\\vert{ #2 }\\left\\vert{#3}\\right\\rangle}"); -defineMacro("\\mel", - "{\\left\\langle{ #1 }\\right\\vert{ #2 }\\left\\vert{#3}\\right\\rangle}"); - -/** - * This file contains the “gullet” where macros are expanded - * until only non-macro tokens remain. - */ - -// List of commands that act like macros but aren't defined as a macro, -// function, or symbol. Used in `isDefined`. -const implicitCommands = { - "^": true, // Parser.js - _: true, // Parser.js - "\\limits": true, // Parser.js - "\\nolimits": true // Parser.js -}; - -class MacroExpander { - constructor(input, settings, mode) { - this.settings = settings; - this.expansionCount = 0; - this.feed(input); - // Make new global namespace - this.macros = new Namespace(macros, settings.macros); - this.mode = mode; - this.stack = []; // contains tokens in REVERSE order - } - - /** - * Feed a new input string to the same MacroExpander - * (with existing macros etc.). - */ - feed(input) { - this.lexer = new Lexer(input, this.settings); - } - - /** - * Switches between "text" and "math" modes. - */ - switchMode(newMode) { - this.mode = newMode; - } - - /** - * Start a new group nesting within all namespaces. - */ - beginGroup() { - this.macros.beginGroup(); - } - - /** - * End current group nesting within all namespaces. - */ - endGroup() { - this.macros.endGroup(); - } - - /** - * Returns the topmost token on the stack, without expanding it. - * Similar in behavior to TeX's `\futurelet`. - */ - future() { - if (this.stack.length === 0) { - this.pushToken(this.lexer.lex()); - } - return this.stack[this.stack.length - 1] - } - - /** - * Remove and return the next unexpanded token. - */ - popToken() { - this.future(); // ensure non-empty stack - return this.stack.pop(); - } - - /** - * Add a given token to the token stack. In particular, this get be used - * to put back a token returned from one of the other methods. - */ - pushToken(token) { - this.stack.push(token); - } - - /** - * Append an array of tokens to the token stack. - */ - pushTokens(tokens) { - this.stack.push(...tokens); - } - - /** - * Find an macro argument without expanding tokens and append the array of - * tokens to the token stack. Uses Token as a container for the result. - */ - scanArgument(isOptional) { - let start; - let end; - let tokens; - if (isOptional) { - this.consumeSpaces(); // \@ifnextchar gobbles any space following it - if (this.future().text !== "[") { - return null; - } - start = this.popToken(); // don't include [ in tokens - ({ tokens, end } = this.consumeArg(["]"])); - } else { - ({ tokens, start, end } = this.consumeArg()); - } - - // indicate the end of an argument - this.pushToken(new Token("EOF", end.loc)); - - this.pushTokens(tokens); - return start.range(end, ""); - } - - /** - * Consume all following space tokens, without expansion. - */ - consumeSpaces() { - for (;;) { - const token = this.future(); - if (token.text === " ") { - this.stack.pop(); - } else { - break; - } - } - } - - /** - * Consume an argument from the token stream, and return the resulting array - * of tokens and start/end token. - */ - consumeArg(delims) { - // The argument for a delimited parameter is the shortest (possibly - // empty) sequence of tokens with properly nested {...} groups that is - // followed ... by this particular list of non-parameter tokens. - // The argument for an undelimited parameter is the next nonblank - // token, unless that token is ‘{’, when the argument will be the - // entire {...} group that follows. - const tokens = []; - const isDelimited = delims && delims.length > 0; - if (!isDelimited) { - // Ignore spaces between arguments. As the TeXbook says: - // "After you have said ‘\def\row#1#2{...}’, you are allowed to - // put spaces between the arguments (e.g., ‘\row x n’), because - // TeX doesn’t use single spaces as undelimited arguments." - this.consumeSpaces(); - } - const start = this.future(); - let tok; - let depth = 0; - let match = 0; - do { - tok = this.popToken(); - tokens.push(tok); - if (tok.text === "{") { - ++depth; - } else if (tok.text === "}") { - --depth; - if (depth === -1) { - throw new ParseError("Extra }", tok); - } - } else if (tok.text === "EOF") { - throw new ParseError( - "Unexpected end of input in a macro argument" + - ", expected '" + - (delims && isDelimited ? delims[match] : "}") + - "'", - tok - ); - } - if (delims && isDelimited) { - if ((depth === 0 || (depth === 1 && delims[match] === "{")) && tok.text === delims[match]) { - ++match; - if (match === delims.length) { - // don't include delims in tokens - tokens.splice(-match, match); - break; - } - } else { - match = 0; - } - } - } while (depth !== 0 || isDelimited); - // If the argument found ... has the form ‘{}’, - // ... the outermost braces enclosing the argument are removed - if (start.text === "{" && tokens[tokens.length - 1].text === "}") { - tokens.pop(); - tokens.shift(); - } - tokens.reverse(); // to fit in with stack order - return { tokens, start, end: tok }; - } - - /** - * Consume the specified number of (delimited) arguments from the token - * stream and return the resulting array of arguments. - */ - consumeArgs(numArgs, delimiters) { - if (delimiters) { - if (delimiters.length !== numArgs + 1) { - throw new ParseError("The length of delimiters doesn't match the number of args!"); - } - const delims = delimiters[0]; - for (let i = 0; i < delims.length; i++) { - const tok = this.popToken(); - if (delims[i] !== tok.text) { - throw new ParseError("Use of the macro doesn't match its definition", tok); - } - } - } - - const args = []; - for (let i = 0; i < numArgs; i++) { - args.push(this.consumeArg(delimiters && delimiters[i + 1]).tokens); - } - return args; - } - - /** - * Expand the next token only once if possible. - * - * If the token is expanded, the resulting tokens will be pushed onto - * the stack in reverse order, and the number of such tokens will be - * returned. This number might be zero or positive. - * - * If not, the return value is `false`, and the next token remains at the - * top of the stack. - * - * In either case, the next token will be on the top of the stack, - * or the stack will be empty (in case of empty expansion - * and no other tokens). - * - * Used to implement `expandAfterFuture` and `expandNextToken`. - * - * If expandableOnly, only expandable tokens are expanded and - * an undefined control sequence results in an error. - */ - expandOnce(expandableOnly) { - const topToken = this.popToken(); - const name = topToken.text; - const expansion = !topToken.noexpand ? this._getExpansion(name) : null; - if (expansion == null || (expandableOnly && expansion.unexpandable)) { - if (expandableOnly && expansion == null && name[0] === "\\" && !this.isDefined(name)) { - throw new ParseError("Undefined control sequence: " + name); - } - this.pushToken(topToken); - return false; - } - this.expansionCount++; - if (this.expansionCount > this.settings.maxExpand) { - throw new ParseError( - "Too many expansions: infinite loop or " + "need to increase maxExpand setting" - ); - } - let tokens = expansion.tokens; - const args = this.consumeArgs(expansion.numArgs, expansion.delimiters); - if (expansion.numArgs) { - // paste arguments in place of the placeholders - tokens = tokens.slice(); // make a shallow copy - for (let i = tokens.length - 1; i >= 0; --i) { - let tok = tokens[i]; - if (tok.text === "#") { - if (i === 0) { - throw new ParseError("Incomplete placeholder at end of macro body", tok); - } - tok = tokens[--i]; // next token on stack - if (tok.text === "#") { - // ## → # - tokens.splice(i + 1, 1); // drop first # - } else if (/^[1-9]$/.test(tok.text)) { - // replace the placeholder with the indicated argument - tokens.splice(i, 2, ...args[+tok.text - 1]); - } else { - throw new ParseError("Not a valid argument number", tok); - } - } - } - } - // Concatenate expansion onto top of stack. - this.pushTokens(tokens); - return tokens.length; - } - - /** - * Expand the next token only once (if possible), and return the resulting - * top token on the stack (without removing anything from the stack). - * Similar in behavior to TeX's `\expandafter\futurelet`. - * Equivalent to expandOnce() followed by future(). - */ - expandAfterFuture() { - this.expandOnce(); - return this.future(); - } - - /** - * Recursively expand first token, then return first non-expandable token. - */ - expandNextToken() { - for (;;) { - if (this.expandOnce() === false) { // fully expanded - const token = this.stack.pop(); - // The token after \noexpand is interpreted as if its meaning were ‘\relax’ - if (token.treatAsRelax) { - token.text = "\\relax"; - } - return token - } - } - - // This pathway is impossible. - throw new Error(); // eslint-disable-line no-unreachable - } - - /** - * Fully expand the given macro name and return the resulting list of - * tokens, or return `undefined` if no such macro is defined. - */ - expandMacro(name) { - return this.macros.has(name) ? this.expandTokens([new Token(name)]) : undefined; - } - - /** - * Fully expand the given token stream and return the resulting list of - * tokens. Note that the input tokens are in reverse order, but the - * output tokens are in forward order. - */ - expandTokens(tokens) { - const output = []; - const oldStackLength = this.stack.length; - this.pushTokens(tokens); - while (this.stack.length > oldStackLength) { - // Expand only expandable tokens - if (this.expandOnce(true) === false) { // fully expanded - const token = this.stack.pop(); - if (token.treatAsRelax) { - // the expansion of \noexpand is the token itself - token.noexpand = false; - token.treatAsRelax = false; - } - output.push(token); - } - } - return output; - } - - /** - * Fully expand the given macro name and return the result as a string, - * or return `undefined` if no such macro is defined. - */ - expandMacroAsText(name) { - const tokens = this.expandMacro(name); - if (tokens) { - return tokens.map((token) => token.text).join(""); - } else { - return tokens; - } - } - - /** - * Returns the expanded macro as a reversed array of tokens and a macro - * argument count. Or returns `null` if no such macro. - */ - _getExpansion(name) { - const definition = this.macros.get(name); - if (definition == null) { - // mainly checking for undefined here - return definition; - } - // If a single character has an associated catcode other than 13 - // (active character), then don't expand it. - if (name.length === 1) { - const catcode = this.lexer.catcodes[name]; - if (catcode != null && catcode !== 13) { - return - } - } - const expansion = typeof definition === "function" ? definition(this) : definition; - if (typeof expansion === "string") { - let numArgs = 0; - if (expansion.indexOf("#") !== -1) { - const stripped = expansion.replace(/##/g, ""); - while (stripped.indexOf("#" + (numArgs + 1)) !== -1) { - ++numArgs; - } - } - const bodyLexer = new Lexer(expansion, this.settings); - const tokens = []; - let tok = bodyLexer.lex(); - while (tok.text !== "EOF") { - tokens.push(tok); - tok = bodyLexer.lex(); - } - tokens.reverse(); // to fit in with stack using push and pop - const expanded = { tokens, numArgs }; - return expanded; - } - - return expansion; - } - - /** - * Determine whether a command is currently "defined" (has some - * functionality), meaning that it's a macro (in the current group), - * a function, a symbol, or one of the special commands listed in - * `implicitCommands`. - */ - isDefined(name) { - return ( - this.macros.has(name) || - Object.prototype.hasOwnProperty.call(functions, name ) || - Object.prototype.hasOwnProperty.call(symbols.math, name ) || - Object.prototype.hasOwnProperty.call(symbols.text, name ) || - Object.prototype.hasOwnProperty.call(implicitCommands, name ) - ); - } - - /** - * Determine whether a command is expandable. - */ - isExpandable(name) { - const macro = this.macros.get(name); - return macro != null - ? typeof macro === "string" || typeof macro === "function" || !macro.unexpandable - : Object.prototype.hasOwnProperty.call(functions, name ) && !functions[name].primitive; - } -} - -// Helpers for Parser.js handling of Unicode (sub|super)script characters. - -const unicodeSubRegEx = /^[₊₋₌₍₎₀₁₂₃₄₅₆₇₈₉ₐₑₕᵢⱼₖₗₘₙₒₚᵣₛₜᵤᵥₓᵦᵧᵨᵩᵪ]/; - -const uSubsAndSups = Object.freeze({ - '₊': '+', - '₋': '-', - '₌': '=', - '₍': '(', - '₎': ')', - '₀': '0', - '₁': '1', - '₂': '2', - '₃': '3', - '₄': '4', - '₅': '5', - '₆': '6', - '₇': '7', - '₈': '8', - '₉': '9', - '\u2090': 'a', - '\u2091': 'e', - '\u2095': 'h', - '\u1D62': 'i', - '\u2C7C': 'j', - '\u2096': 'k', - '\u2097': 'l', - '\u2098': 'm', - '\u2099': 'n', - '\u2092': 'o', - '\u209A': 'p', - '\u1D63': 'r', - '\u209B': 's', - '\u209C': 't', - '\u1D64': 'u', - '\u1D65': 'v', - '\u2093': 'x', - '\u1D66': 'β', - '\u1D67': 'γ', - '\u1D68': 'ρ', - '\u1D69': '\u03d5', - '\u1D6A': 'χ', - '⁺': '+', - '⁻': '-', - '⁼': '=', - '⁽': '(', - '⁾': ')', - '⁰': '0', - '¹': '1', - '²': '2', - '³': '3', - '⁴': '4', - '⁵': '5', - '⁶': '6', - '⁷': '7', - '⁸': '8', - '⁹': '9', - '\u1D2C': 'A', - '\u1D2E': 'B', - '\u1D30': 'D', - '\u1D31': 'E', - '\u1D33': 'G', - '\u1D34': 'H', - '\u1D35': 'I', - '\u1D36': 'J', - '\u1D37': 'K', - '\u1D38': 'L', - '\u1D39': 'M', - '\u1D3A': 'N', - '\u1D3C': 'O', - '\u1D3E': 'P', - '\u1D3F': 'R', - '\u1D40': 'T', - '\u1D41': 'U', - '\u2C7D': 'V', - '\u1D42': 'W', - '\u1D43': 'a', - '\u1D47': 'b', - '\u1D9C': 'c', - '\u1D48': 'd', - '\u1D49': 'e', - '\u1DA0': 'f', - '\u1D4D': 'g', - '\u02B0': 'h', - '\u2071': 'i', - '\u02B2': 'j', - '\u1D4F': 'k', - '\u02E1': 'l', - '\u1D50': 'm', - '\u207F': 'n', - '\u1D52': 'o', - '\u1D56': 'p', - '\u02B3': 'r', - '\u02E2': 's', - '\u1D57': 't', - '\u1D58': 'u', - '\u1D5B': 'v', - '\u02B7': 'w', - '\u02E3': 'x', - '\u02B8': 'y', - '\u1DBB': 'z', - '\u1D5D': 'β', - '\u1D5E': 'γ', - '\u1D5F': 'δ', - '\u1D60': '\u03d5', - '\u1D61': 'χ', - '\u1DBF': 'θ' -}); - -// Used for Unicode input of calligraphic and script letters -const asciiFromScript = Object.freeze({ - "\ud835\udc9c": "A", - "\u212c": "B", - "\ud835\udc9e": "C", - "\ud835\udc9f": "D", - "\u2130": "E", - "\u2131": "F", - "\ud835\udca2": "G", - "\u210B": "H", - "\u2110": "I", - "\ud835\udca5": "J", - "\ud835\udca6": "K", - "\u2112": "L", - "\u2133": "M", - "\ud835\udca9": "N", - "\ud835\udcaa": "O", - "\ud835\udcab": "P", - "\ud835\udcac": "Q", - "\u211B": "R", - "\ud835\udcae": "S", - "\ud835\udcaf": "T", - "\ud835\udcb0": "U", - "\ud835\udcb1": "V", - "\ud835\udcb2": "W", - "\ud835\udcb3": "X", - "\ud835\udcb4": "Y", - "\ud835\udcb5": "Z" -}); - -// Mapping of Unicode accent characters to their LaTeX equivalent in text and -// math mode (when they exist). -var unicodeAccents = { - "\u0301": { text: "\\'", math: "\\acute" }, - "\u0300": { text: "\\`", math: "\\grave" }, - "\u0308": { text: '\\"', math: "\\ddot" }, - "\u0303": { text: "\\~", math: "\\tilde" }, - "\u0304": { text: "\\=", math: "\\bar" }, - "\u0306": { text: "\\u", math: "\\breve" }, - "\u030c": { text: "\\v", math: "\\check" }, - "\u0302": { text: "\\^", math: "\\hat" }, - "\u0307": { text: "\\.", math: "\\dot" }, - "\u030a": { text: "\\r", math: "\\mathring" }, - "\u030b": { text: "\\H" }, - '\u0327': { text: '\\c' } -}; - -var unicodeSymbols = { - "á": "á", - "à": "à", - "ä": "ä", - "ǟ": "ǟ", - "ã": "ã", - "ā": "ā", - "ă": "ă", - "ắ": "ắ", - "ằ": "ằ", - "ẵ": "ẵ", - "ǎ": "ǎ", - "â": "â", - "ấ": "ấ", - "ầ": "ầ", - "ẫ": "ẫ", - "ȧ": "ȧ", - "ǡ": "ǡ", - "å": "å", - "ǻ": "ǻ", - "ḃ": "ḃ", - "ć": "ć", - "č": "č", - "ĉ": "ĉ", - "ċ": "ċ", - "ď": "ď", - "ḋ": "ḋ", - "é": "é", - "è": "è", - "ë": "ë", - "ẽ": "ẽ", - "ē": "ē", - "ḗ": "ḗ", - "ḕ": "ḕ", - "ĕ": "ĕ", - "ě": "ě", - "ê": "ê", - "ế": "ế", - "ề": "ề", - "ễ": "ễ", - "ė": "ė", - "ḟ": "ḟ", - "ǵ": "ǵ", - "ḡ": "ḡ", - "ğ": "ğ", - "ǧ": "ǧ", - "ĝ": "ĝ", - "ġ": "ġ", - "ḧ": "ḧ", - "ȟ": "ȟ", - "ĥ": "ĥ", - "ḣ": "ḣ", - "í": "í", - "ì": "ì", - "ï": "ï", - "ḯ": "ḯ", - "ĩ": "ĩ", - "ī": "ī", - "ĭ": "ĭ", - "ǐ": "ǐ", - "î": "î", - "ǰ": "ǰ", - "ĵ": "ĵ", - "ḱ": "ḱ", - "ǩ": "ǩ", - "ĺ": "ĺ", - "ľ": "ľ", - "ḿ": "ḿ", - "ṁ": "ṁ", - "ń": "ń", - "ǹ": "ǹ", - "ñ": "ñ", - "ň": "ň", - "ṅ": "ṅ", - "ó": "ó", - "ò": "ò", - "ö": "ö", - "ȫ": "ȫ", - "õ": "õ", - "ṍ": "ṍ", - "ṏ": "ṏ", - "ȭ": "ȭ", - "ō": "ō", - "ṓ": "ṓ", - "ṑ": "ṑ", - "ŏ": "ŏ", - "ǒ": "ǒ", - "ô": "ô", - "ố": "ố", - "ồ": "ồ", - "ỗ": "ỗ", - "ȯ": "ȯ", - "ȱ": "ȱ", - "ő": "ő", - "ṕ": "ṕ", - "ṗ": "ṗ", - "ŕ": "ŕ", - "ř": "ř", - "ṙ": "ṙ", - "ś": "ś", - "ṥ": "ṥ", - "š": "š", - "ṧ": "ṧ", - "ŝ": "ŝ", - "ṡ": "ṡ", - "ẗ": "ẗ", - "ť": "ť", - "ṫ": "ṫ", - "ú": "ú", - "ù": "ù", - "ü": "ü", - "ǘ": "ǘ", - "ǜ": "ǜ", - "ǖ": "ǖ", - "ǚ": "ǚ", - "ũ": "ũ", - "ṹ": "ṹ", - "ū": "ū", - "ṻ": "ṻ", - "ŭ": "ŭ", - "ǔ": "ǔ", - "û": "û", - "ů": "ů", - "ű": "ű", - "ṽ": "ṽ", - "ẃ": "ẃ", - "ẁ": "ẁ", - "ẅ": "ẅ", - "ŵ": "ŵ", - "ẇ": "ẇ", - "ẘ": "ẘ", - "ẍ": "ẍ", - "ẋ": "ẋ", - "ý": "ý", - "ỳ": "ỳ", - "ÿ": "ÿ", - "ỹ": "ỹ", - "ȳ": "ȳ", - "ŷ": "ŷ", - "ẏ": "ẏ", - "ẙ": "ẙ", - "ź": "ź", - "ž": "ž", - "ẑ": "ẑ", - "ż": "ż", - "Á": "Á", - "À": "À", - "Ä": "Ä", - "Ǟ": "Ǟ", - "Ã": "Ã", - "Ā": "Ā", - "Ă": "Ă", - "Ắ": "Ắ", - "Ằ": "Ằ", - "Ẵ": "Ẵ", - "Ǎ": "Ǎ", - "Â": "Â", - "Ấ": "Ấ", - "Ầ": "Ầ", - "Ẫ": "Ẫ", - "Ȧ": "Ȧ", - "Ǡ": "Ǡ", - "Å": "Å", - "Ǻ": "Ǻ", - "Ḃ": "Ḃ", - "Ć": "Ć", - "Č": "Č", - "Ĉ": "Ĉ", - "Ċ": "Ċ", - "Ď": "Ď", - "Ḋ": "Ḋ", - "É": "É", - "È": "È", - "Ë": "Ë", - "Ẽ": "Ẽ", - "Ē": "Ē", - "Ḗ": "Ḗ", - "Ḕ": "Ḕ", - "Ĕ": "Ĕ", - "Ě": "Ě", - "Ê": "Ê", - "Ế": "Ế", - "Ề": "Ề", - "Ễ": "Ễ", - "Ė": "Ė", - "Ḟ": "Ḟ", - "Ǵ": "Ǵ", - "Ḡ": "Ḡ", - "Ğ": "Ğ", - "Ǧ": "Ǧ", - "Ĝ": "Ĝ", - "Ġ": "Ġ", - "Ḧ": "Ḧ", - "Ȟ": "Ȟ", - "Ĥ": "Ĥ", - "Ḣ": "Ḣ", - "Í": "Í", - "Ì": "Ì", - "Ï": "Ï", - "Ḯ": "Ḯ", - "Ĩ": "Ĩ", - "Ī": "Ī", - "Ĭ": "Ĭ", - "Ǐ": "Ǐ", - "Î": "Î", - "İ": "İ", - "Ĵ": "Ĵ", - "Ḱ": "Ḱ", - "Ǩ": "Ǩ", - "Ĺ": "Ĺ", - "Ľ": "Ľ", - "Ḿ": "Ḿ", - "Ṁ": "Ṁ", - "Ń": "Ń", - "Ǹ": "Ǹ", - "Ñ": "Ñ", - "Ň": "Ň", - "Ṅ": "Ṅ", - "Ó": "Ó", - "Ò": "Ò", - "Ö": "Ö", - "Ȫ": "Ȫ", - "Õ": "Õ", - "Ṍ": "Ṍ", - "Ṏ": "Ṏ", - "Ȭ": "Ȭ", - "Ō": "Ō", - "Ṓ": "Ṓ", - "Ṑ": "Ṑ", - "Ŏ": "Ŏ", - "Ǒ": "Ǒ", - "Ô": "Ô", - "Ố": "Ố", - "Ồ": "Ồ", - "Ỗ": "Ỗ", - "Ȯ": "Ȯ", - "Ȱ": "Ȱ", - "Ő": "Ő", - "Ṕ": "Ṕ", - "Ṗ": "Ṗ", - "Ŕ": "Ŕ", - "Ř": "Ř", - "Ṙ": "Ṙ", - "Ś": "Ś", - "Ṥ": "Ṥ", - "Š": "Š", - "Ṧ": "Ṧ", - "Ŝ": "Ŝ", - "Ṡ": "Ṡ", - "Ť": "Ť", - "Ṫ": "Ṫ", - "Ú": "Ú", - "Ù": "Ù", - "Ü": "Ü", - "Ǘ": "Ǘ", - "Ǜ": "Ǜ", - "Ǖ": "Ǖ", - "Ǚ": "Ǚ", - "Ũ": "Ũ", - "Ṹ": "Ṹ", - "Ū": "Ū", - "Ṻ": "Ṻ", - "Ŭ": "Ŭ", - "Ǔ": "Ǔ", - "Û": "Û", - "Ů": "Ů", - "Ű": "Ű", - "Ṽ": "Ṽ", - "Ẃ": "Ẃ", - "Ẁ": "Ẁ", - "Ẅ": "Ẅ", - "Ŵ": "Ŵ", - "Ẇ": "Ẇ", - "Ẍ": "Ẍ", - "Ẋ": "Ẋ", - "Ý": "Ý", - "Ỳ": "Ỳ", - "Ÿ": "Ÿ", - "Ỹ": "Ỹ", - "Ȳ": "Ȳ", - "Ŷ": "Ŷ", - "Ẏ": "Ẏ", - "Ź": "Ź", - "Ž": "Ž", - "Ẑ": "Ẑ", - "Ż": "Ż", - "ά": "ά", - "ὰ": "ὰ", - "ᾱ": "ᾱ", - "ᾰ": "ᾰ", - "έ": "έ", - "ὲ": "ὲ", - "ή": "ή", - "ὴ": "ὴ", - "ί": "ί", - "ὶ": "ὶ", - "ϊ": "ϊ", - "ΐ": "ΐ", - "ῒ": "ῒ", - "ῑ": "ῑ", - "ῐ": "ῐ", - "ό": "ό", - "ὸ": "ὸ", - "ύ": "ύ", - "ὺ": "ὺ", - "ϋ": "ϋ", - "ΰ": "ΰ", - "ῢ": "ῢ", - "ῡ": "ῡ", - "ῠ": "ῠ", - "ώ": "ώ", - "ὼ": "ὼ", - "Ύ": "Ύ", - "Ὺ": "Ὺ", - "Ϋ": "Ϋ", - "Ῡ": "Ῡ", - "Ῠ": "Ῠ", - "Ώ": "Ώ", - "Ὼ": "Ὼ" -}; - -/* eslint no-constant-condition:0 */ - -const binLeftCancellers = ["bin", "op", "open", "punct", "rel"]; - -/** - * This file contains the parser used to parse out a TeX expression from the - * input. Since TeX isn't context-free, standard parsers don't work particularly - * well. - * - * The strategy of this parser is as such: - * - * The main functions (the `.parse...` ones) take a position in the current - * parse string to parse tokens from. The lexer (found in Lexer.js, stored at - * this.gullet.lexer) also supports pulling out tokens at arbitrary places. When - * individual tokens are needed at a position, the lexer is called to pull out a - * token, which is then used. - * - * The parser has a property called "mode" indicating the mode that - * the parser is currently in. Currently it has to be one of "math" or - * "text", which denotes whether the current environment is a math-y - * one or a text-y one (e.g. inside \text). Currently, this serves to - * limit the functions which can be used in text mode. - * - * The main functions then return an object which contains the useful data that - * was parsed at its given point, and a new position at the end of the parsed - * data. The main functions can call each other and continue the parsing by - * using the returned position as a new starting point. - * - * There are also extra `.handle...` functions, which pull out some reused - * functionality into self-contained functions. - * - * The functions return ParseNodes. - */ - -class Parser { - constructor(input, settings, isPreamble = false) { - // Start in math mode - this.mode = "math"; - // Create a new macro expander (gullet) and (indirectly via that) also a - // new lexer (mouth) for this parser (stomach, in the language of TeX) - this.gullet = new MacroExpander(input, settings, this.mode); - // Store the settings for use in parsing - this.settings = settings; - // Are we defining a preamble? - this.isPreamble = isPreamble; - // Count leftright depth (for \middle errors) - this.leftrightDepth = 0; - this.prevAtomType = ""; - } - - /** - * Checks a result to make sure it has the right type, and throws an - * appropriate error otherwise. - */ - expect(text, consume = true) { - if (this.fetch().text !== text) { - throw new ParseError(`Expected '${text}', got '${this.fetch().text}'`, this.fetch()); - } - if (consume) { - this.consume(); - } - } - - /** - * Discards the current lookahead token, considering it consumed. - */ - consume() { - this.nextToken = null; - } - - /** - * Return the current lookahead token, or if there isn't one (at the - * beginning, or if the previous lookahead token was consume()d), - * fetch the next token as the new lookahead token and return it. - */ - fetch() { - if (this.nextToken == null) { - this.nextToken = this.gullet.expandNextToken(); - } - return this.nextToken; - } - - /** - * Switches between "text" and "math" modes. - */ - switchMode(newMode) { - this.mode = newMode; - this.gullet.switchMode(newMode); - } - - /** - * Main parsing function, which parses an entire input. - */ - parse() { - // Create a group namespace for every $...$, $$...$$, \[...\].) - // A \def is then valid only within that pair of delimiters. - this.gullet.beginGroup(); - - if (this.settings.colorIsTextColor) { - // Use old \color behavior (same as LaTeX's \textcolor) if requested. - // We do this within the group for the math expression, so it doesn't - // pollute settings.macros. - this.gullet.macros.set("\\color", "\\textcolor"); - } - - // Try to parse the input - const parse = this.parseExpression(false); - - // If we succeeded, make sure there's an EOF at the end - this.expect("EOF"); - - if (this.isPreamble) { - const macros = Object.create(null); - Object.entries(this.gullet.macros.current).forEach(([key, value]) => { - macros[key] = value; - }); - this.gullet.endGroup(); - return macros - } - - // The only local macro that we want to save is from \tag. - const tag = this.gullet.macros.get("\\df@tag"); - - // End the group namespace for the expression - this.gullet.endGroup(); - - if (tag) { this.gullet.macros.current["\\df@tag"] = tag; } - - return parse; - } - - static get endOfExpression() { - return ["}", "\\endgroup", "\\end", "\\right", "\\endtoggle", "&"]; - } - - /** - * Fully parse a separate sequence of tokens as a separate job. - * Tokens should be specified in reverse order, as in a MacroDefinition. - */ - subparse(tokens) { - // Save the next token from the current job. - const oldToken = this.nextToken; - this.consume(); - - // Run the new job, terminating it with an excess '}' - this.gullet.pushToken(new Token("}")); - this.gullet.pushTokens(tokens); - const parse = this.parseExpression(false); - this.expect("}"); - - // Restore the next token from the current job. - this.nextToken = oldToken; - - return parse; - } - -/** - * Parses an "expression", which is a list of atoms. - * - * `breakOnInfix`: Should the parsing stop when we hit infix nodes? This - * happens when functions have higher precedence han infix - * nodes in implicit parses. - * - * `breakOnTokenText`: The text of the token that the expression should end - * with, or `null` if something else should end the - * expression. - * - * `breakOnMiddle`: \color, \over, and old styling functions work on an implicit group. - * These groups end just before the usual tokens, but they also - * end just before `\middle`. - */ - parseExpression(breakOnInfix, breakOnTokenText, breakOnMiddle) { - const body = []; - // Keep adding atoms to the body until we can't parse any more atoms (either - // we reached the end, a }, or a \right) - while (true) { - // Ignore spaces in math mode - if (this.mode === "math") { - this.consumeSpaces(); - } - const lex = this.fetch(); - if (Parser.endOfExpression.indexOf(lex.text) !== -1) { - break; - } - if (breakOnTokenText && lex.text === breakOnTokenText) { - break; - } - if (breakOnMiddle && lex.text === "\\middle") { - break - } - if (breakOnInfix && functions[lex.text] && functions[lex.text].infix) { - break; - } - const atom = this.parseAtom(breakOnTokenText); - if (!atom) { - break; - } else if (atom.type === "internal") { - continue; - } - body.push(atom); - // Keep a record of the atom type, so that op.js can set correct spacing. - this.prevAtomType = atom.type === "atom" ? atom.family : atom.type; - } - if (this.mode === "text") { - this.formLigatures(body); - } - return this.handleInfixNodes(body); - } - - /** - * Rewrites infix operators such as \over with corresponding commands such - * as \frac. - * - * There can only be one infix operator per group. If there's more than one - * then the expression is ambiguous. This can be resolved by adding {}. - */ - handleInfixNodes(body) { - let overIndex = -1; - let funcName; - - for (let i = 0; i < body.length; i++) { - if (body[i].type === "infix") { - if (overIndex !== -1) { - throw new ParseError("only one infix operator per group", body[i].token); - } - overIndex = i; - funcName = body[i].replaceWith; - } - } - - if (overIndex !== -1 && funcName) { - let numerNode; - let denomNode; - - const numerBody = body.slice(0, overIndex); - const denomBody = body.slice(overIndex + 1); - - if (numerBody.length === 1 && numerBody[0].type === "ordgroup") { - numerNode = numerBody[0]; - } else { - numerNode = { type: "ordgroup", mode: this.mode, body: numerBody }; - } - - if (denomBody.length === 1 && denomBody[0].type === "ordgroup") { - denomNode = denomBody[0]; - } else { - denomNode = { type: "ordgroup", mode: this.mode, body: denomBody }; - } - - let node; - if (funcName === "\\\\abovefrac") { - node = this.callFunction(funcName, [numerNode, body[overIndex], denomNode], []); - } else { - node = this.callFunction(funcName, [numerNode, denomNode], []); - } - return [node]; - } else { - return body; - } - } - - /** - * Handle a subscript or superscript with nice errors. - */ - handleSupSubscript( - name // For error reporting. - ) { - const symbolToken = this.fetch(); - const symbol = symbolToken.text; - this.consume(); - this.consumeSpaces(); // ignore spaces before sup/subscript argument - const group = this.parseGroup(name); - - if (!group) { - throw new ParseError("Expected group after '" + symbol + "'", symbolToken); - } - - return group; - } - - /** - * Converts the textual input of an unsupported command into a text node - * contained within a color node whose color is determined by errorColor - */ - formatUnsupportedCmd(text) { - const textordArray = []; - - for (let i = 0; i < text.length; i++) { - textordArray.push({ type: "textord", mode: "text", text: text[i] }); - } - - const textNode = { - type: "text", - mode: this.mode, - body: textordArray - }; - - const colorNode = { - type: "color", - mode: this.mode, - color: this.settings.errorColor, - body: [textNode] - }; - - return colorNode; - } - - /** - * Parses a group with optional super/subscripts. - */ - parseAtom(breakOnTokenText) { - // The body of an atom is an implicit group, so that things like - // \left(x\right)^2 work correctly. - const base = this.parseGroup("atom", breakOnTokenText); - - // In text mode, we don't have superscripts or subscripts - if (this.mode === "text") { - return base; - } - - // Note that base may be empty (i.e. null) at this point. - - let superscript; - let subscript; - while (true) { - // Guaranteed in math mode, so eat any spaces first. - this.consumeSpaces(); - - // Lex the first token - const lex = this.fetch(); - - if (lex.text === "\\limits" || lex.text === "\\nolimits") { - // We got a limit control - if (base && base.type === "op") { - const limits = lex.text === "\\limits"; - base.limits = limits; - base.alwaysHandleSupSub = true; - } else if (base && base.type === "operatorname") { - if (base.alwaysHandleSupSub) { - base.limits = lex.text === "\\limits"; - } - } else { - throw new ParseError("Limit controls must follow a math operator", lex); - } - this.consume(); - } else if (lex.text === "^") { - // We got a superscript start - if (superscript) { - throw new ParseError("Double superscript", lex); - } - superscript = this.handleSupSubscript("superscript"); - } else if (lex.text === "_") { - // We got a subscript start - if (subscript) { - throw new ParseError("Double subscript", lex); - } - subscript = this.handleSupSubscript("subscript"); - } else if (lex.text === "'") { - // We got a prime - if (superscript) { - throw new ParseError("Double superscript", lex); - } - const prime = { type: "textord", mode: this.mode, text: "\\prime" }; - - // Many primes can be grouped together, so we handle this here - const primes = [prime]; - this.consume(); - // Keep lexing tokens until we get something that's not a prime - while (this.fetch().text === "'") { - // For each one, add another prime to the list - primes.push(prime); - this.consume(); - } - // If there's a superscript following the primes, combine that - // superscript in with the primes. - if (this.fetch().text === "^") { - primes.push(this.handleSupSubscript("superscript")); - } - // Put everything into an ordgroup as the superscript - superscript = { type: "ordgroup", mode: this.mode, body: primes }; - } else if (uSubsAndSups[lex.text]) { - // A Unicode subscript or superscript character. - // We treat these similarly to the unicode-math package. - // So we render a string of Unicode (sub|super)scripts the - // same as a (sub|super)script of regular characters. - const isSub = unicodeSubRegEx.test(lex.text); - const subsupTokens = []; - subsupTokens.push(new Token(uSubsAndSups[lex.text])); - this.consume(); - // Continue fetching tokens to fill out the group. - while (true) { - const token = this.fetch().text; - if (!(uSubsAndSups[token])) { break } - if (unicodeSubRegEx.test(token) !== isSub) { break } - subsupTokens.unshift(new Token(uSubsAndSups[token])); - this.consume(); - } - // Now create a (sub|super)script. - const body = this.subparse(subsupTokens); - if (isSub) { - subscript = { type: "ordgroup", mode: "math", body }; - } else { - superscript = { type: "ordgroup", mode: "math", body }; - } - } else { - // If it wasn't ^, _, a Unicode (sub|super)script, or ', stop parsing super/subscripts - break; - } - } - - if (superscript || subscript) { - if (base && base.type === "multiscript" && !base.postscripts) { - // base is the result of a \prescript function. - // Write the sub- & superscripts into the multiscript element. - base.postscripts = { sup: superscript, sub: subscript }; - return base - } else { - // We got either a superscript or subscript, create a supsub - const isFollowedByDelimiter = (!base || base.type !== "op" && base.type !== "operatorname") - ? undefined - : isDelimiter(this.nextToken.text); - return { - type: "supsub", - mode: this.mode, - base: base, - sup: superscript, - sub: subscript, - isFollowedByDelimiter - } - } - } else { - // Otherwise return the original body - return base; - } - } - - /** - * Parses an entire function, including its base and all of its arguments. - */ - parseFunction( - breakOnTokenText, - name // For determining its context - ) { - const token = this.fetch(); - const func = token.text; - const funcData = functions[func]; - if (!funcData) { - return null; - } - this.consume(); // consume command token - - if (name && name !== "atom" && !funcData.allowedInArgument) { - throw new ParseError( - "Got function '" + func + "' with no arguments" + (name ? " as " + name : ""), - token - ); - } else if (this.mode === "text" && !funcData.allowedInText) { - throw new ParseError("Can't use function '" + func + "' in text mode", token); - } else if (this.mode === "math" && funcData.allowedInMath === false) { - throw new ParseError("Can't use function '" + func + "' in math mode", token); - } - - const prevAtomType = this.prevAtomType; - const { args, optArgs } = this.parseArguments(func, funcData); - this.prevAtomType = prevAtomType; - return this.callFunction(func, args, optArgs, token, breakOnTokenText); - } - - /** - * Call a function handler with a suitable context and arguments. - */ - callFunction(name, args, optArgs, token, breakOnTokenText) { - const context = { - funcName: name, - parser: this, - token, - breakOnTokenText - }; - const func = functions[name]; - if (func && func.handler) { - return func.handler(context, args, optArgs); - } else { - throw new ParseError(`No function handler for ${name}`); - } - } - - /** - * Parses the arguments of a function or environment - */ - parseArguments( - func, // Should look like "\name" or "\begin{name}". - funcData - ) { - const totalArgs = funcData.numArgs + funcData.numOptionalArgs; - if (totalArgs === 0) { - return { args: [], optArgs: [] }; - } - - const args = []; - const optArgs = []; - - for (let i = 0; i < totalArgs; i++) { - let argType = funcData.argTypes && funcData.argTypes[i]; - const isOptional = i < funcData.numOptionalArgs; - - if ( - (funcData.primitive && argType == null) || - // \sqrt expands into primitive if optional argument doesn't exist - (funcData.type === "sqrt" && i === 1 && optArgs[0] == null) - ) { - argType = "primitive"; - } - - const arg = this.parseGroupOfType(`argument to '${func}'`, argType, isOptional); - if (isOptional) { - optArgs.push(arg); - } else if (arg != null) { - args.push(arg); - } else { - // should be unreachable - throw new ParseError("Null argument, please report this as a bug"); - } - } - - return { args, optArgs }; - } - - /** - * Parses a group when the mode is changing. - */ - parseGroupOfType(name, type, optional) { - switch (type) { - case "size": - return this.parseSizeGroup(optional); - case "url": - return this.parseUrlGroup(optional); - case "math": - case "text": - return this.parseArgumentGroup(optional, type); - case "hbox": { - // hbox argument type wraps the argument in the equivalent of - // \hbox, which is like \text but switching to \textstyle size. - const group = this.parseArgumentGroup(optional, "text"); - return group != null - ? { - type: "styling", - mode: group.mode, - body: [group], - scriptLevel: "text" // simulate \textstyle - } - : null; - } - case "raw": { - const token = this.parseStringGroup("raw", optional); - return token != null - ? { - type: "raw", - mode: "text", - string: token.text - } - : null; - } - case "primitive": { - if (optional) { - throw new ParseError("A primitive argument cannot be optional"); - } - const group = this.parseGroup(name); - if (group == null) { - throw new ParseError("Expected group as " + name, this.fetch()); - } - return group; - } - case "original": - case null: - case undefined: - return this.parseArgumentGroup(optional); - default: - throw new ParseError("Unknown group type as " + name, this.fetch()); - } - } - - /** - * Discard any space tokens, fetching the next non-space token. - */ - consumeSpaces() { - while (true) { - const ch = this.fetch().text; - // \ufe0e is the Unicode variation selector to supress emoji. Ignore it. - if (ch === " " || ch === "\u00a0" || ch === "\ufe0e") { - this.consume(); - } else { - break - } - } - } - - /** - * Parses a group, essentially returning the string formed by the - * brace-enclosed tokens plus some position information. - */ - parseStringGroup( - modeName, // Used to describe the mode in error messages. - optional - ) { - const argToken = this.gullet.scanArgument(optional); - if (argToken == null) { - return null; - } - let str = ""; - let nextToken; - while ((nextToken = this.fetch()).text !== "EOF") { - str += nextToken.text; - this.consume(); - } - this.consume(); // consume the end of the argument - argToken.text = str; - return argToken; - } - - /** - * Parses a regex-delimited group: the largest sequence of tokens - * whose concatenated strings match `regex`. Returns the string - * formed by the tokens plus some position information. - */ - parseRegexGroup( - regex, - modeName // Used to describe the mode in error messages. - ) { - const firstToken = this.fetch(); - let lastToken = firstToken; - let str = ""; - let nextToken; - while ((nextToken = this.fetch()).text !== "EOF" && regex.test(str + nextToken.text)) { - lastToken = nextToken; - str += lastToken.text; - this.consume(); - } - if (str === "") { - throw new ParseError("Invalid " + modeName + ": '" + firstToken.text + "'", firstToken); - } - return firstToken.range(lastToken, str); - } - - /** - * Parses a size specification, consisting of magnitude and unit. - */ - parseSizeGroup(optional) { - let res; - let isBlank = false; - // don't expand before parseStringGroup - this.gullet.consumeSpaces(); - if (!optional && this.gullet.future().text !== "{") { - res = this.parseRegexGroup(/^[-+]? *(?:$|\d+|\d+\.\d*|\.\d*) *[a-z]{0,2} *$/, "size"); - } else { - res = this.parseStringGroup("size", optional); - } - if (!res) { - return null; - } - if (!optional && res.text.length === 0) { - // Because we've tested for what is !optional, this block won't - // affect \kern, \hspace, etc. It will capture the mandatory arguments - // to \genfrac and \above. - res.text = "0pt"; // Enable \above{} - isBlank = true; // This is here specifically for \genfrac - } - const match = /([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(res.text); - if (!match) { - throw new ParseError("Invalid size: '" + res.text + "'", res); - } - const data = { - number: +(match[1] + match[2]), // sign + magnitude, cast to number - unit: match[3] - }; - if (!validUnit(data)) { - throw new ParseError("Invalid unit: '" + data.unit + "'", res); - } - return { - type: "size", - mode: this.mode, - value: data, - isBlank - }; - } - - /** - * Parses an URL, checking escaped letters and allowed protocols, - * and setting the catcode of % as an active character (as in \hyperref). - */ - parseUrlGroup(optional) { - this.gullet.lexer.setCatcode("%", 13); // active character - this.gullet.lexer.setCatcode("~", 12); // other character - const res = this.parseStringGroup("url", optional); - this.gullet.lexer.setCatcode("%", 14); // comment character - this.gullet.lexer.setCatcode("~", 13); // active character - if (res == null) { - return null; - } - // hyperref package allows backslashes alone in href, but doesn't - // generate valid links in such cases; we interpret this as - // "undefined" behaviour, and keep them as-is. Some browser will - // replace backslashes with forward slashes. - let url = res.text.replace(/\\([#$%&~_^{}])/g, "$1"); - url = res.text.replace(/{\u2044}/g, "/"); - return { - type: "url", - mode: this.mode, - url - }; - } - - /** - * Parses an argument with the mode specified. - */ - parseArgumentGroup(optional, mode) { - const argToken = this.gullet.scanArgument(optional); - if (argToken == null) { - return null; - } - const outerMode = this.mode; - if (mode) { - // Switch to specified mode - this.switchMode(mode); - } - - this.gullet.beginGroup(); - const expression = this.parseExpression(false, "EOF"); - // TODO: find an alternative way to denote the end - this.expect("EOF"); // expect the end of the argument - this.gullet.endGroup(); - const result = { - type: "ordgroup", - mode: this.mode, - loc: argToken.loc, - body: expression - }; - - if (mode) { - // Switch mode back - this.switchMode(outerMode); - } - return result; - } - - /** - * Parses an ordinary group, which is either a single nucleus (like "x") - * or an expression in braces (like "{x+y}") or an implicit group, a group - * that starts at the current position, and ends right before a higher explicit - * group ends, or at EOF. - */ - parseGroup( - name, // For error reporting. - breakOnTokenText - ) { - const firstToken = this.fetch(); - const text = firstToken.text; - - let result; - // Try to parse an open brace or \begingroup - if (text === "{" || text === "\\begingroup" || text === "\\toggle") { - this.consume(); - const groupEnd = text === "{" - ? "}" - : text === "\\begingroup" - ? "\\endgroup" - : "\\endtoggle"; - - this.gullet.beginGroup(); - // If we get a brace, parse an expression - const expression = this.parseExpression(false, groupEnd); - const lastToken = this.fetch(); - this.expect(groupEnd); // Check that we got a matching closing brace - this.gullet.endGroup(); - result = { - type: (lastToken.text === "\\endtoggle" ? "toggle" : "ordgroup"), - mode: this.mode, - loc: SourceLocation.range(firstToken, lastToken), - body: expression, - // A group formed by \begingroup...\endgroup is a semi-simple group - // which doesn't affect spacing in math mode, i.e., is transparent. - // https://tex.stackexchange.com/questions/1930/ - semisimple: text === "\\begingroup" || undefined - }; - } else { - // If there exists a function with this name, parse the function. - // Otherwise, just return a nucleus - result = this.parseFunction(breakOnTokenText, name) || this.parseSymbol(); - if (result == null && text[0] === "\\" && - !Object.prototype.hasOwnProperty.call(implicitCommands, text )) { - result = this.formatUnsupportedCmd(text); - this.consume(); - } - } - return result; - } - - /** - * Form ligature-like combinations of characters for text mode. - * This includes inputs like "--", "---", "``" and "''". - * The result will simply replace multiple textord nodes with a single - * character in each value by a single textord node having multiple - * characters in its value. The representation is still ASCII source. - * The group will be modified in place. - */ - formLigatures(group) { - let n = group.length - 1; - for (let i = 0; i < n; ++i) { - const a = group[i]; - const v = a.text; - if (v === "-" && group[i + 1].text === "-") { - if (i + 1 < n && group[i + 2].text === "-") { - group.splice(i, 3, { - type: "textord", - mode: "text", - loc: SourceLocation.range(a, group[i + 2]), - text: "---" - }); - n -= 2; - } else { - group.splice(i, 2, { - type: "textord", - mode: "text", - loc: SourceLocation.range(a, group[i + 1]), - text: "--" - }); - n -= 1; - } - } - if ((v === "'" || v === "`") && group[i + 1].text === v) { - group.splice(i, 2, { - type: "textord", - mode: "text", - loc: SourceLocation.range(a, group[i + 1]), - text: v + v - }); - n -= 1; - } - } - } - - /** - * Parse a single symbol out of the string. Here, we handle single character - * symbols and special functions like \verb. - */ - parseSymbol() { - const nucleus = this.fetch(); - let text = nucleus.text; - - if (/^\\verb[^a-zA-Z]/.test(text)) { - this.consume(); - let arg = text.slice(5); - const star = arg.charAt(0) === "*"; - if (star) { - arg = arg.slice(1); - } - // Lexer's tokenRegex is constructed to always have matching - // first/last characters. - if (arg.length < 2 || arg.charAt(0) !== arg.slice(-1)) { - throw new ParseError(`\\verb assertion failed -- - please report what input caused this bug`); - } - arg = arg.slice(1, -1); // remove first and last char - return { - type: "verb", - mode: "text", - body: arg, - star - }; - } - // At this point, we should have a symbol, possibly with accents. - // First expand any accented base symbol according to unicodeSymbols. - if (Object.prototype.hasOwnProperty.call(unicodeSymbols, text[0]) && - !symbols[this.mode][text[0]]) { - // This behavior is not strict (XeTeX-compatible) in math mode. - if (this.settings.strict && this.mode === "math") { - throw new ParseError(`Accented Unicode text character "${text[0]}" used in ` + `math mode`, - nucleus - ); - } - text = unicodeSymbols[text[0]] + text.slice(1); - } - // Strip off any combining characters - const match = combiningDiacriticalMarksEndRegex.exec(text); - if (match) { - text = text.substring(0, match.index); - if (text === "i") { - text = "\u0131"; // dotless i, in math and text mode - } else if (text === "j") { - text = "\u0237"; // dotless j, in math and text mode - } - } - // Recognize base symbol - let symbol; - if (symbols[this.mode][text]) { - let group = symbols[this.mode][text].group; - if (group === "bin" && binLeftCancellers.includes(this.prevAtomType)) { - // Change from a binary operator to a unary (prefix) operator - group = "open"; - } - const loc = SourceLocation.range(nucleus); - let s; - if (Object.prototype.hasOwnProperty.call(ATOMS, group )) { - const family = group; - s = { - type: "atom", - mode: this.mode, - family, - loc, - text - }; - } else { - if (asciiFromScript[text]) { - // Unicode 14 disambiguates chancery from roundhand. - // See https://www.unicode.org/charts/PDF/U1D400.pdf - this.consume(); - const nextCode = this.fetch().text.charCodeAt(0); - // mathcal is Temml default. Use mathscript if called for. - const font = nextCode === 0xfe01 ? "mathscr" : "mathcal"; - if (nextCode === 0xfe00 || nextCode === 0xfe01) { this.consume(); } - return { - type: "font", - mode: "math", - font, - body: { type: "mathord", mode: "math", loc, text: asciiFromScript[text] } - } - } - // Default ord character. No disambiguation necessary. - s = { - type: group, - mode: this.mode, - loc, - text - }; - } - symbol = s; - } else if (text.charCodeAt(0) >= 0x80) { - // no symbol for e.g. ^ - if (this.settings.strict && this.mode === "math") { - throw new ParseError(`Unicode text character "${text[0]}" used in math mode`, nucleus) - } - // All nonmathematical Unicode characters are rendered as if they - // are in text mode (wrapped in \text) because that's what it - // takes to render them in LaTeX. - symbol = { - type: "textord", - mode: "text", - loc: SourceLocation.range(nucleus), - text - }; - } else { - return null; // EOF, ^, _, {, }, etc. - } - this.consume(); - // Transform combining characters into accents - if (match) { - for (let i = 0; i < match[0].length; i++) { - const accent = match[0][i]; - if (!unicodeAccents[accent]) { - throw new ParseError(`Unknown accent ' ${accent}'`, nucleus); - } - const command = unicodeAccents[accent][this.mode] || - unicodeAccents[accent].text; - if (!command) { - throw new ParseError(`Accent ${accent} unsupported in ${this.mode} mode`, nucleus); - } - symbol = { - type: "accent", - mode: this.mode, - loc: SourceLocation.range(nucleus), - label: command, - isStretchy: false, - base: symbol - }; - } - } - return symbol; - } -} - -/** - * Parses an expression using a Parser, then returns the parsed result. - */ -const parseTree = function(toParse, settings) { - if (!(typeof toParse === "string" || toParse instanceof String)) { - throw new TypeError("Temml can only parse string typed expression") - } - const parser = new Parser(toParse, settings); - // Blank out any \df@tag to avoid spurious "Duplicate \tag" errors - delete parser.gullet.macros.current["\\df@tag"]; - - let tree = parser.parse(); - - // LaTeX ignores a \tag placed outside an AMS environment. - if (!(tree.length > 0 && tree[0].type && tree[0].type === "array" && tree[0].addEqnNum)) { - // If the input used \tag, it will set the \df@tag macro to the tag. - // In this case, we separately parse the tag and wrap the tree. - if (parser.gullet.macros.get("\\df@tag")) { - if (!settings.displayMode) { - throw new ParseError("\\tag works only in display mode") - } - parser.gullet.feed("\\df@tag"); - tree = [ - { - type: "tag", - mode: "text", - body: tree, - tag: parser.parse() - } - ]; - } - } - - return tree -}; - -/** - * This file contains information about the style that the mathmlBuilder carries - * around with it. Data is held in an `Style` object, and when - * recursing, a new `Style` object can be created with the `.with*` functions. - */ - -const subOrSupLevel = [2, 2, 3, 3]; - -/** - * This is the main Style class. It contains the current style.level, color, and font. - * - * Style objects should not be modified. To create a new Style with - * different properties, call a `.with*` method. - */ -class Style { - constructor(data) { - // Style.level can be 0 | 1 | 2 | 3, which correspond to - // displaystyle, textstyle, scriptstyle, and scriptscriptstyle. - // style.level does not directly set MathML's script level. MathML does that itself. - // We use style.level to track, not set, math style so that we can get the - // correct scriptlevel when needed in supsub.js, mathchoice.js, or for dimensions in em. - this.level = data.level; - this.color = data.color; // string | void - // A font family applies to a group of fonts (i.e. SansSerif), while a font - // represents a specific font (i.e. SansSerif Bold). - // See: https://tex.stackexchange.com/questions/22350/difference-between-textrm-and-mathrm - this.font = data.font || ""; // string - this.fontFamily = data.fontFamily || ""; // string - this.fontSize = data.fontSize || 1.0; // number - this.fontWeight = data.fontWeight || ""; - this.fontShape = data.fontShape || ""; - this.maxSize = data.maxSize; // [number, number] - } - - /** - * Returns a new style object with the same properties as "this". Properties - * from "extension" will be copied to the new style object. - */ - extend(extension) { - const data = { - level: this.level, - color: this.color, - font: this.font, - fontFamily: this.fontFamily, - fontSize: this.fontSize, - fontWeight: this.fontWeight, - fontShape: this.fontShape, - maxSize: this.maxSize - }; - - for (const key in extension) { - if (Object.prototype.hasOwnProperty.call(extension, key)) { - data[key] = extension[key]; - } - } - - return new Style(data); - } - - withLevel(n) { - return this.extend({ - level: n - }); - } - - incrementLevel() { - return this.extend({ - level: Math.min(this.level + 1, 3) - }); - } - - inSubOrSup() { - return this.extend({ - level: subOrSupLevel[this.level] - }) - } - - /** - * Create a new style object with the given color. - */ - withColor(color) { - return this.extend({ - color: color - }); - } - - /** - * Creates a new style object with the given math font or old text font. - * @type {[type]} - */ - withFont(font) { - return this.extend({ - font - }); - } - - /** - * Create a new style objects with the given fontFamily. - */ - withTextFontFamily(fontFamily) { - return this.extend({ - fontFamily, - font: "" - }); - } - - /** - * Creates a new style object with the given font size - */ - withFontSize(num) { - return this.extend({ - fontSize: num - }); - } - - /** - * Creates a new style object with the given font weight - */ - withTextFontWeight(fontWeight) { - return this.extend({ - fontWeight, - font: "" - }); - } - - /** - * Creates a new style object with the given font weight - */ - withTextFontShape(fontShape) { - return this.extend({ - fontShape, - font: "" - }); - } - - /** - * Gets the CSS color of the current style object - */ - getColor() { - return this.color; - } -} - -/* Temml Post Process - * Perform two tasks not done by Temml when it created each individual Temml element. - * Given a block, - * 1. At each AMS auto-numbered environment, assign an id. - * 2. Populate the text contents of each \ref & \eqref - * - * As with other Temml code, this file is released under terms of the MIT license. - * https://mit-license.org/ - */ - -const version = "0.10.24"; - -function postProcess(block) { - const labelMap = {}; - let i = 0; - - // Get a collection of the parents of each \tag & auto-numbered equation - const parents = block.getElementsByClassName("tml-tageqn"); - for (const parent of parents) { - const eqns = parent.getElementsByClassName("tml-eqn"); - if (eqns. length > 0 ) { - // AMS automatically numbered equation. - // Assign an id. - i += 1; - eqns[0].id = "tml-eqn-" + i; - // No need to write a number into the text content of the element. - // A CSS counter does that even if this postProcess() function is not used. - } - // If there is a \label, add it to labelMap - const labels = parent.getElementsByClassName("tml-label"); - if (labels.length === 0) { continue } - if (eqns.length > 0) { - labelMap[labels[0].id] = String(i); - } else { - const tags = parent.getElementsByClassName("tml-tag"); - if (tags.length > 0) { - labelMap[labels[0].id] = tags[0].textContent; - } - } - } - - // Populate \ref & \eqref text content - const refs = block.getElementsByClassName("tml-ref"); - [...refs].forEach(ref => { - let str = labelMap[ref.getAttribute("href").slice(1)]; - if (ref.className.indexOf("tml-eqref") === -1) { - // \ref. Omit parens. - str = str.replace(/^\(/, ""); - str = str.replace(/\($/, ""); - } { - // \eqref. Include parens - if (str.charAt(0) !== "(") { str = "(" + str; } - if (str.slice(-1) !== ")") { str = str + ")"; } - } - ref.textContent = str; - }); -} - -/* eslint no-console:0 */ - -/** - * @type {import('./temml').render} - * Parse and build an expression, and place that expression in the DOM node - * given. - */ -let render = function(expression, baseNode, options = {}) { - baseNode.textContent = ""; - const alreadyInMathElement = baseNode.tagName.toLowerCase() === "math"; - if (alreadyInMathElement) { options.wrap = "none"; } - const math = renderToMathMLTree(expression, options); - if (alreadyInMathElement) { - // The element already exists. Populate it. - baseNode.textContent = ""; - math.children.forEach(e => { baseNode.appendChild(e.toNode()); }); - } else if (math.children.length > 1) { - baseNode.textContent = ""; - math.children.forEach(e => { baseNode.appendChild(e.toNode()); }); - } else { - baseNode.appendChild(math.toNode()); - } -}; - -// Temml's styles don't work properly in quirks mode. Print out an error, and -// disable rendering. -if (typeof document !== "undefined") { - if (document.compatMode !== "CSS1Compat") { - typeof console !== "undefined" && - console.warn( - "Warning: Temml doesn't work in quirks mode. Make sure your " + - "website has a suitable doctype." - ); - - render = function() { - throw new ParseError("Temml doesn't work in quirks mode."); - }; - } -} - -/** - * @type {import('./temml').renderToString} - * Parse and build an expression, and return the markup for that. - */ -const renderToString = function(expression, options) { - const markup = renderToMathMLTree(expression, options).toMarkup(); - return markup; -}; - -/** - * @type {import('./temml').generateParseTree} - * Parse an expression and return the parse tree. - */ -const generateParseTree = function(expression, options) { - const settings = new Settings(options); - return parseTree(expression, settings); -}; - -/** - * @type {import('./temml').definePreamble} - * Take an expression which contains a preamble. - * Parse it and return the macros. - */ -const definePreamble = function(expression, options) { - const settings = new Settings(options); - settings.macros = {}; - if (!(typeof expression === "string" || expression instanceof String)) { - throw new TypeError("Temml can only parse string typed expression") - } - const parser = new Parser(expression, settings, true); - // Blank out any \df@tag to avoid spurious "Duplicate \tag" errors - delete parser.gullet.macros.current["\\df@tag"]; - const macros = parser.parse(); - return macros -}; - -/** - * If the given error is a Temml ParseError, - * renders the invalid LaTeX as a span with hover title giving the Temml - * error message. Otherwise, simply throws the error. - */ -const renderError = function(error, expression, options) { - if (options.throwOnError || !(error instanceof ParseError)) { - throw error; - } - const node = new Span(["temml-error"], [new TextNode$1(expression + "\n" + error.toString())]); - node.style.color = options.errorColor; - node.style.whiteSpace = "pre-line"; - return node; -}; - -/** - * @type {import('./temml').renderToMathMLTree} - * Generates and returns the Temml build tree. This is used for advanced - * use cases (like rendering to custom output). - */ -const renderToMathMLTree = function(expression, options) { - const settings = new Settings(options); - try { - const tree = parseTree(expression, settings); - const style = new Style({ - level: settings.displayMode ? StyleLevel.DISPLAY : StyleLevel.TEXT, - maxSize: settings.maxSize - }); - return buildMathML(tree, expression, style, settings); - } catch (error) { - return renderError(error, expression, settings); - } -}; - -/** @type {import('./temml').default} */ -var temml = { - /** - * Current Temml version - */ - version: version, - /** - * Renders the given LaTeX into MathML, and adds - * it as a child to the specified DOM node. - */ - render, - /** - * Renders the given LaTeX into MathML string, - * for sending to the client. - */ - renderToString, - /** - * Post-process an entire HTML block. - * Writes AMS auto-numbers and implements \ref{}. - * Typcally called once, after a loop has rendered many individual spans. - */ - postProcess, - /** - * Temml error, usually during parsing. - */ - ParseError, - /** - * Creates a set of macros with document-wide scope. - */ - definePreamble, - /** - * Parses the given LaTeX into Temml's internal parse tree structure, - * without rendering to HTML or MathML. - * - * NOTE: This method is not currently recommended for public use. - * The internal tree representation is unstable and is very likely - * to change. Use at your own risk. - */ - __parse: generateParseTree, - /** - * Renders the given LaTeX into a MathML internal DOM tree - * representation, without flattening that representation to a string. - * - * NOTE: This method is not currently recommended for public use. - * The internal tree representation is unstable and is very likely - * to change. Use at your own risk. - */ - __renderToMathMLTree: renderToMathMLTree, - /** - * adds a new symbol to builtin symbols table - */ - __defineSymbol: defineSymbol, - /** - * adds a new macro to builtin macro list - */ - __defineMacro: defineMacro -}; - -export { temml as default }; diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 72e75671..00000000 --- a/yarn.lock +++ /dev/null @@ -1,1864 +0,0 @@ -# This file is generated by running "yarn install" inside your project. -# Manual changes might be lost - proceed with caution! - -__metadata: - version: 6 - cacheKey: 8 - -"@aashutoshrathi/word-wrap@npm:^1.2.3": - version: 1.2.6 - resolution: "@aashutoshrathi/word-wrap@npm:1.2.6" - checksum: ada901b9e7c680d190f1d012c84217ce0063d8f5c5a7725bb91ec3c5ed99bb7572680eb2d2938a531ccbaec39a95422fcd8a6b4a13110c7d98dd75402f66a0cd - languageName: node - linkType: hard - -"@eslint-community/eslint-utils@npm:^4.2.0": - version: 4.4.0 - resolution: "@eslint-community/eslint-utils@npm:4.4.0" - dependencies: - eslint-visitor-keys: ^3.3.0 - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: cdfe3ae42b4f572cbfb46d20edafe6f36fc5fb52bf2d90875c58aefe226892b9677fef60820e2832caf864a326fe4fc225714c46e8389ccca04d5f9288aabd22 - languageName: node - linkType: hard - -"@eslint-community/regexpp@npm:^4.6.1": - version: 4.10.0 - resolution: "@eslint-community/regexpp@npm:4.10.0" - checksum: 2a6e345429ea8382aaaf3a61f865cae16ed44d31ca917910033c02dc00d505d939f10b81e079fa14d43b51499c640138e153b7e40743c4c094d9df97d4e56f7b - languageName: node - linkType: hard - -"@eslint/eslintrc@npm:^2.1.2": - version: 2.1.2 - resolution: "@eslint/eslintrc@npm:2.1.2" - dependencies: - ajv: ^6.12.4 - debug: ^4.3.2 - espree: ^9.6.0 - globals: ^13.19.0 - ignore: ^5.2.0 - import-fresh: ^3.2.1 - js-yaml: ^4.1.0 - minimatch: ^3.1.2 - strip-json-comments: ^3.1.1 - checksum: bc742a1e3b361f06fedb4afb6bf32cbd27171292ef7924f61c62f2aed73048367bcc7ac68f98c06d4245cd3fabc43270f844e3c1699936d4734b3ac5398814a7 - languageName: node - linkType: hard - -"@eslint/js@npm:8.52.0": - version: 8.52.0 - resolution: "@eslint/js@npm:8.52.0" - checksum: 490893b8091a66415f4ac98b963d23eb287264ea3bd6af7ec788f0570705cf64fd6ab84b717785980f55e39d08ff5c7fde6d8e4391ccb507169370ce3a6d091a - languageName: node - linkType: hard - -"@humanwhocodes/config-array@npm:^0.11.13": - version: 0.11.13 - resolution: "@humanwhocodes/config-array@npm:0.11.13" - dependencies: - "@humanwhocodes/object-schema": ^2.0.1 - debug: ^4.1.1 - minimatch: ^3.0.5 - checksum: f8ea57b0d7ed7f2d64cd3944654976829d9da91c04d9c860e18804729a33f7681f78166ef4c761850b8c324d362f7d53f14c5c44907a6b38b32c703ff85e4805 - languageName: node - linkType: hard - -"@humanwhocodes/module-importer@npm:^1.0.1": - version: 1.0.1 - resolution: "@humanwhocodes/module-importer@npm:1.0.1" - checksum: 0fd22007db8034a2cdf2c764b140d37d9020bbfce8a49d3ec5c05290e77d4b0263b1b972b752df8c89e5eaa94073408f2b7d977aed131faf6cf396ebb5d7fb61 - languageName: node - linkType: hard - -"@humanwhocodes/object-schema@npm:^2.0.1": - version: 2.0.1 - resolution: "@humanwhocodes/object-schema@npm:2.0.1" - checksum: 24929487b1ed48795d2f08346a0116cc5ee4634848bce64161fb947109352c562310fd159fc64dda0e8b853307f5794605191a9547f7341158559ca3c8262a45 - languageName: node - linkType: hard - -"@isaacs/cliui@npm:^8.0.2": - version: 8.0.2 - resolution: "@isaacs/cliui@npm:8.0.2" - dependencies: - string-width: ^5.1.2 - string-width-cjs: "npm:string-width@^4.2.0" - strip-ansi: ^7.0.1 - strip-ansi-cjs: "npm:strip-ansi@^6.0.1" - wrap-ansi: ^8.1.0 - wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" - checksum: 4a473b9b32a7d4d3cfb7a614226e555091ff0c5a29a1734c28c72a182c2f6699b26fc6b5c2131dfd841e86b185aea714c72201d7c98c2fba5f17709333a67aeb - languageName: node - linkType: hard - -"@jridgewell/gen-mapping@npm:^0.3.0": - version: 0.3.3 - resolution: "@jridgewell/gen-mapping@npm:0.3.3" - dependencies: - "@jridgewell/set-array": ^1.0.1 - "@jridgewell/sourcemap-codec": ^1.4.10 - "@jridgewell/trace-mapping": ^0.3.9 - checksum: 4a74944bd31f22354fc01c3da32e83c19e519e3bbadafa114f6da4522ea77dd0c2842607e923a591d60a76699d819a2fbb6f3552e277efdb9b58b081390b60ab - languageName: node - linkType: hard - -"@jridgewell/resolve-uri@npm:^3.1.0": - version: 3.1.1 - resolution: "@jridgewell/resolve-uri@npm:3.1.1" - checksum: f5b441fe7900eab4f9155b3b93f9800a916257f4e8563afbcd3b5a5337b55e52bd8ae6735453b1b745457d9f6cdb16d74cd6220bbdd98cf153239e13f6cbb653 - languageName: node - linkType: hard - -"@jridgewell/set-array@npm:^1.0.1": - version: 1.1.2 - resolution: "@jridgewell/set-array@npm:1.1.2" - checksum: 69a84d5980385f396ff60a175f7177af0b8da4ddb81824cb7016a9ef914eee9806c72b6b65942003c63f7983d4f39a5c6c27185bbca88eb4690b62075602e28e - languageName: node - linkType: hard - -"@jridgewell/source-map@npm:^0.3.3": - version: 0.3.5 - resolution: "@jridgewell/source-map@npm:0.3.5" - dependencies: - "@jridgewell/gen-mapping": ^0.3.0 - "@jridgewell/trace-mapping": ^0.3.9 - checksum: 1ad4dec0bdafbade57920a50acec6634f88a0eb735851e0dda906fa9894e7f0549c492678aad1a10f8e144bfe87f238307bf2a914a1bc85b7781d345417e9f6f - languageName: node - linkType: hard - -"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": - version: 1.4.15 - resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" - checksum: b881c7e503db3fc7f3c1f35a1dd2655a188cc51a3612d76efc8a6eb74728bef5606e6758ee77423e564092b4a518aba569bbb21c9bac5ab7a35b0c6ae7e344c8 - languageName: node - linkType: hard - -"@jridgewell/trace-mapping@npm:^0.3.9": - version: 0.3.20 - resolution: "@jridgewell/trace-mapping@npm:0.3.20" - dependencies: - "@jridgewell/resolve-uri": ^3.1.0 - "@jridgewell/sourcemap-codec": ^1.4.14 - checksum: cd1a7353135f385909468ff0cf20bdd37e59f2ee49a13a966dedf921943e222082c583ade2b579ff6cd0d8faafcb5461f253e1bf2a9f48fec439211fdbe788f5 - languageName: node - linkType: hard - -"@nodelib/fs.scandir@npm:2.1.5": - version: 2.1.5 - resolution: "@nodelib/fs.scandir@npm:2.1.5" - dependencies: - "@nodelib/fs.stat": 2.0.5 - run-parallel: ^1.1.9 - checksum: a970d595bd23c66c880e0ef1817791432dbb7acbb8d44b7e7d0e7a22f4521260d4a83f7f9fd61d44fda4610105577f8f58a60718105fb38352baed612fd79e59 - languageName: node - linkType: hard - -"@nodelib/fs.stat@npm:2.0.5": - version: 2.0.5 - resolution: "@nodelib/fs.stat@npm:2.0.5" - checksum: 012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 - languageName: node - linkType: hard - -"@nodelib/fs.walk@npm:^1.2.8": - version: 1.2.8 - resolution: "@nodelib/fs.walk@npm:1.2.8" - dependencies: - "@nodelib/fs.scandir": 2.1.5 - fastq: ^1.6.0 - checksum: 190c643f156d8f8f277bf2a6078af1ffde1fd43f498f187c2db24d35b4b4b5785c02c7dc52e356497b9a1b65b13edc996de08de0b961c32844364da02986dc53 - languageName: node - linkType: hard - -"@npmcli/fs@npm:^3.1.0": - version: 3.1.0 - resolution: "@npmcli/fs@npm:3.1.0" - dependencies: - semver: ^7.3.5 - checksum: a50a6818de5fc557d0b0e6f50ec780a7a02ab8ad07e5ac8b16bf519e0ad60a144ac64f97d05c443c3367235d337182e1d012bbac0eb8dbae8dc7b40b193efd0e - languageName: node - linkType: hard - -"@pkgjs/parseargs@npm:^0.11.0": - version: 0.11.0 - resolution: "@pkgjs/parseargs@npm:0.11.0" - checksum: 6ad6a00fc4f2f2cfc6bff76fb1d88b8ee20bc0601e18ebb01b6d4be583733a860239a521a7fbca73b612e66705078809483549d2b18f370eb346c5155c8e4a0f - languageName: node - linkType: hard - -"@tootallnate/once@npm:2": - version: 2.0.0 - resolution: "@tootallnate/once@npm:2.0.0" - checksum: ad87447820dd3f24825d2d947ebc03072b20a42bfc96cbafec16bff8bbda6c1a81fcb0be56d5b21968560c5359a0af4038a68ba150c3e1694fe4c109a063bed8 - languageName: node - linkType: hard - -"@ungap/structured-clone@npm:^1.2.0": - version: 1.2.0 - resolution: "@ungap/structured-clone@npm:1.2.0" - checksum: 4f656b7b4672f2ce6e272f2427d8b0824ed11546a601d8d5412b9d7704e83db38a8d9f402ecdf2b9063fc164af842ad0ec4a55819f621ed7e7ea4d1efcc74524 - languageName: node - linkType: hard - -"abbrev@npm:^1.0.0": - version: 1.1.1 - resolution: "abbrev@npm:1.1.1" - checksum: a4a97ec07d7ea112c517036882b2ac22f3109b7b19077dc656316d07d308438aac28e4d9746dc4d84bf6b1e75b4a7b0a5f3cb30592419f128ca9a8cee3bcfa17 - languageName: node - linkType: hard - -"acorn-jsx@npm:^5.3.2": - version: 5.3.2 - resolution: "acorn-jsx@npm:5.3.2" - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: c3d3b2a89c9a056b205b69530a37b972b404ee46ec8e5b341666f9513d3163e2a4f214a71f4dfc7370f5a9c07472d2fd1c11c91c3f03d093e37637d95da98950 - languageName: node - linkType: hard - -"acorn@npm:^8.8.2, acorn@npm:^8.9.0": - version: 8.10.0 - resolution: "acorn@npm:8.10.0" - bin: - acorn: bin/acorn - checksum: 538ba38af0cc9e5ef983aee196c4b8b4d87c0c94532334fa7e065b2c8a1f85863467bb774231aae91613fcda5e68740c15d97b1967ae3394d20faddddd8af61d - languageName: node - linkType: hard - -"agent-base@npm:6, agent-base@npm:^6.0.2": - version: 6.0.2 - resolution: "agent-base@npm:6.0.2" - dependencies: - debug: 4 - checksum: f52b6872cc96fd5f622071b71ef200e01c7c4c454ee68bc9accca90c98cfb39f2810e3e9aa330435835eedc8c23f4f8a15267f67c6e245d2b33757575bdac49d - languageName: node - linkType: hard - -"agentkeepalive@npm:^4.2.1": - version: 4.5.0 - resolution: "agentkeepalive@npm:4.5.0" - dependencies: - humanize-ms: ^1.2.1 - checksum: 13278cd5b125e51eddd5079f04d6fe0914ac1b8b91c1f3db2c1822f99ac1a7457869068997784342fe455d59daaff22e14fb7b8c3da4e741896e7e31faf92481 - languageName: node - linkType: hard - -"aggregate-error@npm:^3.0.0": - version: 3.1.0 - resolution: "aggregate-error@npm:3.1.0" - dependencies: - clean-stack: ^2.0.0 - indent-string: ^4.0.0 - checksum: 1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79 - languageName: node - linkType: hard - -"ajv@npm:^6.12.4": - version: 6.12.6 - resolution: "ajv@npm:6.12.6" - dependencies: - fast-deep-equal: ^3.1.1 - fast-json-stable-stringify: ^2.0.0 - json-schema-traverse: ^0.4.1 - uri-js: ^4.2.2 - checksum: 874972efe5c4202ab0a68379481fbd3d1b5d0a7bd6d3cc21d40d3536ebff3352a2a1fabb632d4fd2cc7fe4cbdcd5ed6782084c9bbf7f32a1536d18f9da5007d4 - languageName: node - linkType: hard - -"ansi-regex@npm:^5.0.1": - version: 5.0.1 - resolution: "ansi-regex@npm:5.0.1" - checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b - languageName: node - linkType: hard - -"ansi-regex@npm:^6.0.1": - version: 6.0.1 - resolution: "ansi-regex@npm:6.0.1" - checksum: 1ff8b7667cded1de4fa2c9ae283e979fc87036864317da86a2e546725f96406746411d0d85e87a2d12fa5abd715d90006de7fa4fa0477c92321ad3b4c7d4e169 - languageName: node - linkType: hard - -"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": - version: 4.3.0 - resolution: "ansi-styles@npm:4.3.0" - dependencies: - color-convert: ^2.0.1 - checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4 - languageName: node - linkType: hard - -"ansi-styles@npm:^6.1.0": - version: 6.2.1 - resolution: "ansi-styles@npm:6.2.1" - checksum: ef940f2f0ced1a6347398da88a91da7930c33ecac3c77b72c5905f8b8fe402c52e6fde304ff5347f616e27a742da3f1dc76de98f6866c69251ad0b07a66776d9 - languageName: node - linkType: hard - -"aproba@npm:^1.0.3 || ^2.0.0": - version: 2.0.0 - resolution: "aproba@npm:2.0.0" - checksum: 5615cadcfb45289eea63f8afd064ab656006361020e1735112e346593856f87435e02d8dcc7ff0d11928bc7d425f27bc7c2a84f6c0b35ab0ff659c814c138a24 - languageName: node - linkType: hard - -"are-we-there-yet@npm:^3.0.0": - version: 3.0.1 - resolution: "are-we-there-yet@npm:3.0.1" - dependencies: - delegates: ^1.0.0 - readable-stream: ^3.6.0 - checksum: 52590c24860fa7173bedeb69a4c05fb573473e860197f618b9a28432ee4379049336727ae3a1f9c4cb083114601c1140cee578376164d0e651217a9843f9fe83 - languageName: node - linkType: hard - -"argparse@npm:^2.0.1": - version: 2.0.1 - resolution: "argparse@npm:2.0.1" - checksum: 83644b56493e89a254bae05702abf3a1101b4fa4d0ca31df1c9985275a5a5bd47b3c27b7fa0b71098d41114d8ca000e6ed90cad764b306f8a503665e4d517ced - languageName: node - linkType: hard - -"balanced-match@npm:^1.0.0": - version: 1.0.2 - resolution: "balanced-match@npm:1.0.2" - checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 - languageName: node - linkType: hard - -"brace-expansion@npm:^1.1.7": - version: 1.1.11 - resolution: "brace-expansion@npm:1.1.11" - dependencies: - balanced-match: ^1.0.0 - concat-map: 0.0.1 - checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 - languageName: node - linkType: hard - -"brace-expansion@npm:^2.0.1": - version: 2.0.1 - resolution: "brace-expansion@npm:2.0.1" - dependencies: - balanced-match: ^1.0.0 - checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 - languageName: node - linkType: hard - -"buffer-from@npm:^1.0.0": - version: 1.1.2 - resolution: "buffer-from@npm:1.1.2" - checksum: 0448524a562b37d4d7ed9efd91685a5b77a50672c556ea254ac9a6d30e3403a517d8981f10e565db24e8339413b43c97ca2951f10e399c6125a0d8911f5679bb - languageName: node - linkType: hard - -"cacache@npm:^17.0.0": - version: 17.1.4 - resolution: "cacache@npm:17.1.4" - dependencies: - "@npmcli/fs": ^3.1.0 - fs-minipass: ^3.0.0 - glob: ^10.2.2 - lru-cache: ^7.7.1 - minipass: ^7.0.3 - minipass-collect: ^1.0.2 - minipass-flush: ^1.0.5 - minipass-pipeline: ^1.2.4 - p-map: ^4.0.0 - ssri: ^10.0.0 - tar: ^6.1.11 - unique-filename: ^3.0.0 - checksum: b7751df756656954a51201335addced8f63fc53266fa56392c9f5ae83c8d27debffb4458ac2d168a744a4517ec3f2163af05c20097f93d17bdc2dc8a385e14a6 - languageName: node - linkType: hard - -"callsites@npm:^3.0.0": - version: 3.1.0 - resolution: "callsites@npm:3.1.0" - checksum: 072d17b6abb459c2ba96598918b55868af677154bec7e73d222ef95a8fdb9bbf7dae96a8421085cdad8cd190d86653b5b6dc55a4484f2e5b2e27d5e0c3fc15b3 - languageName: node - linkType: hard - -"chalk@npm:^4.0.0": - version: 4.1.2 - resolution: "chalk@npm:4.1.2" - dependencies: - ansi-styles: ^4.1.0 - supports-color: ^7.1.0 - checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc - languageName: node - linkType: hard - -"chownr@npm:^2.0.0": - version: 2.0.0 - resolution: "chownr@npm:2.0.0" - checksum: c57cf9dd0791e2f18a5ee9c1a299ae6e801ff58fee96dc8bfd0dcb4738a6ce58dd252a3605b1c93c6418fe4f9d5093b28ffbf4d66648cb2a9c67eaef9679be2f - languageName: node - linkType: hard - -"clean-stack@npm:^2.0.0": - version: 2.2.0 - resolution: "clean-stack@npm:2.2.0" - checksum: 2ac8cd2b2f5ec986a3c743935ec85b07bc174d5421a5efc8017e1f146a1cf5f781ae962618f416352103b32c9cd7e203276e8c28241bbe946160cab16149fb68 - languageName: node - linkType: hard - -"color-convert@npm:^2.0.1": - version: 2.0.1 - resolution: "color-convert@npm:2.0.1" - dependencies: - color-name: ~1.1.4 - checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 - languageName: node - linkType: hard - -"color-name@npm:~1.1.4": - version: 1.1.4 - resolution: "color-name@npm:1.1.4" - checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 - languageName: node - linkType: hard - -"color-support@npm:^1.1.3": - version: 1.1.3 - resolution: "color-support@npm:1.1.3" - bin: - color-support: bin.js - checksum: 9b7356817670b9a13a26ca5af1c21615463b500783b739b7634a0c2047c16cef4b2865d7576875c31c3cddf9dd621fa19285e628f20198b233a5cfdda6d0793b - languageName: node - linkType: hard - -"commander@npm:^2.20.0": - version: 2.20.3 - resolution: "commander@npm:2.20.3" - checksum: ab8c07884e42c3a8dbc5dd9592c606176c7eb5c1ca5ff274bcf907039b2c41de3626f684ea75ccf4d361ba004bbaff1f577d5384c155f3871e456bdf27becf9e - languageName: node - linkType: hard - -"concat-map@npm:0.0.1": - version: 0.0.1 - resolution: "concat-map@npm:0.0.1" - checksum: 902a9f5d8967a3e2faf138d5cb784b9979bad2e6db5357c5b21c568df4ebe62bcb15108af1b2253744844eb964fc023fbd9afbbbb6ddd0bcc204c6fb5b7bf3af - languageName: node - linkType: hard - -"console-control-strings@npm:^1.1.0": - version: 1.1.0 - resolution: "console-control-strings@npm:1.1.0" - checksum: 8755d76787f94e6cf79ce4666f0c5519906d7f5b02d4b884cf41e11dcd759ed69c57da0670afd9236d229a46e0f9cf519db0cd829c6dca820bb5a5c3def584ed - languageName: node - linkType: hard - -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2": - version: 7.0.3 - resolution: "cross-spawn@npm:7.0.3" - dependencies: - path-key: ^3.1.0 - shebang-command: ^2.0.0 - which: ^2.0.1 - checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 - languageName: node - linkType: hard - -"debug@npm:4, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.3": - version: 4.3.4 - resolution: "debug@npm:4.3.4" - dependencies: - ms: 2.1.2 - peerDependenciesMeta: - supports-color: - optional: true - checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 - languageName: node - linkType: hard - -"deep-is@npm:^0.1.3": - version: 0.1.4 - resolution: "deep-is@npm:0.1.4" - checksum: edb65dd0d7d1b9c40b2f50219aef30e116cedd6fc79290e740972c132c09106d2e80aa0bc8826673dd5a00222d4179c84b36a790eef63a4c4bca75a37ef90804 - languageName: node - linkType: hard - -"delegates@npm:^1.0.0": - version: 1.0.0 - resolution: "delegates@npm:1.0.0" - checksum: a51744d9b53c164ba9c0492471a1a2ffa0b6727451bdc89e31627fdf4adda9d51277cfcbfb20f0a6f08ccb3c436f341df3e92631a3440226d93a8971724771fd - languageName: node - linkType: hard - -"doctrine@npm:^3.0.0": - version: 3.0.0 - resolution: "doctrine@npm:3.0.0" - dependencies: - esutils: ^2.0.2 - checksum: fd7673ca77fe26cd5cba38d816bc72d641f500f1f9b25b83e8ce28827fe2da7ad583a8da26ab6af85f834138cf8dae9f69b0cd6ab925f52ddab1754db44d99ce - languageName: node - linkType: hard - -"eastasianwidth@npm:^0.2.0": - version: 0.2.0 - resolution: "eastasianwidth@npm:0.2.0" - checksum: 7d00d7cd8e49b9afa762a813faac332dee781932d6f2c848dc348939c4253f1d4564341b7af1d041853bc3f32c2ef141b58e0a4d9862c17a7f08f68df1e0f1ed - languageName: node - linkType: hard - -"emoji-regex@npm:^8.0.0": - version: 8.0.0 - resolution: "emoji-regex@npm:8.0.0" - checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192 - languageName: node - linkType: hard - -"emoji-regex@npm:^9.2.2": - version: 9.2.2 - resolution: "emoji-regex@npm:9.2.2" - checksum: 8487182da74aabd810ac6d6f1994111dfc0e331b01271ae01ec1eb0ad7b5ecc2bbbbd2f053c05cb55a1ac30449527d819bbfbf0e3de1023db308cbcb47f86601 - languageName: node - linkType: hard - -"encoding@npm:^0.1.13": - version: 0.1.13 - resolution: "encoding@npm:0.1.13" - dependencies: - iconv-lite: ^0.6.2 - checksum: bb98632f8ffa823996e508ce6a58ffcf5856330fde839ae42c9e1f436cc3b5cc651d4aeae72222916545428e54fd0f6aa8862fd8d25bdbcc4589f1e3f3715e7f - languageName: node - linkType: hard - -"env-paths@npm:^2.2.0": - version: 2.2.1 - resolution: "env-paths@npm:2.2.1" - checksum: 65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e - languageName: node - linkType: hard - -"err-code@npm:^2.0.2": - version: 2.0.3 - resolution: "err-code@npm:2.0.3" - checksum: 8b7b1be20d2de12d2255c0bc2ca638b7af5171142693299416e6a9339bd7d88fc8d7707d913d78e0993176005405a236b066b45666b27b797252c771156ace54 - languageName: node - linkType: hard - -"escape-string-regexp@npm:^4.0.0": - version: 4.0.0 - resolution: "escape-string-regexp@npm:4.0.0" - checksum: 98b48897d93060f2322108bf29db0feba7dd774be96cd069458d1453347b25ce8682ecc39859d4bca2203cc0ab19c237bcc71755eff49a0f8d90beadeeba5cc5 - languageName: node - linkType: hard - -"eslint-scope@npm:^7.2.2": - version: 7.2.2 - resolution: "eslint-scope@npm:7.2.2" - dependencies: - esrecurse: ^4.3.0 - estraverse: ^5.2.0 - checksum: ec97dbf5fb04b94e8f4c5a91a7f0a6dd3c55e46bfc7bbcd0e3138c3a76977570e02ed89a1810c778dcd72072ff0e9621ba1379b4babe53921d71e2e4486fda3e - languageName: node - linkType: hard - -"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": - version: 3.4.3 - resolution: "eslint-visitor-keys@npm:3.4.3" - checksum: 36e9ef87fca698b6fd7ca5ca35d7b2b6eeaaf106572e2f7fd31c12d3bfdaccdb587bba6d3621067e5aece31c8c3a348b93922ab8f7b2cbc6aaab5e1d89040c60 - languageName: node - linkType: hard - -"eslint@npm:^8.39.0": - version: 8.52.0 - resolution: "eslint@npm:8.52.0" - dependencies: - "@eslint-community/eslint-utils": ^4.2.0 - "@eslint-community/regexpp": ^4.6.1 - "@eslint/eslintrc": ^2.1.2 - "@eslint/js": 8.52.0 - "@humanwhocodes/config-array": ^0.11.13 - "@humanwhocodes/module-importer": ^1.0.1 - "@nodelib/fs.walk": ^1.2.8 - "@ungap/structured-clone": ^1.2.0 - ajv: ^6.12.4 - chalk: ^4.0.0 - cross-spawn: ^7.0.2 - debug: ^4.3.2 - doctrine: ^3.0.0 - escape-string-regexp: ^4.0.0 - eslint-scope: ^7.2.2 - eslint-visitor-keys: ^3.4.3 - espree: ^9.6.1 - esquery: ^1.4.2 - esutils: ^2.0.2 - fast-deep-equal: ^3.1.3 - file-entry-cache: ^6.0.1 - find-up: ^5.0.0 - glob-parent: ^6.0.2 - globals: ^13.19.0 - graphemer: ^1.4.0 - ignore: ^5.2.0 - imurmurhash: ^0.1.4 - is-glob: ^4.0.0 - is-path-inside: ^3.0.3 - js-yaml: ^4.1.0 - json-stable-stringify-without-jsonify: ^1.0.1 - levn: ^0.4.1 - lodash.merge: ^4.6.2 - minimatch: ^3.1.2 - natural-compare: ^1.4.0 - optionator: ^0.9.3 - strip-ansi: ^6.0.1 - text-table: ^0.2.0 - bin: - eslint: bin/eslint.js - checksum: fd22d1e9bd7090e31b00cbc7a3b98f3b76020a4c4641f987ae7d0c8f52e1b88c3b268bdfdabac2e1a93513e5d11339b718ff45cbff48a44c35d7e52feba510ed - languageName: node - linkType: hard - -"esm@npm:^3.2.25": - version: 3.2.25 - resolution: "esm@npm:3.2.25" - checksum: 978aabe2de83541c105605a6d60a26ed8e627ef6bb0a7605fe15a95bbdea6b8348bd045255cb22219c054dd09a81a94823df00843d9e97f42419c92015ce3a64 - languageName: node - linkType: hard - -"espree@npm:^9.6.0, espree@npm:^9.6.1": - version: 9.6.1 - resolution: "espree@npm:9.6.1" - dependencies: - acorn: ^8.9.0 - acorn-jsx: ^5.3.2 - eslint-visitor-keys: ^3.4.1 - checksum: eb8c149c7a2a77b3f33a5af80c10875c3abd65450f60b8af6db1bfcfa8f101e21c1e56a561c6dc13b848e18148d43469e7cd208506238554fb5395a9ea5a1ab9 - languageName: node - linkType: hard - -"esquery@npm:^1.4.2": - version: 1.5.0 - resolution: "esquery@npm:1.5.0" - dependencies: - estraverse: ^5.1.0 - checksum: aefb0d2596c230118656cd4ec7532d447333a410a48834d80ea648b1e7b5c9bc9ed8b5e33a89cb04e487b60d622f44cf5713bf4abed7c97343edefdc84a35900 - languageName: node - linkType: hard - -"esrecurse@npm:^4.3.0": - version: 4.3.0 - resolution: "esrecurse@npm:4.3.0" - dependencies: - estraverse: ^5.2.0 - checksum: ebc17b1a33c51cef46fdc28b958994b1dc43cd2e86237515cbc3b4e5d2be6a811b2315d0a1a4d9d340b6d2308b15322f5c8291059521cc5f4802f65e7ec32837 - languageName: node - linkType: hard - -"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": - version: 5.3.0 - resolution: "estraverse@npm:5.3.0" - checksum: 072780882dc8416ad144f8fe199628d2b3e7bbc9989d9ed43795d2c90309a2047e6bc5979d7e2322a341163d22cfad9e21f4110597fe487519697389497e4e2b - languageName: node - linkType: hard - -"esutils@npm:^2.0.2": - version: 2.0.3 - resolution: "esutils@npm:2.0.3" - checksum: 22b5b08f74737379a840b8ed2036a5fb35826c709ab000683b092d9054e5c2a82c27818f12604bfc2a9a76b90b6834ef081edbc1c7ae30d1627012e067c6ec87 - languageName: node - linkType: hard - -"exponential-backoff@npm:^3.1.1": - version: 3.1.1 - resolution: "exponential-backoff@npm:3.1.1" - checksum: 3d21519a4f8207c99f7457287291316306255a328770d320b401114ec8481986e4e467e854cb9914dd965e0a1ca810a23ccb559c642c88f4c7f55c55778a9b48 - languageName: node - linkType: hard - -"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": - version: 3.1.3 - resolution: "fast-deep-equal@npm:3.1.3" - checksum: e21a9d8d84f53493b6aa15efc9cfd53dd5b714a1f23f67fb5dc8f574af80df889b3bce25dc081887c6d25457cce704e636395333abad896ccdec03abaf1f3f9d - languageName: node - linkType: hard - -"fast-json-stable-stringify@npm:^2.0.0": - version: 2.1.0 - resolution: "fast-json-stable-stringify@npm:2.1.0" - checksum: b191531e36c607977e5b1c47811158733c34ccb3bfde92c44798929e9b4154884378536d26ad90dfecd32e1ffc09c545d23535ad91b3161a27ddbb8ebe0cbecb - languageName: node - linkType: hard - -"fast-levenshtein@npm:^2.0.6": - version: 2.0.6 - resolution: "fast-levenshtein@npm:2.0.6" - checksum: 92cfec0a8dfafd9c7a15fba8f2cc29cd0b62b85f056d99ce448bbcd9f708e18ab2764bda4dd5158364f4145a7c72788538994f0d1787b956ef0d1062b0f7c24c - languageName: node - linkType: hard - -"fastq@npm:^1.6.0": - version: 1.15.0 - resolution: "fastq@npm:1.15.0" - dependencies: - reusify: ^1.0.4 - checksum: 0170e6bfcd5d57a70412440b8ef600da6de3b2a6c5966aeaf0a852d542daff506a0ee92d6de7679d1de82e644bce69d7a574a6c93f0b03964b5337eed75ada1a - languageName: node - linkType: hard - -"file-entry-cache@npm:^6.0.1": - version: 6.0.1 - resolution: "file-entry-cache@npm:6.0.1" - dependencies: - flat-cache: ^3.0.4 - checksum: f49701feaa6314c8127c3c2f6173cfefff17612f5ed2daaafc6da13b5c91fd43e3b2a58fd0d63f9f94478a501b167615931e7200e31485e320f74a33885a9c74 - languageName: node - linkType: hard - -"find-up@npm:^5.0.0": - version: 5.0.0 - resolution: "find-up@npm:5.0.0" - dependencies: - locate-path: ^6.0.0 - path-exists: ^4.0.0 - checksum: 07955e357348f34660bde7920783204ff5a26ac2cafcaa28bace494027158a97b9f56faaf2d89a6106211a8174db650dd9f503f9c0d526b1202d5554a00b9095 - languageName: node - linkType: hard - -"flat-cache@npm:^3.0.4": - version: 3.1.1 - resolution: "flat-cache@npm:3.1.1" - dependencies: - flatted: ^3.2.9 - keyv: ^4.5.3 - rimraf: ^3.0.2 - checksum: 4958cfe0f46acf84953d4e16676ef5f0d38eab3a92d532a1e8d5f88f11eea8b36d5d598070ff2aeae15f1fde18f8d7d089eefaf9db10b5a587cc1c9072325c7a - languageName: node - linkType: hard - -"flatted@npm:^3.2.9": - version: 3.2.9 - resolution: "flatted@npm:3.2.9" - checksum: f14167fbe26a9d20f6fca8d998e8f1f41df72c8e81f9f2c9d61ed2bea058248f5e1cbd05e7f88c0e5087a6a0b822a1e5e2b446e879f3cfbe0b07ba2d7f80b026 - languageName: node - linkType: hard - -"foreground-child@npm:^3.1.0": - version: 3.1.1 - resolution: "foreground-child@npm:3.1.1" - dependencies: - cross-spawn: ^7.0.0 - signal-exit: ^4.0.1 - checksum: 139d270bc82dc9e6f8bc045fe2aae4001dc2472157044fdfad376d0a3457f77857fa883c1c8b21b491c6caade9a926a4bed3d3d2e8d3c9202b151a4cbbd0bcd5 - languageName: node - linkType: hard - -"fs-minipass@npm:^2.0.0": - version: 2.1.0 - resolution: "fs-minipass@npm:2.1.0" - dependencies: - minipass: ^3.0.0 - checksum: 1b8d128dae2ac6cc94230cc5ead341ba3e0efaef82dab46a33d171c044caaa6ca001364178d42069b2809c35a1c3c35079a32107c770e9ffab3901b59af8c8b1 - languageName: node - linkType: hard - -"fs-minipass@npm:^3.0.0": - version: 3.0.3 - resolution: "fs-minipass@npm:3.0.3" - dependencies: - minipass: ^7.0.3 - checksum: 8722a41109130851d979222d3ec88aabaceeaaf8f57b2a8f744ef8bd2d1ce95453b04a61daa0078822bc5cd21e008814f06fe6586f56fef511e71b8d2394d802 - languageName: node - linkType: hard - -"fs.realpath@npm:^1.0.0": - version: 1.0.0 - resolution: "fs.realpath@npm:1.0.0" - checksum: 99ddea01a7e75aa276c250a04eedeffe5662bce66c65c07164ad6264f9de18fb21be9433ead460e54cff20e31721c811f4fb5d70591799df5f85dce6d6746fd0 - languageName: node - linkType: hard - -"fsevents@npm:~2.3.2": - version: 2.3.3 - resolution: "fsevents@npm:2.3.3" - dependencies: - node-gyp: latest - checksum: 11e6ea6fea15e42461fc55b4b0e4a0a3c654faa567f1877dbd353f39156f69def97a69936d1746619d656c4b93de2238bf731f6085a03a50cabf287c9d024317 - conditions: os=darwin - languageName: node - linkType: hard - -"fsevents@patch:fsevents@~2.3.2#~builtin": - version: 2.3.3 - resolution: "fsevents@patch:fsevents@npm%3A2.3.3#~builtin::version=2.3.3&hash=df0bf1" - dependencies: - node-gyp: latest - conditions: os=darwin - languageName: node - linkType: hard - -"gauge@npm:^4.0.3": - version: 4.0.4 - resolution: "gauge@npm:4.0.4" - dependencies: - aproba: ^1.0.3 || ^2.0.0 - color-support: ^1.1.3 - console-control-strings: ^1.1.0 - has-unicode: ^2.0.1 - signal-exit: ^3.0.7 - string-width: ^4.2.3 - strip-ansi: ^6.0.1 - wide-align: ^1.1.5 - checksum: 788b6bfe52f1dd8e263cda800c26ac0ca2ff6de0b6eee2fe0d9e3abf15e149b651bd27bf5226be10e6e3edb5c4e5d5985a5a1a98137e7a892f75eff76467ad2d - languageName: node - linkType: hard - -"glob-parent@npm:^6.0.2": - version: 6.0.2 - resolution: "glob-parent@npm:6.0.2" - dependencies: - is-glob: ^4.0.3 - checksum: c13ee97978bef4f55106b71e66428eb1512e71a7466ba49025fc2aec59a5bfb0954d5abd58fc5ee6c9b076eef4e1f6d3375c2e964b88466ca390da4419a786a8 - languageName: node - linkType: hard - -"glob@npm:^10.2.2": - version: 10.3.10 - resolution: "glob@npm:10.3.10" - dependencies: - foreground-child: ^3.1.0 - jackspeak: ^2.3.5 - minimatch: ^9.0.1 - minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 - path-scurry: ^1.10.1 - bin: - glob: dist/esm/bin.mjs - checksum: 4f2fe2511e157b5a3f525a54092169a5f92405f24d2aed3142f4411df328baca13059f4182f1db1bf933e2c69c0bd89e57ae87edd8950cba8c7ccbe84f721cf3 - languageName: node - linkType: hard - -"glob@npm:^7.1.3, glob@npm:^7.1.4": - version: 7.2.3 - resolution: "glob@npm:7.2.3" - dependencies: - fs.realpath: ^1.0.0 - inflight: ^1.0.4 - inherits: 2 - minimatch: ^3.1.1 - once: ^1.3.0 - path-is-absolute: ^1.0.0 - checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 - languageName: node - linkType: hard - -"globals@npm:^13.19.0": - version: 13.23.0 - resolution: "globals@npm:13.23.0" - dependencies: - type-fest: ^0.20.2 - checksum: 194c97cf8d1ef6ba59417234c2386549c4103b6e5f24b1ff1952de61a4753e5d2069435ba629de711a6480b1b1d114a98e2ab27f85e966d5a10c319c3bbd3dc3 - languageName: node - linkType: hard - -"graceful-fs@npm:^4.2.6": - version: 4.2.11 - resolution: "graceful-fs@npm:4.2.11" - checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 - languageName: node - linkType: hard - -"graphemer@npm:^1.4.0": - version: 1.4.0 - resolution: "graphemer@npm:1.4.0" - checksum: bab8f0be9b568857c7bec9fda95a89f87b783546d02951c40c33f84d05bb7da3fd10f863a9beb901463669b6583173a8c8cc6d6b306ea2b9b9d5d3d943c3a673 - languageName: node - linkType: hard - -"has-flag@npm:^4.0.0": - version: 4.0.0 - resolution: "has-flag@npm:4.0.0" - checksum: 261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad - languageName: node - linkType: hard - -"has-unicode@npm:^2.0.1": - version: 2.0.1 - resolution: "has-unicode@npm:2.0.1" - checksum: 1eab07a7436512db0be40a710b29b5dc21fa04880b7f63c9980b706683127e3c1b57cb80ea96d47991bdae2dfe479604f6a1ba410106ee1046a41d1bd0814400 - languageName: node - linkType: hard - -"http-cache-semantics@npm:^4.1.1": - version: 4.1.1 - resolution: "http-cache-semantics@npm:4.1.1" - checksum: 83ac0bc60b17a3a36f9953e7be55e5c8f41acc61b22583060e8dedc9dd5e3607c823a88d0926f9150e571f90946835c7fe150732801010845c72cd8bbff1a236 - languageName: node - linkType: hard - -"http-proxy-agent@npm:^5.0.0": - version: 5.0.0 - resolution: "http-proxy-agent@npm:5.0.0" - dependencies: - "@tootallnate/once": 2 - agent-base: 6 - debug: 4 - checksum: e2ee1ff1656a131953839b2a19cd1f3a52d97c25ba87bd2559af6ae87114abf60971e498021f9b73f9fd78aea8876d1fb0d4656aac8a03c6caa9fc175f22b786 - languageName: node - linkType: hard - -"https-proxy-agent@npm:^5.0.0": - version: 5.0.1 - resolution: "https-proxy-agent@npm:5.0.1" - dependencies: - agent-base: 6 - debug: 4 - checksum: 571fccdf38184f05943e12d37d6ce38197becdd69e58d03f43637f7fa1269cf303a7d228aa27e5b27bbd3af8f09fd938e1c91dcfefff2df7ba77c20ed8dfc765 - languageName: node - linkType: hard - -"humanize-ms@npm:^1.2.1": - version: 1.2.1 - resolution: "humanize-ms@npm:1.2.1" - dependencies: - ms: ^2.0.0 - checksum: 9c7a74a2827f9294c009266c82031030eae811ca87b0da3dceb8d6071b9bde22c9f3daef0469c3c533cc67a97d8a167cd9fc0389350e5f415f61a79b171ded16 - languageName: node - linkType: hard - -"iconv-lite@npm:^0.6.2": - version: 0.6.3 - resolution: "iconv-lite@npm:0.6.3" - dependencies: - safer-buffer: ">= 2.1.2 < 3.0.0" - checksum: 3f60d47a5c8fc3313317edfd29a00a692cc87a19cac0159e2ce711d0ebc9019064108323b5e493625e25594f11c6236647d8e256fbe7a58f4a3b33b89e6d30bf - languageName: node - linkType: hard - -"ignore@npm:^5.2.0": - version: 5.2.4 - resolution: "ignore@npm:5.2.4" - checksum: 3d4c309c6006e2621659311783eaea7ebcd41fe4ca1d78c91c473157ad6666a57a2df790fe0d07a12300d9aac2888204d7be8d59f9aaf665b1c7fcdb432517ef - languageName: node - linkType: hard - -"import-fresh@npm:^3.2.1": - version: 3.3.0 - resolution: "import-fresh@npm:3.3.0" - dependencies: - parent-module: ^1.0.0 - resolve-from: ^4.0.0 - checksum: 2cacfad06e652b1edc50be650f7ec3be08c5e5a6f6d12d035c440a42a8cc028e60a5b99ca08a77ab4d6b1346da7d971915828f33cdab730d3d42f08242d09baa - languageName: node - linkType: hard - -"imurmurhash@npm:^0.1.4": - version: 0.1.4 - resolution: "imurmurhash@npm:0.1.4" - checksum: 7cae75c8cd9a50f57dadd77482359f659eaebac0319dd9368bcd1714f55e65badd6929ca58569da2b6494ef13fdd5598cd700b1eba23f8b79c5f19d195a3ecf7 - languageName: node - linkType: hard - -"indent-string@npm:^4.0.0": - version: 4.0.0 - resolution: "indent-string@npm:4.0.0" - checksum: 824cfb9929d031dabf059bebfe08cf3137365e112019086ed3dcff6a0a7b698cb80cf67ccccde0e25b9e2d7527aa6cc1fed1ac490c752162496caba3e6699612 - languageName: node - linkType: hard - -"inflight@npm:^1.0.4": - version: 1.0.6 - resolution: "inflight@npm:1.0.6" - dependencies: - once: ^1.3.0 - wrappy: 1 - checksum: f4f76aa072ce19fae87ce1ef7d221e709afb59d445e05d47fba710e85470923a75de35bfae47da6de1b18afc3ce83d70facf44cfb0aff89f0a3f45c0a0244dfd - languageName: node - linkType: hard - -"inherits@npm:2, inherits@npm:^2.0.3": - version: 2.0.4 - resolution: "inherits@npm:2.0.4" - checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 - languageName: node - linkType: hard - -"ip@npm:^2.0.0": - version: 2.0.0 - resolution: "ip@npm:2.0.0" - checksum: cfcfac6b873b701996d71ec82a7dd27ba92450afdb421e356f44044ed688df04567344c36cbacea7d01b1c39a4c732dc012570ebe9bebfb06f27314bca625349 - languageName: node - linkType: hard - -"is-extglob@npm:^2.1.1": - version: 2.1.1 - resolution: "is-extglob@npm:2.1.1" - checksum: df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85 - languageName: node - linkType: hard - -"is-fullwidth-code-point@npm:^3.0.0": - version: 3.0.0 - resolution: "is-fullwidth-code-point@npm:3.0.0" - checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348 - languageName: node - linkType: hard - -"is-glob@npm:^4.0.0, is-glob@npm:^4.0.3": - version: 4.0.3 - resolution: "is-glob@npm:4.0.3" - dependencies: - is-extglob: ^2.1.1 - checksum: d381c1319fcb69d341cc6e6c7cd588e17cd94722d9a32dbd60660b993c4fb7d0f19438674e68dfec686d09b7c73139c9166b47597f846af387450224a8101ab4 - languageName: node - linkType: hard - -"is-lambda@npm:^1.0.1": - version: 1.0.1 - resolution: "is-lambda@npm:1.0.1" - checksum: 93a32f01940220532e5948538699ad610d5924ac86093fcee83022252b363eb0cc99ba53ab084a04e4fb62bf7b5731f55496257a4c38adf87af9c4d352c71c35 - languageName: node - linkType: hard - -"is-path-inside@npm:^3.0.3": - version: 3.0.3 - resolution: "is-path-inside@npm:3.0.3" - checksum: abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 - languageName: node - linkType: hard - -"isexe@npm:^2.0.0": - version: 2.0.0 - resolution: "isexe@npm:2.0.0" - checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62 - languageName: node - linkType: hard - -"jackspeak@npm:^2.3.5": - version: 2.3.6 - resolution: "jackspeak@npm:2.3.6" - dependencies: - "@isaacs/cliui": ^8.0.2 - "@pkgjs/parseargs": ^0.11.0 - dependenciesMeta: - "@pkgjs/parseargs": - optional: true - checksum: 57d43ad11eadc98cdfe7496612f6bbb5255ea69fe51ea431162db302c2a11011642f50cfad57288bd0aea78384a0612b16e131944ad8ecd09d619041c8531b54 - languageName: node - linkType: hard - -"js-yaml@npm:^4.1.0": - version: 4.1.0 - resolution: "js-yaml@npm:4.1.0" - dependencies: - argparse: ^2.0.1 - bin: - js-yaml: bin/js-yaml.js - checksum: c7830dfd456c3ef2c6e355cc5a92e6700ceafa1d14bba54497b34a99f0376cecbb3e9ac14d3e5849b426d5a5140709a66237a8c991c675431271c4ce5504151a - languageName: node - linkType: hard - -"json-buffer@npm:3.0.1": - version: 3.0.1 - resolution: "json-buffer@npm:3.0.1" - checksum: 9026b03edc2847eefa2e37646c579300a1f3a4586cfb62bf857832b60c852042d0d6ae55d1afb8926163fa54c2b01d83ae24705f34990348bdac6273a29d4581 - languageName: node - linkType: hard - -"json-schema-traverse@npm:^0.4.1": - version: 0.4.1 - resolution: "json-schema-traverse@npm:0.4.1" - checksum: 7486074d3ba247769fda17d5181b345c9fb7d12e0da98b22d1d71a5db9698d8b4bd900a3ec1a4ffdd60846fc2556274a5c894d0c48795f14cb03aeae7b55260b - languageName: node - linkType: hard - -"json-stable-stringify-without-jsonify@npm:^1.0.1": - version: 1.0.1 - resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" - checksum: cff44156ddce9c67c44386ad5cddf91925fe06b1d217f2da9c4910d01f358c6e3989c4d5a02683c7a5667f9727ff05831f7aa8ae66c8ff691c556f0884d49215 - languageName: node - linkType: hard - -"keyv@npm:^4.5.3": - version: 4.5.4 - resolution: "keyv@npm:4.5.4" - dependencies: - json-buffer: 3.0.1 - checksum: 74a24395b1c34bd44ad5cb2b49140d087553e170625240b86755a6604cd65aa16efdbdeae5cdb17ba1284a0fbb25ad06263755dbc71b8d8b06f74232ce3cdd72 - languageName: node - linkType: hard - -"levn@npm:^0.4.1": - version: 0.4.1 - resolution: "levn@npm:0.4.1" - dependencies: - prelude-ls: ^1.2.1 - type-check: ~0.4.0 - checksum: 12c5021c859bd0f5248561bf139121f0358285ec545ebf48bb3d346820d5c61a4309535c7f387ed7d84361cf821e124ce346c6b7cef8ee09a67c1473b46d0fc4 - languageName: node - linkType: hard - -"locate-path@npm:^6.0.0": - version: 6.0.0 - resolution: "locate-path@npm:6.0.0" - dependencies: - p-locate: ^5.0.0 - checksum: 72eb661788a0368c099a184c59d2fee760b3831c9c1c33955e8a19ae4a21b4116e53fa736dc086cdeb9fce9f7cc508f2f92d2d3aae516f133e16a2bb59a39f5a - languageName: node - linkType: hard - -"lodash.merge@npm:^4.6.2": - version: 4.6.2 - resolution: "lodash.merge@npm:4.6.2" - checksum: ad580b4bdbb7ca1f7abf7e1bce63a9a0b98e370cf40194b03380a46b4ed799c9573029599caebc1b14e3f24b111aef72b96674a56cfa105e0f5ac70546cdc005 - languageName: node - linkType: hard - -"lru-cache@npm:^6.0.0": - version: 6.0.0 - resolution: "lru-cache@npm:6.0.0" - dependencies: - yallist: ^4.0.0 - checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 - languageName: node - linkType: hard - -"lru-cache@npm:^7.7.1": - version: 7.18.3 - resolution: "lru-cache@npm:7.18.3" - checksum: e550d772384709deea3f141af34b6d4fa392e2e418c1498c078de0ee63670f1f46f5eee746e8ef7e69e1c895af0d4224e62ee33e66a543a14763b0f2e74c1356 - languageName: node - linkType: hard - -"lru-cache@npm:^9.1.1 || ^10.0.0": - version: 10.0.1 - resolution: "lru-cache@npm:10.0.1" - checksum: 06f8d0e1ceabd76bb6f644a26dbb0b4c471b79c7b514c13c6856113879b3bf369eb7b497dad4ff2b7e2636db202412394865b33c332100876d838ad1372f0181 - languageName: node - linkType: hard - -"make-fetch-happen@npm:^11.0.3": - version: 11.1.1 - resolution: "make-fetch-happen@npm:11.1.1" - dependencies: - agentkeepalive: ^4.2.1 - cacache: ^17.0.0 - http-cache-semantics: ^4.1.1 - http-proxy-agent: ^5.0.0 - https-proxy-agent: ^5.0.0 - is-lambda: ^1.0.1 - lru-cache: ^7.7.1 - minipass: ^5.0.0 - minipass-fetch: ^3.0.0 - minipass-flush: ^1.0.5 - minipass-pipeline: ^1.2.4 - negotiator: ^0.6.3 - promise-retry: ^2.0.1 - socks-proxy-agent: ^7.0.0 - ssri: ^10.0.0 - checksum: 7268bf274a0f6dcf0343829489a4506603ff34bd0649c12058753900b0eb29191dce5dba12680719a5d0a983d3e57810f594a12f3c18494e93a1fbc6348a4540 - languageName: node - linkType: hard - -"minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": - version: 3.1.2 - resolution: "minimatch@npm:3.1.2" - dependencies: - brace-expansion: ^1.1.7 - checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a - languageName: node - linkType: hard - -"minimatch@npm:^9.0.1": - version: 9.0.3 - resolution: "minimatch@npm:9.0.3" - dependencies: - brace-expansion: ^2.0.1 - checksum: 253487976bf485b612f16bf57463520a14f512662e592e95c571afdab1442a6a6864b6c88f248ce6fc4ff0b6de04ac7aa6c8bb51e868e99d1d65eb0658a708b5 - languageName: node - linkType: hard - -"minipass-collect@npm:^1.0.2": - version: 1.0.2 - resolution: "minipass-collect@npm:1.0.2" - dependencies: - minipass: ^3.0.0 - checksum: 14df761028f3e47293aee72888f2657695ec66bd7d09cae7ad558da30415fdc4752bbfee66287dcc6fd5e6a2fa3466d6c484dc1cbd986525d9393b9523d97f10 - languageName: node - linkType: hard - -"minipass-fetch@npm:^3.0.0": - version: 3.0.4 - resolution: "minipass-fetch@npm:3.0.4" - dependencies: - encoding: ^0.1.13 - minipass: ^7.0.3 - minipass-sized: ^1.0.3 - minizlib: ^2.1.2 - dependenciesMeta: - encoding: - optional: true - checksum: af7aad15d5c128ab1ebe52e043bdf7d62c3c6f0cecb9285b40d7b395e1375b45dcdfd40e63e93d26a0e8249c9efd5c325c65575aceee192883970ff8cb11364a - languageName: node - linkType: hard - -"minipass-flush@npm:^1.0.5": - version: 1.0.5 - resolution: "minipass-flush@npm:1.0.5" - dependencies: - minipass: ^3.0.0 - checksum: 56269a0b22bad756a08a94b1ffc36b7c9c5de0735a4dd1ab2b06c066d795cfd1f0ac44a0fcae13eece5589b908ecddc867f04c745c7009be0b566421ea0944cf - languageName: node - linkType: hard - -"minipass-pipeline@npm:^1.2.4": - version: 1.2.4 - resolution: "minipass-pipeline@npm:1.2.4" - dependencies: - minipass: ^3.0.0 - checksum: b14240dac0d29823c3d5911c286069e36d0b81173d7bdf07a7e4a91ecdef92cdff4baaf31ea3746f1c61e0957f652e641223970870e2353593f382112257971b - languageName: node - linkType: hard - -"minipass-sized@npm:^1.0.3": - version: 1.0.3 - resolution: "minipass-sized@npm:1.0.3" - dependencies: - minipass: ^3.0.0 - checksum: 79076749fcacf21b5d16dd596d32c3b6bf4d6e62abb43868fac21674078505c8b15eaca4e47ed844985a4514854f917d78f588fcd029693709417d8f98b2bd60 - languageName: node - linkType: hard - -"minipass@npm:^3.0.0": - version: 3.3.6 - resolution: "minipass@npm:3.3.6" - dependencies: - yallist: ^4.0.0 - checksum: a30d083c8054cee83cdcdc97f97e4641a3f58ae743970457b1489ce38ee1167b3aaf7d815cd39ec7a99b9c40397fd4f686e83750e73e652b21cb516f6d845e48 - languageName: node - linkType: hard - -"minipass@npm:^5.0.0": - version: 5.0.0 - resolution: "minipass@npm:5.0.0" - checksum: 425dab288738853fded43da3314a0b5c035844d6f3097a8e3b5b29b328da8f3c1af6fc70618b32c29ff906284cf6406b6841376f21caaadd0793c1d5a6a620ea - languageName: node - linkType: hard - -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.3": - version: 7.0.4 - resolution: "minipass@npm:7.0.4" - checksum: 87585e258b9488caf2e7acea242fd7856bbe9a2c84a7807643513a338d66f368c7d518200ad7b70a508664d408aa000517647b2930c259a8b1f9f0984f344a21 - languageName: node - linkType: hard - -"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": - version: 2.1.2 - resolution: "minizlib@npm:2.1.2" - dependencies: - minipass: ^3.0.0 - yallist: ^4.0.0 - checksum: f1fdeac0b07cf8f30fcf12f4b586795b97be856edea22b5e9072707be51fc95d41487faec3f265b42973a304fe3a64acd91a44a3826a963e37b37bafde0212c3 - languageName: node - linkType: hard - -"mkdirp@npm:^1.0.3": - version: 1.0.4 - resolution: "mkdirp@npm:1.0.4" - bin: - mkdirp: bin/cmd.js - checksum: a96865108c6c3b1b8e1d5e9f11843de1e077e57737602de1b82030815f311be11f96f09cce59bd5b903d0b29834733e5313f9301e3ed6d6f6fba2eae0df4298f - languageName: node - linkType: hard - -"ms@npm:2.1.2": - version: 2.1.2 - resolution: "ms@npm:2.1.2" - checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f - languageName: node - linkType: hard - -"ms@npm:^2.0.0": - version: 2.1.3 - resolution: "ms@npm:2.1.3" - checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d - languageName: node - linkType: hard - -"natural-compare@npm:^1.4.0": - version: 1.4.0 - resolution: "natural-compare@npm:1.4.0" - checksum: 23ad088b08f898fc9b53011d7bb78ec48e79de7627e01ab5518e806033861bef68d5b0cd0e2205c2f36690ac9571ff6bcb05eb777ced2eeda8d4ac5b44592c3d - languageName: node - linkType: hard - -"negotiator@npm:^0.6.3": - version: 0.6.3 - resolution: "negotiator@npm:0.6.3" - checksum: b8ffeb1e262eff7968fc90a2b6767b04cfd9842582a9d0ece0af7049537266e7b2506dfb1d107a32f06dd849ab2aea834d5830f7f4d0e5cb7d36e1ae55d021d9 - languageName: node - linkType: hard - -"node-gyp@npm:latest": - version: 9.4.0 - resolution: "node-gyp@npm:9.4.0" - dependencies: - env-paths: ^2.2.0 - exponential-backoff: ^3.1.1 - glob: ^7.1.4 - graceful-fs: ^4.2.6 - make-fetch-happen: ^11.0.3 - nopt: ^6.0.0 - npmlog: ^6.0.0 - rimraf: ^3.0.2 - semver: ^7.3.5 - tar: ^6.1.2 - which: ^2.0.2 - bin: - node-gyp: bin/node-gyp.js - checksum: 78b404e2e0639d64e145845f7f5a3cb20c0520cdaf6dda2f6e025e9b644077202ea7de1232396ba5bde3fee84cdc79604feebe6ba3ec84d464c85d407bb5da99 - languageName: node - linkType: hard - -"nopt@npm:^6.0.0": - version: 6.0.0 - resolution: "nopt@npm:6.0.0" - dependencies: - abbrev: ^1.0.0 - bin: - nopt: bin/nopt.js - checksum: 82149371f8be0c4b9ec2f863cc6509a7fd0fa729929c009f3a58e4eb0c9e4cae9920e8f1f8eb46e7d032fec8fb01bede7f0f41a67eb3553b7b8e14fa53de1dac - languageName: node - linkType: hard - -"npmlog@npm:^6.0.0": - version: 6.0.2 - resolution: "npmlog@npm:6.0.2" - dependencies: - are-we-there-yet: ^3.0.0 - console-control-strings: ^1.1.0 - gauge: ^4.0.3 - set-blocking: ^2.0.0 - checksum: ae238cd264a1c3f22091cdd9e2b106f684297d3c184f1146984ecbe18aaa86343953f26b9520dedd1b1372bc0316905b736c1932d778dbeb1fcf5a1001390e2a - languageName: node - linkType: hard - -"once@npm:^1.3.0": - version: 1.4.0 - resolution: "once@npm:1.4.0" - dependencies: - wrappy: 1 - checksum: cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 - languageName: node - linkType: hard - -"optionator@npm:^0.9.3": - version: 0.9.3 - resolution: "optionator@npm:0.9.3" - dependencies: - "@aashutoshrathi/word-wrap": ^1.2.3 - deep-is: ^0.1.3 - fast-levenshtein: ^2.0.6 - levn: ^0.4.1 - prelude-ls: ^1.2.1 - type-check: ^0.4.0 - checksum: 09281999441f2fe9c33a5eeab76700795365a061563d66b098923eb719251a42bdbe432790d35064d0816ead9296dbeb1ad51a733edf4167c96bd5d0882e428a - languageName: node - linkType: hard - -"p-limit@npm:^3.0.2": - version: 3.1.0 - resolution: "p-limit@npm:3.1.0" - dependencies: - yocto-queue: ^0.1.0 - checksum: 7c3690c4dbf62ef625671e20b7bdf1cbc9534e83352a2780f165b0d3ceba21907e77ad63401708145ca4e25bfc51636588d89a8c0aeb715e6c37d1c066430360 - languageName: node - linkType: hard - -"p-locate@npm:^5.0.0": - version: 5.0.0 - resolution: "p-locate@npm:5.0.0" - dependencies: - p-limit: ^3.0.2 - checksum: 1623088f36cf1cbca58e9b61c4e62bf0c60a07af5ae1ca99a720837356b5b6c5ba3eb1b2127e47a06865fee59dd0453cad7cc844cda9d5a62ac1a5a51b7c86d3 - languageName: node - linkType: hard - -"p-map@npm:^4.0.0": - version: 4.0.0 - resolution: "p-map@npm:4.0.0" - dependencies: - aggregate-error: ^3.0.0 - checksum: cb0ab21ec0f32ddffd31dfc250e3afa61e103ef43d957cc45497afe37513634589316de4eb88abdfd969fe6410c22c0b93ab24328833b8eb1ccc087fc0442a1c - languageName: node - linkType: hard - -"parent-module@npm:^1.0.0": - version: 1.0.1 - resolution: "parent-module@npm:1.0.1" - dependencies: - callsites: ^3.0.0 - checksum: 6ba8b255145cae9470cf5551eb74be2d22281587af787a2626683a6c20fbb464978784661478dd2a3f1dad74d1e802d403e1b03c1a31fab310259eec8ac560ff - languageName: node - linkType: hard - -"path-exists@npm:^4.0.0": - version: 4.0.0 - resolution: "path-exists@npm:4.0.0" - checksum: 505807199dfb7c50737b057dd8d351b82c033029ab94cb10a657609e00c1bc53b951cfdbccab8de04c5584d5eff31128ce6afd3db79281874a5ef2adbba55ed1 - languageName: node - linkType: hard - -"path-is-absolute@npm:^1.0.0": - version: 1.0.1 - resolution: "path-is-absolute@npm:1.0.1" - checksum: 060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8 - languageName: node - linkType: hard - -"path-key@npm:^3.1.0": - version: 3.1.1 - resolution: "path-key@npm:3.1.1" - checksum: 55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020 - languageName: node - linkType: hard - -"path-scurry@npm:^1.10.1": - version: 1.10.1 - resolution: "path-scurry@npm:1.10.1" - dependencies: - lru-cache: ^9.1.1 || ^10.0.0 - minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 - checksum: e2557cff3a8fb8bc07afdd6ab163a92587884f9969b05bbbaf6fe7379348bfb09af9ed292af12ed32398b15fb443e81692047b786d1eeb6d898a51eb17ed7d90 - languageName: node - linkType: hard - -"prelude-ls@npm:^1.2.1": - version: 1.2.1 - resolution: "prelude-ls@npm:1.2.1" - checksum: cd192ec0d0a8e4c6da3bb80e4f62afe336df3f76271ac6deb0e6a36187133b6073a19e9727a1ff108cd8b9982e4768850d413baa71214dd80c7979617dca827a - languageName: node - linkType: hard - -"promise-retry@npm:^2.0.1": - version: 2.0.1 - resolution: "promise-retry@npm:2.0.1" - dependencies: - err-code: ^2.0.2 - retry: ^0.12.0 - checksum: f96a3f6d90b92b568a26f71e966cbbc0f63ab85ea6ff6c81284dc869b41510e6cdef99b6b65f9030f0db422bf7c96652a3fff9f2e8fb4a0f069d8f4430359429 - languageName: node - linkType: hard - -"punycode@npm:^2.1.0": - version: 2.3.0 - resolution: "punycode@npm:2.3.0" - checksum: 39f760e09a2a3bbfe8f5287cf733ecdad69d6af2fe6f97ca95f24b8921858b91e9ea3c9eeec6e08cede96181b3bb33f95c6ffd8c77e63986508aa2e8159fa200 - languageName: node - linkType: hard - -"queue-microtask@npm:^1.2.2": - version: 1.2.3 - resolution: "queue-microtask@npm:1.2.3" - checksum: b676f8c040cdc5b12723ad2f91414d267605b26419d5c821ff03befa817ddd10e238d22b25d604920340fd73efd8ba795465a0377c4adf45a4a41e4234e42dc4 - languageName: node - linkType: hard - -"readable-stream@npm:^3.6.0": - version: 3.6.2 - resolution: "readable-stream@npm:3.6.2" - dependencies: - inherits: ^2.0.3 - string_decoder: ^1.1.1 - util-deprecate: ^1.0.1 - checksum: bdcbe6c22e846b6af075e32cf8f4751c2576238c5043169a1c221c92ee2878458a816a4ea33f4c67623c0b6827c8a400409bfb3cf0bf3381392d0b1dfb52ac8d - languageName: node - linkType: hard - -"resolve-from@npm:^4.0.0": - version: 4.0.0 - resolution: "resolve-from@npm:4.0.0" - checksum: f4ba0b8494846a5066328ad33ef8ac173801a51739eb4d63408c847da9a2e1c1de1e6cbbf72699211f3d13f8fc1325648b169bd15eb7da35688e30a5fb0e4a7f - languageName: node - linkType: hard - -"retry@npm:^0.12.0": - version: 0.12.0 - resolution: "retry@npm:0.12.0" - checksum: 623bd7d2e5119467ba66202d733ec3c2e2e26568074923bc0585b6b99db14f357e79bdedb63cab56cec47491c4a0da7e6021a7465ca6dc4f481d3898fdd3158c - languageName: node - linkType: hard - -"reusify@npm:^1.0.4": - version: 1.0.4 - resolution: "reusify@npm:1.0.4" - checksum: c3076ebcc22a6bc252cb0b9c77561795256c22b757f40c0d8110b1300723f15ec0fc8685e8d4ea6d7666f36c79ccc793b1939c748bf36f18f542744a4e379fcc - languageName: node - linkType: hard - -"rimraf@npm:^3.0.2": - version: 3.0.2 - resolution: "rimraf@npm:3.0.2" - dependencies: - glob: ^7.1.3 - bin: - rimraf: bin.js - checksum: 87f4164e396f0171b0a3386cc1877a817f572148ee13a7e113b238e48e8a9f2f31d009a92ec38a591ff1567d9662c6b67fd8818a2dbbaed74bc26a87a2a4a9a0 - languageName: node - linkType: hard - -"rollup@npm:^2.66.1": - version: 2.79.1 - resolution: "rollup@npm:2.79.1" - dependencies: - fsevents: ~2.3.2 - dependenciesMeta: - fsevents: - optional: true - bin: - rollup: dist/bin/rollup - checksum: 6a2bf167b3587d4df709b37d149ad0300692cc5deb510f89ac7bdc77c8738c9546ae3de9322b0968e1ed2b0e984571f5f55aae28fa7de4cfcb1bc5402a4e2be6 - languageName: node - linkType: hard - -"run-parallel@npm:^1.1.9": - version: 1.2.0 - resolution: "run-parallel@npm:1.2.0" - dependencies: - queue-microtask: ^1.2.2 - checksum: cb4f97ad25a75ebc11a8ef4e33bb962f8af8516bb2001082ceabd8902e15b98f4b84b4f8a9b222e5d57fc3bd1379c483886ed4619367a7680dad65316993021d - languageName: node - linkType: hard - -"safe-buffer@npm:~5.2.0": - version: 5.2.1 - resolution: "safe-buffer@npm:5.2.1" - checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 - languageName: node - linkType: hard - -"safer-buffer@npm:>= 2.1.2 < 3.0.0": - version: 2.1.2 - resolution: "safer-buffer@npm:2.1.2" - checksum: cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0 - languageName: node - linkType: hard - -"semver@npm:^7.3.5": - version: 7.5.4 - resolution: "semver@npm:7.5.4" - dependencies: - lru-cache: ^6.0.0 - bin: - semver: bin/semver.js - checksum: 12d8ad952fa353b0995bf180cdac205a4068b759a140e5d3c608317098b3575ac2f1e09182206bf2eb26120e1c0ed8fb92c48c592f6099680de56bb071423ca3 - languageName: node - linkType: hard - -"set-blocking@npm:^2.0.0": - version: 2.0.0 - resolution: "set-blocking@npm:2.0.0" - checksum: 6e65a05f7cf7ebdf8b7c75b101e18c0b7e3dff4940d480efed8aad3a36a4005140b660fa1d804cb8bce911cac290441dc728084a30504d3516ac2ff7ad607b02 - languageName: node - linkType: hard - -"shebang-command@npm:^2.0.0": - version: 2.0.0 - resolution: "shebang-command@npm:2.0.0" - dependencies: - shebang-regex: ^3.0.0 - checksum: 6b52fe87271c12968f6a054e60f6bde5f0f3d2db483a1e5c3e12d657c488a15474121a1d55cd958f6df026a54374ec38a4a963988c213b7570e1d51575cea7fa - languageName: node - linkType: hard - -"shebang-regex@npm:^3.0.0": - version: 3.0.0 - resolution: "shebang-regex@npm:3.0.0" - checksum: 1a2bcae50de99034fcd92ad4212d8e01eedf52c7ec7830eedcf886622804fe36884278f2be8be0ea5fde3fd1c23911643a4e0f726c8685b61871c8908af01222 - languageName: node - linkType: hard - -"signal-exit@npm:^3.0.7": - version: 3.0.7 - resolution: "signal-exit@npm:3.0.7" - checksum: a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 - languageName: node - linkType: hard - -"signal-exit@npm:^4.0.1": - version: 4.1.0 - resolution: "signal-exit@npm:4.1.0" - checksum: 64c757b498cb8629ffa5f75485340594d2f8189e9b08700e69199069c8e3070fb3e255f7ab873c05dc0b3cec412aea7402e10a5990cb6a050bd33ba062a6c549 - languageName: node - linkType: hard - -"smart-buffer@npm:^4.2.0": - version: 4.2.0 - resolution: "smart-buffer@npm:4.2.0" - checksum: b5167a7142c1da704c0e3af85c402002b597081dd9575031a90b4f229ca5678e9a36e8a374f1814c8156a725d17008ae3bde63b92f9cfd132526379e580bec8b - languageName: node - linkType: hard - -"socks-proxy-agent@npm:^7.0.0": - version: 7.0.0 - resolution: "socks-proxy-agent@npm:7.0.0" - dependencies: - agent-base: ^6.0.2 - debug: ^4.3.3 - socks: ^2.6.2 - checksum: 720554370154cbc979e2e9ce6a6ec6ced205d02757d8f5d93fe95adae454fc187a5cbfc6b022afab850a5ce9b4c7d73e0f98e381879cf45f66317a4895953846 - languageName: node - linkType: hard - -"socks@npm:^2.6.2": - version: 2.7.1 - resolution: "socks@npm:2.7.1" - dependencies: - ip: ^2.0.0 - smart-buffer: ^4.2.0 - checksum: 259d9e3e8e1c9809a7f5c32238c3d4d2a36b39b83851d0f573bfde5f21c4b1288417ce1af06af1452569cd1eb0841169afd4998f0e04ba04656f6b7f0e46d748 - languageName: node - linkType: hard - -"source-map-support@npm:~0.5.20": - version: 0.5.21 - resolution: "source-map-support@npm:0.5.21" - dependencies: - buffer-from: ^1.0.0 - source-map: ^0.6.0 - checksum: 43e98d700d79af1d36f859bdb7318e601dfc918c7ba2e98456118ebc4c4872b327773e5a1df09b0524e9e5063bb18f0934538eace60cca2710d1fa687645d137 - languageName: node - linkType: hard - -"source-map@npm:^0.6.0": - version: 0.6.1 - resolution: "source-map@npm:0.6.1" - checksum: 59ce8640cf3f3124f64ac289012c2b8bd377c238e316fb323ea22fbfe83da07d81e000071d7242cad7a23cd91c7de98e4df8830ec3f133cb6133a5f6e9f67bc2 - languageName: node - linkType: hard - -"ssri@npm:^10.0.0": - version: 10.0.5 - resolution: "ssri@npm:10.0.5" - dependencies: - minipass: ^7.0.3 - checksum: 0a31b65f21872dea1ed3f7c200d7bc1c1b91c15e419deca14f282508ba917cbb342c08a6814c7f68ca4ca4116dd1a85da2bbf39227480e50125a1ceffeecb750 - languageName: node - linkType: hard - -"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.3": - version: 4.2.3 - resolution: "string-width@npm:4.2.3" - dependencies: - emoji-regex: ^8.0.0 - is-fullwidth-code-point: ^3.0.0 - strip-ansi: ^6.0.1 - checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb - languageName: node - linkType: hard - -"string-width@npm:^5.0.1, string-width@npm:^5.1.2": - version: 5.1.2 - resolution: "string-width@npm:5.1.2" - dependencies: - eastasianwidth: ^0.2.0 - emoji-regex: ^9.2.2 - strip-ansi: ^7.0.1 - checksum: 7369deaa29f21dda9a438686154b62c2c5f661f8dda60449088f9f980196f7908fc39fdd1803e3e01541970287cf5deae336798337e9319a7055af89dafa7193 - languageName: node - linkType: hard - -"string_decoder@npm:^1.1.1": - version: 1.3.0 - resolution: "string_decoder@npm:1.3.0" - dependencies: - safe-buffer: ~5.2.0 - checksum: 8417646695a66e73aefc4420eb3b84cc9ffd89572861fe004e6aeb13c7bc00e2f616247505d2dbbef24247c372f70268f594af7126f43548565c68c117bdeb56 - languageName: node - linkType: hard - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": - version: 6.0.1 - resolution: "strip-ansi@npm:6.0.1" - dependencies: - ansi-regex: ^5.0.1 - checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c - languageName: node - linkType: hard - -"strip-ansi@npm:^7.0.1": - version: 7.1.0 - resolution: "strip-ansi@npm:7.1.0" - dependencies: - ansi-regex: ^6.0.1 - checksum: 859c73fcf27869c22a4e4d8c6acfe690064659e84bef9458aa6d13719d09ca88dcfd40cbf31fd0be63518ea1a643fe070b4827d353e09533a5b0b9fd4553d64d - languageName: node - linkType: hard - -"strip-json-comments@npm:^3.1.1": - version: 3.1.1 - resolution: "strip-json-comments@npm:3.1.1" - checksum: 492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443 - languageName: node - linkType: hard - -"supports-color@npm:^7.1.0": - version: 7.2.0 - resolution: "supports-color@npm:7.2.0" - dependencies: - has-flag: ^4.0.0 - checksum: 3dda818de06ebbe5b9653e07842d9479f3555ebc77e9a0280caf5a14fb877ffee9ed57007c3b78f5a6324b8dbeec648d9e97a24e2ed9fdb81ddc69ea07100f4a - languageName: node - linkType: hard - -"tar@npm:^6.1.11, tar@npm:^6.1.2": - version: 6.2.0 - resolution: "tar@npm:6.2.0" - dependencies: - chownr: ^2.0.0 - fs-minipass: ^2.0.0 - minipass: ^5.0.0 - minizlib: ^2.1.1 - mkdirp: ^1.0.3 - yallist: ^4.0.0 - checksum: db4d9fe74a2082c3a5016630092c54c8375ff3b280186938cfd104f2e089c4fd9bad58688ef6be9cf186a889671bf355c7cda38f09bbf60604b281715ca57f5c - languageName: node - linkType: hard - -"temml@workspace:.": - version: 0.0.0-use.local - resolution: "temml@workspace:." - dependencies: - eslint: ^8.39.0 - esm: ^3.2.25 - rollup: ^2.66.1 - terser: ^5.14.2 - languageName: unknown - linkType: soft - -"terser@npm:^5.14.2": - version: 5.22.0 - resolution: "terser@npm:5.22.0" - dependencies: - "@jridgewell/source-map": ^0.3.3 - acorn: ^8.8.2 - commander: ^2.20.0 - source-map-support: ~0.5.20 - bin: - terser: bin/terser - checksum: ee95981c54ebd381e0b7f5872c646e7a05543e53960f8e0c2f240863c368989d43a3ca80b7e9f691683c92ba199eb4b91d61785fef0b9ca4a887eb55866001f4 - languageName: node - linkType: hard - -"text-table@npm:^0.2.0": - version: 0.2.0 - resolution: "text-table@npm:0.2.0" - checksum: b6937a38c80c7f84d9c11dd75e49d5c44f71d95e810a3250bd1f1797fc7117c57698204adf676b71497acc205d769d65c16ae8fa10afad832ae1322630aef10a - languageName: node - linkType: hard - -"type-check@npm:^0.4.0, type-check@npm:~0.4.0": - version: 0.4.0 - resolution: "type-check@npm:0.4.0" - dependencies: - prelude-ls: ^1.2.1 - checksum: ec688ebfc9c45d0c30412e41ca9c0cdbd704580eb3a9ccf07b9b576094d7b86a012baebc95681999dd38f4f444afd28504cb3a89f2ef16b31d4ab61a0739025a - languageName: node - linkType: hard - -"type-fest@npm:^0.20.2": - version: 0.20.2 - resolution: "type-fest@npm:0.20.2" - checksum: 4fb3272df21ad1c552486f8a2f8e115c09a521ad7a8db3d56d53718d0c907b62c6e9141ba5f584af3f6830d0872c521357e512381f24f7c44acae583ad517d73 - languageName: node - linkType: hard - -"unique-filename@npm:^3.0.0": - version: 3.0.0 - resolution: "unique-filename@npm:3.0.0" - dependencies: - unique-slug: ^4.0.0 - checksum: 8e2f59b356cb2e54aab14ff98a51ac6c45781d15ceaab6d4f1c2228b780193dc70fae4463ce9e1df4479cb9d3304d7c2043a3fb905bdeca71cc7e8ce27e063df - languageName: node - linkType: hard - -"unique-slug@npm:^4.0.0": - version: 4.0.0 - resolution: "unique-slug@npm:4.0.0" - dependencies: - imurmurhash: ^0.1.4 - checksum: 0884b58365af59f89739e6f71e3feacb5b1b41f2df2d842d0757933620e6de08eff347d27e9d499b43c40476cbaf7988638d3acb2ffbcb9d35fd035591adfd15 - languageName: node - linkType: hard - -"uri-js@npm:^4.2.2": - version: 4.4.1 - resolution: "uri-js@npm:4.4.1" - dependencies: - punycode: ^2.1.0 - checksum: 7167432de6817fe8e9e0c9684f1d2de2bb688c94388f7569f7dbdb1587c9f4ca2a77962f134ec90be0cc4d004c939ff0d05acc9f34a0db39a3c797dada262633 - languageName: node - linkType: hard - -"util-deprecate@npm:^1.0.1": - version: 1.0.2 - resolution: "util-deprecate@npm:1.0.2" - checksum: 474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2 - languageName: node - linkType: hard - -"which@npm:^2.0.1, which@npm:^2.0.2": - version: 2.0.2 - resolution: "which@npm:2.0.2" - dependencies: - isexe: ^2.0.0 - bin: - node-which: ./bin/node-which - checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1 - languageName: node - linkType: hard - -"wide-align@npm:^1.1.5": - version: 1.1.5 - resolution: "wide-align@npm:1.1.5" - dependencies: - string-width: ^1.0.2 || 2 || 3 || 4 - checksum: d5fc37cd561f9daee3c80e03b92ed3e84d80dde3365a8767263d03dacfc8fa06b065ffe1df00d8c2a09f731482fcacae745abfbb478d4af36d0a891fad4834d3 - languageName: node - linkType: hard - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version: 7.0.0 - resolution: "wrap-ansi@npm:7.0.0" - dependencies: - ansi-styles: ^4.0.0 - string-width: ^4.1.0 - strip-ansi: ^6.0.0 - checksum: a790b846fd4505de962ba728a21aaeda189b8ee1c7568ca5e817d85930e06ef8d1689d49dbf0e881e8ef84436af3a88bc49115c2e2788d841ff1b8b5b51a608b - languageName: node - linkType: hard - -"wrap-ansi@npm:^8.1.0": - version: 8.1.0 - resolution: "wrap-ansi@npm:8.1.0" - dependencies: - ansi-styles: ^6.1.0 - string-width: ^5.0.1 - strip-ansi: ^7.0.1 - checksum: 371733296dc2d616900ce15a0049dca0ef67597d6394c57347ba334393599e800bab03c41d4d45221b6bc967b8c453ec3ae4749eff3894202d16800fdfe0e238 - languageName: node - linkType: hard - -"wrappy@npm:1": - version: 1.0.2 - resolution: "wrappy@npm:1.0.2" - checksum: 159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5 - languageName: node - linkType: hard - -"yallist@npm:^4.0.0": - version: 4.0.0 - resolution: "yallist@npm:4.0.0" - checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5 - languageName: node - linkType: hard - -"yocto-queue@npm:^0.1.0": - version: 0.1.0 - resolution: "yocto-queue@npm:0.1.0" - checksum: f77b3d8d00310def622123df93d4ee654fc6a0096182af8bd60679ddcdfb3474c56c6c7190817c84a2785648cdee9d721c0154eb45698c62176c322fb46fc700 - languageName: node - linkType: hard

    EXThDZf{ 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ⅇrs4AS2m$F(PX01ZHKFn%D!)n&dz#6R03_upuy3h!YsMe7N zXsFhOhQb^1k=6Pzn-OLpi)u}1)C#KyIbJ7QA?p*oR+E#P9Bdr3#|E;iIz}~E@^?cE ze1Og6k=~+~#u-Ayb$=Bh9|E^~bmJB^UVNkNs@)!C28 z?{+haPkv5Ljh?L=?W`Qd`$TKW3Q)caT*u9og9>?s3WCD*Ik~8=;9K0jl~1yCM5wKn zXvG;<)>g!5MOnqT^9vw7wrEsAM5(A1)&wCQL3M*hSuIWm-9{tG<$2_9x3aUQ4aO2S zmsiE^jBw2gCq7Gba_+l@iJfm8p~`}x6ge5KJd$ns1G4W|dMsat=g$ObFr1K~lelkF z%q5+jc8<`K4oeFtdV6r%EJMwI;SIaZ`4?)OF5XL∋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%0Dx2TsH-K6?_*MnIgOcv*+?)aYUr_fBv1{P_{7 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 diff --git a/site/assets/mhchem.min.js b/site/assets/mhchem.min.js deleted file mode 100644 index 2eafa389..00000000 --- a/site/assets/mhchem.min.js +++ /dev/null @@ -1 +0,0 @@ -temml.__defineMacro("\\ce",(function(t){return chemParse(t.consumeArgs(1)[0],"ce")})),temml.__defineMacro("\\pu",(function(t){return chemParse(t.consumeArgs(1)[0],"pu")})),temml.__defineMacro("\\uniDash","{\\rule{0.672em}{0.06em}}"),temml.__defineMacro("\\triDash","{\\rule{0.15em}{0.06em}\\kern2mu\\rule{0.15em}{0.06em}\\kern2mu\\rule{0.15em}{0.06em}}"),temml.__defineMacro("\\tripleDash","\\kern0.075em\\raise0.25em{\\triDash}\\kern0.075em"),temml.__defineMacro("\\tripleDashOverLine","\\kern0.075em\\mathrlap{\\raise0.125em{\\uniDash}}\\raise0.34em{\\triDash}\\kern0.075em"),temml.__defineMacro("\\tripleDashOverDoubleLine","\\kern0.075em\\mathrlap{\\mathrlap{\\raise0.48em{\\triDash}}\\raise0.27em{\\uniDash}}{\\raise0.05em{\\uniDash}}\\kern0.075em"),temml.__defineMacro("\\tripleDashBetweenDoubleLine","\\kern0.075em\\mathrlap{\\mathrlap{\\raise0.48em{\\uniDash}}\\raise0.27em{\\triDash}}{\\raise0.05em{\\uniDash}}\\kern0.075em");var chemParse=function(t,e){for(var r="",a=t.length&&t[t.length-1].loc.start,n=t.length-1;n>=0;n--)t[n].loc.start>a&&(r+=" ",a=t[n].loc.start),r+=t[n].text,a+=t[n].text.length;return texify.go(mhchemParser.go(r,e))},mhchemParser={go:function(t,e){if(!t)return[];void 0===e&&(e="ce");var r,a="0",n={};n.parenthesisLevel=0,t=(t=(t=t.replace(/\n/g," ")).replace(/[\u2212\u2013\u2014\u2010]/g,"-")).replace(/[\u2026]/g,"...");for(var o=10,i=[];;){r!==t?(o=10,r=t):o--;var c=mhchemParser.stateMachines[e],s=c.transitions[a]||c.transitions["*"];t:for(var u=0;u0))return i;if(m.revisit||(t=p.remainder),!m.toContinue)break t}}if(o<=0)throw["MhchemBugU","mhchem bug U. Please report."]}},concatArray:function(t,e){if(e)if(Array.isArray(e))for(var r=0;r":/^[=<>]/,"#":/^[#\u2261]/,"+":/^\+/,"-$":/^-(?=[\s_},;\]/]|$|\([a-z]+\))/,"-9":/^-(?=[0-9])/,"- orbital overlap":/^-(?=(?:[spd]|sp)(?:$|[\s,;\)\]\}]))/,"-":/^-/,"pm-operator":/^(?:\\pm|\$\\pm\$|\+-|\+\/-)/,operator:/^(?:\+|(?:[\-=<>]|<<|>>|\\approx|\$\\approx\$)(?=\s|$|-?[0-9]))/,arrowUpDown:/^(?:v|\(v\)|\^|\(\^\))(?=$|[\s,;\)\]\}])/,"\\bond{(...)}":function(t){return mhchemParser.patterns.findObserveGroups(t,"\\bond{","","","}")},"->":/^(?:<->|<-->|->|<-|<=>>|<<=>|<=>|[\u2192\u27F6\u21CC])/,CMT:/^[CMT](?=\[)/,"[(...)]":function(t){return mhchemParser.patterns.findObserveGroups(t,"[","","","]")},"1st-level escape":/^(&|\\\\|\\hline)\s*/,"\\,":/^(?:\\[,\ ;:])/,"\\x{}{}":function(t){return mhchemParser.patterns.findObserveGroups(t,"",/^\\[a-zA-Z]+\{/,"}","","","{","}","",!0)},"\\x{}":function(t){return mhchemParser.patterns.findObserveGroups(t,"",/^\\[a-zA-Z]+\{/,"}","")},"\\ca":/^\\ca(?:\s+|(?![a-zA-Z]))/,"\\x":/^(?:\\[a-zA-Z]+\s*|\\[_&{}%])/,orbital:/^(?:[0-9]{1,2}[spdfgh]|[0-9]{0,2}sp)(?=$|[^a-zA-Z])/,others:/^[\/~|]/,"\\frac{(...)}":function(t){return mhchemParser.patterns.findObserveGroups(t,"\\frac{","","","}","{","","","}")},"\\overset{(...)}":function(t){return mhchemParser.patterns.findObserveGroups(t,"\\overset{","","","}","{","","","}")},"\\underset{(...)}":function(t){return mhchemParser.patterns.findObserveGroups(t,"\\underset{","","","}","{","","","}")},"\\underbrace{(...)}":function(t){return mhchemParser.patterns.findObserveGroups(t,"\\underbrace{","","","}_","{","","","}")},"\\color{(...)}0":function(t){return mhchemParser.patterns.findObserveGroups(t,"\\color{","","","}")},"\\color{(...)}{(...)}1":function(t){return mhchemParser.patterns.findObserveGroups(t,"\\color{","","","}","{","","","}")},"\\color(...){(...)}2":function(t){return mhchemParser.patterns.findObserveGroups(t,"\\color","\\","",/^(?=\{)/,"{","","","}")},"\\ce{(...)}":function(t){return mhchemParser.patterns.findObserveGroups(t,"\\ce{","","","}")},oxidation$:/^(?:[+-][IVX]+|\\pm\s*0|\$\\pm\$\s*0)$/,"d-oxidation$":/^(?:[+-]?\s?[IVX]+|\\pm\s*0|\$\\pm\$\s*0)$/,"roman numeral":/^[IVX]+/,"1/2$":/^[+\-]?(?:[0-9]+|\$[a-z]\$|[a-z])\/[0-9]+(?:\$[a-z]\$|[a-z])?$/,amount:function(t){var e;if(e=t.match(/^(?:(?:(?:\([+\-]?[0-9]+\/[0-9]+\)|[+\-]?(?:[0-9]+|\$[a-z]\$|[a-z])\/[0-9]+|[+\-]?[0-9]+[.,][0-9]+|[+\-]?\.[0-9]+|[+\-]?[0-9]+)(?:[a-z](?=\s*[A-Z]))?)|[+\-]?[a-z](?=\s*[A-Z])|\+(?!\s))/))return{match_:e[0],remainder:t.substr(e[0].length)};var r=mhchemParser.patterns.findObserveGroups(t,"","$","$","");return r&&(e=r.match_.match(/^\$(?:\(?[+\-]?(?:[0-9]*[a-z]?[+\-])?[0-9]*[a-z](?:[+\-][0-9]*[a-z]?)?\)?|\+|-)\$$/))?{match_:e[0],remainder:t.substr(e[0].length)}:null},amount2:function(t){return this.amount(t)},"(KV letters),":/^(?:[A-Z][a-z]{0,2}|i)(?=,)/,formula$:function(t){if(t.match(/^\([a-z]+\)$/))return null;var e=t.match(/^(?:[a-z]|(?:[0-9\ \+\-\,\.\(\)]+[a-z])+[0-9\ \+\-\,\.\(\)]*|(?:[a-z][0-9\ \+\-\,\.\(\)]+)+[a-z]?)$/);return e?{match_:e[0],remainder:t.substr(e[0].length)}:null},uprightEntities:/^(?:pH|pOH|pC|pK|iPr|iBu)(?=$|[^a-zA-Z])/,"/":/^\s*(\/)\s*/,"//":/^\s*(\/\/)\s*/,"*":/^\s*[*.]\s*/},findObserveGroups:function(t,e,r,a,n,o,i,c,s,u){var p=function(t,e){if("string"==typeof e)return 0!==t.indexOf(e)?null:e;var r=t.match(e);return r?r[0]:null},m=p(t,e);if(null===m)return null;if(t=t.substr(m.length),null===(m=p(t,r)))return null;var h=function(t,e,r){for(var a=0;e":{"0|1|2|3":{action_:"r=",nextState:"r"},"a|as":{action_:["output","r="],nextState:"r"},"*":{action_:["output","r="],nextState:"r"}},"+":{o:{action_:"d= kv",nextState:"d"},"d|D":{action_:"d=",nextState:"d"},q:{action_:"d=",nextState:"qd"},"qd|qD":{action_:"d=",nextState:"qd"},dq:{action_:["output","d="],nextState:"d"},3:{action_:["sb=false","output","operator"],nextState:"0"}},amount:{"0|2":{action_:"a=",nextState:"a"}},"pm-operator":{"0|1|2|a|as":{action_:["sb=false","output",{type_:"operator",option:"\\pm"}],nextState:"0"}},operator:{"0|1|2|a|as":{action_:["sb=false","output","operator"],nextState:"0"}},"-$":{"o|q":{action_:["charge or bond","output"],nextState:"qd"},d:{action_:"d=",nextState:"d"},D:{action_:["output",{type_:"bond",option:"-"}],nextState:"3"},q:{action_:"d=",nextState:"qd"},qd:{action_:"d=",nextState:"qd"},"qD|dq":{action_:["output",{type_:"bond",option:"-"}],nextState:"3"}},"-9":{"3|o":{action_:["output",{type_:"insert",option:"hyphen"}],nextState:"3"}},"- orbital overlap":{o:{action_:["output",{type_:"insert",option:"hyphen"}],nextState:"2"},d:{action_:["output",{type_:"insert",option:"hyphen"}],nextState:"2"}},"-":{"0|1|2":{action_:[{type_:"output",option:1},"beginsWithBond=true",{type_:"bond",option:"-"}],nextState:"3"},3:{action_:{type_:"bond",option:"-"}},a:{action_:["output",{type_:"insert",option:"hyphen"}],nextState:"2"},as:{action_:[{type_:"output",option:2},{type_:"bond",option:"-"}],nextState:"3"},b:{action_:"b="},o:{action_:{type_:"- after o/d",option:!1},nextState:"2"},q:{action_:{type_:"- after o/d",option:!1},nextState:"2"},"d|qd|dq":{action_:{type_:"- after o/d",option:!0},nextState:"2"},"D|qD|p":{action_:["output",{type_:"bond",option:"-"}],nextState:"3"}},amount2:{"1|3":{action_:"a=",nextState:"a"}},letters:{"0|1|2|3|a|as|b|p|bp|o":{action_:"o=",nextState:"o"},"q|dq":{action_:["output","o="],nextState:"o"},"d|D|qd|qD":{action_:"o after d",nextState:"o"}},digits:{o:{action_:"q=",nextState:"q"},"d|D":{action_:"q=",nextState:"dq"},q:{action_:["output","o="],nextState:"o"},a:{action_:"o=",nextState:"o"}},"space A":{"b|p|bp":{}},space:{a:{nextState:"as"},0:{action_:"sb=false"},"1|2":{action_:"sb=true"},"r|rt|rd|rdt|rdq":{action_:"output",nextState:"0"},"*":{action_:["output","sb=true"],nextState:"1"}},"1st-level escape":{"1|2":{action_:["output",{type_:"insert+p1",option:"1st-level escape"}]},"*":{action_:["output",{type_:"insert+p1",option:"1st-level escape"}],nextState:"0"}},"[(...)]":{"r|rt":{action_:"rd=",nextState:"rd"},"rd|rdt":{action_:"rq=",nextState:"rdq"}},"...":{"o|d|D|dq|qd|qD":{action_:["output",{type_:"bond",option:"..."}],nextState:"3"},"*":{action_:[{type_:"output",option:1},{type_:"insert",option:"ellipsis"}],nextState:"1"}},". |* ":{"*":{action_:["output",{type_:"insert",option:"addition compound"}],nextState:"1"}},"state of aggregation $":{"*":{action_:["output","state of aggregation"],nextState:"1"}},"{[(":{"a|as|o":{action_:["o=","output","parenthesisLevel++"],nextState:"2"},"0|1|2|3":{action_:["o=","output","parenthesisLevel++"],nextState:"2"},"*":{action_:["output","o=","output","parenthesisLevel++"],nextState:"2"}},")]}":{"0|1|2|3|b|p|bp|o":{action_:["o=","parenthesisLevel--"],nextState:"o"},"a|as|d|D|q|qd|qD|dq":{action_:["output","o=","parenthesisLevel--"],nextState:"o"}},", ":{"*":{action_:["output","comma"],nextState:"0"}},"^_":{"*":{}},"^{(...)}|^($...$)":{"0|1|2|as":{action_:"b=",nextState:"b"},p:{action_:"b=",nextState:"bp"},"3|o":{action_:"d= kv",nextState:"D"},q:{action_:"d=",nextState:"qD"},"d|D|qd|qD|dq":{action_:["output","d="],nextState:"D"}},"^a|^\\x{}{}|^\\x{}|^\\x|'":{"0|1|2|as":{action_:"b=",nextState:"b"},p:{action_:"b=",nextState:"bp"},"3|o":{action_:"d= kv",nextState:"d"},q:{action_:"d=",nextState:"qd"},"d|qd|D|qD":{action_:"d="},dq:{action_:["output","d="],nextState:"d"}},"_{(state of aggregation)}$":{"d|D|q|qd|qD|dq":{action_:["output","q="],nextState:"q"}},"_{(...)}|_($...$)|_9|_\\x{}{}|_\\x{}|_\\x":{"0|1|2|as":{action_:"p=",nextState:"p"},b:{action_:"p=",nextState:"bp"},"3|o":{action_:"q=",nextState:"q"},"d|D":{action_:"q=",nextState:"dq"},"q|qd|qD|dq":{action_:["output","q="],nextState:"q"}},"=<>":{"0|1|2|3|a|as|o|q|d|D|qd|qD|dq":{action_:[{type_:"output",option:2},"bond"],nextState:"3"}},"#":{"0|1|2|3|a|as|o":{action_:[{type_:"output",option:2},{type_:"bond",option:"#"}],nextState:"3"}},"{}":{"*":{action_:{type_:"output",option:1},nextState:"1"}},"{...}":{"0|1|2|3|a|as|b|p|bp":{action_:"o=",nextState:"o"},"o|d|D|q|qd|qD|dq":{action_:["output","o="],nextState:"o"}},"$...$":{a:{action_:"a="},"0|1|2|3|as|b|p|bp|o":{action_:"o=",nextState:"o"},"as|o":{action_:"o="},"q|d|D|qd|qD|dq":{action_:["output","o="],nextState:"o"}},"\\bond{(...)}":{"*":{action_:[{type_:"output",option:2},"bond"],nextState:"3"}},"\\frac{(...)}":{"*":{action_:[{type_:"output",option:1},"frac-output"],nextState:"3"}},"\\overset{(...)}":{"*":{action_:[{type_:"output",option:2},"overset-output"],nextState:"3"}},"\\underset{(...)}":{"*":{action_:[{type_:"output",option:2},"underset-output"],nextState:"3"}},"\\underbrace{(...)}":{"*":{action_:[{type_:"output",option:2},"underbrace-output"],nextState:"3"}},"\\color{(...)}{(...)}1|\\color(...){(...)}2":{"*":{action_:[{type_:"output",option:2},"color-output"],nextState:"3"}},"\\color{(...)}0":{"*":{action_:[{type_:"output",option:2},"color0-output"]}},"\\ce{(...)}":{"*":{action_:[{type_:"output",option:2},"ce"],nextState:"3"}},"\\,":{"*":{action_:[{type_:"output",option:1},"copy"],nextState:"1"}},"\\x{}{}|\\x{}|\\x":{"0|1|2|3|a|as|b|p|bp|o|c0":{action_:["o=","output"],nextState:"3"},"*":{action_:["output","o=","output"],nextState:"3"}},others:{"*":{action_:[{type_:"output",option:1},"copy"],nextState:"3"}},else2:{a:{action_:"a to o",nextState:"o",revisit:!0},as:{action_:["output","sb=true"],nextState:"1",revisit:!0},"r|rt|rd|rdt|rdq":{action_:["output"],nextState:"0",revisit:!0},"*":{action_:["output","copy"],nextState:"3"}}}),actions:{"o after d":function(t,e){var r;if((t.d||"").match(/^[0-9]+$/)){var a=t.d;t.d=void 0,r=this.output(t),t.b=a}else r=this.output(t);return mhchemParser.actions["o="](t,e),r},"d= kv":function(t,e){t.d=e,t.dType="kv"},"charge or bond":function(t,e){if(t.beginsWithBond){var r=[];return mhchemParser.concatArray(r,this.output(t)),mhchemParser.concatArray(r,mhchemParser.actions.bond(t,e,"-")),r}t.d=e},"- after o/d":function(t,e,r){var a=mhchemParser.patterns.match_("orbital",t.o||""),n=mhchemParser.patterns.match_("one lowercase greek letter $",t.o||""),o=mhchemParser.patterns.match_("one lowercase latin letter $",t.o||""),i=mhchemParser.patterns.match_("$one lowercase latin letter$ $",t.o||""),c="-"===e&&(a&&""===a.remainder||n||o||i);!c||t.a||t.b||t.p||t.d||t.q||a||!o||(t.o="$"+t.o+"$");var s=[];return c?(mhchemParser.concatArray(s,this.output(t)),s.push({type_:"hyphen"})):(a=mhchemParser.patterns.match_("digits",t.d||""),r&&a&&""===a.remainder?(mhchemParser.concatArray(s,mhchemParser.actions["d="](t,e)),mhchemParser.concatArray(s,this.output(t))):(mhchemParser.concatArray(s,this.output(t)),mhchemParser.concatArray(s,mhchemParser.actions.bond(t,e,"-")))),s},"a to o":function(t){t.o=t.a,t.a=void 0},"sb=true":function(t){t.sb=!0},"sb=false":function(t){t.sb=!1},"beginsWithBond=true":function(t){t.beginsWithBond=!0},"beginsWithBond=false":function(t){t.beginsWithBond=!1},"parenthesisLevel++":function(t){t.parenthesisLevel++},"parenthesisLevel--":function(t){t.parenthesisLevel--},"state of aggregation":function(t,e){return{type_:"state of aggregation",p1:mhchemParser.go(e,"o")}},comma:function(t,e){var r=e.replace(/\s*$/,"");return r!==e&&0===t.parenthesisLevel?{type_:"comma enumeration L",p1:r}:{type_:"comma enumeration M",p1:r}},output:function(t,e,r){var a,n,o;t.r?(n="M"===t.rdt?mhchemParser.go(t.rd,"tex-math"):"T"===t.rdt?[{type_:"text",p1:t.rd||""}]:mhchemParser.go(t.rd),o="M"===t.rqt?mhchemParser.go(t.rq,"tex-math"):"T"===t.rqt?[{type_:"text",p1:t.rq||""}]:mhchemParser.go(t.rq),a={type_:"arrow",r:t.r,rd:n,rq:o}):(a=[],(t.a||t.b||t.p||t.o||t.q||t.d||r)&&(t.sb&&a.push({type_:"entitySkip"}),t.o||t.q||t.d||t.b||t.p||2===r?t.o||t.q||t.d||!t.b&&!t.p?t.o&&"kv"===t.dType&&mhchemParser.patterns.match_("d-oxidation$",t.d||"")?t.dType="oxidation":t.o&&"kv"===t.dType&&!t.q&&(t.dType=void 0):(t.o=t.a,t.d=t.b,t.q=t.p,t.a=t.b=t.p=void 0):(t.o=t.a,t.a=void 0),a.push({type_:"chemfive",a:mhchemParser.go(t.a,"a"),b:mhchemParser.go(t.b,"bd"),p:mhchemParser.go(t.p,"pq"),o:mhchemParser.go(t.o,"o"),q:mhchemParser.go(t.q,"pq"),d:mhchemParser.go(t.d,"oxidation"===t.dType?"oxidation":"bd"),dType:t.dType})));for(var i in t)"parenthesisLevel"!==i&&"beginsWithBond"!==i&&delete t[i];return a},"oxidation-output":function(t,e){var r=["{"];return mhchemParser.concatArray(r,mhchemParser.go(e,"oxidation")),r.push("}"),r},"frac-output":function(t,e){return{type_:"frac-ce",p1:mhchemParser.go(e[0]),p2:mhchemParser.go(e[1])}},"overset-output":function(t,e){return{type_:"overset",p1:mhchemParser.go(e[0]),p2:mhchemParser.go(e[1])}},"underset-output":function(t,e){return{type_:"underset",p1:mhchemParser.go(e[0]),p2:mhchemParser.go(e[1])}},"underbrace-output":function(t,e){return{type_:"underbrace",p1:mhchemParser.go(e[0]),p2:mhchemParser.go(e[1])}},"color-output":function(t,e){return{type_:"color",color1:e[0],color2:mhchemParser.go(e[1])}},"r=":function(t,e){t.r=e},"rdt=":function(t,e){t.rdt=e},"rd=":function(t,e){t.rd=e},"rqt=":function(t,e){t.rqt=e},"rq=":function(t,e){t.rq=e},operator:function(t,e,r){return{type_:"operator",kind_:r||e}}}},a:{transitions:mhchemParser.createTransitions({empty:{"*":{}},"1/2$":{0:{action_:"1/2"}},else:{0:{nextState:"1",revisit:!0}},"$(...)$":{"*":{action_:"tex-math tight",nextState:"1"}},",":{"*":{action_:{type_:"insert",option:"commaDecimal"}}},else2:{"*":{action_:"copy"}}}),actions:{}},o:{transitions:mhchemParser.createTransitions({empty:{"*":{}},"1/2$":{0:{action_:"1/2"}},else:{0:{nextState:"1",revisit:!0}},letters:{"*":{action_:"rm"}},"\\ca":{"*":{action_:{type_:"insert",option:"circa"}}},"\\x{}{}|\\x{}|\\x":{"*":{action_:"copy"}},"${(...)}$|$(...)$":{"*":{action_:"tex-math"}},"{(...)}":{"*":{action_:"{text}"}},else2:{"*":{action_:"copy"}}}),actions:{}},text:{transitions:mhchemParser.createTransitions({empty:{"*":{action_:"output"}},"{...}":{"*":{action_:"text="}},"${(...)}$|$(...)$":{"*":{action_:"tex-math"}},"\\greek":{"*":{action_:["output","rm"]}},"\\,|\\x{}{}|\\x{}|\\x":{"*":{action_:["output","copy"]}},else:{"*":{action_:"text="}}}),actions:{output:function(t){if(t.text_){var e={type_:"text",p1:t.text_};for(var r in t)delete t[r];return e}}}},pq:{transitions:mhchemParser.createTransitions({empty:{"*":{}},"state of aggregation $":{"*":{action_:"state of aggregation"}},i$:{0:{nextState:"!f",revisit:!0}},"(KV letters),":{0:{action_:"rm",nextState:"0"}},formula$:{0:{nextState:"f",revisit:!0}},"1/2$":{0:{action_:"1/2"}},else:{0:{nextState:"!f",revisit:!0}},"${(...)}$|$(...)$":{"*":{action_:"tex-math"}},"{(...)}":{"*":{action_:"text"}},"a-z":{f:{action_:"tex-math"}},letters:{"*":{action_:"rm"}},"-9.,9":{"*":{action_:"9,9"}},",":{"*":{action_:{type_:"insert+p1",option:"comma enumeration S"}}},"\\color{(...)}{(...)}1|\\color(...){(...)}2":{"*":{action_:"color-output"}},"\\color{(...)}0":{"*":{action_:"color0-output"}},"\\ce{(...)}":{"*":{action_:"ce"}},"\\,|\\x{}{}|\\x{}|\\x":{"*":{action_:"copy"}},else2:{"*":{action_:"copy"}}}),actions:{"state of aggregation":function(t,e){return{type_:"state of aggregation subscript",p1:mhchemParser.go(e,"o")}},"color-output":function(t,e){return{type_:"color",color1:e[0],color2:mhchemParser.go(e[1],"pq")}}}},bd:{transitions:mhchemParser.createTransitions({empty:{"*":{}},x$:{0:{nextState:"!f",revisit:!0}},formula$:{0:{nextState:"f",revisit:!0}},else:{0:{nextState:"!f",revisit:!0}},"-9.,9 no missing 0":{"*":{action_:"9,9"}},".":{"*":{action_:{type_:"insert",option:"electron dot"}}},"a-z":{f:{action_:"tex-math"}},x:{"*":{action_:{type_:"insert",option:"KV x"}}},letters:{"*":{action_:"rm"}},"'":{"*":{action_:{type_:"insert",option:"prime"}}},"${(...)}$|$(...)$":{"*":{action_:"tex-math"}},"{(...)}":{"*":{action_:"text"}},"\\color{(...)}{(...)}1|\\color(...){(...)}2":{"*":{action_:"color-output"}},"\\color{(...)}0":{"*":{action_:"color0-output"}},"\\ce{(...)}":{"*":{action_:"ce"}},"\\,|\\x{}{}|\\x{}|\\x":{"*":{action_:"copy"}},else2:{"*":{action_:"copy"}}}),actions:{"color-output":function(t,e){return{type_:"color",color1:e[0],color2:mhchemParser.go(e[1],"bd")}}}},oxidation:{transitions:mhchemParser.createTransitions({empty:{"*":{}},"roman numeral":{"*":{action_:"roman-numeral"}},"${(...)}$|$(...)$":{"*":{action_:"tex-math"}},else:{"*":{action_:"copy"}}}),actions:{"roman-numeral":function(t,e){return{type_:"roman numeral",p1:e||""}}}},"tex-math":{transitions:mhchemParser.createTransitions({empty:{"*":{action_:"output"}},"\\ce{(...)}":{"*":{action_:["output","ce"]}},"{...}|\\,|\\x{}{}|\\x{}|\\x":{"*":{action_:"o="}},else:{"*":{action_:"o="}}}),actions:{output:function(t){if(t.o){var e={type_:"tex-math",p1:t.o};for(var r in t)delete t[r];return e}}}},"tex-math tight":{transitions:mhchemParser.createTransitions({empty:{"*":{action_:"output"}},"\\ce{(...)}":{"*":{action_:["output","ce"]}},"{...}|\\,|\\x{}{}|\\x{}|\\x":{"*":{action_:"o="}},"-|+":{"*":{action_:"tight operator"}},else:{"*":{action_:"o="}}}),actions:{"tight operator":function(t,e){t.o=(t.o||"")+"{"+e+"}"},output:function(t){if(t.o){var e={type_:"tex-math",p1:t.o};for(var r in t)delete t[r];return e}}}},"9,9":{transitions:mhchemParser.createTransitions({empty:{"*":{}},",":{"*":{action_:"comma"}},else:{"*":{action_:"copy"}}}),actions:{comma:function(){return{type_:"commaDecimal"}}}},pu:{transitions:mhchemParser.createTransitions({empty:{"*":{action_:"output"}},space$:{"*":{action_:["output","space"]}},"{[(|)]}":{"0|a":{action_:"copy"}},"(-)(9)^(-9)":{0:{action_:"number^",nextState:"a"}},"(-)(9.,9)(e)(99)":{0:{action_:"enumber",nextState:"a"}},space:{"0|a":{}},"pm-operator":{"0|a":{action_:{type_:"operator",option:"\\pm"},nextState:"0"}},operator:{"0|a":{action_:"copy",nextState:"0"}},"//":{d:{action_:"o=",nextState:"/"}},"/":{d:{action_:"o=",nextState:"/"}},"{...}|else":{"0|d":{action_:"d=",nextState:"d"},a:{action_:["space","d="],nextState:"d"},"/|q":{action_:"q=",nextState:"q"}}}),actions:{enumber:function(t,e){var r=[];return"+-"===e[0]||"+/-"===e[0]?r.push("\\pm "):e[0]&&r.push(e[0]),e[1]&&(mhchemParser.concatArray(r,mhchemParser.go(e[1],"pu-9,9")),e[2]&&(e[2].match(/[,.]/)?mhchemParser.concatArray(r,mhchemParser.go(e[2],"pu-9,9")):r.push(e[2])),e[3]=e[4]||e[3],e[3]&&(e[3]=e[3].trim(),"e"===e[3]||"*"===e[3].substr(0,1)?r.push({type_:"cdot"}):r.push({type_:"times"}))),e[3]&&r.push("10^{"+e[5]+"}"),r},"number^":function(t,e){var r=[];return"+-"===e[0]||"+/-"===e[0]?r.push("\\pm "):e[0]&&r.push(e[0]),mhchemParser.concatArray(r,mhchemParser.go(e[1],"pu-9,9")),r.push("^{"+e[2]+"}"),r},operator:function(t,e,r){return{type_:"operator",kind_:r||e}},space:function(){return{type_:"pu-space-1"}},output:function(t){var e,r=mhchemParser.patterns.match_("{(...)}",t.d||"");r&&""===r.remainder&&(t.d=r.match_);var a=mhchemParser.patterns.match_("{(...)}",t.q||"");if(a&&""===a.remainder&&(t.q=a.match_),t.d&&(t.d=t.d.replace(/\u00B0C|\^oC|\^{o}C/g,"{}^{\\circ}C"),t.d=t.d.replace(/\u00B0F|\^oF|\^{o}F/g,"{}^{\\circ}F")),t.q){t.q=t.q.replace(/\u00B0C|\^oC|\^{o}C/g,"{}^{\\circ}C"),t.q=t.q.replace(/\u00B0F|\^oF|\^{o}F/g,"{}^{\\circ}F");var n={d:mhchemParser.go(t.d,"pu"),q:mhchemParser.go(t.q,"pu")};"//"===t.o?e={type_:"pu-frac",p1:n.d,p2:n.q}:(e=n.d,n.d.length>1||n.q.length>1?e.push({type_:" / "}):e.push({type_:"/"}),mhchemParser.concatArray(e,n.q))}else e=mhchemParser.go(t.d,"pu-2");for(var o in t)delete t[o];return e}}},"pu-2":{transitions:mhchemParser.createTransitions({empty:{"*":{action_:"output"}},"*":{"*":{action_:["output","cdot"],nextState:"0"}},"\\x":{"*":{action_:"rm="}},space:{"*":{action_:["output","space"],nextState:"0"}},"^{(...)}|^(-1)":{1:{action_:"^(-1)"}},"-9.,9":{0:{action_:"rm=",nextState:"0"},1:{action_:"^(-1)",nextState:"0"}},"{...}|else":{"*":{action_:"rm=",nextState:"1"}}}),actions:{cdot:function(){return{type_:"tight cdot"}},"^(-1)":function(t,e){t.rm+="^{"+e+"}"},space:function(){return{type_:"pu-space-2"}},output:function(t){var e=[];if(t.rm){var r=mhchemParser.patterns.match_("{(...)}",t.rm||"");e=r&&""===r.remainder?mhchemParser.go(r.match_,"pu"):{type_:"rm",p1:t.rm}}for(var a in t)delete t[a];return e}}},"pu-9,9":{transitions:mhchemParser.createTransitions({empty:{0:{action_:"output-0"},o:{action_:"output-o"}},",":{0:{action_:["output-0","comma"],nextState:"o"}},".":{0:{action_:["output-0","copy"],nextState:"o"}},else:{"*":{action_:"text="}}}),actions:{comma:function(){return{type_:"commaDecimal"}},"output-0":function(t){var e=[];if(t.text_=t.text_||"",t.text_.length>4){var r=t.text_.length%3;0===r&&(r=3);for(var a=t.text_.length-3;a>0;a-=3)e.push(t.text_.substr(a,3)),e.push({type_:"1000 separator"});e.push(t.text_.substr(0,r)),e.reverse()}else e.push(t.text_);for(var n in t)delete t[n];return e},"output-o":function(t){var e=[];if(t.text_=t.text_||"",t.text_.length>4){for(var r=t.text_.length-3,a=0;a":case"→":case"⟶":return"\\yields";case"<-":return"\\yieldsLeft";case"<->":return"\\mesomerism";case"<--\x3e":return"\\yieldsLeftRight";case"<=>":case"⇌":return"\\equilibrium";case"<=>>":return"\\equilibriumRight";case"<<=>":return"\\equilibriumLeft";default:throw assertNever(t),["MhchemBugT","mhchem bug T. Please report."]}},_getBond:function(t){switch(t){case"-":case"1":return"{-}";case"=":case"2":return"{=}";case"#":case"3":return"{\\equiv}";case"~":return"{\\tripleDash}";case"~-":return"{\\tripleDashOverLine}";case"~=":case"~--":return"{\\tripleDashOverDoubleLine}";case"-~-":return"{\\tripleDashBetweenDoubleLine}";case"...":return"{{\\cdot}{\\cdot}{\\cdot}}";case"....":return"{{\\cdot}{\\cdot}{\\cdot}{\\cdot}}";case"->":return"{\\rightarrow}";case"<-":return"{\\leftarrow}";case"<":return"{<}";case">":return"{>}";default:throw assertNever(t),["MhchemBugT","mhchem bug T. Please report."]}},_getOperator:function(t){switch(t){case"+":return" {}+{} ";case"-":return" {}-{} ";case"=":return" {}={} ";case"<":return" {}<{} ";case">":return" {}>{} ";case"<<":return" {}\\ll{} ";case">>":return" {}\\gg{} ";case"\\pm":return" {}\\pm{} ";case"\\approx":case"$\\approx$":return" {}\\approx{} ";case"v":case"(v)":return" \\downarrow{} ";case"^":case"(^)":return" \\uparrow{} ";default:throw assertNever(t),["MhchemBugT","mhchem bug T. Please report."]}}};function assertNever(t){}function assertString(t){} \ No newline at end of file diff --git a/site/assets/physics.js b/site/assets/physics.js deleted file mode 100644 index 803ccc31..00000000 --- a/site/assets/physics.js +++ /dev/null @@ -1,132 +0,0 @@ -/* eslint-disable no-undef */ - -/**************************************************** - * - * physics.js - * - * Implements the Physics Package for LaTeX input. - * - * --------------------------------------------------------------------- - * - * The original version of this file is licensed as follows: - * Copyright (c) 2015-2016 Kolen Cheung . - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * --------------------------------------------------------------------- - * - * This file has been revised from the original in the following ways: - * 1. The interface is changed so that it can be called from Temml, not MathJax. - * 2. \Re and \Im are not used, to avoid conflict with existing LaTeX letters. - * - * This revision of the file is released under the MIT license. - * https://mit-license.org/ - */ -temml.__defineMacro("\\quantity", "{\\left\\{ #1 \\right\\}}"); -temml.__defineMacro("\\qty", "{\\left\\{ #1 \\right\\}}"); -temml.__defineMacro("\\pqty", "{\\left( #1 \\right)}"); -temml.__defineMacro("\\bqty", "{\\left[ #1 \\right]}"); -temml.__defineMacro("\\vqty", "{\\left\\vert #1 \\right\\vert}"); -temml.__defineMacro("\\Bqty", "{\\left\\{ #1 \\right\\}}"); -temml.__defineMacro("\\absolutevalue", "{\\left\\vert #1 \\right\\vert}"); -temml.__defineMacro("\\abs", "{\\left\\vert #1 \\right\\vert}"); -temml.__defineMacro("\\norm", "{\\left\\Vert #1 \\right\\Vert}"); -temml.__defineMacro("\\evaluated", "{\\left.#1 \\right\\vert}"); -temml.__defineMacro("\\eval", "{\\left.#1 \\right\\vert}"); -temml.__defineMacro("\\order", "{\\mathcal{O} \\left( #1 \\right)}"); -temml.__defineMacro("\\commutator", "{\\left[ #1 , #2 \\right]}"); -temml.__defineMacro("\\comm", "{\\left[ #1 , #2 \\right]}"); -temml.__defineMacro("\\anticommutator", "{\\left\\{ #1 , #2 \\right\\}}"); -temml.__defineMacro("\\acomm", "{\\left\\{ #1 , #2 \\right\\}}"); -temml.__defineMacro("\\poissonbracket", "{\\left\\{ #1 , #2 \\right\\}}"); -temml.__defineMacro("\\pb", "{\\left\\{ #1 , #2 \\right\\}}"); -temml.__defineMacro("\\vectorbold", "{\\boldsymbol{ #1 }}"); -temml.__defineMacro("\\vb", "{\\boldsymbol{ #1 }}"); -temml.__defineMacro("\\vectorarrow", "{\\vec{\\boldsymbol{ #1 }}}"); -temml.__defineMacro("\\va", "{\\vec{\\boldsymbol{ #1 }}}"); -temml.__defineMacro("\\vectorunit", "{{\\boldsymbol{\\hat{ #1 }}}}"); -temml.__defineMacro("\\vu", "{{\\boldsymbol{\\hat{ #1 }}}}"); -temml.__defineMacro("\\dotproduct", "\\mathbin{\\boldsymbol\\cdot}"); -temml.__defineMacro("\\vdot", "{\\boldsymbol\\cdot}"); -temml.__defineMacro("\\crossproduct", "\\mathbin{\\boldsymbol\\times}"); -temml.__defineMacro("\\cross", "\\mathbin{\\boldsymbol\\times}"); -temml.__defineMacro("\\cp", "\\mathbin{\\boldsymbol\\times}"); -temml.__defineMacro("\\gradient", "{\\boldsymbol\\nabla}"); -temml.__defineMacro("\\grad", "{\\boldsymbol\\nabla}"); -temml.__defineMacro("\\divergence", "{\\grad\\vdot}"); -//temml.__defineMacro("\\div", "{\\grad\\vdot}"); Not included in Temml. Conflicts w/LaTeX \div -temml.__defineMacro("\\curl", "{\\grad\\cross}"); -temml.__defineMacro("\\laplacian", "\\nabla^2"); -temml.__defineMacro("\\tr", "{\\operatorname{tr}}"); -temml.__defineMacro("\\Tr", "{\\operatorname{Tr}}"); -temml.__defineMacro("\\rank", "{\\operatorname{rank}}"); -temml.__defineMacro("\\erf", "{\\operatorname{erf}}"); -temml.__defineMacro("\\Res", "{\\operatorname{Res}}"); -temml.__defineMacro("\\principalvalue", "{\\mathcal{P}}"); -temml.__defineMacro("\\pv", "{\\mathcal{P}}"); -temml.__defineMacro("\\PV", "{\\operatorname{P.V.}}"); -// Temml does not use the next two lines. They conflict with LaTeX letters. -//temml.__defineMacro("\\Re", "{\\operatorname{Re} \\left\\{ #1 \\right\\}}"); -//temml.__defineMacro("\\Im", "{\\operatorname{Im} \\left\\{ #1 \\right\\}}"); -temml.__defineMacro("\\qqtext", "{\\quad\\text{ #1 }\\quad}"); -temml.__defineMacro("\\qq", "{\\quad\\text{ #1 }\\quad}"); -temml.__defineMacro("\\qcomma", "{\\text{,}\\quad}"); -temml.__defineMacro("\\qc", "{\\text{,}\\quad}"); -temml.__defineMacro("\\qcc", "{\\quad\\text{c.c.}\\quad}"); -temml.__defineMacro("\\qif", "{\\quad\\text{if}\\quad}"); -temml.__defineMacro("\\qthen", "{\\quad\\text{then}\\quad}"); -temml.__defineMacro("\\qelse", "{\\quad\\text{else}\\quad}"); -temml.__defineMacro("\\qotherwise", "{\\quad\\text{otherwise}\\quad}"); -temml.__defineMacro("\\qunless", "{\\quad\\text{unless}\\quad}"); -temml.__defineMacro("\\qgiven", "{\\quad\\text{given}\\quad}"); -temml.__defineMacro("\\qusing", "{\\quad\\text{using}\\quad}"); -temml.__defineMacro("\\qassume", "{\\quad\\text{assume}\\quad}"); -temml.__defineMacro("\\qsince", "{\\quad\\text{since}\\quad}"); -temml.__defineMacro("\\qlet", "{\\quad\\text{let}\\quad}"); -temml.__defineMacro("\\qfor", "{\\quad\\text{for}\\quad}"); -temml.__defineMacro("\\qall", "{\\quad\\text{all}\\quad}"); -temml.__defineMacro("\\qeven", "{\\quad\\text{even}\\quad}"); -temml.__defineMacro("\\qodd", "{\\quad\\text{odd}\\quad}"); -temml.__defineMacro("\\qinteger", "{\\quad\\text{integer}\\quad}"); -temml.__defineMacro("\\qand", "{\\quad\\text{and}\\quad}"); -temml.__defineMacro("\\qor", "{\\quad\\text{or}\\quad}"); -temml.__defineMacro("\\qas", "{\\quad\\text{as}\\quad}"); -temml.__defineMacro("\\qin", "{\\quad\\text{in}\\quad}"); -temml.__defineMacro("\\differential", "{\\text{d}}"); -temml.__defineMacro("\\dd", "{\\text{d}}"); -temml.__defineMacro("\\derivative", "{\\frac{\\text{d}{ #1 }}{\\text{d}{ #2 }}}"); -temml.__defineMacro("\\dv", "{\\frac{\\text{d}{ #1 }}{\\text{d}{ #2 }}}"); -temml.__defineMacro("\\partialderivative", "{\\frac{\\partial{ #1 }}{\\partial{ #2 }}}"); -temml.__defineMacro("\\pdv", "{\\frac{\\partial{ #1 }}{\\partial{ #2 }}}"); -temml.__defineMacro("\\variation", "{\\delta}"); -temml.__defineMacro("\\var", "{\\delta}"); -temml.__defineMacro("\\functionalderivative", "{\\frac{\\delta{ #1 }}{\\delta{ #2 }}}"); -temml.__defineMacro("\\fdv", "{\\frac{\\delta{ #1 }}{\\delta{ #2 }}}"); -temml.__defineMacro("\\innerproduct", "{\\left\\langle {#1} \\mid { #2} \\right\\rangle}"); -temml.__defineMacro("\\outerproduct", - "{\\left\\vert { #1 } \\right\\rangle\\left\\langle { #2} \\right\\vert}"); -temml.__defineMacro("\\dyad", - "{\\left\\vert { #1 } \\right\\rangle\\left\\langle { #2} \\right\\vert}"); -temml.__defineMacro("\\ketbra", - "{\\left\\vert { #1 } \\right\\rangle\\left\\langle { #2} \\right\\vert}"); -temml.__defineMacro("\\op", - "{\\left\\vert { #1 } \\right\\rangle\\left\\langle { #2} \\right\\vert}"); -temml.__defineMacro("\\expectationvalue", "{\\left\\langle {#1 } \\right\\rangle}"); -temml.__defineMacro("\\expval", "{\\left\\langle {#1 } \\right\\rangle}"); -temml.__defineMacro("\\ev", "{\\left\\langle {#1 } \\right\\rangle}"); -temml.__defineMacro("\\matrixelement", - "{\\left\\langle{ #1 }\\right\\vert{ #2 }\\left\\vert{#3}\\right\\rangle}"); -temml.__defineMacro("\\matrixel", - "{\\left\\langle{ #1 }\\right\\vert{ #2 }\\left\\vert{#3}\\right\\rangle}"); -temml.__defineMacro("\\mel", - "{\\left\\langle{ #1 }\\right\\vert{ #2 }\\left\\vert{#3}\\right\\rangle}"); diff --git a/site/assets/temml.min.js b/site/assets/temml.min.js deleted file mode 100644 index ffdb9ecf..00000000 --- a/site/assets/temml.min.js +++ /dev/null @@ -1 +0,0 @@ -var temml=function(){"use strict";class e{constructor(t,r){let n,o=" "+t;const s=r&&r.loc;if(s&&s.start<=s.end){const e=s.lexer.input;n=s.start;const t=s.end;n===e.length?o+=" at end of input: ":o+=" at position "+(n+1)+": ";const r=e.slice(n,t).replace(/[^]/g,"$&̲");let a,i;a=n>15?"…"+e.slice(n-15,n):e.slice(0,n),i=t+15":">","<":"<",'"':""","'":"'"},n=/[&><"']/g;const o=function(e){return"ordgroup"===e.type||"color"===e.type?1===e.body.length?o(e.body[0]):e:"font"===e.type?o(e.body):e};var s={deflt:function(e,t){return void 0===e?t:e},escape:function(e){return String(e).replace(n,(e=>r[e]))},hyphenate:function(e){return e.replace(t,"-$1").toLowerCase()},getBaseElem:o,isCharacterBox:function(e){const t=o(e);return"mathord"===t.type||"textord"===t.type||"atom"===t.type},protocolFromUrl:function(e){const t=/^[\x00-\x20]*([^\\/#?]*?)(:|�*58|�*3a|&colon)/i.exec(e);return t?":"!==t[2]?null:/^[a-zA-Z][a-zA-Z0-9+\-.]*$/.test(t[1])?t[1].toLowerCase():null:"_relative"},round:function(e){return+e.toFixed(4)}};class a{constructor(e){e=e||{},this.displayMode=s.deflt(e.displayMode,!1),this.annotate=s.deflt(e.annotate,!1),this.leqno=s.deflt(e.leqno,!1),this.throwOnError=s.deflt(e.throwOnError,!1),this.errorColor=s.deflt(e.errorColor,"#b22222"),this.macros=e.macros||{},this.wrap=s.deflt(e.wrap,"tex"),this.xml=s.deflt(e.xml,!1),this.colorIsTextColor=s.deflt(e.colorIsTextColor,!1),this.strict=s.deflt(e.strict,!1),this.trust=s.deflt(e.trust,!1),this.maxSize=void 0===e.maxSize?[1/0,1/0]:Array.isArray(e.maxSize)?e.maxSize:[1/0,1/0],this.maxExpand=Math.max(0,s.deflt(e.maxExpand,1e3))}isTrusted(e){if(e.url&&!e.protocol){const t=s.protocolFromUrl(e.url);if(null==t)return!1;e.protocol=t}const t="function"==typeof this.trust?this.trust(e):this.trust;return Boolean(t)}}const i={},l={};function c({type:e,names:t,props:r,handler:n,mathmlBuilder:o}){const s={type:e,numArgs:r.numArgs,argTypes:r.argTypes,allowedInArgument:!!r.allowedInArgument,allowedInText:!!r.allowedInText,allowedInMath:void 0===r.allowedInMath||r.allowedInMath,numOptionalArgs:r.numOptionalArgs||0,infix:!!r.infix,primitive:!!r.primitive,handler:n};for(let e=0;ee.toText())).join("")}}const h=function(e){return e.filter((e=>e)).join(" ")},g=function(e,t){this.classes=e||[],this.attributes={},this.style=t||{}},f=function(e){const t=document.createElement(e);t.className=h(this.classes);for(const e in this.style)Object.prototype.hasOwnProperty.call(this.style,e)&&(t.style[e]=this.style[e]);for(const e in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,e)&&t.setAttribute(e,this.attributes[e]);for(let e=0;e`,t};class y{constructor(e,t,r){g.call(this,e,r),this.children=t||[]}setAttribute(e,t){this.attributes[e]=t}toNode(){return f.call(this,"span")}toMarkup(){return b.call(this,"span")}}class x{constructor(e){this.text=e}toNode(){return document.createTextNode(this.text)}toMarkup(){return s.escape(this.text)}}class w{constructor(e,t,r){this.alt=t,this.src=e,this.classes=["mord"],this.style=r}hasClass(e){return this.classes.includes(e)}toNode(){const e=document.createElement("img");e.src=this.src,e.alt=this.alt,e.className="mord";for(const t in this.style)Object.prototype.hasOwnProperty.call(this.style,t)&&(e.style[t]=this.style[t]);return e}toMarkup(){let e=`${this.alt}0&&(e.className=h(this.classes));for(const t in this.style)Object.prototype.hasOwnProperty.call(this.style,t)&&(e.style[t]=this.style[t]);for(let t=0;t0&&(e+=` class="${s.escape(h(this.classes))}"`);let t="";for(const e in this.style)Object.prototype.hasOwnProperty.call(this.style,e)&&(t+=`${s.hyphenate(e)}:${this.style[e]};`);t&&(e+=` style="${t}"`),e+=">";for(let t=0;t",e}toText(){return this.children.map((e=>e.toText())).join("")}}class v{constructor(e){this.text=e}toNode(){return document.createTextNode(this.text)}toMarkup(){return s.escape(this.toText())}toText(){return this.text}}const A=e=>{let t;return 1===e.length&&"mrow"===e[0].type?(t=e.pop(),t.type="mstyle"):t=new k("mstyle",e),t};var N={MathNode:k,TextNode:v,newDocumentFragment:function(e){return new p(e)}};const T=e=>{let t=0;if(e.body)for(const r of e.body)t+=T(r);else if("supsub"===e.type)t+=T(e.base),e.sub&&(t+=.7*T(e.sub)),e.sup&&(t+=.7*T(e.sup));else if("mathord"===e.type||"textord"===e.type)for(const r of e.text.split("")){const e=r.codePointAt(0);t+=96{const t=S(e.label);if(O.includes(e.label)){const r=T(e.base);1","\\gt",!0),I($,V,"∈","\\in",!0),I($,V,"∉","\\notin",!0),I($,V,"","\\@not"),I($,V,"⊂","\\subset",!0),I($,V,"⊃","\\supset",!0),I($,V,"⊆","\\subseteq",!0),I($,V,"⊇","\\supseteq",!0),I($,V,"⊈","\\nsubseteq",!0),I($,V,"⊈","\\nsubseteqq"),I($,V,"⊉","\\nsupseteq",!0),I($,V,"⊉","\\nsupseteqq"),I($,V,"⊨","\\models"),I($,V,"←","\\leftarrow",!0),I($,V,"≤","\\le"),I($,V,"≤","\\leq",!0),I($,V,"<","\\lt",!0),I($,V,"→","\\rightarrow",!0),I($,V,"→","\\to"),I($,V,"≱","\\ngeq",!0),I($,V,"≱","\\ngeqq"),I($,V,"≱","\\ngeqslant"),I($,V,"≰","\\nleq",!0),I($,V,"≰","\\nleqq"),I($,V,"≰","\\nleqslant"),I($,V,"⫫","\\Perp",!0),I($,_," ","\\ "),I($,_," ","\\space"),I($,_," ","\\nobreakspace"),I(L,_," ","\\ "),I(L,_," "," "),I(L,_," ","\\space"),I(L,_," ","\\nobreakspace"),I($,_,null,"\\nobreak"),I($,_,null,"\\allowbreak"),I($,H,",",","),I(L,H,":",":"),I($,H,";",";"),I($,G,"⊼","\\barwedge"),I($,G,"⊻","\\veebar"),I($,G,"⊙","\\odot",!0),I($,G,"⊕︎","\\oplus"),I($,G,"⊗","\\otimes",!0),I($,W,"∂","\\partial",!0),I($,G,"⊘","\\oslash",!0),I($,G,"⊚","\\circledcirc",!0),I($,G,"⊡","\\boxdot",!0),I($,G,"△","\\bigtriangleup"),I($,G,"▽","\\bigtriangledown"),I($,G,"†","\\dagger"),I($,G,"⋄","\\diamond"),I($,G,"◃","\\triangleleft"),I($,G,"▹","\\triangleright"),I($,U,"{","\\{"),I(L,W,"{","\\{"),I(L,W,"{","\\textbraceleft"),I($,D,"}","\\}"),I(L,W,"}","\\}"),I(L,W,"}","\\textbraceright"),I($,U,"{","\\lbrace"),I($,D,"}","\\rbrace"),I($,U,"[","\\lbrack",!0),I(L,W,"[","\\lbrack",!0),I($,D,"]","\\rbrack",!0),I(L,W,"]","\\rbrack",!0),I($,U,"(","\\lparen",!0),I($,D,")","\\rparen",!0),I($,U,"⦇","\\llparenthesis",!0),I($,D,"⦈","\\rrparenthesis",!0),I(L,W,"<","\\textless",!0),I(L,W,">","\\textgreater",!0),I($,U,"⌊","\\lfloor",!0),I($,D,"⌋","\\rfloor",!0),I($,U,"⌈","\\lceil",!0),I($,D,"⌉","\\rceil",!0),I($,W,"\\","\\backslash"),I($,W,"|","|"),I($,W,"|","\\vert"),I(L,W,"|","\\textbar",!0),I($,W,"‖","\\|"),I($,W,"‖","\\Vert"),I(L,W,"‖","\\textbardbl"),I(L,W,"~","\\textasciitilde"),I(L,W,"\\","\\textbackslash"),I(L,W,"^","\\textasciicircum"),I($,V,"↑","\\uparrow",!0),I($,V,"⇑","\\Uparrow",!0),I($,V,"↓","\\downarrow",!0),I($,V,"⇓","\\Downarrow",!0),I($,V,"↕","\\updownarrow",!0),I($,V,"⇕","\\Updownarrow",!0),I($,j,"∐","\\coprod"),I($,j,"⋁","\\bigvee"),I($,j,"⋀","\\bigwedge"),I($,j,"⨄","\\biguplus"),I($,j,"⋂","\\bigcap"),I($,j,"⋃","\\bigcup"),I($,j,"∫","\\int"),I($,j,"∫","\\intop"),I($,j,"∬","\\iint"),I($,j,"∭","\\iiint"),I($,j,"∏","\\prod"),I($,j,"∑","\\sum"),I($,j,"⨂","\\bigotimes"),I($,j,"⨁","\\bigoplus"),I($,j,"⨀","\\bigodot"),I($,j,"⨉","\\bigtimes"),I($,j,"∮","\\oint"),I($,j,"∯","\\oiint"),I($,j,"∰","\\oiiint"),I($,j,"∱","\\intclockwise"),I($,j,"∲","\\varointclockwise"),I($,j,"⨌","\\iiiint"),I($,j,"⨍","\\intbar"),I($,j,"⨎","\\intBar"),I($,j,"⨏","\\fint"),I($,j,"⨒","\\rppolint"),I($,j,"⨓","\\scpolint"),I($,j,"⨕","\\pointint"),I($,j,"⨖","\\sqint"),I($,j,"⨗","\\intlarhk"),I($,j,"⨘","\\intx"),I($,j,"⨙","\\intcap"),I($,j,"⨚","\\intcup"),I($,j,"⨅","\\bigsqcap"),I($,j,"⨆","\\bigsqcup"),I($,j,"∫","\\smallint"),I(L,P,"…","\\textellipsis"),I($,P,"…","\\mathellipsis"),I(L,P,"…","\\ldots",!0),I($,P,"…","\\ldots",!0),I($,P,"⋰","\\iddots",!0),I($,P,"⋯","\\@cdots",!0),I($,P,"⋱","\\ddots",!0),I($,W,"⋮","\\varvdots"),I($,F,"ˊ","\\acute"),I($,F,"`","\\grave"),I($,F,"¨","\\ddot"),I($,F,"…","\\dddot"),I($,F,"….","\\ddddot"),I($,F,"~","\\tilde"),I($,F,"‾","\\bar"),I($,F,"˘","\\breve"),I($,F,"ˇ","\\check"),I($,F,"^","\\hat"),I($,F,"→","\\vec"),I($,F,"˙","\\dot"),I($,F,"˚","\\mathring"),I($,R,"ı","\\imath",!0),I($,R,"ȷ","\\jmath",!0),I($,W,"ı","ı"),I($,W,"ȷ","ȷ"),I(L,W,"ı","\\i",!0),I(L,W,"ȷ","\\j",!0),I(L,W,"ß","\\ss",!0),I(L,W,"æ","\\ae",!0),I(L,W,"œ","\\oe",!0),I(L,W,"ø","\\o",!0),I($,R,"ø","\\o",!0),I(L,W,"Æ","\\AE",!0),I(L,W,"Œ","\\OE",!0),I(L,W,"Ø","\\O",!0),I($,R,"Ø","\\O",!0),I(L,F,"ˊ","\\'"),I(L,F,"ˋ","\\`"),I(L,F,"ˆ","\\^"),I(L,F,"˜","\\~"),I(L,F,"ˉ","\\="),I(L,F,"˘","\\u"),I(L,F,"˙","\\."),I(L,F,"¸","\\c"),I(L,F,"˚","\\r"),I(L,F,"ˇ","\\v"),I(L,F,"¨",'\\"'),I(L,F,"˝","\\H"),I($,F,"ˊ","\\'"),I($,F,"ˋ","\\`"),I($,F,"ˆ","\\^"),I($,F,"˜","\\~"),I($,F,"ˉ","\\="),I($,F,"˘","\\u"),I($,F,"˙","\\."),I($,F,"¸","\\c"),I($,F,"˚","\\r"),I($,F,"ˇ","\\v"),I($,F,"¨",'\\"'),I($,F,"˝","\\H");const X={"--":!0,"---":!0,"``":!0,"''":!0};I(L,W,"–","--",!0),I(L,W,"–","\\textendash"),I(L,W,"—","---",!0),I(L,W,"—","\\textemdash"),I(L,W,"‘","`",!0),I(L,W,"‘","\\textquoteleft"),I(L,W,"’","'",!0),I(L,W,"’","\\textquoteright"),I(L,W,"“","``",!0),I(L,W,"“","\\textquotedblleft"),I(L,W,"”","''",!0),I(L,W,"”","\\textquotedblright"),I($,W,"°","\\degree",!0),I(L,W,"°","\\degree"),I(L,W,"°","\\textdegree",!0),I($,W,"£","\\pounds"),I($,W,"£","\\mathsterling",!0),I(L,W,"£","\\pounds"),I(L,W,"£","\\textsterling",!0),I($,W,"✠","\\maltese"),I(L,W,"✠","\\maltese"),I($,W,"€","\\euro",!0),I(L,W,"€","\\euro",!0),I(L,W,"€","\\texteuro"),I($,W,"©","\\copyright",!0),I(L,W,"©","\\textcopyright"),I($,W,"⌀","\\diameter",!0),I(L,W,"⌀","\\diameter"),I($,W,"𝛤","\\varGamma"),I($,W,"𝛥","\\varDelta"),I($,W,"𝛩","\\varTheta"),I($,W,"𝛬","\\varLambda"),I($,W,"𝛯","\\varXi"),I($,W,"𝛱","\\varPi"),I($,W,"𝛴","\\varSigma"),I($,W,"𝛶","\\varUpsilon"),I($,W,"𝛷","\\varPhi"),I($,W,"𝛹","\\varPsi"),I($,W,"𝛺","\\varOmega"),I(L,W,"𝛤","\\varGamma"),I(L,W,"𝛥","\\varDelta"),I(L,W,"𝛩","\\varTheta"),I(L,W,"𝛬","\\varLambda"),I(L,W,"𝛯","\\varXi"),I(L,W,"𝛱","\\varPi"),I(L,W,"𝛴","\\varSigma"),I(L,W,"𝛶","\\varUpsilon"),I(L,W,"𝛷","\\varPhi"),I(L,W,"𝛹","\\varPsi"),I(L,W,"𝛺","\\varOmega");const Z='0123456789/@."';for(let e=0;e<14;e++){const t=Z.charAt(e);I($,W,t,t)}const Y='0123456789!@*()-=+";:?/.,';for(let e=0;e<25;e++){const t=Y.charAt(e);I(L,W,t,t)}const K="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";for(let e=0;e<52;e++){const t=K.charAt(e);I($,R,t,t),I(L,W,t,t)}const J="ÇÐÞçþℂℍℕℙℚℝℤℎℏℊℋℌℐℑℒℓ℘ℛℜℬℰℱℳℭℨ";for(let e=0;e<30;e++){const t=J.charAt(e);I($,R,t,t),I(L,W,t,t)}let Q="";for(let e=0;e<52;e++){Q=String.fromCharCode(55349,56320+e),I($,R,Q,Q),I(L,W,Q,Q),Q=String.fromCharCode(55349,56372+e),I($,R,Q,Q),I(L,W,Q,Q),Q=String.fromCharCode(55349,56424+e),I($,R,Q,Q),I(L,W,Q,Q),Q=String.fromCharCode(55349,56580+e),I($,R,Q,Q),I(L,W,Q,Q),Q=String.fromCharCode(55349,56736+e),I($,R,Q,Q),I(L,W,Q,Q),Q=String.fromCharCode(55349,56788+e),I($,R,Q,Q),I(L,W,Q,Q),Q=String.fromCharCode(55349,56840+e),I($,R,Q,Q),I(L,W,Q,Q),Q=String.fromCharCode(55349,56944+e),I($,R,Q,Q),I(L,W,Q,Q),Q=String.fromCharCode(55349,56632+e),I($,R,Q,Q),I(L,W,Q,Q);const t=K.charAt(e);Q=String.fromCharCode(55349,56476+e),I($,R,t,Q),I(L,W,t,Q)}for(let e=0;e<10;e++)Q=String.fromCharCode(55349,57294+e),I($,R,Q,Q),I(L,W,Q,Q),Q=String.fromCharCode(55349,57314+e),I($,R,Q,Q),I(L,W,Q,Q),Q=String.fromCharCode(55349,57324+e),I($,R,Q,Q),I(L,W,Q,Q),Q=String.fromCharCode(55349,57334+e),I($,R,Q,Q),I(L,W,Q,Q);const ee="([{⌊⌈⟨⟮⎰⟦⦃",te=")]}⌋⌉⟩⟯⎱⟦⦄";const re=function(e,t,r){return!E[t][e]||!E[t][e].replace||55349===e.charCodeAt(0)||Object.prototype.hasOwnProperty.call(X,e)&&r&&(r.fontFamily&&"tt"===r.fontFamily.slice(4,6)||r.font&&"tt"===r.font.slice(4,6))||(e=E[t][e].replace),new N.TextNode(e)},ne=e=>{if("mrow"!==e.type&&"mstyle"!==e.type)return e;if(0===e.children.length)return e;if(!e.children[0].attributes||"mtext"!==e.children[0].type)return e;const t=e.children[0].attributes.mathvariant||"",r=new N.MathNode("mtext",[new N.TextNode(e.children[0].children[0].text)]);for(let n=1;n0&&" "===r.children[0].text.charAt(n-1)&&(r.children[0].text=r.children[0].text.slice(0,-1)+" ");for(const[t,n]of Object.entries(e.attributes))r.attributes[t]=n;return r},oe=/^[0-9]$/,se=function(e,t=!1){if(!(1!==e.length||e[0]instanceof p))return e[0];if(!t){e[0]instanceof k&&"mo"===e[0].type&&!e[0].attributes.fence&&(e[0].attributes.lspace="0em",e[0].attributes.rspace="0em");const t=e.length-1;e[t]instanceof k&&"mo"===e[t].type&&!e[t].attributes.fence&&(e[t].attributes.lspace="0em",e[t].attributes.rspace="0em")}return new N.MathNode("mrow",e)},ae=e=>"atom"===e.type&&"rel"===e.family||"mclass"===e.type&&"mrel"===e.mclass,ie=function(e,t,r=!1){if(!r&&1===e.length){const r=ce(e[0],t);return r instanceof k&&"mo"===r.type&&(r.setAttribute("lspace","0em"),r.setAttribute("rspace","0em")),[r]}(e=>{if(e.length<2)return;const t=[];let r=!1;for(let n=0;n0;r--)t[r-1].end===t[r].start-2&&(n=e[t[r].start-1],o=e[t[r].start],("textord"===n.type&&"."===n.text||"atom"===n.type&&","===n.text)&&n.loc&&o.loc&&n.loc.end===o.loc.start)&&(t[r-1].end=t[r].end,t.splice(r,1));var n,o;for(let r=t.length-1;r>=0;r--){for(let n=t[r].start+1;n<=t[r].end;n++)e[t[r].start].text+=e[n].text;if(e.splice(t[r].start+1,t[r].end-t[r].start),e.length>t[r].start+1){const n=e[t[r].start+1];"supsub"===n.type&&n.base&&"textord"===n.base.type&&oe.test(n.base.text)&&(n.base.text=e[t[r].start].text+n.base.text,e.splice(t[r].start,1))}}})(e);const n=[];for(let r=0;r0&&ae(e[r])&&ae(e[r-1])&&o.setAttribute("lspace","0em"),n.push(o)}return n},le=function(e,t,r=!1){return se(ie(e,t,r),r)},ce=function(t,r){if(!t)return new N.MathNode("mrow");if(l[t.type]){return l[t.type](t,r)}throw new e("Got group of unknown type: '"+t.type+"'")},me=e=>new N.MathNode("mtd",[],[],{padding:"0",width:"50%"});function ue(e,t,r,n){let o=null;1===e.length&&"tag"===e[0].type&&(o=e[0].tag,e=e[0].body);const s=ie(e,r),a=n.displayMode||n.annotate?"none":n.wrap,i=0===s.length?null:s[0];let l=1===s.length&&null===o&&i instanceof k?s[0]:function(e,t,r){const n=[];let o=[],s=[],a=0,i=0,l=0;for(;i0&&o.push(new N.MathNode("mrow",s)),o.push(r),s=[];const e=new N.MathNode("mtd",o);e.style.textAlign="left",n.push(new N.MathNode("mtr",[e])),o=[],i+=1}else{if(s.push(r),r.type&&"mo"===r.type&&1===r.children.length&&!Object.hasOwn(r.attributes,"movablelimits")){const n=r.children[0].text;if(ee.indexOf(n)>-1)l+=1;else if(te.indexOf(n)>-1)l-=1;else if(0===l&&"="===t&&"="===n){if(a+=1,a>1){s.pop();const e=new N.MathNode("mrow",s);o.push(e),s=[r]}}else if(0===l&&"tex"===t&&"∇"!==n){const t=i0){const e=new N.MathNode("mrow",s);o.push(e)}if(n.length>0){const e=new N.MathNode("mtd",o);e.style.textAlign="left";const t=new N.MathNode("mtr",[e]);n.push(t);const s=new N.MathNode("mtable",n);return r||(s.setAttribute("columnalign","left"),s.setAttribute("rowspacing","0em")),s}return N.newDocumentFragment(o)}(s,a,n.displayMode);if(o&&(l=((e,t,r,n)=>{t=le(t[0].body,r),(t=ne(t)).classes.push("tml-tag"),e=new N.MathNode("mtd",[e]);const o=[me(),e,me()];o[n?0:2].classes.push(n?"tml-left":"tml-right"),o[n?0:2].children.push(t);const s=new N.MathNode("mtr",o,["tml-tageqn"]),a=new N.MathNode("mtable",[s]);return a.style.width="100%",a.setAttribute("displaystyle","true"),a})(l,o,r,n.leqno)),n.annotate){const e=new N.MathNode("annotation",[new N.TextNode(t)]);e.setAttribute("encoding","application/x-tex"),l=new N.MathNode("semantics",[l,e])}const c=new N.MathNode("math",[l]);return n.xml&&c.setAttribute("xmlns","http://www.w3.org/1998/Math/MathML"),n.displayMode&&(c.setAttribute("display","block"),c.style.display="block math",c.classes=["tml-display"]),c}const de="ABCDEFGHIJKLMNOPQRSTUVWXYZbdfhkltΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩβδλζφθψ𝐀𝐁𝐂𝐃𝐄𝐅𝐆𝐇𝐈𝐉𝐊𝐋𝐌𝐍𝐎𝐏𝐐𝐑𝐒𝐓𝐔𝐕𝐖𝐗𝐘𝐙𝐛𝐝𝐟𝐡𝐤𝐥𝐭",pe=new Set(["\\alpha","\\gamma","\\delta","\\epsilon","\\eta","\\iota","\\kappa","\\mu","\\nu","\\pi","\\rho","\\sigma","\\tau","\\upsilon","\\chi","\\psi","\\omega","\\imath","\\jmath"]),he=new Set(["\\Gamma","\\Delta","\\Sigma","\\Omega","\\beta","\\delta","\\lambda","\\theta","\\psi"]),ge=(e,t)=>{const r=e.isStretchy?M(e):new N.MathNode("mo",[re(e.label,e.mode)]);if("\\vec"===e.label)r.style.transform="scale(0.75) translate(10%, 30%)";else if(r.style.mathStyle="normal",r.style.mathDepth="0",be.has(e.label)&&s.isCharacterBox(e.base)){let t="";const n=e.base.text;("acegıȷmnopqrsuvwxyzαγεηικμνοπρςστυχωϕ𝐚𝐜𝐞𝐠𝐦𝐧𝐨𝐩𝐪𝐫𝐬𝐮𝐯𝐰𝐱𝐲𝐳".indexOf(n)>-1||pe.has(n))&&(t="tml-xshift"),(de.indexOf(n)>-1||he.has(n))&&(t="tml-capshift"),t&&r.classes.push(t)}e.isStretchy||r.setAttribute("stretchy","false");return new N.MathNode("\\c"===e.label?"munder":"mover",[ce(e.base,t),r])},fe=new Set(["\\acute","\\grave","\\ddot","\\dddot","\\ddddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring"]),be=new Set(["\\acute","\\bar","\\breve","\\check","\\dot","\\ddot","\\grave","\\hat","\\mathring","\\'","\\^","\\~","\\=","\\u","\\.",'\\"',"\\r","\\H","\\v"]);c({type:"accent",names:["\\acute","\\grave","\\ddot","\\dddot","\\ddddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring","\\overparen","\\widecheck","\\widehat","\\wideparen","\\widetilde","\\overrightarrow","\\overleftarrow","\\Overrightarrow","\\overleftrightarrow","\\overgroup","\\overleftharpoon","\\overrightharpoon"],props:{numArgs:1},handler:(e,t)=>{const r=u(t[0]),n=!fe.has(e.funcName);return{type:"accent",mode:e.parser.mode,label:e.funcName,isStretchy:n,base:r}},mathmlBuilder:ge}),c({type:"accent",names:["\\'","\\`","\\^","\\~","\\=","\\c","\\u","\\.",'\\"',"\\r","\\H","\\v"],props:{numArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["primitive"]},handler:(e,t)=>{const r=u(t[0]),n=e.parser.mode;return"math"===n&&e.parser.settings.strict&&console.log(`Temml parse error: Command ${e.funcName} is invalid in math mode.`),{type:"accent",mode:n,label:e.funcName,isStretchy:!1,base:r}},mathmlBuilder:ge}),c({type:"accentUnder",names:["\\underleftarrow","\\underrightarrow","\\underleftrightarrow","\\undergroup","\\underparen","\\utilde"],props:{numArgs:1},handler:({parser:e,funcName:t},r)=>{const n=r[0];return{type:"accentUnder",mode:e.mode,label:t,base:n}},mathmlBuilder:(e,t)=>{const r=M(e);r.style["math-depth"]=0;return new N.MathNode("munder",[ce(e.base,t),r])}});const ye={pt:800/803,pc:9600/803,dd:1238/1157*800/803,cc:12.792133216944668,nd:685/642*800/803,nc:1370/107*800/803,sp:1/65536*800/803,mm:25.4/72,cm:2.54/72,in:1/72,px:96/72},xe=["em","ex","mu","pt","mm","cm","in","px","bp","pc","dd","cc","nd","nc","sp"],we=function(e){return"string"!=typeof e&&(e=e.unit),xe.indexOf(e)>-1},ke=e=>[1,.7,.5][Math.max(e-1,0)],ve=function(t,r){let n=t.number;if(r.maxSize[0]<0&&n>0)return{number:0,unit:"em"};const o=t.unit;switch(o){case"mm":case"cm":case"in":case"px":return n*ye[o]>r.maxSize[1]?{number:r.maxSize[1],unit:"pt"}:{number:n,unit:o};case"em":case"ex":return"ex"===o&&(n*=.431),n=Math.min(n/ke(r.level),r.maxSize[0]),{number:s.round(n),unit:"em"};case"bp":return n>r.maxSize[1]&&(n=r.maxSize[1]),{number:n,unit:"pt"};case"pt":case"pc":case"dd":case"cc":case"nd":case"nc":case"sp":return n=Math.min(n*ye[o],r.maxSize[1]),{number:s.round(n),unit:"pt"};case"mu":return n=Math.min(n/18,r.maxSize[0]),{number:s.round(n),unit:"em"};default:throw new e("Invalid unit: '"+o+"'")}},Ae=e=>{const t=new N.MathNode("mspace");return t.setAttribute("width",e+"em"),t},Ne=(e,t=.3,r=0)=>{if(null==e&&0===r)return Ae(t);const n=e?[e]:[];return 0!==t&&n.unshift(Ae(t)),r>0&&n.push(Ae(r)),new N.MathNode("mrow",n)},Te=(e,t)=>Number(e)/ke(t),qe=(e,t,r,n)=>{const o=B(e),s="eq"===e.slice(1,3),a="x"===e.charAt(1)?"1.75":"cd"===e.slice(2,4)?"3.0":s?"1.0":"2.0";o.setAttribute("lspace","0"),o.setAttribute("rspace",s?"0.5em":"0");const i=n.withLevel(n.level<2?2:3),l=Te(a,i.level),c=Te(a,3),m=Ne(null,l.toFixed(4),0),u=Ne(null,c.toFixed(4),0),d=Te(s?0:.3,i.level).toFixed(4);let p,h;const g=t&&t.body&&(t.body.body||t.body.length>0);if(g){let e=ce(t,i);e=Ne(e,d,d),p=new N.MathNode("mover",[e,u])}const f=r&&r.body&&(r.body.body||r.body.length>0);if(f){let e=ce(r,i);e=Ne(e,d,d),h=new N.MathNode("munder",[e,u])}let b;return b=g||f?g&&f?new N.MathNode("munderover",[o,h,p]):g?new N.MathNode("mover",[o,p]):new N.MathNode("munder",[o,h]):new N.MathNode("mover",[o,m]),"3.0"===a&&(b.style.height="1em"),b.setAttribute("accent","false"),b};c({type:"xArrow",names:["\\xleftarrow","\\xrightarrow","\\xLeftarrow","\\xRightarrow","\\xleftrightarrow","\\xLeftrightarrow","\\xhookleftarrow","\\xhookrightarrow","\\xmapsto","\\xrightharpoondown","\\xrightharpoonup","\\xleftharpoondown","\\xleftharpoonup","\\xlongequal","\\xtwoheadrightarrow","\\xtwoheadleftarrow","\\yields","\\yieldsLeft","\\mesomerism","\\longrightharpoonup","\\longleftharpoondown","\\\\cdrightarrow","\\\\cdleftarrow","\\\\cdlongequal"],props:{numArgs:1,numOptionalArgs:1},handler:({parser:e,funcName:t},r,n)=>({type:"xArrow",mode:e.mode,name:t,body:r[0],below:n[0]}),mathmlBuilder(e,t){const r=[qe(e.name,e.body,e.below,t)];return r.unshift(Ae(.2778)),r.push(Ae(.2778)),new N.MathNode("mrow",r)}});const Se={"\\xtofrom":["\\xrightarrow","\\xleftarrow"],"\\xleftrightharpoons":["\\xleftharpoonup","\\xrightharpoondown"],"\\xrightleftharpoons":["\\xrightharpoonup","\\xleftharpoondown"],"\\yieldsLeftRight":["\\yields","\\yieldsLeft"],"\\equilibrium":["\\longrightharpoonup","\\longleftharpoondown"],"\\equilibriumRight":["\\longrightharpoonup","\\eqleftharpoondown"],"\\equilibriumLeft":["\\eqrightharpoonup","\\longleftharpoondown"]};function Oe(e,t){if(!e||e.type!==t)throw new Error(`Expected node of type ${t}, but got `+(e?`node of type ${e.type}`:String(e)));return e}function Be(e){const t=Me(e);if(!t)throw new Error("Expected node of symbol group type, but got "+(e?`node of type ${e.type}`:String(e)));return t}function Me(e){return e&&("atom"===e.type||Object.prototype.hasOwnProperty.call(z,e.type))?e:null}c({type:"stackedArrow",names:["\\xtofrom","\\xleftrightharpoons","\\xrightleftharpoons","\\yieldsLeftRight","\\equilibrium","\\equilibriumRight","\\equilibriumLeft"],props:{numArgs:1,numOptionalArgs:1},handler({parser:e,funcName:t},r,n){const o=r[0]?{type:"hphantom",mode:e.mode,body:r[0]}:null,s=n[0]?{type:"hphantom",mode:e.mode,body:n[0]}:null;return{type:"stackedArrow",mode:e.mode,name:t,body:r[0],upperArrowBelow:s,lowerArrowBody:o,below:n[0]}},mathmlBuilder(e,t){const r=Se[e.name][0],n=Se[e.name][1],o=qe(r,e.body,e.upperArrowBelow,t),s=qe(n,e.lowerArrowBody,e.below,t);let a;const i=new N.MathNode("mpadded",[o]);if(i.setAttribute("voffset","0.3em"),i.setAttribute("height","+0.3em"),i.setAttribute("depth","-0.3em"),"\\equilibriumLeft"===e.name){const e=new N.MathNode("mpadded",[s]);e.setAttribute("width","0.5em"),a=new N.MathNode("mpadded",[Ae(.2778),e,i,Ae(.2778)])}else i.setAttribute("width","\\equilibriumRight"===e.name?"0.5em":"0"),a=new N.MathNode("mpadded",[Ae(.2778),i,s,Ae(.2778)]);return a.setAttribute("voffset","-0.18em"),a.setAttribute("height","-0.18em"),a.setAttribute("depth","+0.18em"),a}});const Ce={">":"\\\\cdrightarrow","<":"\\\\cdleftarrow","=":"\\\\cdlongequal",A:"\\uparrow",V:"\\downarrow","|":"\\Vert",".":"no arrow"},ze=e=>"textord"===e.type&&"@"===e.text;function Ee(e,t,r){const n=Ce[e];switch(n){case"\\\\cdrightarrow":case"\\\\cdleftarrow":return r.callFunction(n,[t[0]],[t[1]]);case"\\uparrow":case"\\downarrow":{const e={type:"atom",text:n,mode:"math",family:"rel"},o={type:"ordgroup",mode:"math",body:[r.callFunction("\\\\cdleft",[t[0]],[]),r.callFunction("\\Big",[e],[]),r.callFunction("\\\\cdright",[t[1]],[])],semisimple:!0};return r.callFunction("\\\\cdparent",[o],[])}case"\\\\cdlongequal":return r.callFunction("\\\\cdlongequal",[],[]);case"\\Vert":{const e={type:"textord",text:"\\Vert",mode:"math"};return r.callFunction("\\Big",[e],[])}default:return{type:"textord",text:" ",mode:"math"}}}c({type:"cdlabel",names:["\\\\cdleft","\\\\cdright"],props:{numArgs:1},handler:({parser:e,funcName:t},r)=>({type:"cdlabel",mode:e.mode,side:t.slice(4),label:r[0]}),mathmlBuilder(e,t){let r=new N.MathNode("mrow",[ce(e.label,t)]);return r=new N.MathNode("mpadded",[r]),r.setAttribute("width","0"),"left"===e.side&&r.setAttribute("lspace","-1width"),r.setAttribute("voffset","0.7em"),r=new N.MathNode("mstyle",[r]),r.setAttribute("displaystyle","false"),r.setAttribute("scriptlevel","1"),r}}),c({type:"cdlabelparent",names:["\\\\cdparent"],props:{numArgs:1},handler:({parser:e},t)=>({type:"cdlabelparent",mode:e.mode,fragment:t[0]}),mathmlBuilder:(e,t)=>new N.MathNode("mrow",[ce(e.fragment,t)])}),c({type:"textord",names:["\\@char"],props:{numArgs:1,allowedInText:!0},handler({parser:t,token:r},n){const o=Oe(n[0],"ordgroup").body;let s="";for(let e=0;e{let t=e.toString(16);return 1===t.length&&(t="0"+t),t},Pe=JSON.parse('{\n "Apricot": "#ffb484",\n "Aquamarine": "#08b4bc",\n "Bittersweet": "#c84c14",\n "blue": "#0000FF",\n "Blue": "#303494",\n "BlueGreen": "#08b4bc",\n "BlueViolet": "#503c94",\n "BrickRed": "#b8341c",\n "brown": "#BF8040",\n "Brown": "#802404",\n "BurntOrange": "#f8941c",\n "CadetBlue": "#78749c",\n "CarnationPink": "#f884b4",\n "Cerulean": "#08a4e4",\n "CornflowerBlue": "#40ace4",\n "cyan": "#00FFFF",\n "Cyan": "#08acec",\n "Dandelion": "#ffbc44",\n "darkgray": "#404040",\n "DarkOrchid": "#a8548c",\n "Emerald": "#08ac9c",\n "ForestGreen": "#089c54",\n "Fuchsia": "#90348c",\n "Goldenrod": "#ffdc44",\n "gray": "#808080",\n "Gray": "#98949c",\n "green": "#00FF00",\n "Green": "#08a44c",\n "GreenYellow": "#e0e474",\n "JungleGreen": "#08ac9c",\n "Lavender": "#f89cc4",\n "lightgray": "#c0c0c0",\n "lime": "#BFFF00",\n "LimeGreen": "#90c43c",\n "magenta": "#FF00FF",\n "Magenta": "#f0048c",\n "Mahogany": "#b0341c",\n "Maroon": "#b03434",\n "Melon": "#f89c7c",\n "MidnightBlue": "#086494",\n "Mulberry": "#b03c94",\n "NavyBlue": "#086cbc",\n "olive": "#7F7F00",\n "OliveGreen": "#407c34",\n "orange": "#FF8000",\n "Orange": "#f8843c",\n "OrangeRed": "#f0145c",\n "Orchid": "#b074ac",\n "Peach": "#f8945c",\n "Periwinkle": "#8074bc",\n "PineGreen": "#088c74",\n "pink": "#ff7f7f",\n "Plum": "#98248c",\n "ProcessBlue": "#08b4ec",\n "purple": "#BF0040",\n "Purple": "#a0449c",\n "RawSienna": "#983c04",\n "red": "#ff0000",\n "Red": "#f01c24",\n "RedOrange": "#f86434",\n "RedViolet": "#a0246c",\n "Rhodamine": "#f0549c",\n "Royallue": "#0874bc",\n "RoyalPurple": "#683c9c",\n "RubineRed": "#f0047c",\n "Salmon": "#f8948c",\n "SeaGreen": "#30bc9c",\n "Sepia": "#701404",\n "SkyBlue": "#48c4dc",\n "SpringGreen": "#c8dc64",\n "Tan": "#e09c74",\n "teal": "#007F7F",\n "TealBlue": "#08acb4",\n "Thistle": "#d884b4",\n "Turquoise": "#08b4cc",\n "violet": "#800080",\n "Violet": "#60449c",\n "VioletRed": "#f054a4",\n "WildStrawberry": "#f0246c",\n "yellow": "#FFFF00",\n "Yellow": "#fff404",\n "YellowGreen": "#98cc6c",\n "YellowOrange": "#ffa41c"\n}'),Re=(t,r)=>{let n="";if("HTML"===t){if(!Ie.test(r))throw new e("Invalid HTML input.");n=r}else if("RGB"===t){if(!Le.test(r))throw new e("Invalid RGB input.");r.split(",").map((e=>{n+=De(Number(e.trim()))}))}else{if(!Fe.test(r))throw new e("Invalid rbg input.");r.split(",").map((t=>{const r=Number(t.trim());if(r>1)throw new e("Color rgb input must be < 1.");n+=De(Number((255*r).toFixed(0)))}))}return"#"!==n.charAt(0)&&(n="#"+n),n},je=(t,r,n)=>{const o=`\\\\color@${t}`;if(!$e.exec(t))throw new e("Invalid color: '"+t+"'",n);return Ge.test(t)?"#"+t:("#"===t.charAt(0)||(r.has(o)?t=r.get(o).tokens[0].text:Pe[t]&&(t=Pe[t])),t)},Ue=(e,t)=>{let r=ie(e.body,t.withColor(e.color));return r=r.map((t=>(t.style.color=e.color,t))),N.newDocumentFragment(r)};c({type:"color",names:["\\textcolor"],props:{numArgs:2,numOptionalArgs:1,allowedInText:!0,argTypes:["raw","raw","original"]},handler({parser:e,token:t},r,n){const o=n[0]&&Oe(n[0],"raw").string;let s="";if(o){const e=Oe(r[0],"raw").string;s=Re(o,e)}else s=je(Oe(r[0],"raw").string,e.gullet.macros,t);const a=r[1];return{type:"color",mode:e.mode,color:s,body:d(a)}},mathmlBuilder:Ue}),c({type:"color",names:["\\color"],props:{numArgs:1,numOptionalArgs:1,allowedInText:!0,argTypes:["raw","raw"]},handler({parser:e,breakOnTokenText:t,token:r},n,o){const s=o[0]&&Oe(o[0],"raw").string;let a="";if(s){const e=Oe(n[0],"raw").string;a=Re(s,e)}else a=je(Oe(n[0],"raw").string,e.gullet.macros,r);const i=e.parseExpression(!0,t,!0);return{type:"color",mode:e.mode,color:a,body:i}},mathmlBuilder:Ue}),c({type:"color",names:["\\definecolor"],props:{numArgs:3,allowedInText:!0,argTypes:["raw","raw","raw"]},handler({parser:t,funcName:r,token:n},o){const s=Oe(o[0],"raw").string;if(!/^[A-Za-z]+$/.test(s))throw new e("Color name must be latin letters.",n);const a=Oe(o[1],"raw").string;if(!["HTML","RGB","rgb"].includes(a))throw new e("Color model must be HTML, RGB, or rgb.",n);const i=Oe(o[2],"raw").string,l=Re(a,i);return t.gullet.macros.set(`\\\\color@${s}`,{tokens:[{text:l}],numArgs:0}),{type:"internal",mode:t.mode}}}),c({type:"cr",names:["\\\\"],props:{numArgs:0,numOptionalArgs:0,allowedInText:!0},handler({parser:e},t,r){const n="["===e.gullet.future().text?e.parseSizeGroup(!0):null,o=!e.settings.displayMode;return{type:"cr",mode:e.mode,newLine:o,size:n&&Oe(n,"size").value}},mathmlBuilder(e,t){const r=new N.MathNode("mo");if(e.newLine&&(r.setAttribute("linebreak","newline"),e.size)){const n=ve(e.size,t);r.setAttribute("height",n.number+n.unit)}return r}});const He={"\\global":"\\global","\\long":"\\\\globallong","\\\\globallong":"\\\\globallong","\\def":"\\gdef","\\gdef":"\\gdef","\\edef":"\\xdef","\\xdef":"\\xdef","\\let":"\\\\globallet","\\futurelet":"\\\\globalfuture"},Ve=t=>{const r=t.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(r))throw new e("Expected a control sequence",t);return r},_e=(e,t,r,n)=>{let o=e.gullet.macros.get(r.text);null==o&&(r.noexpand=!0,o={tokens:[r],numArgs:0,unexpandable:!e.gullet.isExpandable(r.text)}),e.gullet.macros.set(t,o,n)};c({type:"internal",names:["\\global","\\long","\\\\globallong"],props:{numArgs:0,allowedInText:!0},handler({parser:t,funcName:r}){t.consumeSpaces();const n=t.fetch();if(He[n.text])return"\\global"!==r&&"\\\\globallong"!==r||(n.text=He[n.text]),Oe(t.parseFunction(),"internal");throw new e("Invalid token after macro prefix",n)}}),c({type:"internal",names:["\\def","\\gdef","\\edef","\\xdef"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler({parser:t,funcName:r}){let n=t.gullet.popToken();const o=n.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(o))throw new e("Expected a control sequence",n);let s,a=0;const i=[[]];for(;"{"!==t.gullet.future().text;)if(n=t.gullet.popToken(),"#"===n.text){if("{"===t.gullet.future().text){s=t.gullet.future(),i[a].push("{");break}if(n=t.gullet.popToken(),!/^[1-9]$/.test(n.text))throw new e(`Invalid argument number "${n.text}"`);if(parseInt(n.text)!==a+1)throw new e(`Argument number "${n.text}" out of order`);a++,i.push([])}else{if("EOF"===n.text)throw new e("Expected a macro definition");i[a].push(n.text)}let{tokens:l}=t.gullet.consumeArg();if(s&&l.unshift(s),"\\edef"===r||"\\xdef"===r){if(l=t.gullet.expandTokens(l),l.length>t.gullet.settings.maxExpand)throw new e("Too many expansions in an "+r);l.reverse()}return t.gullet.macros.set(o,{tokens:l,numArgs:a,delimiters:i},r===He[r]),{type:"internal",mode:t.mode}}}),c({type:"internal",names:["\\let","\\\\globallet"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler({parser:e,funcName:t}){const r=Ve(e.gullet.popToken());e.gullet.consumeSpaces();const n=(e=>{let t=e.gullet.popToken();return"="===t.text&&(t=e.gullet.popToken()," "===t.text&&(t=e.gullet.popToken())),t})(e);return _e(e,r,n,"\\\\globallet"===t),{type:"internal",mode:e.mode}}}),c({type:"internal",names:["\\futurelet","\\\\globalfuture"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler({parser:e,funcName:t}){const r=Ve(e.gullet.popToken()),n=e.gullet.popToken(),o=e.gullet.popToken();return _e(e,r,o,"\\\\globalfuture"===t),e.gullet.pushToken(o),e.gullet.pushToken(n),{type:"internal",mode:e.mode}}}),c({type:"internal",names:["\\newcommand","\\renewcommand","\\providecommand"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler({parser:t,funcName:r}){let n="";const o=t.gullet.popToken();"{"===o.text?(n=Ve(t.gullet.popToken()),t.gullet.popToken()):n=Ve(o);const s=t.gullet.isDefined(n);if(s&&"\\newcommand"===r)throw new e(`\\newcommand{${n}} attempting to redefine ${n}; use \\renewcommand`);if(!s&&"\\renewcommand"===r)throw new e(`\\renewcommand{${n}} when command ${n} does not yet exist; use \\newcommand`);let a=0;if("["===t.gullet.future().text){let r=t.gullet.popToken();if(r=t.gullet.popToken(),!/^[0-9]$/.test(r.text))throw new e(`Invalid number of arguments: "${r.text}"`);if(a=parseInt(r.text),r=t.gullet.popToken(),"]"!==r.text)throw new e(`Invalid argument "${r.text}"`)}const{tokens:i}=t.gullet.consumeArg();return t.gullet.macros.set(n,{tokens:i,numArgs:a},!t.settings.strict),{type:"internal",mode:t.mode}}});const We={"\\bigl":{mclass:"mopen",size:1},"\\Bigl":{mclass:"mopen",size:2},"\\biggl":{mclass:"mopen",size:3},"\\Biggl":{mclass:"mopen",size:4},"\\bigr":{mclass:"mclose",size:1},"\\Bigr":{mclass:"mclose",size:2},"\\biggr":{mclass:"mclose",size:3},"\\Biggr":{mclass:"mclose",size:4},"\\bigm":{mclass:"mrel",size:1},"\\Bigm":{mclass:"mrel",size:2},"\\biggm":{mclass:"mrel",size:3},"\\Biggm":{mclass:"mrel",size:4},"\\big":{mclass:"mord",size:1},"\\Big":{mclass:"mord",size:2},"\\bigg":{mclass:"mord",size:3},"\\Bigg":{mclass:"mord",size:4}},Xe=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","⦇","\\llparenthesis","⦈","\\rrparenthesis","\\lfloor","\\rfloor","⌊","⌋","\\lceil","\\rceil","⌈","⌉","<",">","\\langle","⟨","\\rangle","⟩","\\lAngle","⟪","\\rAngle","⟫","\\llangle","⦉","\\rrangle","⦊","\\lt","\\gt","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","⟮","⟯","\\lmoustache","\\rmoustache","⎰","⎱","\\llbracket","\\rrbracket","⟦","⟦","\\lBrace","\\rBrace","⦃","⦄","/","\\backslash","|","\\vert","\\|","\\Vert","\\uparrow","\\Uparrow","\\downarrow","\\Downarrow","\\updownarrow","\\Updownarrow","."],Ze=["}","\\left","\\middle","\\right"],Ye=e=>e.length>0&&(Xe.includes(e)||We[e]||Ze.includes(e)),Ke=[0,1.2,1.8,2.4,3];function Je(t,r){const n=Me(t);if(n&&Xe.includes(n.text))return["/","⁄"].includes(n.text)&&(n.text="∕"),["<","\\lt"].includes(n.text)&&(n.text="⟨"),[">","\\gt"].includes(n.text)&&(n.text="⟩"),"\\backslash"===n.text&&(n.text="∖"),n;throw new e(n?`Invalid delimiter '${n.text}' after '${r.funcName}'`:`Invalid delimiter type '${t.type}'`,t)}c({type:"delimsizing",names:["\\bigl","\\Bigl","\\biggl","\\Biggl","\\bigr","\\Bigr","\\biggr","\\Biggr","\\bigm","\\Bigm","\\biggm","\\Biggm","\\big","\\Big","\\bigg","\\Bigg"],props:{numArgs:1,argTypes:["primitive"]},handler:(e,t)=>{const r=Je(t[0],e);return{type:"delimsizing",mode:e.parser.mode,size:We[e.funcName].size,mclass:We[e.funcName].mclass,delim:r.text}},mathmlBuilder:e=>{const t=[];"."===e.delim&&(e.delim=""),t.push(re(e.delim,e.mode));const r=new N.MathNode("mo",t);return"mopen"===e.mclass||"mclose"===e.mclass?r.setAttribute("fence","true"):r.setAttribute("fence","false"),("∖"===e.delim||"\\vert"===e.delim||"|"===e.delim||e.delim.indexOf("arrow")>-1)&&r.setAttribute("stretchy","true"),r.setAttribute("symmetric","true"),r.setAttribute("minsize",Ke[e.size]+"em"),r.setAttribute("maxsize",Ke[e.size]+"em"),r}}),c({type:"leftright-right",names:["\\right"],props:{numArgs:1,argTypes:["primitive"]},handler:(e,t)=>({type:"leftright-right",mode:e.parser.mode,delim:Je(t[0],e).text})}),c({type:"leftright",names:["\\left"],props:{numArgs:1,argTypes:["primitive"]},handler:(t,r)=>{const n=Je(r[0],t),o=t.parser;++o.leftrightDepth;let s=o.parseExpression(!1,null,!0),a=o.fetch();for(;"\\middle"===a.text;){o.consume();const t=o.fetch().text;if(!E.math[t])throw new e(`Invalid delimiter '${t}' after '\\middle'`);Je({type:"atom",mode:"math",text:t},{funcName:"\\middle"}),s.push({type:"middle",mode:"math",delim:t}),o.consume(),s=s.concat(o.parseExpression(!1,null,!0)),a=o.fetch()}--o.leftrightDepth,o.expect("\\right",!1);const i=Oe(o.parseFunction(),"leftright-right");return{type:"leftright",mode:o.mode,body:s,left:n.text,right:i.delim}},mathmlBuilder:(e,t)=>{!function(e){if(!e.body)throw new Error("Bug: The leftright ParseNode wasn't fully parsed.")}(e);const r=ie(e.body,t);"."===e.left&&(e.left="");const n=new N.MathNode("mo",[re(e.left,e.mode)]);n.setAttribute("fence","true"),n.setAttribute("form","prefix"),("∖"===e.left||e.left.indexOf("arrow")>-1)&&n.setAttribute("stretchy","true"),r.unshift(n),"."===e.right&&(e.right="");const o=new N.MathNode("mo",[re(e.right,e.mode)]);return o.setAttribute("fence","true"),o.setAttribute("form","postfix"),("∖"===e.right||e.right.indexOf("arrow")>-1)&&o.setAttribute("stretchy","true"),r.push(o),se(r)}}),c({type:"middle",names:["\\middle"],props:{numArgs:1,argTypes:["primitive"]},handler:(t,r)=>{const n=Je(r[0],t);if(!t.parser.leftrightDepth)throw new e("\\middle without preceding \\left",n);return{type:"middle",mode:t.parser.mode,delim:n.text}},mathmlBuilder:(e,t)=>{const r=re(e.delim,e.mode),n=new N.MathNode("mo",[r]);return n.setAttribute("fence","true"),e.delim.indexOf("arrow")>-1&&n.setAttribute("stretchy","true"),n.setAttribute("form","prefix"),n.setAttribute("lspace","0.05em"),n.setAttribute("rspace","0.05em"),n}});const Qe=e=>{const t=new N.MathNode("mspace");return t.setAttribute("width","3pt"),t},et=(e,t)=>{let r;switch(r=e.label.indexOf("colorbox")>-1||"\\boxed"===e.label?new N.MathNode("mrow",[Qe(),ce(e.body,t),Qe()]):new N.MathNode("mrow",[ce(e.body,t)]),e.label){case"\\overline":r.style.padding="0.1em 0 0 0",r.style.borderTop="0.065em solid";break;case"\\underline":r.style.padding="0 0 0.1em 0",r.style.borderBottom="0.065em solid";break;case"\\cancel":r.classes.push("tml-cancel");break;case"\\bcancel":r.classes.push("tml-bcancel");break;case"\\angl":r.style.padding="0.03889em 0.03889em 0 0.03889em",r.style.borderTop="0.049em solid",r.style.borderRight="0.049em solid",r.style.marginRight="0.03889em";break;case"\\sout":r.style.backgroundImage="linear-gradient(black, black)",r.style.backgroundRepeat="no-repeat",r.style.backgroundSize="100% 1.5px",r.style.backgroundPosition="0 center";break;case"\\boxed":r.style={padding:"3pt 0 3pt 0",border:"1px solid"},r.setAttribute("scriptlevel","0"),r.setAttribute("displaystyle","true");break;case"\\fbox":r.style={padding:"3pt",border:"1px solid"};break;case"\\fcolorbox":case"\\colorbox":{const t={padding:"3pt 0 3pt 0"};"\\fcolorbox"===e.label&&(t.border="0.06em solid "+String(e.borderColor)),r.style=t;break}case"\\xcancel":r.classes.push("tml-xcancel")}return e.backgroundColor&&r.setAttribute("mathbackground",e.backgroundColor),r};c({type:"enclose",names:["\\colorbox"],props:{numArgs:2,numOptionalArgs:1,allowedInText:!0,argTypes:["raw","raw","text"]},handler({parser:e,funcName:t},r,n){const o=n[0]&&Oe(n[0],"raw").string;let s="";if(o){const e=Oe(r[0],"raw").string;s=Re(o,e)}else s=je(Oe(r[0],"raw").string,e.gullet.macros);const a=r[1];return{type:"enclose",mode:e.mode,label:t,backgroundColor:s,body:a}},mathmlBuilder:et}),c({type:"enclose",names:["\\fcolorbox"],props:{numArgs:3,numOptionalArgs:1,allowedInText:!0,argTypes:["raw","raw","raw","text"]},handler({parser:e,funcName:t},r,n){const o=n[0]&&Oe(n[0],"raw").string;let s,a="";if(o){const e=Oe(r[0],"raw").string,t=Oe(r[0],"raw").string;a=Re(o,e),s=Re(o,t)}else a=je(Oe(r[0],"raw").string,e.gullet.macros),s=je(Oe(r[1],"raw").string,e.gullet.macros);const i=r[2];return{type:"enclose",mode:e.mode,label:t,backgroundColor:s,borderColor:a,body:i}},mathmlBuilder:et}),c({type:"enclose",names:["\\fbox"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!0},handler:({parser:e},t)=>({type:"enclose",mode:e.mode,label:"\\fbox",body:t[0]})}),c({type:"enclose",names:["\\angl","\\cancel","\\bcancel","\\xcancel","\\sout","\\overline","\\boxed"],props:{numArgs:1},handler({parser:e,funcName:t},r){const n=r[0];return{type:"enclose",mode:e.mode,label:t,body:n}},mathmlBuilder:et}),c({type:"enclose",names:["\\underline"],props:{numArgs:1,allowedInText:!0},handler({parser:e,funcName:t},r){const n=r[0];return{type:"enclose",mode:e.mode,label:t,body:n}},mathmlBuilder:et});const tt={};function rt({type:e,names:t,props:r,handler:n,mathmlBuilder:o}){const s={type:e,numArgs:r.numArgs||0,allowedInText:!1,numOptionalArgs:0,handler:n};for(let e=0;e{if(!t.parser.settings.displayMode)throw new e(`{${t.envName}} can be used only in display mode.`)},ct=(e,t,r)=>{let n;const o=e.tags.shift();if(o){if(!o.body)return n=new N.MathNode("mtext",[],[]),n;n=le(o.body,t,!0),n.classes=["tml-tag"]}else{if(e.envClasses.includes("multline")&&(e.leqno&&0!==r||!e.leqno&&r!==e.body.length-1))return n=new N.MathNode("mtext",[],[]),n;n=new N.MathNode("mtext",[new y(["tml-eqn"])])}return n};function mt(t,{cols:r,envClasses:n,addEqnNum:o,singleRow:s,emptySingleRow:a,maxNumCols:i,leqno:l},c){t.gullet.beginGroup(),s||t.gullet.macros.set("\\cr","\\\\\\relax"),o&&(t.gullet.macros.set("\\tag","\\@ifstar\\envtag@literal\\envtag@paren"),t.gullet.macros.set("\\envtag@paren","\\env@tag{{(\\text{#1})}}"),t.gullet.macros.set("\\envtag@literal","\\env@tag{\\text{#1}}"),t.gullet.macros.set("\\notag","\\env@notag"),t.gullet.macros.set("\\nonumber","\\env@notag")),t.gullet.beginGroup();let m=[];const u=[m],d=[],p=[];let h;const g=[];for(g.push(it(t));;){let r=t.parseExpression(!1,s?"\\end":"\\\\");if(o&&!h)for(let e=0;e1||!a)&&u.pop(),g.length{const t=new N.MathNode("mtd",[]);return t.style={padding:"0",width:"50%"},e.envClasses.includes("multline")&&(t.style.width="7.5%"),t},ht=function(e,t){const r=[],n=e.body.length,o=e.hLinesBeforeRow;for(let s=0;s0&&(2===o[0].length?c.children.forEach((e=>{e.style.borderTop="0.15em double"})):c.children.forEach((e=>{e.style.borderTop=o[0][0]?"0.06em dashed":"0.06em solid"}))),o[s+1].length>0&&(2===o[s+1].length?c.children.forEach((e=>{e.style.borderBottom="0.15em double"})):c.children.forEach((e=>{e.style.borderBottom=o[s+1][0]?"0.06em dashed":"0.06em solid"}))),r.push(c)}if(e.envClasses.length>0){const t=e.envClasses.includes("jot")?"0.7":e.envClasses.includes("small")?"0.35":"0.5",n=e.envClasses.includes("abut")||e.envClasses.includes("cases")?"0":e.envClasses.includes("small")?"0.1389":e.envClasses.includes("cd")?"0.25":"0.4",o=0===r.length?0:r[0].children.length,s=(t,r)=>0===t&&0===r||t===o-1&&1===r?"0":"align"!==e.envClasses[0]?n:1===r?"0":e.addEqnNum?t%2?"1":"0":t%2?"0":"1";for(let e=0;e1&&e.envClasses.includes("cases")&&(n.children[1].style.padding=n.children[1].style.padding.replace(/0em$/,"1em")),e.envClasses.includes("cases")||e.envClasses.includes("subarray"))for(const e of n.children)e.classes.push("tml-left")}}else for(let e=0;e0){const t=e.cols;let r=!1,n=0,o=t.length;for(;"separator"===t[n].type;)n+=1;for(;"separator"===t[o-1].type;)o-=1;if("separator"===t[0].type){const e="separator"===t[1].type?"0.15em double":"|"===t[0].separator?"0.06em solid ":"0.06em dashed ";for(const t of s.children)t.children[0].style.borderLeft=e}let i=e.addEqnNum?0:-1;for(let e=n;e0?a:"center ")+"right "),a&&s.setAttribute("columnalign",a.trim()),e.envClasses.includes("small")&&(s=new N.MathNode("mstyle",[s]),s.setAttribute("scriptlevel","1")),s},gt=function(t,r){-1===t.envName.indexOf("ed")&<(t);const n=[],o=mt(t.parser,{cols:n,addEqnNum:"align"===t.envName||"alignat"===t.envName,emptySingleRow:!0,envClasses:["abut","jot"],maxNumCols:"split"===t.envName?2:void 0,leqno:t.parser.settings.leqno},"display");let s,a=0;const i=t.envName.indexOf("at")>-1;if(r[0]&&i){let t="";for(let e=0;e1)throw new e("{subarray} can contain only one column");let o={cols:n,envClasses:["small"]};if(o=mt(t.parser,o,"script"),o.body.length>0&&o.body[0].length>1)throw new e("{subarray} can contain only one column");return o},mathmlBuilder:ht}),rt({type:"array",names:["cases","dcases","rcases","drcases"],props:{numArgs:0},handler(e){const t=mt(e.parser,{cols:[],envClasses:["cases"]},ut(e.envName));return{type:"leftright",mode:e.mode,body:[t],left:e.envName.indexOf("r")>-1?".":"\\{",right:e.envName.indexOf("r")>-1?"\\}":".",rightColor:void 0}},mathmlBuilder:ht}),rt({type:"array",names:["align","align*","aligned","split"],props:{numArgs:0},handler:gt,mathmlBuilder:ht}),rt({type:"array",names:["alignat","alignat*","alignedat"],props:{numArgs:1},handler:gt,mathmlBuilder:ht}),rt({type:"array",names:["gathered","gather","gather*"],props:{numArgs:0},handler(e){"gathered"!==e.envName&<(e);const t={cols:[],envClasses:["abut","jot"],addEqnNum:"gather"===e.envName,emptySingleRow:!0,leqno:e.parser.settings.leqno};return mt(e.parser,t,"display")},mathmlBuilder:ht}),rt({type:"array",names:["equation","equation*"],props:{numArgs:0},handler(e){lt(e);const t={addEqnNum:"equation"===e.envName,emptySingleRow:!0,singleRow:!0,maxNumCols:1,envClasses:["align"],leqno:e.parser.settings.leqno};return mt(e.parser,t,"display")},mathmlBuilder:ht}),rt({type:"array",names:["multline","multline*"],props:{numArgs:0},handler(e){lt(e);const t={addEqnNum:"multline"===e.envName,maxNumCols:1,envClasses:["jot","multline"],leqno:e.parser.settings.leqno};return mt(e.parser,t,"display")},mathmlBuilder:ht}),rt({type:"array",names:["CD"],props:{numArgs:0},handler:t=>(lt(t),function(t){const r=[];for(t.gullet.beginGroup(),t.gullet.macros.set("\\cr","\\\\\\relax"),t.gullet.beginGroup();;){r.push(t.parseExpression(!1,"\\\\")),t.gullet.endGroup(),t.gullet.beginGroup();const n=t.fetch().text;if("&"!==n&&"\\\\"!==n){if("\\end"===n){0===r[r.length-1].length&&r.pop();break}throw new e("Expected \\\\ or \\cr or \\end",t.nextToken)}t.consume()}let n=[];const o=[n];for(let i=0;i-1);else{if(!("<>AV".indexOf(o)>-1))throw new e('Expected one of "<>AV=|." after @.');for(let t=0;t<2;t++){let n=!0;for(let c=r+1;c({type:"envTag",mode:e.mode,body:t[0]}),mathmlBuilder:(e,t)=>new N.MathNode("mrow")}),c({type:"noTag",names:["\\env@notag"],props:{numArgs:0},handler:({parser:e})=>({type:"noTag",mode:e.mode}),mathmlBuilder:(e,t)=>new N.MathNode("mrow")});const bt=(e,t)=>{const r=e.font,n=t.withFont(r),o=ce(e.body,n);if(0===o.children.length)return o;if("boldsymbol"===r&&["mo","mpadded","mrow"].includes(o.type))return o.style.fontWeight="bold",o;if(((e,t)=>{if("mathrm"!==t||"ordgroup"!==e.body.type||1===e.body.body.length)return!1;if("mathord"!==e.body.body[0].type)return!1;for(let t=1;t{const n=u(r[0]);let o=t;return o in yt&&(o=yt[o]),{type:"font",mode:e.mode,font:o.slice(1),body:n}},mathmlBuilder:bt}),c({type:"font",names:["\\rm","\\sf","\\tt","\\bf","\\it","\\cal"],props:{numArgs:0,allowedInText:!0},handler:({parser:e,funcName:t,breakOnTokenText:r},n)=>{const{mode:o}=e,s=e.parseExpression(!0,r,!0);return{type:"font",mode:o,font:`math${t.slice(1)}`,body:{type:"ordgroup",mode:e.mode,body:s}}},mathmlBuilder:bt});const xt=["display","text","script","scriptscript"],wt={auto:-1,display:0,text:0,script:1,scriptscript:2},kt=(e,t)=>{const r="auto"===e.scriptLevel?t.incrementLevel():"display"===e.scriptLevel?t.withLevel(ot):"text"===e.scriptLevel?t.withLevel(st):t.withLevel(at);let n=new N.MathNode("mfrac",[ce(e.numer,r),ce(e.denom,r)]);if(e.hasBarLine){if(e.barSize){const r=ve(e.barSize,t);n.setAttribute("linethickness",r.number+r.unit)}}else n.setAttribute("linethickness","0px");if(null!=e.leftDelim||null!=e.rightDelim){const t=[];if(null!=e.leftDelim){const r=new N.MathNode("mo",[new N.TextNode(e.leftDelim.replace("\\",""))]);r.setAttribute("fence","true"),t.push(r)}if(t.push(n),null!=e.rightDelim){const r=new N.MathNode("mo",[new N.TextNode(e.rightDelim.replace("\\",""))]);r.setAttribute("fence","true"),t.push(r)}n=se(t)}return"auto"!==e.scriptLevel&&(n=new N.MathNode("mstyle",[n]),n.setAttribute("displaystyle",String("display"===e.scriptLevel)),n.setAttribute("scriptlevel",wt[e.scriptLevel])),n};c({type:"genfrac",names:["\\dfrac","\\frac","\\tfrac","\\dbinom","\\binom","\\tbinom","\\\\atopfrac","\\\\bracefrac","\\\\brackfrac"],props:{numArgs:2,allowedInArgument:!0},handler:({parser:e,funcName:t},r)=>{const n=r[0],o=r[1];let s=!1,a=null,i=null,l="auto";switch(t){case"\\dfrac":case"\\frac":case"\\tfrac":s=!0;break;case"\\\\atopfrac":s=!1;break;case"\\dbinom":case"\\binom":case"\\tbinom":a="(",i=")";break;case"\\\\bracefrac":a="\\{",i="\\}";break;case"\\\\brackfrac":a="[",i="]";break;default:throw new Error("Unrecognized genfrac command")}switch(t){case"\\dfrac":case"\\dbinom":l="display";break;case"\\tfrac":case"\\tbinom":l="text"}return{type:"genfrac",mode:e.mode,continued:!1,numer:n,denom:o,hasBarLine:s,leftDelim:a,rightDelim:i,scriptLevel:l,barSize:null}},mathmlBuilder:kt}),c({type:"genfrac",names:["\\cfrac"],props:{numArgs:2},handler:({parser:e,funcName:t},r)=>{const n=r[0],o=r[1];return{type:"genfrac",mode:e.mode,continued:!0,numer:n,denom:o,hasBarLine:!0,leftDelim:null,rightDelim:null,scriptLevel:"display",barSize:null}}}),c({type:"infix",names:["\\over","\\choose","\\atop","\\brace","\\brack"],props:{numArgs:0,infix:!0},handler({parser:e,funcName:t,token:r}){let n;switch(t){case"\\over":n="\\frac";break;case"\\choose":n="\\binom";break;case"\\atop":n="\\\\atopfrac";break;case"\\brace":n="\\\\bracefrac";break;case"\\brack":n="\\\\brackfrac";break;default:throw new Error("Unrecognized infix genfrac command")}return{type:"infix",mode:e.mode,replaceWith:n,token:r}}});const vt=function(e){let t=null;return e.length>0&&(t=e,t="."===t?null:t),t};c({type:"genfrac",names:["\\genfrac"],props:{numArgs:6,allowedInArgument:!0,argTypes:["math","math","size","text","math","math"]},handler({parser:e},t){const r=t[4],n=t[5],o=u(t[0]),s="atom"===o.type&&"open"===o.family?vt(o.text):null,a=u(t[1]),i="atom"===a.type&&"close"===a.family?vt(a.text):null,l=Oe(t[2],"size");let c,m=null;l.isBlank?c=!0:(m=l.value,c=m.number>0);let d="auto",p=t[3];if("ordgroup"===p.type){if(p.body.length>0){const e=Oe(p.body[0],"textord");d=xt[Number(e.text)]}}else p=Oe(p,"textord"),d=xt[Number(p.text)];return{type:"genfrac",mode:e.mode,numer:r,denom:n,continued:!1,hasBarLine:c,barSize:m,leftDelim:s,rightDelim:i,scriptLevel:d}},mathmlBuilder:kt}),c({type:"infix",names:["\\above"],props:{numArgs:1,argTypes:["size"],infix:!0},handler:({parser:e,funcName:t,token:r},n)=>({type:"infix",mode:e.mode,replaceWith:"\\\\abovefrac",barSize:Oe(n[0],"size").value,token:r})}),c({type:"genfrac",names:["\\\\abovefrac"],props:{numArgs:3,argTypes:["math","size","math"]},handler:({parser:e,funcName:t},r)=>{const n=r[0],o=function(e){if(!e)throw new Error("Expected non-null, but got "+String(e));return e}(Oe(r[1],"infix").barSize),s=r[2],a=o.number>0;return{type:"genfrac",mode:e.mode,numer:n,denom:s,continued:!1,hasBarLine:a,barSize:o,leftDelim:null,rightDelim:null,scriptLevel:"auto"}},mathmlBuilder:kt}),c({type:"hbox",names:["\\hbox"],props:{numArgs:1,argTypes:["hbox"],allowedInArgument:!0,allowedInText:!1},handler:({parser:e},t)=>({type:"hbox",mode:e.mode,body:d(t[0])}),mathmlBuilder(e,t){const r=t.withLevel(ot),n=le(e.body,r);return ne(n)}});c({type:"horizBrace",names:["\\overbrace","\\underbrace"],props:{numArgs:1},handler:({parser:e,funcName:t},r)=>({type:"horizBrace",mode:e.mode,label:t,isOver:/^\\over/.test(t),base:r[0]}),mathmlBuilder:(e,t)=>{const r=B(e.label);return r.style["math-depth"]=0,new N.MathNode(e.isOver?"mover":"munder",[ce(e.base,t),r])}}),c({type:"href",names:["\\href"],props:{numArgs:2,argTypes:["url","original"],allowedInText:!0},handler:({parser:t,token:r},n)=>{const o=n[1],s=Oe(n[0],"url").url;if(!t.settings.isTrusted({command:"\\href",url:s}))throw new e('Function "\\href" is not trusted',r);return{type:"href",mode:t.mode,href:s,body:d(o)}},mathmlBuilder:(e,t)=>{let r=le(e.body,t);return r instanceof k||(r=new k("mrow",[r])),r.setAttribute("href",e.href),r}}),c({type:"href",names:["\\url"],props:{numArgs:1,argTypes:["url"],allowedInText:!0},handler:({parser:t,token:r},n)=>{const o=Oe(n[0],"url").url;if(!t.settings.isTrusted({command:"\\url",url:o}))throw new e('Function "\\url" is not trusted',r);const s=[];for(let e=0;e{const s=Oe(o[0],"raw").string,a=o[1];if(t.settings.strict)throw new e(`Function "${r}" is disabled in strict mode`,n);let i;const l={};switch(r){case"\\class":l.class=s,i={command:"\\class",class:s};break;case"\\id":l.id=s,i={command:"\\id",id:s};break;case"\\style":l.style=s,i={command:"\\style",style:s};break;case"\\data":{const t=s.split(",");for(let r=0;r{const r=le(e.body,t),n=[];e.attributes.class&&n.push(...e.attributes.class.trim().split(/\s+/)),r.classes=n;for(const t in e.attributes)"class"!==t&&Object.prototype.hasOwnProperty.call(e.attributes,t)&&r.setAttribute(t,e.attributes[t]);return r}});const At=function(t){if(/^[-+]? *(\d+(\.\d*)?|\.\d+)$/.test(t))return{number:+t,unit:"bp"};{const r=/([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(t);if(!r)throw new e("Invalid size: '"+t+"' in \\includegraphics");const n={number:+(r[1]+r[2]),unit:r[3]};if(!we(n))throw new e("Invalid unit: '"+n.unit+"' in \\includegraphics.");return n}};c({type:"includegraphics",names:["\\includegraphics"],props:{numArgs:1,numOptionalArgs:1,argTypes:["raw","url"],allowedInText:!1},handler:({parser:t,token:r},n,o)=>{let s={number:0,unit:"em"},a={number:.9,unit:"em"},i={number:0,unit:"em"},l="";if(o[0]){const t=Oe(o[0],"raw").string.split(",");for(let r=0;r{const r=ve(e.height,t),n={number:0,unit:"em"};e.totalheight.number>0&&e.totalheight.unit===r.unit&&e.totalheight.number>r.number&&(n.number=e.totalheight.number-r.number,n.unit=r.unit);let o=0;e.width.number>0&&(o=ve(e.width,t));const s={height:r.number+n.number+"em"};o.number>0&&(s.width=o.number+o.unit),n.number>0&&(s.verticalAlign=-n.number+n.unit);const a=new w(e.src,e.alt,s);return a.height=r,a.depth=n,new N.MathNode("mtext",[a])}}),c({type:"kern",names:["\\kern","\\mkern","\\hskip","\\mskip"],props:{numArgs:1,argTypes:["size"],primitive:!0,allowedInText:!0},handler({parser:t,funcName:r,token:n},o){const s=Oe(o[0],"size");if(t.settings.strict){const o="m"===r[1],a="mu"===s.value.unit;if(o){if(!a)throw new e(`LaTeX's ${r} supports only mu units, not ${s.value.unit} units`,n);if("math"!==t.mode)throw new e(`LaTeX's ${r} works only in math mode`,n)}else if(a)throw new e(`LaTeX's ${r} doesn't support mu units`,n)}return{type:"kern",mode:t.mode,dimension:s.value}},mathmlBuilder(e,t){const r=ve(e.dimension,t),n="em"===r.unit?Nt(r.number):"";if("text"===e.mode&&n.length>0){const e=new N.TextNode(n);return new N.MathNode("mtext",[e])}{const e=new N.MathNode("mspace");return e.setAttribute("width",r.number+r.unit),r.number<0&&(e.style.marginLeft=r.number+r.unit),e}}});const Nt=function(e){return e>=.05555&&e<=.05556?" ":e>=.1666&&e<=.1667?" ":e>=.2222&&e<=.2223?" ":e>=.2777&&e<=.2778?"  ":""},Tt=/[^A-Za-z_0-9-]/g;c({type:"label",names:["\\label"],props:{numArgs:1,argTypes:["raw"]},handler:({parser:e},t)=>({type:"label",mode:e.mode,string:t[0].string.replace(Tt,"")}),mathmlBuilder(e,t){const r=new N.MathNode("mrow",[],["tml-label"]);return e.string.length>0&&r.setAttribute("id",e.string),r}});const qt=["\\clap","\\llap","\\rlap"];c({type:"lap",names:["\\mathllap","\\mathrlap","\\mathclap","\\clap","\\llap","\\rlap"],props:{numArgs:1,allowedInText:!0},handler:({parser:t,funcName:r,token:n},o)=>{if(qt.includes(r)){if(t.settings.strict&&"text"!==t.mode)throw new e(`{${r}} can be used only in text mode.\n Try \\math${r.slice(1)}`,n);r=r.slice(1)}else r=r.slice(5);const s=o[0];return{type:"lap",mode:t.mode,alignment:r,body:s}},mathmlBuilder:(e,t)=>{let r;if("llap"===e.alignment){const n=ie(d(e.body),t),o=new N.MathNode("mphantom",n);r=new N.MathNode("mpadded",[o]),r.setAttribute("width","0px")}const n=ce(e.body,t);let o;if("llap"===e.alignment?(n.style.position="absolute",n.style.right="0",n.style.bottom="0",o=new N.MathNode("mpadded",[r,n])):o=new N.MathNode("mpadded",[n]),"rlap"===e.alignment)e.body.body.length>0&&"genfrac"===e.body.body[0].type&&o.setAttribute("lspace","0.16667em");else{const t="llap"===e.alignment?"-1":"-0.5";o.setAttribute("lspace",t+"width"),"llap"===e.alignment?o.style.position="relative":(o.style.display="flex",o.style.justifyContent="center")}return o.setAttribute("width","0px"),o}}),c({type:"ordgroup",names:["\\(","$"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler({funcName:e,parser:t},r){const n=t.mode;t.switchMode("math");const o="\\("===e?"\\)":"$",s=t.parseExpression(!1,o);return t.expect(o),t.switchMode(n),{type:"ordgroup",mode:t.mode,body:s}}}),c({type:"text",names:["\\)","\\]"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(t,r){throw new e(`Mismatched ${t.funcName}`,r)}});c({type:"mathchoice",names:["\\mathchoice"],props:{numArgs:4,primitive:!0},handler:({parser:e},t)=>({type:"mathchoice",mode:e.mode,display:d(t[0]),text:d(t[1]),script:d(t[2]),scriptscript:d(t[3])}),mathmlBuilder:(e,t)=>{const r=((e,t)=>{switch(t.level){case nt:return e.display;case ot:return e.text;case st:return e.script;case at:return e.scriptscript;default:return e.text}})(e,t);return le(r,t)}});const St=["text","textord","mathord","atom"],Ot=e=>{const t=new N.MathNode("mspace");return t.setAttribute("width",e+"em"),t};function Bt(e,t){let r;const n=ie(e.body,t);if("minner"===e.mclass)r=new N.MathNode("mpadded",n);else if("mord"===e.mclass)e.isCharacterBox||"mathord"===n[0].type?(r=n[0],r.type="mi",1===r.children.length&&r.children[0].text&&"∇"===r.children[0].text&&r.setAttribute("mathvariant","normal")):r=new N.MathNode("mi",n);else{r=new N.MathNode("mrow",n),e.mustPromote?(r=n[0],r.type="mo",e.isCharacterBox&&e.body[0].text&&/[A-Za-z]/.test(e.body[0].text)&&r.setAttribute("mathvariant","italic")):r=new N.MathNode("mrow",n);const o=t.level<2;"mrow"===r.type?o&&("mbin"===e.mclass?(r.children.unshift(Ot(.2222)),r.children.push(Ot(.2222))):"mrel"===e.mclass?(r.children.unshift(Ot(.2778)),r.children.push(Ot(.2778))):"mpunct"===e.mclass?r.children.push(Ot(.1667)):"minner"===e.mclass&&(r.children.unshift(Ot(.0556)),r.children.push(Ot(.0556)))):"mbin"===e.mclass?(r.attributes.lspace=o?"0.2222em":"0",r.attributes.rspace=o?"0.2222em":"0"):"mrel"===e.mclass?(r.attributes.lspace=o?"0.2778em":"0",r.attributes.rspace=o?"0.2778em":"0"):"mpunct"===e.mclass?(r.attributes.lspace="0em",r.attributes.rspace=o?"0.1667em":"0"):"mopen"===e.mclass||"mclose"===e.mclass?(r.attributes.lspace="0em",r.attributes.rspace="0em"):"minner"===e.mclass&&o&&(r.attributes.lspace="0.0556em",r.attributes.width="+0.1111em"),"mopen"!==e.mclass&&"mclose"!==e.mclass&&(delete r.attributes.stretchy,delete r.attributes.form)}return r}c({type:"mclass",names:["\\mathord","\\mathbin","\\mathrel","\\mathopen","\\mathclose","\\mathpunct","\\mathinner"],props:{numArgs:1,primitive:!0},handler({parser:e,funcName:t},r){const n=r[0],o=s.isCharacterBox(n);let a=!0;const i={type:"mathord",text:"",mode:e.mode},l=n.body?n.body:[n];for(const t of l){if(!St.includes(t.type)){a=!1;break}E[e.mode][t.text]?i.text+=E[e.mode][t.text].replace:t.text?i.text+=t.text:t.body&&t.body.map((e=>{i.text+=e.text}))}return{type:"mclass",mode:e.mode,mclass:"m"+t.slice(5),body:d(a?i:n),isCharacterBox:o,mustPromote:a}},mathmlBuilder:Bt});const Mt=e=>{const t="ordgroup"===e.type&&e.body.length?e.body[0]:e;return"atom"!==t.type||"bin"!==t.family&&"rel"!==t.family?"mord":"m"+t.family};c({type:"mclass",names:["\\@binrel"],props:{numArgs:2},handler:({parser:e},t)=>({type:"mclass",mode:e.mode,mclass:Mt(t[0]),body:d(t[1]),isCharacterBox:s.isCharacterBox(t[1])})}),c({type:"mclass",names:["\\stackrel","\\overset","\\underset"],props:{numArgs:2},handler({parser:e,funcName:t},r){const n=r[1],o=r[0],s={type:"op",mode:n.mode,limits:!0,alwaysHandleSupSub:!0,parentIsSupSub:!1,symbol:!1,stack:!0,suppressBaseShift:"\\stackrel"!==t,body:d(n)};return{type:"supsub",mode:o.mode,base:s,sup:"\\underset"===t?null:o,sub:"\\underset"===t?o:null}},mathmlBuilder:Bt});const Ct=(e,t,r)=>{if(!e)return r;const n=ce(e,t);return"mrow"===n.type&&0===n.children.length?r:n};c({type:"multiscript",names:["\\sideset","\\pres@cript"],props:{numArgs:3},handler({parser:t,funcName:r,token:n},o){if(0===o[2].body.length)throw new e(r+"cannot parse an empty base.");const s=o[2].body[0];if(t.settings.strict&&"\\sideset"===r&&!s.symbol)throw new e("The base of \\sideset must be a big operator. Try \\prescript.");if(o[0].body.length>0&&"supsub"!==o[0].body[0].type||o[1].body.length>0&&"supsub"!==o[1].body[0].type)throw new e("\\sideset can parse only subscripts and superscripts in its first two arguments",n);const a=o[0].body.length>0?o[0].body[0]:null,i=o[1].body.length>0?o[1].body[0]:null;return a||i?a?{type:"multiscript",mode:t.mode,isSideset:"\\sideset"===r,prescripts:a,postscripts:i,base:s}:{type:"styling",mode:t.mode,scriptLevel:"text",body:[{type:"supsub",mode:t.mode,base:s,sup:i.sup,sub:i.sub}]}:s},mathmlBuilder(e,t){const r=ce(e.base,t),n=new N.MathNode("mprescripts"),o=new N.MathNode("none");let s=[];const a=Ct(e.prescripts.sub,t,o),i=Ct(e.prescripts.sup,t,o);if(e.isSideset&&(a.setAttribute("style","text-align: left;"),i.setAttribute("style","text-align: left;")),e.postscripts){s=[r,Ct(e.postscripts.sub,t,o),Ct(e.postscripts.sup,t,o),n,a,i]}else s=[r,n,a,i];return new N.MathNode("mmultiscripts",s)}}),c({type:"not",names:["\\not"],props:{numArgs:1,primitive:!0,allowedInText:!1},handler({parser:e},t){const r=s.isCharacterBox(t[0]);let n;if(r)n=d(t[0]),"\\"===n[0].text.charAt(0)&&(n[0].text=E.math[n[0].text].replace),n[0].text=n[0].text.slice(0,1)+"̸"+n[0].text.slice(1);else{n=[{type:"textord",mode:"math",text:"̸"},{type:"kern",mode:"math",dimension:{number:-.6,unit:"em"}},t[0]]}return{type:"not",mode:e.mode,body:n,isCharacterBox:r}},mathmlBuilder(e,t){if(e.isCharacterBox){return ie(e.body,t,!0)[0]}return le(e.body,t)}});const zt=["textord","mathord","atom"],Et=["\\smallint"],It=["textord","mathord","ordgroup","close","leftright"],$t=e=>{e.attributes.lspace="0.1667em",e.attributes.rspace="0.1667em"},Lt=(e,t)=>{let r;if(e.symbol)r=new k("mo",[re(e.name,e.mode)]),Et.includes(e.name)?r.setAttribute("largeop","false"):r.setAttribute("movablelimits","false"),e.fromMathOp&&$t(r);else if(e.body)r=new k("mo",ie(e.body,t)),e.fromMathOp&&$t(r);else if(r=new k("mi",[new v(e.name.slice(1))]),!e.parentIsSupSub){const t=[r,new k("mo",[re("⁡","text")])];if(e.needsLeadingSpace){const e=new k("mspace");e.setAttribute("width","0.1667em"),t.unshift(e)}if(!e.isFollowedByDelimiter){const e=new k("mspace");e.setAttribute("width","0.1667em"),t.push(e)}r=new k("mrow",t)}return r},Ft={"∏":"\\prod","∐":"\\coprod","∑":"\\sum","⋀":"\\bigwedge","⋁":"\\bigvee","⋂":"\\bigcap","⋃":"\\bigcup","⨀":"\\bigodot","⨁":"\\bigoplus","⨂":"\\bigotimes","⨄":"\\biguplus","⨅":"\\bigsqcap","⨆":"\\bigsqcup","⨉":"\\bigtimes"};c({type:"op",names:["\\coprod","\\bigvee","\\bigwedge","\\biguplus","\\bigcap","\\bigcup","\\intop","\\prod","\\sum","\\bigotimes","\\bigoplus","\\bigodot","\\bigsqcap","\\bigsqcup","\\bigtimes","\\smallint","∏","∐","∑","⋀","⋁","⋂","⋃","⨀","⨁","⨂","⨄","⨆"],props:{numArgs:0},handler:({parser:e,funcName:t},r)=>{let n=t;return 1===n.length&&(n=Ft[n]),{type:"op",mode:e.mode,limits:!0,parentIsSupSub:!1,symbol:!0,stack:!1,name:n}},mathmlBuilder:Lt}),c({type:"op",names:["\\mathop"],props:{numArgs:1,primitive:!0},handler:({parser:e},t)=>{const r=t[0],n=r.body?r.body:[r],o=1===n.length&&zt.includes(n[0].type);return{type:"op",mode:e.mode,limits:!0,parentIsSupSub:!1,symbol:o,fromMathOp:!0,stack:!1,name:o?n[0].text:null,body:o?null:d(r)}},mathmlBuilder:Lt});const Gt={"∫":"\\int","∬":"\\iint","∭":"\\iiint","∮":"\\oint","∯":"\\oiint","∰":"\\oiiint","∱":"\\intclockwise","∲":"\\varointclockwise","⨌":"\\iiiint","⨍":"\\intbar","⨎":"\\intBar","⨏":"\\fint","⨒":"\\rppolint","⨓":"\\scpolint","⨕":"\\pointint","⨖":"\\sqint","⨗":"\\intlarhk","⨘":"\\intx","⨙":"\\intcap","⨚":"\\intcup"};c({type:"op",names:["\\arcsin","\\arccos","\\arctan","\\arctg","\\arcctg","\\arg","\\ch","\\cos","\\cosec","\\cosh","\\cot","\\cotg","\\coth","\\csc","\\ctg","\\cth","\\deg","\\dim","\\exp","\\hom","\\ker","\\lg","\\ln","\\log","\\sec","\\sin","\\sinh","\\sh","\\sgn","\\tan","\\tanh","\\tg","\\th"],props:{numArgs:0},handler({parser:e,funcName:t}){const r=e.prevAtomType,n=e.gullet.future().text;return{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!1,stack:!1,isFollowedByDelimiter:Ye(n),needsLeadingSpace:r.length>0&&It.includes(r),name:t}},mathmlBuilder:Lt}),c({type:"op",names:["\\det","\\gcd","\\inf","\\lim","\\max","\\min","\\Pr","\\sup"],props:{numArgs:0},handler({parser:e,funcName:t}){const r=e.prevAtomType,n=e.gullet.future().text;return{type:"op",mode:e.mode,limits:!0,parentIsSupSub:!1,symbol:!1,stack:!1,isFollowedByDelimiter:Ye(n),needsLeadingSpace:r.length>0&&It.includes(r),name:t}},mathmlBuilder:Lt}),c({type:"op",names:["\\int","\\iint","\\iiint","\\iiiint","\\oint","\\oiint","\\oiiint","\\intclockwise","\\varointclockwise","\\intbar","\\intBar","\\fint","\\rppolint","\\scpolint","\\pointint","\\sqint","\\intlarhk","\\intx","\\intcap","\\intcup","∫","∬","∭","∮","∯","∰","∱","∲","⨌","⨍","⨎","⨏","⨒","⨓","⨕","⨖","⨗","⨘","⨙","⨚"],props:{numArgs:0},handler({parser:e,funcName:t}){let r=t;return 1===r.length&&(r=Gt[r]),{type:"op",mode:e.mode,limits:!1,parentIsSupSub:!1,symbol:!0,stack:!1,name:r}},mathmlBuilder:Lt});const Dt={};function Pt(e,t){Dt[e]=t}c({type:"operatorname",names:["\\operatorname@","\\operatornamewithlimits"],props:{numArgs:1,allowedInArgument:!0},handler:({parser:e,funcName:t},r)=>{const n=r[0],o=e.prevAtomType,s=e.gullet.future().text;return{type:"operatorname",mode:e.mode,body:d(n),alwaysHandleSupSub:"\\operatornamewithlimits"===t,limits:!1,parentIsSupSub:!1,isFollowedByDelimiter:Ye(s),needsLeadingSpace:o.length>0&&It.includes(o)}},mathmlBuilder:(e,t)=>{let r,n=ie(e.body,t.withFont("mathrm")),o=!0;for(let e=0;ee.toText())).join("");n=[new N.TextNode(e)]}else if(1===n.length&&["mover","munder"].includes(n[0].type)&&("mi"===n[0].children[0].type||"mtext"===n[0].children[0].type)){if(n[0].children[0].type="mi",e.parentIsSupSub)return new N.MathNode("mrow",n);{const e=new N.MathNode("mo",[re("⁡","text")]);return N.newDocumentFragment([n[0],e])}}if(o?(r=new N.MathNode("mi",n),1===n[0].text.length&&r.setAttribute("mathvariant","normal")):r=new N.MathNode("mrow",n),!e.parentIsSupSub){const t=[r,new N.MathNode("mo",[re("⁡","text")])];if(e.needsLeadingSpace){const e=new N.MathNode("mspace");e.setAttribute("width","0.1667em"),t.unshift(e)}if(!e.isFollowedByDelimiter){const e=new N.MathNode("mspace");e.setAttribute("width","0.1667em"),t.push(e)}return N.newDocumentFragment(t)}return r}}),Pt("\\operatorname","\\@ifstar\\operatornamewithlimits\\operatorname@"),m({type:"ordgroup",mathmlBuilder:(e,t)=>le(e.body,t,e.semisimple)}),c({type:"phantom",names:["\\phantom"],props:{numArgs:1,allowedInText:!0},handler:({parser:e},t)=>{const r=t[0];return{type:"phantom",mode:e.mode,body:d(r)}},mathmlBuilder:(e,t)=>{const r=ie(e.body,t);return new N.MathNode("mphantom",r)}}),c({type:"hphantom",names:["\\hphantom"],props:{numArgs:1,allowedInText:!0},handler:({parser:e},t)=>{const r=t[0];return{type:"hphantom",mode:e.mode,body:r}},mathmlBuilder:(e,t)=>{const r=ie(d(e.body),t),n=new N.MathNode("mphantom",r),o=new N.MathNode("mpadded",[n]);return o.setAttribute("height","0px"),o.setAttribute("depth","0px"),o}}),c({type:"vphantom",names:["\\vphantom"],props:{numArgs:1,allowedInText:!0},handler:({parser:e},t)=>{const r=t[0];return{type:"vphantom",mode:e.mode,body:r}},mathmlBuilder:(e,t)=>{const r=ie(d(e.body),t),n=new N.MathNode("mphantom",r),o=new N.MathNode("mpadded",[n]);return o.setAttribute("width","0px"),o}}),c({type:"pmb",names:["\\pmb"],props:{numArgs:1,allowedInText:!0},handler:({parser:e},t)=>({type:"pmb",mode:e.mode,body:d(t[0])}),mathmlBuilder(e,t){const r=ie(e.body,t),n=A(r);return n.setAttribute("style","font-weight:bold"),n}});const Rt=(e,t)=>{const r=t.withLevel(ot),n=new N.MathNode("mpadded",[ce(e.body,r)]),o=ve(e.dy,t);return n.setAttribute("voffset",o.number+o.unit),o.number>0?n.style.padding=o.number+o.unit+" 0 0 0":n.style.padding="0 0 "+Math.abs(o.number)+o.unit+" 0",n};c({type:"raise",names:["\\raise","\\lower"],props:{numArgs:2,argTypes:["size","primitive"],primitive:!0},handler({parser:e,funcName:t},r){const n=Oe(r[0],"size").value;"\\lower"===t&&(n.number*=-1);const o=r[1];return{type:"raise",mode:e.mode,dy:n,body:o}},mathmlBuilder:Rt}),c({type:"raise",names:["\\raisebox"],props:{numArgs:2,argTypes:["size","hbox"],allowedInText:!0},handler({parser:e,funcName:t},r){const n=Oe(r[0],"size").value,o=r[1];return{type:"raise",mode:e.mode,dy:n,body:o}},mathmlBuilder:Rt}),c({type:"ref",names:["\\ref","\\eqref"],props:{numArgs:1,argTypes:["raw"]},handler:({parser:e,funcName:t},r)=>({type:"ref",mode:e.mode,funcName:t,string:r[0].string.replace(Tt,"")}),mathmlBuilder(e,t){const r="\\ref"===e.funcName?["tml-ref"]:["tml-ref","tml-eqref"],n=new N.MathNode("mtext",[new N.TextNode("")],r);return n.setAttribute("href","#"+e.string),n}}),c({type:"reflect",names:["\\reflectbox"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!0},handler:({parser:e},t)=>({type:"reflect",mode:e.mode,body:t[0]}),mathmlBuilder(e,t){const r=ce(e.body,t);return r.style.transform="scaleX(-1)",r}}),c({type:"internal",names:["\\relax"],props:{numArgs:0,allowedInText:!0},handler:({parser:e})=>({type:"internal",mode:e.mode})}),c({type:"rule",names:["\\rule"],props:{numArgs:2,numOptionalArgs:1,argTypes:["size","size","size"]},handler({parser:e},t,r){const n=r[0],o=Oe(t[0],"size"),s=Oe(t[1],"size");return{type:"rule",mode:e.mode,shift:n&&Oe(n,"size").value,width:o.value,height:s.value}},mathmlBuilder(e,t){const r=ve(e.width,t),n=ve(e.height,t),o=e.shift?ve(e.shift,t):{number:0,unit:"em"},s=t.color&&t.getColor()||"black",a=new N.MathNode("mspace");if(r.number>0&&n.number>0&&a.setAttribute("mathbackground",s),a.setAttribute("width",r.number+r.unit),a.setAttribute("height",n.number+n.unit),0===o.number)return a;const i=new N.MathNode("mpadded",[a]);return o.number>=0?i.setAttribute("height","+"+o.number+o.unit):(i.setAttribute("height",o.number+o.unit),i.setAttribute("depth","+"+-o.number+o.unit)),i.setAttribute("voffset",o.number+o.unit),i}});const jt={"\\tiny":.5,"\\sixptsize":.6,"\\Tiny":.6,"\\scriptsize":.7,"\\footnotesize":.8,"\\small":.9,"\\normalsize":1,"\\large":1.2,"\\Large":1.44,"\\LARGE":1.728,"\\huge":2.074,"\\Huge":2.488};c({type:"sizing",names:["\\tiny","\\sixptsize","\\Tiny","\\scriptsize","\\footnotesize","\\small","\\normalsize","\\large","\\Large","\\LARGE","\\huge","\\Huge"],props:{numArgs:0,allowedInText:!0},handler:({breakOnTokenText:e,funcName:t,parser:r},n)=>{r.settings.strict&&"math"===r.mode&&console.log(`Temml strict-mode warning: Command ${t} is invalid in math mode.`);const o=r.parseExpression(!1,e,!0);return{type:"sizing",mode:r.mode,funcName:t,body:o}},mathmlBuilder:(e,t)=>{const r=t.withFontSize(jt[e.funcName]),n=ie(e.body,r),o=A(n),s=(jt[e.funcName]/t.fontSize).toFixed(4);return o.setAttribute("mathsize",s+"em"),o}}),c({type:"smash",names:["\\smash"],props:{numArgs:1,numOptionalArgs:1,allowedInText:!0},handler:({parser:e},t,r)=>{let n=!1,o=!1;const s=r[0]&&Oe(r[0],"ordgroup");if(s){let e="";for(let t=0;t{const r=new N.MathNode("mpadded",[ce(e.body,t)]);return e.smashHeight&&r.setAttribute("height","0px"),e.smashDepth&&r.setAttribute("depth","0px"),r}}),c({type:"sqrt",names:["\\sqrt"],props:{numArgs:1,numOptionalArgs:1},handler({parser:e},t,r){const n=r[0],o=t[0];return{type:"sqrt",mode:e.mode,body:o,index:n}},mathmlBuilder(e,t){const{body:r,index:n}=e;return n?new N.MathNode("mroot",[ce(r,t),ce(n,t.incrementLevel())]):new N.MathNode("msqrt",[ce(r,t)])}});const Ut={display:0,text:1,script:2,scriptscript:3},Ht={display:["0","true"],text:["0","false"],script:["1","false"],scriptscript:["2","false"]};c({type:"styling",names:["\\displaystyle","\\textstyle","\\scriptstyle","\\scriptscriptstyle"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler({breakOnTokenText:e,funcName:t,parser:r},n){const o=r.parseExpression(!0,e,!0),s=t.slice(1,t.length-5);return{type:"styling",mode:r.mode,scriptLevel:s,body:o}},mathmlBuilder(e,t){const r=t.withLevel(Ut[e.scriptLevel]),n=ie(e.body,r),o=A(n),s=Ht[e.scriptLevel];return o.setAttribute("scriptlevel",s[0]),o.setAttribute("displaystyle",s[1]),o}});const Vt=/^m(over|under|underover)$/;m({type:"supsub",mathmlBuilder(e,t){let r,n,o=!1,s=!1,a=!1,i=!1;e.base&&"horizBrace"===e.base.type&&(n=!!e.sup,n===e.base.isOver&&(o=!0,r=e.base.isOver)),!e.base||e.base.stack||"op"!==e.base.type&&"operatorname"!==e.base.type||(e.base.parentIsSupSub=!0,s=!e.base.symbol,a=s&&!e.isFollowedByDelimiter,i=e.base.needsLeadingSpace);const l=e.base&&e.base.stack?[ce(e.base.body[0],t)]:[ce(e.base,t)],c=t.inSubOrSup();if(e.sub&&l.push(ce(e.sub,c)),e.sup){const t=ce(e.sup,c),r="mrow"===t.type?t.children[0]:t;"mo"===r.type&&r.classes.includes("tml-prime")&&e.base&&e.base.text&&"f"===e.base.text&&r.classes.push("prime-pad"),l.push(t)}let m;if(o)m=r?"mover":"munder";else if(e.sub)if(e.sup){const r=e.base;m=r&&("op"===r.type&&r.limits||"multiscript"===r.type)&&(t.level===nt||r.alwaysHandleSupSub)||r&&"operatorname"===r.type&&r.alwaysHandleSupSub&&(t.level===nt||r.limits)?"munderover":"msubsup"}else{const r=e.base;m=r&&"op"===r.type&&r.limits&&(t.level===nt||r.alwaysHandleSupSub)||r&&"operatorname"===r.type&&r.alwaysHandleSupSub&&(r.limits||t.level===nt)?"munder":"msub"}else{const r=e.base;m=r&&"op"===r.type&&r.limits&&(t.level===nt||r.alwaysHandleSupSub)||r&&"operatorname"===r.type&&r.alwaysHandleSupSub&&(r.limits||t.level===nt)?"mover":"msup"}let u=new N.MathNode(m,l);if(s){const e=new N.MathNode("mo",[re("⁡","text")]);if(i){const t=new N.MathNode("mspace");t.setAttribute("width","0.1667em"),u=N.newDocumentFragment([t,u,e])}else u=N.newDocumentFragment([u,e]);if(a){const e=new N.MathNode("mspace");e.setAttribute("width","0.1667em"),u.children.push(e)}}else Vt.test(m)&&(u=new N.MathNode("mrow",[u]));return u}});const _t=["\\shortmid","\\nshortmid","\\shortparallel","\\nshortparallel","\\smallsetminus"],Wt=["\\Rsh","\\Lsh","\\restriction"];m({type:"atom",mathmlBuilder(e,t){const r=new N.MathNode("mo",[re(e.text,e.mode)]);return"punct"===e.family?r.setAttribute("separator","true"):"open"===e.family||"close"===e.family?"open"===e.family?(r.setAttribute("form","prefix"),r.setAttribute("stretchy","false")):"close"===e.family&&(r.setAttribute("form","postfix"),r.setAttribute("stretchy","false")):"\\mid"===e.text?(r.setAttribute("lspace","0.22em"),r.setAttribute("rspace","0.22em"),r.setAttribute("stretchy","false")):"rel"===e.family&&(e=>{if(1===e.length){const t=e.codePointAt(0);return 8591-1||e.indexOf("harpoon")>-1||Wt.includes(e)})(e.text)?r.setAttribute("stretchy","false"):_t.includes(e.text)?r.setAttribute("mathsize","70%"):":"===e.text&&(r.attributes.lspace="0.2222em",r.attributes.rspace="0.2222em"),r}});const Xt={mathbf:"bold",mathrm:"normal",textit:"italic",mathit:"italic",mathnormal:"italic",mathbb:"double-struck",mathcal:"script",mathfrak:"fraktur",mathscr:"script",mathsf:"sans-serif",mathtt:"monospace"},Zt=function(e,t){if("texttt"===t.fontFamily)return"monospace";if("textsc"===t.fontFamily)return"normal";if("textsf"===t.fontFamily)return"textit"===t.fontShape&&"textbf"===t.fontWeight?"sans-serif-bold-italic":"textit"===t.fontShape?"sans-serif-italic":"textbf"===t.fontWeight?"sans-serif-bold":"sans-serif";if("textit"===t.fontShape&&"textbf"===t.fontWeight)return"bold-italic";if("textit"===t.fontShape)return"italic";if("textbf"===t.fontWeight)return"bold";const r=t.font;if(!r||"mathnormal"===r)return null;const n=e.mode;switch(r){case"mathit":case"greekItalic":return"italic";case"mathrm":{const t=e.text.codePointAt(0);return 9390,bold:e=>119743,italic:e=>119795,"bold-italic":e=>119847,script:e=>Yt[e]||119899,"script-bold":e=>119951,fraktur:e=>Kt[e]||120003,"fraktur-bold":e=>120107,"double-struck":e=>Jt[e]||120055,"sans-serif":e=>120159,"sans-serif-bold":e=>120211,"sans-serif-italic":e=>120263,"sans-serif-bold-italic":e=>120380,monospace:e=>120367},lowerCaseLatin:{normal:e=>0,bold:e=>119737,italic:e=>"h"===e?8358:119789,"bold-italic":e=>119841,script:e=>Yt[e]||119893,"script-bold":e=>119945,fraktur:e=>119997,"fraktur-bold":e=>120101,"double-struck":e=>120049,"sans-serif":e=>120153,"sans-serif-bold":e=>120205,"sans-serif-italic":e=>120257,"sans-serif-bold-italic":e=>120309,monospace:e=>120361},upperCaseGreek:{normal:e=>0,bold:e=>119575,italic:e=>119633,"bold-italic":e=>119575,script:e=>0,"script-bold":e=>0,fraktur:e=>0,"fraktur-bold":e=>0,"double-struck":e=>0,"sans-serif":e=>119749,"sans-serif-bold":e=>119749,"sans-serif-italic":e=>0,"sans-serif-bold-italic":e=>119807,monospace:e=>0},lowerCaseGreek:{normal:e=>0,bold:e=>119569,italic:e=>119627,"bold-italic":e=>"ϕ"===e?119678:119685,script:e=>0,"script-bold":e=>0,fraktur:e=>0,"fraktur-bold":e=>0,"double-struck":e=>0,"sans-serif":e=>119743,"sans-serif-bold":e=>119743,"sans-serif-italic":e=>0,"sans-serif-bold-italic":e=>119801,monospace:e=>0},varGreek:{normal:e=>0,bold:e=>Qt[e]||-51,italic:e=>0,"bold-italic":e=>er[e]||58,script:e=>0,"script-bold":e=>0,fraktur:e=>0,"fraktur-bold":e=>0,"double-struck":e=>0,"sans-serif":e=>tr[e]||116,"sans-serif-bold":e=>tr[e]||116,"sans-serif-italic":e=>0,"sans-serif-bold-italic":e=>rr[e]||174,monospace:e=>0},numeral:{normal:e=>0,bold:e=>120734,italic:e=>0,"bold-italic":e=>0,script:e=>0,"script-bold":e=>0,fraktur:e=>0,"fraktur-bold":e=>0,"double-struck":e=>120744,"sans-serif":e=>120754,"sans-serif-bold":e=>120764,"sans-serif-italic":e=>0,"sans-serif-bold-italic":e=>0,monospace:e=>120774}}),or=(e,t)=>{const r=e.codePointAt(0),n=64{const n=new N.MathNode(r,[e]),o=new N.MathNode("mstyle",[n]);return o.style["font-style"]="italic",o.style["font-family"]="Cambria, 'Times New Roman', serif","bold-italic"===t&&(o.style["font-weight"]="bold"),o})(o,s,t);"normal"!==s&&(o.text=o.text.split("").map((e=>or(e,s))).join("")),a=new N.MathNode(t,[o])}else if("text"===e.mode)"normal"!==s&&(o.text=or(o.text,s)),a=new N.MathNode("mtext",[o]);else if(lr.has(e.text))a=new N.MathNode("mo",[o]),a.classes.push("tml-prime");else{const e=o.text;"italic"!==s&&(o.text=or(o.text,s)),a=new N.MathNode("mi",[o]),o.text===e&&ir.test(e)&&a.setAttribute("mathvariant","italic")}return a}});const cr={"\\nobreak":"nobreak","\\allowbreak":"allowbreak"},mr={" ":{},"\\ ":{},"~":{className:"nobreak"},"\\space":{},"\\nobreakspace":{className:"nobreak"}};m({type:"spacing",mathmlBuilder(t,r){let n;if(Object.prototype.hasOwnProperty.call(mr,t.text))n=new N.MathNode("mtext",[new N.TextNode(" ")]);else{if(!Object.prototype.hasOwnProperty.call(cr,t.text))throw new e(`Unknown type of space "${t.text}"`);n=new N.MathNode("mo"),"\\nobreak"===t.text&&n.setAttribute("linebreak","nobreak")}return n}}),m({type:"tag"});const ur={"\\text":void 0,"\\textrm":"textrm","\\textsf":"textsf","\\texttt":"texttt","\\textnormal":"textrm","\\textsc":"textsc"},dr={"\\textbf":"textbf","\\textmd":"textmd"},pr={"\\textit":"textit","\\textup":"textup"};c({type:"text",names:["\\text","\\textrm","\\textsf","\\texttt","\\textnormal","\\textsc","\\textbf","\\textmd","\\textit","\\textup"],props:{numArgs:1,argTypes:["text"],allowedInArgument:!0,allowedInText:!0},handler({parser:e,funcName:t},r){const n=r[0];return{type:"text",mode:e.mode,body:d(n),font:t}},mathmlBuilder(e,t){const r=((e,t)=>{const r=e.font;return r?ur[r]?t.withTextFontFamily(ur[r]):dr[r]?t.withTextFontWeight(dr[r]):t.withTextFontShape(pr[r]):t})(e,t),n=le(e.body,r);return ne(n)}}),c({type:"verb",names:["\\verb"],props:{numArgs:0,allowedInText:!0},handler(t,r,n){throw new e("\\verb ended by end of line instead of matching delimiter")},mathmlBuilder(e,t){const r=new N.TextNode(hr(e)),n=new N.MathNode("mtext",[r]);return n.setAttribute("mathvariant","monospace"),n}});const hr=e=>e.body.replace(/ /g,e.star?"␣":" "),gr=i;class fr{constructor(e,t,r){this.lexer=e,this.start=t,this.end=r}static range(e,t){return t?e&&e.loc&&t.loc&&e.loc.lexer===t.loc.lexer?new fr(e.loc.lexer,e.loc.start,t.loc.end):null:e&&e.loc}}class br{constructor(e,t){this.text=e,this.loc=t}range(e,t){return new br(t,fr.range(this,e))}}const yr="[ \r\n\t]",xr=`(\\\\[a-zA-Z@]+)${yr}*`,wr="[̀-ͯ]",kr=new RegExp(`${wr}+$`),vr=`(${yr}+)|\\\\(\n|[ \r\t]+\n?)[ \r\t]*|([!-\\[\\]-‧‪-퟿豈-￿]${wr}*|[\ud800-\udbff][\udc00-\udfff]${wr}*|\\\\verb\\*([^]).*?\\4|\\\\verb([^*a-zA-Z]).*?\\5|${xr}|\\\\[^\ud800-\udfff])`;class Ar{constructor(e,t){this.input=e,this.settings=t,this.tokenRegex=new RegExp(vr,"g"),this.catcodes={"%":14,"~":13}}setCatcode(e,t){this.catcodes[e]=t}lex(){const t=this.input,r=this.tokenRegex.lastIndex;if(r===t.length)return new br("EOF",new fr(this,r,r));const n=this.tokenRegex.exec(t);if(null===n||n.index!==r)throw new e(`Unexpected character: '${t[r]}'`,new br(t[r],new fr(this,r,r+1)));const o=n[6]||n[3]||(n[2]?"\\ ":" ");if(14===this.catcodes[o]){const r=t.indexOf("\n",this.tokenRegex.lastIndex);if(-1===r){if(this.tokenRegex.lastIndex=t.length,this.settings.strict)throw new e("% comment has no terminating newline; LaTeX would fail because of commenting the end of math mode")}else this.tokenRegex.lastIndex=r+1;return this.lex()}return new br(o,new fr(this,r,this.tokenRegex.lastIndex))}}class Nr{constructor(e={},t={}){this.current=t,this.builtins=e,this.undefStack=[]}beginGroup(){this.undefStack.push({})}endGroup(){if(0===this.undefStack.length)throw new e("Unbalanced namespace destruction: attempt to pop global namespace; please report this as a bug");const t=this.undefStack.pop();for(const e in t)Object.prototype.hasOwnProperty.call(t,e)&&(void 0===t[e]?delete this.current[e]:this.current[e]=t[e])}has(e){return Object.prototype.hasOwnProperty.call(this.current,e)||Object.prototype.hasOwnProperty.call(this.builtins,e)}get(e){return Object.prototype.hasOwnProperty.call(this.current,e)?this.current[e]:this.builtins[e]}set(e,t,r=!1){if(r){for(let t=0;t0&&(this.undefStack[this.undefStack.length-1][e]=t)}else{const t=this.undefStack[this.undefStack.length-1];t&&!Object.prototype.hasOwnProperty.call(t,e)&&(t[e]=this.current[e])}this.current[e]=t}}const Tr=Dt;Pt("\\noexpand",(function(e){const t=e.popToken();return e.isExpandable(t.text)&&(t.noexpand=!0,t.treatAsRelax=!0),{tokens:[t],numArgs:0}})),Pt("\\expandafter",(function(e){const t=e.popToken();return e.expandOnce(!0),{tokens:[t],numArgs:0}})),Pt("\\@firstoftwo",(function(e){return{tokens:e.consumeArgs(2)[0],numArgs:0}})),Pt("\\@secondoftwo",(function(e){return{tokens:e.consumeArgs(2)[1],numArgs:0}})),Pt("\\@ifnextchar",(function(e){const t=e.consumeArgs(3);e.consumeSpaces();const r=e.future();return 1===t[0].length&&t[0][0].text===r.text?{tokens:t[1],numArgs:0}:{tokens:t[2],numArgs:0}})),Pt("\\@ifstar","\\@ifnextchar *{\\@firstoftwo{#1}}"),Pt("\\TextOrMath",(function(e){const t=e.consumeArgs(2);return"text"===e.mode?{tokens:t[0],numArgs:0}:{tokens:t[1],numArgs:0}}));const qr={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,a:10,A:10,b:11,B:11,c:12,C:12,d:13,D:13,e:14,E:14,f:15,F:15},Sr=e=>{const t=e.future().text;return"EOF"===t?[null,""]:[qr[t.charAt(0)],t]},Or=(e,t,r)=>{for(let n=1;n=0;e--){const o=t[e].loc.start;o>n&&(r+=" ",n=o),r+=t[e].text,n+=t[e].text.length}return r}Pt("\\char",(function(t){let r,n=t.popToken(),o="";if("'"===n.text)r=8,n=t.popToken();else if('"'===n.text)r=16,n=t.popToken();else if("`"===n.text)if(n=t.popToken(),"\\"===n.text[0])o=n.text.charCodeAt(1);else{if("EOF"===n.text)throw new e("\\char` missing argument");o=n.text.charCodeAt(0)}else r=10;if(r){let s,a=n.text;if(o=qr[a.charAt(0)],null==o||o>=r)throw new e(`Invalid base-${r} digit ${n.text}`);for(o=Or(o,a,r),[s,a]=Sr(t);null!=s&&s":"\\dotsb","-":"\\dotsb","*":"\\dotsb",":":"\\dotsb","\\DOTSB":"\\dotsb","\\coprod":"\\dotsb","\\bigvee":"\\dotsb","\\bigwedge":"\\dotsb","\\biguplus":"\\dotsb","\\bigcap":"\\dotsb","\\bigcup":"\\dotsb","\\prod":"\\dotsb","\\sum":"\\dotsb","\\bigotimes":"\\dotsb","\\bigoplus":"\\dotsb","\\bigodot":"\\dotsb","\\bigsqcap":"\\dotsb","\\bigsqcup":"\\dotsb","\\bigtimes":"\\dotsb","\\And":"\\dotsb","\\longrightarrow":"\\dotsb","\\Longrightarrow":"\\dotsb","\\longleftarrow":"\\dotsb","\\Longleftarrow":"\\dotsb","\\longleftrightarrow":"\\dotsb","\\Longleftrightarrow":"\\dotsb","\\mapsto":"\\dotsb","\\longmapsto":"\\dotsb","\\hookrightarrow":"\\dotsb","\\doteq":"\\dotsb","\\mathbin":"\\dotsb","\\mathrel":"\\dotsb","\\relbar":"\\dotsb","\\Relbar":"\\dotsb","\\xrightarrow":"\\dotsb","\\xleftarrow":"\\dotsb","\\DOTSI":"\\dotsi","\\int":"\\dotsi","\\oint":"\\dotsi","\\iint":"\\dotsi","\\iiint":"\\dotsi","\\iiiint":"\\dotsi","\\idotsint":"\\dotsi","\\DOTSX":"\\dotsx"};Pt("\\dots",(function(e){let t="\\dotso";const r=e.expandAfterFuture().text;return r in Mr?t=Mr[r]:("\\not"===r.slice(0,4)||r in E.math&&["bin","rel"].includes(E.math[r].group))&&(t="\\dotsb"),t}));const Cr={")":!0,"]":!0,"\\rbrack":!0,"\\}":!0,"\\rbrace":!0,"\\rangle":!0,"\\rceil":!0,"\\rfloor":!0,"\\rgroup":!0,"\\rmoustache":!0,"\\right":!0,"\\bigr":!0,"\\biggr":!0,"\\Bigr":!0,"\\Biggr":!0,$:!0,";":!0,".":!0,",":!0};Pt("\\dotso",(function(e){return e.future().text in Cr?"\\ldots\\,":"\\ldots"})),Pt("\\dotsc",(function(e){const t=e.future().text;return t in Cr&&","!==t?"\\ldots\\,":"\\ldots"})),Pt("\\cdots",(function(e){return e.future().text in Cr?"\\@cdots\\,":"\\@cdots"})),Pt("\\dotsb","\\cdots"),Pt("\\dotsm","\\cdots"),Pt("\\dotsi","\\!\\cdots"),Pt("\\idotsint","\\dotsi"),Pt("\\dotsx","\\ldots\\,"),Pt("\\DOTSI","\\relax"),Pt("\\DOTSB","\\relax"),Pt("\\DOTSX","\\relax"),Pt("\\tmspace","\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax"),Pt("\\,","{\\tmspace+{3mu}{.1667em}}"),Pt("\\thinspace","\\,"),Pt("\\>","\\mskip{4mu}"),Pt("\\:","{\\tmspace+{4mu}{.2222em}}"),Pt("\\medspace","\\:"),Pt("\\;","{\\tmspace+{5mu}{.2777em}}"),Pt("\\thickspace","\\;"),Pt("\\!","{\\tmspace-{3mu}{.1667em}}"),Pt("\\negthinspace","\\!"),Pt("\\negmedspace","{\\tmspace-{4mu}{.2222em}}"),Pt("\\negthickspace","{\\tmspace-{5mu}{.277em}}"),Pt("\\enspace","\\kern.5em "),Pt("\\enskip","\\hskip.5em\\relax"),Pt("\\quad","\\hskip1em\\relax"),Pt("\\qquad","\\hskip2em\\relax"),Pt("\\AA","\\TextOrMath{\\Angstrom}{\\mathring{A}}\\relax"),Pt("\\tag","\\@ifstar\\tag@literal\\tag@paren"),Pt("\\tag@paren","\\tag@literal{({#1})}"),Pt("\\tag@literal",(t=>{if(t.macros.get("\\df@tag"))throw new e("Multiple \\tag");return"\\def\\df@tag{\\text{#1}}"})),Pt("\\bmod","\\mathbin{\\text{mod}}"),Pt("\\pod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)"),Pt("\\pmod","\\pod{{\\rm mod}\\mkern6mu#1}"),Pt("\\mod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}{\\rm mod}\\,\\,#1"),Pt("\\newline","\\\\\\relax"),Pt("\\TeX","\\textrm{T}\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125em\\textrm{X}"),Pt("\\LaTeX","\\textrm{L}\\kern-.35em\\raisebox{0.2em}{\\scriptstyle A}\\kern-.15em\\TeX"),Pt("\\Temml","\\textrm{T}\\kern-0.2em\\lower{0.2em}{\\textrm{E}}\\kern-0.08em{\\textrm{M}\\kern-0.08em\\raise{0.2em}\\textrm{M}\\kern-0.08em\\textrm{L}}"),Pt("\\hspace","\\@ifstar\\@hspacer\\@hspace"),Pt("\\@hspace","\\hskip #1\\relax"),Pt("\\@hspacer","\\rule{0pt}{0pt}\\hskip #1\\relax"),Pt("\\colon",'\\mathpunct{\\char"3a}'),Pt("\\prescript","\\pres@cript{_{#1}^{#2}}{}{#3}"),Pt("\\ordinarycolon",'\\char"3a'),Pt("\\vcentcolon","\\mathrel{\\raisebox{0.035em}{\\ordinarycolon}}"),Pt("\\coloneq",'\\mathrel{\\raisebox{0.035em}{\\ordinarycolon}\\char"2212}'),Pt("\\Coloneq",'\\mathrel{\\char"2237\\char"2212}'),Pt("\\Eqqcolon",'\\mathrel{\\char"3d\\char"2237}'),Pt("\\Eqcolon",'\\mathrel{\\char"2212\\char"2237}'),Pt("\\colonapprox",'\\mathrel{\\raisebox{0.035em}{\\ordinarycolon}\\char"2248}'),Pt("\\Colonapprox",'\\mathrel{\\char"2237\\char"2248}'),Pt("\\colonsim",'\\mathrel{\\raisebox{0.035em}{\\ordinarycolon}\\char"223c}'),Pt("\\Colonsim",'\\mathrel{\\raisebox{0.035em}{\\ordinarycolon}\\char"223c}'),Pt("\\ratio","\\vcentcolon"),Pt("\\coloncolon","\\dblcolon"),Pt("\\colonequals","\\coloneqq"),Pt("\\coloncolonequals","\\Coloneqq"),Pt("\\equalscolon","\\eqqcolon"),Pt("\\equalscoloncolon","\\Eqqcolon"),Pt("\\colonminus","\\coloneq"),Pt("\\coloncolonminus","\\Coloneq"),Pt("\\minuscolon","\\eqcolon"),Pt("\\minuscoloncolon","\\Eqcolon"),Pt("\\coloncolonapprox","\\Colonapprox"),Pt("\\coloncolonsim","\\Colonsim"),Pt("\\notni","\\mathrel{\\char`∌}"),Pt("\\limsup","\\DOTSB\\operatorname*{lim\\,sup}"),Pt("\\liminf","\\DOTSB\\operatorname*{lim\\,inf}"),Pt("\\injlim","\\DOTSB\\operatorname*{inj\\,lim}"),Pt("\\projlim","\\DOTSB\\operatorname*{proj\\,lim}"),Pt("\\varlimsup","\\DOTSB\\operatorname*{\\overline{\\text{lim}}}"),Pt("\\varliminf","\\DOTSB\\operatorname*{\\underline{\\text{lim}}}"),Pt("\\varinjlim","\\DOTSB\\operatorname*{\\underrightarrow{\\text{lim}}}"),Pt("\\varprojlim","\\DOTSB\\operatorname*{\\underleftarrow{\\text{lim}}}"),Pt("\\centerdot","{\\medspace\\rule{0.167em}{0.189em}\\medspace}"),Pt("\\argmin","\\DOTSB\\operatorname*{arg\\,min}"),Pt("\\argmax","\\DOTSB\\operatorname*{arg\\,max}"),Pt("\\plim","\\DOTSB\\operatorname*{plim}"),Pt("\\leftmodels","\\mathop{\\reflectbox{$\\models$}}"),Pt("\\bra","\\mathinner{\\langle{#1}|}"),Pt("\\ket","\\mathinner{|{#1}\\rangle}"),Pt("\\braket","\\mathinner{\\langle{#1}\\rangle}"),Pt("\\Bra","\\left\\langle#1\\right|"),Pt("\\Ket","\\left|#1\\right\\rangle");const zr=(e,t)=>{const r=`}\\,\\middle${"|"===t[0]?"\\vert":"\\Vert"}\\,{`;return e.slice(0,t.index)+r+e.slice(t.index+t[0].length)};Pt("\\Braket",(function(e){let t=Br(e);const r=/\|\||\||\\\|/g;let n;for(;null!==(n=r.exec(t));)t=zr(t,n);return"\\left\\langle{"+t+"}\\right\\rangle"})),Pt("\\Set",(function(e){let t=Br(e);const r=/\|\||\||\\\|/.exec(t);return r&&(t=zr(t,r)),"\\left\\{\\:{"+t+"}\\:\\right\\}"})),Pt("\\set",(function(e){return"\\{{"+Br(e).replace(/\|/,"}\\mid{")+"}\\}"})),Pt("\\angln","{\\angl n}"),Pt("\\odv","\\@ifstar\\odv@next\\odv@numerator"),Pt("\\odv@numerator","\\frac{\\mathrm{d}#1}{\\mathrm{d}#2}"),Pt("\\odv@next","\\frac{\\mathrm{d}}{\\mathrm{d}#2}#1"),Pt("\\pdv","\\@ifstar\\pdv@next\\pdv@numerator");const Er=e=>{const t=e[0][0].text,r=(e=>{let t="";for(let r=e.length-1;r>-1;r--)t+=e[r].text;return t})(e[1]).split(","),n=String(r.length),o="1"===n?"\\partial":`\\partial^${n}`;let s="";return r.map((e=>{s+="\\partial "+e.trim()+"\\,"})),[t,o,s.replace(/\\,$/,"")]};Pt("\\pdv@numerator",(function(e){const[t,r,n]=Er(e.consumeArgs(2));return`\\frac{${r} ${t}}{${n}}`})),Pt("\\pdv@next",(function(e){const[t,r,n]=Er(e.consumeArgs(2));return`\\frac{${r}}{${n}} ${t}`})),Pt("\\upalpha","\\up@greek{\\alpha}"),Pt("\\upbeta","\\up@greek{\\beta}"),Pt("\\upgamma","\\up@greek{\\gamma}"),Pt("\\updelta","\\up@greek{\\delta}"),Pt("\\upepsilon","\\up@greek{\\epsilon}"),Pt("\\upzeta","\\up@greek{\\zeta}"),Pt("\\upeta","\\up@greek{\\eta}"),Pt("\\uptheta","\\up@greek{\\theta}"),Pt("\\upiota","\\up@greek{\\iota}"),Pt("\\upkappa","\\up@greek{\\kappa}"),Pt("\\uplambda","\\up@greek{\\lambda}"),Pt("\\upmu","\\up@greek{\\mu}"),Pt("\\upnu","\\up@greek{\\nu}"),Pt("\\upxi","\\up@greek{\\xi}"),Pt("\\upomicron","\\up@greek{\\omicron}"),Pt("\\uppi","\\up@greek{\\pi}"),Pt("\\upalpha","\\up@greek{\\alpha}"),Pt("\\uprho","\\up@greek{\\rho}"),Pt("\\upsigma","\\up@greek{\\sigma}"),Pt("\\uptau","\\up@greek{\\tau}"),Pt("\\upupsilon","\\up@greek{\\upsilon}"),Pt("\\upphi","\\up@greek{\\phi}"),Pt("\\upchi","\\up@greek{\\chi}"),Pt("\\uppsi","\\up@greek{\\psi}"),Pt("\\upomega","\\up@greek{\\omega}"),Pt("\\invamp",'\\mathbin{\\char"214b}'),Pt("\\parr",'\\mathbin{\\char"214b}'),Pt("\\with",'\\mathbin{\\char"26}'),Pt("\\multimapinv",'\\mathrel{\\char"27dc}'),Pt("\\multimapboth",'\\mathrel{\\char"29df}'),Pt("\\scoh",'{\\mkern5mu\\char"2322\\mkern5mu}'),Pt("\\sincoh",'{\\mkern5mu\\char"2323\\mkern5mu}'),Pt("\\coh",'{\\mkern5mu\\rule{}{0.7em}\\mathrlap{\\smash{\\raise2mu{\\char"2322}}}\n{\\smash{\\lower4mu{\\char"2323}}}\\mkern5mu}'),Pt("\\incoh",'{\\mkern5mu\\rule{}{0.7em}\\mathrlap{\\smash{\\raise2mu{\\char"2323}}}\n{\\smash{\\lower4mu{\\char"2322}}}\\mkern5mu}'),Pt("\\standardstate","\\text{\\tiny\\char`⦵}");const Ir={"^":!0,_:!0,"\\limits":!0,"\\nolimits":!0};class $r{constructor(e,t,r){this.settings=t,this.expansionCount=0,this.feed(e),this.macros=new Nr(Tr,t.macros),this.mode=r,this.stack=[]}feed(e){this.lexer=new Ar(e,this.settings)}switchMode(e){this.mode=e}beginGroup(){this.macros.beginGroup()}endGroup(){this.macros.endGroup()}future(){return 0===this.stack.length&&this.pushToken(this.lexer.lex()),this.stack[this.stack.length-1]}popToken(){return this.future(),this.stack.pop()}pushToken(e){this.stack.push(e)}pushTokens(e){this.stack.push(...e)}scanArgument(e){let t,r,n;if(e){if(this.consumeSpaces(),"["!==this.future().text)return null;t=this.popToken(),({tokens:n,end:r}=this.consumeArg(["]"]))}else({tokens:n,start:t,end:r}=this.consumeArg());return this.pushToken(new br("EOF",r.loc)),this.pushTokens(n),t.range(r,"")}consumeSpaces(){for(;;){if(" "!==this.future().text)break;this.stack.pop()}}consumeArg(t){const r=[],n=t&&t.length>0;n||this.consumeSpaces();const o=this.future();let s,a=0,i=0;do{if(s=this.popToken(),r.push(s),"{"===s.text)++a;else if("}"===s.text){if(--a,-1===a)throw new e("Extra }",s)}else if("EOF"===s.text)throw new e("Unexpected end of input in a macro argument, expected '"+(t&&n?t[i]:"}")+"'",s);if(t&&n)if((0===a||1===a&&"{"===t[i])&&s.text===t[i]){if(++i,i===t.length){r.splice(-i,i);break}}else i=0}while(0!==a||n);return"{"===o.text&&"}"===r[r.length-1].text&&(r.pop(),r.shift()),r.reverse(),{tokens:r,start:o,end:s}}consumeArgs(t,r){if(r){if(r.length!==t+1)throw new e("The length of delimiters doesn't match the number of args!");const n=r[0];for(let t=0;tthis.settings.maxExpand)throw new e("Too many expansions: infinite loop or need to increase maxExpand setting");let s=o.tokens;const a=this.consumeArgs(o.numArgs,o.delimiters);if(o.numArgs){s=s.slice();for(let t=s.length-1;t>=0;--t){let r=s[t];if("#"===r.text){if(0===t)throw new e("Incomplete placeholder at end of macro body",r);if(r=s[--t],"#"===r.text)s.splice(t+1,1);else{if(!/^[1-9]$/.test(r.text))throw new e("Not a valid argument number",r);s.splice(t,2,...a[+r.text-1])}}}}return this.pushTokens(s),s.length}expandAfterFuture(){return this.expandOnce(),this.future()}expandNextToken(){for(;;)if(!1===this.expandOnce()){const e=this.stack.pop();return e.treatAsRelax&&(e.text="\\relax"),e}throw new Error}expandMacro(e){return this.macros.has(e)?this.expandTokens([new br(e)]):void 0}expandTokens(e){const t=[],r=this.stack.length;for(this.pushTokens(e);this.stack.length>r;)if(!1===this.expandOnce(!0)){const e=this.stack.pop();e.treatAsRelax&&(e.noexpand=!1,e.treatAsRelax=!1),t.push(e)}return t}expandMacroAsText(e){const t=this.expandMacro(e);return t?t.map((e=>e.text)).join(""):t}_getExpansion(e){const t=this.macros.get(e);if(null==t)return t;if(1===e.length){const t=this.lexer.catcodes[e];if(null!=t&&13!==t)return}const r="function"==typeof t?t(this):t;if("string"==typeof r){let e=0;if(-1!==r.indexOf("#")){const t=r.replace(/##/g,"");for(;-1!==t.indexOf("#"+(e+1));)++e}const t=new Ar(r,this.settings),n=[];let o=t.lex();for(;"EOF"!==o.text;)n.push(o),o=t.lex();n.reverse();return{tokens:n,numArgs:e}}return r}isDefined(e){return this.macros.has(e)||Object.prototype.hasOwnProperty.call(gr,e)||Object.prototype.hasOwnProperty.call(E.math,e)||Object.prototype.hasOwnProperty.call(E.text,e)||Object.prototype.hasOwnProperty.call(Ir,e)}isExpandable(e){const t=this.macros.get(e);return null!=t?"string"==typeof t||"function"==typeof t||!t.unexpandable:Object.prototype.hasOwnProperty.call(gr,e)&&!gr[e].primitive}}const Lr=/^[₊₋₌₍₎₀₁₂₃₄₅₆₇₈₉ₐₑₕᵢⱼₖₗₘₙₒₚᵣₛₜᵤᵥₓᵦᵧᵨᵩᵪ]/,Fr=Object.freeze({"₊":"+","₋":"-","₌":"=","₍":"(","₎":")","₀":"0","₁":"1","₂":"2","₃":"3","₄":"4","₅":"5","₆":"6","₇":"7","₈":"8","₉":"9","ₐ":"a","ₑ":"e","ₕ":"h","ᵢ":"i","ⱼ":"j","ₖ":"k","ₗ":"l","ₘ":"m","ₙ":"n","ₒ":"o","ₚ":"p","ᵣ":"r","ₛ":"s","ₜ":"t","ᵤ":"u","ᵥ":"v","ₓ":"x","ᵦ":"β","ᵧ":"γ","ᵨ":"ρ","ᵩ":"ϕ","ᵪ":"χ","⁺":"+","⁻":"-","⁼":"=","⁽":"(","⁾":")","⁰":"0","¹":"1","²":"2","³":"3","⁴":"4","⁵":"5","⁶":"6","⁷":"7","⁸":"8","⁹":"9","ᴬ":"A","ᴮ":"B","ᴰ":"D","ᴱ":"E","ᴳ":"G","ᴴ":"H","ᴵ":"I","ᴶ":"J","ᴷ":"K","ᴸ":"L","ᴹ":"M","ᴺ":"N","ᴼ":"O","ᴾ":"P","ᴿ":"R","ᵀ":"T","ᵁ":"U","ⱽ":"V","ᵂ":"W","ᵃ":"a","ᵇ":"b","ᶜ":"c","ᵈ":"d","ᵉ":"e","ᶠ":"f","ᵍ":"g","ʰ":"h","ⁱ":"i","ʲ":"j","ᵏ":"k","ˡ":"l","ᵐ":"m","ⁿ":"n","ᵒ":"o","ᵖ":"p","ʳ":"r","ˢ":"s","ᵗ":"t","ᵘ":"u","ᵛ":"v","ʷ":"w","ˣ":"x","ʸ":"y","ᶻ":"z","ᵝ":"β","ᵞ":"γ","ᵟ":"δ","ᵠ":"ϕ","ᵡ":"χ","ᶿ":"θ"}),Gr=Object.freeze({"𝒜":"A","ℬ":"B","𝒞":"C","𝒟":"D","ℰ":"E","ℱ":"F","𝒢":"G","ℋ":"H","ℐ":"I","𝒥":"J","𝒦":"K","ℒ":"L","ℳ":"M","𝒩":"N","𝒪":"O","𝒫":"P","𝒬":"Q","ℛ":"R","𝒮":"S","𝒯":"T","𝒰":"U","𝒱":"V","𝒲":"W","𝒳":"X","𝒴":"Y","𝒵":"Z"});var Dr={"́":{text:"\\'",math:"\\acute"},"̀":{text:"\\`",math:"\\grave"},"̈":{text:'\\"',math:"\\ddot"},"̃":{text:"\\~",math:"\\tilde"},"̄":{text:"\\=",math:"\\bar"},"̆":{text:"\\u",math:"\\breve"},"̌":{text:"\\v",math:"\\check"},"̂":{text:"\\^",math:"\\hat"},"̇":{text:"\\.",math:"\\dot"},"̊":{text:"\\r",math:"\\mathring"},"̋":{text:"\\H"},"̧":{text:"\\c"}},Pr={"á":"á","à":"à","ä":"ä","ǟ":"ǟ","ã":"ã","ā":"ā","ă":"ă","ắ":"ắ","ằ":"ằ","ẵ":"ẵ","ǎ":"ǎ","â":"â","ấ":"ấ","ầ":"ầ","ẫ":"ẫ","ȧ":"ȧ","ǡ":"ǡ","å":"å","ǻ":"ǻ","ḃ":"ḃ","ć":"ć","č":"č","ĉ":"ĉ","ċ":"ċ","ď":"ď","ḋ":"ḋ","é":"é","è":"è","ë":"ë","ẽ":"ẽ","ē":"ē","ḗ":"ḗ","ḕ":"ḕ","ĕ":"ĕ","ě":"ě","ê":"ê","ế":"ế","ề":"ề","ễ":"ễ","ė":"ė","ḟ":"ḟ","ǵ":"ǵ","ḡ":"ḡ","ğ":"ğ","ǧ":"ǧ","ĝ":"ĝ","ġ":"ġ","ḧ":"ḧ","ȟ":"ȟ","ĥ":"ĥ","ḣ":"ḣ","í":"í","ì":"ì","ï":"ï","ḯ":"ḯ","ĩ":"ĩ","ī":"ī","ĭ":"ĭ","ǐ":"ǐ","î":"î","ǰ":"ǰ","ĵ":"ĵ","ḱ":"ḱ","ǩ":"ǩ","ĺ":"ĺ","ľ":"ľ","ḿ":"ḿ","ṁ":"ṁ","ń":"ń","ǹ":"ǹ","ñ":"ñ","ň":"ň","ṅ":"ṅ","ó":"ó","ò":"ò","ö":"ö","ȫ":"ȫ","õ":"õ","ṍ":"ṍ","ṏ":"ṏ","ȭ":"ȭ","ō":"ō","ṓ":"ṓ","ṑ":"ṑ","ŏ":"ŏ","ǒ":"ǒ","ô":"ô","ố":"ố","ồ":"ồ","ỗ":"ỗ","ȯ":"ȯ","ȱ":"ȱ","ő":"ő","ṕ":"ṕ","ṗ":"ṗ","ŕ":"ŕ","ř":"ř","ṙ":"ṙ","ś":"ś","ṥ":"ṥ","š":"š","ṧ":"ṧ","ŝ":"ŝ","ṡ":"ṡ","ẗ":"ẗ","ť":"ť","ṫ":"ṫ","ú":"ú","ù":"ù","ü":"ü","ǘ":"ǘ","ǜ":"ǜ","ǖ":"ǖ","ǚ":"ǚ","ũ":"ũ","ṹ":"ṹ","ū":"ū","ṻ":"ṻ","ŭ":"ŭ","ǔ":"ǔ","û":"û","ů":"ů","ű":"ű","ṽ":"ṽ","ẃ":"ẃ","ẁ":"ẁ","ẅ":"ẅ","ŵ":"ŵ","ẇ":"ẇ","ẘ":"ẘ","ẍ":"ẍ","ẋ":"ẋ","ý":"ý","ỳ":"ỳ","ÿ":"ÿ","ỹ":"ỹ","ȳ":"ȳ","ŷ":"ŷ","ẏ":"ẏ","ẙ":"ẙ","ź":"ź","ž":"ž","ẑ":"ẑ","ż":"ż","Á":"Á","À":"À","Ä":"Ä","Ǟ":"Ǟ","Ã":"Ã","Ā":"Ā","Ă":"Ă","Ắ":"Ắ","Ằ":"Ằ","Ẵ":"Ẵ","Ǎ":"Ǎ","Â":"Â","Ấ":"Ấ","Ầ":"Ầ","Ẫ":"Ẫ","Ȧ":"Ȧ","Ǡ":"Ǡ","Å":"Å","Ǻ":"Ǻ","Ḃ":"Ḃ","Ć":"Ć","Č":"Č","Ĉ":"Ĉ","Ċ":"Ċ","Ď":"Ď","Ḋ":"Ḋ","É":"É","È":"È","Ë":"Ë","Ẽ":"Ẽ","Ē":"Ē","Ḗ":"Ḗ","Ḕ":"Ḕ","Ĕ":"Ĕ","Ě":"Ě","Ê":"Ê","Ế":"Ế","Ề":"Ề","Ễ":"Ễ","Ė":"Ė","Ḟ":"Ḟ","Ǵ":"Ǵ","Ḡ":"Ḡ","Ğ":"Ğ","Ǧ":"Ǧ","Ĝ":"Ĝ","Ġ":"Ġ","Ḧ":"Ḧ","Ȟ":"Ȟ","Ĥ":"Ĥ","Ḣ":"Ḣ","Í":"Í","Ì":"Ì","Ï":"Ï","Ḯ":"Ḯ","Ĩ":"Ĩ","Ī":"Ī","Ĭ":"Ĭ","Ǐ":"Ǐ","Î":"Î","İ":"İ","Ĵ":"Ĵ","Ḱ":"Ḱ","Ǩ":"Ǩ","Ĺ":"Ĺ","Ľ":"Ľ","Ḿ":"Ḿ","Ṁ":"Ṁ","Ń":"Ń","Ǹ":"Ǹ","Ñ":"Ñ","Ň":"Ň","Ṅ":"Ṅ","Ó":"Ó","Ò":"Ò","Ö":"Ö","Ȫ":"Ȫ","Õ":"Õ","Ṍ":"Ṍ","Ṏ":"Ṏ","Ȭ":"Ȭ","Ō":"Ō","Ṓ":"Ṓ","Ṑ":"Ṑ","Ŏ":"Ŏ","Ǒ":"Ǒ","Ô":"Ô","Ố":"Ố","Ồ":"Ồ","Ỗ":"Ỗ","Ȯ":"Ȯ","Ȱ":"Ȱ","Ő":"Ő","Ṕ":"Ṕ","Ṗ":"Ṗ","Ŕ":"Ŕ","Ř":"Ř","Ṙ":"Ṙ","Ś":"Ś","Ṥ":"Ṥ","Š":"Š","Ṧ":"Ṧ","Ŝ":"Ŝ","Ṡ":"Ṡ","Ť":"Ť","Ṫ":"Ṫ","Ú":"Ú","Ù":"Ù","Ü":"Ü","Ǘ":"Ǘ","Ǜ":"Ǜ","Ǖ":"Ǖ","Ǚ":"Ǚ","Ũ":"Ũ","Ṹ":"Ṹ","Ū":"Ū","Ṻ":"Ṻ","Ŭ":"Ŭ","Ǔ":"Ǔ","Û":"Û","Ů":"Ů","Ű":"Ű","Ṽ":"Ṽ","Ẃ":"Ẃ","Ẁ":"Ẁ","Ẅ":"Ẅ","Ŵ":"Ŵ","Ẇ":"Ẇ","Ẍ":"Ẍ","Ẋ":"Ẋ","Ý":"Ý","Ỳ":"Ỳ","Ÿ":"Ÿ","Ỹ":"Ỹ","Ȳ":"Ȳ","Ŷ":"Ŷ","Ẏ":"Ẏ","Ź":"Ź","Ž":"Ž","Ẑ":"Ẑ","Ż":"Ż","ά":"ά","ὰ":"ὰ","ᾱ":"ᾱ","ᾰ":"ᾰ","έ":"έ","ὲ":"ὲ","ή":"ή","ὴ":"ὴ","ί":"ί","ὶ":"ὶ","ϊ":"ϊ","ΐ":"ΐ","ῒ":"ῒ","ῑ":"ῑ","ῐ":"ῐ","ό":"ό","ὸ":"ὸ","ύ":"ύ","ὺ":"ὺ","ϋ":"ϋ","ΰ":"ΰ","ῢ":"ῢ","ῡ":"ῡ","ῠ":"ῠ","ώ":"ώ","ὼ":"ὼ","Ύ":"Ύ","Ὺ":"Ὺ","Ϋ":"Ϋ","Ῡ":"Ῡ","Ῠ":"Ῠ","Ώ":"Ώ","Ὼ":"Ὼ"};const Rr=["bin","op","open","punct","rel"];class jr{constructor(e,t,r=!1){this.mode="math",this.gullet=new $r(e,t,this.mode),this.settings=t,this.isPreamble=r,this.leftrightDepth=0,this.prevAtomType=""}expect(t,r=!0){if(this.fetch().text!==t)throw new e(`Expected '${t}', got '${this.fetch().text}'`,this.fetch());r&&this.consume()}consume(){this.nextToken=null}fetch(){return null==this.nextToken&&(this.nextToken=this.gullet.expandNextToken()),this.nextToken}switchMode(e){this.mode=e,this.gullet.switchMode(e)}parse(){this.gullet.beginGroup(),this.settings.colorIsTextColor&&this.gullet.macros.set("\\color","\\textcolor");const e=this.parseExpression(!1);if(this.expect("EOF"),this.isPreamble){const e=Object.create(null);return Object.entries(this.gullet.macros.current).forEach((([t,r])=>{e[t]=r})),this.gullet.endGroup(),e}const t=this.gullet.macros.get("\\df@tag");return this.gullet.endGroup(),t&&(this.gullet.macros.current["\\df@tag"]=t),e}static get endOfExpression(){return["}","\\endgroup","\\end","\\right","\\endtoggle","&"]}subparse(e){const t=this.nextToken;this.consume(),this.gullet.pushToken(new br("}")),this.gullet.pushTokens(e);const r=this.parseExpression(!1);return this.expect("}"),this.nextToken=t,r}parseExpression(e,t,r){const n=[];for(;;){"math"===this.mode&&this.consumeSpaces();const o=this.fetch();if(-1!==jr.endOfExpression.indexOf(o.text))break;if(t&&o.text===t)break;if(r&&"\\middle"===o.text)break;if(e&&gr[o.text]&&gr[o.text].infix)break;const s=this.parseAtom(t);if(!s)break;"internal"!==s.type&&(n.push(s),this.prevAtomType="atom"===s.type?s.family:s.type)}return"text"===this.mode&&this.formLigatures(n),this.handleInfixNodes(n)}handleInfixNodes(t){let r,n=-1;for(let o=0;o=128))return null;if(this.settings.strict&&"math"===this.mode)throw new e(`Unicode text character "${r[0]}" used in math mode`,t);o={type:"textord",mode:"text",loc:fr.range(t),text:r}}if(this.consume(),n)for(let r=0;r0&&o[0].type&&"array"===o[0].type&&o[0].addEqnNum)&&n.gullet.macros.get("\\df@tag")){if(!r.displayMode)throw new e("\\tag works only in display mode");n.gullet.feed("\\df@tag"),o=[{type:"tag",mode:"text",body:o,tag:n.parse()}]}return o},Hr=[2,2,3,3];class Vr{constructor(e){this.level=e.level,this.color=e.color,this.font=e.font||"",this.fontFamily=e.fontFamily||"",this.fontSize=e.fontSize||1,this.fontWeight=e.fontWeight||"",this.fontShape=e.fontShape||"",this.maxSize=e.maxSize}extend(e){const t={level:this.level,color:this.color,font:this.font,fontFamily:this.fontFamily,fontSize:this.fontSize,fontWeight:this.fontWeight,fontShape:this.fontShape,maxSize:this.maxSize};for(const r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r]);return new Vr(t)}withLevel(e){return this.extend({level:e})}incrementLevel(){return this.extend({level:Math.min(this.level+1,3)})}inSubOrSup(){return this.extend({level:Hr[this.level]})}withColor(e){return this.extend({color:e})}withFont(e){return this.extend({font:e})}withTextFontFamily(e){return this.extend({fontFamily:e,font:""})}withFontSize(e){return this.extend({fontSize:e})}withTextFontWeight(e){return this.extend({fontWeight:e,font:""})}withTextFontShape(e){return this.extend({fontShape:e,font:""})}getColor(){return this.color}}let _r=function(e,t,r={}){t.textContent="";const n="math"===t.tagName.toLowerCase();n&&(r.wrap="none");const o=Wr(e,r);n||o.children.length>1?(t.textContent="",o.children.forEach((e=>{t.appendChild(e.toNode())}))):t.appendChild(o.toNode())};"undefined"!=typeof document&&"CSS1Compat"!==document.compatMode&&("undefined"!=typeof console&&console.warn("Warning: Temml doesn't work in quirks mode. Make sure your website has a suitable doctype."),_r=function(){throw new e("Temml doesn't work in quirks mode.")});const Wr=function(t,r){const n=new a(r);try{const e=Ur(t,n);return ue(e,t,new Vr({level:n.displayMode?nt:ot,maxSize:n.maxSize}),n)}catch(r){return function(t,r,n){if(n.throwOnError||!(t instanceof e))throw t;const o=new y(["temml-error"],[new x(r+"\n"+t.toString())]);return o.style.color=n.errorColor,o.style.whiteSpace="pre-line",o}(r,t,n)}};return{version:"0.10.24",render:_r,renderToString:function(e,t){return Wr(e,t).toMarkup()},postProcess:function(e){const t={};let r=0;const n=e.getElementsByClassName("tml-tageqn");for(const e of n){const n=e.getElementsByClassName("tml-eqn");n.length>0&&(r+=1,n[0].id="tml-eqn-"+r);const o=e.getElementsByClassName("tml-label");if(0!==o.length)if(n.length>0)t[o[0].id]=String(r);else{const r=e.getElementsByClassName("tml-tag");r.length>0&&(t[o[0].id]=r[0].textContent)}}[...e.getElementsByClassName("tml-ref")].forEach((e=>{let r=t[e.getAttribute("href").slice(1)];-1===e.className.indexOf("tml-eqref")&&(r=r.replace(/^\(/,""),r=r.replace(/\($/,"")),"("!==r.charAt(0)&&(r="("+r),")"!==r.slice(-1)&&(r+=")"),e.textContent=r}))},ParseError:e,definePreamble:function(e,t){const r=new a(t);if(r.macros={},!("string"==typeof e||e instanceof String))throw new TypeError("Temml can only parse string typed expression");const n=new jr(e,r,!0);delete n.gullet.macros.current["\\df@tag"];return n.parse()},__parse:function(e,t){const r=new a(t);return Ur(e,r)},__renderToMathMLTree:Wr,__defineSymbol:I,__defineMacro:Pt}}(); \ No newline at end of file diff --git a/site/assets/texvc.js b/site/assets/texvc.js deleted file mode 100644 index ddd5b1aa..00000000 --- a/site/assets/texvc.js +++ /dev/null @@ -1,61 +0,0 @@ -/* eslint-disable no-undef */ - -////////////////////////////////////////////////////////////////////// -// texvc.sty - -// The texvc package contains macros available in mediawiki pages. -// We omit the functions deprecated at -// https://en.wikipedia.org/wiki/Help:Displaying_a_formula#Deprecated_syntax - -// We also omit texvc's \O, which conflicts with \text{\O} - -temml.__defineMacro("\\darr", "\\downarrow"); -temml.__defineMacro("\\dArr", "\\Downarrow"); -temml.__defineMacro("\\Darr", "\\Downarrow"); -temml.__defineMacro("\\lang", "\\langle"); -temml.__defineMacro("\\rang", "\\rangle"); -temml.__defineMacro("\\uarr", "\\uparrow"); -temml.__defineMacro("\\uArr", "\\Uparrow"); -temml.__defineMacro("\\Uarr", "\\Uparrow"); -temml.__defineMacro("\\N", "\\mathbb{N}"); -temml.__defineMacro("\\R", "\\mathbb{R}"); -temml.__defineMacro("\\Z", "\\mathbb{Z}"); -temml.__defineMacro("\\alef", "\\aleph"); -temml.__defineMacro("\\alefsym", "\\aleph"); -temml.__defineMacro("\\bull", "\\bullet"); -temml.__defineMacro("\\clubs", "\\clubsuit"); -temml.__defineMacro("\\cnums", "\\mathbb{C}"); -temml.__defineMacro("\\Complex", "\\mathbb{C}"); -temml.__defineMacro("\\Dagger", "\\ddagger"); -temml.__defineMacro("\\diamonds", "\\diamondsuit"); -temml.__defineMacro("\\empty", "\\emptyset"); -temml.__defineMacro("\\exist", "\\exists"); -temml.__defineMacro("\\harr", "\\leftrightarrow"); -temml.__defineMacro("\\hArr", "\\Leftrightarrow"); -temml.__defineMacro("\\Harr", "\\Leftrightarrow"); -temml.__defineMacro("\\hearts", "\\heartsuit"); -temml.__defineMacro("\\image", "\\Im"); -temml.__defineMacro("\\infin", "\\infty"); -temml.__defineMacro("\\isin", "\\in"); -temml.__defineMacro("\\larr", "\\leftarrow"); -temml.__defineMacro("\\lArr", "\\Leftarrow"); -temml.__defineMacro("\\Larr", "\\Leftarrow"); -temml.__defineMacro("\\lrarr", "\\leftrightarrow"); -temml.__defineMacro("\\lrArr", "\\Leftrightarrow"); -temml.__defineMacro("\\Lrarr", "\\Leftrightarrow"); -temml.__defineMacro("\\natnums", "\\mathbb{N}"); -temml.__defineMacro("\\plusmn", "\\pm"); -temml.__defineMacro("\\rarr", "\\rightarrow"); -temml.__defineMacro("\\rArr", "\\Rightarrow"); -temml.__defineMacro("\\Rarr", "\\Rightarrow"); -temml.__defineMacro("\\real", "\\Re"); -temml.__defineMacro("\\reals", "\\mathbb{R}"); -temml.__defineMacro("\\Reals", "\\mathbb{R}"); -temml.__defineMacro("\\sdot", "\\cdot"); -temml.__defineMacro("\\sect", "\\S"); -temml.__defineMacro("\\spades", "\\spadesuit"); -temml.__defineMacro("\\sub", "\\subset"); -temml.__defineMacro("\\sube", "\\subseteq"); -temml.__defineMacro("\\supe", "\\supseteq"); -temml.__defineMacro("\\thetasym", "\\vartheta"); -temml.__defineMacro("\\weierp", "\\wp"); diff --git a/site/copy-tex.html b/site/copy-tex.html deleted file mode 100644 index 65f3cfdf..00000000 --- a/site/copy-tex.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - Copy-tex test - - - - - - -

lJbSrt+$%-#bDU00kGr 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 diff --git a/.yarn/cache/aproba-npm-2.0.0-8716bcfde6-5615cadcfb.zip b/.yarn/cache/aproba-npm-2.0.0-8716bcfde6-5615cadcfb.zip deleted file mode 100644 index 6b148888c0e20972cb587f2eb48fd710318f250e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4560 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 diff --git a/.yarn/cache/are-we-there-yet-npm-3.0.1-3395b1512f-52590c2486.zip b/.yarn/cache/are-we-there-yet-npm-3.0.1-3395b1512f-52590c2486.zip deleted file mode 100644 index 1f0af5013f6246aeed66d144784d4e88aac647d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6954 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 V|BIFZ0GPk7xnF4Yh~%%Q{{n6oEP4O{ diff --git a/.yarn/cache/brace-expansion-npm-2.0.1-17aa2616f9-a61e7cd2e8.zip b/.yarn/cache/brace-expansion-npm-2.0.1-17aa2616f9-a61e7cd2e8.zip deleted file mode 100644 index 11d5bd0dbce5bfdbd9c169d0989ae4b325389929..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6048 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 VN4rCbfICKx0r)}3Q6Bs_`xkROm`DHs diff --git a/.yarn/cache/callsites-npm-3.1.0-268f989910-072d17b6ab.zip b/.yarn/cache/callsites-npm-3.1.0-268f989910-072d17b6ab.zip deleted file mode 100644 index be6414c547244e4435e9c4ee87314ac586a5023c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3763 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 LcQVBEx2OLHLpM$~ diff --git a/.yarn/cache/chownr-npm-2.0.0-638f1c9c61-c57cf9dd07.zip b/.yarn/cache/chownr-npm-2.0.0-638f1c9c61-c57cf9dd07.zip deleted file mode 100644 index e074b2f4c783d8e59abb7c122c098cd8b4ee8282..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2856 zcmaJ@2{=^i8z0M%HKeRr!&u685kqGlQ}$tuVIomPj3}X@GzOK)q^yx8rpUb` zyDN+(OJv`|wMAL3_J5x1|DETY@0{m(-{1G1=Usk3ODF>)FW}44E$G_!_2v76V`umE zbN6t<__+uAcmya~?rHi3;5Sn@FTWsP|L-33fPG)VZ@C!T_Rs+UoAdyH&>kLUCI(;& z1lSrs;G3qzTQ|SSYh2lTCuLE28`A~MZr;4s}|J5yy9i`G3LJ#g=KrEF{;#Oi`I_xkfp>nQOAcrz_EG3<$9fD4~ox%=|@NG=Vu4I`%RI}oD8~h z&aGw+O6HvFF{oBuEQOEV`w>gBqH{vt=xN^Tx%McwU)#>)a2Zxa)Cb`~r1EV+i z{P2QNnkAZ7-8;SU!e7Ww4!MV-R0R07sD)P@QuE6-qSS!tg3(@D2M{J+sEQ=}_(wJ! zW@2yk78q_zH5rv==eL7qvAJm^Ku$$Nd`|J(_y89%BxIFXo_}H4t!#v4sxlk1nwzRP^_5t<)SFtVG0G5x`m0jScq}7i z2yaYsm3zXaP1UaokC859!m;*vfzK*wC|KtOJ6xV)s4oFv*Rq0C%T>374*IuE!z)e5 zkGjgY)&gz48?DLE7*IEqqSLF^hT>|iRuj&w&5~J)V3fHlk#tSDOjyEz^Un^3D0qzu zhd7Ufq=hV3ZaDq`*KnucagVAHIIHlxO_#BKb){04x9^}plBcPT!TExAo^5VJ6fbXm zmrnopGzUTUA{<3|JLIEktWU=IoGc4%9r2B|Sy_~AgBR+8>+}uYVInD<-@m?pD9w zjfpK*pBWJ5WclLIG;bP-!(rb&o~Z=uxlIA{I`(>fO{#{av!>Mw;9#QJ*r@{ImRb4L zm^0C(sfPXUCD}m+Zk@@}kr*py=Psrjm(S!((iDvcDbtF5QLC_(i{*cr+F&|jJ7~K6 z&r8lB@2Vw6Ch8M_C*`U$LW)W1UN+b~f@5cB%aG9Qfyzq+@~q(7tYenR0Zes~YSPRN z<%20V@uCW6btgH7bI#{nH|j2djUXtFVV^k46b$pBC66sT^CsVLo{-uwQhMoM zOl#@Sn>nJD=D1W1F)^K+bwVMb0$ea-Em(KwU6?`lYNFq4yUk2`RiL0zoZ{Q|HIS@m zYOBM9qrX+PQE2A!``L_scmmi!GhKE4AxtxNYBI7*2dh=-6DnSzO>TteT)u{^xsV*u z7vS2fB?mY2lpj9nK^IaV^~Z?I0BjbP;d5q21hxhIebS{O6;00WP~VLm>J!^z(qUcP z&@P@HJEP9e_bj~0f~v&z@}qoSx~_zU6&K{-X$W?T<;FYR(}4q+XSAZDeJJaktrKD7 zKZbc^Rf~&@M@FvW;{prd(rI`fq`=51E=kkRkeQSHQjOh#GQq-J!ZqB9ws=mCTD&S7A3m)Nt^* z{h?_AV@)oB$9svKTjXq-9zAmxuzRR&zKw~g#dIJEq*dHV2``zmp~tAE%qMEda$adT z=PvY+y=&4*X%Hk%(+SEeBb;FL$E)kme72Grfm6)U$tI-Y%A-D65*$_Rz5=uvZieYc1wR8H{^+E5;_M4dcf3DvEf4Iu; zcKxZtz8(I9cy}wYZ~g!PIpXXd2;X(tk5GO9?Pl;_K)ySb{@Y)C59KGH?}pmlBEO*Q rnExB%-<#$WGTq;Ue{W2b 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 diff --git a/.yarn/cache/color-name-npm-1.1.4-025792b0ea-b044585952.zip b/.yarn/cache/color-name-npm-1.1.4-025792b0ea-b044585952.zip deleted file mode 100644 index ce1ffc4bf31ce028461c892f5094b3821b956c3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3487 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 QcOg4{aHo6ey!id=Kk@(W{Qv*} diff --git a/.yarn/cache/color-support-npm-1.1.3-3be5c53455-9b73568176.zip b/.yarn/cache/color-support-npm-1.1.3-3be5c53455-9b73568176.zip deleted file mode 100644 index 625a79f17799ceda63d96d5f6447dc95c97040aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4890 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 diff --git a/.yarn/cache/commander-npm-2.20.3-d8dcbaa39b-ab8c07884e.zip b/.yarn/cache/commander-npm-2.20.3-d8dcbaa39b-ab8c07884e.zip deleted file mode 100644 index 6a14adf507d90bd2fde8e7e9afb0f81ee892b431..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20978 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 RqXg#%{M@>DSL@H+zX0DX8>j#P diff --git a/.yarn/cache/concat-map-npm-0.0.1-85a921b7ee-902a9f5d89.zip b/.yarn/cache/concat-map-npm-0.0.1-85a921b7ee-902a9f5d89.zip deleted file mode 100644 index 66b4c329f8643cb20a350a4abedd737a8cd17ef5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3838 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 diff --git a/.yarn/cache/console-control-strings-npm-1.1.0-e3160e5275-8755d76787.zip b/.yarn/cache/console-control-strings-npm-1.1.0-e3160e5275-8755d76787.zip deleted file mode 100644 index a1f2fe661be18de3c775cbcbd92300e9c517a5d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5890 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H1$l! zb_sKPG>JyKRM#g;un)=$Zl}@95dpZ!G^svAG_}C{1x=+uBh;LHpV64Eq#V--qu!>O z4}tul;J0+(Jt$`<%Gr+O8kMi}L3S0$!09byd*{V1f6CD)n;hDu(MKs!n2zBuoiPVZ zvOBQQFMG?hTp<{P5hsbzqtd{oR~>KY2UEE7lc|nKH0>3>FNctHMWBS{vc*soB5J@~ z6;saEA;N33?%_qv#!iT*8!p3`Xn31tK~+iVT0?pYKRjER4$+FIgN%x}mO<8WHa zmievvtI=K6`;-?P!%XT^Sw;zCW4d?T^D65R?BrcMl@awTJn+(3ksTz9gKx&Wq5gTq zyz(*9<$DcSqM%Hd|xai@LnjK zfaF55pNz?cD0w<^EthC)=eRS#P$n{$IjYza z^od46he`SwkG`DffVo7f+ZqhF=OBTS(9hVV?#uB~{S7B?7~3qq(?)azeB~WLH&=HK z4;}Kw=J007|r-B0mv_YeFZ@{e;Z{~pJ{U-JL(5BX>K-}2vx zQ20~+x#is*Z^(bq|0DlzZ^%FRTK+Y*DAU+#=+lPn*Y{iNjnN%&WeAJnN{_>D%0KQ; z`PaEA|G4@@B%4avAK;GyB-7=Va(OWJk2?;uG`%tnPz|_KwJbS8mBJqi7b$aNGxi-F z9hn$^P?C2Dr&i`3tau6CedqlyFQ-vLZEi+>K&nw*(JpR(OoC8|EMcNvw|J9 z(qf+Rco?@sYR36nF2UVrs4-W!hE)8tZc+648f_Aaq6}B`6>2DSK@F69Q-c|g88cEY zBM59Te^jaq=~oocYjv&6=?xZW8Eqj7dxj>MSA0Tys)lp4OM6qcQCYu9W~r#Q0z%yj zYwoJ?)OhIC^V%t7Zh-EXFn&{um?QTv@!qyc%ZSqRO?#1Ay}Y*_4lh|(nKalm$0X5? zjPYbWkZ5wj@_3r8O^P~HP!UZFO?HX*HKx|kB9i##DkySfFDmE}5!N7NUl6h;lv(1> z^f*>jNuEwhPIuN&mO~tU7ENZl$}%5a?t+09W?FmqlR2l+C4)R3@t#M@(9W9TFZsWF zE&qdm$baoG`M0{$-u zax}ZH87VbCLB&`9h^CwM+bv4??vEtUk)Z(HpgrtJ;j?uUy0pk47!tnUgZm zghg;Fw^>_0E9ebPuzM(Q3M!cKr@1}5&C~qxY{6gYaHNpjDfg@NtnYwwIX01>_JF(8 z%3V(-ZOa zf&5~(eh=c8d56;j_*agCZ*IMR)u8h-w9Vz|waafgD4>a!+r`^~|8)69^Po4q=|5fG zrx#kix|+Gdb$?K7@xad`_K-#nn_1A@nQ%{>&48PfOpHvgvWFr*M0dgue$Sz~5?02) z2)N@C+xOmPa62*wiqf2fHx2amDN^S%Jb2FYd7gk91LnFcI(*x`|E?j{v91_{ea*NY z!QHaz_EGOfSUELpRYfed(f^1Ty<7ocIb8XfN&X%vZNH7L2>kEh{6cl|>VY-W>mQ`L|g$g?sbi z=%PtfUSX*FE~7(frK1jl~->17~X|VtTzh zSK)u&p&^R;jYKf`;z`W_rX}bb*~#M3x9r?}w9BlHrN}f9w@0r>rrwHdWGx&9J{+0S zQGOL}eL})($<7In^d}KHjiU=T-zb}jDfSMoA?q{V>3@yZd_mGMKnC-Q^0ZEBCf7{>$W)X-y_NE8RBQ#mHeZ-5m5g7seeS2zuK-O`}Od@ zPW|`5@=xTipz3C1`3qSR;`qDB{~KWbde~q1n>pA&c<<|_%x~TC-!tP)_RU4nKkR|) z-1oQGe=U)2l5fiNKjclU-z5K1>znACa_|q@9q%{Mf4`7Gb!F7+j1d4pzupY5-{-TR GRrViclV@uH diff --git a/.yarn/cache/cross-spawn-npm-7.0.3-e4ff3e65b3-671cc7c728.zip b/.yarn/cache/cross-spawn-npm-7.0.3-e4ff3e65b3-671cc7c728.zip deleted file mode 100644 index 9613e383d10521b67a6c9cf528c3f890d470da0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10218 zcma)i1ymhN)-?oocL^RG0t9z=4-ni5dU4laA-KDHaCi6M?(TMR5Ac(j$@gYh|I1AE zTDSYI)wSzX_pVc?_c`)XVBqK=zZ!q(4D>%P{`G_Ka<&2(8tGU93>_?t>=@+#_EwzN zw;I?2?Cj|5to59%{?+Xb2=qTj@J|Kxh?~^Zw1JW!$;BF@Zc!OJYm&+nK~xC%!P?i36~!p$5oh z;ExkN<8}yHPRPlew2Xmhzym%hTK+Z^v@S5OsLwZuh`k_?CS_>PrsG)95{e5yBLI?| zF$JEW)42{Q-j#)YN$|ME+#=L@tZ~PkMW_Jm?AQ{(%?*CZLUV#w)fbfW!C~|WoZ>G*LFmia25HkK|4VB^$7o=5`7x+-h4LL1Ww0zjicPNais(2iR)n# zw7S$-lU;jW{tmjGFfVUC3O8gwaz_?$;4rz-G$1FPa?CosUuk!uVbks1Ox2?ce#C?{ zS4metMek}J%v9!COP8HizxrmtOcd#JYz1ukLF$761w&mG5`D&0GB{`Z{_*#lcdOGL zNL+SE@Gi&g1y}keWUg;dPiukeTfIRiUdeV_Ixv*el?&E%{BiQ1uV~RC+e6~jMoH%S z&2ncj*8Fx{Y9MOB(*W!FL($OPWrD$#;JJxI-;`mG2DoKsgND*|ecT#488kQYLo;IE zkTeTPD4?oQ*f)1ZF&I)8S$4-&{(!M7WU;2KFEwnIZ3xgWf%^!XBZtfyf2T+q+%K#> z9EssZlvd$w+cOzcfUT45DsxYy(xWn%{}F;Fmf}q^oX?M25)3wK7L0sNV-zy(O*#Dq z#jja7q03Vp#^ePe?)Y9dYmi0b2m z@nA&|PUydoDwj!}!9oYEQR%O{oIC9%S9$&YDj@h1oh?lDU#*1Ug0d2&mzB^D0Rlqt z-?|!E0gSBd>CNnVlsl{z8R1(VXy!5s4B9Iq5$1>mWQ8CvClL1nw6go{i>Kq@6|8W< z?`|aGqA5-52zR5&qfdBvCqlRciLxQs&bYtTM;Y>uF%av4mZ;zdRn{8kDL4A`=!2fA z^pB=%TF*;Z`9%@M-sN$AqODPJEv}w}9ymb%ES56u@a6&fD0|#qy>s)P%{KZyNkybV zkjAM?(c)u-wfEv93i;-D(*#RrVQk%Z zivZ7cz1bmT`R0CAsv$OEL>gj=3t+AWTo8AsA3aKRs8vELm80epd!}`Hz|hY@H~65m z!ZN>c7cgy~fdei*SoVSCQCXmn>4S=bmPPPs%oE2IB10BwQsbOc%ECuuu3Wi;cdB?7 zLo=r%XENpGeo6!Q6*ksfaJR+#&lRLAV$<51I!M>62uH6xX(Bs_-(3#E3^eRfUkM#f z_31U3JQt&ykHVQL0Dm@zq_Xvu<{;mo+c2r&qRuUukLgZyjTl-@-5d9L?AsiCjlL5B z5_7hRJijrp)Hrcvp{X&q2&YWsx`;3%9?n7Tp7|hq1bPezAwLKbWkSM&$4lDBUx}}qsYeK*rr#uOOp3x-#jg}7frWUVg?QV^OEb#yG_0lMGj(*KQFz%7FIIhQbuu&_tk!q)} zO6SG!W6oE(%;A}GLKO?~i>HBXs|GAx-5TJB(&S5qgd!mwbR;n&ADDX=YGp!42pfKk zS1;@)z-lp9e_^APw6a);ks+(DL^QK^#{qik+FVSvztcU_N+|}OthBjdm+*N$otpFd z7ctzx(1@FE##+a!SnFyWG*TocB$N2;Lhp%bTQ$~&;c~VBeHgoCSEqDI8`^IL-C&~w z&#uUb6TR8?niVp236FIs8Kl?EmFdOhh-Z1DoyQ&>4GGxQ&91)o`b=ugD!;d`Cghvc zYXcg=v_$x`#?qMg%O7A;!{O8=fE5N3YM7m?G;mJm>1K_{`PbE76@Y(Pk@vqfC9fk_ zpZhGqEgW&|ePgV5SkpCMQQdZlU`^E#>nzI81GICJ6AEa%jO!_y{>Y?1l`?Sa>fWLr zDx2z&J(=N0CLLjo&k_c`QClnwV<}?AoO9P1Y)I4~6x~d>Rz%!eJjw`PPJ}8$yED{^ z*@+i{K^6T2==Ze30h?u6XvD4%Gj9zo8c2nW(7W~=@*c&5N4QUlw}3T6KBH#oh?7yP zyKLl~j}!Xz@$GEkOhbIahEjHD)jARhEz?;V-Stn@zK0qv&~P{Qa8Iy*a_)CfK!Fm) zo%O<*f)~yZ|A{lER)$8-FH9L$?vUMNL~hxo5!F;D`&xsAD2$IRxX@BAUcO7sKH0m_ z9eov&X|%p-a|FJi+(Lx7g}QigzLM+`X_AJbmNL#nQz;#71iIV-!TxhMwChfKHm?vf zl{9pyYEvJ?Ar~&)YTb4^0SY6WPyRDZ$x+vYOZZ^iirITZpQiJHkq`R3lQ+$>lsj z_}uASFP$Y|xOGY{t4+6ftP~x8eW4#^&48~^zGntH26K$VRyS@yYXY}{S`bo7uid;0 zRT<|D-z+k0G*%s_@KNYQ?y)lV)A(C+a2lh+PNn0ocPy+~@Ks_ed?O?PSn@L8(V~@g zOD6WW6pXd3wOjJdRh#bLjvSJBLoIr6EIsKbq%>HQO;Y?=BzDa^C2B7& zl{Am6bhLYq2*(q*ckXv?u7*91%-btsHtzVpz@ULy6rLmO)C2orpi)2QCZyyy5R^i$ zSIi|-<~85xH}h<`h3lSqTIPsEwt)WU3qFeF@+yCMxp#0NAmo2~!N0aiYdu@LU+%zP z#S*Z{iu?rB=|C4DGYDg`U$v+gNH%VV90HBge~idsrc1TVLobX}#%DP5S|zv=<&rhV z#*`sE0lENX6pVa6nF#M>4d_Og8WGSmXjD-#pURQLccVOp2So2oc~75%(%UOo#|GL; zsB;icdiXq%%!R~TZwY!JtFPT%;bLl*gnd7e-Iufzn*#`D+MC)#&QRoTSry830P5VBJ-#2SdBz9!|L~u72 z+|AA{d4(J<^XJA6*W;6YvY`mj0X{DFN6Of@?KL91&|RB>P=ELSG)Q>9t2RR_!(lmb zU7Bx=;?<5n954M;<>Z8b8*2qEbaAv+z}i}{hoxc*MXDxDDJSa(ex}2$)z9XalYQPr zA+8t@K}Tl$qDIsr|mfBVtbSos9muf($EoeQNHE}`yi*F6#m9a~kS%cRhhtf`(v;;J#iJwu$aleDyyysd>IxUK}?2dHrj z9{24#5V#)12Q@SiZ@Rw7pA~s8aI$ISp#;oB8!E7q!CwRpBCL`SYxXB~49-t)9~H@U z)Z|_6VjdmRh5VFIKJ;kz@&u_gE|jX9q#pw8mF)xAv=8_u{2zLOZnhnR?7hRr`*uA~uN$O3FUIY&^p!>wXY_3~4YPthD8Yi34~VP6ri7ttG3w9B>nA^# zAM(fMfXhFDp`RuY0rE)I=2HCy9Ktd)Vhp9V!{EDarEJ#>jBrC08%lU+Q~S~oXz3DD zW(6?9ar03C<>iTj?~T|@X2F^h$jhwUyJd*Qq*dQb!cYpUv-4;cYV(gVBuwmuk443c zL5tCCPg?;=Y3lfg@6too7lqZHFBiMYl~@Ci83?YpKV&Mz#<)$E&)O z%_l4`x%ATKsBFDcC!4+X#pH0%s>vc0>oz5|9^Ten4J_*6L5%Rzpi!arT(}Yjcdfy? z=j)*Zq|*@FR4V5Yw>1zBjTn33mQRQpgolk2n?6E1T)r<-MwH6zEL~`1MvQs;;dG+E zR2xXqVgA(*BaFPZ82*asqyefl`7X4KOtOgi`Q1#}*_1?KtfZE)1+sOy^E)!3ly ztO|wi^S|P#-+P)jZ+SD-%brI565=!dH<$O1ILg*Y&rs>Jk-nal$&2^XiWHFTVni0X z;pjQqP$s8>Q$c~_*Yr+ncj%ppGJtZU{gAPeYO|pXQI>MYkj8g$h>k)6kzD{Rl61j> zvG+59zKxaUS2$E-^HA8pk(=;ny|an2s?Yy+o}ohZthm30j&qU_)nx-A42pYO=q)$f z0ae6r0&e-{#@U^--IO9E!}o2lu1#hz+(qb8a>rAttE9TY+Wn!eX>N^n(2y}hVpV?? z!nSXxChb=C1tVvzr=U|x>VgF@6VW9O4{OmVA>^~lY@QqY5tgd^9URReDP|+3s(jQG z4){4@#$v|<`#5|PV(D~k6c))Abp%wie8fSmD>D5jIEr&cDu_TZY=jZCegxAvRh2s( zef_J&C_dYr6w$7{`s2Mo!-}54EwGaPRn)^GomV>zCC9qX%Ol5t1OZ|GA0N9Nz{1f; z2w-WcXJzhC~LHR;G1mI#c&=Y-!yjekay|v=Fl~^U*O!4cK4f*QX5@!=3gHBEYD^lzcv`y+& zakKBNbkj|K1Znx;OfJM+86mwf6!xQ=ZSl{xUZajNDEMN@7LTj*}|kJhe}e< zA&^7?uM8zM#{Y<(DI@k}A6;Z!cQ>}Ohl9tux>1_>bB?i>ooES;Y7~odLQCvWboPBUFqNm^YTr)ez`cJ+Ze@fNs zeBrCp3t#^j8CmNYnCqGRii-eN{>qE8ON_`KyEMhh8<}R6d)mNFRGh z0Nlw54oCft*NWXxS6uf71Y9<#m;i?Of`d80!;Rdq0!#pE?E@HC5+Ta39(=BcolVdY<{E0NcaM-DS% zhhrV*L&+xFydv$i9?9M^A|aUgtCye|(DY85(($Q6#IRh543*Fgzr<}e$*PlNAA8z4 zrfz+d;Ww}xX5^{6N+!$=or^!rJM7;@yz4Kneu)_f9tQa4&~`&w<#@lXQHgI#07?Oe z{Se!&L27bpKuT%`Dv9DO0BBBQv1GjbV8`nrJ&y9j8;rR=GB}IAdNAUj67e@jVvx;n zG?H+#SVrr~RO7RQk&BA+z9cu(sA(sptCMEul2S zxKb06+8u_B1y1JH>oT(rSs2BfmZ{qSvagc%O-2QhoXK07Z<>Bl!u;rBVPfiemdYChgCh<_7kui<%AUDMHmeZ-U&WPeL_Zp|~H#!?-ODO%IX& za}oShAZwy}k->CP|H~o}5*Lsa6Oon^qqj6HiC?r@6h-D=y}}6I%Zx*bY-;|h7y)jr z*tb6nla#?Ah*Hv@*`2V3+9Wj(%)cyLonhENii#l@F;)NJ4U!x`kCWDbG;sKVK{X4@;R^O5H{&&0Nd zvIz+$t&jY(1+q6jwvYfSx#WF2I3)P-;4x;+ZNY8~2QWyG$#E%jUEXX{L}#&B^v}EZ z|9l2$<|!lm5E)0oWieTYCrP-v6BXX6-56)_V}upNWZ<|0LnIEKqfHeVLNfK6%^pWo zIAO^uCOxnWg1qIDWElqbmqf4;y$>Nf6;Axx*n2TBh!w&S!dXqcfAwzvQ&cp&CM4Cd zR3(PVdJKd+D%8H={zIBvG>e`)XC{7Bf^8Zw(l9?Vhd{zuqH;cgcxaDu;KB}G(Am*b zR$1$#;DJzSKo-_j-kwODehNhgEs!9*#2KtmPxyg3DZ_d0eHH=fH@-H5%bRqsNYyrN z?Vp!jR~Rmj*Bkc-=e{yVRNv{SlnkVYIMOj(Wb?$*>mVfb9tV4ludhtIJ{*mHusC;* z>SVff+jSwes^{I!*@9?x*5BuLxm((1ptErEz&&bjuia%S&lh)m~Y}l;UbR!gDpvuTxlTI|#fj5k1_>+&Q7- z!L4{NK5SFEW^1&oVnngb`sM8gmhun{TC-ZJvr=80W}kT$P-^%DTHG{vI%I;~s0AuW z#hoE1za>AJ>fVhP{*%rf@R3#dn(alq&e3Z_!7Qc2=xPw30|SW&(cVu|E8 z%zMCtM>?8K<60A2a90t;5vFz>)_kU#nwGTHM5sothb(R6!mY)lwkpn`*cwWaVMXHV zi-eIE)N3_&>P2(;k}WY=TnDzQbY#4@DKbw>PNs&u z&J8_J%x+h!;3C@O1*l`gT_VuE)vtlyLB0U-}OX5I6h1VkGGgyF({pT}TUsyRac>yj+ zKO_V*eN47=R>%`_R=Fsi3qD#(;%!G>)hx!?J_KUwrK!^<6~~0bv=DUyfGQ3$Rs-@~D%pk4Rt6T29mB6n0!Mv1pz| z0<}c&CC%5of|0hgTWdT{+&{;$1oIB)A|&xJcqlW0$^Mqi%=ni5Vh7>IkI6hGxn8~4 z9$iL9hVSXrCvJk%=yF+kc3SwOKJiK8Zf~3ucy?Q2EPZJI@-oX?LL}U$8U-WS^yX6p zixv#2n)gRKPL^5#ngdrV4TIU4L;sE^4X~8kTEz53O=IJRYwVTT0wX#HdWV@(rvV?L z^sQv2QY=Fn!0ZJ|8gmf=zinRr9xUBMlWr7^bu~XB zf#aFiT!=`HZLsfM7Ym7}b5HFIXl(N=xML!ki5+n`V0XyuS9m}>^4Sh_R) zXz;W4NQX9|*gjKfL8a%l22JoGt4AoCw9>Wj+tn3~ARHKkyF6_(Az<@jSz`IZu8VWb zii;Hqnwh0c1QYUXc&gw^Zdzr17ChlD^k>D)n|!;n;`zMH2RM-pv~Wy;3%%A=FZAfw zn(&v^ZsTaT1PU6IAZZ2*z~OD=}$8 zva#CV6!pqf+|Gn2)D66DK#g+~$N2XA~Qk&1~!!ccrq1X(YmNqvP+3!zy%CkbiJ!Q7t#% zOZTmYrb^tTg|7=I7l$e!=|Ib^)Y1|nqsk9pi9Z&fh14N%NeM^A8P9NMiG>L6XvifYUw5M52Y<@PKRmjK_wuppa`WFP9uMj61YS}WI zKWdRs)`*2qIS2$2#SD_dB)7R=)IO10zW5r3+x_72<%B0+I5PF!08z>8({?F7zQyA) zV~?WirXGv)Hp?JGd+>V|+T7Ey^h6oy+Q*ecWto`zPkXZH0{iw(*6XNNJY1tCh4+{U z1e|$kZhB-e%?<)hJdN}nEM1IQGc3gecsz&|YJKw3;~)5?>y|{+O9P-Y>omKEp38bw z^YNDAA6f8^hu#-_U6@RPd4v-$f^+~Kf!uqLjm><9Tt@W5K>CeQ1IFVt$?0i(OKqEjtCV(tG7AES8m-59OxjmvL0#OqRC@ZHT;wFm7 zR6pXx)qb;q(pab<8)=j`&iid;xXWavu!-3^=P@gBov@nMqF`+03I>;jVut~J_K=;+Bp0XHbd>X%a9Ry_%uTuxJM9FO>HokTGtcB8Us{Rd0yWTu!EKhn6-Csbj>= zhC*c-8sA6J^i`!sg3o;Xu9ygigF|n|3^NDIC$i_euF#pAQWR3e;n@p`v0(+t@{$-H zmY?cPhHZ(pjHK!llX|2x^C(z@Kw?h!MR8e0;#O1dMDCP9)L|Y!C@gSAPrQK>})wDil zb@-hVaUQSI`y!4qU>6);y!rgH{U>mkAopEaRPVeWgOnn}zB#^&p2$^xbsJl*22JLN zdd9U+0RLZ094SODxrb@|)L{xa`h3GV;2@pX#(H(rj9(Eo(@e+lp3 zhW?)X>pbXRz)mlvS$}Kj@2u!+xYt>?zu?qh{{Z*zIk?x5uT|~8Af=H03*`St<9>~P z^h&(_3%wKhe?xyI<-Q)^wc7UA0Jdm<7~tQvx7U!bwTr(XoiP6Z`R_``Ysl9j`d^Tn ecz=NWzkpp{3gU%_ARve@2jC^^YDD_$-~R(aBM@o; diff --git a/.yarn/cache/debug-npm-4.3.4-4513954577-3dbad3f94e.zip b/.yarn/cache/debug-npm-4.3.4-4513954577-3dbad3f94e.zip deleted file mode 100644 index d3a11d8e2a758d499a790b7ec03b9255a92965d7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15777 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