This release is meant to be used with the [DMOJ Judge v4.0.0](https://github.com/DMOJ/judge/releases/tag/v4.0.0) release or newer.
Thanks to Ninjaclasher, int-y1, WallE256, kiritofeng, Carson-Tang, and Riolku for contributing major changes in this release.
Features
* Added support for contest curator and tester roles.
* Added support for safe Markdown rendering. By default, problems, blogs, etc. will now disallow unsafe HTML tags.
* Added an option for users to download their data.
* Added support for locking submissions from being rejudged.
* Added support for voting on problem point values.
* Added scratch code support for 2-factor authentication.
* Added language and judge endpoints to API v2.
* Added support for classes within organizations.
* Added the ability to disable a judge without terminating its connection.
* ...more.
UI changes
* The logo is now symmetrical. :tada:
* Many CSS fixups as we work towards supporting dark mode in a future release.
* Numerous improvements to site internationalization.
* Use a different color for the first letter of target-rated users.
* Added a submission activity graph to user pages.
* Added a column on the problems list showing whether an editorial is available.
* Highlighted partial AC testcases differently.
* Added participation start time tooltip to contest rankings.
* Made the submissions list more mobile-friendly.
* Made the contest list page sortable.
* Submissions list now uses infinite pagination.
* Surface maximum runtime on a single test case for AC submissions.
* Removed "share to Google+" buttons on content.
* Limit height of ongoing contest display on the home page.
* Added a confirmation dialog when rejudging submissions.
* Improved formatting of the password reset and account activation emails.
* ...more.
Miscellaneous
* Judge scheduling improvements for submission prioritization: in-contest > regular > rejudge > batch rejudge.
* Various site performance improvements.
* Contest ranking sorting now uses decimal precision.
* Disallow rating contests which haven't finished yet.
* Deleted orphaned editorials, and prevented them from being generated in the future
* ...more.
Security
* Patched XSS vulnerabilities around select2 (https://github.com/DMOJ/online-judge/pull/1398).
* Prevent users from voting on hidden comments.
* Prevent muted users from voting on comments.
* ...more.
Full changelog
The full changelog is available [here](https://github.com/DMOJ/online-judge/compare/v2.1.1...v4.0.0) as well as below.
<details><summary>Changelog</summary>
* Make code lint correctly with new flake8 by quantum5 in https://github.com/DMOJ/online-judge/pull/1388
* Fix 500 error on unathenticated user in ticket ajax views by fluix-dev in https://github.com/DMOJ/online-judge/pull/1387
* Move login requirement check out of TicketMixin by fluix-dev in https://github.com/DMOJ/online-judge/pull/1389
* Correctly reject invalid IDs in ajax ticket views by quantum5 in https://github.com/DMOJ/online-judge/pull/1390
* Add option for user to download their data; 40 by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1351
* Implement submission locks by WallE256 in https://github.com/DMOJ/online-judge/pull/1391
* Make TOTP login the default form action by quantum5 in https://github.com/DMOJ/online-judge/pull/1395
* Add admin action to set problem publish date to now by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1392
* Organization improvements by Carson-Tang in https://github.com/DMOJ/online-judge/pull/1393
* Do not write empty `init.yml` by kiritofeng in https://github.com/DMOJ/online-judge/pull/1397
* Remove XSS vulnerabilities through poor select2 usage by quantum5 in https://github.com/DMOJ/online-judge/pull/1398
* Remove widget if no open organizations available by kevinjycui in https://github.com/DMOJ/online-judge/pull/1399
* Run unit tests on GitHub actions by quantum5 in https://github.com/DMOJ/online-judge/pull/1404
* Unset `Contest.is_locked` when cloning a contest by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1405
* Add IOI format with new rules from 2016 by adambenali in https://github.com/DMOJ/online-judge/pull/1401
* Remove contest editorial column if empty by kevinjycui in https://github.com/DMOJ/online-judge/pull/1406
* Defer Problem.summary on ProblemList by quantum5 in https://github.com/DMOJ/online-judge/pull/1407
* Coalesce i18n_name in python by quantum5 in https://github.com/DMOJ/online-judge/pull/1408
* Mark all strings in models as translation strings by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1409
* Correctly cache comment titles on home page by quantum5 in https://github.com/DMOJ/online-judge/pull/1412
* Compute judge runtime versions in a single query by quantum5 in https://github.com/DMOJ/online-judge/pull/1413
* Switch CI test database to MySQL by quantum5 in https://github.com/DMOJ/online-judge/pull/1417
* Remove secondary ID sort on user list by quantum5 in https://github.com/DMOJ/online-judge/pull/1414
* Generate test coverage and upload to codecov by quantum5 in https://github.com/DMOJ/online-judge/pull/1418
* Add caching to pip install when running tests by quantum5 in https://github.com/DMOJ/online-judge/pull/1419
* Improve submission lock UI by WallE256 in https://github.com/DMOJ/online-judge/pull/1402
* Fix `Submission.can_see_detail` erroring when user is not authenticated by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1423
* Remove superuser optimizations for most recent comments by quantum5 in https://github.com/DMOJ/online-judge/pull/1421
* Make `Problem.is_accessible_by` consistent with `Problem.get_visible_problems` by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1420
* Fix contest ranking scroll on medium width screens for some browsers by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1396
* Unconditionally deny access when a comment's related object doesn't exist by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1426
* Add controls for full HTML markup access in problems by quantum5 in https://github.com/DMOJ/online-judge/pull/1424
* Fix lxml adding extra tags by quantum5 in https://github.com/DMOJ/online-judge/pull/1428
* Remove random 'k' in contest template by fluix-dev in https://github.com/DMOJ/online-judge/pull/1429
* Exclude locked submissions from celery task filter by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1432
* Hide `locked` word on submissions list for small-width screens by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1430
* Fix problem solution access check; fixes 1371 by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1425
* Update robots.txt with new URL endpoints; 504 by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1427
* Exempt flatpages from the HTML restrictions by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1431
* Allow most sane HTML tags and attributes by quantum5 in https://github.com/DMOJ/online-judge/pull/1434
* Properly redirect when the organization slug is wrong by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1436
* Fix org kick by Carson-Tang in https://github.com/DMOJ/online-judge/pull/1437
* Add keyboard shortcut for triggering abort action; 1191 by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1435
* Update problem stats on submission delete by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1438
* Don't show rejudge link on submission source view when locked by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1441
* Fix comment body not breaking text on some browsers; 1443 by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1444
* Use `has_other_pages()` to check if the pagination bar should be shown by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1446
* Add unittests for models by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1416
* Hide vertical scrollbar for `wmd-button-row`; 1447 by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1449
* Break usernames and problem names in submission row instead of overflow by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1450
* Show comment post time as a readonly field on admin page by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1451
* Fix broken HTML tags by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1454
* Use Python for getting the contest problem label in contest formats by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1453
* Add scratch code support for 2FA; fixes 784 by Carson-Tang in https://github.com/DMOJ/online-judge/pull/1334
* Remove hidden word for non generated scratch codes by Carson-Tang in https://github.com/DMOJ/online-judge/pull/1458
* Check none type scratch codes by Carson-Tang in https://github.com/DMOJ/online-judge/pull/1459
* Correctly handle string prefix in lxml tree creation by quantum5 in https://github.com/DMOJ/online-judge/pull/1463
* Add (slightly better) mobile support for comments by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1455
* Make problems list ordering consistent by kevinjycui in https://github.com/DMOJ/online-judge/pull/1452
* Mark submissions with wrong acknowledgements as IE by quantum5 in https://github.com/DMOJ/online-judge/pull/1467
* Fix race condition between freeing judge and judge selection by quantum5 in https://github.com/DMOJ/online-judge/pull/1468
* Add Language and Judge endpoints to API v2 by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1471
* Vertically align checkbox input type by fluix-dev in https://github.com/DMOJ/online-judge/pull/1465
* Clear MiscConfig cache properly when saving/deleting the object; 1339 by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1340
* Revert "Replace join text with spectate if user is finished contest; fixes 544" by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1473
* Make comment votes icon use pointer cursor by fluix-dev in https://github.com/DMOJ/online-judge/pull/1469
* Add unittests for solutions by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1475
* Make submission list more mobile friendly by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1478
* Add past contests anchor for the pagination bar pages by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1477
* Fix problem breakdown table CSS after dccf6af by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1479
* Fix contest lock permission typo in admin site by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1488
* Fix CSS in case where only extended feedback is displayed by kiritofeng in https://github.com/DMOJ/online-judge/pull/1466
* Fix style.css not updating when it exists under resources/ by quantum5 in https://github.com/DMOJ/online-judge/pull/1491
* Log dispatch message only after submission has been dispatched by Xyene in https://github.com/DMOJ/online-judge/pull/1497
* Update README to reflect new repository names by kiritofeng in https://github.com/DMOJ/online-judge/pull/1498
* Fix abort any submission permission typo by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1499
* Prevent users from voting on hidden comments by zecookiez in https://github.com/DMOJ/online-judge/pull/1503
* Make removing a submission from list symmetric with adding by quantum5 in https://github.com/DMOJ/online-judge/pull/1502
* Use input and output file fields for PDFs by fluix-dev in https://github.com/DMOJ/online-judge/pull/1500
* Add participation start time tooltip to contest rankings by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1482
* Add Sorting to Contest Page 2 by slightlyskepticalpotat in https://github.com/DMOJ/online-judge/pull/1481
* Add page to view all user submissions in given contest by kiritofeng in https://github.com/DMOJ/online-judge/pull/1492
* Allow org admins to see all org problems by kiritofeng in https://github.com/DMOJ/online-judge/pull/1464
* Add CSS for 1481 by kiritofeng in https://github.com/DMOJ/online-judge/pull/1505
* Annotate ContestParticipations with `key` before sorting by kiritofeng in https://github.com/DMOJ/online-judge/pull/1506
* Fix ternary operator order for batch rejudges by Xyene in https://github.com/DMOJ/online-judge/pull/1507
* Stop updating user stats on grading end for private problems by quantum5 in https://github.com/DMOJ/online-judge/pull/1510
* Add missed semicolon by kiritofeng in https://github.com/DMOJ/online-judge/pull/1513
* Update translations from Crowdin by dmoj-build in https://github.com/DMOJ/online-judge/pull/1256
* Add Catalan language option by malbareda in https://github.com/DMOJ/online-judge/pull/1518
* Fix language fixture parameters by zecookiez in https://github.com/DMOJ/online-judge/pull/1508
* Add zero default for contest-output-prefix-length; Fixes 1515 by Carson-Tang in https://github.com/DMOJ/online-judge/pull/1516
* Allow hyphens in usernames by quantum5 in https://github.com/DMOJ/online-judge/pull/1520
* Add unittests for organization-private problems by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1504
* Explicitly set `case_points` and `case_total` to 0 by kiritofeng in https://github.com/DMOJ/online-judge/pull/1537
* Do bounds checks when fetching comment history; fixes 1542 by kiritofeng in https://github.com/DMOJ/online-judge/pull/1551
* Clone organizations for org-private problems; fixes 1530 by xiaowuc1 in https://github.com/DMOJ/online-judge/pull/1531
* Allow blank assignees when editing ticket by zecookiez in https://github.com/DMOJ/online-judge/pull/1534
* Correct pluralization of contest count; fixes 1550 by kiritofeng in https://github.com/DMOJ/online-judge/pull/1554
* Correctly pluralize assignees on ticket page by zecookiez in https://github.com/DMOJ/online-judge/pull/1555
* Fix font colour on rating tooltip by kiritofeng in https://github.com/DMOJ/online-judge/pull/1552
* Link user ranking graph to user-specific ranking by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1557
* Add file extension field to Language by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1553
* Set points to 0 upon aborting a submission by quantum5 in https://github.com/DMOJ/online-judge/pull/1528
* Fix markdown preview not working when replying to comments by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1558
* Disable codecov status by quantum5 in https://github.com/DMOJ/online-judge/pull/1562
* Fix contest ranking start time tooltip by quantum5 in https://github.com/DMOJ/online-judge/pull/1565
* Use a more precise filter for participation start tooltip by quantum5 in https://github.com/DMOJ/online-judge/pull/1566
* Do not run user scripts on the Edit Profile page by WallE256 in https://github.com/DMOJ/online-judge/pull/1561
* Add is_public to APIProblemDetail by jtyliu in https://github.com/DMOJ/online-judge/pull/1564
* Use infinite pagination on all submissions API page by quantum5 in https://github.com/DMOJ/online-judge/pull/1519
* Implement basic user migration command by quantum5 in https://github.com/DMOJ/online-judge/pull/1489
* Prevent muted people from voting. by ehhthing in https://github.com/DMOJ/online-judge/pull/1563
* Surface maximum runtime on single test case for AC submissions by xiaowuc1 in https://github.com/DMOJ/online-judge/pull/1525
* Use sentence case headings consistently by Xyene in https://github.com/DMOJ/online-judge/pull/1567
* Add submission activity graph to users page; 236 by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1480
* Decimal precision for user points in contest; Fixes 675 by Carson-Tang in https://github.com/DMOJ/online-judge/pull/1223
* Make admin notes into a codeblock by ehhthing in https://github.com/DMOJ/online-judge/pull/1571
* Make problem breakdown rows have relative dates; 1574 by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1575
* Add missing translation strings by Carson-Tang in https://github.com/DMOJ/online-judge/pull/1568
* Fix minor submission activity graph issues by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1573
* Fix ticket author indenting on front page sidebar by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1577
* Fix error in `trans` block by kiritofeng in https://github.com/DMOJ/online-judge/pull/1578
* Prioritize contest problem access checks by quantum5 in https://github.com/DMOJ/online-judge/pull/1579
* Better queries for Problem.author/editor/tester_ids by quantum5 in https://github.com/DMOJ/online-judge/pull/1580
* Remove share to Google Plus on Contests and Blogs by kevinjycui in https://github.com/DMOJ/online-judge/pull/1583
* Update format of Git requirements by WallE256 in https://github.com/DMOJ/online-judge/pull/1585
* Add support for C++20 by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1588
* Remove CSS For Google+ Features by slightlyskepticalpotat in https://github.com/DMOJ/online-judge/pull/1593
* Don't wrap testdata case type column in select2 by Xyene in https://github.com/DMOJ/online-judge/pull/1596
* Don't rate contests which have not finished yet by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1591
* Switch from pyotp to secrets for generating backup 2FA tokens by fluix-dev in https://github.com/DMOJ/online-judge/pull/1594
* Use the correct permissions for showing contest admin tab by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1601
* Remove rate button for ongoing contests; 1592 by Carson-Tang in https://github.com/DMOJ/online-judge/pull/1599
* Added option DMOJ_PRIVATE_SUBMISSION to hide source code by munhyunsu in https://github.com/DMOJ/online-judge/pull/1582
* Show admin tabs on own profile page by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1603
* Expose participation start and end times through API; fixes 1586 by WallE256 in https://github.com/DMOJ/online-judge/pull/1587
* Ensure `0` instead of `None` in home page submission count by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1611
* Fix styling error with admin tabs by kiritofeng in https://github.com/DMOJ/online-judge/pull/1613
* Make cache versioned so we can purge manually by quantum5 in https://github.com/DMOJ/online-judge/pull/1619
* Make updatemessages use peter-evans/create-pull-requestv3 by quantum5 in https://github.com/DMOJ/online-judge/pull/1618
* Make updatemessages workflow run daily by quantum5 in https://github.com/DMOJ/online-judge/pull/1620
* Do not increase volatility for DQed users by xiaowuc1 in https://github.com/DMOJ/online-judge/pull/1608
* Consolidate pagination bar spacings by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1589
* Exclude unlisted user submissions from total submissions by quantum5 in https://github.com/DMOJ/online-judge/pull/1625
* Limit height of ongoing contest box on home page by quantum5 in https://github.com/DMOJ/online-judge/pull/1629
* Add CI test to build CSS by quantum5 in https://github.com/DMOJ/online-judge/pull/1632
* Require a solved problem to update profile about by quantum5 in https://github.com/DMOJ/online-judge/pull/1633
* Use Profile.has_any_solves in CommentedDetailView.get_context_data by quantum5 in https://github.com/DMOJ/online-judge/pull/1634
* Remove organization registrant field by kiritofeng in https://github.com/DMOJ/online-judge/pull/1637
* Filter submissions by language before generating rankings by quantum5 in https://github.com/DMOJ/online-judge/pull/1628
* Always show top border line on submission table by quantum5 in https://github.com/DMOJ/online-judge/pull/1630
* Support django-recaptcha2>=1.4.0 by quantum5 in https://github.com/DMOJ/online-judge/pull/1631
* Properly centre forms on login and 2fa pages by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1622
* Limit width of registration form for mobile by leduythuccs in https://github.com/DMOJ/online-judge/pull/1638
* Require a solved problem to create a new ticket out of contest by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1639
* Correctly implement lazy static URL resolution by quantum5 in https://github.com/DMOJ/online-judge/pull/1640
* Added scoreboard_visibility by jtyliu in https://github.com/DMOJ/online-judge/pull/1627
* Use gettext_lazy to translate title by leduythuccs in https://github.com/DMOJ/online-judge/pull/1644
* Add is_organization_private to automatic problem rescore check by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1643
* Fix ranked submissions on empty language filter by quantum5 in https://github.com/DMOJ/online-judge/pull/1646
* Don't set negative margin followed by padding on ticket messages by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1647
* Set updatemessages PR author to dmoj-build by quantum5 in https://github.com/DMOJ/online-judge/pull/1650
* Set caniuse PR author to dmoj-build by quantum5 in https://github.com/DMOJ/online-judge/pull/1651
* Add validation on problem statement for disallowed characters; fixes … by Carson-Tang in https://github.com/DMOJ/online-judge/pull/1623
* Add copy button on loading comment history by quantum5 in https://github.com/DMOJ/online-judge/pull/1653
* Faster filtering on submission API v2 endpoint by quantum5 in https://github.com/DMOJ/online-judge/pull/1654
* Improve balancing between judges with same load by quantum5 in https://github.com/DMOJ/online-judge/pull/1652
* Fix impossible to translate strings by quantum5 in https://github.com/DMOJ/online-judge/pull/1656
* Update translations from Crowdin by dmoj-build in https://github.com/DMOJ/online-judge/pull/1521
* Import latest Can I use... data by dmoj-build in https://github.com/DMOJ/online-judge/pull/1302
* Add minor improvements to user data downloads by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1655
* Reduce time complexity for chain of * in problem filter by quantum5 in https://github.com/DMOJ/online-judge/pull/1658
* Update English source .po files in updatemessages by quantum5 in https://github.com/DMOJ/online-judge/pull/1657
* Add problem visibility to APIProblemList by jtyliu in https://github.com/DMOJ/online-judge/pull/1661
* Make caniuse PR use reviewers instead of assignees by quantum5 in https://github.com/DMOJ/online-judge/pull/1665
* Pretty format caniuse.json by quantum5 in https://github.com/DMOJ/online-judge/pull/1664
* Make translations PR use reviewers instead of assignees by quantum5 in https://github.com/DMOJ/online-judge/pull/1666
* Add comment for non-trivial submission saving logic by kiritofeng in https://github.com/DMOJ/online-judge/pull/1669
* Ignore Vim's backups by kiritofeng in https://github.com/DMOJ/online-judge/pull/1671
* Add contest curator and testers by kiritofeng in https://github.com/DMOJ/online-judge/pull/1668
* Add `is_locked` to `submission_related` by kiritofeng in https://github.com/DMOJ/online-judge/pull/1673
* Compute user_tester_ids without an inner join by quantum5 in https://github.com/DMOJ/online-judge/pull/1674
* Allow contest curators and authors to see submissions made in contest by kiritofeng in https://github.com/DMOJ/online-judge/pull/1672
* Fix missing `distinct()` by kiritofeng in https://github.com/DMOJ/online-judge/pull/1675
* Set submission contest object to None on contest submission delete by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1676
* Remove unneeded `profile.update_contest()` call in `ProblemSubmit` by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1677
* Fix `SubmissionMixin` `access_check()` method by kiritofeng in https://github.com/DMOJ/online-judge/pull/1678
* Remove unused PrivateMessage model by kiritofeng in https://github.com/DMOJ/online-judge/pull/1680
* Create initial revision on contest/problem clone by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1679
* Convert submission lock, rejudged date, and contest lock to timestamps by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1660
* Refactor atomic revisions by kiritofeng in https://github.com/DMOJ/online-judge/pull/1682
* Consistently cache global submission stats by quantum5 in https://github.com/DMOJ/online-judge/pull/1681
* Fix attempt to fetch all submissions by quantum5 in https://github.com/DMOJ/online-judge/pull/1683
* Allow unlisted users to see contest rank; fixes 1607 by kiritofeng in https://github.com/DMOJ/online-judge/pull/1609
* Refactor implementation of contest rating by quantum5 in https://github.com/DMOJ/online-judge/pull/1685
* Use correct spacing for rating column in contest rankings by quantum5 in https://github.com/DMOJ/online-judge/pull/1686
* ratings: correctly handle unrated users in SQL by quantum5 in https://github.com/DMOJ/online-judge/pull/1687
* Pass request as context in default flatpage template by quantum5 in https://github.com/DMOJ/online-judge/pull/1689
* Recompute rating for all users that participated by quantum5 in https://github.com/DMOJ/online-judge/pull/1697
* Remove unused `valid_id` in `judge/views/register.py` by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1703
* Expose `is_rated` and `rate_all` in API v2 contest list by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1694
* Remove unneeded rating object delete operation in `rate_contest` by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1699
* Atomically rate multiple contests by quantum5 in https://github.com/DMOJ/online-judge/pull/1702
* Filter contest submissions properly in live updates by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1701
* Refactor TOTPEnableView in preparation for 1693 by quantum5 in https://github.com/DMOJ/online-judge/pull/1708
* Display better message on editorial 404 by quantum5 in https://github.com/DMOJ/online-judge/pull/1711
* Implement TOTP key refreshing by quantum5 in https://github.com/DMOJ/online-judge/pull/1710
* Allow TOTP to be disabled when WebAuthn is enabled by quantum5 in https://github.com/DMOJ/online-judge/pull/1712
* Allow WebAuthn devices to be managed in admin by quantum5 in https://github.com/DMOJ/online-judge/pull/1713
* Use html.unescape instead of deprecated HTMLParser.unescape by quantum5 in https://github.com/DMOJ/online-judge/pull/1715
* Allow scratch codes with only WebAuthn by quantum5 in https://github.com/DMOJ/online-judge/pull/1716
* Refactor TOTP code checking to its own function by quantum5 in https://github.com/DMOJ/online-judge/pull/1719
* Make TOTP enable/disable views mobile friendly by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1714
* Use django-admin-sortable2 for contest problem ordering by quantum5 in https://github.com/DMOJ/online-judge/pull/1717
* Add option to hide problem authors while in contest by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1718
* Add word wrap to case feedback on submission status by quantum5 in https://github.com/DMOJ/online-judge/pull/1726
* Prevent the reuse of TOTP authentication codes by quantum5 in https://github.com/DMOJ/online-judge/pull/1720
* Store rounded participation score in database by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1725
* Implement per-problem submission access control by quantum5 in https://github.com/DMOJ/online-judge/pull/1727
* Check correct variable on submission detail pages by quantum5 in https://github.com/DMOJ/online-judge/pull/1728
* Reorder fields in problem admin by kiritofeng in https://github.com/DMOJ/online-judge/pull/1730
* Remove unused `malformed_packet` method by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1729
* Remove unused ticket CSS "messages" class by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1734
* Remove duplicated and unused `manifest.json` by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1735
* fix: font-size unit correction by subramanian0 in https://github.com/DMOJ/online-judge/pull/1736
* fix: security - window.opener property should not be available for third party sites. by subramanian0 in https://github.com/DMOJ/online-judge/pull/1737
* Cap new rating before computing new volatility by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1738
* Update translations from Crowdin by dmoj-build in https://github.com/DMOJ/online-judge/pull/1659
* Add rate limit to password reset view by quantum5 in https://github.com/DMOJ/online-judge/pull/1741
* Return to first page of paginator after changing filter options by quantum5 in https://github.com/DMOJ/online-judge/pull/1739
* Implement user display name override by quantum5 in https://github.com/DMOJ/online-judge/pull/1747
* Migrate rating system from Topcoder to Elo-MMR by int-y1 in https://github.com/DMOJ/online-judge/pull/1751
* For DQ'ed contest participations, set cumtime to zero unconditionally. by xiaowuc1 in https://github.com/DMOJ/online-judge/pull/1752
* For DQ'ed contest participations, set tiebreaker to zero unconditionally. by xiaowuc1 in https://github.com/DMOJ/online-judge/pull/1753
* Do not render MathJax math in description editor by int-y1 in https://github.com/DMOJ/online-judge/pull/1754
* Implement contest settings short display by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1732
* Fix `li` tag in contest short form display by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1755
* Use CSPRNG for judge keys by int-y1 in https://github.com/DMOJ/online-judge/pull/1757
* Update translations from Crowdin by dmoj-build in https://github.com/DMOJ/online-judge/pull/1740
* Implement hardcore 2FA mode by quantum5 in https://github.com/DMOJ/online-judge/pull/1762
* Ensure `edit_own_problem` is a prerequisite for `edit_all_problem` by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1722
* Add flake8-quotes to the linter by Riolku in https://github.com/DMOJ/online-judge/pull/1763
* Return a plaintext 404 response for comment vote view by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1769
* Prevent multiple pending join requests from same user by quantum5 in https://github.com/DMOJ/online-judge/pull/1770
* Fix linter mistake by int-y1 in https://github.com/DMOJ/online-judge/pull/1771
* Implement dumb full text search for CJK by quantum5 in https://github.com/DMOJ/online-judge/pull/1772
* Add styling for spoilers with HTML <details> tag by quantum5 in https://github.com/DMOJ/online-judge/pull/1774
* Allow <details> and <summary> tags by quantum5 in https://github.com/DMOJ/online-judge/pull/1775
* Allow joining a new contest while a participation is already active by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1778
* Add disallowed character validation for other Problem-related fields by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1779
* Remove CachedContestCalendar view by quantum5 in https://github.com/DMOJ/online-judge/pull/1781
* Replace force_text with force_str by quantum5 in https://github.com/DMOJ/online-judge/pull/1784
* Remove dependency on django.utils.six by quantum5 in https://github.com/DMOJ/online-judge/pull/1783
* Remove unused `rated_users` context on profile page by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1786
* Surface problem links for authors/curators on contest page; fixes 1746 by kiritofeng in https://github.com/DMOJ/online-judge/pull/1787
* Fix ticket message styling, add relative dates and admin button by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1780
* Preventing duplicate form submissions by leduythuccs in https://github.com/DMOJ/online-judge/pull/1777
* Fix join/spectate button in contest listing by int-y1 in https://github.com/DMOJ/online-judge/pull/1765
* Change style of unrated username by int-y1 in https://github.com/DMOJ/online-judge/pull/1795
* Add checkmark to hide closed tickets by int-y1 in https://github.com/DMOJ/online-judge/pull/1793
* Copy supported languages from judge-server to README by int-y1 in https://github.com/DMOJ/online-judge/pull/1792
* Avoid marking graded submissions as aborted by WallE256 in https://github.com/DMOJ/online-judge/pull/1798
* Move to MathJax 3.2.0 by int-y1 in https://github.com/DMOJ/online-judge/pull/1797
* Explicitly exclude current user from rank by point query by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1785
* Remove raw problem view by kiritofeng in https://github.com/DMOJ/online-judge/pull/1801
* Remove deprecated abstractproperty by quantum5 in https://github.com/DMOJ/online-judge/pull/1788
* Display rating level names as hover text by quantum5 in https://github.com/DMOJ/online-judge/pull/1790
* Remove uses of Django 3.0 deprecations by quantum5 in https://github.com/DMOJ/online-judge/pull/1789
* Avoid PyPI webauthn 1.x for now by quantum5 in https://github.com/DMOJ/online-judge/pull/1803
* Remove PO-Revision-Date-only translation PRs by quantum5 in https://github.com/DMOJ/online-judge/pull/1805
* Implement basic contest iCalendar output by quantum5 in https://github.com/DMOJ/online-judge/pull/1782
* Remove POT-Creation-Date-only translation PRs by quantum5 in https://github.com/DMOJ/online-judge/pull/1807
* Allow PDF footers to be disabled by quantum5 in https://github.com/DMOJ/online-judge/pull/1808
* Fix race condition in PDF math rendering by int-y1 in https://github.com/DMOJ/online-judge/pull/1810
* Properly prevent multiple form submissions by leduythuccs in https://github.com/DMOJ/online-judge/pull/1809
* Prevent editing of comment score from admin panel by kiritofeng in https://github.com/DMOJ/online-judge/pull/1812
* Typo fix by int-y1 in https://github.com/DMOJ/online-judge/pull/1818
* Fix mistune by UnknowName01 in https://github.com/DMOJ/online-judge/pull/1825
* Pass ticket to TicketMessageDataAjax view by quantum5 in https://github.com/DMOJ/online-judge/pull/1826
* Add space in rating chart by int-y1 in https://github.com/DMOJ/online-judge/pull/1817
* Add support for classes by quantum5 in https://github.com/DMOJ/online-judge/pull/1828
* Leave a spare judge when rejudging if possible by quantum5 in https://github.com/DMOJ/online-judge/pull/1842
* Distinguish virtual participations in contest submission inline by quantum5 in https://github.com/DMOJ/online-judge/pull/1841
* Fix contest editorial display for future editorials by Riolku in https://github.com/DMOJ/online-judge/pull/1845
* Infer private booleans; fixes 1829 by kiritofeng in https://github.com/DMOJ/online-judge/pull/1830
* Don't write empty dict to init.yml by leduythuccs in https://github.com/DMOJ/online-judge/pull/1794
* Full hidden scoreboard & Post-window own scoreboard by Riolku in https://github.com/DMOJ/online-judge/pull/1843
* Use different colour for the first letter of target by quantum5 in https://github.com/DMOJ/online-judge/pull/1814
* Correctly redirect organization user page with wrong slug by quantum5 in https://github.com/DMOJ/online-judge/pull/1813
* Set `u+x` on `manage.py` by kiritofeng in https://github.com/DMOJ/online-judge/pull/1848
* Add editorial column and filtering by Riolku in https://github.com/DMOJ/online-judge/pull/1844
* Auto-submit search form when has editorial is clicked by Riolku in https://github.com/DMOJ/online-judge/pull/1849
* Convert django.conf.urls.url to django.conf.urls.(re_)path by jisoochoi7561 in https://github.com/DMOJ/online-judge/pull/1823
* fix submission visibility in contests by Riolku in https://github.com/DMOJ/online-judge/pull/1850
* Fix errors in 1830 by kiritofeng in https://github.com/DMOJ/online-judge/pull/1852
* Fix problem name sort for untranslated problems by quantum5 in https://github.com/DMOJ/online-judge/pull/1853
* Fix statistics tab; fixes 1756 by kiritofeng in https://github.com/DMOJ/online-judge/pull/1851
* add submission 403 page by Riolku in https://github.com/DMOJ/online-judge/pull/1858
* add editorial book and sort by Riolku in https://github.com/DMOJ/online-judge/pull/1857
* cmd+enter to submit by y0105w49 in https://github.com/DMOJ/online-judge/pull/1868
* fix visibility check on contest saving by Riolku in https://github.com/DMOJ/online-judge/pull/1865
* add toggle for testers to see scoreboard by Riolku in https://github.com/DMOJ/online-judge/pull/1871
* Save submission state before rejudging by quantum5 in https://github.com/DMOJ/online-judge/pull/1867
* Change wording of "Maximum runtime on single test case" by slightlyskepticalpotat in https://github.com/DMOJ/online-judge/pull/1569
* add editorial tooltip by Riolku in https://github.com/DMOJ/online-judge/pull/1866
* shrink editorial column by Riolku in https://github.com/DMOJ/online-judge/pull/1863
* Can join organizations by Riolku in https://github.com/DMOJ/online-judge/pull/1854
* add `view_contest_submissions` field by Riolku in https://github.com/DMOJ/online-judge/pull/1860
* Fix Contest model fields without translation by quantum5 in https://github.com/DMOJ/online-judge/pull/1873
* add change visibility blog post perm by Riolku in https://github.com/DMOJ/online-judge/pull/1870
* Make massive Q chains look less silly by quantum5 in https://github.com/DMOJ/online-judge/pull/1874
* Add spectator to contests by Riolku in https://github.com/DMOJ/online-judge/pull/1869
* add `tester_see_scoreboard` to ContestAdmin by Riolku in https://github.com/DMOJ/online-judge/pull/1875
* fix contest join buttons by Riolku in https://github.com/DMOJ/online-judge/pull/1877
* Fix problems list not showing all problems a user has access to by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1820
* warn on joining, not spectating on list by Riolku in https://github.com/DMOJ/online-judge/pull/1880
* Avoid passing models to celery tasks by quantum5 in https://github.com/DMOJ/online-judge/pull/1878
* Compare i18n changes with correct branch by int-y1 in https://github.com/DMOJ/online-judge/pull/1884
* Fetch all branches in GitHub action by int-y1 in https://github.com/DMOJ/online-judge/pull/1885
* Avoid closing the translations PR when there is no change by quantum5 in https://github.com/DMOJ/online-judge/pull/1889
* Log context switch information into JSON logger by quantum5 in https://github.com/DMOJ/online-judge/pull/1882
* Switch custom requirements from unencrypted git to https by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1896
* Fix i18n messages for pwned passwords by int-y1 in https://github.com/DMOJ/online-judge/pull/1894
* Update Ruby key in language fixture by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1892
* Fix i18n in fields by int-y1 in https://github.com/DMOJ/online-judge/pull/1897
* Allow rejudging when there is only a single judge by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1902
* Add judge.utils.iterator.chunk by quantum5 in https://github.com/DMOJ/online-judge/pull/1903
* Use new safe translation module for Jinja2 by quantum5 in https://github.com/DMOJ/online-judge/pull/1899
* Remove unsafe translations in Python code by quantum5 in https://github.com/DMOJ/online-judge/pull/1900
* Add i18n to a line of text by int-y1 in https://github.com/DMOJ/online-judge/pull/1898
* Import Markup from MarkupSafe instead of jinja2 by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1909
* Make submission history chart timezone aware by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1904
* Localize date in user rating chart tooltip by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1908
* Fix i18n issues in models by int-y1 in https://github.com/DMOJ/online-judge/pull/1910
* Link editorial on problem list by Riolku in https://github.com/DMOJ/online-judge/pull/1906
* Fix translations unparsable by Django's extractor by quantum5 in https://github.com/DMOJ/online-judge/pull/1905
* updatemessages: checkout from $i18n_head when no material change by quantum5 in https://github.com/DMOJ/online-judge/pull/1912
* Fix dependency versions by int-y1 in https://github.com/DMOJ/online-judge/pull/1918
* Typo fix by int-y1 in https://github.com/DMOJ/online-judge/pull/1922
* Fix i18n on content titles by int-y1 in https://github.com/DMOJ/online-judge/pull/1920
* Fix countdown space by int-y1 in https://github.com/DMOJ/online-judge/pull/1928
* Remove useless "set title" by int-y1 in https://github.com/DMOJ/online-judge/pull/1924
* Clean up i18n in __str__ by int-y1 in https://github.com/DMOJ/online-judge/pull/1932
* Disallow voting on own comments by int-y1 in https://github.com/DMOJ/online-judge/pull/1927
* Remove dead templates by int-y1 in https://github.com/DMOJ/online-judge/pull/1923
* Fix TypeError with new version of Pygments by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1936
* Upgrade to actions/checkoutv2 by int-y1 in https://github.com/DMOJ/online-judge/pull/1930
* Fix i18n issues with relative_time by int-y1 in https://github.com/DMOJ/online-judge/pull/1934
* Fix comment editor's buttons on narrow screens by int-y1 in https://github.com/DMOJ/online-judge/pull/1907
* Clean up css for content columns by int-y1 in https://github.com/DMOJ/online-judge/pull/1926
* Fix preview when editing comment twice by int-y1 in https://github.com/DMOJ/online-judge/pull/1925
* Remove html tags in i18n translations by int-y1 in https://github.com/DMOJ/online-judge/pull/1921
* Remove py2 syntax in fixture by int-y1 in https://github.com/DMOJ/online-judge/pull/1957
* Fix bugs on class page by int-y1 in https://github.com/DMOJ/online-judge/pull/1963
* Update translations from Crowdin by dmoj-build in https://github.com/DMOJ/online-judge/pull/1891
* Updated the memory limit help text shown in the problem editor from 64mb to 256mb by wesley-a-leung in https://github.com/DMOJ/online-judge/pull/1950
* Better timezone detection in registration forms by int-y1 in https://github.com/DMOJ/online-judge/pull/1944
* Fix 500 error on /contest/\<code\>/leave by int-y1 in https://github.com/DMOJ/online-judge/pull/1956
* Improve license link by int-y1 in https://github.com/DMOJ/online-judge/pull/1959
* Ban pointless Unicode characters from problem statements by int-y1 in https://github.com/DMOJ/online-judge/pull/1960
* Remove py2 unicode syntax by int-y1 in https://github.com/DMOJ/online-judge/pull/1947
* Translate the problem types in a dropdown by int-y1 in https://github.com/DMOJ/online-judge/pull/1948
* Improve password reset email by int-y1 in https://github.com/DMOJ/online-judge/pull/1945
* Improve submission status's i18n strings by int-y1 in https://github.com/DMOJ/online-judge/pull/1946
* Fix filters that break i18n by int-y1 in https://github.com/DMOJ/online-judge/pull/1939
* Minor i18n message fixes by int-y1 in https://github.com/DMOJ/online-judge/pull/1937
* Make DMOJ logo symmetrical by int-y1 in https://github.com/DMOJ/online-judge/pull/1931
* Added Greek language option in UI by ptheoch in https://github.com/DMOJ/online-judge/pull/1972
* Fix regression caused by 42ee283; fixes 1970 by kiritofeng in https://github.com/DMOJ/online-judge/pull/1976
* Fix rare bug on copying text by int-y1 in https://github.com/DMOJ/online-judge/pull/1979
* Use full sentences in help_text by int-y1 in https://github.com/DMOJ/online-judge/pull/1988
* Fix scratch code's copy button by int-y1 in https://github.com/DMOJ/online-judge/pull/1982
* Fix code comments by int-y1 in https://github.com/DMOJ/online-judge/pull/1978
* Fix pwned passwords throwing `ValueError` by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/1991
* bridge: make blocked judges less noisy by Xyene in https://github.com/DMOJ/online-judge/pull/1998
* Fix broken celery dependency by quantum5 in https://github.com/DMOJ/online-judge/pull/2000
* Update admin sidebar by kiritofeng in https://github.com/DMOJ/online-judge/pull/1999
* Only display editorials for public problems; fixes 1961 by kiritofeng in https://github.com/DMOJ/online-judge/pull/2001
* Fix period in sentences by int-y1 in https://github.com/DMOJ/online-judge/pull/1992
* Avoid waiting when only one judge can handle a submission by quantum5 in https://github.com/DMOJ/online-judge/pull/2002
* Show more comment info in admin page by int-y1 in https://github.com/DMOJ/online-judge/pull/2012
* Check for organization join limit at registration by int-y1 in https://github.com/DMOJ/online-judge/pull/2003
* Fix i18n messages by int-y1 in https://github.com/DMOJ/online-judge/pull/1984
* Add i18n plurals in templates by int-y1 in https://github.com/DMOJ/online-judge/pull/1983
* Add i18n to js messages by int-y1 in https://github.com/DMOJ/online-judge/pull/1985
* Change how username is displayed in tickets by int-y1 in https://github.com/DMOJ/online-judge/pull/2008
* Allow sorting of organization's user list by int-y1 in https://github.com/DMOJ/online-judge/pull/1977
* Confirm rejudging on submission page by Riolku in https://github.com/DMOJ/online-judge/pull/2010
* Increase precision on relative time offsets by int-y1 in https://github.com/DMOJ/online-judge/pull/1990
* Add i18n to server-side messages by int-y1 in https://github.com/DMOJ/online-judge/pull/1980
* Fixup active tab having a pixel border drawn by Xyene in https://github.com/DMOJ/online-judge/pull/2014
* Upgrade to Django 3.2 by quantum5 in https://github.com/DMOJ/online-judge/pull/1811
* Make comments work again on Django 3.2 by quantum5 in https://github.com/DMOJ/online-judge/pull/2016
* Add related_model to FakeJoinField for join_sql_subquery by quantum5 in https://github.com/DMOJ/online-judge/pull/2017
* Fix rating graph regression from cd167f8 by Xyene in https://github.com/DMOJ/online-judge/pull/2018
* Partially revert fd8f8fc to fix 2013 by Xyene in https://github.com/DMOJ/online-judge/pull/2019
* ci: update actions by Xyene in https://github.com/DMOJ/online-judge/pull/2015
* Remove dead settings by int-y1 in https://github.com/DMOJ/online-judge/pull/1952
* Migrate to bleach 5.0.0 by int-y1 in https://github.com/DMOJ/online-judge/pull/1915
* Remove useless locale files by int-y1 in https://github.com/DMOJ/online-judge/pull/1940
* i18n plurals in error messages by int-y1 in https://github.com/DMOJ/online-judge/pull/1953
* Remove reply button on old comments by int-y1 in https://github.com/DMOJ/online-judge/pull/2009
* Refactor user submission table's js by int-y1 in https://github.com/DMOJ/online-judge/pull/1954
* Highlight partial AC testcases differently by Xyene in https://github.com/DMOJ/online-judge/pull/2021
* Make contest list header casing match the rest of the site by Xyene in https://github.com/DMOJ/online-judge/pull/2022
* Improve styling of password reset email by int-y1 in https://github.com/DMOJ/online-judge/pull/1993
* Replace unique_together_left_join with FilteredRelation by quantum5 in https://github.com/DMOJ/online-judge/pull/2023
* Remove RawSQLColumn now that it's unused by quantum5 in https://github.com/DMOJ/online-judge/pull/2024
* Fix submission table for 0 submissions by int-y1 in https://github.com/DMOJ/online-judge/pull/2030
* Remove i18n for coding error messages by int-y1 in https://github.com/DMOJ/online-judge/pull/2029
* Modernize activation email by int-y1 in https://github.com/DMOJ/online-judge/pull/2028
* Make `pretest_test_cases` and `test_cases` disjoint by Xyene in https://github.com/DMOJ/online-judge/pull/2025
* Remove dead function by int-y1 in https://github.com/DMOJ/online-judge/pull/2034
* Clean up table css by int-y1 in https://github.com/DMOJ/online-judge/pull/2037
* Clean up page tab's css by int-y1 in https://github.com/DMOJ/online-judge/pull/2038
* Clean up ContestCalendar css by int-y1 in https://github.com/DMOJ/online-judge/pull/2036
* Don't allow for infinite and nan values in `safe_float_or_none` by kiritofeng in https://github.com/DMOJ/online-judge/pull/2039
* Remove textWidth by int-y1 in https://github.com/DMOJ/online-judge/pull/2042
* Introduce primary color in scss by int-y1 in https://github.com/DMOJ/online-judge/pull/2041
* Standardize SCSS gray colors by int-y1 in https://github.com/DMOJ/online-judge/pull/2043
* Remove dead AdminPagedownWidget by int-y1 in https://github.com/DMOJ/online-judge/pull/2045
* Clean up widget scss by int-y1 in https://github.com/DMOJ/online-judge/pull/2044
* Migrate text editor css to scss by int-y1 in https://github.com/DMOJ/online-judge/pull/2048
* Add scss variables for link colors by int-y1 in https://github.com/DMOJ/online-judge/pull/2049
* Fix editor buttons when replying to comment by int-y1 in https://github.com/DMOJ/online-judge/pull/2050
* Add link to post when using blog summary by int-y1 in https://github.com/DMOJ/online-judge/pull/2052
* Add querystring option to enable dark mode by int-y1 in https://github.com/DMOJ/online-judge/pull/2053
* Add querystring option to enable dark mode (attempt 2) by int-y1 in https://github.com/DMOJ/online-judge/pull/2056
* Improve l10n in solved problems table by int-y1 in https://github.com/DMOJ/online-judge/pull/2063
* Update Django links to 3.2 by int-y1 in https://github.com/DMOJ/online-judge/pull/2062
* Correctly set contest.is_organization_private when using classes by quantum5 in https://github.com/DMOJ/online-judge/pull/2065
* Make it possible to change class members in admin by quantum5 in https://github.com/DMOJ/online-judge/pull/2064
* Create dark mode for Featherlight by int-y1 in https://github.com/DMOJ/online-judge/pull/2068
* fix page titles on dark mode by slightlyskepticalpotat in https://github.com/DMOJ/online-judge/pull/2067
* Make ?dark activate dark mode by quantum5 in https://github.com/DMOJ/online-judge/pull/2069
* Clean up comment CSS by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/2070
* Use striped tables by int-y1 in https://github.com/DMOJ/online-judge/pull/2071
* Remove IE8 code by int-y1 in https://github.com/DMOJ/online-judge/pull/2072
* Allow unicode and nobigmath hints to be used with site data by FherStk in https://github.com/DMOJ/online-judge/pull/2055
* Add problem points vote functionality by lakshy-gupta in https://github.com/DMOJ/online-judge/pull/1645
* Fix small error in pp calculation by int-y1 in https://github.com/DMOJ/online-judge/pull/2074
* Fix flake8 configuration by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/2077
* Fix bridge database connection leaks by quantum5 in https://github.com/DMOJ/online-judge/pull/2080
* Minor fix to judge table by int-y1 in https://github.com/DMOJ/online-judge/pull/2078
* Use DMOJ's own `django-fernet-fields` by kiritofeng in https://github.com/DMOJ/online-judge/pull/2081
* Explicitly set DEFAULT_AUTO_FIELD by quantum5 in https://github.com/DMOJ/online-judge/pull/2082
* Dark mode images by int-y1 in https://github.com/DMOJ/online-judge/pull/2084
* Fix blank submission activity colour by Ninjaclasher in https://github.com/DMOJ/online-judge/pull/2086
* Fix CSS for rating circles by int-y1 in https://github.com/DMOJ/online-judge/pull/2083
* Fix math_setting crash when reporting errors by quantum5 in https://github.com/DMOJ/online-judge/pull/2087
* Change style for bad user mentions by int-y1 in https://github.com/DMOJ/online-judge/pull/2079
* Remove dead variables for rating chart by int-y1 in https://github.com/DMOJ/online-judge/pull/2090
* Remove recently_attempted_problems by int-y1 in https://github.com/DMOJ/online-judge/pull/2088
* Fix the check for has_any_solves by int-y1 in https://github.com/DMOJ/online-judge/pull/2089
* Standardize labels in edit profile page by int-y1 in https://github.com/DMOJ/online-judge/pull/2073
* Fix SVG/PNG math in dark mode by int-y1 in https://github.com/DMOJ/online-judge/pull/2093
* Move ticket CSS into SCSS file by int-y1 in https://github.com/DMOJ/online-judge/pull/2094
* Use more reasonable values in sitemap by int-y1 in https://github.com/DMOJ/online-judge/pull/2092
* Make problem search more sane by int-y1 in https://github.com/DMOJ/online-judge/pull/2051
* Update translations from Crowdin by dmoj-build in https://github.com/DMOJ/online-judge/pull/1971
* Fix ticket form's width by int-y1 in https://github.com/DMOJ/online-judge/pull/2096
* Improve padding and margin of comment section by int-y1 in https://github.com/DMOJ/online-judge/pull/2098
* Clean up user icon in top-right corner by int-y1 in https://github.com/DMOJ/online-judge/pull/2100
* Implement disabling a judge by WallE256 in https://github.com/DMOJ/online-judge/pull/2005
* Improve the judge and runtime admin pages by WallE256 in https://github.com/DMOJ/online-judge/pull/2102
* Replace deprecated `django.conf.url` with `django.urls.path` by kiritofeng in https://github.com/DMOJ/online-judge/pull/2085
* Delete & Prevent zombie editorials (Closes 1958) by jdabtieu in https://github.com/DMOJ/online-judge/pull/2004
* Remove negative margins in comments by int-y1 in https://github.com/DMOJ/online-judge/pull/2101
* Remove dead css on comments by int-y1 in https://github.com/DMOJ/online-judge/pull/2105
* Clean up css for users by int-y1 in https://github.com/DMOJ/online-judge/pull/2106
* Clean up css on contest list page by int-y1 in https://github.com/DMOJ/online-judge/pull/2107
* Clean up pagination css in user table by int-y1 in https://github.com/DMOJ/online-judge/pull/2112
* Fix small bug with problem attempt icon by int-y1 in https://github.com/DMOJ/online-judge/pull/2104
* Simplify AC query for /stats/language/ by int-y1 in https://github.com/DMOJ/online-judge/pull/2109
* Clean up org edit page by int-y1 in https://github.com/DMOJ/online-judge/pull/2111
* Clean up blog css by int-y1 in https://github.com/DMOJ/online-judge/pull/2113
* Add more space for user info column by int-y1 in https://github.com/DMOJ/online-judge/pull/2114
* Add dark Pygments code theme by int-y1 in https://github.com/DMOJ/online-judge/pull/2115
* Simplify CSS in judge version table by int-y1 in https://github.com/DMOJ/online-judge/pull/2117
* Slightly clean up navbar css by int-y1 in https://github.com/DMOJ/online-judge/pull/2119
* Remove Django 2.2 file by int-y1 in https://github.com/DMOJ/online-judge/pull/2125
* Move navbar CSS into separate file by int-y1 in https://github.com/DMOJ/online-judge/pull/2120
* Clean up contest calendar css by int-y1 in https://github.com/DMOJ/online-judge/pull/2122
* Fix rendering of target color on contest page by Balint-R in https://github.com/DMOJ/online-judge/pull/2124
* Clean up blog page css by int-y1 in https://github.com/DMOJ/online-judge/pull/2121
* Remove msp math renderer by int-y1 in https://github.com/DMOJ/online-judge/pull/2126
* Simplify design of user table's rating column by int-y1 in https://github.com/DMOJ/online-judge/pull/2127
* Fix hot problems css by int-y1 in https://github.com/DMOJ/online-judge/pull/2128
* Add more i18n by int-y1 in https://github.com/DMOJ/online-judge/pull/2132
* Minor i18n fixes by int-y1 in https://github.com/DMOJ/online-judge/pull/2134
* Remove png support in mathoid by int-y1 in https://github.com/DMOJ/online-judge/pull/2130
* Update translations from Crowdin by dmoj-build in https://github.com/DMOJ/online-judge/pull/2097
* Pin packaging to < 22 by Xyene in https://github.com/DMOJ/online-judge/pull/2138
</details>
New contributors
* kevinjycui made their first contribution in https://github.com/DMOJ/online-judge/pull/1399
* adambenali made their first contribution in https://github.com/DMOJ/online-judge/pull/1401
* zecookiez made their first contribution in https://github.com/DMOJ/online-judge/pull/1503
* slightlyskepticalpotat made their first contribution in https://github.com/DMOJ/online-judge/pull/1481
* malbareda made their first contribution in https://github.com/DMOJ/online-judge/pull/1518
* jtyliu made their first contribution in https://github.com/DMOJ/online-judge/pull/1564
* munhyunsu made their first contribution in https://github.com/DMOJ/online-judge/pull/1582
* leduythuccs made their first contribution in https://github.com/DMOJ/online-judge/pull/1638
* subramanian0 made their first contribution in https://github.com/DMOJ/online-judge/pull/1736
* Riolku made their first contribution in https://github.com/DMOJ/online-judge/pull/1763
* UnknowName01 made their first contribution in https://github.com/DMOJ/online-judge/pull/1825
* jisoochoi7561 made their first contribution in https://github.com/DMOJ/online-judge/pull/1823
* y0105w49 made their first contribution in https://github.com/DMOJ/online-judge/pull/1868
* wesley-a-leung made their first contribution in https://github.com/DMOJ/online-judge/pull/1950
* ptheoch made their first contribution in https://github.com/DMOJ/online-judge/pull/1972
* FherStk made their first contribution in https://github.com/DMOJ/online-judge/pull/2055
* lakshy-gupta made their first contribution in https://github.com/DMOJ/online-judge/pull/1645
* jdabtieu made their first contribution in https://github.com/DMOJ/online-judge/pull/2004
* Balint-R made their first contribution in https://github.com/DMOJ/online-judge/pull/2124