MediaWiki master
MainConfigSchema.php
Go to the documentation of this file.
1<?php
10// phpcs:disable Generic.NamingConventions.UpperCaseConstantName.ClassConstantNotUpperCase
11// phpcs:disable Generic.Files.LineLength.TooLong
12namespace MediaWiki;
13
18use CdnPurgeJob;
20use DateTime;
21use DateTimeZone;
26use EmaillingJob;
29use Generator;
33use InvalidArgumentException;
34use JobQueueDB;
36use LocalRepo;
37use LogFormatter;
64use MediaWiki\Settings\Source\JsonSchemaTrait;
78use NullJob;
84use ReflectionClass;
89use SqlBagOStuff;
100
133 use JsonSchemaTrait;
134
156 public static function listDefaultValues( string $prefix = '' ): Generator {
157 $class = new ReflectionClass( self::class );
158 foreach ( $class->getReflectionConstants() as $const ) {
159 if ( !$const->isPublic() ) {
160 continue;
161 }
162
163 $value = $const->getValue();
164
165 if ( !is_array( $value ) ) {
166 // Just in case we end up having some other kind of constant on this class.
167 continue;
168 }
169
170 if ( isset( $value['obsolete'] ) ) {
171 continue;
172 }
173
174 $name = $const->getName();
175 yield "$prefix$name" => self::getDefaultFromJsonSchema( $value );
176 }
177 }
178
191 public static function getDefaultValue( string $name ) {
192 $class = new ReflectionClass( self::class );
193 if ( !$class->hasConstant( $name ) ) {
194 throw new InvalidArgumentException( "Unknown setting: $name" );
195 }
196 $value = $class->getConstant( $name );
197
198 if ( !is_array( $value ) ) {
199 // Might happen if we end up having other kinds of constants on this class.
200 throw new InvalidArgumentException( "Unknown setting: $name" );
201 }
202
203 return self::getDefaultFromJsonSchema( $value );
204 }
205
206 /***************************************************************************/
214 public const ConfigRegistry = [
215 'default' => [
216 'main' => 'GlobalVarConfig::newInstance',
217 ],
218 'type' => 'map',
219 ];
220
224 public const Sitename = [
225 'default' => 'MediaWiki',
226 ];
227
228 /***************************************************************************/
229 // region Server URLs and file paths
254 public const Server = [
255 'default' => false,
256 ];
257
267 public const CanonicalServer = [
268 'default' => false,
269 ];
270
277 public const ServerName = [
278 'default' => false,
279 ];
280
287 public const AssumeProxiesUseDefaultProtocolPorts = [
288 'default' => true,
289 'type' => 'boolean',
290 ];
291
302 public const HttpsPort = [
303 'default' => 443,
304 ];
305
323 public const ForceHTTPS = [
324 'default' => false,
325 'type' => 'boolean',
326 ];
327
338 public const ScriptPath = [
339 'default' => '/wiki',
340 ];
341
356 public const UsePathInfo = [
357 'dynamicDefault' => true,
358 ];
359
363 public static function getDefaultUsePathInfo(): bool {
364 // These often break when PHP is set up in CGI mode.
365 // PATH_INFO *may* be correct if cgi.fix_pathinfo is set, but then again it may not;
366 // lighttpd converts incoming path data to lowercase on systems
367 // with case-insensitive filesystems, and there have been reports of
368 // problems on Apache as well.
369 return !str_contains( PHP_SAPI, 'cgi' ) && !str_contains( PHP_SAPI, 'apache2filter' ) &&
370 !str_contains( PHP_SAPI, 'isapi' );
371 }
372
378 public const Script = [
379 'default' => false,
380 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
381 ];
382
387 public static function getDefaultScript( $scriptPath ): string {
388 return "$scriptPath/index.php";
389 }
390
398 public const LoadScript = [
399 'default' => false,
400 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
401 ];
402
407 public static function getDefaultLoadScript( $scriptPath ): string {
408 return "$scriptPath/load.php";
409 }
410
417 public const RestPath = [
418 'default' => false,
419 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
420 ];
421
426 public static function getDefaultRestPath( $scriptPath ): string {
427 return "$scriptPath/rest.php";
428 }
429
437 public const StylePath = [
438 'default' => false,
439 'dynamicDefault' => [ 'use' => [ 'ResourceBasePath' ] ]
440 ];
441
446 public static function getDefaultStylePath( $resourceBasePath ): string {
447 return "$resourceBasePath/skins";
448 }
449
457 public const LocalStylePath = [
458 'default' => false,
459 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
460 ];
461
466 public static function getDefaultLocalStylePath( $scriptPath ): string {
467 // Avoid ResourceBasePath here since that may point to a different domain (e.g. CDN)
468 return "$scriptPath/skins";
469 }
470
478 public const ExtensionAssetsPath = [
479 'default' => false,
480 'dynamicDefault' => [ 'use' => [ 'ResourceBasePath' ] ]
481 ];
482
487 public static function getDefaultExtensionAssetsPath( $resourceBasePath ): string {
488 return "$resourceBasePath/extensions";
489 }
490
498 public const ExtensionDirectory = [
499 'default' => null,
500 'type' => '?string',
501 ];
502
510 public const StyleDirectory = [
511 'default' => null,
512 'type' => '?string',
513 ];
514
524 public const BaseDirectory = [
525 'default' => null,
526 ];
527
535 public const ArticlePath = [
536 'default' => false,
537 'dynamicDefault' => [ 'use' => [ 'Script', 'UsePathInfo' ] ]
538 ];
539
545 public static function getDefaultArticlePath( string $script, $usePathInfo ): string {
546 if ( $usePathInfo ) {
547 return "$script/$1";
548 }
549 return "$script?title=$1";
550 }
551
557 public const UploadPath = [
558 'default' => false,
559 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
560 ];
561
566 public static function getDefaultUploadPath( $scriptPath ): string {
567 return "$scriptPath/images";
568 }
569
582 public const ImgAuthPath = [
583 'default' => false,
584 ];
585
592 public const ThumbPath = [
593 'default' => false,
594 ];
595
599 public const UploadDirectory = [
600 'default' => false,
601 'dynamicDefault' => [ 'use' => [ 'BaseDirectory' ] ]
602 ];
603
608 public static function getDefaultUploadDirectory( $baseDirectory ): string {
609 return "$baseDirectory/images";
610 }
611
617 public const FileCacheDirectory = [
618 'default' => false,
619 'dynamicDefault' => [ 'use' => [ 'UploadDirectory' ] ]
620 ];
621
626 public static function getDefaultFileCacheDirectory( $uploadDirectory ): string {
627 return "$uploadDirectory/cache";
628 }
629
638 public const Logo = [
639 'default' => false,
640 'dynamicDefault' => [ 'use' => [ 'ResourceBasePath' ] ]
641 ];
642
647 public static function getDefaultLogo( $resourceBasePath ): string {
648 return "$resourceBasePath/resources/assets/change-your-logo.svg";
649 }
650
700 public const Logos = [
701 'default' => false,
702 'type' => 'map|false',
703 ];
704
710 public const Favicon = [
711 'default' => '/favicon.ico',
712 ];
713
721 public const AppleTouchIcon = [
722 'default' => false,
723 ];
724
743 public const ReferrerPolicy = [
744 'default' => false,
745 'type' => 'list|string|false',
746 ];
747
769 public const TmpDirectory = [
770 'default' => false,
771 ];
772
779 public const UploadBaseUrl = [
780 'default' => '',
781 ];
782
795 public const UploadStashScalerBaseUrl = [
796 'default' => false,
797 'deprecated' => 'since 1.36 Use thumbProxyUrl in $wgLocalFileRepo',
798 ];
799
814 public const ActionPaths = [
815 'default' => [],
816 'type' => 'map',
817 ];
818
825 public const MainPageIsDomainRoot = [
826 'default' => false,
827 'type' => 'boolean',
828 ];
829
830 // endregion -- end of server URLs and file paths
831
832 /***************************************************************************/
833 // region Files and file uploads
845 public const EnableUploads = [
846 'default' => false,
847 ];
848
852 public const UploadStashMaxAge = [
853 'default' => 6 * 3600, // 6 hours
854 ];
855
862 public const EnableAsyncUploads = [
863 'default' => false,
864 ];
865
871 public const EnableAsyncUploadsByURL = [
872 'default' => false,
873 ];
874
878 public const UploadMaintenance = [
879 'default' => false,
880 ];
881
891 public const IllegalFileChars = [
892 'default' => ':\\/\\\\',
893 'deprecated' => 'since 1.41; no longer customizable',
894 ];
895
901 public const DeletedDirectory = [
902 'default' => false,
903 'dynamicDefault' => [ 'use' => [ 'UploadDirectory' ] ]
904 ];
905
910 public static function getDefaultDeletedDirectory( $uploadDirectory ): string {
911 return "$uploadDirectory/deleted";
912 }
913
917 public const ImgAuthDetails = [
918 'default' => false,
919 ];
920
936 public const ImgAuthUrlPathMap = [
937 'default' => [],
938 'type' => 'map',
939 ];
940
1076 public const LocalFileRepo = [
1077 'default' => false,
1078 'type' => 'map|false',
1079 'dynamicDefault' => [ 'use' => [ 'UploadDirectory', 'ScriptPath', 'Favicon', 'UploadBaseUrl',
1080 'UploadPath', 'HashedUploadDirectory', 'ThumbnailScriptPath',
1081 'GenerateThumbnailOnParse', 'DeletedDirectory', 'UpdateCompatibleMetadata' ] ],
1082 ];
1083
1084 public static function getDefaultLocalFileRepo(
1085 $uploadDirectory, $scriptPath, $favicon, $uploadBaseUrl, $uploadPath,
1086 $hashedUploadDirectory, $thumbnailScriptPath, $generateThumbnailOnParse, $deletedDirectory,
1087 $updateCompatibleMetadata
1088 ) {
1089 return [
1090 'class' => LocalRepo::class,
1091 'name' => 'local',
1092 'directory' => $uploadDirectory,
1093 'scriptDirUrl' => $scriptPath,
1094 'favicon' => $favicon,
1095 'url' => $uploadBaseUrl ? $uploadBaseUrl . $uploadPath : $uploadPath,
1096 'hashLevels' => $hashedUploadDirectory ? 2 : 0,
1097 'thumbScriptUrl' => $thumbnailScriptPath,
1098 'transformVia404' => !$generateThumbnailOnParse,
1099 'deletedDir' => $deletedDirectory,
1100 'deletedHashLevels' => $hashedUploadDirectory ? 3 : 0,
1101 'updateCompatibleMetadata' => $updateCompatibleMetadata,
1102 'reserializeMetadata' => $updateCompatibleMetadata,
1103 ];
1104 }
1105
1119 public const ForeignFileRepos = [
1120 'default' => [],
1121 'type' => 'list',
1122 ];
1123
1133 public const UseInstantCommons = [
1134 'default' => false,
1135 ];
1136
1164 public const UseSharedUploads = [
1165 'default' => false,
1166 'type' => 'boolean',
1167 ];
1168
1176 public const SharedUploadDirectory = [
1177 'default' => null,
1178 'type' => '?string',
1179 ];
1180
1188 public const SharedUploadPath = [
1189 'default' => null,
1190 'type' => '?string',
1191 ];
1192
1200 public const HashedSharedUploadDirectory = [
1201 'default' => true,
1202 'type' => 'boolean',
1203 ];
1204
1212 public const RepositoryBaseUrl = [
1213 'default' => 'https://commons.wikimedia.org/wiki/File:',
1214 ];
1215
1223 public const FetchCommonsDescriptions = [
1224 'default' => false,
1225 'type' => 'boolean',
1226 ];
1227
1236 public const SharedUploadDBname = [
1237 'default' => false,
1238 'type' => 'false|string',
1239 ];
1240
1248 public const SharedUploadDBprefix = [
1249 'default' => '',
1250 'type' => 'string',
1251 ];
1252
1260 public const CacheSharedUploads = [
1261 'default' => true,
1262 'type' => 'boolean',
1263 ];
1264
1275 public const ForeignUploadTargets = [
1276 'default' => [ 'local', ],
1277 'type' => 'list',
1278 ];
1279
1289 public const UploadDialog = [
1290 'default' =>
1291 [
1292 'fields' =>
1293 [
1294 'description' => true,
1295 'date' => false,
1296 'categories' => false,
1297 ],
1298 'licensemessages' =>
1299 [
1300 'local' => 'generic-local',
1301 'foreign' => 'generic-foreign',
1302 ],
1303 'comment' =>
1304 [
1305 'local' => '',
1306 'foreign' => '',
1307 ],
1308 'format' =>
1309 [
1310 'filepage' => '$DESCRIPTION',
1311 'description' => '$TEXT',
1312 'ownwork' => '',
1313 'license' => '',
1314 'uncategorized' => '',
1315 ],
1316 ],
1317 'type' => 'map',
1318 ];
1319
1356 public const FileBackends = [
1357 'default' => [],
1358 'type' => 'map',
1359 ];
1360
1372 public const LockManagers = [
1373 'default' => [],
1374 'type' => 'list',
1375 ];
1376
1392 public const ShowEXIF = [
1393 'dynamicDefault' => [ 'callback' => [ self::class, 'getDefaultShowEXIF' ] ],
1394 ];
1395
1399 public static function getDefaultShowEXIF(): bool {
1400 return function_exists( 'exif_read_data' );
1401 }
1402
1406 public const UpdateCompatibleMetadata = [
1407 'default' => false,
1408 ];
1409
1416 public const AllowCopyUploads = [
1417 'default' => false,
1418 ];
1419
1425 public const CopyUploadsDomains = [
1426 'default' => [],
1427 'type' => 'list',
1428 ];
1429
1435 public const CopyUploadsFromSpecialUpload = [
1436 'default' => false,
1437 ];
1438
1444 public const CopyUploadProxy = [
1445 'default' => false,
1446 ];
1447
1456 public const CopyUploadTimeout = [
1457 'default' => false,
1458 'type' => 'false|integer',
1459 ];
1460
1467 public const CopyUploadAllowOnWikiDomainConfig = [
1468 'default' => false,
1469 ];
1470
1491 public const MaxUploadSize = [
1492 'default' => 1024 * 1024 * 100,
1493 ];
1494
1509 public const MinUploadChunkSize = [
1510 'default' => 1024,
1511 ];
1512
1524 public const UploadNavigationUrl = [
1525 'default' => false,
1526 ];
1527
1533 public const UploadMissingFileUrl = [
1534 'default' => false,
1535 ];
1536
1550 public const ThumbnailScriptPath = [
1551 'default' => false,
1552 ];
1553
1561 public const SharedThumbnailScriptPath = [
1562 'default' => false,
1563 'type' => 'string|false',
1564 ];
1565
1571 public const HashedUploadDirectory = [
1572 'default' => true,
1573 'type' => 'boolean',
1574 ];
1575
1584 public const FileExtensions = [
1585 'default' => [ 'png', 'gif', 'jpg', 'jpeg', 'webp', ],
1586 'type' => 'list',
1587 ];
1588
1597 public const ProhibitedFileExtensions = [
1598 'default' => [
1599 # HTML may contain cookie-stealing JavaScript and web bugs
1600 'html', 'htm', 'js', 'jsb', 'mhtml', 'mht', 'xhtml', 'xht',
1601 # PHP scripts may execute arbitrary code on the server
1602 'php', 'phtml', 'php3', 'php4', 'php5', 'phps', 'phar',
1603 # Other types that may be interpreted by some servers
1604 'shtml', 'jhtml', 'pl', 'py', 'cgi',
1605 # May contain harmful executables for Windows victims
1606 'exe', 'scr', 'dll', 'msi', 'vbs', 'bat', 'com', 'pif', 'cmd', 'vxd', 'cpl',
1607 # T341565
1608 'xml',
1609 ],
1610 'type' => 'list',
1611 ];
1612
1619 public const MimeTypeExclusions = [
1620 'default' => [
1621 # HTML may contain cookie-stealing JavaScript and web bugs
1622 'text/html',
1623 # Similarly with JavaScript itself
1624 'application/javascript', 'text/javascript', 'text/x-javascript', 'application/x-shellscript',
1625 # PHP scripts may execute arbitrary code on the server
1626 'application/x-php', 'text/x-php',
1627 # Other types that may be interpreted by some servers
1628 'text/x-python', 'text/x-perl', 'text/x-bash', 'text/x-sh', 'text/x-csh',
1629 # Client-side hazards on Internet Explorer
1630 'text/scriptlet', 'application/x-msdownload',
1631 # Windows metafile, client-side vulnerability on some systems
1632 'application/x-msmetafile',
1633 # Files that look like java files
1634 'application/java',
1635 # XML files generally - T341565
1636 'application/xml', 'text/xml',
1637 ],
1638 'type' => 'list',
1639 ];
1640
1646 public const CheckFileExtensions = [
1647 'default' => true,
1648 ];
1649
1656 public const StrictFileExtensions = [
1657 'default' => true,
1658 ];
1659
1666 public const DisableUploadScriptChecks = [
1667 'default' => false,
1668 ];
1669
1673 public const UploadSizeWarning = [
1674 'default' => false,
1675 ];
1676
1688 public const TrustedMediaFormats = [
1689 'default' => [
1690 MEDIATYPE_BITMAP, // all bitmap formats
1691 MEDIATYPE_AUDIO, // all audio formats
1692 MEDIATYPE_VIDEO, // all plain video formats
1693 "image/svg+xml", // svg (only needed if inline rendering of svg is not supported)
1694 "application/pdf", // PDF files
1695 # "application/x-shockwave-flash", //flash/shockwave movie
1696 ],
1697 'type' => 'list',
1698 ];
1699
1708 public const MediaHandlers = [
1709 'default' => [],
1710 'type' => 'map',
1711 ];
1712
1719 public const NativeImageLazyLoading = [
1720 'default' => false,
1721 'type' => 'boolean',
1722 ];
1723
1728 public const ParserTestMediaHandlers = [
1729 'default' => [
1730 'image/jpeg' => 'MockBitmapHandler',
1731 'image/png' => 'MockBitmapHandler',
1732 'image/gif' => 'MockBitmapHandler',
1733 'image/tiff' => 'MockBitmapHandler',
1734 'image/webp' => 'MockBitmapHandler',
1735 'image/x-ms-bmp' => 'MockBitmapHandler',
1736 'image/x-bmp' => 'MockBitmapHandler',
1737 'image/x-xcf' => 'MockBitmapHandler',
1738 'image/svg+xml' => 'MockSvgHandler',
1739 'image/vnd.djvu' => 'MockDjVuHandler',
1740 ],
1741 'type' => 'map',
1742 ];
1743
1749 public const UseImageResize = [
1750 'default' => true,
1751 ];
1752
1762 public const UseImageMagick = [
1763 'default' => false,
1764 ];
1765
1769 public const ImageMagickConvertCommand = [
1770 'default' => '/usr/bin/convert',
1771 ];
1772
1778 public const MaxInterlacingAreas = [
1779 'default' => [],
1780 'type' => 'map',
1781 ];
1782
1786 public const SharpenParameter = [
1787 'default' => '0x0.4',
1788 ];
1789
1793 public const SharpenReductionThreshold = [
1794 'default' => 0.85,
1795 ];
1796
1801 public const ImageMagickTempDir = [
1802 'default' => false,
1803 ];
1804
1817 public const CustomConvertCommand = [
1818 'default' => false,
1819 ];
1820
1826 public const JpegTran = [
1827 'default' => '/usr/bin/jpegtran',
1828 ];
1829
1849 public const JpegPixelFormat = [
1850 'default' => 'yuv420',
1851 ];
1852
1860 public const JpegQuality = [
1861 'default' => 80,
1862 ];
1863
1868 public const Exiv2Command = [
1869 'default' => '/usr/bin/exiv2',
1870 ];
1871
1877 public const Exiftool = [
1878 'default' => '/usr/bin/exiftool',
1879 ];
1880
1891 public const SVGConverters = [
1892 'default' => [
1893 'ImageMagick' => '$path/convert -background "#ffffff00" -thumbnail $widthx$height\\! $input PNG:$output',
1894 'sodipodi' => '$path/sodipodi -z -w $width -f $input -e $output',
1895 'inkscape' => '$path/inkscape -z -w $width -f $input -e $output',
1896 'batik' => 'java -Djava.awt.headless=true -jar $path/batik-rasterizer.jar -w $width -d $output $input',
1897 'rsvg' => '$path/rsvg-convert -w $width -h $height -o $output $input',
1898 'imgserv' => '$path/imgserv-wrapper -i svg -o png -w$width $input $output',
1899 'ImagickExt' => [ 'SvgHandler::rasterizeImagickExt', ],
1900 ],
1901 'type' => 'map',
1902 ];
1903
1907 public const SVGConverter = [
1908 'default' => 'ImageMagick',
1909 ];
1910
1914 public const SVGConverterPath = [
1915 'default' => '',
1916 ];
1917
1921 public const SVGMaxSize = [
1922 'default' => 5120,
1923 ];
1924
1930 public const SVGMetadataCutoff = [
1931 'default' => 1024 * 1024 * 5,
1932 ];
1933
1944 public const SVGNativeRendering = [
1945 'default' => false,
1946 'type' => 'string|boolean',
1947 ];
1948
1956 public const SVGNativeRenderingSizeLimit = [
1957 'default' => 50 * 1024,
1958 ];
1959
1969 public const MediaInTargetLanguage = [
1970 'default' => true,
1971 ];
1972
1990 public const MaxImageArea = [
1991 'default' => 12_500_000,
1992 'type' => 'string|integer|false',
1993 ];
1994
2003 public const MaxAnimatedGifArea = [
2004 'default' => 12_500_000,
2005 ];
2006
2022 public const TiffThumbnailType = [
2023 'default' => [],
2024 'type' => 'list',
2025 'mergeStrategy' => 'replace',
2026 ];
2027
2035 public const ThumbnailEpoch = [
2036 'default' => '20030516000000',
2037 ];
2038
2046 public const AttemptFailureEpoch = [
2047 'default' => 1,
2048 ];
2049
2061 public const IgnoreImageErrors = [
2062 'default' => false,
2063 ];
2064
2085 public const GenerateThumbnailOnParse = [
2086 'default' => true,
2087 'type' => 'boolean',
2088 ];
2089
2093 public const ShowArchiveThumbnails = [
2094 'default' => true,
2095 ];
2096
2102 public const EnableAutoRotation = [
2103 'default' => null,
2104 'type' => '?boolean',
2105 ];
2106
2112 public const Antivirus = [
2113 'default' => null,
2114 'type' => '?string',
2115 ];
2116
2152 public const AntivirusSetup = [
2153 'default' => [
2154 # setup for clamav
2155 'clamav' => [
2156 'command' => 'clamscan --no-summary ',
2157 'codemap' => [
2158 "0" => AV_NO_VIRUS, # no virus
2159 "1" => AV_VIRUS_FOUND, # virus found
2160 "52" => AV_SCAN_ABORTED, # unsupported file format (probably immune)
2161 "*" => AV_SCAN_FAILED, # else scan failed
2162 ],
2163 'messagepattern' => '/.*?:(.*)/sim',
2164 ],
2165 ],
2166 'type' => 'map',
2167 ];
2168
2172 public const AntivirusRequired = [
2173 'default' => true,
2174 ];
2175
2179 public const VerifyMimeType = [
2180 'default' => true,
2181 ];
2182
2193 public const MimeTypeFile = [
2194 'default' => 'internal',
2195 ];
2196
2202 public const MimeInfoFile = [
2203 'default' => 'internal',
2204 ];
2205
2219 public const MimeDetectorCommand = [
2220 'default' => null,
2221 'type' => '?string',
2222 ];
2223
2229 public const TrivialMimeDetection = [
2230 'default' => false,
2231 ];
2232
2238 public const XMLMimeTypes = [
2239 'default' => [
2240 'http://www.w3.org/2000/svg:svg' => 'image/svg+xml',
2241 'svg' => 'image/svg+xml',
2242 'http://www.lysator.liu.se/~alla/dia/:diagram' => 'application/x-dia-diagram',
2243 'http://www.w3.org/1999/xhtml:html' => 'text/html',
2244 'html' => 'text/html',
2245 ],
2246 'type' => 'map',
2247 ];
2248
2259 public const ImageLimits = [
2260 'default' => [
2261 [ 320, 240 ],
2262 [ 640, 480 ],
2263 [ 800, 600 ],
2264 [ 1024, 768 ],
2265 [ 1280, 1024 ],
2266 [ 2560, 2048 ],
2267 ],
2268 'type' => 'list',
2269 ];
2270
2276 public const ThumbLimits = [
2277 'default' => [
2278 120,
2279 150,
2280 180,
2281 200,
2282 250,
2283 300
2284 ],
2285 'type' => 'list',
2286 ];
2287
2293 public const ThumbnailNamespaces = [
2294 'default' => [ NS_FILE ],
2295 'type' => 'list',
2296 'items' => [ 'type' => 'integer', ],
2297 ];
2298
2309 public const ThumbnailBuckets = [
2310 'default' => null,
2311 'type' => '?list',
2312 ];
2313
2329 public const ThumbnailMinimumBucketDistance = [
2330 'default' => 50,
2331 ];
2332
2342 public const UploadThumbnailRenderMap = [
2343 'default' => [],
2344 'type' => 'map',
2345 ];
2346
2358 public const UploadThumbnailRenderMethod = [
2359 'default' => 'jobqueue',
2360 ];
2361
2368 public const UploadThumbnailRenderHttpCustomHost = [
2369 'default' => false,
2370 ];
2371
2378 public const UploadThumbnailRenderHttpCustomDomain = [
2379 'default' => false,
2380 ];
2381
2389 public const UseTinyRGBForJPGThumbnails = [
2390 'default' => false,
2391 ];
2392
2408 public const GalleryOptions = [
2409 'default' => [],
2410 'type' => 'map',
2411 ];
2412
2418 public const ThumbUpright = [
2419 'default' => 0.75,
2420 ];
2421
2425 public const DirectoryMode = [
2426 'default' => 0777, // octal!
2427 ];
2428
2435 public const ResponsiveImages = [
2436 'default' => true,
2437 ];
2438
2455 public const ImagePreconnect = [
2456 'default' => false,
2457 ];
2458
2459 /***************************************************************************/
2460 // region DJVU settings
2469 public const DjvuUseBoxedCommand = [
2470 'default' => false,
2471 ];
2472
2481 public const DjvuDump = [
2482 'default' => null,
2483 'type' => '?string',
2484 ];
2485
2491 public const DjvuRenderer = [
2492 'default' => null,
2493 'type' => '?string',
2494 ];
2495
2504 public const DjvuTxt = [
2505 'default' => null,
2506 'type' => '?string',
2507 ];
2508
2514 public const DjvuPostProcessor = [
2515 'default' => 'pnmtojpeg',
2516 'type' => '?string',
2517 ];
2518
2522 public const DjvuOutputExtension = [
2523 'default' => 'jpg',
2524 ];
2525
2526 // endregion -- end of DJvu
2527
2528 // endregion -- end of file uploads
2529
2530 /***************************************************************************/
2531 // region Email settings
2539 public const EmergencyContact = [
2540 'default' => false,
2541 ];
2542
2551 public const PasswordSender = [
2552 'default' => false,
2553 ];
2554
2560 public const NoReplyAddress = [
2561 'default' => false,
2562 ];
2563
2569 public const EnableEmail = [
2570 'default' => true,
2571 ];
2572
2578 public const EnableUserEmail = [
2579 'default' => true,
2580 ];
2581
2589 public const EnableSpecialMute = [
2590 'default' => false,
2591 ];
2592
2598 public const EnableUserEmailMuteList = [
2599 'default' => false,
2600 ];
2601
2611 public const UserEmailUseReplyTo = [
2612 'default' => true,
2613 ];
2614
2619 public const PasswordReminderResendTime = [
2620 'default' => 24,
2621 ];
2622
2626 public const NewPasswordExpiry = [
2627 'default' => 3600 * 24 * 7,
2628 ];
2629
2633 public const UserEmailConfirmationTokenExpiry = [
2634 'default' => 7 * 24 * 60 * 60,
2635 ];
2636
2641 public const PasswordExpirationDays = [
2642 'default' => false,
2643 ];
2644
2649 public const PasswordExpireGrace = [
2650 'default' => 3600 * 24 * 7,
2651 ];
2652
2670 public const SMTP = [
2671 'default' => false,
2672 'type' => 'false|map',
2673 ];
2674
2678 public const AdditionalMailParams = [
2679 'default' => null,
2680 ];
2681
2686 public const AllowHTMLEmail = [
2687 'default' => false,
2688 ];
2689
2699 public const EnotifFromEditor = [
2700 'default' => false,
2701 'type' => 'boolean',
2702 ];
2703
2710 public const EmailAuthentication = [
2711 'default' => true,
2712 ];
2713
2717 public const EnotifWatchlist = [
2718 'default' => false,
2719 ];
2720
2728 public const EnotifUserTalk = [
2729 'default' => false,
2730 ];
2731
2744 public const EnotifRevealEditorAddress = [
2745 'default' => false,
2746 'type' => 'boolean',
2747 ];
2748
2762 public const EnotifMinorEdits = [
2763 'default' => true,
2764 ];
2765
2773 public const EnotifImpersonal = [
2774 'default' => false,
2775 ];
2776
2781 public const EnotifMaxRecips = [
2782 'default' => 500,
2783 ];
2784
2788 public const EnotifUseRealName = [
2789 'default' => false,
2790 ];
2791
2796 public const UsersNotifiedOnAllChanges = [
2797 'default' => [],
2798 'type' => 'map',
2799 ];
2800
2801 // endregion -- end of email settings
2802
2803 /***************************************************************************/
2804 // region Database settings
2817 public const DBname = [
2818 'default' => 'my_wiki',
2819 ];
2820
2831 public const DBmwschema = [
2832 'default' => null,
2833 'type' => '?string',
2834 ];
2835
2847 public const DBprefix = [
2848 'default' => '',
2849 ];
2850
2854 public const DBserver = [
2855 'default' => 'localhost',
2856 ];
2857
2861 public const DBport = [
2862 'default' => 5432,
2863 ];
2864
2868 public const DBuser = [
2869 'default' => 'wikiuser',
2870 ];
2871
2875 public const DBpassword = [
2876 'default' => '',
2877 ];
2878
2882 public const DBtype = [
2883 'default' => 'mysql',
2884 ];
2885
2893 public const DBssl = [
2894 'default' => false,
2895 ];
2896
2905 public const DBcompress = [
2906 'default' => false,
2907 ];
2908
2920 public const DBStrictWarnings = [
2921 'default' => false,
2922 ];
2923
2927 public const DBadminuser = [
2928 'default' => null,
2929 ];
2930
2934 public const DBadminpassword = [
2935 'default' => null,
2936 ];
2937
2949 public const SearchType = [
2950 'default' => null,
2951 ];
2952
2965 public const SearchTypeAlternatives = [
2966 'default' => null,
2967 ];
2968
2972 public const DBTableOptions = [
2973 'default' => 'ENGINE=InnoDB, DEFAULT CHARSET=binary',
2974 ];
2975
2983 public const SQLMode = [
2984 'default' => '',
2985 ];
2986
2994 public const DBDefaultGroup = [
2995 'default' => null,
2996 ];
2997
3001 public const SQLiteDataDir = [
3002 'default' => '',
3003 ];
3004
3025 public const SharedDB = [
3026 'default' => null,
3027 ];
3028
3032 public const SharedPrefix = [
3033 'default' => false,
3034 'dynamicDefault' => [ 'use' => [ 'DBprefix' ] ]
3035 ];
3036
3041 public static function getDefaultSharedPrefix( $dbPrefix ) {
3042 return $dbPrefix;
3043 }
3044
3049 public const SharedTables = [
3050 'default' => [
3051 'user',
3052 'user_properties',
3053 'user_autocreate_serial',
3054 ],
3055 'type' => 'list',
3056 ];
3057
3062 public const SharedSchema = [
3063 'default' => false,
3064 'dynamicDefault' => [ 'use' => [ 'DBmwschema' ] ]
3065 ];
3066
3071 public static function getDefaultSharedSchema( $dbMwschema ) {
3072 return $dbMwschema;
3073 }
3074
3129 public const DBservers = [
3130 'default' => false,
3131 'type' => 'false|list',
3132 ];
3133
3144 public const LBFactoryConf = [
3145 'default' => [
3146 'class' => 'Wikimedia\\Rdbms\\LBFactorySimple',
3147 ],
3148 'type' => 'map',
3149 'mergeStrategy' => 'replace',
3150 ];
3151
3163 public const DataCenterUpdateStickTTL = [
3164 'default' => 10,
3165 ];
3166
3170 public const DBerrorLog = [
3171 'default' => false,
3172 ];
3173
3194 public const DBerrorLogTZ = [
3195 'default' => false,
3196 'dynamicDefault' => [ 'use' => [ 'Localtimezone' ] ]
3197 ];
3198
3199 public static function getDefaultDBerrorLogTZ( $localtimezone ) {
3200 // NOTE: Extra fallback, in case $localtimezone is ''.
3201 // Many extsing LocalSettings files have $wgLocaltimezone = ''
3202 // in them, erroneously generated by the installer.
3203 return $localtimezone ?: self::getDefaultLocaltimezone();
3204 }
3205
3219 public const LocalDatabases = [
3220 'default' => [],
3221 'type' => 'list',
3222 'items' => [ 'type' => 'string', ],
3223 ];
3224
3232 public const DatabaseReplicaLagWarning = [
3233 'default' => 10,
3234 ];
3235
3240 public const DatabaseReplicaLagCritical = [
3241 'default' => 30,
3242 ];
3243
3250 public const MaxExecutionTimeForExpensiveQueries = [
3251 'default' => 0,
3252 ];
3253
3269 public const VirtualDomainsMapping = [
3270 'default' => [],
3271 'type' => 'map',
3272 ];
3273
3288 public const TemplateLinksSchemaMigrationStage = [
3290 'type' => 'integer',
3291 ];
3292
3307 public const PageLinksSchemaMigrationStage = [
3309 'type' => 'integer',
3310 ];
3311
3330 public const ExternalLinksDomainGaps = [
3331 'default' => [],
3332 'type' => 'map',
3333 ];
3334
3335 // endregion -- End of DB settings
3336
3337 /***************************************************************************/
3338 // region Content handlers and storage
3349 public const ContentHandlers = [
3350 'default' =>
3351 [
3352 // the usual case
3354 'class' => WikitextContentHandler::class,
3355 'services' => [
3356 'TitleFactory',
3357 'ParserFactory',
3358 'GlobalIdGenerator',
3359 'LanguageNameUtils',
3360 'LinkRenderer',
3361 'MagicWordFactory',
3362 'ParsoidParserFactory',
3363 ],
3364 ],
3365 // dumb version, no syntax highlighting
3366 CONTENT_MODEL_JAVASCRIPT => JavaScriptContentHandler::class,
3367 // simple implementation, for use by extensions, etc.
3368 CONTENT_MODEL_JSON => JsonContentHandler::class,
3369 // dumb version, no syntax highlighting
3370 CONTENT_MODEL_CSS => CssContentHandler::class,
3371 // plain text, for use by extensions, etc.
3372 CONTENT_MODEL_TEXT => TextContentHandler::class,
3373 // fallback for unknown models, from imports or extensions that were removed
3374 CONTENT_MODEL_UNKNOWN => FallbackContentHandler::class,
3375 ],
3376 'type' => 'map',
3377 ];
3378
3390 public const NamespaceContentModels = [
3391 'default' => [],
3392 'type' => 'map',
3393 ];
3394
3410 public const TextModelsToParse = [
3411 'default' => [
3412 CONTENT_MODEL_WIKITEXT, // Just for completeness, wikitext will always be parsed.
3413 CONTENT_MODEL_JAVASCRIPT, // Make categories etc work, people put them into comments.
3414 CONTENT_MODEL_CSS, // Make categories etc work, people put them into comments.
3415 ],
3416 'type' => 'list',
3417 ];
3418
3425 public const CompressRevisions = [
3426 'default' => false,
3427 ];
3428
3438 public const ExternalStores = [
3439 'default' => [],
3440 'type' => 'list',
3441 ];
3442
3462 public const ExternalServers = [
3463 'default' => [],
3464 'type' => 'map',
3465 ];
3466
3479 public const DefaultExternalStore = [
3480 'default' => false,
3481 'type' => 'list|false',
3482 ];
3483
3490 public const RevisionCacheExpiry = [
3491 'default' => SqlBlobStore::DEFAULT_TTL,
3492 'type' => 'integer',
3493 ];
3494
3501 public const PageLanguageUseDB = [
3502 'default' => false,
3503 'type' => 'boolean',
3504 ];
3505
3518 public const DiffEngine = [
3519 'default' => null,
3520 'type' => '?string',
3521 ];
3522
3526 public const ExternalDiffEngine = [
3527 'default' => false,
3528 'type' => 'string|false',
3529 ];
3530
3555 public const Wikidiff2Options = [
3556 'default' => [],
3557 'type' => 'map'
3558 ];
3559
3560 // endregion -- end of Content handlers and storage
3561
3562 /***************************************************************************/
3563 // region Performance hacks and limits
3575 public const RequestTimeLimit = [
3576 'default' => null,
3577 'type' => '?integer',
3578 ];
3579
3589 public const TransactionalTimeLimit = [
3590 'default' => 120,
3591 ];
3592
3607 public const CriticalSectionTimeLimit = [
3608 'default' => 180.0,
3609 'type' => 'float',
3610 ];
3611
3615 public const MiserMode = [
3616 'default' => false,
3617 ];
3618
3622 public const DisableQueryPages = [
3623 'default' => false,
3624 ];
3625
3629 public const QueryCacheLimit = [
3630 'default' => 1000,
3631 ];
3632
3636 public const WantedPagesThreshold = [
3637 'default' => 1,
3638 ];
3639
3643 public const AllowSlowParserFunctions = [
3644 'default' => false,
3645 ];
3646
3650 public const AllowSchemaUpdates = [
3651 'default' => true,
3652 ];
3653
3657 public const MaxArticleSize = [
3658 'default' => 2048,
3659 ];
3660
3665 public const MemoryLimit = [
3666 'default' => '50M',
3667 ];
3668
3712 public const PoolCounterConf = [
3713 'default' => null,
3714 'type' => '?map',
3715 ];
3716
3729 public const PoolCountClientConf = [
3730 'default' => [
3731 'servers' => [
3732 '127.0.0.1'
3733 ],
3734 'timeout' => 0.1,
3735 ],
3736 'type' => 'map',
3737 ];
3738
3746 public const MaxUserDBWriteDuration = [
3747 'default' => false,
3748 'type' => 'integer|false',
3749 ];
3750
3758 public const MaxJobDBWriteDuration = [
3759 'default' => false,
3760 'type' => 'integer|false',
3761 ];
3762
3767 public const LinkHolderBatchSize = [
3768 'default' => 1000,
3769 ];
3770
3774 public const MaximumMovedPages = [
3775 'default' => 100,
3776 ];
3777
3790 public const ForceDeferredUpdatesPreSend = [
3791 'default' => false,
3792 ];
3793
3803 public const MultiShardSiteStats = [
3804 'default' => false,
3805 'type' => 'boolean',
3806 ];
3807
3808 // endregion -- end performance hacks
3809
3810 /***************************************************************************/
3811 // region Cache settings
3822 public const CacheDirectory = [
3823 'default' => false,
3824 ];
3825
3850 public const MainCacheType = [
3851 'default' => CACHE_NONE,
3852 ];
3853
3860 public const MessageCacheType = [
3861 'default' => CACHE_ANYTHING,
3862 ];
3863
3889 public const ParserCacheType = [
3890 'default' => CACHE_ANYTHING,
3891 ];
3892
3900 public const SessionCacheType = [
3901 'default' => CACHE_ANYTHING,
3902 ];
3903
3912 public const LanguageConverterCacheType = [
3913 'default' => CACHE_ANYTHING,
3914 ];
3915
3980 public const ObjectCaches = [
3981 'default' => [
3982 CACHE_NONE => [ 'class' => EmptyBagOStuff::class, 'reportDupes' => false ],
3983 CACHE_DB => [ 'class' => SqlBagOStuff::class, 'loggroup' => 'SQLBagOStuff' ],
3984
3985 'memcached-php' => [ 'class' => MemcachedPhpBagOStuff::class, 'loggroup' => 'memcached' ],
3986 'memcached-pecl' => [ 'class' => MemcachedPeclBagOStuff::class, 'loggroup' => 'memcached' ],
3987 'hash' => [ 'class' => HashBagOStuff::class, 'reportDupes' => false ],
3988
3989 // Deprecated since 1.35.
3990 // - To configure a wg*CacheType variable to use the local server cache,
3991 // use CACHE_ACCEL instead, which will select these automatically.
3992 // - To access the object for the local server cache at run-time,
3993 // use MediaWikiServices::getLocalServerObjectCache()
3994 // instead of e.g. ObjectCache::getInstance( 'apcu' ).
3995 // - To instantiate a new one of these explicitly, do so directly
3996 // by using `new APCUBagOStuff( [ … ] )`
3997 // - To instantiate a new one of these including auto-detection and fallback,
3998 // use ObjectCache::makeLocalServerCache().
3999 'apc' => [ 'class' => APCUBagOStuff::class, 'reportDupes' => false ],
4000 'apcu' => [ 'class' => APCUBagOStuff::class, 'reportDupes' => false ],
4001 'wincache' => [ 'class' => WinCacheBagOStuff::class, 'reportDupes' => false ],
4002 ],
4003 'type' => 'map',
4004 ];
4005
4013 public const WANObjectCache = [
4014 'default' => [],
4015 'type' => 'map',
4016 ];
4017
4038 public const MicroStashType = [
4039 'default' => CACHE_ANYTHING,
4040 'type' => 'string|int',
4041 ];
4042
4070 public const MainStash = [
4071 'default' => CACHE_DB,
4072 ];
4073
4098 public const ParsoidCacheConfig = [
4099 'type' => 'object',
4100 'properties' => [
4101 'StashType' => [ 'type' => 'int|string|null', 'default' => null ],
4102 'StashDuration' => [ 'type' => 'int', 'default' => 24 * 60 * 60 ],
4103 'WarmParsoidParserCache' => [ 'type' => 'bool', 'default' => false ],
4104 ]
4105 ];
4106
4126 public const ParserCacheFilterConfig = [
4127 'type' => 'map',
4128 'default' => [ // default value
4129 'pcache' => [ // old parser cache
4130 'default' => [ // all namespaces
4131 // 0 means no threshold.
4132 // Use PHP_INT_MAX to disable cache.
4133 'minCpuTime' => 0
4134 ],
4135 ],
4136 'parsoid-pcache' => [ // parsoid output cache
4137 'default' => [ // all namespaces
4138 // 0 means no threshold.
4139 // Use PHP_INT_MAX to disable cache.
4140 'minCpuTime' => 0
4141 ],
4142 ],
4143 ],
4144 'additionalProperties' => [ // caches
4145 'type' => 'map',
4146 'description' => 'A map of namespace IDs to filter definitions.',
4147 'additionalProperties' => [ // namespaces
4148 'type' => 'map',
4149 'description' => 'A map of filter names to values.',
4150 'properties' => [ // filters
4151 'minCpuTime' => [ 'type' => 'float' ]
4152 ]
4153 ],
4154 ],
4155 ];
4156
4172 public const ChronologyProtectorStash = [
4173 'default' => null,
4174 'type' => '?string',
4175 ];
4176
4182 public const ChronologyProtectorSecret = [
4183 'default' => '',
4184 'type' => 'string',
4185 ];
4186
4192 public const ParserCacheExpireTime = [
4193 'default' => 60 * 60 * 24,
4194 ];
4195
4201 public const OldRevisionParserCacheExpireTime = [
4202 'default' => 60 * 60,
4203 ];
4204
4208 public const ObjectCacheSessionExpiry = [
4209 'default' => 60 * 60,
4210 ];
4211
4224 public const PHPSessionHandling = [
4225 'default' => 'enable',
4226 'type' => 'string',
4227 ];
4228
4236 public const SuspiciousIpExpiry = [
4237 'default' => false,
4238 'type' => 'integer|false',
4239 ];
4240
4246 public const SessionPbkdf2Iterations = [
4247 'default' => 10001,
4248 ];
4249
4253 public const MemCachedServers = [
4254 'default' => [ '127.0.0.1:11211', ],
4255 'type' => 'list',
4256 ];
4257
4262 public const MemCachedPersistent = [
4263 'default' => false,
4264 ];
4265
4269 public const MemCachedTimeout = [
4270 'default' => 500_000,
4271 ];
4272
4284 public const UseLocalMessageCache = [
4285 'default' => false,
4286 ];
4287
4295 public const AdaptiveMessageCache = [
4296 'default' => false,
4297 ];
4298
4330 public const LocalisationCacheConf = [
4331 'properties' => [
4332 'class' => [ 'type' => 'string', 'default' => LocalisationCache::class ],
4333 'store' => [ 'type' => 'string', 'default' => 'detect' ],
4334 'storeClass' => [ 'type' => 'false|string', 'default' => false ],
4335 'storeDirectory' => [ 'type' => 'false|string', 'default' => false ],
4336 'storeServer' => [ 'type' => 'object', 'default' => [] ],
4337 'forceRecache' => [ 'type' => 'bool', 'default' => false ],
4338 'manualRecache' => [ 'type' => 'bool', 'default' => false ],
4339 ],
4340 'type' => 'object',
4341 ];
4342
4346 public const CachePages = [
4347 'default' => true,
4348 ];
4349
4359 public const CacheEpoch = [
4360 'default' => '20030516000000',
4361 ];
4362
4367 public const GitInfoCacheDirectory = [
4368 'default' => false,
4369 ];
4370
4376 public const UseFileCache = [
4377 'default' => false,
4378 ];
4379
4386 public const FileCacheDepth = [
4387 'default' => 2,
4388 ];
4389
4394 public const RenderHashAppend = [
4395 'default' => '',
4396 ];
4397
4407 public const EnableSidebarCache = [
4408 'default' => false,
4409 ];
4410
4414 public const SidebarCacheExpiry = [
4415 'default' => 86400,
4416 ];
4417
4424 public const UseGzip = [
4425 'default' => false,
4426 ];
4427
4437 public const InvalidateCacheOnLocalSettingsChange = [
4438 'default' => true,
4439 ];
4440
4455 public const ExtensionInfoMTime = [
4456 'default' => false,
4457 'type' => 'integer|false',
4458 ];
4459
4466 public const EnableRemoteBagOStuffTests = [
4467 'default' => false,
4468 ];
4469
4470 // endregion -- end of cache settings
4471
4472 /***************************************************************************/
4473 // region HTTP proxy (CDN) settings
4492 public const UseCdn = [
4493 'default' => false,
4494 ];
4495
4504 public const VaryOnXFP = [
4505 'default' => false,
4506 ];
4507
4517 public const InternalServer = [
4518 'default' => false,
4519 ];
4520
4530 public const CdnMaxAge = [
4531 'default' => 18000,
4532 ];
4533
4540 public const CdnMaxageLagged = [
4541 'default' => 30,
4542 ];
4543
4550 public const CdnMaxageStale = [
4551 'default' => 10,
4552 ];
4553
4569 public const CdnReboundPurgeDelay = [
4570 'default' => 0,
4571 ];
4572
4579 public const CdnMaxageSubstitute = [
4580 'default' => 60,
4581 ];
4582
4588 public const ForcedRawSMaxage = [
4589 'default' => 300,
4590 ];
4591
4602 public const CdnServers = [
4603 'default' => [],
4604 'type' => 'map',
4605 ];
4606
4615 public const CdnServersNoPurge = [
4616 'default' => [],
4617 'type' => 'map',
4618 ];
4619
4668 public const HTCPRouting = [
4669 'default' => [],
4670 'type' => 'map',
4671 ];
4672
4678 public const HTCPMulticastTTL = [
4679 'default' => 1,
4680 ];
4681
4685 public const UsePrivateIPs = [
4686 'default' => false,
4687 ];
4688
4700 public const CdnMatchParameterOrder = [
4701 'default' => true,
4702 ];
4703
4704 // endregion -- end of HTTP proxy settings
4705
4706 /***************************************************************************/
4707 // region Language, regional and character encoding settings
4727 public const LanguageCode = [
4728 'default' => 'en',
4729 ];
4730
4742 public const GrammarForms = [
4743 'default' => [],
4744 'type' => 'map',
4745 ];
4746
4750 public const InterwikiMagic = [
4751 'default' => true,
4752 ];
4753
4757 public const HideInterlanguageLinks = [
4758 'default' => false,
4759 ];
4760
4781 public const ExtraInterlanguageLinkPrefixes = [
4782 'default' => [],
4783 'type' => 'list',
4784 ];
4785
4793 public const InterlanguageLinkCodeMap = [
4794 'default' => [],
4795 'type' => 'map',
4796 ];
4797
4801 public const ExtraLanguageNames = [
4802 'default' => [],
4803 'type' => 'map',
4804 ];
4805
4820 public const ExtraLanguageCodes = [
4821 'default' => [
4822 'bh' => 'bho',
4823 'no' => 'nb',
4824 'simple' => 'en',
4825 ],
4826 'type' => 'map',
4827 ];
4828
4837 public const DummyLanguageCodes = [
4838 'default' => [],
4839 'type' => 'map',
4840 ];
4841
4849 public const AllUnicodeFixes = [
4850 'default' => false,
4851 ];
4852
4863 public const LegacyEncoding = [
4864 'default' => false,
4865 ];
4866
4871 public const AmericanDates = [
4872 'default' => false,
4873 ];
4874
4879 public const TranslateNumerals = [
4880 'default' => true,
4881 ];
4882
4888 public const UseDatabaseMessages = [
4889 'default' => true,
4890 ];
4891
4895 public const MaxMsgCacheEntrySize = [
4896 'default' => 10000,
4897 ];
4898
4902 public const DisableLangConversion = [
4903 'default' => false,
4904 ];
4905
4910 public const DisableTitleConversion = [
4911 'default' => false,
4912 ];
4913
4918 public const DefaultLanguageVariant = [
4919 'default' => false,
4920 ];
4921
4926 public const UsePigLatinVariant = [
4927 'default' => false,
4928 ];
4929
4940 public const DisabledVariants = [
4941 'default' => [],
4942 'type' => 'map',
4943 ];
4944
4963 public const VariantArticlePath = [
4964 'default' => false,
4965 ];
4966
4982 public const UseXssLanguage = [
4983 'default' => false,
4984 ];
4985
4991 public const LoginLanguageSelector = [
4992 'default' => false,
4993 ];
4994
5015 public const ForceUIMsgAsContentMsg = [
5016 'default' => [],
5017 'type' => 'map',
5018 ];
5019
5032 public const RawHtmlMessages = [
5033 'default' => [
5034 'copyright',
5035 'history_copyright',
5036 'googlesearch',
5037 ],
5038 'type' => 'list',
5039 'items' => [ 'type' => 'string', ],
5040 ];
5041
5066 public const Localtimezone = [
5067 'dynamicDefault' => true,
5068 ];
5069
5070 public static function getDefaultLocaltimezone(): string {
5071 // This defaults to the `date.timezone` value of the PHP INI option. If this option is not set,
5072 // it falls back to UTC.
5073 $localtimezone = date_default_timezone_get();
5074 if ( !$localtimezone ) {
5075 // Make doubly sure we have a valid time zone, even if date_default_timezone_get()
5076 // returned garbage.
5077 $localtimezone = 'UTC';
5078 }
5079
5080 return $localtimezone;
5081 }
5082
5092 public const LocalTZoffset = [
5093 'dynamicDefault' => [ 'use' => [ 'Localtimezone' ] ]
5094 ];
5095
5096 public static function getDefaultLocalTZoffset( $localtimezone ): int {
5097 // NOTE: Extra fallback, in case $localtimezone is ''.
5098 // Many extsing LocalSettings files have $wgLocaltimezone = ''
5099 // in them, erroneously generated by the installer.
5100 $localtimezone = $localtimezone ?: self::getDefaultLocaltimezone();
5101
5102 $offset = ( new DateTimeZone( $localtimezone ) )->getOffset( new DateTime() );
5103 return (int)( $offset / 60 );
5104 }
5105
5114 public const OverrideUcfirstCharacters = [
5115 'default' => [],
5116 'type' => 'map',
5117 ];
5118
5119 // endregion -- End of language/charset settings
5120
5121 /***************************************************************************/
5122 // region Output format and skin settings
5128 public const MimeType = [
5129 'default' => 'text/html',
5130 ];
5131
5141 public const Html5Version = [
5142 'default' => null,
5143 ];
5144
5152 public const EditSubmitButtonLabelPublish = [
5153 'default' => false,
5154 ];
5155
5172 public const XhtmlNamespaces = [
5173 'default' => [],
5174 'type' => 'map',
5175 ];
5176
5184 public const SiteNotice = [
5185 'default' => '',
5186 ];
5187
5199 public const BrowserFormatDetection = [
5200 'default' => 'telephone=no',
5201 'type' => 'string',
5202 ];
5203
5212 public const SkinMetaTags = [
5213 'default' => [],
5214 'type' => 'map',
5215 ];
5216
5221 public const DefaultSkin = [
5222 'default' => 'vector-2022',
5223 ];
5224
5230 public const FallbackSkin = [
5231 'default' => 'fallback',
5232 ];
5233
5244 public const SkipSkins = [
5245 'default' => [],
5246 'type' => 'map',
5247 ];
5248
5252 public const DisableOutputCompression = [
5253 'default' => false,
5254 ];
5255
5285 public const FragmentMode = [
5286 'default' => [ 'html5', 'legacy', ],
5287 'type' => 'list',
5288 ];
5289
5298 public const ExternalInterwikiFragmentMode = [
5299 'default' => 'legacy',
5300 ];
5301
5333 public const FooterIcons = [
5334 'default' => [
5335 "copyright" => [
5336 "copyright" => [], // placeholder for the built in copyright icon
5337 ],
5338 "poweredby" => [
5339 "mediawiki" => [
5340 // Defaults to point at
5341 // "$wgResourceBasePath/resources/assets/poweredby_mediawiki_88x31.png"
5342 // plus srcset for 1.5x, 2x resolution variants.
5343 "src" => null,
5344 "url" => "https://www.mediawiki.org/",
5345 "alt" => "Powered by MediaWiki",
5346 ]
5347 ],
5348 ],
5349 'type' => 'map',
5350 ];
5351
5359 public const UseCombinedLoginLink = [
5360 'default' => false,
5361 ];
5362
5366 public const Edititis = [
5367 'default' => false,
5368 ];
5369
5381 public const Send404Code = [
5382 'default' => true,
5383 ];
5384
5395 public const ShowRollbackEditCount = [
5396 'default' => 10,
5397 ];
5398
5405 public const EnableCanonicalServerLink = [
5406 'default' => false,
5407 ];
5408
5422 public const InterwikiLogoOverride = [
5423 'default' => [],
5424 'type' => 'list',
5425 'items' => [ 'type' => 'string', ],
5426 ];
5427
5428 // endregion -- End of output format settings
5429
5430 /***************************************************************************/
5431 // region ResourceLoader settings
5441 public const MangleFlashPolicy = [
5442 'default' => true,
5443 'obsolete' => 'Since 1.39; no longer has any effect.',
5444 'description' => 'Has been emitting warnings since 1.39 (LTS). ' .
5445 'Can be removed completely in 1.44, assuming 1.43 is an LTS release.'
5446 ];
5447
5755 public const ResourceModules = [
5756 'default' => [],
5757 'type' => 'map',
5758 ];
5759
5854 public const ResourceModuleSkinStyles = [
5855 'default' => [],
5856 'type' => 'map',
5857 ];
5858
5870 public const ResourceLoaderSources = [
5871 'default' => [],
5872 'type' => 'map',
5873 ];
5874
5880 public const ResourceBasePath = [
5881 'default' => null,
5882 'dynamicDefault' => [ 'use' => [ 'ScriptPath' ] ]
5883 ];
5884
5889 public static function getDefaultResourceBasePath( $scriptPath ): string {
5890 return $scriptPath;
5891 }
5892
5905 public const ResourceLoaderMaxage = [
5906 'default' => [],
5907 'type' => 'map',
5908 ];
5909
5916 public const ResourceLoaderUseObjectCacheForDeps = [
5917 'default' => false,
5918 ];
5919
5925 public const ResourceLoaderDebug = [
5926 'default' => false,
5927 ];
5928
5941 public const ResourceLoaderMaxQueryLength = [
5942 'default' => false,
5943 'type' => 'integer|false',
5944 ];
5945
5956 public const ResourceLoaderValidateJS = [
5957 'default' => true,
5958 ];
5959
5968 public const ResourceLoaderEnableJSProfiler = [
5969 'default' => false,
5970 ];
5971
5976 public const ResourceLoaderStorageEnabled = [
5977 'default' => true,
5978 ];
5979
5986 public const ResourceLoaderStorageVersion = [
5987 'default' => 1,
5988 ];
5989
5996 public const ResourceLoaderEnableSourceMapLinks = [
5997 'default' => true,
5998 ];
5999
6011 public const AllowSiteCSSOnRestrictedPages = [
6012 'default' => false,
6013 ];
6014
6025 public const VueDevelopmentMode = [
6026 'default' => false,
6027 ];
6028
6029 // endregion -- End of ResourceLoader settings
6030
6031 /***************************************************************************/
6032 // region Page titles and redirects
6039 public const MetaNamespace = [
6040 'default' => false,
6041 'dynamicDefault' => [ 'use' => [ 'Sitename' ] ]
6042 ];
6043
6048 public static function getDefaultMetaNamespace( $sitename ): string {
6049 return str_replace( ' ', '_', $sitename );
6050 }
6051
6059 public const MetaNamespaceTalk = [
6060 'default' => false,
6061 ];
6062
6069 public const CanonicalNamespaceNames = [
6070 'default' => NamespaceInfo::CANONICAL_NAMES,
6071 'type' => 'map',
6072 ];
6073
6100 public const ExtraNamespaces = [
6101 'default' => [],
6102 'type' => 'map',
6103 ];
6104
6113 public const ExtraGenderNamespaces = [
6114 'default' => [],
6115 'type' => 'map',
6116 ];
6117
6140 public const NamespaceAliases = [
6141 'default' => [],
6142 'type' => 'map',
6143 ];
6144
6171 public const LegalTitleChars = [
6172 'default' => ' %!"$&\'()*,\\-.\\/0-9:;=?@A-Z\\\\^_`a-z~\\x80-\\xFF+',
6173 'deprecated' => 'since 1.41; use Extension:TitleBlacklist to customize',
6174 ];
6175
6183 public const CapitalLinks = [
6184 'default' => true,
6185 ];
6186
6201 public const CapitalLinkOverrides = [
6202 'default' => [],
6203 'type' => 'map',
6204 ];
6205
6210 public const NamespacesWithSubpages = [
6211 'default' => [
6212 NS_TALK => true,
6213 NS_USER => true,
6214 NS_USER_TALK => true,
6215 NS_PROJECT => true,
6216 NS_PROJECT_TALK => true,
6217 NS_FILE_TALK => true,
6218 NS_MEDIAWIKI => true,
6219 NS_MEDIAWIKI_TALK => true,
6220 NS_TEMPLATE => true,
6221 NS_TEMPLATE_TALK => true,
6222 NS_HELP => true,
6223 NS_HELP_TALK => true,
6224 NS_CATEGORY_TALK => true
6225 ],
6226 'type' => 'map',
6227 ];
6228
6235 public const ContentNamespaces = [
6236 'default' => [ NS_MAIN ],
6237 'type' => 'list',
6238 ];
6239
6248 public const ShortPagesNamespaceExclusions = [
6249 'default' => [],
6250 'type' => 'list',
6251 ];
6252
6261 public const ExtraSignatureNamespaces = [
6262 'default' => [],
6263 'type' => 'list',
6264 ];
6265
6277 public const InvalidRedirectTargets = [
6278 'default' => [ 'Filepath', 'Mypage', 'Mytalk', 'Redirect', 'Mylog' ],
6279 'type' => 'list',
6280 ];
6281
6290 public const DisableHardRedirects = [
6291 'default' => false,
6292 ];
6293
6299 public const FixDoubleRedirects = [
6300 'default' => false,
6301 ];
6302
6303 // endregion -- End of title and interwiki settings
6304
6305 /***************************************************************************/
6306 // region Interwiki links and sites
6315 public const LocalInterwikis = [
6316 'default' => [],
6317 'type' => 'list',
6318 ];
6319
6323 public const InterwikiExpiry = [
6324 'default' => 10800,
6325 ];
6326
6347 public const InterwikiCache = [
6348 'default' => false,
6349 'type' => 'false|map',
6350 'mergeStrategy' => 'replace',
6351 ];
6352
6360 public const InterwikiScopes = [
6361 'default' => 3,
6362 ];
6363
6367 public const InterwikiFallbackSite = [
6368 'default' => 'wiki',
6369 ];
6370
6387 public const RedirectSources = [
6388 'default' => false,
6389 ];
6390
6396 public const SiteTypes = [
6397 'default' => [ 'mediawiki' => MediaWikiSite::class, ],
6398 'type' => 'map',
6399 ];
6400
6401 // endregion -- Interwiki links and sites
6402
6403 /***************************************************************************/
6404 // region Parser settings
6412 public const MaxTocLevel = [
6413 'default' => 999,
6414 ];
6415
6420 public const MaxPPNodeCount = [
6421 'default' => 1_000_000,
6422 ];
6423
6431 public const MaxTemplateDepth = [
6432 'default' => 100,
6433 ];
6434
6438 public const MaxPPExpandDepth = [
6439 'default' => 100,
6440 ];
6441
6452 public const UrlProtocols = [
6453 'default' => [
6454 'bitcoin:', 'ftp://', 'ftps://', 'geo:', 'git://', 'gopher://', 'http://',
6455 'https://', 'irc://', 'ircs://', 'magnet:', 'mailto:', 'matrix:', 'mms://',
6456 'news:', 'nntp://', 'redis://', 'sftp://', 'sip:', 'sips:', 'sms:',
6457 'ssh://', 'svn://', 'tel:', 'telnet://', 'urn:', 'worldwind://', 'xmpp:',
6458 '//',
6459 ],
6460 'type' => 'list',
6461 ];
6462
6466 public const CleanSignatures = [
6467 'default' => true,
6468 ];
6469
6473 public const AllowExternalImages = [
6474 'default' => false,
6475 ];
6476
6491 public const AllowExternalImagesFrom = [
6492 'default' => '',
6493 ];
6494
6506 public const EnableImageWhitelist = [
6507 'default' => false,
6508 ];
6509
6528 public const TidyConfig = [
6529 'default' => [],
6530 'type' => 'map',
6531 ];
6532
6541 public const ParsoidSettings = [
6542 'default' => [
6543 'useSelser' => true,
6544 ],
6545 'type' => 'map',
6546 ];
6547
6556 public const ParserEnableLegacyMediaDOM = [
6557 'default' => false,
6558 'deprecated' => 'since 1.41',
6559 ];
6560
6571 public const ParserEnableLegacyHeadingDOM = [
6572 'default' => true,
6573 ];
6574
6585 public const UseContentMediaStyles = [
6586 'default' => false,
6587 'deprecated' => 'since 1.41',
6588 ];
6589
6599 public const UseLegacyMediaStyles = [
6600 'default' => false,
6601 ];
6602
6609 public const RawHtml = [
6610 'default' => false,
6611 ];
6612
6622 public const ExternalLinkTarget = [
6623 'default' => false,
6624 ];
6625
6632 public const NoFollowLinks = [
6633 'default' => true,
6634 ];
6635
6641 public const NoFollowNsExceptions = [
6642 'default' => [],
6643 'type' => 'list',
6644 ];
6645
6659 public const NoFollowDomainExceptions = [
6660 'default' => [ 'mediawiki.org', ],
6661 'type' => 'list',
6662 ];
6663
6668 public const RegisterInternalExternals = [
6669 'default' => false,
6670 ];
6671
6675 public const AllowDisplayTitle = [
6676 'default' => true,
6677 ];
6678
6684 public const RestrictDisplayTitle = [
6685 'default' => true,
6686 ];
6687
6692 public const ExpensiveParserFunctionLimit = [
6693 'default' => 100,
6694 ];
6695
6700 public const PreprocessorCacheThreshold = [
6701 'default' => 1000,
6702 ];
6703
6707 public const EnableScaryTranscluding = [
6708 'default' => false,
6709 ];
6710
6716 public const TranscludeCacheExpiry = [
6717 'default' => 3600,
6718 ];
6719
6726 public const EnableMagicLinks = [
6727 'default' => [
6728 'ISBN' => false,
6729 'PMID' => false,
6730 'RFC' => false,
6731 ],
6732 'type' => 'map',
6733 ];
6734
6735 // endregion -- end of parser settings
6736
6737 /***************************************************************************/
6738 // region Statistics and content analysis
6757 public const ArticleCountMethod = [
6758 'default' => 'link',
6759 ];
6760
6769 public const ActiveUserDays = [
6770 'default' => 30,
6771 ];
6772
6785 public const LearnerEdits = [
6786 'default' => 10,
6787 ];
6788
6794 public const LearnerMemberSince = [
6795 'default' => 4,
6796 ];
6797
6803 public const ExperiencedUserEdits = [
6804 'default' => 500,
6805 ];
6806
6812 public const ExperiencedUserMemberSince = [
6813 'default' => 30,
6814 ];
6815
6834 public const ManualRevertSearchRadius = [
6835 'default' => 15,
6836 'type' => 'integer',
6837 ];
6838
6851 public const RevertedTagMaxDepth = [
6852 'default' => 15,
6853 'type' => 'integer',
6854 ];
6855
6856 // endregion -- End of statistics and content analysis
6857
6858 /***************************************************************************/
6859 // region User accounts, authentication
6868 public const CentralIdLookupProviders = [
6869 'default' => [
6870 'local' => [
6871 'class' => LocalIdLookup::class,
6872 'services' => [
6873 'MainConfig',
6874 'DBLoadBalancerFactory',
6875 'HideUserUtils',
6876 ]
6877 ]
6878 ],
6879 'type' => 'map',
6880 ];
6881
6885 public const CentralIdLookupProvider = [
6886 'default' => 'local',
6887 'type' => 'string',
6888 ];
6889
6894 public const UserRegistrationProviders = [
6895 'default' => [
6896 LocalUserRegistrationProvider::TYPE => [
6897 'class' => LocalUserRegistrationProvider::class,
6898 'services' => [
6899 'UserFactory'
6900 ]
6901 ]
6902 ],
6903 'type' => 'map',
6904 ];
6905
6971 public const PasswordPolicy = [
6972 'default' => [
6973 'policies' => [
6974 'bureaucrat' => [
6975 'MinimalPasswordLength' => 10,
6976 'MinimumPasswordLengthToLogin' => 1,
6977 ],
6978 'sysop' => [
6979 'MinimalPasswordLength' => 10,
6980 'MinimumPasswordLengthToLogin' => 1,
6981 ],
6982 'interface-admin' => [
6983 'MinimalPasswordLength' => 10,
6984 'MinimumPasswordLengthToLogin' => 1,
6985 ],
6986 'bot' => [
6987 'MinimalPasswordLength' => 10,
6988 'MinimumPasswordLengthToLogin' => 1,
6989 ],
6990 'default' => [
6991 'MinimalPasswordLength' => [ 'value' => 8, 'suggestChangeOnLogin' => true ],
6992 'PasswordCannotBeSubstringInUsername' => [
6993 'value' => true,
6994 'suggestChangeOnLogin' => true
6995 ],
6996 'PasswordCannotMatchDefaults' => [ 'value' => true, 'suggestChangeOnLogin' => true ],
6997 'MaximalPasswordLength' => [ 'value' => 4096, 'suggestChangeOnLogin' => true ],
6998 'PasswordNotInCommonList' => [ 'value' => true, 'suggestChangeOnLogin' => true ],
6999 ],
7000 ],
7001 'checks' => [
7002 'MinimalPasswordLength' => [ PasswordPolicyChecks::class, 'checkMinimalPasswordLength' ],
7003 'MinimumPasswordLengthToLogin' => [ PasswordPolicyChecks::class, 'checkMinimumPasswordLengthToLogin' ],
7004 'PasswordCannotBeSubstringInUsername' => [ PasswordPolicyChecks::class, 'checkPasswordCannotBeSubstringInUsername' ],
7005 'PasswordCannotMatchDefaults' => [ PasswordPolicyChecks::class, 'checkPasswordCannotMatchDefaults' ],
7006 'MaximalPasswordLength' => [ PasswordPolicyChecks::class, 'checkMaximalPasswordLength' ],
7007 'PasswordNotInCommonList' => [ PasswordPolicyChecks::class, 'checkPasswordNotInCommonList' ],
7008 ],
7009 ],
7010 'type' => 'map',
7011 'mergeStrategy' => 'array_replace_recursive',
7012 ];
7013
7033 public const AuthManagerConfig = [
7034 'default' => null,
7035 'type' => '?map',
7036 ];
7037
7042 public const AuthManagerAutoConfig = [
7043 'default' => [
7044 'preauth' => [
7045 ThrottlePreAuthenticationProvider::class => [
7046 'class' => ThrottlePreAuthenticationProvider::class,
7047 'sort' => 0,
7048 ],
7049 ],
7050 'primaryauth' => [
7051 // TemporaryPasswordPrimaryAuthenticationProvider should come before
7052 // any other PasswordAuthenticationRequest-based
7053 // PrimaryAuthenticationProvider (or at least any that might return
7054 // FAIL rather than ABSTAIN for a wrong password), or password reset
7055 // won't work right. Do not remove this (or change the key) or
7056 // auto-configuration of other such providers in extensions will
7057 // probably auto-insert themselves in the wrong place.
7058 TemporaryPasswordPrimaryAuthenticationProvider::class => [
7059 'class' => TemporaryPasswordPrimaryAuthenticationProvider::class,
7060 'services' => [
7061 'DBLoadBalancerFactory',
7062 'UserOptionsLookup',
7063 ],
7064 'args' => [ [
7065 // Fall through to LocalPasswordPrimaryAuthenticationProvider
7066 'authoritative' => false,
7067 ] ],
7068 'sort' => 0,
7069 ],
7070 LocalPasswordPrimaryAuthenticationProvider::class => [
7071 'class' => LocalPasswordPrimaryAuthenticationProvider::class,
7072 'services' => [
7073 'DBLoadBalancerFactory',
7074 ],
7075 'args' => [ [
7076 // Last one should be authoritative, or else the user will get
7077 // a less-than-helpful error message (something like "supplied
7078 // authentication info not supported" rather than "wrong
7079 // password") if it too fails.
7080 'authoritative' => true,
7081 ] ],
7082 'sort' => 100,
7083 ],
7084 ],
7085 'secondaryauth' => [
7086 CheckBlocksSecondaryAuthenticationProvider::class => [
7087 'class' => CheckBlocksSecondaryAuthenticationProvider::class,
7088 'sort' => 0,
7089 ],
7090 ResetPasswordSecondaryAuthenticationProvider::class => [
7091 'class' => ResetPasswordSecondaryAuthenticationProvider::class,
7092 'sort' => 100,
7093 ],
7094 // Linking during login is experimental, enable at your own risk - T134952
7095 // MediaWiki\Auth\ConfirmLinkSecondaryAuthenticationProvider::class => [
7096 // 'class' => MediaWiki\Auth\ConfirmLinkSecondaryAuthenticationProvider::class,
7097 // 'sort' => 100,
7098 // ],
7099 EmailNotificationSecondaryAuthenticationProvider::class => [
7100 'class' => EmailNotificationSecondaryAuthenticationProvider::class,
7101 'services' => [
7102 'DBLoadBalancerFactory',
7103 ],
7104 'sort' => 200,
7105 ],
7106 ],
7107 ],
7108 'type' => 'map',
7109 'mergeStrategy' => 'array_plus_2d',
7110 ];
7111
7122 public const RememberMe = [
7123 'default' => 'choose',
7124 'type' => 'string',
7125 ];
7126
7164 public const ReauthenticateTime = [
7165 'default' => [ 'default' => 300, ],
7166 'type' => 'map',
7167 'additionalProperties' => [ 'type' => 'integer', ],
7168 ];
7169
7184 public const AllowSecuritySensitiveOperationIfCannotReauthenticate = [
7185 'default' => [ 'default' => true, ],
7186 'type' => 'map',
7187 'additionalProperties' => [ 'type' => 'boolean', ],
7188 ];
7189
7200 public const ChangeCredentialsBlacklist = [
7201 'default' => [
7202 TemporaryPasswordAuthenticationRequest::class,
7203 ],
7204 'type' => 'list',
7205 'items' => [ 'type' => 'string', ],
7206 ];
7207
7218 public const RemoveCredentialsBlacklist = [
7219 'default' => [
7220 PasswordAuthenticationRequest::class,
7221 ],
7222 'type' => 'list',
7223 'items' => [ 'type' => 'string', ],
7224 ];
7225
7232 public const InvalidPasswordReset = [
7233 'default' => true,
7234 ];
7235
7244 public const PasswordDefault = [
7245 'default' => 'pbkdf2',
7246 ];
7247
7275 public const PasswordConfig = [
7276 'default' => [
7277 'A' => [
7278 'class' => MWOldPassword::class,
7279 ],
7280 'B' => [
7281 'class' => MWSaltedPassword::class,
7282 ],
7283 'pbkdf2-legacyA' => [
7284 'class' => LayeredParameterizedPassword::class,
7285 'types' => [
7286 'A',
7287 'pbkdf2',
7288 ],
7289 ],
7290 'pbkdf2-legacyB' => [
7291 'class' => LayeredParameterizedPassword::class,
7292 'types' => [
7293 'B',
7294 'pbkdf2',
7295 ],
7296 ],
7297 'bcrypt' => [
7298 'class' => BcryptPassword::class,
7299 'cost' => 9,
7300 ],
7301 'pbkdf2' => [
7302 'factory' => [ AbstractPbkdf2Password::class, 'newInstance' ],
7303 'algo' => 'sha512',
7304 'cost' => '30000',
7305 'length' => '64',
7306 ],
7307 'argon2' => [
7308 'class' => Argon2Password::class,
7309
7310 // Algorithm used:
7311 // * 'argon2i' is optimized against side-channel attacks
7312 // * 'argon2id' is optimized against both side-channel and GPU cracking
7313 // * 'auto' to use the best available algorithm. If you're using more than one server, be
7314 // careful when you're mixing PHP versions because newer PHP might generate hashes that
7315 // older versions would not understand.
7316 'algo' => 'auto',
7317
7318 // The parameters below are the same as options accepted by password_hash().
7319 // Set them to override that function's defaults.
7320 //
7321 // 'memory_cost' => PASSWORD_ARGON2_DEFAULT_MEMORY_COST,
7322 // 'time_cost' => PASSWORD_ARGON2_DEFAULT_TIME_COST,
7323 // 'threads' => PASSWORD_ARGON2_DEFAULT_THREADS,
7324 ],
7325 ],
7326 'type' => 'map',
7327 ];
7328
7335 public const PasswordResetRoutes = [
7336 'default' => [
7337 'username' => true,
7338 'email' => true,
7339 ],
7340 'type' => 'map',
7341 ];
7342
7346 public const MaxSigChars = [
7347 'default' => 255,
7348 ];
7349
7362 public const SignatureValidation = [
7363 'default' => 'warning',
7364 ];
7365
7372 public const SignatureAllowedLintErrors = [
7373 'default' => [ 'obsolete-tag', ],
7374 'type' => 'list',
7375 ];
7376
7381 public const MaxNameChars = [
7382 'default' => 255,
7383 ];
7384
7391 public const ReservedUsernames = [
7392 'default' => [
7393 'MediaWiki default', // Default 'Main Page' and MediaWiki: message pages
7394 'Conversion script', // Used for the old Wikipedia software upgrade
7395 'Maintenance script', // Maintenance scripts which perform editing, image import script
7396 'Template namespace initialisation script', // Used in 1.2->1.3 upgrade
7397 'ScriptImporter', // Default user name used by maintenance/importSiteScripts.php
7398 'Delete page script', // Default user name used by maintenance/deleteBatch.php
7399 'Move page script', // Default user name used by maintenance/deleteBatch.php
7400 'Command line script', // Default user name used by maintenance/undelete.php
7401 'Unknown user', // Used in WikiImporter & RevisionStore for revisions with no author and in User for invalid user id
7402 'msg:double-redirect-fixer', // Automatic double redirect fix
7403 'msg:usermessage-editor', // Default user for leaving user messages
7404 'msg:proxyblocker', // For $wgProxyList and Special:Blockme (removed in 1.22)
7405 'msg:sorbs', // For $wgEnableDnsBlacklist etc.
7406 'msg:spambot_username', // Used by cleanupSpam.php
7407 'msg:autochange-username', // Used by anon category RC entries (parser functions, Lua & purges)
7408 ],
7409 'type' => 'list',
7410 ];
7411
7428 public const DefaultUserOptions = [
7429 'default' =>
7430 // This array should be sorted by key
7431 [
7432 'ccmeonemails' => 0,
7433 'date' => 'default',
7434 'diffonly' => 0,
7435 'diff-type' => 'table',
7436 'disablemail' => 0,
7437 'editfont' => 'monospace',
7438 'editondblclick' => 0,
7439 'editrecovery' => 0,
7440 'editsectiononrightclick' => 0,
7441 'email-allow-new-users' => 1,
7442 'enotifminoredits' => 0,
7443 'enotifrevealaddr' => 0,
7444 'enotifusertalkpages' => 1,
7445 'enotifwatchlistpages' => 1,
7446 'extendwatchlist' => 1,
7447 'fancysig' => 0,
7448 'forceeditsummary' => 0,
7449 'forcesafemode' => 0,
7450 'gender' => 'unknown',
7451 'hidecategorization' => 1,
7452 'hideminor' => 0,
7453 'hidepatrolled' => 0,
7454 'imagesize' => 2,
7455 'minordefault' => 0,
7456 'newpageshidepatrolled' => 0,
7457 'nickname' => '',
7458 'norollbackdiff' => 0,
7459 'prefershttps' => 1,
7460 'previewonfirst' => 0,
7461 'previewontop' => 1,
7462 'pst-cssjs' => 1,
7463 'rcdays' => 7,
7464 'rcenhancedfilters-disable' => 0,
7465 'rclimit' => 50,
7466 'requireemail' => 0,
7467 'search-match-redirect' => true,
7468 'search-special-page' => 'Search',
7469 'search-thumbnail-extra-namespaces' => true,
7470 'searchlimit' => 20,
7471 'showhiddencats' => 0,
7472 'shownumberswatching' => 1,
7473 'showrollbackconfirmation' => 0,
7474 'skin' => false,
7475 'skin-responsive' => 1,
7476 'thumbsize' => 5,
7477 'underline' => 2,
7478 'useeditwarning' => 1,
7479 'uselivepreview' => 0,
7480 'usenewrc' => 1,
7481 'watchcreations' => 1,
7482 'watchdefault' => 1,
7483 'watchdeletion' => 0,
7484 'watchlistdays' => 7,
7485 'watchlisthideanons' => 0,
7486 'watchlisthidebots' => 0,
7487 'watchlisthidecategorization' => 1,
7488 'watchlisthideliu' => 0,
7489 'watchlisthideminor' => 0,
7490 'watchlisthideown' => 0,
7491 'watchlisthidepatrolled' => 0,
7492 'watchlistreloadautomatically' => 0,
7493 'watchlistunwatchlinks' => 0,
7494 'watchmoves' => 0,
7495 'watchrollback' => 0,
7496 'watchuploads' => 1,
7497 'wlenhancedfilters-disable' => 0,
7498 'wllimit' => 250,
7499 ],
7500 'type' => 'map',
7501 ];
7502
7533 public const ConditionalUserOptions = [
7534 'default' => [],
7535 'type' => 'map',
7536 ];
7537
7541 public const HiddenPrefs = [
7542 'default' => [],
7543 'type' => 'list',
7544 ];
7545
7552 public const InvalidUsernameCharacters = [
7553 'default' => '@:>=',
7554 ];
7555
7565 public const UserrightsInterwikiDelimiter = [
7566 'default' => '@',
7567 ];
7568
7577 public const SecureLogin = [
7578 'default' => false,
7579 ];
7580
7590 public const AuthenticationTokenVersion = [
7591 'default' => null,
7592 'type' => '?string',
7593 ];
7594
7604 public const SessionProviders = [
7605 'type' => 'map',
7606 'default' => [
7607 \MediaWiki\Session\CookieSessionProvider::class => [
7608 'class' => \MediaWiki\Session\CookieSessionProvider::class,
7609 'args' => [ [
7610 'priority' => 30,
7611 ] ],
7612 ],
7613 \MediaWiki\Session\BotPasswordSessionProvider::class => [
7614 'class' => \MediaWiki\Session\BotPasswordSessionProvider::class,
7615 'args' => [ [
7616 'priority' => 75,
7617 ] ],
7618 'services' => [
7619 'GrantsInfo'
7620 ],
7621 ],
7622 ],
7623 ];
7624
7631 public const AllowRequiringEmailForResets = [
7632 'default' => false,
7633 ];
7634
7697 public const AutoCreateTempUser = [
7698 'properties' => [
7699 'enabled' => [ 'type' => 'bool', 'default' => false ],
7700 'actions' => [ 'type' => 'list', 'default' => [ 'edit' ] ],
7701 'genPattern' => [ 'type' => 'string', 'default' => '~$1' ],
7702 'matchPattern' => [ 'type' => 'string|array|null', 'default' => null ],
7703 'reservedPattern' => [ 'type' => 'string|null', 'default' => '~$1' ],
7704 'serialProvider' => [ 'type' => 'object', 'default' => [ 'type' => 'local', 'useYear' => true ] ],
7705 'serialMapping' => [ 'type' => 'object', 'default' => [ 'type' => 'plain-numeric' ] ],
7706 'expireAfterDays' => [ 'type' => 'int|null', 'default' => 365 ],
7707 'notifyBeforeExpirationDays' => [ 'type' => 'int|null', 'default' => 10 ],
7708 ],
7709 'type' => 'object',
7710 ];
7711
7712 // endregion -- end user accounts
7713
7714 /***************************************************************************/
7715 // region User rights, access control and monitoring
7721 public const AutoblockExpiry = [
7722 'default' => 86400,
7723 ];
7724
7732 public const BlockAllowsUTEdit = [
7733 'default' => true,
7734 ];
7735
7750 public const BlockCIDRLimit = [
7751 'default' => [
7752 'IPv4' => 16,
7753 'IPv6' => 19,
7754 ],
7755 'type' => 'map',
7756 ];
7757
7763 public const BlockDisablesLogin = [
7764 'default' => false,
7765 ];
7766
7773 public const EnablePartialActionBlocks = [
7774 'default' => false,
7775 'type' => 'boolean',
7776 ];
7777
7783 public const EnableMultiBlocks = [
7784 'default' => false,
7785 'type' => 'boolean',
7786 ];
7787
7805 public const BlockTargetMigrationStage = [
7806 'default' => SCHEMA_COMPAT_NEW,
7807 'type' => 'integer',
7808 ];
7809
7829 public const WhitelistRead = [
7830 'default' => false,
7831 ];
7832
7860 public const WhitelistReadRegexp = [
7861 'default' => false,
7862 ];
7863
7868 public const EmailConfirmToEdit = [
7869 'default' => false,
7870 ];
7871
7876 public const HideIdentifiableRedirects = [
7877 'default' => true,
7878 ];
7879
7904 public const GroupPermissions = [
7905 'type' => 'map',
7906 'additionalProperties' => [
7907 'type' => 'map',
7908 'additionalProperties' => [ 'type' => 'boolean', ],
7909 ],
7910 'mergeStrategy' => 'array_plus_2d',
7911 'default' => [
7912 '*' => [
7913 'createaccount' => true,
7914 'read' => true,
7915 'edit' => true,
7916 'createpage' => true,
7917 'createtalk' => true,
7918 'writeapi' => true,
7919 'viewmyprivateinfo' => true,
7920 'editmyprivateinfo' => true,
7921 'editmyoptions' => true,
7922 ],
7923 'user' => [
7924 'move' => true,
7925 'move-subpages' => true,
7926 'move-rootuserpages' => true,
7927 'move-categorypages' => true,
7928 'movefile' => true,
7929 'read' => true,
7930 'edit' => true,
7931 'createpage' => true,
7932 'createtalk' => true,
7933 'writeapi' => true,
7934 'upload' => true,
7935 'reupload' => true,
7936 'reupload-shared' => true,
7937 'minoredit' => true,
7938 'editmyusercss' => true,
7939 'editmyuserjson' => true,
7940 'editmyuserjs' => true,
7941 'editmyuserjsredirect' => true,
7942 'sendemail' => true,
7943 'applychangetags' => true,
7944 'changetags' => true,
7945 'editcontentmodel' => true,
7946 'viewmywatchlist' => true,
7947 'editmywatchlist' => true,
7948 ],
7949 'autoconfirmed' => [
7950 'autoconfirmed' => true,
7951 'editsemiprotected' => true,
7952 ],
7953 'bot' => [
7954 'bot' => true,
7955 'autoconfirmed' => true,
7956 'editsemiprotected' => true,
7957 'nominornewtalk' => true,
7958 'autopatrol' => true,
7959 'suppressredirect' => true,
7960 'apihighlimits' => true,
7961 'writeapi' => true,
7962 ],
7963 'sysop' => [
7964 'block' => true,
7965 'createaccount' => true,
7966 'delete' => true,
7967 'bigdelete' => true,
7968 'deletedhistory' => true,
7969 'deletedtext' => true,
7970 'undelete' => true,
7971 'editinterface' => true,
7972 'editsitejson' => true,
7973 'edituserjson' => true,
7974 'import' => true,
7975 'importupload' => true,
7976 'move' => true,
7977 'move-subpages' => true,
7978 'move-rootuserpages' => true,
7979 'move-categorypages' => true,
7980 'patrol' => true,
7981 'autopatrol' => true,
7982 'protect' => true,
7983 'editprotected' => true,
7984 'rollback' => true,
7985 'upload' => true,
7986 'reupload' => true,
7987 'reupload-shared' => true,
7988 'unwatchedpages' => true,
7989 'autoconfirmed' => true,
7990 'editsemiprotected' => true,
7991 'ipblock-exempt' => true,
7992 'blockemail' => true,
7993 'markbotedits' => true,
7994 'apihighlimits' => true,
7995 'browsearchive' => true,
7996 'noratelimit' => true,
7997 'movefile' => true,
7998 'unblockself' => true,
7999 'suppressredirect' => true,
8000 'mergehistory' => true,
8001 'managechangetags' => true,
8002 'deletechangetags' => true,
8003 ],
8004 'interface-admin' => [
8005 'editinterface' => true,
8006 'editsitecss' => true,
8007 'editsitejson' => true,
8008 'editsitejs' => true,
8009 'editusercss' => true,
8010 'edituserjson' => true,
8011 'edituserjs' => true,
8012 ],
8013 'bureaucrat' => [
8014 'userrights' => true,
8015 'noratelimit' => true,
8016 'renameuser' => true,
8017 ],
8018 'suppress' => [
8019 'hideuser' => true,
8020 'suppressrevision' => true,
8021 'viewsuppressed' => true,
8022 'suppressionlog' => true,
8023 'deleterevision' => true,
8024 'deletelogentry' => true,
8025 ],
8026 ],
8027 ];
8028
8036 public const PrivilegedGroups = [
8037 'default' => [
8038 'bureaucrat',
8039 'interface-admin',
8040 'suppress',
8041 'sysop',
8042 ],
8043 'type' => 'list',
8044 ];
8045
8055 public const RevokePermissions = [
8056 'default' => [],
8057 'type' => 'map',
8058 'mergeStrategy' => 'array_plus_2d',
8059 ];
8060
8080 public const GroupInheritsPermissions = [
8081 'default' => [],
8082 'type' => 'map',
8083 'additionalProperties' => [ 'type' => 'string', ],
8084 ];
8085
8089 public const ImplicitGroups = [
8090 'default' => [ '*', 'user', 'autoconfirmed' ],
8091 'type' => 'list',
8092 ];
8093
8118 public const GroupsAddToSelf = [
8119 'default' => [],
8120 'type' => 'map',
8121 ];
8122
8126 public const GroupsRemoveFromSelf = [
8127 'default' => [],
8128 'type' => 'map',
8129 ];
8130
8139 public const RestrictionTypes = [
8140 'default' => [ 'create', 'edit', 'move', 'upload' ],
8141 'type' => 'list',
8142 ];
8143
8155 public const RestrictionLevels = [
8156 'default' => [ '', 'autoconfirmed', 'sysop' ],
8157 'type' => 'list',
8158 ];
8159
8169 public const CascadingRestrictionLevels = [
8170 'default' => [ 'sysop', ],
8171 'type' => 'list',
8172 ];
8173
8186 public const SemiprotectedRestrictionLevels = [
8187 'default' => [ 'autoconfirmed', ],
8188 'type' => 'list',
8189 ];
8190
8198 public const NamespaceProtection = [
8199 'default' => [],
8200 'type' => 'map',
8201 ];
8202
8212 public const NonincludableNamespaces = [
8213 'default' => [],
8214 'type' => 'map',
8215 ];
8216
8240 public const AutoConfirmAge = [
8241 'default' => 0,
8242 ];
8243
8255 public const AutoConfirmCount = [
8256 'default' => 0,
8257 ];
8258
8316 public const Autopromote = [
8317 'default' => [
8318 'autoconfirmed' => [ '&',
8319 [ APCOND_EDITCOUNT, null ], // NOTE: null means $wgAutoConfirmCount
8320 [ APCOND_AGE, null ], // NOTE: null means AutoConfirmAge
8321 ],
8322 ],
8323 'type' => 'map',
8324 ];
8325
8346 public const AutopromoteOnce = [
8347 'default' => [ 'onEdit' => [], ],
8348 'type' => 'map',
8349 ];
8350
8356 public const AutopromoteOnceLogInRC = [
8357 'default' => true,
8358 ];
8359
8389 public const AddGroups = [
8390 'default' => [],
8391 'type' => 'map',
8392 ];
8393
8397 public const RemoveGroups = [
8398 'default' => [],
8399 'type' => 'map',
8400 ];
8401
8412 public const AvailableRights = [
8413 'default' => [],
8414 'type' => 'list',
8415 'items' => [ 'type' => 'string', ],
8416 ];
8417
8431 public const ImplicitRights = [
8432 'default' => [],
8433 'type' => 'list',
8434 'items' => [ 'type' => 'string', ]
8435 ];
8436
8441 public const DeleteRevisionsLimit = [
8442 'default' => 0,
8443 ];
8444
8450 public const DeleteRevisionsBatchSize = [
8451 'default' => 1000,
8452 ];
8453
8463 public const HideUserContribLimit = [
8464 'default' => 1000,
8465 ];
8466
8493 public const AccountCreationThrottle = [
8494 'default' => [ [
8495 'count' => 0,
8496 'seconds' => 86400,
8497 ] ],
8498 'type' => 'int|list',
8499 ];
8500
8526 public const TempAccountCreationThrottle = [
8527 'default' => [ [
8528 'count' => 6,
8529 'seconds' => 86400,
8530 ] ],
8531 'type' => 'list',
8532 ];
8533
8569 public const TempAccountNameAcquisitionThrottle = [
8570 'default' => [ [
8571 'count' => 60,
8572 'seconds' => 86400,
8573 ] ],
8574 'type' => 'list',
8575 ];
8576
8587 public const SpamRegex = [
8588 'default' => [],
8589 'type' => 'list',
8590 ];
8591
8595 public const SummarySpamRegex = [
8596 'default' => [],
8597 'type' => 'list',
8598 ];
8599
8606 public const EnableDnsBlacklist = [
8607 'default' => false,
8608 ];
8609
8634 public const DnsBlacklistUrls = [
8635 'default' => [ 'http.dnsbl.sorbs.net.', ],
8636 'type' => 'list',
8637 ];
8638
8647 public const ProxyList = [
8648 'default' => [],
8649 'type' => 'string|list',
8650 ];
8651
8656 public const ProxyWhitelist = [
8657 'default' => [],
8658 'type' => 'list',
8659 ];
8660
8668 public const SoftBlockRanges = [
8669 'default' => [],
8670 'type' => 'list',
8671 'items' => [ 'type' => 'string', ],
8672 ];
8673
8679 public const ApplyIpBlocksToXff = [
8680 'default' => false,
8681 ];
8682
8725 public const RateLimits = [
8726 'default' => [
8727 // Page edits
8728 'edit' => [
8729 'ip' => [ 8, 60 ],
8730 'newbie' => [ 8, 60 ],
8731 'user' => [ 90, 60 ],
8732 ],
8733 // Page moves
8734 'move' => [
8735 'newbie' => [ 2, 120 ],
8736 'user' => [ 8, 60 ],
8737 ],
8738 // File uploads
8739 'upload' => [
8740 'ip' => [ 8, 60 ],
8741 'newbie' => [ 8, 60 ],
8742 ],
8743 // Page rollbacks
8744 'rollback' => [
8745 'user' => [ 10, 60 ],
8746 'newbie' => [ 5, 120 ]
8747 ],
8748 // Triggering password resets emails
8749 'mailpassword' => [
8750 'ip' => [ 5, 3600 ],
8751 ],
8752 // Emailing other users using MediaWiki
8753 'sendemail' => [
8754 'ip' => [ 5, 86400 ],
8755 'newbie' => [ 5, 86400 ],
8756 'user' => [ 20, 86400 ],
8757 ],
8758 'changeemail' => [
8759 'ip-all' => [ 10, 3600 ],
8760 'user' => [ 4, 86400 ]
8761 ],
8762 // since 1.33 - rate limit email confirmations
8763 'confirmemail' => [
8764 'ip-all' => [ 10, 3600 ],
8765 'user' => [ 4, 86400 ]
8766 ],
8767 // Purging pages
8768 'purge' => [
8769 'ip' => [ 30, 60 ],
8770 'user' => [ 30, 60 ],
8771 ],
8772 // Purges of link tables
8773 'linkpurge' => [
8774 'ip' => [ 30, 60 ],
8775 'user' => [ 30, 60 ],
8776 ],
8777 // Files rendered via thumb.php or thumb_handler.php
8778 'renderfile' => [
8779 'ip' => [ 700, 30 ],
8780 'user' => [ 700, 30 ],
8781 ],
8782 // Same as above but for non-standard thumbnails
8783 'renderfile-nonstandard' => [
8784 'ip' => [ 70, 30 ],
8785 'user' => [ 70, 30 ],
8786 ],
8787 // Stashing edits into cache before save
8788 'stashedit' => [
8789 'ip' => [ 30, 60 ],
8790 'newbie' => [ 30, 60 ],
8791 ],
8792 // Stash base HTML for VE edits
8793 'stashbasehtml' => [
8794 'ip' => [ 5, 60 ],
8795 'newbie' => [ 5, 60 ],
8796 ],
8797 // Adding or removing change tags
8798 'changetags' => [
8799 'ip' => [ 8, 60 ],
8800 'newbie' => [ 8, 60 ],
8801 ],
8802 // Changing the content model of a page
8803 'editcontentmodel' => [
8804 'newbie' => [ 2, 120 ],
8805 'user' => [ 8, 60 ],
8806 ],
8807 ],
8808 'type' => 'map',
8809 'mergeStrategy' => 'array_plus_2d',
8810 ];
8811
8817 public const RateLimitsExcludedIPs = [
8818 'default' => [],
8819 'type' => 'list',
8820 ];
8821
8827 public const PutIPinRC = [
8828 'default' => true,
8829 ];
8830
8835 public const QueryPageDefaultLimit = [
8836 'default' => 50,
8837 ];
8838
8851 public const PasswordAttemptThrottle = [
8852 'default' => [
8853 // Short term limit
8854 [ 'count' => 5, 'seconds' => 300 ],
8855 // Long term limit. We need to balance the risk
8856 // of somebody using this as a DoS attack to lock someone
8857 // out of their account, and someone doing a brute force attack.
8858 [ 'count' => 150, 'seconds' => 60 * 60 * 48 ],
8859 ],
8860 'type' => 'list',
8861 ];
8862
8873 public const GrantPermissions = [
8874 'default' => [
8875 'basic' => [
8876 'autocreateaccount' => true,
8877 'autoconfirmed' => true,
8878 'autopatrol' => true,
8879 'editsemiprotected' => true,
8880 'ipblock-exempt' => true,
8881 'nominornewtalk' => true,
8882 'patrolmarks' => true,
8883 'read' => true,
8884 'writeapi' => true,
8885 'unwatchedpages' => true,
8886 ],
8887 'highvolume' => [
8888 'bot' => true,
8889 'apihighlimits' => true,
8890 'noratelimit' => true,
8891 'markbotedits' => true,
8892 ],
8893 'import' => [
8894 'import' => true,
8895 'importupload' => true,
8896 ],
8897 'editpage' => [
8898 'edit' => true,
8899 'minoredit' => true,
8900 'applychangetags' => true,
8901 'changetags' => true,
8902 'editcontentmodel' => true,
8903 ],
8904 'editprotected' => [
8905 'edit' => true,
8906 'minoredit' => true,
8907 'applychangetags' => true,
8908 'changetags' => true,
8909 'editcontentmodel' => true,
8910 'editprotected' => true,
8911 ],
8912 'editmycssjs' => [
8913 'edit' => true,
8914 'minoredit' => true,
8915 'applychangetags' => true,
8916 'changetags' => true,
8917 'editcontentmodel' => true,
8918 'editmyusercss' => true,
8919 'editmyuserjson' => true,
8920 'editmyuserjs' => true,
8921 ],
8922 'editmyoptions' => [
8923 'editmyoptions' => true,
8924 'editmyuserjson' => true,
8925 ],
8926 'editinterface' => [
8927 'edit' => true,
8928 'minoredit' => true,
8929 'applychangetags' => true,
8930 'changetags' => true,
8931 'editcontentmodel' => true,
8932 'editinterface' => true,
8933 'edituserjson' => true,
8934 'editsitejson' => true,
8935 ],
8936 'editsiteconfig' => [
8937 'edit' => true,
8938 'minoredit' => true,
8939 'applychangetags' => true,
8940 'changetags' => true,
8941 'editcontentmodel' => true,
8942 'editinterface' => true,
8943 'edituserjson' => true,
8944 'editsitejson' => true,
8945 'editusercss' => true,
8946 'edituserjs' => true,
8947 'editsitecss' => true,
8948 'editsitejs' => true,
8949 ],
8950 'createeditmovepage' => [
8951 'edit' => true,
8952 'minoredit' => true,
8953 'applychangetags' => true,
8954 'changetags' => true,
8955 'editcontentmodel' => true,
8956 'createpage' => true,
8957 'createtalk' => true,
8958 'delete-redirect' => true,
8959 'move' => true,
8960 'move-rootuserpages' => true,
8961 'move-subpages' => true,
8962 'move-categorypages' => true,
8963 'suppressredirect' => true,
8964 ],
8965 'uploadfile' => [
8966 'upload' => true,
8967 'reupload-own' => true,
8968 ],
8969 'uploadeditmovefile' => [
8970 'upload' => true,
8971 'reupload-own' => true,
8972 'reupload' => true,
8973 'reupload-shared' => true,
8974 'upload_by_url' => true,
8975 'movefile' => true,
8976 'suppressredirect' => true,
8977 ],
8978 'patrol' => [
8979 'patrol' => true,
8980 ],
8981 'rollback' => [
8982 'rollback' => true,
8983 ],
8984 'blockusers' => [
8985 'block' => true,
8986 'blockemail' => true,
8987 ],
8988 'viewdeleted' => [
8989 'browsearchive' => true,
8990 'deletedhistory' => true,
8991 'deletedtext' => true,
8992 ],
8993 'viewrestrictedlogs' => [
8994 'suppressionlog' => true,
8995 ],
8996 'delete' => [
8997 'edit' => true,
8998 'minoredit' => true,
8999 'applychangetags' => true,
9000 'changetags' => true,
9001 'editcontentmodel' => true,
9002 'browsearchive' => true,
9003 'deletedhistory' => true,
9004 'deletedtext' => true,
9005 'delete' => true,
9006 'bigdelete' => true,
9007 'deletelogentry' => true,
9008 'deleterevision' => true,
9009 'undelete' => true,
9010 ],
9011 'oversight' => [
9012 'suppressrevision' => true,
9013 'viewsuppressed' => true,
9014 ],
9015 'protect' => [
9016 'edit' => true,
9017 'minoredit' => true,
9018 'applychangetags' => true,
9019 'changetags' => true,
9020 'editcontentmodel' => true,
9021 'editprotected' => true,
9022 'protect' => true,
9023 ],
9024 'viewmywatchlist' => [
9025 'viewmywatchlist' => true,
9026 ],
9027 'editmywatchlist' => [
9028 'editmywatchlist' => true,
9029 ],
9030 'sendemail' => [
9031 'sendemail' => true,
9032 ],
9033 'createaccount' => [
9034 'createaccount' => true,
9035 ],
9036 'privateinfo' => [
9037 'viewmyprivateinfo' => true,
9038 ],
9039 'mergehistory' => [
9040 'mergehistory' => true,
9041 ],
9042 ],
9043 'type' => 'map',
9044 'mergeStrategy' => 'array_plus_2d',
9045 'additionalProperties' => [
9046 'type' => 'map',
9047 'additionalProperties' => [ 'type' => 'boolean', ],
9048 ],
9049 ];
9050
9061 public const GrantPermissionGroups = [
9062 'default' =>
9063 [
9064 // Hidden grants are implicitly present
9065 'basic' => 'hidden',
9066
9067 'editpage' => 'page-interaction',
9068 'createeditmovepage' => 'page-interaction',
9069 'editprotected' => 'page-interaction',
9070 'patrol' => 'page-interaction',
9071
9072 'uploadfile' => 'file-interaction',
9073 'uploadeditmovefile' => 'file-interaction',
9074
9075 'sendemail' => 'email',
9076
9077 'viewmywatchlist' => 'watchlist-interaction',
9078 'editviewmywatchlist' => 'watchlist-interaction',
9079
9080 'editmycssjs' => 'customization',
9081 'editmyoptions' => 'customization',
9082
9083 'editinterface' => 'administration',
9084 'editsiteconfig' => 'administration',
9085 'rollback' => 'administration',
9086 'blockusers' => 'administration',
9087 'delete' => 'administration',
9088 'viewdeleted' => 'administration',
9089 'viewrestrictedlogs' => 'administration',
9090 'protect' => 'administration',
9091 'oversight' => 'administration',
9092 'createaccount' => 'administration',
9093 'mergehistory' => 'administration',
9094 'import' => 'administration',
9095
9096 'highvolume' => 'high-volume',
9097
9098 'privateinfo' => 'private-information',
9099 ],
9100 'type' => 'map',
9101 'additionalProperties' => [ 'type' => 'string', ],
9102 ];
9103
9114 public const GrantRiskGroups = [
9115 'default' => [
9116 'basic' => GrantsInfo::RISK_LOW,
9117 'editpage' => GrantsInfo::RISK_LOW,
9118 'createeditmovepage' => GrantsInfo::RISK_LOW,
9119 'editprotected' => GrantsInfo::RISK_VANDALISM,
9120 'patrol' => GrantsInfo::RISK_LOW,
9121 'uploadfile' => GrantsInfo::RISK_LOW,
9122 'uploadeditmovefile' => GrantsInfo::RISK_LOW,
9123 'sendemail' => GrantsInfo::RISK_SECURITY,
9124 'viewmywatchlist' => GrantsInfo::RISK_LOW,
9125 'editviewmywatchlist' => GrantsInfo::RISK_LOW,
9126 'editmycssjs' => GrantsInfo::RISK_SECURITY,
9127 'editmyoptions' => GrantsInfo::RISK_SECURITY,
9128 'editinterface' => GrantsInfo::RISK_VANDALISM,
9129 'editsiteconfig' => GrantsInfo::RISK_SECURITY,
9130 'rollback' => GrantsInfo::RISK_LOW,
9131 'blockusers' => GrantsInfo::RISK_VANDALISM,
9132 'delete' => GrantsInfo::RISK_VANDALISM,
9133 'viewdeleted' => GrantsInfo::RISK_VANDALISM,
9134 'viewrestrictedlogs' => GrantsInfo::RISK_SECURITY,
9135 'protect' => GrantsInfo::RISK_VANDALISM,
9136 'oversight' => GrantsInfo::RISK_SECURITY,
9137 'createaccount' => GrantsInfo::RISK_LOW,
9138 'mergehistory' => GrantsInfo::RISK_VANDALISM,
9139 'import' => GrantsInfo::RISK_SECURITY,
9140 'highvolume' => GrantsInfo::RISK_LOW,
9141 'privateinfo' => GrantsInfo::RISK_LOW,
9142 ],
9143 'type' => 'map',
9144 ];
9145
9149 public const EnableBotPasswords = [
9150 'default' => true,
9151 'type' => 'boolean',
9152 ];
9153
9160 public const BotPasswordsCluster = [
9161 'default' => false,
9162 'type' => 'string|false',
9163 ];
9164
9174 public const BotPasswordsDatabase = [
9175 'default' => false,
9176 'type' => 'string|false',
9177 ];
9178
9179 // endregion -- end of user rights settings
9180
9181 /***************************************************************************/
9182 // region Security
9188 public const SecretKey = [
9189 'default' => false,
9190 ];
9191
9197 public const AllowUserJs = [
9198 'default' => false,
9199 ];
9200
9206 public const AllowUserCss = [
9207 'default' => false,
9208 ];
9209
9216 public const AllowUserCssPrefs = [
9217 'default' => true,
9218 ];
9219
9223 public const UseSiteJs = [
9224 'default' => true,
9225 ];
9226
9230 public const UseSiteCss = [
9231 'default' => true,
9232 ];
9233
9238 public const BreakFrames = [
9239 'default' => false,
9240 ];
9241
9261 public const EditPageFrameOptions = [
9262 'default' => 'DENY',
9263 ];
9264
9276 public const ApiFrameOptions = [
9277 'default' => 'DENY',
9278 ];
9279
9289 public const CSPHeader = [
9290 'default' => false,
9291 'type' => 'false|object',
9292 ];
9293
9299 public const CSPReportOnlyHeader = [
9300 'default' => false,
9301 'type' => 'false|object',
9302 ];
9303
9313 public const CSPFalsePositiveUrls = [
9314 'default' => [
9315 'https://3hub.co' => true,
9316 'https://morepro.info' => true,
9317 'https://p.ato.mx' => true,
9318 'https://s.ato.mx' => true,
9319 'https://adserver.adtech.de' => true,
9320 'https://ums.adtechus.com' => true,
9321 'https://cas.criteo.com' => true,
9322 'https://cat.nl.eu.criteo.com' => true,
9323 'https://atpixel.alephd.com' => true,
9324 'https://rtb.metrigo.com' => true,
9325 'https://d5p.de17a.com' => true,
9326 'https://ad.lkqd.net/vpaid/vpaid.js' => true,
9327 'https://ad.lkqd.net/vpaid/vpaid.js?fusion=1.0' => true,
9328 'https://t.lkqd.net/t' => true,
9329 'chrome-extension' => true,
9330 ],
9331 'type' => 'map',
9332 ];
9333
9341 public const AllowCrossOrigin = [
9342 'default' => false,
9343 'type' => 'boolean',
9344 ];
9345
9359 public const RestAllowCrossOriginCookieAuth = [
9360 'default' => false,
9361 'type' => 'boolean',
9362 ];
9363
9372 public const SessionSecret = [
9373 'default' => false,
9374 ];
9375
9386 public const HKDFSecret = [
9387 'default' => false,
9388 ];
9389
9398 public const HKDFAlgorithm = [
9399 'default' => 'sha256',
9400 ];
9401
9402 // endregion -- end of security
9403
9404 /***************************************************************************/
9405 // region Cookie settings
9411 public const CookieExpiration = [
9412 'default' => 30 * 86400,
9413 ];
9414
9421 public const ExtendedLoginCookieExpiration = [
9422 'default' => 180 * 86400,
9423 ];
9424
9429 public const CookieDomain = [
9430 'default' => '',
9431 ];
9432
9437 public const CookiePath = [
9438 'default' => '/',
9439 ];
9440
9451 public const CookieSecure = [
9452 'default' => 'detect',
9453 'dynamicDefault' => [ 'use' => [ 'ForceHTTPS' ] ]
9454 ];
9455
9456 public static function getDefaultCookieSecure( $forceHTTPS ): bool {
9457 return $forceHTTPS || ( WebRequest::detectProtocol() === 'https' );
9458 }
9459
9465 public const CookiePrefix = [
9466 'default' => false,
9467 'dynamicDefault' => [
9468 'use' => [ 'SharedDB', 'SharedPrefix', 'SharedTables', 'DBname', 'DBprefix' ]
9469 ],
9470 ];
9471
9472 public static function getDefaultCookiePrefix(
9473 $sharedDB, $sharedPrefix, $sharedTables, $dbName, $dbPrefix
9474 ): string {
9475 if ( $sharedDB && in_array( 'user', $sharedTables ) ) {
9476 return $sharedDB . ( $sharedPrefix ? "_$sharedPrefix" : '' );
9477 }
9478 return $dbName . ( $dbPrefix ? "_$dbPrefix" : '' );
9479 }
9480
9486 public const CookieHttpOnly = [
9487 'default' => true,
9488 ];
9489
9499 public const CookieSameSite = [
9500 'default' => null,
9501 'type' => '?string',
9502 ];
9503
9507 public const CacheVaryCookies = [
9508 'default' => [],
9509 'type' => 'list',
9510 ];
9511
9515 public const SessionName = [
9516 'default' => false,
9517 ];
9518
9526 public const CookieSetOnAutoblock = [
9527 'default' => true,
9528 ];
9529
9537 public const CookieSetOnIpBlock = [
9538 'default' => true,
9539 ];
9540
9541 // endregion -- end of cookie settings
9542
9543 /***************************************************************************/
9544 // region Profiling, testing and debugging
9546 // See $wgProfiler for how to enable profiling.
9547
9559 public const DebugLogFile = [
9560 'default' => '',
9561 ];
9562
9566 public const DebugLogPrefix = [
9567 'default' => '',
9568 ];
9569
9575 public const DebugRedirects = [
9576 'default' => false,
9577 ];
9578
9593 public const DebugRawPage = [
9594 'default' => false,
9595 ];
9596
9605 public const DebugComments = [
9606 'default' => false,
9607 ];
9608
9616 public const DebugDumpSql = [
9617 'default' => false,
9618 ];
9619
9625 public const TrxProfilerLimits = [
9626 'default' => [
9627 // HTTP GET/HEAD requests.
9628 // Primary queries should not happen on GET requests
9629 'GET' => [
9630 'masterConns' => 0,
9631 'writes' => 0,
9632 'readQueryTime' => 5,
9633 'readQueryRows' => 10000
9634 ],
9635 // HTTP POST requests.
9636 // Primary reads and writes will happen for a subset of these.
9637 'POST' => [
9638 'readQueryTime' => 5,
9639 'writeQueryTime' => 1,
9640 'readQueryRows' => 100_000,
9641 'maxAffected' => 1000
9642 ],
9643 'POST-nonwrite' => [
9644 'writes' => 0,
9645 'readQueryTime' => 5,
9646 'readQueryRows' => 10000
9647 ],
9648 // Deferred updates that run after HTTP response is sent for GET requests
9649 'PostSend-GET' => [
9650 'readQueryTime' => 5,
9651 'writeQueryTime' => 1,
9652 'readQueryRows' => 10000,
9653 'maxAffected' => 1000,
9654 // Log primary queries under the post-send entry point as they are discouraged
9655 'masterConns' => 0,
9656 'writes' => 0,
9657 ],
9658 // Deferred updates that run after HTTP response is sent for POST requests
9659 'PostSend-POST' => [
9660 'readQueryTime' => 5,
9661 'writeQueryTime' => 1,
9662 'readQueryRows' => 100_000,
9663 'maxAffected' => 1000
9664 ],
9665 // Background job runner
9666 'JobRunner' => [
9667 'readQueryTime' => 30,
9668 'writeQueryTime' => 5,
9669 'readQueryRows' => 100_000,
9670 'maxAffected' => 500 // ballpark of $wgUpdateRowsPerQuery
9671 ],
9672 // Command-line scripts
9673 'Maintenance' => [
9674 'writeQueryTime' => 5,
9675 'maxAffected' => 1000
9676 ]
9677 ],
9678 'type' => 'map',
9679 ];
9680
9713 public const DebugLogGroups = [
9714 'default' => [],
9715 'type' => 'map',
9716 ];
9717
9739 public const MWLoggerDefaultSpi = [
9740 'default' => [ 'class' => 'MediaWiki\\Logger\\LegacySpi', ],
9741 'mergeStrategy' => 'replace',
9742 'type' => 'map',
9743 ];
9744
9750 public const ShowDebug = [
9751 'default' => false,
9752 ];
9753
9757 public const SpecialVersionShowHooks = [
9758 'default' => false,
9759 ];
9760
9768 public const ShowExceptionDetails = [
9769 'default' => false,
9770 ];
9771
9775 public const LogExceptionBacktrace = [
9776 'default' => true,
9777 ];
9778
9783 public const PropagateErrors = [
9784 'default' => true,
9785 ];
9786
9790 public const ShowHostnames = [
9791 'default' => false,
9792 ];
9793
9801 public const OverrideHostname = [
9802 'default' => false,
9803 ];
9804
9809 public const DevelopmentWarnings = [
9810 'default' => false,
9811 ];
9812
9818 public const DeprecationReleaseLimit = [
9819 'default' => false,
9820 ];
9821
9888 public const Profiler = [
9889 'default' => [],
9890 'type' => 'map',
9891 'mergeStrategy' => 'replace',
9892 ];
9893
9904 public const StatsdServer = [
9905 'default' => false,
9906 ];
9907
9915 public const StatsdMetricPrefix = [
9916 'default' => 'MediaWiki',
9917 ];
9918
9927 public const StatsdSamplingRates = [
9928 'default' => [],
9929 'type' => 'map',
9930 ];
9931
9940 public const StatsTarget = [
9941 'default' => null,
9942 'type' => '?string',
9943 ];
9944
9954 public const StatsFormat = [
9955 'default' => null,
9956 'type' => '?string',
9957 ];
9958
9968 public const StatsPrefix = [
9969 'default' => 'mediawiki',
9970 'type' => 'string',
9971 ];
9972
9979 public const PageInfoTransclusionLimit = [
9980 'default' => 50,
9981 ];
9982
9986 public const EnableJavaScriptTest = [
9987 'default' => false,
9988 ];
9989
9995 public const CachePrefix = [
9996 'default' => false,
9997 ];
9998
10007 public const DebugToolbar = [
10008 'default' => false,
10009 ];
10010
10011 // endregion -- end of profiling, testing and debugging
10012
10013 /***************************************************************************/
10014 // region Search
10020 public const DisableTextSearch = [
10021 'default' => false,
10022 ];
10023
10028 public const AdvancedSearchHighlighting = [
10029 'default' => false,
10030 ];
10031
10036 public const SearchHighlightBoundaries = [
10037 'default' => '[\\p{Z}\\p{P}\\p{C}]',
10038 ];
10039
10048 public const OpenSearchTemplates = [
10049 'default' => [
10050 'application/x-suggestions+json' => false,
10051 'application/x-suggestions+xml' => false,
10052 ],
10053 'type' => 'map',
10054 ];
10055
10062 public const EnableOpenSearchSuggest = [
10063 'default' => true,
10064 'obsolete' => 'Since 1.35, no longer used',
10065 'description' => 'Has been emitting warnings since 1.39 (LTS). ' .
10066 'Can be removed completely in 1.44, assuming 1.43 is an LTS release.'
10067 ];
10068
10073 public const OpenSearchDefaultLimit = [
10074 'default' => 10,
10075 ];
10076
10081 public const OpenSearchDescriptionLength = [
10082 'default' => 100,
10083 ];
10084
10088 public const SearchSuggestCacheExpiry = [
10089 'default' => 1200,
10090 ];
10091
10096 public const DisableSearchUpdate = [
10097 'default' => false,
10098 ];
10099
10110 public const NamespacesToBeSearchedDefault = [
10111 'default' => [ NS_MAIN => true, ],
10112 'type' => 'map',
10113 ];
10114
10119 public const DisableInternalSearch = [
10120 'default' => false,
10121 ];
10122
10140 public const SearchForwardUrl = [
10141 'default' => null,
10142 ];
10143
10149 public const SitemapNamespaces = [
10150 'default' => false,
10151 'type' => 'false|list',
10152 ];
10153
10170 public const SitemapNamespacesPriorities = [
10171 'default' => false,
10172 'type' => 'false|map',
10173 ];
10174
10180 public const EnableSearchContributorsByIP = [
10181 'default' => true,
10182 ];
10183
10194 public const SpecialSearchFormOptions = [
10195 'default' => [],
10196 'type' => 'map',
10197 ];
10198
10207 public const SearchMatchRedirectPreference = [
10208 'default' => false,
10209 'type' => 'boolean',
10210 ];
10211
10218 public const SearchRunSuggestedQuery = [
10219 'default' => true,
10220 'type' => 'boolean',
10221 ];
10222
10223 // endregion -- end of search settings
10224
10225 /***************************************************************************/
10226 // region Edit user interface
10233 public const Diff3 = [
10234 'default' => '/usr/bin/diff3',
10235 ];
10236
10240 public const Diff = [
10241 'default' => '/usr/bin/diff',
10242 ];
10243
10249 public const PreviewOnOpenNamespaces = [
10250 'default' => [
10251 NS_CATEGORY => true
10252 ],
10253 'type' => 'map',
10254 ];
10255
10261 public const UniversalEditButton = [
10262 'default' => true,
10263 ];
10264
10270 public const UseAutomaticEditSummaries = [
10271 'default' => true,
10272 ];
10273
10274 // endregion -- end edit UI
10275
10276 /***************************************************************************/
10277 // region Maintenance
10279 // See also $wgSiteNotice
10280
10284 public const CommandLineDarkBg = [
10285 'default' => false,
10286 ];
10287
10296 public const ReadOnly = [
10297 'default' => null,
10298 ];
10299
10305 public const ReadOnlyWatchedItemStore = [
10306 'default' => false,
10307 'type' => 'boolean',
10308 ];
10309
10318 public const ReadOnlyFile = [
10319 'default' => false,
10320 'dynamicDefault' => [ 'use' => [ 'UploadDirectory' ] ]
10321 ];
10322
10327 public static function getDefaultReadOnlyFile( $uploadDirectory ): string {
10328 return "$uploadDirectory/lock_yBgMBwiR";
10329 }
10330
10340 public const UpgradeKey = [
10341 'default' => false,
10342 ];
10343
10347 public const GitBin = [
10348 'default' => '/usr/bin/git',
10349 ];
10350
10364 public const GitRepositoryViewers = [
10365 'default' => [
10366 'https://(?:[a-z0-9_]+@)?gerrit.wikimedia.org/r/(?:p/)?(.*)' => 'https://gerrit.wikimedia.org/g/%R/+/%H',
10367 'ssh://(?:[a-z0-9_]+@)?gerrit.wikimedia.org:29418/(.*)' => 'https://gerrit.wikimedia.org/g/%R/+/%H',
10368 ],
10369 'type' => 'map',
10370 ];
10371
10372 // endregion -- End of maintenance
10373
10374 /***************************************************************************/
10375 // region Recent changes, new pages, watchlist and history
10384 public const RCMaxAge = [
10385 'default' => 90 * 24 * 3600,
10386 ];
10387
10395 public const WatchersMaxAge = [
10396 'default' => 180 * 24 * 3600,
10397 ];
10398
10407 public const UnwatchedPageSecret = [
10408 'default' => 1,
10409 ];
10410
10418 public const RCFilterByAge = [
10419 'default' => false,
10420 ];
10421
10426 public const RCLinkLimits = [
10427 'default' => [ 50, 100, 250, 500 ],
10428 'type' => 'list',
10429 ];
10430
10437 public const RCLinkDays = [
10438 'default' => [ 1, 3, 7, 14, 30 ],
10439 'type' => 'list',
10440 ];
10441
10505 public const RCFeeds = [
10506 'default' => [],
10507 'type' => 'map',
10508 ];
10509
10517 public const RCEngines = [
10518 'default' => [
10519 'redis' => RedisPubSubFeedEngine::class,
10520 'udp' => UDPRCFeedEngine::class,
10521 ],
10522 'type' => 'map',
10523 ];
10524
10537 public const RCWatchCategoryMembership = [
10538 'default' => false,
10539 ];
10540
10549 public const UseRCPatrol = [
10550 'default' => true,
10551 ];
10552
10559 public const StructuredChangeFiltersLiveUpdatePollingRate = [
10560 'default' => 3,
10561 ];
10562
10570 public const UseNPPatrol = [
10571 'default' => true,
10572 ];
10573
10582 public const UseFilePatrol = [
10583 'default' => true,
10584 ];
10585
10589 public const Feed = [
10590 'default' => true,
10591 ];
10592
10597 public const FeedLimit = [
10598 'default' => 50,
10599 ];
10600
10610 public const FeedCacheTimeout = [
10611 'default' => 60,
10612 ];
10613
10618 public const FeedDiffCutoff = [
10619 'default' => 32768,
10620 ];
10621
10637 public const OverrideSiteFeed = [
10638 'default' => [],
10639 'type' => 'map',
10640 ];
10641
10648 public const FeedClasses = [
10649 'default' => [
10650 'rss' => \MediaWiki\Feed\RSSFeed::class,
10651 'atom' => \MediaWiki\Feed\AtomFeed::class,
10652 ],
10653 'type' => 'map',
10654 ];
10655
10660 public const AdvertisedFeedTypes = [
10661 'default' => [ 'atom', ],
10662 'type' => 'list',
10663 ];
10664
10668 public const RCShowWatchingUsers = [
10669 'default' => false,
10670 ];
10671
10675 public const RCShowChangedSize = [
10676 'default' => true,
10677 ];
10678
10684 public const RCChangedSizeThreshold = [
10685 'default' => 500,
10686 ];
10687
10692 public const ShowUpdatedMarker = [
10693 'default' => true,
10694 ];
10695
10700 public const DisableAnonTalk = [
10701 'default' => false,
10702 ];
10703
10708 public const UseTagFilter = [
10709 'default' => true,
10710 ];
10711
10729 public const SoftwareTags = [
10730 'default' => [
10731 'mw-contentmodelchange' => true,
10732 'mw-new-redirect' => true,
10733 'mw-removed-redirect' => true,
10734 'mw-changed-redirect-target' => true,
10735 'mw-blank' => true,
10736 'mw-replace' => true,
10737 'mw-rollback' => true,
10738 'mw-undo' => true,
10739 'mw-manual-revert' => true,
10740 'mw-reverted' => true,
10741 'mw-server-side-upload' => true,
10742 ],
10743 'type' => 'map',
10744 'additionalProperties' => [ 'type' => 'boolean', ],
10745 ];
10746
10754 public const UnwatchedPageThreshold = [
10755 'default' => false,
10756 ];
10757
10783 public const RecentChangesFlags = [
10784 'default' => [
10785 'newpage' => [
10786 'letter' => 'newpageletter',
10787 'title' => 'recentchanges-label-newpage',
10788 'legend' => 'recentchanges-legend-newpage',
10789 'grouping' => 'any',
10790 ],
10791 'minor' => [
10792 'letter' => 'minoreditletter',
10793 'title' => 'recentchanges-label-minor',
10794 'legend' => 'recentchanges-legend-minor',
10795 'class' => 'minoredit',
10796 'grouping' => 'all',
10797 ],
10798 'bot' => [
10799 'letter' => 'boteditletter',
10800 'title' => 'recentchanges-label-bot',
10801 'legend' => 'recentchanges-legend-bot',
10802 'class' => 'botedit',
10803 'grouping' => 'all',
10804 ],
10805 'unpatrolled' => [
10806 'letter' => 'unpatrolledletter',
10807 'title' => 'recentchanges-label-unpatrolled',
10808 'legend' => 'recentchanges-legend-unpatrolled',
10809 'grouping' => 'any',
10810 ],
10811 ],
10812 'type' => 'map',
10813 ];
10814
10820 public const WatchlistExpiry = [
10821 'default' => false,
10822 'type' => 'boolean',
10823 ];
10824
10835 public const WatchlistPurgeRate = [
10836 'default' => 0.1,
10837 'type' => 'float',
10838 ];
10839
10854 public const WatchlistExpiryMaxDuration = [
10855 'default' => '1 year',
10856 'type' => '?string',
10857 ];
10858
10859 // endregion -- end RC/watchlist
10860
10861 /***************************************************************************/
10862 // region Copyright and credits settings
10872 public const RightsPage = [
10873 'default' => null,
10874 ];
10875
10882 public const RightsUrl = [
10883 'default' => null,
10884 ];
10885
10894 public const RightsText = [
10895 'default' => null,
10896 ];
10897
10901 public const RightsIcon = [
10902 'default' => null,
10903 ];
10904
10908 public const UseCopyrightUpload = [
10909 'default' => false,
10910 ];
10911
10919 public const MaxCredits = [
10920 'default' => 0,
10921 ];
10922
10928 public const ShowCreditsIfMax = [
10929 'default' => true,
10930 ];
10931
10932 // endregion -- end of copyright and credits settings
10933
10934 /***************************************************************************/
10935 // region Import / Export
10961 public const ImportSources = [
10962 'default' => [],
10963 'type' => 'map',
10964 ];
10965
10974 public const ImportTargetNamespace = [
10975 'default' => null,
10976 ];
10977
10984 public const ExportAllowHistory = [
10985 'default' => true,
10986 ];
10987
10993 public const ExportMaxHistory = [
10994 'default' => 0,
10995 ];
10996
11000 public const ExportAllowListContributors = [
11001 'default' => false,
11002 ];
11003
11015 public const ExportMaxLinkDepth = [
11016 'default' => 0,
11017 ];
11018
11022 public const ExportFromNamespaces = [
11023 'default' => false,
11024 ];
11025
11029 public const ExportAllowAll = [
11030 'default' => false,
11031 ];
11032
11039 public const ExportPagelistLimit = [
11040 'default' => 5000,
11041 ];
11042
11047 public const XmlDumpSchemaVersion = [
11048 'default' => XML_DUMP_SCHEMA_VERSION_11,
11049 ];
11050
11051 // endregion -- end of import/export
11052
11053 /***************************************************************************/
11054 // region Wiki Farm
11066 public const WikiFarmSettingsDirectory = [
11067 'default' => null
11068 ];
11069
11077 public const WikiFarmSettingsExtension = [
11078 'default' => 'yaml'
11079 ];
11080
11081 // endregion -- End Wiki Farm
11082
11083 /***************************************************************************/
11084 // region Extensions
11091 public const ExtensionFunctions = [
11092 'default' => [],
11093 'type' => 'list',
11094 ];
11095
11123 public const ExtensionMessagesFiles = [
11124 'default' => [],
11125 'type' => 'map',
11126 ];
11127
11156 public const MessagesDirs = [
11157 'default' => [],
11158 'type' => 'map',
11159 ];
11160
11187 public const TranslationAliasesDirs = [
11188 'default' => [],
11189 'type' => 'map',
11190 ];
11191
11198 public const ExtensionEntryPointListFiles = [
11199 'default' => [],
11200 'type' => 'map',
11201 ];
11202
11206 public const EnableParserLimitReporting = [
11207 'default' => true,
11208 ];
11209
11235 public const ValidSkinNames = [
11236 'default' => [],
11237 'type' => 'map',
11238 ];
11239
11245 public const SpecialPages = [
11246 'default' => [],
11247 'type' => 'map',
11248 ];
11249
11260 public const AutoloadAttemptLowercase = [
11261 'default' => false,
11262 'obsolete' => 'Since 1.40; no longer has any effect.',
11263 'description' => 'Has been emitting warnings since 1.39 (LTS). ' .
11264 'Can be removed completely in 1.44, assuming 1.43 is an LTS release.'
11265 ];
11266
11325 public const ExtensionCredits = [
11326 'default' => [],
11327 'type' => 'map',
11328 ];
11329
11359 public const Hooks = [
11360 'default' => [],
11361 'type' => 'map',
11362 'mergeStrategy' => 'array_merge_recursive',
11363 ];
11364
11379 public const ServiceWiringFiles = [
11380 'default' => [],
11381 'type' => 'list',
11382 ];
11383
11402 public const JobClasses = [
11403 'default' => [
11404 'deletePage' => DeletePageJob::class,
11405 'refreshLinks' => RefreshLinksJob::class,
11406 'deleteLinks' => DeleteLinksJob::class,
11407 'htmlCacheUpdate' => HTMLCacheUpdateJob::class,
11408 'sendMail' => [
11409 'class' => EmaillingJob::class,
11410 'services' => [
11411 0 => 'Emailer'
11412 ]
11413 ],
11414 'enotifNotify' => EnotifNotifyJob::class,
11415 'fixDoubleRedirect' => [
11416 'class' => DoubleRedirectJob::class,
11417 'services' => [
11418 'RevisionLookup',
11419 'MagicWordFactory',
11420 'WikiPageFactory',
11421 ],
11422 // This job requires a title
11423 'needsPage' => true,
11424 ],
11425 'AssembleUploadChunks' => AssembleUploadChunksJob::class,
11426 'PublishStashedFile' => PublishStashedFileJob::class,
11427 'ThumbnailRender' => ThumbnailRenderJob::class,
11428 'UploadFromUrl' => UploadFromUrlJob::class,
11429 'recentChangesUpdate' => RecentChangesUpdateJob::class,
11430 'refreshLinksPrioritized' => RefreshLinksJob::class,
11431 'refreshLinksDynamic' => RefreshLinksJob::class,
11432 'activityUpdateJob' => ActivityUpdateJob::class,
11433 'categoryMembershipChange' => CategoryMembershipChangeJob::class,
11434 'clearUserWatchlist' => ClearUserWatchlistJob::class,
11435 'watchlistExpiry' => WatchlistExpiryJob::class,
11436 'cdnPurge' => CdnPurgeJob::class,
11437 'userGroupExpiry' => UserGroupExpiryJob::class,
11438 'clearWatchlistNotifications' => ClearWatchlistNotificationsJob::class,
11439 'userOptionsUpdate' => UserOptionsUpdateJob::class,
11440 'revertedTagUpdate' => RevertedTagUpdateJob::class,
11441 'null' => NullJob::class,
11442 'userEditCountInit' => UserEditCountInitJob::class,
11443 'parsoidCachePrewarm' => [
11444 'class' => ParsoidCachePrewarmJob::class,
11445 'services' => [
11446 'ParsoidOutputAccess',
11447 'PageStore',
11448 'RevisionLookup',
11449 'ParsoidSiteConfig',
11450 ],
11451 // tell the JobFactory not to include the $page parameter in the constructor call
11452 'needsPage' => false
11453 ],
11454 'renameUser' => [
11455 'class' => RenameUserJob::class,
11456 'services' => [
11457 'MainConfig',
11458 'DBLoadBalancerFactory'
11459 ]
11460 ],
11461 ],
11462 'type' => 'map',
11463 ];
11464
11476 public const JobTypesExcludedFromDefaultQueue = [
11477 'default' => [ 'AssembleUploadChunks', 'PublishStashedFile', 'UploadFromUrl' ],
11478 'type' => 'list',
11479 ];
11480
11490 public const JobBackoffThrottling = [
11491 'default' => [],
11492 'type' => 'map',
11493 'additionalProperties' => [ 'type' => 'float', ],
11494 ];
11495
11503 public const JobTypeConf = [
11504 'default' => [
11505 'default' => [
11506 'class' => JobQueueDB::class,
11507 'order' => 'random',
11508 'claimTTL' => 3600
11509 ],
11510 ],
11511 'additionalProperties' => [
11512 'type' => 'object',
11513 'properties' => [
11514 'class' => [ 'type' => 'string' ],
11515 'order' => [ 'type' => 'string' ],
11516 'claimTTL' => [ 'type' => 'int' ]
11517 ],
11518 ],
11519 'type' => 'map',
11520 ];
11521
11534 public const JobQueueIncludeInMaxLagFactor = [
11535 'default' => false,
11536 ];
11537
11543 public const SpecialPageCacheUpdates = [
11544 'default' => [
11545 'Statistics' => [ SiteStatsUpdate::class, 'cacheUpdate' ]
11546 ],
11547 'type' => 'map',
11548 ];
11549
11558 public const PagePropLinkInvalidations = [
11559 'default' => [ 'hiddencat' => 'categorylinks', ],
11560 'type' => 'map',
11561 ];
11562
11563 // endregion -- End extensions
11564
11565 /***************************************************************************/
11566 // region Categories
11573 public const CategoryMagicGallery = [
11574 'default' => true,
11575 ];
11576
11580 public const CategoryPagingLimit = [
11581 'default' => 200,
11582 ];
11583
11610 public const CategoryCollation = [
11611 'default' => 'uppercase',
11612 ];
11613
11625 public const TempCategoryCollations = [
11626 'default' => [],
11627 'type' => 'list',
11628 ];
11629
11644 public const TrackingCategories = [
11645 'default' => [],
11646 'type' => 'list',
11647 'deprecated' => 'since 1.25 Extensions should now register tracking categories using ' .
11648 'the new extension registration system.',
11649 ];
11650
11651 // endregion -- End categories
11652
11653 /***************************************************************************/
11654 // region Logging
11666 public const LogTypes = [
11667 'default' => [
11668 '',
11669 'block',
11670 'protect',
11671 'rights',
11672 'delete',
11673 'upload',
11674 'move',
11675 'import',
11676 'patrol',
11677 'merge',
11678 'suppress',
11679 'tag',
11680 'managetags',
11681 'contentmodel',
11682 'renameuser',
11683 ],
11684 'type' => 'list',
11685 ];
11686
11694 public const LogRestrictions = [
11695 'default' => [ 'suppress' => 'suppressionlog', ],
11696 'type' => 'map',
11697 ];
11698
11717 public const FilterLogTypes = [
11718 'default' => [
11719 'patrol' => true,
11720 'tag' => true,
11721 'newusers' => false,
11722 ],
11723 'type' => 'map',
11724 ];
11725
11735 public const LogNames = [
11736 'default' => [
11737 '' => 'all-logs-page',
11738 'block' => 'blocklogpage',
11739 'protect' => 'protectlogpage',
11740 'rights' => 'rightslog',
11741 'delete' => 'dellogpage',
11742 'upload' => 'uploadlogpage',
11743 'move' => 'movelogpage',
11744 'import' => 'importlogpage',
11745 'patrol' => 'patrol-log-page',
11746 'merge' => 'mergelog',
11747 'suppress' => 'suppressionlog',
11748 ],
11749 'type' => 'map',
11750 ];
11751
11761 public const LogHeaders = [
11762 'default' => [
11763 '' => 'alllogstext',
11764 'block' => 'blocklogtext',
11765 'delete' => 'dellogpagetext',
11766 'import' => 'importlogpagetext',
11767 'merge' => 'mergelogpagetext',
11768 'move' => 'movelogpagetext',
11769 'patrol' => 'patrol-log-header',
11770 'protect' => 'protectlogtext',
11771 'rights' => 'rightslogtext',
11772 'suppress' => 'suppressionlogtext',
11773 'upload' => 'uploadlogpagetext',
11774 ],
11775 'type' => 'map',
11776 ];
11777
11785 public const LogActions = [
11786 'default' => [],
11787 'type' => 'map',
11788 ];
11789
11799 public const LogActionsHandlers = [
11800 'default' => [
11801 'block/block' => BlockLogFormatter::class,
11802 'block/reblock' => BlockLogFormatter::class,
11803 'block/unblock' => BlockLogFormatter::class,
11804 'contentmodel/change' => ContentModelLogFormatter::class,
11805 'contentmodel/new' => ContentModelLogFormatter::class,
11806 'delete/delete' => DeleteLogFormatter::class,
11807 'delete/delete_redir' => DeleteLogFormatter::class,
11808 'delete/delete_redir2' => DeleteLogFormatter::class,
11809 'delete/event' => DeleteLogFormatter::class,
11810 'delete/restore' => DeleteLogFormatter::class,
11811 'delete/revision' => DeleteLogFormatter::class,
11812 'import/interwiki' => ImportLogFormatter::class,
11813 'import/upload' => ImportLogFormatter::class,
11814 'managetags/activate' => LogFormatter::class,
11815 'managetags/create' => LogFormatter::class,
11816 'managetags/deactivate' => LogFormatter::class,
11817 'managetags/delete' => LogFormatter::class,
11818 'merge/merge' => MergeLogFormatter::class,
11819 'move/move' => MoveLogFormatter::class,
11820 'move/move_redir' => MoveLogFormatter::class,
11821 'patrol/patrol' => PatrolLogFormatter::class,
11822 'patrol/autopatrol' => PatrolLogFormatter::class,
11823 'protect/modify' => ProtectLogFormatter::class,
11824 'protect/move_prot' => ProtectLogFormatter::class,
11825 'protect/protect' => ProtectLogFormatter::class,
11826 'protect/unprotect' => ProtectLogFormatter::class,
11827 'renameuser/renameuser' => RenameuserLogFormatter::class,
11828 'rights/autopromote' => RightsLogFormatter::class,
11829 'rights/rights' => RightsLogFormatter::class,
11830 'suppress/block' => BlockLogFormatter::class,
11831 'suppress/delete' => DeleteLogFormatter::class,
11832 'suppress/event' => DeleteLogFormatter::class,
11833 'suppress/reblock' => BlockLogFormatter::class,
11834 'suppress/revision' => DeleteLogFormatter::class,
11835 'tag/update' => TagLogFormatter::class,
11836 'upload/overwrite' => UploadLogFormatter::class,
11837 'upload/revert' => UploadLogFormatter::class,
11838 'upload/upload' => UploadLogFormatter::class,
11839 ],
11840 'type' => 'map',
11841 ];
11842
11852 public const ActionFilteredLogs = [
11853 'default' => [
11854 'block' => [
11855 'block' => [ 'block' ],
11856 'reblock' => [ 'reblock' ],
11857 'unblock' => [ 'unblock' ],
11858 ],
11859 'contentmodel' => [
11860 'change' => [ 'change' ],
11861 'new' => [ 'new' ],
11862 ],
11863 'delete' => [
11864 'delete' => [ 'delete' ],
11865 'delete_redir' => [ 'delete_redir', 'delete_redir2' ],
11866 'restore' => [ 'restore' ],
11867 'event' => [ 'event' ],
11868 'revision' => [ 'revision' ],
11869 ],
11870 'import' => [
11871 'interwiki' => [ 'interwiki' ],
11872 'upload' => [ 'upload' ],
11873 ],
11874 'managetags' => [
11875 'create' => [ 'create' ],
11876 'delete' => [ 'delete' ],
11877 'activate' => [ 'activate' ],
11878 'deactivate' => [ 'deactivate' ],
11879 ],
11880 'move' => [
11881 'move' => [ 'move' ],
11882 'move_redir' => [ 'move_redir' ],
11883 ],
11884 'newusers' => [
11885 'create' => [ 'create', 'newusers' ],
11886 'create2' => [ 'create2' ],
11887 'autocreate' => [ 'autocreate' ],
11888 'byemail' => [ 'byemail' ],
11889 ],
11890 'protect' => [
11891 'protect' => [ 'protect' ],
11892 'modify' => [ 'modify' ],
11893 'unprotect' => [ 'unprotect' ],
11894 'move_prot' => [ 'move_prot' ],
11895 ],
11896 'rights' => [
11897 'rights' => [ 'rights' ],
11898 'autopromote' => [ 'autopromote' ],
11899 ],
11900 'suppress' => [
11901 'event' => [ 'event' ],
11902 'revision' => [ 'revision' ],
11903 'delete' => [ 'delete' ],
11904 'block' => [ 'block' ],
11905 'reblock' => [ 'reblock' ],
11906 ],
11907 'upload' => [
11908 'upload' => [ 'upload' ],
11909 'overwrite' => [ 'overwrite' ],
11910 'revert' => [ 'revert' ],
11911 ],
11912 ],
11913 'type' => 'map',
11914 ];
11915
11919 public const NewUserLog = [
11920 'default' => true,
11921 ];
11922
11928 public const PageCreationLog = [
11929 'default' => true,
11930 ];
11931
11932 // endregion -- end logging
11933
11934 /***************************************************************************/
11935 // region Special pages (general and miscellaneous)
11941 public const AllowSpecialInclusion = [
11942 'default' => true,
11943 ];
11944
11951 public const DisableQueryPageUpdate = [
11952 'default' => false,
11953 ];
11954
11959 public const CountCategorizedImagesAsUsed = [
11960 'default' => false,
11961 ];
11962
11967 public const MaxRedirectLinksRetrieved = [
11968 'default' => 500,
11969 ];
11970
11977 public const RangeContributionsCIDRLimit = [
11978 'default' => [
11979 'IPv4' => 16,
11980 'IPv6' => 32,
11981 ],
11982 'type' => 'map',
11983 'additionalProperties' => [ 'type' => 'integer', ],
11984 ];
11985
11986 // endregion -- end special pages
11987
11988 /***************************************************************************/
11989 // region Actions
11998 public const Actions = [
11999 'default' => [],
12000 'type' => 'map',
12001 ];
12002
12003 // endregion -- end actions
12004
12005 /***************************************************************************/
12006 // region Robot (search engine crawler) policy
12008 // See also $wgNoFollowLinks.
12009
12015 public const DefaultRobotPolicy = [
12016 'default' => 'index,follow',
12017 ];
12018
12034 public const NamespaceRobotPolicies = [
12035 'default' => [],
12036 'type' => 'map',
12037 ];
12038
12068 public const ArticleRobotPolicies = [
12069 'default' => [],
12070 'type' => 'map',
12071 ];
12072
12084 public const ExemptFromUserRobotsControl = [
12085 'default' => null,
12086 'type' => '?list',
12087 ];
12088
12089 // endregion End robot policy
12090
12091 /***************************************************************************/
12092 // region Action API and REST API
12109 public const DebugAPI = [
12110 'default' => false,
12111 ];
12112
12148 public const APIModules = [
12149 'default' => [],
12150 'type' => 'map',
12151 ];
12152
12161 public const APIFormatModules = [
12162 'default' => [],
12163 'type' => 'map',
12164 ];
12165
12174 public const APIMetaModules = [
12175 'default' => [],
12176 'type' => 'map',
12177 ];
12178
12187 public const APIPropModules = [
12188 'default' => [],
12189 'type' => 'map',
12190 ];
12191
12200 public const APIListModules = [
12201 'default' => [],
12202 'type' => 'map',
12203 ];
12204
12209 public const APIMaxDBRows = [
12210 'default' => 5000,
12211 ];
12212
12218 public const APIMaxResultSize = [
12219 'default' => 8_388_608,
12220 ];
12221
12226 public const APIMaxUncachedDiffs = [
12227 'default' => 1,
12228 ];
12229
12236 public const APIMaxLagThreshold = [
12237 'default' => 7,
12238 ];
12239
12244 public const APIRequestLog = [
12245 'default' => false,
12246 ];
12247
12251 public const APICacheHelpTimeout = [
12252 'default' => 60 * 60,
12253 ];
12254
12259 public const APIUselessQueryPages = [
12260 'default' => [
12261 'MIMEsearch',
12262 'LinkSearch',
12263 ],
12264 'type' => 'list',
12265 ];
12266
12270 public const AjaxLicensePreview = [
12271 'default' => true,
12272 ];
12273
12296 public const CrossSiteAJAXdomains = [
12297 'default' => [],
12298 'type' => 'map',
12299 ];
12300
12306 public const CrossSiteAJAXdomainExceptions = [
12307 'default' => [],
12308 'type' => 'map',
12309 ];
12310
12314 public const AllowedCorsHeaders = [
12315 'default' => [
12316 /* simple headers (see spec) */
12317 'Accept',
12318 'Accept-Language',
12319 'Content-Language',
12320 'Content-Type',
12321 /* non-authorable headers in XHR, which are however requested by some UAs */
12322 'Accept-Encoding',
12323 'DNT',
12324 'Origin',
12325 /* MediaWiki whitelist */
12326 'User-Agent',
12327 'Api-User-Agent',
12328 /* Allowing caching preflight requests, see T269636 */
12329 'Access-Control-Max-Age',
12330 /* OAuth 2.0, see T322944 */
12331 'Authorization',
12332 ],
12333 'type' => 'list',
12334 ];
12335
12341 public const RestAPIAdditionalRouteFiles = [
12342 'default' => [],
12343 'type' => 'list',
12344 ];
12345
12346 // endregion -- End AJAX and API
12347
12348 /***************************************************************************/
12349 // region Shell and process control
12355 public const MaxShellMemory = [
12356 'default' => 307_200,
12357 ];
12358
12363 public const MaxShellFileSize = [
12364 'default' => 102_400,
12365 ];
12366
12370 public const MaxShellTime = [
12371 'default' => 180,
12372 ];
12373
12378 public const MaxShellWallClockTime = [
12379 'default' => 180,
12380 ];
12381
12405 public const ShellCgroup = [
12406 'default' => false,
12407 ];
12408
12412 public const PhpCli = [
12413 'default' => '/usr/bin/php',
12414 ];
12415
12428 public const ShellRestrictionMethod = [
12429 'default' => 'autodetect',
12430 'type' => 'string|false',
12431 ];
12432
12446 public const ShellboxUrls = [
12447 'default' => [ 'default' => null, ],
12448 'type' => 'map',
12449 'additionalProperties' => [
12450 'type' => 'string|false|null',
12451 ],
12452 ];
12453
12460 public const ShellboxSecretKey = [
12461 'default' => null,
12462 'type' => '?string',
12463 ];
12464
12474 public const ShellboxShell = [
12475 'default' => '/bin/sh',
12476 'type' => '?string',
12477 ];
12478
12479 // endregion -- end Shell and process control
12480
12481 /***************************************************************************/
12482 // region HTTP client
12490 public const HTTPTimeout = [
12491 'default' => 25,
12492 'type' => 'float',
12493 ];
12494
12502 public const HTTPConnectTimeout = [
12503 'default' => 5.0,
12504 'type' => 'float',
12505 ];
12506
12514 public const HTTPMaxTimeout = [
12515 'default' => 0,
12516 'type' => 'float',
12517 ];
12518
12526 public const HTTPMaxConnectTimeout = [
12527 'default' => 0,
12528 'type' => 'float',
12529 ];
12530
12536 public const HTTPImportTimeout = [
12537 'default' => 25,
12538 ];
12539
12543 public const AsyncHTTPTimeout = [
12544 'default' => 25,
12545 ];
12546
12550 public const HTTPProxy = [
12551 'default' => '',
12552 ];
12553
12569 public const LocalVirtualHosts = [
12570 'default' => [],
12571 'type' => 'map',
12572 ];
12573
12585 public const LocalHTTPProxy = [
12586 'default' => false,
12587 'type' => 'string|false',
12588 ];
12589
12599 public const AllowExternalReqID = [
12600 'default' => false,
12601 ];
12602
12603 // endregion -- End HTTP client
12604
12605 /***************************************************************************/
12606 // region Job queue
12626 public const JobRunRate = [
12627 'default' => 1,
12628 ];
12629
12637 public const RunJobsAsync = [
12638 'default' => false,
12639 ];
12640
12644 public const UpdateRowsPerJob = [
12645 'default' => 300,
12646 ];
12647
12651 public const UpdateRowsPerQuery = [
12652 'default' => 100,
12653 ];
12654
12655 // endregion -- End job queue
12656
12657 /***************************************************************************/
12658 // region Miscellaneous
12666 public const RedirectOnLogin = [
12667 'default' => null,
12668 ];
12669
12706 public const VirtualRestConfig = [
12707 'default' => [
12708 'paths' => [],
12709 'modules' => [],
12710 'global' => [
12711 # Timeout in seconds
12712 'timeout' => 360,
12713 # 'domain' is set to $wgCanonicalServer in Setup.php
12714 'forwardCookies' => false,
12715 'HTTPProxy' => null
12716 ]
12717 ],
12718 'mergeStrategy' => 'array_plus_2d',
12719 'type' => 'map',
12720 ];
12721
12744 public const EventRelayerConfig = [
12745 'default' => [
12746 'default' => [ 'class' => EventRelayerNull::class, ],
12747 ],
12748 'type' => 'map',
12749 ];
12750
12768 public const Pingback = [
12769 'default' => false,
12770 'type' => 'boolean',
12771 ];
12772
12778 public const OriginTrials = [
12779 'default' => [],
12780 'type' => 'list',
12781 ];
12782
12789 public const ReportToExpiry = [
12790 'default' => 86400,
12791 'type' => 'integer',
12792 ];
12793
12800 public const ReportToEndpoints = [
12801 'default' => [],
12802 'type' => 'list',
12803 ];
12804
12813 public const FeaturePolicyReportOnly = [
12814 'default' => [],
12815 'type' => 'list',
12816 ];
12817
12823 public const SkinsPreferred = [
12824 'default' => [ 'vector-2022', 'vector' ],
12825 'type' => 'list',
12826 ];
12827
12833 public const SpecialContributeSkinsEnabled = [
12834 'default' => [],
12835 'type' => 'list',
12836 ];
12837
12844 public const EnableEditRecovery = [
12845 'default' => false,
12846 'type' => 'boolean',
12847 ];
12848
12852 public const EditRecoveryExpiry = [
12853 'default' => 30 * 24 * 3600,
12854 'type' => 'integer',
12855 ];
12856
12863 public const UseCodexSpecialBlock = [
12864 'default' => false,
12865 'type' => 'boolean',
12866 ];
12867
12874 public const ShowLogoutConfirmation = [
12875 'default' => false,
12876 'type' => 'boolean',
12877 ];
12878 // endregion -- End Miscellaneous
12879
12880}
const SCHEMA_COMPAT_WRITE_BOTH
Definition Defines.php:283
const AV_SCAN_FAILED
Definition Defines.php:100
const SCHEMA_COMPAT_READ_NEW
Definition Defines.php:280
const AV_VIRUS_FOUND
Definition Defines.php:98
const APCOND_AGE
Definition Defines.php:178
const NS_HELP
Definition Defines.php:77
const NS_USER
Definition Defines.php:67
const CONTENT_MODEL_CSS
Definition Defines.php:223
const NS_FILE
Definition Defines.php:71
const CACHE_NONE
Definition Defines.php:87
const CACHE_ANYTHING
Definition Defines.php:86
const NS_MEDIAWIKI_TALK
Definition Defines.php:74
const NS_MAIN
Definition Defines.php:65
const NS_PROJECT_TALK
Definition Defines.php:70
const NS_MEDIAWIKI
Definition Defines.php:73
const NS_TEMPLATE
Definition Defines.php:75
const NS_FILE_TALK
Definition Defines.php:72
const XML_DUMP_SCHEMA_VERSION_11
Definition Defines.php:327
const CONTENT_MODEL_WIKITEXT
Definition Defines.php:221
const CONTENT_MODEL_JSON
Definition Defines.php:225
const NS_HELP_TALK
Definition Defines.php:78
const NS_CATEGORY_TALK
Definition Defines.php:80
const CONTENT_MODEL_TEXT
Definition Defines.php:224
const SCHEMA_COMPAT_WRITE_NEW
Definition Defines.php:279
const CACHE_DB
Definition Defines.php:88
const AV_SCAN_ABORTED
Definition Defines.php:99
const APCOND_EDITCOUNT
Definition Defines.php:177
const NS_TALK
Definition Defines.php:66
const SCHEMA_COMPAT_NEW
Definition Defines.php:289
const AV_NO_VIRUS
Definition Defines.php:97
const NS_USER_TALK
Definition Defines.php:68
const CONTENT_MODEL_UNKNOWN
Definition Defines.php:226
const NS_PROJECT
Definition Defines.php:69
const NS_CATEGORY
Definition Defines.php:79
const CONTENT_MODEL_JAVASCRIPT
Definition Defines.php:222
const NS_TEMPLATE_TALK
Definition Defines.php:76
if(!defined('MW_SETUP_CALLBACK'))
Definition WebStart.php:81
This is a wrapper for APCu's shared memory functions.
Assemble the segments of a chunked upload.
This class formats block log entries.
Job to add recent change entries mentioning category membership changes.
Job to purge a set of URLs from CDN.
Job to prune link tables for pages that were deleted.
This class formats delete log entries.
Fix any double redirects after moving a page.
Send an arbitrary single email.
A BagOStuff object with no objects in it.
Send an email notification.
Maintenance script that fixes double redirects.
Job to purge the HTML/file cache for all pages that link to or use another page or file.
Simple store for keeping values in an associative array for the current process.
This class formats import log entries.
Database-backed job queue storage.
Methods for dealing with language codes.
Local repository that stores files in the local filesystem and registers them in the wiki's own datab...
Definition LocalRepo.php:49
Caching for the contents of localisation files.
Implements the default log formatting.
Check if the user is blocked, and prevent authentication if so.
Handles email notification / email address confirmation for account creation.
A primary authentication provider that uses the password field in the 'user' table.
This is a value object for authentication requests with a username and password.
Reset the local password, if signalled via $this->manager->setAuthenticationSessionData()
This represents the intention to set a temporary password for the user.
A primary authentication provider that uses the temporary password field in the 'user' table.
A pre-authentication provider to throttle authentication actions.
This class performs some operations related to tracking categories, such as adding a tracking categor...
Content handler for CSS pages.
Content handler implementation for unknown content.
Content handler for JSON text.
Base content handler implementation for flat text contents.
Class for handling updates to the site_stats table.
Send information about this MediaWiki instance to mediawiki.org.
Definition Pingback.php:47
This class contains schema declarations for all configuration variables known to MediaWiki core.
static getDefaultLocalTZoffset( $localtimezone)
Site language code.
static getDefaultLogo( $resourceBasePath)
static getDefaultLoadScript( $scriptPath)
static getDefaultCookieSecure( $forceHTTPS)
Default cookie lifetime, in seconds.
static getDefaultUploadDirectory( $baseDirectory)
static getDefaultLocalFileRepo( $uploadDirectory, $scriptPath, $favicon, $uploadBaseUrl, $uploadPath, $hashedUploadDirectory, $thumbnailScriptPath, $generateThumbnailOnParse, $deletedDirectory, $updateCompatibleMetadata)
Allow users to upload files.
static getDefaultValue(string $name)
Returns the default value of the given config setting.
static getDefaultReadOnlyFile( $uploadDirectory)
static getDefaultUploadPath( $scriptPath)
static getDefaultMetaNamespace( $sitename)
static getDefaultExtensionAssetsPath( $resourceBasePath)
static getDefaultDeletedDirectory( $uploadDirectory)
static listDefaultValues(string $prefix='')
Returns a generator for iterating over all config settings and their default values.
static getDefaultScript( $scriptPath)
static getDefaultResourceBasePath( $scriptPath)
static getDefaultDBerrorLogTZ( $localtimezone)
Current wiki database name.
static getDefaultSharedPrefix( $dbPrefix)
static getDefaultSharedSchema( $dbMwschema)
static getDefaultLocalStylePath( $scriptPath)
static getDefaultStylePath( $resourceBasePath)
static getDefaultCookiePrefix( $sharedDB, $sharedPrefix, $sharedTables, $dbName, $dbPrefix)
Default cookie lifetime, in seconds.
static getDefaultFileCacheDirectory( $uploadDirectory)
static getDefaultArticlePath(string $script, $usePathInfo)
static getDefaultLocaltimezone()
Site language code.
static getDefaultRestPath( $scriptPath)
Implements Argon2, a modern key derivation algorithm designed to resist GPU cracking and side-channel...
A Bcrypt-hashed password.
This password hash type layers one or more parameterized password types on top of each other.
The old style of MediaWiki password hashing.
The old style of MediaWiki password hashing, with a salt.
Functions to check passwords against a policy requirement.
Users can authorize applications to use their account via OAuth.
Send recent change to a Redis Pub/Sub channel.
Send recent change notifications to a destination address over UDP.
Custom job to perform updates on tables in busier environments.
The WebRequest class encapsulates getting at data passed in the URL or via a POSTed form,...
Class representing a MediaWiki site.
Service for storing and loading Content objects representing revision data blobs.
This is a utility class for dealing with namespaces that encodes all the "magic" behaviors of them ba...
A CentralIdLookup provider that just uses local IDs.
Job for updating user activity like "last viewed" timestamps.
Job to clear a users watchlist in batches.
Job for clearing all of the "last viewed" timestamps for a user's watchlist, or setting them all to t...
A wrapper class for the PECL memcached client.
A wrapper class for the pure-PHP memcached client, exposing a BagOStuff interface.
This class formats merge log entries.
This class formats move log entries.
No-op job that does nothing.
Definition NullJob.php:50
This class formats patrol log entries.
Profiler base class that defines the interface and some shared functionality.
Definition Profiler.php:37
This class formats protect log entries.
Upload a file from the upload stash into the local file repo.
Puurge expired rows from the recentchanges table.
Job to update link tables for rerendered wiki pages.
LogFormatter for renameuser/renameuser logs.
Job for deferring the execution of RevertedTagUpdate.
This class formats rights log entries.
RDBMS-based caching module.
This class formats tag log entries.
Job for asynchronous rendering of thumbnails, e.g.
Upload a file by URL, via the jobqueue.
This class formats upload log entries.
Job that initializes an user's edit count.
Job that purges expired user group memberships.
Job that updates a user's preferences.
Multi-datacenter aware caching interface.
No-op class for publishing messages into a PubSub system.
Content handler for wiki text pages.
Wrapper for WinCache object caching functions; identical interface to the APC wrapper.
return[0=> 'ـ', 1=> ' ', 2=> '`', 3=> '´', 4=> '˜', 5=> '^', 6=> '¯', 7=> '‾', 8=> '˘', 9=> '˙', 10=> '¨', 11=> '˚', 12=> '˝', 13=> '᾽', 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 => '∲', 884 => '∳', 885 => '∴', 886 => '∵', 887 => '∶', 888 => '∷', 889 => '∸', 890 => '∹', 891 => '∺', 892 => '∻', 893 => '∼', 894 => '∽', 895 => '∾', 896 => '∿', 897 => '≀', 898 => '≂', 899 => '≃', 900 => '≅', 901 => '≆', 902 => '≈', 903 => '≊', 904 => '≋', 905 => '≌', 906 => '≍', 907 => '≎', 908 => '≏', 909 => '≐', 910 => '≑', 911 => '≒', 912 => '≓', 913 => '≔', 914 => '≕', 915 => '≖', 916 => '≗', 917 => '≘', 918 => '≙', 919 => '≚', 920 => '≛', 921 => '≜', 922 => '≝', 923 => '≞', 924 => '≟', 925 => '≡', 926 => '≣', 927 => '≤', 928 => '≥', 929 => '≦', 930 => '≧', 931 => '≨', 932 => '≩', 933 => '≪', 934 => '≫', 935 => '≬', 936 => '≲', 937 => '≳', 938 => '≶', 939 => '≷', 940 => '≺', 941 => '≻', 942 => '≼', 943 => '≽', 944 => '≾', 945 => '≿', 946 => '⊂', 947 => '⊃', 948 => '⊆', 949 => '⊇', 950 => '⊊', 951 => '⊋', 952 => '⊌', 953 => '⊍', 954 => '⊎', 955 => '⊏', 956 => '⊐', 957 => '⊑', 958 => '⊒', 959 => '⊓', 960 => '⊔', 961 => '⊕', 962 => '⊖', 963 => '⊗', 964 => '⊘', 965 => '⊙', 966 => '⊚', 967 => '⊛', 968 => '⊜', 969 => '⊝', 970 => '⊞', 971 => '⊟', 972 => '⊠', 973 => '⊡', 974 => '⊢', 975 => '⊣', 976 => '⊤', 977 => '⊥', 978 => '⊦', 979 => '⊧', 980 => '⊨', 981 => '⊩', 982 => '⊪', 983 => '⊫', 984 => '⊰', 985 => '⊱', 986 => '⊲', 987 => '⊳', 988 => '⊴', 989 => '⊵', 990 => '⊶', 991 => '⊷', 992 => '⊸', 993 => '⊹', 994 => '⊺', 995 => '⊻', 996 => '⊼', 997 => '⊽', 998 => '⊾', 999 => '⊿', 1000 => '⋀', 1001 => '⋁', 1002 => '⋂', 1003 => '⋃', 1004 => '⋄', 1005 => '⋅', 1006 => '⋆', 1007 => '⋇', 1008 => '⋈', 1009 => '⋉', 1010 => '⋊', 1011 => '⋋', 1012 => '⋌', 1013 => '⋍', 1014 => '⋎', 1015 => '⋏', 1016 => '⋐', 1017 => '⋑', 1018 => '⋒', 1019 => '⋓', 1020 => '⋔', 1021 => '⋕', 1022 => '⋖', 1023 => '⋗', 1024 => '⋘', 1025 => '⋙', 1026 => '⋚', 1027 => '⋛', 1028 => '⋜', 1029 => '⋝', 1030 => '⋞', 1031 => '⋟', 1032 => '⋤', 1033 => '⋥', 1034 => '⋦', 1035 => '⋧', 1036 => '⋨', 1037 => '⋩', 1038 => '⋮', 1039 => '⋯', 1040 => '⋰', 1041 => '⋱', 1042 => '⋲', 1043 => '⋳', 1044 => '⋴', 1045 => '⋵', 1046 => '⋶', 1047 => '⋷', 1048 => '⋸', 1049 => '⋹', 1050 => '⋺', 1051 => '⋻', 1052 => '⋼', 1053 => '⋽', 1054 => '⋾', 1055 => '⋿', 1056 => '⌀', 1057 => '⌁', 1058 => '⌂', 1059 => '⌃', 1060 => '⌄', 1061 => '⌅', 1062 => '⌆', 1063 => '⌇', 1064 => '⌈', 1065 => '⌉', 1066 => '⌊', 1067 => '⌋', 1068 => '⌌', 1069 => '⌍', 1070 => '⌎', 1071 => '⌏', 1072 => '⌐', 1073 => '⌑', 1074 => '⌒', 1075 => '⌓', 1076 => '⌔', 1077 => '⌕', 1078 => '⌖', 1079 => '⌗', 1080 => '⌘', 1081 => '⌙', 1082 => '⌚', 1083 => '⌛', 1084 => '⌜', 1085 => '⌝', 1086 => '⌞', 1087 => '⌟', 1088 => '⌠', 1089 => '⌡', 1090 => '⌢', 1091 => '⌣', 1092 => '⌤', 1093 => '⌥', 1094 => '⌦', 1095 => '⌧', 1096 => '⌨', 1097 => '⌫', 1098 => '⌬', 1099 => '⌭', 1100 => '⌮', 1101 => '⌯', 1102 => '⌰', 1103 => '⌱', 1104 => '⌲', 1105 => '⌳', 1106 => '⌴', 1107 => '⌵', 1108 => '⌶', 1109 => '⌷', 1110 => '⌸', 1111 => '⌹', 1112 => '⌺', 1113 => '⌻', 1114 => '⌼', 1115 => '⌽', 1116 => '⌾', 1117 => '⌿', 1118 => '⍀', 1119 => '⍁', 1120 => '⍂', 1121 => '⍃', 1122 => '⍄', 1123 => '⍅', 1124 => '⍆', 1125 => '⍇', 1126 => '⍈', 1127 => '⍉', 1128 => '⍊', 1129 => '⍋', 1130 => '⍌', 1131 => '⍍', 1132 => '⍎', 1133 => '⍏', 1134 => '⍐', 1135 => '⍑', 1136 => '⍒', 1137 => '⍓', 1138 => '⍔', 1139 => '⍕', 1140 => '⍖', 1141 => '⍗', 1142 => '⍘', 1143 => '⍙', 1144 => '⍚', 1145 => '⍛', 1146 => '⍜', 1147 => '⍝', 1148 => '⍞', 1149 => '⍟', 1150 => '⍠', 1151 => '⍡', 1152 => '⍢', 1153 => '⍣', 1154 => '⍤', 1155 => '⍥', 1156 => '⍦', 1157 => '⍧', 1158 => '⍨', 1159 => '⍩', 1160 => '⍪', 1161 => '⍫', 1162 => '⍬', 1163 => '⍭', 1164 => '⍮', 1165 => '⍯', 1166 => '⍰', 1167 => '⍱', 1168 => '⍲', 1169 => '⍳', 1170 => '⍴', 1171 => '⍵', 1172 => '⍶', 1173 => '⍷', 1174 => '⍸', 1175 => '⍹', 1176 => '⍺', 1177 => '⍻', 1178 => '⍼', 1179 => '⍽', 1180 => '⍾', 1181 => '⍿', 1182 => '⎀', 1183 => '⎁', 1184 => '⎂', 1185 => '⎃', 1186 => '⎄', 1187 => '⎅', 1188 => '⎆', 1189 => '⎇', 1190 => '⎈', 1191 => '⎉', 1192 => '⎊', 1193 => '⎋', 1194 => '⎌', 1195 => '⎍', 1196 => '⎎', 1197 => '⎏', 1198 => '⎐', 1199 => '⎑', 1200 => '⎒', 1201 => '⎓', 1202 => '⎔', 1203 => '⎕', 1204 => '⎖', 1205 => '⎗', 1206 => '⎘', 1207 => '⎙', 1208 => '⎚', 1209 => '⎛', 1210 => '⎜', 1211 => '⎝', 1212 => '⎞', 1213 => '⎟', 1214 => '⎠', 1215 => '⎡', 1216 => '⎢', 1217 => '⎣', 1218 => '⎤', 1219 => '⎥', 1220 => '⎦', 1221 => '⎧', 1222 => '⎨', 1223 => '⎩', 1224 => '⎪', 1225 => '⎫', 1226 => '⎬', 1227 => '⎭', 1228 => '⎮', 1229 => '⎯', 1230 => '⎰', 1231 => '⎱', 1232 => '⎲', 1233 => '⎳', 1234 => '⎴', 1235 => '⎵', 1236 => '⎶', 1237 => '⎷', 1238 => '⎸', 1239 => '⎹', 1240 => '⎺', 1241 => '⎻', 1242 => '⎼', 1243 => '⎽', 1244 => '⎾', 1245 => '⎿', 1246 => '⏀', 1247 => '⏁', 1248 => '⏂', 1249 => '⏃', 1250 => '⏄', 1251 => '⏅', 1252 => '⏆', 1253 => '⏇', 1254 => '⏈', 1255 => '⏉', 1256 => '⏊', 1257 => '⏋', 1258 => '⏌', 1259 => '⏍', 1260 => '⏎', 1261 => '⏏', 1262 => '⏐', 1263 => '⏑', 1264 => '⏒', 1265 => '⏓', 1266 => '⏔', 1267 => '⏕', 1268 => '⏖', 1269 => '⏗', 1270 => '⏘', 1271 => '⏙', 1272 => '⏚', 1273 => '⏛', 1274 => '⏜', 1275 => '⏝', 1276 => '⏞', 1277 => '⏟', 1278 => '⏠', 1279 => '⏡', 1280 => '⏢', 1281 => '⏣', 1282 => '⏤', 1283 => '⏥', 1284 => '⏦', 1285 => '⏧', 1286 => '⏨', 1287 => '⏩', 1288 => '⏪', 1289 => '⏫', 1290 => '⏬', 1291 => '⏭', 1292 => '⏮', 1293 => '⏯', 1294 => '⏰', 1295 => '⏱', 1296 => '⏲', 1297 => '⏳', 1298 => '␀', 1299 => '␁', 1300 => '␂', 1301 => '␃', 1302 => '␄', 1303 => '␅', 1304 => '␆', 1305 => '␇', 1306 => '␈', 1307 => '␉', 1308 => '␊', 1309 => '␋', 1310 => '␌', 1311 => '␍', 1312 => '␎', 1313 => '␏', 1314 => '␐', 1315 => '␑', 1316 => '␒', 1317 => '␓', 1318 => '␔', 1319 => '␕', 1320 => '␖', 1321 => '␗', 1322 => '␘', 1323 => '␙', 1324 => '␚', 1325 => '␛', 1326 => '␜', 1327 => '␝', 1328 => '␞', 1329 => '␟', 1330 => '␠', 1331 => '␡', 1332 => '␢', 1333 => '␣', 1334 => '␤', 1335 => '␥', 1336 => '␦', 1337 => '⑀', 1338 => '⑁', 1339 => '⑂', 1340 => '⑃', 1341 => '⑄', 1342 => '⑅', 1343 => '⑆', 1344 => '⑇', 1345 => '⑈', 1346 => '⑉', 1347 => '⑊', 1348 => '─', 1349 => '━', 1350 => '│', 1351 => '┃', 1352 => '┄', 1353 => '┅', 1354 => '┆', 1355 => '┇', 1356 => '┈', 1357 => '┉', 1358 => '┊', 1359 => '┋', 1360 => '┌', 1361 => '┍', 1362 => '┎', 1363 => '┏', 1364 => '┐', 1365 => '┑', 1366 => '┒', 1367 => '┓', 1368 => '└', 1369 => '┕', 1370 => '┖', 1371 => '┗', 1372 => '┘', 1373 => '┙', 1374 => '┚', 1375 => '┛', 1376 => '├', 1377 => '┝', 1378 => '┞', 1379 => '┟', 1380 => '┠', 1381 => '┡', 1382 => '┢', 1383 => '┣', 1384 => '┤', 1385 => '┥', 1386 => '┦', 1387 => '┧', 1388 => '┨', 1389 => '┩', 1390 => '┪', 1391 => '┫', 1392 => '┬', 1393 => '┭', 1394 => '┮', 1395 => '┯', 1396 => '┰', 1397 => '┱', 1398 => '┲', 1399 => '┳', 1400 => '┴', 1401 => '┵', 1402 => '┶', 1403 => '┷', 1404 => '┸', 1405 => '┹', 1406 => '┺', 1407 => '┻', 1408 => '┼', 1409 => '┽', 1410 => '┾', 1411 => '┿', 1412 => '╀', 1413 => '╁', 1414 => '╂', 1415 => '╃', 1416 => '╄', 1417 => '╅', 1418 => '╆', 1419 => '╇', 1420 => '╈', 1421 => '╉', 1422 => '╊', 1423 => '╋', 1424 => '╌', 1425 => '╍', 1426 => '╎', 1427 => '╏', 1428 => '═', 1429 => '║', 1430 => '╒', 1431 => '╓', 1432 => '╔', 1433 => '╕', 1434 => '╖', 1435 => '╗', 1436 => '╘', 1437 => '╙', 1438 => '╚', 1439 => '╛', 1440 => '╜', 1441 => '╝', 1442 => '╞', 1443 => '╟', 1444 => '╠', 1445 => '╡', 1446 => '╢', 1447 => '╣', 1448 => '╤', 1449 => '╥', 1450 => '╦', 1451 => '╧', 1452 => '╨', 1453 => '╩', 1454 => '╪', 1455 => '╫', 1456 => '╬', 1457 => '╭', 1458 => '╮', 1459 => '╯', 1460 => '╰', 1461 => '╱', 1462 => '╲', 1463 => '╳', 1464 => '╴', 1465 => '╵', 1466 => '╶', 1467 => '╷', 1468 => '╸', 1469 => '╹', 1470 => '╺', 1471 => '╻', 1472 => '╼', 1473 => '╽', 1474 => '╾', 1475 => '╿', 1476 => '▀', 1477 => '▁', 1478 => '▂', 1479 => '▃', 1480 => '▄', 1481 => '▅', 1482 => '▆', 1483 => '▇', 1484 => '█', 1485 => '▉', 1486 => '▊', 1487 => '▋', 1488 => '▌', 1489 => '▍', 1490 => '▎', 1491 => '▏', 1492 => '▐', 1493 => '░', 1494 => '▒', 1495 => '▓', 1496 => '▔', 1497 => '▕', 1498 => '▖', 1499 => '▗', 1500 => '▘', 1501 => '▙', 1502 => '▚', 1503 => '▛', 1504 => '▜', 1505 => '▝', 1506 => '▞', 1507 => '▟', 1508 => '■', 1509 => '□', 1510 => '▢', 1511 => '▣', 1512 => '▤', 1513 => '▥', 1514 => '▦', 1515 => '▧', 1516 => '▨', 1517 => '▩', 1518 => '▪', 1519 => '▫', 1520 => '▬', 1521 => '▭', 1522 => '▮', 1523 => '▯', 1524 => '▰', 1525 => '▱', 1526 => '▲', 1527 => '△', 1528 => '▴', 1529 => '▵', 1530 => '▶', 1531 => '▷', 1532 => '▸', 1533 => '▹', 1534 => '►', 1535 => '▻', 1536 => '▼', 1537 => '▽', 1538 => '▾', 1539 => '▿', 1540 => '◀', 1541 => '◁', 1542 => '◂', 1543 => '◃', 1544 => '◄', 1545 => '◅', 1546 => '◆', 1547 => '◇', 1548 => '◈', 1549 => '◉', 1550 => '◊', 1551 => '○', 1552 => '◌', 1553 => '◍', 1554 => '◎', 1555 => '●', 1556 => '◐', 1557 => '◑', 1558 => '◒', 1559 => '◓', 1560 => '◔', 1561 => '◕', 1562 => '◖', 1563 => '◗', 1564 => '◘', 1565 => '◙', 1566 => '◚', 1567 => '◛', 1568 => '◜', 1569 => '◝', 1570 => '◞', 1571 => '◟', 1572 => '◠', 1573 => '◡', 1574 => '◢', 1575 => '◣', 1576 => '◤', 1577 => '◥', 1578 => '◦', 1579 => '◧', 1580 => '◨', 1581 => '◩', 1582 => '◪', 1583 => '◫', 1584 => '◬', 1585 => '◭', 1586 => '◮', 1587 => '◯', 1588 => '◰', 1589 => '◱', 1590 => '◲', 1591 => '◳', 1592 => '◴', 1593 => '◵', 1594 => '◶', 1595 => '◷', 1596 => '◸', 1597 => '◹', 1598 => '◺', 1599 => '◻', 1600 => '◼', 1601 => '◽', 1602 => '◾', 1603 => '◿', 1604 => '☀', 1605 => '☁', 1606 => '☂', 1607 => '☃', 1608 => '☄', 1609 => '★', 1610 => '☆', 1611 => '☇', 1612 => '☈', 1613 => '☉', 1614 => '☊', 1615 => '☋', 1616 => '☌', 1617 => '☍', 1618 => '☎', 1619 => '☏', 1620 => '☐', 1621 => '☑', 1622 => '☒', 1623 => '☓', 1624 => '☔', 1625 => '☕', 1626 => '☖', 1627 => '☗', 1628 => '☘', 1629 => '☙', 1630 => '☚', 1631 => '☛', 1632 => '☜', 1633 => '☝', 1634 => '☞', 1635 => '☟', 1636 => '☠', 1637 => '☡', 1638 => '☢', 1639 => '☣', 1640 => '☤', 1641 => '☥', 1642 => '☦', 1643 => '☧', 1644 => '☨', 1645 => '☩', 1646 => '☪', 1647 => '☫', 1648 => '☬', 1649 => '☭', 1650 => '☮', 1651 => '☯', 1652 => '☸', 1653 => '☹', 1654 => '☺', 1655 => '☻', 1656 => '☼', 1657 => '☽', 1658 => '☾', 1659 => '☿', 1660 => '♀', 1661 => '♁', 1662 => '♂', 1663 => '♃', 1664 => '♄', 1665 => '♅', 1666 => '♆', 1667 => '♇', 1668 => '♈', 1669 => '♉', 1670 => '♊', 1671 => '♋', 1672 => '♌', 1673 => '♍', 1674 => '♎', 1675 => '♏', 1676 => '♐', 1677 => '♑', 1678 => '♒', 1679 => '♓', 1680 => '♔', 1681 => '♕', 1682 => '♖', 1683 => '♗', 1684 => '♘', 1685 => '♙', 1686 => '♚', 1687 => '♛', 1688 => '♜', 1689 => '♝', 1690 => '♞', 1691 => '♟', 1692 => '♠', 1693 => '♡', 1694 => '♢', 1695 => '♣', 1696 => '♤', 1697 => '♥', 1698 => '♦', 1699 => '♧', 1700 => '♨', 1701 => '♩', 1702 => '♪', 1703 => '♫', 1704 => '♬', 1705 => '♰', 1706 => '♱', 1707 => '♲', 1708 => '♳', 1709 => '♴', 1710 => '♵', 1711 => '♶', 1712 => '♷', 1713 => '♸', 1714 => '♹', 1715 => '♺', 1716 => '♻', 1717 => '♼', 1718 => '♽', 1719 => '♾', 1720 => '♿', 1721 => '⚀', 1722 => '⚁', 1723 => '⚂', 1724 => '⚃', 1725 => '⚄', 1726 => '⚅', 1727 => '⚆', 1728 => '⚇', 1729 => '⚈', 1730 => '⚉', 1731 => '⚐', 1732 => '⚑', 1733 => '⚒', 1734 => '⚓', 1735 => '⚔', 1736 => '⚕', 1737 => '⚖', 1738 => '⚗', 1739 => '⚘', 1740 => '⚙', 1741 => '⚚', 1742 => '⚛', 1743 => '⚜', 1744 => '⚝', 1745 => '⚞', 1746 => '⚟', 1747 => '⚠', 1748 => '⚡', 1749 => '⚢', 1750 => '⚣', 1751 => '⚤', 1752 => '⚥', 1753 => '⚦', 1754 => '⚧', 1755 => '⚨', 1756 => '⚩', 1757 => '⚪', 1758 => '⚫', 1759 => '⚬', 1760 => '⚭', 1761 => '⚮', 1762 => '⚯', 1763 => '⚰', 1764 => '⚱', 1765 => '⚲', 1766 => '⚳', 1767 => '⚴', 1768 => '⚵', 1769 => '⚶', 1770 => '⚷', 1771 => '⚸', 1772 => '⚹', 1773 => '⚺', 1774 => '⚻', 1775 => '⚼', 1776 => '⚽', 1777 => '⚾', 1778 => '⚿', 1779 => '⛀', 1780 => '⛁', 1781 => '⛂', 1782 => '⛃', 1783 => '⛄', 1784 => '⛅', 1785 => '⛆', 1786 => '⛇', 1787 => '⛈', 1788 => '⛉', 1789 => '⛊', 1790 => '⛋', 1791 => '⛌', 1792 => '⛍', 1793 => '⛎', 1794 => '⛏', 1795 => '⛐', 1796 => '⛑', 1797 => '⛒', 1798 => '⛓', 1799 => '⛔', 1800 => '⛕', 1801 => '⛖', 1802 => '⛗', 1803 => '⛘', 1804 => '⛙', 1805 => '⛚', 1806 => '⛛', 1807 => '⛜', 1808 => '⛝', 1809 => '⛞', 1810 => '⛟', 1811 => '⛠', 1812 => '⛡', 1813 => '⛢', 1814 => '⛣', 1815 => '⛤', 1816 => '⛥', 1817 => '⛦', 1818 => '⛧', 1819 => '⛨', 1820 => '⛩', 1821 => '⛪', 1822 => '⛫', 1823 => '⛬', 1824 => '⛭', 1825 => '⛮', 1826 => '⛯', 1827 => '⛰', 1828 => '⛱', 1829 => '⛲', 1830 => '⛳', 1831 => '⛴', 1832 => '⛵', 1833 => '⛶', 1834 => '⛷', 1835 => '⛸', 1836 => '⛹', 1837 => '⛺', 1838 => '⛻', 1839 => '⛼', 1840 => '⛽', 1841 => '⛾', 1842 => '⛿', 1843 => '✁', 1844 => '✂', 1845 => '✃', 1846 => '✄', 1847 => '✅', 1848 => '✆', 1849 => '✇', 1850 => '✈', 1851 => '✉', 1852 => '✊', 1853 => '✋', 1854 => '✌', 1855 => '✍', 1856 => '✎', 1857 => '✏', 1858 => '✐', 1859 => '✑', 1860 => '✒', 1861 => '✓', 1862 => '✔', 1863 => '✕', 1864 => '✖', 1865 => '✗', 1866 => '✘', 1867 => '✙', 1868 => '✚', 1869 => '✛', 1870 => '✜', 1871 => '✝', 1872 => '✞', 1873 => '✟', 1874 => '✠', 1875 => '✡', 1876 => '✢', 1877 => '✣', 1878 => '✤', 1879 => '✥', 1880 => '✦', 1881 => '✧', 1882 => '✨', 1883 => '✩', 1884 => '✪', 1885 => '✫', 1886 => '✬', 1887 => '✭', 1888 => '✮', 1889 => '✯', 1890 => '✰', 1891 => '✱', 1892 => '✲', 1893 => '✳', 1894 => '✴', 1895 => '✵', 1896 => '✶', 1897 => '✷', 1898 => '✸', 1899 => '✹', 1900 => '✺', 1901 => '✻', 1902 => '✼', 1903 => '✽', 1904 => '✾', 1905 => '✿', 1906 => '❀', 1907 => '❁', 1908 => '❂', 1909 => '❃', 1910 => '❄', 1911 => '❅', 1912 => '❆', 1913 => '❇', 1914 => '❈', 1915 => '❉', 1916 => '❊', 1917 => '❋', 1918 => '❌', 1919 => '❍', 1920 => '❎', 1921 => '❏', 1922 => '❐', 1923 => '❑', 1924 => '❒', 1925 => '❓', 1926 => '❔', 1927 => '❕', 1928 => '❖', 1929 => '❗', 1930 => '❘', 1931 => '❙', 1932 => '❚', 1933 => '❛', 1934 => '❜', 1935 => '❝', 1936 => '❞', 1937 => '❟', 1938 => '❠', 1939 => '❡', 1940 => '❢', 1941 => '❣', 1942 => '❤', 1943 => '❥', 1944 => '❦', 1945 => '❧', 1946 => '❨', 1947 => '❩', 1948 => '❪', 1949 => '❫', 1950 => '❬', 1951 => '❭', 1952 => '❮', 1953 => '❯', 1954 => '❰', 1955 => '❱', 1956 => '❲', 1957 => '❳', 1958 => '❴', 1959 => '❵', 1960 => '➔', 1961 => '➕', 1962 => '➖', 1963 => '➗', 1964 => '➘', 1965 => '➙', 1966 => '➚', 1967 => '➛', 1968 => '➜', 1969 => '➝', 1970 => '➞', 1971 => '➟', 1972 => '➠', 1973 => '➡', 1974 => '➢', 1975 => '➣', 1976 => '➤', 1977 => '➥', 1978 => '➦', 1979 => '➧', 1980 => '➨', 1981 => '➩', 1982 => '➪', 1983 => '➫', 1984 => '➬', 1985 => '➭', 1986 => '➮', 1987 => '➯', 1988 => '➰', 1989 => '➱', 1990 => '➲', 1991 => '➳', 1992 => '➴', 1993 => '➵', 1994 => '➶', 1995 => '➷', 1996 => '➸', 1997 => '➹', 1998 => '➺', 1999 => '➻', 2000 => '➼', 2001 => '➽', 2002 => '➾', 2003 => '➿', 2004 => '⟀', 2005 => '⟁', 2006 => '⟂', 2007 => '⟃', 2008 => '⟄', 2009 => '⟅', 2010 => '⟆', 2011 => '⟇', 2012 => '⟈', 2013 => '⟉', 2014 => '⟊', 2015 => '⟌', 2016 => '⟎', 2017 => '⟏', 2018 => '⟐', 2019 => '⟑', 2020 => '⟒', 2021 => '⟓', 2022 => '⟔', 2023 => '⟕', 2024 => '⟖', 2025 => '⟗', 2026 => '⟘', 2027 => '⟙', 2028 => '⟚', 2029 => '⟛', 2030 => '⟜', 2031 => '⟝', 2032 => '⟞', 2033 => '⟟', 2034 => '⟠', 2035 => '⟡', 2036 => '⟢', 2037 => '⟣', 2038 => '⟤', 2039 => '⟥', 2040 => '⟦', 2041 => '⟧', 2042 => '⟨', 2043 => '⟩', 2044 => '⟪', 2045 => '⟫', 2046 => '⟰', 2047 => '⟱', 2048 => '⟲', 2049 => '⟳', 2050 => '⟴', 2051 => '⟵', 2052 => '⟶', 2053 => '⟷', 2054 => '⟸', 2055 => '⟹', 2056 => '⟺', 2057 => '⟻', 2058 => '⟼', 2059 => '⟽', 2060 => '⟾', 2061 => '⟿', 2062 => '⤀', 2063 => '⤁', 2064 => '⤂', 2065 => '⤃', 2066 => '⤄', 2067 => '⤅', 2068 => '⤆', 2069 => '⤇', 2070 => '⤈', 2071 => '⤉', 2072 => '⤊', 2073 => '⤋', 2074 => '⤌', 2075 => '⤍', 2076 => '⤎', 2077 => '⤏', 2078 => '⤐', 2079 => '⤑', 2080 => '⤒', 2081 => '⤓', 2082 => '⤔', 2083 => '⤕', 2084 => '⤖', 2085 => '⤗', 2086 => '⤘', 2087 => '⤙', 2088 => '⤚', 2089 => '⤛', 2090 => '⤜', 2091 => '⤝', 2092 => '⤞', 2093 => '⤟', 2094 => '⤠', 2095 => '⤡', 2096 => '⤢', 2097 => '⤣', 2098 => '⤤', 2099 => '⤥', 2100 => '⤦', 2101 => '⤧', 2102 => '⤨', 2103 => '⤩', 2104 => '⤪', 2105 => '⤫', 2106 => '⤬', 2107 => '⤭', 2108 => '⤮', 2109 => '⤯', 2110 => '⤰', 2111 => '⤱', 2112 => '⤲', 2113 => '⤳', 2114 => '⤴', 2115 => '⤵', 2116 => '⤶', 2117 => '⤷', 2118 => '⤸', 2119 => '⤹', 2120 => '⤺', 2121 => '⤻', 2122 => '⤼', 2123 => '⤽', 2124 => '⤾', 2125 => '⤿', 2126 => '⥀', 2127 => '⥁', 2128 => '⥂', 2129 => '⥃', 2130 => '⥄', 2131 => '⥅', 2132 => '⥆', 2133 => '⥇', 2134 => '⥈', 2135 => '⥉', 2136 => '⥊', 2137 => '⥋', 2138 => '⥌', 2139 => '⥍', 2140 => '⥎', 2141 => '⥏', 2142 => '⥐', 2143 => '⥑', 2144 => '⥒', 2145 => '⥓', 2146 => '⥔', 2147 => '⥕', 2148 => '⥖', 2149 => '⥗', 2150 => '⥘', 2151 => '⥙', 2152 => '⥚', 2153 => '⥛', 2154 => '⥜', 2155 => '⥝', 2156 => '⥞', 2157 => '⥟', 2158 => '⥠', 2159 => '⥡', 2160 => '⥢', 2161 => '⥣', 2162 => '⥤', 2163 => '⥥', 2164 => '⥦', 2165 => '⥧', 2166 => '⥨', 2167 => '⥩', 2168 => '⥪', 2169 => '⥫', 2170 => '⥬', 2171 => '⥭', 2172 => '⥮', 2173 => '⥯', 2174 => '⥰', 2175 => '⥱', 2176 => '⥲', 2177 => '⥳', 2178 => '⥴', 2179 => '⥵', 2180 => '⥶', 2181 => '⥷', 2182 => '⥸', 2183 => '⥹', 2184 => '⥺', 2185 => '⥻', 2186 => '⥼', 2187 => '⥽', 2188 => '⥾', 2189 => '⥿', 2190 => '⦀', 2191 => '⦁', 2192 => '⦂', 2193 => '⦙', 2194 => '⦚', 2195 => '⦛', 2196 => '⦜', 2197 => '⦝', 2198 => '⦞', 2199 => '⦟', 2200 => '⦠', 2201 => '⦡', 2202 => '⦢', 2203 => '⦣', 2204 => '⦤', 2205 => '⦥', 2206 => '⦦', 2207 => '⦧', 2208 => '⦨', 2209 => '⦩', 2210 => '⦪', 2211 => '⦫', 2212 => '⦬', 2213 => '⦭', 2214 => '⦮', 2215 => '⦯', 2216 => '⦰', 2217 => '⦱', 2218 => '⦲', 2219 => '⦳', 2220 => '⦴', 2221 => '⦵', 2222 => '⦶', 2223 => '⦷', 2224 => '⦸', 2225 => '⦹', 2226 => '⦺', 2227 => '⦻', 2228 => '⦼', 2229 => '⦽', 2230 => '⦾', 2231 => '⦿', 2232 => '⧀', 2233 => '⧁', 2234 => '⧂', 2235 => '⧃', 2236 => '⧄', 2237 => '⧅', 2238 => '⧆', 2239 => '⧇', 2240 => '⧈', 2241 => '⧉', 2242 => '⧊', 2243 => '⧋', 2244 => '⧌', 2245 => '⧍', 2246 => '⧎', 2247 => '⧏', 2248 => '⧐', 2249 => '⧑', 2250 => '⧒', 2251 => '⧓', 2252 => '⧔', 2253 => '⧕', 2254 => '⧖', 2255 => '⧗', 2256 => '⧘', 2257 => '⧙', 2258 => '⧚', 2259 => '⧛', 2260 => '⧜', 2261 => '⧝', 2262 => '⧞', 2263 => '⧟', 2264 => '⧠', 2265 => '⧡', 2266 => '⧢', 2267 => '⧣', 2268 => '⧤', 2269 => '⧥', 2270 => '⧦', 2271 => '⧧', 2272 => '⧨', 2273 => '⧩', 2274 => '⧪', 2275 => '⧫', 2276 => '⧬', 2277 => '⧭', 2278 => '⧮', 2279 => '⧯', 2280 => '⧰', 2281 => '⧱', 2282 => '⧲', 2283 => '⧳', 2284 => '⧴', 2285 => '⧵', 2286 => '⧶', 2287 => '⧷', 2288 => '⧸', 2289 => '⧹', 2290 => '⧺', 2291 => '⧻', 2292 => '⧾', 2293 => '⧿', 2294 => '⨀', 2295 => '⨁', 2296 => '⨂', 2297 => '⨃', 2298 => '⨄', 2299 => '⨅', 2300 => '⨆', 2301 => '⨇', 2302 => '⨈', 2303 => '⨉', 2304 => '⨊', 2305 => '⨋', 2306 => '⨍', 2307 => '⨎', 2308 => '⨏', 2309 => '⨐', 2310 => '⨑', 2311 => '⨒', 2312 => '⨓', 2313 => '⨔', 2314 => '⨕', 2315 => '⨖', 2316 => '⨗', 2317 => '⨘', 2318 => '⨙', 2319 => '⨚', 2320 => '⨛', 2321 => '⨜', 2322 => '⨝', 2323 => '⨞', 2324 => '⨟', 2325 => '⨠', 2326 => '⨡', 2327 => '⨢', 2328 => '⨣', 2329 => '⨤', 2330 => '⨥', 2331 => '⨦', 2332 => '⨧', 2333 => '⨨', 2334 => '⨩', 2335 => '⨪', 2336 => '⨫', 2337 => '⨬', 2338 => '⨭', 2339 => '⨮', 2340 => '⨯', 2341 => '⨰', 2342 => '⨱', 2343 => '⨲', 2344 => '⨳', 2345 => '⨴', 2346 => '⨵', 2347 => '⨶', 2348 => '⨷', 2349 => '⨸', 2350 => '⨹', 2351 => '⨺', 2352 => '⨻', 2353 => '⨼', 2354 => '⨽', 2355 => '⨾', 2356 => '⨿', 2357 => '⩀', 2358 => '⩁', 2359 => '⩂', 2360 => '⩃', 2361 => '⩄', 2362 => '⩅', 2363 => '⩆', 2364 => '⩇', 2365 => '⩈', 2366 => '⩉', 2367 => '⩊', 2368 => '⩋', 2369 => '⩌', 2370 => '⩍', 2371 => '⩎', 2372 => '⩏', 2373 => '⩐', 2374 => '⩑', 2375 => '⩒', 2376 => '⩓', 2377 => '⩔', 2378 => '⩕', 2379 => '⩖', 2380 => '⩗', 2381 => '⩘', 2382 => '⩙', 2383 => '⩚', 2384 => '⩛', 2385 => '⩜', 2386 => '⩝', 2387 => '⩞', 2388 => '⩟', 2389 => '⩠', 2390 => '⩡', 2391 => '⩢', 2392 => '⩣', 2393 => '⩤', 2394 => '⩥', 2395 => '⩦', 2396 => '⩧', 2397 => '⩨', 2398 => '⩩', 2399 => '⩪', 2400 => '⩫', 2401 => '⩬', 2402 => '⩭', 2403 => '⩮', 2404 => '⩯', 2405 => '⩰', 2406 => '⩱', 2407 => '⩲', 2408 => '⩳', 2409 => '⩷', 2410 => '⩸', 2411 => '⩹', 2412 => '⩺', 2413 => '⩻', 2414 => '⩼', 2415 => '⩽', 2416 => '⩾', 2417 => '⩿', 2418 => '⪀', 2419 => '⪁', 2420 => '⪂', 2421 => '⪃', 2422 => '⪄', 2423 => '⪅', 2424 => '⪆', 2425 => '⪇', 2426 => '⪈', 2427 => '⪉', 2428 => '⪊', 2429 => '⪋', 2430 => '⪌', 2431 => '⪍', 2432 => '⪎', 2433 => '⪏', 2434 => '⪐', 2435 => '⪑', 2436 => '⪒', 2437 => '⪓', 2438 => '⪔', 2439 => '⪕', 2440 => '⪖', 2441 => '⪗', 2442 => '⪘', 2443 => '⪙', 2444 => '⪚', 2445 => '⪛', 2446 => '⪜', 2447 => '⪝', 2448 => '⪞', 2449 => '⪟', 2450 => '⪠', 2451 => '⪡', 2452 => '⪢', 2453 => '⪣', 2454 => '⪤', 2455 => '⪥', 2456 => '⪦', 2457 => '⪧', 2458 => '⪨', 2459 => '⪩', 2460 => '⪪', 2461 => '⪫', 2462 => '⪬', 2463 => '⪭', 2464 => '⪮', 2465 => '⪯', 2466 => '⪰', 2467 => '⪱', 2468 => '⪲', 2469 => '⪳', 2470 => '⪴', 2471 => '⪵', 2472 => '⪶', 2473 => '⪷', 2474 => '⪸', 2475 => '⪹', 2476 => '⪺', 2477 => '⪻', 2478 => '⪼', 2479 => '⪽', 2480 => '⪾', 2481 => '⪿', 2482 => '⫀', 2483 => '⫁', 2484 => '⫂', 2485 => '⫃', 2486 => '⫄', 2487 => '⫅', 2488 => '⫆', 2489 => '⫇', 2490 => '⫈', 2491 => '⫉', 2492 => '⫊', 2493 => '⫋', 2494 => '⫌', 2495 => '⫍', 2496 => '⫎', 2497 => '⫏', 2498 => '⫐', 2499 => '⫑', 2500 => '⫒', 2501 => '⫓', 2502 => '⫔', 2503 => '⫕', 2504 => '⫖', 2505 => '⫗', 2506 => '⫘', 2507 => '⫙', 2508 => '⫚', 2509 => '⫛', 2510 => '⫝', 2511 => '⫞', 2512 => '⫟', 2513 => '⫠', 2514 => '⫡', 2515 => '⫢', 2516 => '⫣', 2517 => '⫤', 2518 => '⫥', 2519 => '⫦', 2520 => '⫧', 2521 => '⫨', 2522 => '⫩', 2523 => '⫪', 2524 => '⫫', 2525 => '⫬', 2526 => '⫭', 2527 => '⫮', 2528 => '⫯', 2529 => '⫰', 2530 => '⫱', 2531 => '⫲', 2532 => '⫳', 2533 => '⫴', 2534 => '⫵', 2535 => '⫶', 2536 => '⫷', 2537 => '⫸', 2538 => '⫹', 2539 => '⫺', 2540 => '⫻', 2541 => '⫼', 2542 => '⫽', 2543 => '⫾', 2544 => '⫿', 2545 => '⬀', 2546 => '⬁', 2547 => '⬂', 2548 => '⬃', 2549 => '⬄', 2550 => '⬅', 2551 => '⬆', 2552 => '⬇', 2553 => '⬈', 2554 => '⬉', 2555 => '⬊', 2556 => '⬋', 2557 => '⬌', 2558 => '⬍', 2559 => '⬎', 2560 => '⬏', 2561 => '⬐', 2562 => '⬑', 2563 => '⬒', 2564 => '⬓', 2565 => '⬔', 2566 => '⬕', 2567 => '⬖', 2568 => '⬗', 2569 => '⬘', 2570 => '⬙', 2571 => '⬚', 2572 => '⬛', 2573 => '⬜', 2574 => '⬝', 2575 => '⬞', 2576 => '⬟', 2577 => '⬠', 2578 => '⬡', 2579 => '⬢', 2580 => '⬣', 2581 => '⬤', 2582 => '⬥', 2583 => '⬦', 2584 => '⬧', 2585 => '⬨', 2586 => '⬩', 2587 => '⬪', 2588 => '⬫', 2589 => '⬬', 2590 => '⬭', 2591 => '⬮', 2592 => '⬯', 2593 => '⬰', 2594 => '⬱', 2595 => '⬲', 2596 => '⬳', 2597 => '⬴', 2598 => '⬵', 2599 => '⬶', 2600 => '⬷', 2601 => '⬸', 2602 => '⬹', 2603 => '⬺', 2604 => '⬻', 2605 => '⬼', 2606 => '⬽', 2607 => '⬾', 2608 => '⬿', 2609 => '⭀', 2610 => '⭁', 2611 => '⭂', 2612 => '⭃', 2613 => '⭄', 2614 => '⭅', 2615 => '⭆', 2616 => '⭇', 2617 => '⭈', 2618 => '⭉', 2619 => '⭊', 2620 => '⭋', 2621 => '⭌', 2622 => '⭐', 2623 => '⭑', 2624 => '⭒', 2625 => '⭓', 2626 => '⭔', 2627 => '⭕', 2628 => '⭖', 2629 => '⭗', 2630 => '⭘', 2631 => '⭙', 2632 => '⳥', 2633 => '⳦', 2634 => '⳧', 2635 => '⳨', 2636 => '⳩', 2637 => '⳪', 2638 => '⠀', 2639 => '⠁', 2640 => '⠂', 2641 => '⠃', 2642 => '⠄', 2643 => '⠅', 2644 => '⠆', 2645 => '⠇', 2646 => '⠈', 2647 => '⠉', 2648 => '⠊', 2649 => '⠋', 2650 => '⠌', 2651 => '⠍', 2652 => '⠎', 2653 => '⠏', 2654 => '⠐', 2655 => '⠑', 2656 => '⠒', 2657 => '⠓', 2658 => '⠔', 2659 => '⠕', 2660 => '⠖', 2661 => '⠗', 2662 => '⠘', 2663 => '⠙', 2664 => '⠚', 2665 => '⠛', 2666 => '⠜', 2667 => '⠝', 2668 => '⠞', 2669 => '⠟', 2670 => '⠠', 2671 => '⠡', 2672 => '⠢', 2673 => '⠣', 2674 => '⠤', 2675 => '⠥', 2676 => '⠦', 2677 => '⠧', 2678 => '⠨', 2679 => '⠩', 2680 => '⠪', 2681 => '⠫', 2682 => '⠬', 2683 => '⠭', 2684 => '⠮', 2685 => '⠯', 2686 => '⠰', 2687 => '⠱', 2688 => '⠲', 2689 => '⠳', 2690 => '⠴', 2691 => '⠵', 2692 => '⠶', 2693 => '⠷', 2694 => '⠸', 2695 => '⠹', 2696 => '⠺', 2697 => '⠻', 2698 => '⠼', 2699 => '⠽', 2700 => '⠾', 2701 => '⠿', 2702 => '⡀', 2703 => '⡁', 2704 => '⡂', 2705 => '⡃', 2706 => '⡄', 2707 => '⡅', 2708 => '⡆', 2709 => '⡇', 2710 => '⡈', 2711 => '⡉', 2712 => '⡊', 2713 => '⡋', 2714 => '⡌', 2715 => '⡍', 2716 => '⡎', 2717 => '⡏', 2718 => '⡐', 2719 => '⡑', 2720 => '⡒', 2721 => '⡓', 2722 => '⡔', 2723 => '⡕', 2724 => '⡖', 2725 => '⡗', 2726 => '⡘', 2727 => '⡙', 2728 => '⡚', 2729 => '⡛', 2730 => '⡜', 2731 => '⡝', 2732 => '⡞', 2733 => '⡟', 2734 => '⡠', 2735 => '⡡', 2736 => '⡢', 2737 => '⡣', 2738 => '⡤', 2739 => '⡥', 2740 => '⡦', 2741 => '⡧', 2742 => '⡨', 2743 => '⡩', 2744 => '⡪', 2745 => '⡫', 2746 => '⡬', 2747 => '⡭', 2748 => '⡮', 2749 => '⡯', 2750 => '⡰', 2751 => '⡱', 2752 => '⡲', 2753 => '⡳', 2754 => '⡴', 2755 => '⡵', 2756 => '⡶', 2757 => '⡷', 2758 => '⡸', 2759 => '⡹', 2760 => '⡺', 2761 => '⡻', 2762 => '⡼', 2763 => '⡽', 2764 => '⡾', 2765 => '⡿', 2766 => '⢀', 2767 => '⢁', 2768 => '⢂', 2769 => '⢃', 2770 => '⢄', 2771 => '⢅', 2772 => '⢆', 2773 => '⢇', 2774 => '⢈', 2775 => '⢉', 2776 => '⢊', 2777 => '⢋', 2778 => '⢌', 2779 => '⢍', 2780 => '⢎', 2781 => '⢏', 2782 => '⢐', 2783 => '⢑', 2784 => '⢒', 2785 => '⢓', 2786 => '⢔', 2787 => '⢕', 2788 => '⢖', 2789 => '⢗', 2790 => '⢘', 2791 => '⢙', 2792 => '⢚', 2793 => '⢛', 2794 => '⢜', 2795 => '⢝', 2796 => '⢞', 2797 => '⢟', 2798 => '⢠', 2799 => '⢡', 2800 => '⢢', 2801 => '⢣', 2802 => '⢤', 2803 => '⢥', 2804 => '⢦', 2805 => '⢧', 2806 => '⢨', 2807 => '⢩', 2808 => '⢪', 2809 => '⢫', 2810 => '⢬', 2811 => '⢭', 2812 => '⢮', 2813 => '⢯', 2814 => '⢰', 2815 => '⢱', 2816 => '⢲', 2817 => '⢳', 2818 => '⢴', 2819 => '⢵', 2820 => '⢶', 2821 => '⢷', 2822 => '⢸', 2823 => '⢹', 2824 => '⢺', 2825 => '⢻', 2826 => '⢼', 2827 => '⢽', 2828 => '⢾', 2829 => '⢿', 2830 => '⣀', 2831 => '⣁', 2832 => '⣂', 2833 => '⣃', 2834 => '⣄', 2835 => '⣅', 2836 => '⣆', 2837 => '⣇', 2838 => '⣈', 2839 => '⣉', 2840 => '⣊', 2841 => '⣋', 2842 => '⣌', 2843 => '⣍', 2844 => '⣎', 2845 => '⣏', 2846 => '⣐', 2847 => '⣑', 2848 => '⣒', 2849 => '⣓', 2850 => '⣔', 2851 => '⣕', 2852 => '⣖', 2853 => '⣗', 2854 => '⣘', 2855 => '⣙', 2856 => '⣚', 2857 => '⣛', 2858 => '⣜', 2859 => '⣝', 2860 => '⣞', 2861 => '⣟', 2862 => '⣠', 2863 => '⣡', 2864 => '⣢', 2865 => '⣣', 2866 => '⣤', 2867 => '⣥', 2868 => '⣦', 2869 => '⣧', 2870 => '⣨', 2871 => '⣩', 2872 => '⣪', 2873 => '⣫', 2874 => '⣬', 2875 => '⣭', 2876 => '⣮', 2877 => '⣯', 2878 => '⣰', 2879 => '⣱', 2880 => '⣲', 2881 => '⣳', 2882 => '⣴', 2883 => '⣵', 2884 => '⣶', 2885 => '⣷', 2886 => '⣸', 2887 => '⣹', 2888 => '⣺', 2889 => '⣻', 2890 => '⣼', 2891 => '⣽', 2892 => '⣾', 2893 => '⣿', 2894 => '⚊', 2895 => '⚋', 2896 => '⚌', 2897 => '⚍', 2898 => '⚎', 2899 => '⚏', 2900 => '☰', 2901 => '☱', 2902 => '☲', 2903 => '☳', 2904 => '☴', 2905 => '☵', 2906 => '☶', 2907 => '☷', 2908 => '䷀', 2909 => '䷁', 2910 => '䷂', 2911 => '䷃', 2912 => '䷄', 2913 => '䷅', 2914 => '䷆', 2915 => '䷇', 2916 => '䷈', 2917 => '䷉', 2918 => '䷊', 2919 => '䷋', 2920 => '䷌', 2921 => '䷍', 2922 => '䷎', 2923 => '䷏', 2924 => '䷐', 2925 => '䷑', 2926 => '䷒', 2927 => '䷓', 2928 => '䷔', 2929 => '䷕', 2930 => '䷖', 2931 => '䷗', 2932 => '䷘', 2933 => '䷙', 2934 => '䷚', 2935 => '䷛', 2936 => '䷜', 2937 => '䷝', 2938 => '䷞', 2939 => '䷟', 2940 => '䷠', 2941 => '䷡', 2942 => '䷢', 2943 => '䷣', 2944 => '䷤', 2945 => '䷥', 2946 => '䷦', 2947 => '䷧', 2948 => '䷨', 2949 => '䷩', 2950 => '䷪', 2951 => '䷫', 2952 => '䷬', 2953 => '䷭', 2954 => '䷮', 2955 => '䷯', 2956 => '䷰', 2957 => '䷱', 2958 => '䷲', 2959 => '䷳', 2960 => '䷴', 2961 => '䷵', 2962 => '䷶', 2963 => '䷷', 2964 => '䷸', 2965 => '䷹', 2966 => '䷺', 2967 => '䷻', 2968 => '䷼', 2969 => '䷽', 2970 => '䷾', 2971 => '䷿', 2972 => '𝌀', 2973 => '𝌁', 2974 => '𝌂', 2975 => '𝌃', 2976 => '𝌄', 2977 => '𝌅', 2978 => '𝌆', 2979 => '𝌇', 2980 => '𝌈', 2981 => '𝌉', 2982 => '𝌊', 2983 => '𝌋', 2984 => '𝌌', 2985 => '𝌍', 2986 => '𝌎', 2987 => '𝌏', 2988 => '𝌐', 2989 => '𝌑', 2990 => '𝌒', 2991 => '𝌓', 2992 => '𝌔', 2993 => '𝌕', 2994 => '𝌖', 2995 => '𝌗', 2996 => '𝌘', 2997 => '𝌙', 2998 => '𝌚', 2999 => '𝌛', 3000 => '𝌜', 3001 => '𝌝', 3002 => '𝌞', 3003 => '𝌟', 3004 => '𝌠', 3005 => '𝌡', 3006 => '𝌢', 3007 => '𝌣', 3008 => '𝌤', 3009 => '𝌥', 3010 => '𝌦', 3011 => '𝌧', 3012 => '𝌨', 3013 => '𝌩', 3014 => '𝌪', 3015 => '𝌫', 3016 => '𝌬', 3017 => '𝌭', 3018 => '𝌮', 3019 => '𝌯', 3020 => '𝌰', 3021 => '𝌱', 3022 => '𝌲', 3023 => '𝌳', 3024 => '𝌴', 3025 => '𝌵', 3026 => '𝌶', 3027 => '𝌷', 3028 => '𝌸', 3029 => '𝌹', 3030 => '𝌺', 3031 => '𝌻', 3032 => '𝌼', 3033 => '𝌽', 3034 => '𝌾', 3035 => '𝌿', 3036 => '𝍀', 3037 => '𝍁', 3038 => '𝍂', 3039 => '𝍃', 3040 => '𝍄', 3041 => '𝍅', 3042 => '𝍆', 3043 => '𝍇', 3044 => '𝍈', 3045 => '𝍉', 3046 => '𝍊', 3047 => '𝍋', 3048 => '𝍌', 3049 => '𝍍', 3050 => '𝍎', 3051 => '𝍏', 3052 => '𝍐', 3053 => '𝍑', 3054 => '𝍒', 3055 => '𝍓', 3056 => '𝍔', 3057 => '𝍕', 3058 => '𝍖', 3059 => '꒐', 3060 => '꒑', 3061 => '꒒', 3062 => '꒓', 3063 => '꒔', 3064 => '꒕', 3065 => '꒖', 3066 => '꒗', 3067 => '꒘', 3068 => '꒙', 3069 => '꒚', 3070 => '꒛', 3071 => '꒜', 3072 => '꒝', 3073 => '꒞', 3074 => '꒟', 3075 => '꒠', 3076 => '꒡', 3077 => '꒢', 3078 => '꒣', 3079 => '꒤', 3080 => '꒥', 3081 => '꒦', 3082 => '꒧', 3083 => '꒨', 3084 => '꒩', 3085 => '꒪', 3086 => '꒫', 3087 => '꒬', 3088 => '꒭', 3089 => '꒮', 3090 => '꒯', 3091 => '꒰', 3092 => '꒱', 3093 => '꒲', 3094 => '꒳', 3095 => '꒴', 3096 => '꒵', 3097 => '꒶', 3098 => '꒷', 3099 => '꒸', 3100 => '꒹', 3101 => '꒺', 3102 => '꒻', 3103 => '꒼', 3104 => '꒽', 3105 => '꒾', 3106 => '꒿', 3107 => '꓀', 3108 => '꓁', 3109 => '꓂', 3110 => '꓃', 3111 => '꓄', 3112 => '꓅', 3113 => '꓆', 3114 => '𐄷', 3115 => '𐄸', 3116 => '𐄹', 3117 => '𐄺', 3118 => '𐄻', 3119 => '𐄼', 3120 => '𐄽', 3121 => '𐄾', 3122 => '𐄿', 3123 => '𐅹', 3124 => '𐅺', 3125 => '𐅻', 3126 => '𐅼', 3127 => '𐅽', 3128 => '𐅾', 3129 => '𐅿', 3130 => '𐆀', 3131 => '𐆁', 3132 => '𐆂', 3133 => '𐆃', 3134 => '𐆄', 3135 => '𐆅', 3136 => '𐆆', 3137 => '𐆇', 3138 => '𐆈', 3139 => '𐆉', 3140 => '𐆐', 3141 => '𐆑', 3142 => '𐆒', 3143 => '𐆓', 3144 => '𐆔', 3145 => '𐆕', 3146 => '𐆖', 3147 => '𐆗', 3148 => '𐆘', 3149 => '𐆙', 3150 => '𐆚', 3151 => '𐆛', 3152 => '𐇐', 3153 => '𐇑', 3154 => '𐇒', 3155 => '𐇓', 3156 => '𐇔', 3157 => '𐇕', 3158 => '𐇖', 3159 => '𐇗', 3160 => '𐇘', 3161 => '𐇙', 3162 => '𐇚', 3163 => '𐇛', 3164 => '𐇜', 3165 => '𐇝', 3166 => '𐇞', 3167 => '𐇟', 3168 => '𐇠', 3169 => '𐇡', 3170 => '𐇢', 3171 => '𐇣', 3172 => '𐇤', 3173 => '𐇥', 3174 => '𐇦', 3175 => '𐇧', 3176 => '𐇨', 3177 => '𐇩', 3178 => '𐇪', 3179 => '𐇫', 3180 => '𐇬', 3181 => '𐇭', 3182 => '𐇮', 3183 => '𐇯', 3184 => '𐇰', 3185 => '𐇱', 3186 => '𐇲', 3187 => '𐇳', 3188 => '𐇴', 3189 => '𐇵', 3190 => '𐇶', 3191 => '𐇷', 3192 => '𐇸', 3193 => '𐇹', 3194 => '𐇺', 3195 => '𐇻', 3196 => '𐇼', 3197 => '𝀀', 3198 => '𝀁', 3199 => '𝀂', 3200 => '𝀃', 3201 => '𝀄', 3202 => '𝀅', 3203 => '𝀆', 3204 => '𝀇', 3205 => '𝀈', 3206 => '𝀉', 3207 => '𝀊', 3208 => '𝀋', 3209 => '𝀌', 3210 => '𝀍', 3211 => '𝀎', 3212 => '𝀏', 3213 => '𝀐', 3214 => '𝀑', 3215 => '𝀒', 3216 => '𝀓', 3217 => '𝀔', 3218 => '𝀕', 3219 => '𝀖', 3220 => '𝀗', 3221 => '𝀘', 3222 => '𝀙', 3223 => '𝀚', 3224 => '𝀛', 3225 => '𝀜', 3226 => '𝀝', 3227 => '𝀞', 3228 => '𝀟', 3229 => '𝀠', 3230 => '𝀡', 3231 => '𝀢', 3232 => '𝀣', 3233 => '𝀤', 3234 => '𝀥', 3235 => '𝀦', 3236 => '𝀧', 3237 => '𝀨', 3238 => '𝀩', 3239 => '𝀪', 3240 => '𝀫', 3241 => '𝀬', 3242 => '𝀭', 3243 => '𝀮', 3244 => '𝀯', 3245 => '𝀰', 3246 => '𝀱', 3247 => '𝀲', 3248 => '𝀳', 3249 => '𝀴', 3250 => '𝀵', 3251 => '𝀶', 3252 => '𝀷', 3253 => '𝀸', 3254 => '𝀹', 3255 => '𝀺', 3256 => '𝀻', 3257 => '𝀼', 3258 => '𝀽', 3259 => '𝀾', 3260 => '𝀿', 3261 => '𝁀', 3262 => '𝁁', 3263 => '𝁂', 3264 => '𝁃', 3265 => '𝁄', 3266 => '𝁅', 3267 => '𝁆', 3268 => '𝁇', 3269 => '𝁈', 3270 => '𝁉', 3271 => '𝁊', 3272 => '𝁋', 3273 => '𝁌', 3274 => '𝁍', 3275 => '𝁎', 3276 => '𝁏', 3277 => '𝁐', 3278 => '𝁑', 3279 => '𝁒', 3280 => '𝁓', 3281 => '𝁔', 3282 => '𝁕', 3283 => '𝁖', 3284 => '𝁗', 3285 => '𝁘', 3286 => '𝁙', 3287 => '𝁚', 3288 => '𝁛', 3289 => '𝁜', 3290 => '𝁝', 3291 => '𝁞', 3292 => '𝁟', 3293 => '𝁠', 3294 => '𝁡', 3295 => '𝁢', 3296 => '𝁣', 3297 => '𝁤', 3298 => '𝁥', 3299 => '𝁦', 3300 => '𝁧', 3301 => '𝁨', 3302 => '𝁩', 3303 => '𝁪', 3304 => '𝁫', 3305 => '𝁬', 3306 => '𝁭', 3307 => '𝁮', 3308 => '𝁯', 3309 => '𝁰', 3310 => '𝁱', 3311 => '𝁲', 3312 => '𝁳', 3313 => '𝁴', 3314 => '𝁵', 3315 => '𝁶', 3316 => '𝁷', 3317 => '𝁸', 3318 => '𝁹', 3319 => '𝁺', 3320 => '𝁻', 3321 => '𝁼', 3322 => '𝁽', 3323 => '𝁾', 3324 => '𝁿', 3325 => '𝂀', 3326 => '𝂁', 3327 => '𝂂', 3328 => '𝂃', 3329 => '𝂄', 3330 => '𝂅', 3331 => '𝂆', 3332 => '𝂇', 3333 => '𝂈', 3334 => '𝂉', 3335 => '𝂊', 3336 => '𝂋', 3337 => '𝂌', 3338 => '𝂍', 3339 => '𝂎', 3340 => '𝂏', 3341 => '𝂐', 3342 => '𝂑', 3343 => '𝂒', 3344 => '𝂓', 3345 => '𝂔', 3346 => '𝂕', 3347 => '𝂖', 3348 => '𝂗', 3349 => '𝂘', 3350 => '𝂙', 3351 => '𝂚', 3352 => '𝂛', 3353 => '𝂜', 3354 => '𝂝', 3355 => '𝂞', 3356 => '𝂟', 3357 => '𝂠', 3358 => '𝂡', 3359 => '𝂢', 3360 => '𝂣', 3361 => '𝂤', 3362 => '𝂥', 3363 => '𝂦', 3364 => '𝂧', 3365 => '𝂨', 3366 => '𝂩', 3367 => '𝂪', 3368 => '𝂫', 3369 => '𝂬', 3370 => '𝂭', 3371 => '𝂮', 3372 => '𝂯', 3373 => '𝂰', 3374 => '𝂱', 3375 => '𝂲', 3376 => '𝂳', 3377 => '𝂴', 3378 => '𝂵', 3379 => '𝂶', 3380 => '𝂷', 3381 => '𝂸', 3382 => '𝂹', 3383 => '𝂺', 3384 => '𝂻', 3385 => '𝂼', 3386 => '𝂽', 3387 => '𝂾', 3388 => '𝂿', 3389 => '𝃀', 3390 => '𝃁', 3391 => '𝃂', 3392 => '𝃃', 3393 => '𝃄', 3394 => '𝃅', 3395 => '𝃆', 3396 => '𝃇', 3397 => '𝃈', 3398 => '𝃉', 3399 => '𝃊', 3400 => '𝃋', 3401 => '𝃌', 3402 => '𝃍', 3403 => '𝃎', 3404 => '𝃏', 3405 => '𝃐', 3406 => '𝃑', 3407 => '𝃒', 3408 => '𝃓', 3409 => '𝃔', 3410 => '𝃕', 3411 => '𝃖', 3412 => '𝃗', 3413 => '𝃘', 3414 => '𝃙', 3415 => '𝃚', 3416 => '𝃛', 3417 => '𝃜', 3418 => '𝃝', 3419 => '𝃞', 3420 => '𝃟', 3421 => '𝃠', 3422 => '𝃡', 3423 => '𝃢', 3424 => '𝃣', 3425 => '𝃤', 3426 => '𝃥', 3427 => '𝃦', 3428 => '𝃧', 3429 => '𝃨', 3430 => '𝃩', 3431 => '𝃪', 3432 => '𝃫', 3433 => '𝃬', 3434 => '𝃭', 3435 => '𝃮', 3436 => '𝃯', 3437 => '𝃰', 3438 => '𝃱', 3439 => '𝃲', 3440 => '𝃳', 3441 => '𝃴', 3442 => '𝃵', 3443 => '𝄀', 3444 => '𝄁', 3445 => '𝄂', 3446 => '𝄃', 3447 => '𝄄', 3448 => '𝄅', 3449 => '𝄆', 3450 => '𝄇', 3451 => '𝄈', 3452 => '𝄉', 3453 => '𝄊', 3454 => '𝄋', 3455 => '𝄌', 3456 => '𝄍', 3457 => '𝄎', 3458 => '𝄏', 3459 => '𝄐', 3460 => '𝄑', 3461 => '𝄒', 3462 => '𝄓', 3463 => '𝄔', 3464 => '𝄕', 3465 => '𝄖', 3466 => '𝄗', 3467 => '𝄘', 3468 => '𝄙', 3469 => '𝄚', 3470 => '𝄛', 3471 => '𝄜', 3472 => '𝄝', 3473 => '𝄞', 3474 => '𝄟', 3475 => '𝄠', 3476 => '𝄡', 3477 => '𝄢', 3478 => '𝄣', 3479 => '𝄤', 3480 => '𝄥', 3481 => '𝄦', 3482 => '♭', 3483 => '♮', 3484 => '♯', 3485 => '𝄪', 3486 => '𝄫', 3487 => '𝄬', 3488 => '𝄭', 3489 => '𝄮', 3490 => '𝄯', 3491 => '𝄰', 3492 => '𝄱', 3493 => '𝄲', 3494 => '𝄳', 3495 => '𝄴', 3496 => '𝄵', 3497 => '𝄶', 3498 => '𝄷', 3499 => '𝄸', 3500 => '𝄹', 3501 => '𝄩', 3502 => '𝄺', 3503 => '𝄻', 3504 => '𝄼', 3505 => '𝄽', 3506 => '𝄾', 3507 => '𝄿', 3508 => '𝅀', 3509 => '𝅁', 3510 => '𝅂', 3511 => '𝅃', 3512 => '𝅄', 3513 => '𝅅', 3514 => '𝅆', 3515 => '𝅇', 3516 => '𝅈', 3517 => '𝅉', 3518 => '𝅊', 3519 => '𝅋', 3520 => '𝅌', 3521 => '𝅍', 3522 => '𝅎', 3523 => '𝅏', 3524 => '𝅐', 3525 => '𝅑', 3526 => '𝅒', 3527 => '𝅓', 3528 => '𝅔', 3529 => '𝅕', 3530 => '𝅖', 3531 => '𝅗', 3532 => '𝅘', 3533 => '𝅙', 3534 => '𝅚', 3535 => '𝅛', 3536 => '𝅜', 3537 => '𝅝', 3538 => '𝅪', 3539 => '𝅫', 3540 => '𝅬', 3541 => '𝆃', 3542 => '𝆄', 3543 => '𝆌', 3544 => '𝆍', 3545 => '𝆎', 3546 => '𝆏', 3547 => '𝆐', 3548 => '𝆑', 3549 => '𝆒', 3550 => '𝆓', 3551 => '𝆔', 3552 => '𝆕', 3553 => '𝆖', 3554 => '𝆗', 3555 => '𝆘', 3556 => '𝆙', 3557 => '𝆚', 3558 => '𝆛', 3559 => '𝆜', 3560 => '𝆝', 3561 => '𝆞', 3562 => '𝆟', 3563 => '𝆠', 3564 => '𝆡', 3565 => '𝆢', 3566 => '𝆣', 3567 => '𝆤', 3568 => '𝆥', 3569 => '𝆦', 3570 => '𝆧', 3571 => '𝆨', 3572 => '𝆩', 3573 => '𝆮', 3574 => '𝆯', 3575 => '𝆰', 3576 => '𝆱', 3577 => '𝆲', 3578 => '𝆳', 3579 => '𝆴', 3580 => '𝆵', 3581 => '𝆶', 3582 => '𝆷', 3583 => '𝆸', 3584 => '𝆹', 3585 => '𝆺', 3586 => '𝇁', 3587 => '𝇂', 3588 => '𝇃', 3589 => '𝇄', 3590 => '𝇅', 3591 => '𝇆', 3592 => '𝇇', 3593 => '𝇈', 3594 => '𝇉', 3595 => '𝇊', 3596 => '𝇋', 3597 => '𝇌', 3598 => '𝇍', 3599 => '𝇎', 3600 => '𝇏', 3601 => '𝇐', 3602 => '𝇑', 3603 => '𝇒', 3604 => '𝇓', 3605 => '𝇔', 3606 => '𝇕', 3607 => '𝇖', 3608 => '𝇗', 3609 => '𝇘', 3610 => '𝇙', 3611 => '𝇚', 3612 => '𝇛', 3613 => '𝇜', 3614 => '𝇝', 3615 => '𝈀', 3616 => '𝈁', 3617 => '𝈂', 3618 => '𝈃', 3619 => '𝈄', 3620 => '𝈅', 3621 => '𝈆', 3622 => '𝈇', 3623 => '𝈈', 3624 => '𝈉', 3625 => '𝈊', 3626 => '𝈋', 3627 => '𝈌', 3628 => '𝈍', 3629 => '𝈎', 3630 => '𝈏', 3631 => '𝈐', 3632 => '𝈑', 3633 => '𝈒', 3634 => '𝈓', 3635 => '𝈔', 3636 => '𝈕', 3637 => '𝈖', 3638 => '𝈗', 3639 => '𝈘', 3640 => '𝈙', 3641 => '𝈚', 3642 => '𝈛', 3643 => '𝈜', 3644 => '𝈝', 3645 => '𝈞', 3646 => '𝈟', 3647 => '𝈠', 3648 => '𝈡', 3649 => '𝈢', 3650 => '𝈣', 3651 => '𝈤', 3652 => '𝈥', 3653 => '𝈦', 3654 => '𝈧', 3655 => '𝈨', 3656 => '𝈩', 3657 => '𝈪', 3658 => '𝈫', 3659 => '𝈬', 3660 => '𝈭', 3661 => '𝈮', 3662 => '𝈯', 3663 => '𝈰', 3664 => '𝈱', 3665 => '𝈲', 3666 => '𝈳', 3667 => '𝈴', 3668 => '𝈵', 3669 => '𝈶', 3670 => '𝈷', 3671 => '𝈸', 3672 => '𝈹', 3673 => '𝈺', 3674 => '𝈻', 3675 => '𝈼', 3676 => '𝈽', 3677 => '𝈾', 3678 => '𝈿', 3679 => '𝉀', 3680 => '𝉁', 3681 => '𝉅', 3682 => '🀀', 3683 => '🀁', 3684 => '🀂', 3685 => '🀃', 3686 => '🀄', 3687 => '🀅', 3688 => '🀆', 3689 => '🀇', 3690 => '🀈', 3691 => '🀉', 3692 => '🀊', 3693 => '🀋', 3694 => '🀌', 3695 => '🀍', 3696 => '🀎', 3697 => '🀏', 3698 => '🀐', 3699 => '🀑', 3700 => '🀒', 3701 => '🀓', 3702 => '🀔', 3703 => '🀕', 3704 => '🀖', 3705 => '🀗', 3706 => '🀘', 3707 => '🀙', 3708 => '🀚', 3709 => '🀛', 3710 => '🀜', 3711 => '🀝', 3712 => '🀞', 3713 => '🀟', 3714 => '🀠', 3715 => '🀡', 3716 => '🀢', 3717 => '🀣', 3718 => '🀤', 3719 => '🀥', 3720 => '🀦', 3721 => '🀧', 3722 => '🀨', 3723 => '🀩', 3724 => '🀪', 3725 => '🀫', 3726 => '🀰', 3727 => '🀱', 3728 => '🀲', 3729 => '🀳', 3730 => '🀴', 3731 => '🀵', 3732 => '🀶', 3733 => '🀷', 3734 => '🀸', 3735 => '🀹', 3736 => '🀺', 3737 => '🀻', 3738 => '🀼', 3739 => '🀽', 3740 => '🀾', 3741 => '🀿', 3742 => '🁀', 3743 => '🁁', 3744 => '🁂', 3745 => '🁃', 3746 => '🁄', 3747 => '🁅', 3748 => '🁆', 3749 => '🁇', 3750 => '🁈', 3751 => '🁉', 3752 => '🁊', 3753 => '🁋', 3754 => '🁌', 3755 => '🁍', 3756 => '🁎', 3757 => '🁏', 3758 => '🁐', 3759 => '🁑', 3760 => '🁒', 3761 => '🁓', 3762 => '🁔', 3763 => '🁕', 3764 => '🁖', 3765 => '🁗', 3766 => '🁘', 3767 => '🁙', 3768 => '🁚', 3769 => '🁛', 3770 => '🁜', 3771 => '🁝', 3772 => '🁞', 3773 => '🁟', 3774 => '🁠', 3775 => '🁡', 3776 => '🁢', 3777 => '🁣', 3778 => '🁤', 3779 => '🁥', 3780 => '🁦', 3781 => '🁧', 3782 => '🁨', 3783 => '🁩', 3784 => '🁪', 3785 => '🁫', 3786 => '🁬', 3787 => '🁭', 3788 => '🁮', 3789 => '🁯', 3790 => '🁰', 3791 => '🁱', 3792 => '🁲', 3793 => '🁳', 3794 => '🁴', 3795 => '🁵', 3796 => '🁶', 3797 => '🁷', 3798 => '🁸', 3799 => '🁹', 3800 => '🁺', 3801 => '🁻', 3802 => '🁼', 3803 => '🁽', 3804 => '🁾', 3805 => '🁿', 3806 => '🂀', 3807 => '🂁', 3808 => '🂂', 3809 => '🂃', 3810 => '🂄', 3811 => '🂅', 3812 => '🂆', 3813 => '🂇', 3814 => '🂈', 3815 => '🂉', 3816 => '🂊', 3817 => '🂋', 3818 => '🂌', 3819 => '🂍', 3820 => '🂎', 3821 => '🂏', 3822 => '🂐', 3823 => '🂑', 3824 => '🂒', 3825 => '🂓', 3826 => '🂠', 3827 => '🂡', 3828 => '🂢', 3829 => '🂣', 3830 => '🂤', 3831 => '🂥', 3832 => '🂦', 3833 => '🂧', 3834 => '🂨', 3835 => '🂩', 3836 => '🂪', 3837 => '🂫', 3838 => '🂬', 3839 => '🂭', 3840 => '🂮', 3841 => '🂱', 3842 => '🂲', 3843 => '🂳', 3844 => '🂴', 3845 => '🂵', 3846 => '🂶', 3847 => '🂷', 3848 => '🂸', 3849 => '🂹', 3850 => '🂺', 3851 => '🂻', 3852 => '🂼', 3853 => '🂽', 3854 => '🂾', 3855 => '🃁', 3856 => '🃂', 3857 => '🃃', 3858 => '🃄', 3859 => '🃅', 3860 => '🃆', 3861 => '🃇', 3862 => '🃈', 3863 => '🃉', 3864 => '🃊', 3865 => '🃋', 3866 => '🃌', 3867 => '🃍', 3868 => '🃎', 3869 => '🃏', 3870 => '🃑', 3871 => '🃒', 3872 => '🃓', 3873 => '🃔', 3874 => '🃕', 3875 => '🃖', 3876 => '🃗', 3877 => '🃘', 3878 => '🃙', 3879 => '🃚', 3880 => '🃛', 3881 => '🃜', 3882 => '🃝', 3883 => '🃞', 3884 => '🃟', 3885 => '🌀', 3886 => '🌁', 3887 => '🌂', 3888 => '🌃', 3889 => '🌄', 3890 => '🌅', 3891 => '🌆', 3892 => '🌇', 3893 => '🌈', 3894 => '🌉', 3895 => '🌊', 3896 => '🌋', 3897 => '🌌', 3898 => '🌍', 3899 => '🌎', 3900 => '🌏', 3901 => '🌐', 3902 => '🌑', 3903 => '🌒', 3904 => '🌓', 3905 => '🌔', 3906 => '🌕', 3907 => '🌖', 3908 => '🌗', 3909 => '🌘', 3910 => '🌙', 3911 => '🌚', 3912 => '🌛', 3913 => '🌜', 3914 => '🌝', 3915 => '🌞', 3916 => '🌟', 3917 => '🌠', 3918 => '🌰', 3919 => '🌱', 3920 => '🌲', 3921 => '🌳', 3922 => '🌴', 3923 => '🌵', 3924 => '🌷', 3925 => '🌸', 3926 => '🌹', 3927 => '🌺', 3928 => '🌻', 3929 => '🌼', 3930 => '🌽', 3931 => '🌾', 3932 => '🌿', 3933 => '🍀', 3934 => '🍁', 3935 => '🍂', 3936 => '🍃', 3937 => '🍄', 3938 => '🍅', 3939 => '🍆', 3940 => '🍇', 3941 => '🍈', 3942 => '🍉', 3943 => '🍊', 3944 => '🍋', 3945 => '🍌', 3946 => '🍍', 3947 => '🍎', 3948 => '🍏', 3949 => '🍐', 3950 => '🍑', 3951 => '🍒', 3952 =>