-*- mode: text; mode: auto-fill; coding: koi8-r -*-
$Id: NEWS.RUS,v 1.31 2006/06/09 11:09:23 cher Exp $

Версия 2.2.0 (20060609)
=======================
То же самое, что версия 2.1.49. С этого момента в ветке 2.2
будут только исправляться ошибки. Все новые возможности будут
добавляться в ветку 2.3, которая по окончанию разработки станет
версией 3.0.

Версия 2.1.49 (20060609)
========================

Добавлена поддержка нового "языка" - текстовых файлов (txt). Это
позволяет сдавать на проверку обычные текстовые файлы (например,
в output-only задачах). Результатом компиляции текстового файла
является скрипт, который всегда возвращает код завершения 1.
Для тонкой настройки, какие языки могут использоваться для сдачи
каждой задачи можно использовать конфигурационную переменную
`disable_language' раздела описания задачи.

serve
-----
В генерируемый файл журнала посылок в XML-формате добавлена
дополнительная информация о времени турнира. В журнал посылок во
внешнем XML-формате добавлена информация об имени турнира.

Поддерживается автоматическая генерация журнала посылок как во
внутреннем, так и во внешнем формате через заданные интервалы
времени. С помощью новой глобальной конфигурационной переменной
`external_xml_update_time' задается интервал времени в секундах
между генерацией XML-файла во внешнем формате, а с помощью новой
глобальной конфигурационной переменной `internal_xml_update_time' 
задается интервал времени в секундах между генерацией XML-файла
во внутреннем формате. Файлы имеют следующие пути:
<contest_home>/var/status/dir/external.xml
<contest_home>/var/status/dir/internal.xml

super-serve, serve-control
--------------------------
Поддерживается редактирование новых глобальных конфигурационных
переменных `external_xml_update_time' и `internal_xml_update_time'.

testlib
-------
Текст сообщения, который выводится при вызове `quit' выводится
на стандартный поток ошибок, а не на стандартный поток вывода
(для возможности работы чекера в режиме оценивания решения).

run
---
Исправлена ошибка, из-за которой решения для DOS-компиляторов не
работали в режиме перенаправления стандартных потоков, когда run
запускался под управлением super-serve.

serve
-----
Поддерживаются задачи, в которых балл за задачу (или за каждый
тест) выставляется проверяющей программой. Раньше чекер давал
ответ ДА/НЕТ для каждого теста, а балл назначался исходя из
настроек задачи. Теперь чекер может оценивать тест в любое
количество баллов от 0 и до максимального балла за данный тест.

Для этого в разделе определения задачи поддерживается
конфигурационная переменная `scoring_checker'. Если эта
переменная установлена в значение 1, то балл за тест будет
проставляться чекером.

В турнирах по системе KIROV/OLYMPIAD чекер оценивает каждый тест
по отдельности, и суммарный балл за задачу равен сумме оценок
чекера по каждому тесту. В турнирах по системе MOSCOW балл за
задачу равен оценке чекера первого непройденного теста (в этом
случае, разумнее всего, чтобы у задачи был единственный тест).

Оценивающий чекер должен работать следующим образом. Код
завершения чекера, как обычно, обозначает результат проверки:
0       OK
4       PE
5       WA
все остальные коды интерпретируются как Check failed.

Если чекер вернул OK, то тест/задача всегда получает полный балл.
Если чекер вернул PE, то тест/задача получает 0.
Если чекер вернул WA, то на стандартный поток вывода он должен
записать единственное число - балл за тест/задачу. Кроме числа и
пробельных символов в стандартный поток вывода ничего выводиться
не должно (иначе - Check failed). Число должно быть >= 0 и
меньше максимального балла за задачу. Если выведено другое число
- Check failed.

run
---
Поддерживаются задачи с оценивающим чекером.

super-serve, serve-control
--------------------------
Поддерживается редактирование переменной `scoring_checker'
раздела описания задачи.

Поддерживается редактирование переменной `disable_language'
раздела описания задачи.

run
---
Для турниров по системе MOSCOW поддерживаются "скачки" в баллах,
то есть при оценивании задачи промежуточные баллы могут
пропускаться. Пусть для некоторой задачи есть 10 тестов,
максимальный балл равен 2, при этом решения оцениваются либо в
0 (если пройдены не все тесты), либо в 2 балла. Тогда переменная
`score_tests' для данной задачи должна быть установлена
следующим образом:
score_tests = "11"
то есть решение, которое прошло 10 тестов должно оцениваться в 1
балл, но такое решение (неявно) оценивается в два балла, поэтому
будет выбрана оценка 2 балла.
Таким образом, последовательность номеров тестов образует
неубывающую последовательность (то есть несколько подряд номеров
тестов могут быть равны - в этом случае будет выбран
максимальный балл.

serve
-----
Поддерживаются "output-only" задачи, то есть задачи, в которых
сдается файл с ответом, а не файл с исходным текстом программы.
Для этого добавлена конфигурационная переменная `output_only'
раздела описания задачи. Эта переменная может быть установлена и
в описании абстрактной задачи и будет наследоваться. Значение по
умолчанию - 0. Если переменная установлена в 1, соответствующая
задача является "output-only". Для output-only задач все равно
выполняется стадия "компиляции" и "запуска" (см. ниже).

compile
-------
Поддерживаются "output-only" задачи. В этом случае "компиляция"
программы заключается в копировании файла "исходного текста" (а
на самом деле ответа) в файл результата компиляции. Выбранный
язык в этом случае не играет никакой роли, так как компилятор
соответствующего языка не запускается.

run
---
Поддерживаются "output-only" задачи. В этом случае у задачи
должен быть единственный тест. "Запуск на выполнение"
заключается в копировании "исполняемого" файла в файл результата
работы, после чего он проверяется обычным образом с помощью
запуска проверяющей программы. 

super-serve, serve-control
--------------------------
Поддерживается редактирование переменной `output_only' раздела
описания задачи.

serve, master, judge
--------------------
При отправке сообщения участникам до начала турнира
администратор или судья может указать, что сообщение должно
стать видимым обычным участникам только после начала турнира.

execute
-------
Новая программа для запуска тестируемых программ из командной
строки. Программа `execute' позволяет установить все виды
ограничений (по времени, по памяти, по доступным операциям),
которые поддерживаются системой ejudge.

libchecker
----------
Библиотека портирована под Windows с использованием компилятора
gcc (gcc -mno-cygwin). В результате компиляции получаются .DLL и
.LIB файлы, которые могут использоваться любыми компиляторами
для Windows.

Версия 2.1.48 (20060430)
========================

contest.xml
-----------
Добавлен новый элемент `main_url'. Это элемент позволяет
задавать URL для главной страницы турнира и используется в
письме с регистрационными данными, отправляемом при регистрации
нового пользователя на турнир, например
<main_url>http://acm.univ.ru/contests/acm2006</main_url>

Добавлен новый атрибут `send_passwd_email'. Если этот атрибут
установлен в "yes", то письмо с регистрационными данными нового
пользователя высылается даже в случае, когда включена упрощенная
регистрация на турнир.

ejudge.xml
----------
Добавлены новые элементы `server_name', `server_name_en',
`server_main_url'. Элемент `server_name' позволяет задать имя
сервера, на котором установлена система ejudge, например
<server_name>Сервер турниров университета</server_name>
Элемент `server_name_en' позволяет задать имя сервера на
английском языке. Оно используется, когда при регистрации выбран
английский язык, например
<server_name_en>The university contest server</server_name_an>
Элемент `server_main_url' позволяет задать URL на сервере для
данной инсталляции системы ejudge в целом, например,
<server_main_url>http://acm.univ.ru/contests</server_main_url>
Значения этих элементов используются при отправке письма с
регистрационными данными при регистрации новых пользователей в
случае, когда идентификатор турнира не указан.

userlist-server
---------------
Изменены стандартные шаблоны писем, посылаемых при регистрации
нового пользователя. В письмах используются элементы
<server_name>, <server_name_en>, <server_main_url> файла
ejudge.xml и элементы <name>, <name_en>, <main_url> файла
конфигурации турнира contest.xml.

Поддерживается атрибут "send_passwd_email" файла contest.xml.

userlist-server, edit-userlist
------------------------------
В базу данных пользователей добавлено новое поле
`simple_registration', которое устанавливается в значение "yes",
если пользователь был зарегистрирован с помощью упрощенной
процедуры регистрации. Значение данного поля может быть изменено
администратором с помощью программы `edit-userlist'.

super-serve, serve-control
--------------------------
Поддерживается редактирование элемента <main_url> и атрибута
"send_passwd_email" файла конфигурации турнира contest.xml.

team, serve
-----------
Корректно отображаются бинарные файлы в команде "View source".

serve
-----
В раздел описания языка программирования файла serve.cfg
добавлено новая конфигурационная переменная `content_type'. Если
эта переменная установлена, то по команде "Download source"
CGI-программ master или judge или по команде "View source" будет
генерироваться страница с указанным значением поля
"Content-Type". Это поле полезно для "языков" с бинарным
представлением. Например, если в системе есть язык "Microsoft
Word", то для него можно установить поле content_type так:
content_type = "application/msword"

Имя файла при загрузке исходного текста формируется корректно
даже для бинарных языков.

serve, compile
--------------
Максимальное количество одновременно поддерживаемых языков
программирования увеличено до 100.

super-serve, serve-control
--------------------------
Поддерживается редактирование полей `binary' и `content_type'
раздела описания языка программирования.

Исправлена ошибка, из-за которой было невозможно редактирование
поля `acm_run_penalty'.

ejudge-setup
------------
Поддерживается редактирование начальных значений элементов
<server_name>, <server_name_en>, <server_main_url> файла
ejudge.xml.

Версия 2.1.47 (20060419)
========================

contest.xml
-----------
Добавлен новый атрибут `simple_registration'. Если этот атрибут
установлен, действует упрощенная схема регистрации пользователей
на турнир. Новому пользователю не высылается письмо со
сгенерированным паролем, а пароль отображается при успешной
регистрации, после чего можно перейти к редактированию личных
данных.

super-serve, serve-control
--------------------------
Поддерживается редактирование атрибута `simple_registration'
файла конфигурации турнира `contest.xml'.

Поддерживается редактирование новой глобальной конфигурационной
переменной `always_show_problems'.

Пользователи, для которых установлены биты привилегий,
автоматически регистрируются на турнир, и для них
устанавливается флаг невидимости.

При редактировании битов полномочий поддерживается выбор из
предопределенных наборов: "Observer", "Judge", "Master".

serve, team
-----------
Добавлена глобальная конфигурационная переменная
`always_show_problems'. Если переменная установлена в 1, то
ссылка на условия задач доступна участникам турнира до его
начала.

Добавлена конфигурационная переменная секции определения задачи
`acm_run_penalty'. Данная конфигурационная переменная действует
только в режимах турнира ACM или MOSCOW и позволяет задавать
штраф за неправильные попытки до сдачи задачи. Стандартное
значение штрафа, используемое на всех соревнованиях по системе
ACM равно 20. Например, можно установить значение штрафа в 0,
чтобы принимать задачи по системе "сдана/не сдана".
Переменная `acm_run_penalty' может быть определена в абстрактной
задаче, в это случае ее значение наследуется.

register
--------
Поддерживается упрощенный режим регистрации на турнир,
задаваемый с помощью атрибута `simple_registration'.

serve
-----
Исправлены ошибки отображения таблицы сводной статистики по
задачам на странице участника в режиме турнира KIROV.

ejudge-setup
------------
В конец генерируемого настроечного скрипта добавлена команда
пробного запуска программы `serve' для тестового турнира 1.

super-serve, serve-control
--------------------------
Редактирование конфигурационной переменной задачи `test_sets'
поддерживается.

Поддерживается новый стандартный чекер `cmp_huge_int'.

Исправлены несколько ошибок в процедуре проверки тестов задачи и
рекомпиляции чекера (команда "Check contest settings").

Поддерживается редактирование глобальной конфигурационной
переменной `always_show_problems'.

Поддерживается редактирование конфигурационной переменной задачи
`acm_run_penalty'.

userlist-server
---------------
Член команды не может быть удалён, если соответствующая команда
отмечена как "только для чтения" (read-only).

libchecker
----------
Добавлены новые функции `checker_in_eoln', `checker_team_eoln',
`checker_corr_eoln', которые проверяют, что в соответствующем
входном файле находится символ конца строки текста '\n'. При
этом пропускаются все пробельные символы и считывается сам
символ '\n'.

Добавлена новая стандартная проверяющая программа
`cmp_huge_int', которая сравнивает число в выходном файле
тестируемой программы и число в файле с правильным ответом.
Максимальная длина сравниваемых чисел - 1Мб. При этом перед
числом игнорируются пробельные символы, игнорируется знак '+',
если он присутствует. В числе игнорируются ведущие нули.

serve-cmd
---------
Добавлены новые команды team-dump-source, team-dump-clar,
team-run-status.
serve-cmd CONTEST-ID team-dump-source SESSION-FILE RUN-ID
	Выводит на стандартный поток вывода текст посылки
        RUN-ID. В турнире должен быть разрешен просмотр
        исходного кода посылок, кроме того, пользователь должен
        быть автором этой посылки.
serve-cmd CONTEST-ID team-run-status SESSION-FILE RUN-ID
	Выводит на стандартный поток вывода строку статуса
        посылки RUN-ID. Пользователь должен быть автором данной
        посылки.
serve-cmd CONTEST-ID team-dump-clar SESSION-FILE CLAR-ID
	Выводит на стандартный поток вывода текст сообщения
        CLAR-ID. Пользователь должен иметь право просматривать
        данное сообщение.

Версия 2.1.46 (20060319)
========================

configure
---------
Опция --with-g++ переименована в --with-gpp, потому что, как
оказалось, configure не распознает `+' в названиях опций.

serve
-----
В выражениях фильтра посылок поддерживаются два новых предиката:
latest[(N)]
	Равен TRUE, если после текущей посылки или посылки с
        номером N нет посылки того же пользователя по той же
        задаче, которая имеет статус "OK", "Partial solution"
        или "Accepted for testing". Предикат может
        использоваться в турнирах системы OLYMPIAD для отбора
        посылок, подлежащих тестированию.
afterok[(N)]
	Равен TRUE, если до текущей посылки или посылки с
        номером N есть посылка того же пользователя по той же
        задаче, которая имеет статус "OK". Предикат может
        использоваться в турнирах по системе ACM, KIROV, MOSCOW
        для отбора посылок, не влияющих на результат, или
        наоборот, для отбора посылок, влияющих на результат.

Для турниров по системе OLYMPIAD полностью реализовано "теневое"
тестирование решений. Когда турнир работает в режиме приёма
решений на проверку, администратор турнира может протестировать
полностью либо отдельную посылку (команда "Full rejudge" в
выпадающем меню изменения статуса данной посылки), либо
выбранное множество посылок (команда "Full rejudge displayed
runs"). Выбранные посылки будут протестированы на полном наборе
тестов и результаты тестирования будут доступны администратору
турнира и судьям турнира и будут отражены в текущей таблице
результатов. Таким образом протестированные посылки не требуют
перетестирования после завершения приема решений. Таким образом,
даже в ходе турнира по системе OLYMPIAD можно накапливать
результаты, которые по завершению турнира станут
окончательными. Во время турнира, пока турнир находится в режиме
приема решений на проверку, участникам доступна только
информация о предварительном тестировании посылки. Как только
турнир будет переключен в режим окончательного тестирования,
участники получат доступ к полным результатам тестирования.

Полное "теневое" тестирование ведётся с пониженным приоритетом
так, что посылки от пользователей будут обрабатываться в первую
очередь. Однако, текущая версия системы ejudge не позволяет
тестировать по одному тесту, то есть посылка тестируется на всех
тестах и тестирование посылки не может быть прервано посередине.
То есть, если полное тестирование посылки занимает заметное
время, это может создать очередь из посылок, принимаемых на
предварительное тестирование.

serve, master
-------------
Добавлена поддержка команды "Full rejudge displayed runs" для
теневого тестирования решений в турнирах по системе OLYMPIAD в
режиме приема решений на проверку.

run
---
Добавлены две глобальные конфигурационные переменные файла
`serve.cfg': skip_accept_testing, skip_full_testing.
Если первая переменная установлена, то программа `run' будет
игнорировать все запросы на тестирование на предварительных
тестах для турниров по системе OLYMPIAD. Если вторая переменная
установлена, программа `run' будет игнорировать все запросы на
полное тестирование для турниров по системе OLYMPIAD.

Корректно реализовано игнорирование пакетов. Игнорируемые пакеты
теперь не приводят к зацикливанию `run', если они не удаляются
из каталога обмена. Пакет `QUIT' (принудительное завершение)
теперь имеет наивысший приоритет.

capexec, libdropcaps.so
-----------------------
Исправления для поддержки ядер 2.6.*.

serve, team
-----------
Добавлена новая глобальная конфигурационная переменная
`disable_failed_test_view'. Если эта переменная установлена в 1,
то на странице участника не отображается номер первого
неправильного теста. Переменная работает только для турниров по
системе ACM или MOSCOW.

serve-control, super-serve
--------------------------
Поддерживается редактирование глобальной конфигурационной
переменной `disable_failed_test_view'.

Версия 2.1.45 (20060121)
========================

Обновлено руководство по инсталляции системы в файлах INSTALL и
INSTALL.RUS.

ejudge.xml
----------
В конфигурационный файл добавлены новые элементы
<job_server_log>, <job_server_spool>, <job_server_work>, которые
используются программой `job-server'. Элементы могут быть
опущены, тогда их значение будет установлено по умолчанию по
значению элемента <var_dir>.
Элемент <job_server_log> позволяет задать имя файла, который
будет использоваться как журнал работы программы `job-server' в
режиме демона. Если программа `job-server' запущена не в режиме
демона, сообщения об её работе выводятся на стандартный поток
вывода, и значение этого элемента не используется. Если элемент
<job_server_log> не задан, используется значение
$<var_dir>/job_server.log, где $<var_dir> - значение элемента
<var_dir> файла ejudge.xml.
Элемент <job_server_spool> позволяет задать каталог для очереди
заданий программы `job-server'. Если элемент <job_server_spool>
не задан, используется значение $<var_dir>/jspool, где
$<var_dir> - значение элемента <var_dir> файла ejudge.xml.
Элемент <job_server_work> позволяет задать рабочий каталог для
программы `job-server' и порождаемых ей заданий. Если элемент
<job_server_work> не задан, используется значение
$<var_dir>/jwork, где $<var_dir> - значение элемента <var_dir>
файла ejudge.xml.

contest.xml
-----------
Добавлена поддержка новых элементов <cf_notify_email>,
<clar_notify_email>, <daily_stat_email>. Они используются
сервером турнира `serve' для отсылки уведомлений о некоторых
событиях, возникающих в турнире.
<cf_notify_email> позволяет задать адрес (или адреса) e-mail, по
которым будет направляться уведомление, если тестирование
посылки завершается ошибкой, то есть посылка получает статус
CHECK_FAILED.
<clar_notify_email> позволяет задать адрес (или адреса) e-mail,
по которым будет направляться уведомление о поступлении в турнир
вопроса от участника.
<daily_stat_email> позволяет задать адрес (или адреса) e-mail,
по которым будет направляться письмо с суточной статистикой
работы турнира.

userlist-server
---------------
В базу данных участников в записи о регистрациях на турниры
добавлено поле "date" для хранения времени регистрации на
турнир.

libchecker
----------
Функции `checker_read_file_by_line' и
`checker_read_file_by_line_f' не используют больше стек для
размещения временного буфера. Это позволяет считывать в память
большие файлы.

serve
-----
Добавлена новая конфигурационная переменная `enable_compilation'
секции описания задачи файла `serve.cfg'. Переменная действует
только тогда, когда для задачи установлена переменная
`disable_testing'. Если в этом случае переменная
`enable_compilation' установлена в 1, то присланные решения по
этой задаче компилируются. Если компиляция завершилась успешно,
то для посылки устанавливается статус "Accepted for testing"
(RUN_ACCEPTED), а в противном случае устанавливается статус
"Compilation error" (RUN_COMPILE_ERR).

Поддерживается отсылка уведомлений по электронной почте в случае
возникновения ошибки CHECK_FAILED и в случае поступления вопроса
от участника турнира. Адрес, по которому отсылаются сообщения,
задаётся с помощью элементов <cf_notify_email>,
<clar_notify_email> соответственно.

Поддерживается новая глобальная конфигурационная переменная
`contest_finish_time' файла `serve.cfg'. Эта переменная
позволяет установить астрономическое время окончания турнира в
случае, когда его длительность не ограничена.

Поддерживается рассылка суточной статистики о турнире по адресу,
указанному в элементе <daily_stat_email> файла contest.xml.

База сообщений (clar.log) теперь хранится в бинарном формате.
При запуске `serve' перекодирует при необходимости базу из
старого формата в новый. В бинарном формате добавлена поддержка
IPv6 адресов (пока не используется), 64-битного типа time_t,
и поля `j_from', в котором хранится идентификатор пользователя,
пославшего сообщение от имени Жюри.

При просмотре сообщений привилегированным пользователем (в
CGI-программах `master' или `judge') выводится имя пользователя,
от имени которого было послан ответ судей участнику или
сообщение всем участникам.

super-serve
-----------
При генерации конфигурационного файла турнира `serve.cfg', если
включена поддержка языка Java, в параметрах запуска
java-программ на тестирование языковое окружение (переменная
окружения LANG) устанавливается в "C" (другими словами, все
языковые настройки отменяются). Это важно для того, чтобы числа
с плавающей точкой считывались и печатались в стандартном
формате.

Поддерживается редактирование новых элементов <cf_notify_email>,
<clar_notify_email>, <daily_stat_email> конфигурационного файла
contest.xml.

Поддерживается редактирование глобальной конфигурационной
переменной `contest_finish_time' файла `serve.cfg'.

super-serve, serve-control
--------------------------
Поддерживается редактирование новой конфигурационной переменной
`enable_compilation' раздела описания задачи файла `serve.cfg'.

run
---
Если проверяющая программа завершается по тайм-ауту из-за
сигнала, или возвращает нестандартный код завершения, в файл
вывода проверяющей программы добавляется диагностическое
сообщение.

job-server
----------
Новая программа, которая предназначена для выполнения задач из
очереди "неприоритетных" задач. Сервер турнира или сервер
пользователей может поставить задачу на выполнение в очередь
программе `job-server', если задача не должна быть выполнена
немедленно, и успешность выполнения задачи не очень важна.
Например, сервер турнира `serve' использует очередь программы
`job-server' для отсылки уведомлений о получении вопроса от
участника, о возникновении ошибки проверки задачи и для отсылки
суточной статистики.

Пока программа `job-server' поддерживает только отсылку
сообщений по электронной почте. Планируется добавление функции
проигрывания звука или голосовых сообщений, чтобы снять эту
функцию с программы `run'.

Программа `job-server' поддерживает опцию -D - работа в режиме
демона. В этом режиме программа уходит в фоновый режим и
записывает все диагностические сообщения в журнал работы.

job-server-cmd
--------------
Новая программа для управления сервером "неприоритетных" задач.
Текущая версия поддерживает только команду отправления сообщения
по электронной почте.

job-server-cmd mail CHARSET SUBJ FROM TO TEXT
здесь CHARSET - кодировка сообщения,
SUBJ - тема сообщения,
FROM - адрес отправителя,
TO - адрес получателя,
TEXT - текст сообщения.
Обратите внимание, что текст сообщения должен передаваться как
аргумент командной строки.

Версия 2.1.44 (20051207)
========================
В данной версии исправлены незначительные ошибки предыдущих
версий, а также внесены непринципиальные улучшения.

libchecker
----------
Проверяющая программа теперь может не устанавливать макрос
NEED_INFO в требуемое значение. Если этот макрос не установлен,
его значение полагается равным 0.

Библиотека может использоватся с проверяющими программами,
которые, на самом деле, её не используют. То есть командная
строка вида
gcc checker.c -o checker -lchecker
позволяет получить работоспособный чекер, если checker.c
является обычной программой на Си, а не программой, написанной
специально для libchecker.

В библиотеку добавлена новая функция `fatal_read':
void fatal_read(int streamno, char const *format, ...);
Эта функция печатает сообщение, переданное в качестве аргумента,
а затем завершает работу либо с кодом ошибки "Check failed",
если streamno равен 0 или 2, либо с кодом ошибки "Presentation
error", если streamno равен 1. Эта функция может использоваться
в функциях, которые читают входные данные сложной структуры для
сообщения об ошибке во входных данных.

serve
-----
Если в протоколе тестирования участника астрономическое время
оказывается меньше процессорного (такое может быть, так как
процессорное время округляется вверх до значения, кратного
периоду системного таймера), то процессорное время показывается
и как астрономическое.

Поддерживается новая команда `SRV_CMD_SUBMIT_RUN_2', в которой
задача и язык программирования задаются не своими
идентификаторами, а своими короткими именами (short_name). Эта
команда полезна в случае, когда идентификаторы задачи и языка
программирования неизвестны.

serve, team
-----------
Если файл, переданный в качестве исходного текста посылки,
содержит нулевой байт (то есть вместо исходного текста программ
был послан, например, исполняемый файл), и указанный язык
программирования не разрешает посылку бинарных данных, выводится
сообщение о неправильном формате посылаемых данных. В предыдущих
версиях сервер просто закрывал соединение, а клиент печатал
"Unexpected EOF from server".

serve-cmd
---------
Все команды поддерживают следующие опции:
	--ip IP
		Позволяет задать IP-адрес, который будет передан
                на сервер. По умолчанию этот адрес равен 127.0.0.1.
	--ssl
		Позволяет установить флаг защищенного
                соединения, который будет передан на сервер. По
                умолчанию этот флаг и так установлен.
	--no-ssl
		Позволяет сбросить флаг защищенного соединения,
                который будет передан на сервер. По умолчанию
                флаг защищенного соединения установлен.
	--session
		Указывает, что параметр, задающий имя файла, в
                котором находится идентификатор сессии, теперь
                непосредственно задаёт идентификатор сессии, то
                есть вместо имени файла задаётся 64-битное число
                в 16-ричном виде. В случае команд `login' или
                `team-login' эта опция задаёт, что идентификатор
                сессии будет напечатан на стандартный поток вывода.
Опции могут указываться в любом месте командной строки после
команды. Например,
serve-cmd 1 login --ip 192.168.0.1 --no-ssl session user password

Поддерживаются новые команды `team-login', `team-logout',
`team-submit-run'. Все опции, описанные выше, применимы и к этим
командам, поэтому далее они явно описываться не будут.
serve-cmd CONTEST-ID team-login SESSION-FILE USER PASSWORD
	Вход непривилегированного пользователя, аналогичный
        входу с помощью CGI-программы `team'. Указанный
        пользователь должен иметь право участия в указанном
        турнире (то есть быть зарегистрированным, не быть
        заблокированным и т. д.). В результате генерируется
        новый идентификатор сессии, который должен
        использоваться при дальнейших операциях от имени этого
        пользователя. Идентификатор сессии записывается в файл
        SESSION-FILE или печатается на стандартный поток вывода,
        если указана опция --session.
serve-cmd CONTEST-ID team-logout SESSION-FILE
	Завершение работы непривилегированного пользователя.
	Идентификатор сессии уничтожается.
serve-cmd CONTEST-ID team-submit-run SESSION-FILE PROBLEM LANGUAGE [SRC-FILE]
	Посылка решения непривилегированным пользователем.
	Действуют все ограничения, накладываемые на посылку
        решений, как и в CGI-программе `team'. PROBLEM - это
        короткое имя задачи, LANGUAGE - это короткое имя языка
        программирования, SRC-FILE - это файл с исходным текстом
        решения. Имя файла может быть опущено или задано как
        `-', тогда отсылаемый текст будет прочитан со
        стандартного потока ввода. В случае успешной отсылки,
        номер посылки печатается на стандартный поток вывода.

userlist-server
---------------
Поддерживается новая команда `ULS_FIX_PASSWORD' для коррекции
паролей.

edit-userlist
-------------
В группу команд модификации флагов пользователя `f' добавлена
команда "Fix passwords", которая корректирует пароль участника в
соответствии с новыми правилами проверки пароля: если турнирный
пароль (team_password) установлен, то он копируется в
регистрационный пароль (register_password). Эта команда может
быть применена ко множеству выделенных участников некоторого
турнира.

С помощью подкоманды "Clear field" может быть очищен турнирный
пароль одного участника или выбранной группы участников.

super-serve
-----------
Поддерживается автоматическая компиляция проверяющих программ,
написанных на C++ (спасибо Artem Melentev).

Версия 2.1.43 (20051117)
========================
Исправлен URL системы ejudge. Теперь это http://www.ejudge.ru.
Поддерживается компилятор GCC 4.0.*. Если при конфигурировании
системы в качестве компилятора по умолчанию используется GCC
4.0, то для компиляции включается флаг -Wno-pointer-sign.
Устранены все предупреждения компилятора, выдаваемые при уровне
оптимизации -O2.

Система ejudge портирована на Linux/x86_64.

fpc/testlib.pas
---------------
Исправлены ошибки работы с Unix-концами строк (Victor Matyukhin).

delphi/testlib.pas
------------------
Адаптирована последняя версия testlib Андрея Станкевича.

contest.xml
-----------
Поддерживаются два новых элемемента: <user_name_comment> и
<allowed_languages>. Элемент <user_name_comment> позволяет
задать произвольный HTML-текст, который будет выводиться в форме
регистрации на турнир CGI-программы register рядом с полем ввода
имени команды. Данный текст, например, может содержать
инструкции по выбору названия команды и пр. Элемент
<allowed_languages> позволяет ограничить языки и среды
программирования, которые пользователи могут указывать при
регистрации на турнир. Если элемент не задан, то поле
`Programming languages' регистрационной формы по прежнему будет
обычной строкой ввода. Если же элемент установлен, то вместо
строки будет выведена форма, в которой перечислены все
допустимые языки, каждый язык может быть помечен.
В элементе <allowed_languages> языки должны перечисляться через
запятую, например:
<allowed_languages>Borland C/C++, Borland Pascal, Delphi</allowed_languages>

Добавлена поддержка флага DISABLE_MEMBER_DELETE. Если этот флаг
установлен, в форме регистрации на турнир не отображается кнопка
удаления члена команды.

Добавлены новые элементы <users_table_format>, <users_table_format_en>,
<users_table_legend>, <users_table_legend_en>. Они позволяют
управлять видом таблицы зарегистрированных пользователей
турнира, выводимой CGI-программой `users'. Элементы <users_table_legend>, 
<users_table_legend_en> позволяют определять вид
строки-заголовка таблицы зарегистрированных пользователей. В
элементах задаётся текст, который будет выводиться в колонках
таблицы со второй по предпоследнюю. Первая колонка таблицы
всегда называется "NN" (порядковый номер в списке), а последняя - 
"Status" (или "Статус") - статус регистрации участника. Колонки
отделяются друг от друга символом "|". Например,
<users_table_legend>Id|Имя участника|Учебное заведение|Факультет</users_table_legend>
означает, что таблица зарегистрированных пользователей будет
содержать столбцы "NN", "Id", "Имя участника", "Учебное заведение",
"Факультет", "Статус". Элемент <users_table_legend_en>
используется, когда выводится таблица зарегистрированных
пользователей на английском языке (то есть locale_id == 0), а
элемент <users_table_legend> используется для вывода таблицы
зарегистрированных пользователей на локальном языке
(locale_id != 0) (например, русском). Если значение элемента не
установлено, то используется вид таблицы по умолчанию.

Элементы <users_table_format>, <users_table_format_en>
определяют информацию, которая будет выведена для каждого
участника турнира в таблице зарегистрированных участников. В
элементе могут использоваться форматные преобразования
(см. далее), а описание столбцов разделяются символом
"|". В первом столбце таблицы всегда выводится порядковый номер
участника в таблице, а в последнем столбце - статус
регистрации. Например, спецификация
<users_table_format>%Ui|%Un|%Ut|%Uf</users_table_format>
означает, что таблица будет состоять из 6 столбцов: порядкового
номера, идентификатора пользователя, имени пользователя, краткой
формы записи учебного заведения, краткой формы записи
факультета, статуса регистрации. Элемент <users_table_format_en>
используется для вывода таблицы на английском языке (то есть при
locale_id == 0), а элемент <users_table_format> - для вывода
таблицы на локальном языке, когда locale_id != 0 (например,
русском). Если значение элемента не установлено, используется
вид таблицы по умолчанию.

Элементы <users_table_format>, <users_table_legend> должны быть
либо оба установлены, либо не установлены, причём должны
описывать одинаковое количество столбцов. Аналогичное правило
действует для элементов <users_table_format_en>,
<users_table_legend_en>. Если правило нарушается, используется
вид таблицы по умолчанию. Из <users_table_format>,
<users_table_format_en> может быть установлен только один
элемент, тогда для другого будет использоваться значение по
умолчанию.

serve
-----
Добавлена поддержка новой глобальной конфигурационной переменной
`users_on_page' файла `serve.cfg'. Если эта переменная
установлена в положительное значение, таблица результатов
турнира будет разбиваться на страницы по заданному числу
пользователей на страницу. Пока разбиение на страницы работает
только для турниров по системе KIROV.

Добавлены новые глобальные конфигурационные переменные
`stand_fail_attr' и `stand_trans_attr'. Эти переменные позволяют
определить атрибут ячейки таблицы текущих результатов, если для
данного пользователя и для данной задачи есть посылки в
состоянии "Check failed" и "Compiling..." или "Running..."
соответственно. Атрибут `stand_fail_attr' может использоваться
для наглядного выделения проблемных мест турнира, а атрибут
`stand_trans_attr' может использоваться для индикации того, что
в данный момент посылки тестируются, что может привести к
изменению таблицы.

Добавлена новая глобальная конфигурационная переменная
`stand_show_att_num' файла конфигурации турнира `serve.cfg'.
Данная переменная действует только в режимах турнира KIROV или
OLYMPIAD. Если эта переменная установлена в ненулевое значение,
в таблице результатов турнира для каждого участника и каждой
задачи рядом с количеством баллов за задачу отображается
количество попыток. Если задача была полностью сдана, то
отображается количество попыток до момента первой сдачи задачи
(включая и успешную попытку). Если задача не сдана полностью,
отображается текущее количество попыток по данной задаче.

Добавлена новая глобальная конфигурационная переменная
`stand_sort_by_solved' файла конфигурации турнира `serve.cfg'.
Данная переменная действует только в режимах работы турнира
KIROV или OLYMPIAD. Если эта переменная установлена в ненулевое
значение, то сортировка участников для распределения их по
местам ведётся по убыванию решенных задач, и затем по убыванию
количества баллов (в обычной системе KIROV сортировка ведётся
только по убыванию количества набранных баллов).

Добавлена новая конфигурационная переменная `lang_time_adj'
раздела определения задачи файла `serve.cfg'. Данная
конфигурационная переменная позволяет задавать поправку к
максимальному времени тестирования на 1 тесте (time_limit) в
зависимости от языка программирования. Поправка задаёт
дополнительное время в секундах и должна быть больше 0 и не
больше 100. конфигурационная переменная `lang_time_adj' может
быть задана несколько раз, определяя таким образом поправки для
нескольких языков в данной задаче. Каждая спецификация поправки
имеет вид:
LANG=ADJ
где LANG - это короткое имя языка программирования, а ADJ -
целое число. Например,
lang_time_adj="dcc=1"
lang_time_adj="java=10"
Для некоторой задачи задаёт, что для программ для Delphi время
тестирования должно быть увеличено на 1 секунду по сравнению с
заданным в поле `time_limit', а для программ на Java - на 10
секунд.

Добавлена новая глобальная конфигурационная переменная
`disable_submit_after_ok' конфигурационного файла `serve.cfg'.
Если эта переменная установлена в 1, то участникам запрещается
посылка уже сданных задач. Сданные задачи не появляются в списке
задач, доступных для сдачи.

Добавлена новая конфигурационная переменная `skip_testing'
раздела описания задачи. Если для некоторой задачи эта
переменная установлена, программа `run' будет пропускать запросы
на тестирование данной задачи, однако запрос будет доступен
другим программам `run'. Данная конфигурационная переменная
может использоваться для балансировки нагрузки по задачам между
несколькими программами `run' на нескольких проверяющих
компьютерах совместно с директивами условной компиляции,
например:
[problem]
short_name = "Z"
@if host == "host1"
skip_testing
@endif
В этом случае программа `run', запущенная на компьютере "host1",
будет игнорировать запросы на тестирование задачи "Z".

Добавлен новый тип турнира "Moscow". Этот тип турнира -
модификация турниров типа ACM. В отличие от ACM, в турнире
Moscow задачи могут оцениваться в произвольшое количество баллов
>= 1. Тестирование посылки ведется до первой неудачи, и в
зависимости от количества прошедших тестов посылка оценивается в
0, 1, 2 ... N баллов. Полное количество баллов за задачу
определяется конфигурационной переменной `full_score'. Для
каждой задачи, которая оценена более чем в 1 балл, должна быть
определена конфигурационная переменная `score_tests'. Если
задача оценивается в N баллов, переменная `score_tests' должна
задавать N-1 число. Числа разделяются пробелами. Каждое число
задает номер теста, числа должны образовывать возрастающую
последовательность, причем последнее число должно быть меньше
общего количества тестов по данной задаче. K-е число в этом
списке задаёт количество тестов, которые должна пройти посылка,
чтобы быть оцененной в K баллов. Например, для следующей
спецификации:
full_score = 5
score_tests = "10 20 30 40"
и общего количества тестов по задаче 50, если задача прошла 0-9
тестов, то она оценивается в 0 баллов, если 10-19 тестов - то в
1 балл, 20-29 тестов - 2 балла, 30-39 тестов - 3 балла, 40-49
тестов - 4 балла, 50 тестов - 5 баллов.

Добавлены новые конфигурационные переменные для управления
внешним видом таблицы текущих результатов участников.
Глобальная конфигурационная переменная `stand_row_attr'
позволяет определять атрибуты строк таблицы. Эти атрибуты
используются, когда к строке таблицы неприменимы другие
атрибуты, задаваемые глобальными конфигурационными переменными
`stand_v_row_attr', `stand_r_row_attr', `stand_u_row_attr',
`stand_self_row_attr', `stand_contestant_status_attr'.
Конфигурационная переменная `stand_row_attr' должна быть
определена либо 5, либо 6 раз, задавая таким образом массив из 5
или 6 атрибутов. Массив используется следующим образом:
stand_row_attr[0] - это атрибут строки заголовка таблицы,
stand_row_attr[1], stand_row_attr[2] - атрибуты четных и
нечетных строк таблицы соответственно,
stand_row_attr[3], stand_row_attr[4] - атрибуты четных и
нечетных строк таблицы соответственно, эти две группы атрибутов
используются попеременно при изменении количества решенных
задач у команд.
stand_row_attr[5] (если определен) - атрибуты строк таблицы, в
которых отображается суммарная информация по всем участникам
турнира. Пример использования переменной `stand_row_attr':
stand_row_attr = " bgcolor=\"#cccccc\" valign=\"top\""
stand_row_attr = " bgcolor=\"#eeffff\" valign=\"top\""
stand_row_attr = " bgcolor=\"#ddffff\" valign=\"top\""
stand_row_attr = " bgcolor=\"#ffeeff\" valign=\"top\""
stand_row_attr = " bgcolor=\"#ffddff\" valign=\"top\""
stand_row_attr = " bgcolor=\"#cccccc\" valign=\"top\""

Для совместимости со стандартным видом таблицы в предыдущих
версиях системы, если ни глобальная конфигурационная переменная
`stand_table_attr', ни глобальная конфигурационная переменная
`stand_row_attr' не установлена, переменная `stand_row_attr'
устанавливается в значение " border=\"1\"".

Добавлена глобальная конфигурационная переменная
`stand_page_table_attr', которая позволяет задавать атрибут
таблички ссылок на страницы текущих результатов, если включено
разбиение таблицы текущих результатов на страницы.

Добавлена глобальная конфигурационная переменная
`stand_page_row_attr', которая позволяет задавать атрибуты строк
таблицы ссылок на страницы текущих результатов, если включено
разбиение таблицы текущих результатов на страницы. Эта
переменная должна быть определена 4 раза, формируя массив
атрибутов из 4 элементов. Массив используется следующим образом:
stand_page_row_attr[0] - атрибут первой строки таблицы: номера
страниц,
stand_page_row_attr[1] - атрибут второй строки таблицы: места
stand_page_row_attr[2] - атрибут третьей строки таблицы: число
решенных задач (набранный балл для Moscow),
stand_page_row_attr[3] - атрибут четвертой строк таблицы:
набранные баллы (штрафной балл для Moscow, ACM).
Пример использования переменной:
stand_page_row_attr = " bgcolor=\"#ccddcc\" valign=\"top\" align=\"center\""
stand_page_row_attr = " bgcolor=\"#ccddcc\" valign=\"top\""
stand_page_row_attr = " bgcolor=\"#ccddcc\" valign=\"top\""
stand_page_row_attr = " bgcolor=\"#ccddcc\" valign=\"top\""

Добавлена глобальная конфигурационная переменная
`stand_page_col_attr', которая позволяет задавать атрибуты
столбцов таблицы ссылок на страницы таблицы текущих результатов,
если включено разбиение таблицы текущих результатов на страницы.
Эта переменная должна быть определена 2 раза, формируя массив
атрибутов из 2 элементов. Массив используется следующим образом:
stand_page_col_attr[0] - атрибут первого столбца таблицы
(названия строк),
stand_page_col_attr[1] - атрибут всех остальных столбцов
таблицы. Пример использования переменной:
stand_page_col_attr = ""
stand_page_col_attr = " width=\"60\""

Добавлена новая глобальная конфигурационная переменная
`stand_page_cur_attr', которая позволяет задавать атрибуты
текста "Page N of M.", выводимого, когда включено разбиение
таблицы текущих результатов на страницы.

В протоколе тестирования участника отображается астрономическое
время тестирования задачи.

userlist
--------
В базе данных пользователей изменена поддержка поля `Phone' в
данных по пользователю и данных по членам команды. Ранее
поддерживался элемент <phones>, в котором находился список
элементов <phone>, однако эта структура нигде не использовалась
и её редактирование не поддерживалось. Теперь элемент <phones>
удалён, а <phone> представляет собой обычную строку.
Редактирование <phone> поддерживается всеми программами.

userlist-server
---------------
Исправлена ошибка, появившаяся в предыдущей версии, связанная с
некорректным удалением cookie при смене пароля.

Поддерживается редактирование поля `phone'.

Изменена политика аутентификации пользователей CGI-программы
`team'. Теперь если у турнира установлен флаг
`disable_team_password', то проверяется только регистрационный
пароль (поле `register_password'), а если флаг
`disable_team_password' не установлен, то проверяется только
пароль участника (поле `team_password'), а регистрационный
пароль игнорируется. В предыдущих версиях проверялись оба
пароля и принимался любой.

Данное изменение может привести к тому, что участники не смогут
войти в работающий турнир, если для турнира был неправильно
установлен флаг `disable_team_password', для тех участников,
которые поменяли пароль в CGI-программе `team'. Для устранения
этой проблемы администратор турнира должен вручную исправить
соответствующие поля данных участника (например, скопировать
пароль участника в регистрационный пароль) с помощью команды `o'
программы edit-userlist.

Добавлены новые команды протокола для операций с паролями одного
участника: генерация случайного пароля и копирование одного
пароля в другой. См. команды `o', `y' программы edit-userlist.

register,userlist-server
------------------------
При регистрации нового пользователя проверяется статус отсылки
e-mail сообщения. Если отсылка завершилась неуспешно,
пользователю возвращается соответствующий код ошибки.

Программа `register' обрабатывает код новый код ошибки
регистрации и отображает соответствующее диагностическое
сообщение.

super-serve
-----------
Улучшена поддержка турниров с вариантными задачами. Ссылка на
страницу редактирования таблицы вариантов добавлена в заголовок
страниц редактирования настроек турниров. В конец страницы
редактирования таблицы вариантов добавлены стандартные кнопки
сохранения изменений. Исправлена ошибка некорректной работы
команды смены варианта.

serve-control, super-serve
--------------------------
Поддерживается редактирование новых полей XML-файла конфигурации
турнира: элементов <user_name_comment>, <allowed_languages>,
флага DISABLE_MEMBER_DELETE.

Поддерживается редактирование глобальной конфигурационной
переменной `users_on_page' файла `serve.cfg'.

Поддерживается редактирование новых элементов XML-файла
конфигурации турнира: <users_table_format>,
<users_table_format_en>, <users_table_legend>,
<users_table_legend_en>.

Поддерживается редактирование новой глобальной конфигурационной
переменной `stand_show_att_num'.

Поддерживается редактирование новой глобальной конфигурационной
переменной `stand_sort_by_solved'.

Поддерживается редактирование конфигурационной переменной
`lang_time_adj' раздела описания задачи. При редактировании
поправки для всех языков для данной задачи записываются в одной
строке и разделяются пробелами, например:
dcc=1 java=10

Поддерживается редактирование новой глобальной конфигурационной
переменной `disable_submit_after_ok'.

Исправлена ошибка, из-за которой терялся первый тест в случае,
когда `super-serve' не хватало прав для модификации теста при
выполнении команды "Check contest settings".

При создании нового турнира файл `serve.cfg' корректно
добавляется в систему контроля версий.

run
---
Исправлена ошибка в поддержке стандартных проверяющих программ
для вариантных задач.

Если `run' работает не в управляемом режиме, то пакеты
принудительного завершения игнорируются. В предыдующих версиях
`run' аварийно завершал работу.

Управляющий пакет содержит новое поле `time_limit_adj', которое
содержит поправку к ограничению времени для данного
тестирования. Новое поле обрабатывается программой `run'.
Поправка ко времени тестирования должна быть больше 0 и не
больше 100 и задаёт дополнительное время в секундах.

register
--------
Поддерживается редактирование полей `phone' в форме регистрации
на турнир. Поддерживаются новые элементы <user_name_comment>,
<allowed_languages> и флаг DISABLE_MEMBER_DELETE
конфигурационного файла описания турнира. Форма регистрации на
турнир упрощена за счёт удаления полей, значение которых никак
не использовалось (show_email, show_login, use_cookies_default).

edit-userlist
-------------
Поддерживается редактирование полей phone.

В меню пользователей и турниров поддерживается команда 't'
(Toggle) - инвертировать все флаги выделения. Если ни один
пользователь или турнир не был выделен, то в результате
выполнения этой команды будут выделены все. Поддерживается
команда '0' - сбросить все флаги выделения.

Поддерживается выделение нескольких турниров. Для этого в меню
турниров используются команды ':', 't', '0'.

Поддерживается регистрация одного пользователя сразу на
выделенное множество турниров. Поддерживается регистрация
выделенного множества пользователей на выделенное множество
турниров.

В меню пользователей, зарегистрированных на турнир, добавлена
команда 'f', позволяющая установить или сбросить некоторые поля
данных пользователя. Сбросить можно поля Read-only, Never-clean,
Location. Установить (в значение true) можно поля Read-only,
Never-clean. Команда может применяться как к одному
пользователю, так и к нескольким выделенным пользователям.

При редактировании данных пользователей поддерживаются две новых
команды, применимые к паролям:
  `o' - сгенерировать случайный пароль. Курсор должен находиться
        либо на поле регистрационного пароля (Reg password),
        либо на поле пароля участника (Team password).
  `y' - скопировать текущий пароль в другой пароль. Если курсор
        находится на регистрационном пароле, то он копируется в
        пароль участника, и наоборот, если курсор находится на
        пароле участника, то он копируется в регистрационный
        пароль. 

users,userlist-server
---------------------
При выводе таблицы зарегистрированных участников турнира
поддерживается возможность управления информацией, выводимой в
таблице, с помощью новых элементов <users_table_format>,
<users_table_format_en>, <users_table_legend>,
<users_table_legend_en> XML-конфигурационного файла турнира
(см. выше).

При выводе элементов таблицы могут использоваться следующие
форматные преобразования:
%Ui	идентификатор пользователя (id)
%Un	имя пользователя (name)
%Ul	регистрационное имя (login)
%Ue	адрес email (email)
%Uz	регистрационный пароль (если он не был зашифрован)
%UZ	турнирный пароль (если он не был зашифрован)
%Uc	город (city)
%UC	город (англ) (city_en)
%Uo	страна (country)
%UO	страна (англ) (country_en)
%Ut	аббревиатура учебного заведения (inst_short)
%UT	аббревиатура учебного заведения (англ) (inst_short_en)
%Uu	учебное заведение (inst)
%UU	учебное заведение (англ) (inst_en)
%Uf	аббревиатура факультета (fac_short)
%UF	аббревиатура факультета (англ) (fac_short_en)
%Ud	факультет (fac)
%UD	факультет (англ) (fac_en)
%UL	размещение (location)
%Up	имя назначенного принтера (printer_name)
%Uh	домашняя страница WEB (homepage)
%UH	телефон (phone)
%UP	языки программирования (languages)

Кроме того, с помощью групп форматных преобразований %UM
выводится информация об участниках команды:
%UMp	информация об основных участниках
%UMr	информация о запасных
%UMa	информация о руководителях
%UMc	информация о тренерах
%UMg	информация о гостях
Номер участника специфицируется сразу же после буквы типа
участника десятичным числом, начиная от 1, например,
%UMp2 - второй основной участник, %UMc1 - первый тренер.
Далее специфицируется поле в записи об участнике:
f	имя (firstname)
F	имя (англ) (firstname_en)
m	отчество (middlename)
M	отчество (англ) (middlename_en)
s	фамилия (surname)
S	фамилия (англ) (surname_en)
g	группа, класс (group)
G	группа, класс (англ) (group_en)
e	email
h	домашняя страница (homepage)
o	должность (occupation)
O	должность (англ) (occupation_en)
u	учебное заведение (inst)
U	учебное заведение (англ) (inst_en)
t	аббревиатура учебного заведения (inst_short)
T	аббревиатура учебного заведения (англ) (inst_short_en)
a	аббревиатура факультета (facshort)
A	аббревиатура факультета (англ) (facshort_en)
d	факультет (fac)
D	факультет (англ) (fac_en)
H	телефон
b	статус (status)
B	статус (англ) (status_en)
c	номер курса, класса (grade)
C	номер участника в команде (number)
Например, %UMp1s обозначает фамилию первого основного участника
команды.

ejudge-setup
------------
При генерации конфигурационного файла ejudge.xml у создаваемого
пользователя-администратора устанавливаются биты полномочий
MASTER_LOGIN и JUDGE_LOGIN.

Версия 2.1.42 (20050930)
========================
В данной версии исправлены ошибки процесса инсталляции системы и
внесены некоторые улучшения.

ejudge-setup
------------
При генерации инсталляционного скрипта генерируется команда
создания символической ссылки на программу serve-control.

Makefile
--------
Улучшена обработка ситуации, когда в операцонной системе не
установлены утилиты локализации xgettext и т. д.

userlist-server
---------------
Все cookie пользователя сбрасываются после смены им пароля.

super-serve,serve-control
-------------------------
Поддерживается редактирование переменной `checker_env' раздела
описания задачи.

Поддерживаются новые стандартные чекеры (см. ниже).

При редактировании содержимого заголовочных файлов и стартового
скрипта автоматически выполняется перекодирование из DOS-формата
файлов в Unix-формат, так как браузер пересылает данные в
DOS-формате текста (т. е. с концами строк \r\n).

CGI-программы master и judge открываются в новом окне браузера.

Поддерживается редактирование переменной `variant_num' раздела
описания задач. Поддерживается редактирование таблицы
распределения вариантов для вариантных задач. Поддерживается
проверка настроек турнира для вариантных задач.

libchecker
----------
Добавлены функции сравнения вещественных чисел.

int checker_eq_double(double v1, double v2, double eps);
int checker_eq_long_double(long double v1, long double v2, long double eps);
int checker_eq_float(float v1, float v2, float eps);

Эти функции сравнивают два вещественных числа v1 и v2 с
точностью eps. Корректно обрабатываются специальные значение
NaN, +Inf, -Inf. Если модули обоих чисел не превышают 1, то
модуль разности между ними должен быть меньше 2*eps, т. е.
|v1 - v2| < 2*eps. Если модуль хотя бы одного числа > 1, они
должны иметь один знак, далее их порядки изменяются так, чтобы
оба числа попали в интервал [0,2), затем проверяется условие
|v1 - v2| < 2*eps. Таким образом, значение eps задаёт, сколько
совпадающих десятичных знаков должны иметь два числа.

Добавлено несколько новых стандартных чекеров:
cmp_float, cmp_double, cmp_long_double - сравнивают вывод
проверяемой программы, который должен состоять из одного
вещественного числа соответствующего типа, и правильный ответ.
Для сравнения используются функции сравнения вещественных чисел,
описанные выше. Параметр eps должен задаваться с помощью
переменной окружения EPS, для установки которой необходимо
использовать конфигурационную переменную `checker_env' раздела
описания задачи.
cmp_bytes - сравнивает вывод проверяемой программы и правильный
ответ байт в байт.
cmp_int_seq, cmp_unsigned_int_seq, cmp_long_long_seq,
cmp_unsigned_long_long_seq - сравнивают последовательность целых
чисел соответствующего типа в выводе проверяемой программы и в
правильном ответе. Вывод программы должен состоять только из
целых чисел, разделённых пробельными символами. Количество чисел
и сами числа в выводе программы и в правильном ответе должны
совпадать.
cmp_double_seq, cmp_long_double_seq - сравнивают
последовательность вещественных чисел соответствующего типа в
выводе проверяемой программы и в правильном ответе. Вывод
программы должен состоять только из вещественных чисел,
разделённых пробельными символами. Количество чисел и сами числа
в выводе программы и в правильном ответе должны совпадать.
Точность сравнения чисел определяется переменной окружения EPS.

Версия 2.1.41 (20050916)
========================
В данной версии исправлены ошибки, замеченные в предыдущей
версии. Сделаны второстепенные улучшения.

Добавлена глобальная конфигурационная переменная `cpu_bogomips'
значение этой переменной равно скорости процессора, исходя из
которой устанавливалось ограничение времени для задач. В
дальнейшем предполагается использовать эту переменную для
автоматического масштабирования ограничения времени, если
скорость процессора на тестирующей машине существенно
отличается.

Значение BogoMIPS для процессора можно посмотреть в файле
/proc/cpuinfo. При создании нового турнира средствами
CGI-программы serve-control глобальная переменная `cpu_bogomips'
устанавливается в значение скорости процессора серверного
компьютера.

team, master
------------
На личной странице участника печатается таблица суммарной
статистики по задачам для этого участника.

В режиме виртуального турнира ссылка на условия задач более не
отображается в верху страницы, а перенесена в раздел стастистики
по задачам и появляется только в момент старта виртуального
турнира.

serve-control, super-serve
--------------------------
Исправлены некоторые ошибки в коде редактирования настроек
турнира.

При редактировании списка IP-адресов поддерживается операция
копирования списка из другого турнира или из списка для другой
CGI-программы.

Поддерживается редактирование глобальной конфигурационной
переменной `cpu_bogomips'.

Поддерживается редактирование переменных описания задачи
`deadline', `start_date'.

Поддерживается пробный запуск программы `serve' для турнира
(кнопка "Do probe run" на странице "Contest details"). Весь
вывод программы `serve' отображается на HTML-странице. Это может
быть полезно для отладки проблем с запуском турнира.

Поддерживается добавление в систему контроля версий нового
XML-файла конфигурации турнира. В предыдущей версии он должен
был добавляться вручную. Поддерживается сохранение в системе
контроля версий конфигурационного файла serve.cfg. Добавление
в систему контроля версий пока не поддерживается.

Версия 2.1.40 (20050902)
========================
В данной версии исправлены ошибки, замеченные в предыдущей
версии.

Поддерживается работа с системами контроля версий. После
изменения конфигурационного файла турнира contest.xml
выполняется сохранение изменений в системе контроля версий. Для
этого каталог XML-файлов турниров уже должен находиться под
управлением системы контроля версий. Поддерживаются две СКВ:
subversion и CVS. Выбор системы контроля версий происходит по
имени служебного каталога: если в каталоге XML-файлов существует
подкаталог .svn, используется subversion, а если подкаталог CVS,
используется CVS.

Исправленна ссылка на домашнюю страницу системы ejudge, которая
печаталась внизу сгенерированных файлов. Теперь это
http://acm.msu.ru/ejudge.

Добавлена конфигурационная переменная `binary_input' раздела
описания задачи. Если эта переменная установлена, то
предполагается, что входные файлы имеют бинарный формат и
автоматически не перекодируются. Автоматическая перекодировка,
если данный флаг не установлен, возможна в двух случаях:
1) при копировании входного файла в рабочий каталог программы,
если для соответствующего тестировщика установлена
конфигурационная переменная `is_dos'. В этом случае unix-концы
строк \n заменяются на dos-концы строк \r\n.
2) при выполнении команды "Check contest settings" в разделе
просмотра детальной информации о турнире в CGI-программе
`serve-control'. В этом случае из файла удаляются все символы
\r, а кроме того в конец файла добавляется \n, если файл до
этого не заканчивался этим символом. 

В конфигурационном файле serve-control.xml соответствующей
программы поддерживается атрибут "ssl" элемента <ip>, который
позволяет указывать, действует ли данное превило на соединения
по протоколу http, https, или на оба протокола аналогично
атрибуту "ssl" конфигурационного файла турнира contest.xml.

Версия 2.1.39 (20050811)
========================

Поддерживается интерактивное редактирование настроек турниров.
Для необходимо запустить программу-менеджер серверов турниров
`super-serve'. Редактирование настроек контестов ведётся с
помощью CGI-программы `serve-control'.

Поддерживается работа CGI-программ по протоколу https. В
правилах управления доступом к CGI-программам в конфигурационном
файле турнира можно задавать, для какого протокола предназначено
данное правило: для любого (http, https) - по умолчанию, только
для протокола http, только для протокола https.

Поддерживаются ограничения времени с точностью до миллисекунд.
Для этого требуется последняя версия библиотеки reuse (4.2.0) и
специальная поддержка со стороны ядра Linux, реализованная в
патче 2.4.31-cher2.

Поддерживается ошибка Memory Limit Exceeded. Тестирование
программы завершается с этой ошибкой, если в процессе работы
программы её адресное пространство или размер стека превысили
установленный лимит. Для этого требуется последняя версия
библиотеки reuse (4.2.0) и специальная поддержка со стороны ядра
Linux, реализованная в патче 2.4.31-cher2.

contest.xml
-----------
В элементе <ip> поддерживается атрибут "ssl", который может
принимать значения "any" (по умолчанию), "yes", "no". Атрибут
задаёт, для какого протокола применимо данное правило. Если
атрибут установлен в значение "yes", правило применимо только
для соединений по протоколу https, если атрибут установлен в
значение "no", правило применимо только для соединений по
протоколу http. 

В качестве адреса допускается число "0", которое обозначает
произвольный IP-адрес. Например, следующее правило разрешает
нешифрованные соединения только с текущего компьютера, а
соединения по протоколу https с любого компьютера:
<master_access default="deny">
  <ip allow="yes">127.</ip>
  <ip allow="yes" ssl="yes">0</ip>
</master_access>

В качестве спецификации маски IP-адресов допускается форма
A.B.C.D/E, где E - количество бит, отведённых на спецификацию
адреса сети. Таким образом записи 192.168.0. и 129.168.0.0/24
эквивалентны друг другу.

Поддерживается новый бит полномочий EDIT_CONTEST. Если бит
установлен, пользователь может редактировать конфигурационные
файлы турнира, используя программу serve-control.

serve-control,super-serve
-------------------------
Функциональность программы по интерактивному управлению
серверами турниров реализована до конца. Кроме того,
поддерживается редактирование конфигурационных файлов турнира
(contest.xml, serve.cfg), создание новых турниров с нуля и по
образцу уже существующих турниров.

compile
-------
Устранена утечка памяти, возникавшая при обработке каждого
запроса на компиляцию. 

Более не поддерживается опция командной строки -E (запуск
внешней программы-препроцессора на конфигурационный файл).

serve,run
---------
В файле протокола тестирования в режиме сохранения полного
архива (full_archive) сохраняется контрольная сумма (SHA1) файла
входных данных и правильного ответа. При отображении этих файлов
их текущая контрольная сумма сравнивается с сохранённой в файле
протокола и в случае несоответствия выдаётся предупреждение.
Несоответствие, в частности, возникает тогда, когда файлы с
тестами были изменены, а программа не была перетестирована.

edit-userlist
-------------
Поддерживается выделение пользователей в окне просмотра всех
пользователей в базе данных. Установка/снятие выделения
выполняются с помощью команды ':'. К выделенным пользователям
применима команда 'c' регистрации пользователей на турнир.

В режиме просмотра всех зарегистрированных пользователей
доступна команда 'm' для массового создания новых
пользователей. Для создания новых пользователей необходимо
задать следующую информацию:
"Template for new logins?" - задаёт шаблон для новых
регистрационных имен. Шаблон должен содержать единственную
спецификацию %d (допускается указание дополнительных флагов
форматирования, например %03d, функций семейства printf),
которая будет заменена на номер пользователя.
"Template for passwords?" - аналогичным образом задаёт шаблон
для паролей новых пользователей.
"First number:" - минимальный номер, который будет использован в
сгенерированной последовательности регистрационных имён и паролей.
"Last number:" - максимальный номер, который будет использован в
сгенерированной последовательности регистрационных имён и
паролей.
"Contest number:" - номер турнира, на который будут
зарегистрированы все сгенерированные пользователи.
Например, если задать шаблон новых регистрационных имён равный
u2005%02d, шаблон новых паролей равный pass%02d, номер первого
пользователя 1 и номер последнего пользователя 50, то будут
созданы 50 новых регистрационных записей u200501...u200550 с
паролями pass01...pass50.

ejudge-setup
------------
В сгенерированном файле ejudge.xml устанавливается элемент
<super_serve_log>. Таким образом, для запуска super-serve после
выполнения установочного скрипта не требуется никаких
дополнительных редактирований файла ejudge.xml.

serve
-----
Поддерживается новая глобальная конфигурационная переменная
`stand_ignore_after' файла serve.cfg. Эта переменная позволяет
устанавливать дату, после которой таблица текущих результатов
перестаёт обновляться. То есть, если какая-либо посылка поступит
позже этой даты, результат её тестирования не будет отображён в
таблице текущих результатов. Изменения в более ранних посылках
(например, перетестирования) отражены в таблице текущих
результатов будут. Дата задаётся в стандартном формате:
YYYY/MM/DD HH:MM:SS
 
Поддерживается новая глобальная конфигурационная переменная
`ignore_success_time'. Данная переменная действует только в
режиме турнира ACM. Если переменная установлена, то при
вычислении штрафных баллов по задаче будет игнорироваться время,
прошедшее от начала турнира до успешной сдачи. Переменная может
использоваться в турнирах, где каждая задача оценивается по
системе зачёт/незачёт, и где время от начала турнира не
существенно.

serve-control,super-serve
-------------------------
Поддерживается новая глобальная конфигурационная переменная
`secure_run' файла serve.cfg. Данная переменная предназначена
только для интерактивного редактирования настроек турнира с
помощью serve-control. Если эта переменная установлена,
генерируется конфигурационный файл, в котором в тестировщиках
включена поддержка защищённого выполнения программ для
архитектур Linux, Linux-shared и Java.

serve,run
---------
Добавлена новая глобальная конфигурационная переменная
`enable_memory_limit_error' файла serve.cfg. Если эта переменная
установлена, то при запуске программ на тестирование в данном
турнире включается поддержка обнаружения ошибки превышения
максимально допустимого объёма памяти.

Добавлена новая конфигурационная переменная
`enable_memory_limit_error' секции описания тестировщиков. Если
данная переменная установлена, то для данного тестировщика в
принципе возможна поддержка обнаружения ошибки превышения
максимально допустимого объёма памяти. Эта переменная может быть
установлена для тестировщиков Linux и Linux-shared (при
начальной настройке турнира с помощью ejudge-setup или при
редактировании настроек турнира с помощью serve-control она
устанавливается автоматически), для других тестировщиков (Java,
DOS) эта переменная не должна быть установлена, так как контроль
размера выделенной памяти в этих случаях производится не
средствами ядра Linux.

Таким образом, поддержка обнаружения ошибки превышения
максимально допустимого объёма памяти работает только если в
конфигурационном файле турнира установлена глобальная
конфигурационная переменная `enable_memory_limit_error' и только
для архитектур Linux и Linux-shared (то есть для программ на
gcc, g++, fpc, dcc).

Добавлена новая конфигурационная переменная `time_limit_millis'
секции описания задачи. Данная переменная позволяет
устанавливать ограничение времени с точностью до миллисекунды.
Если установлена данная переменная, значение переменной
`time_limit' игнорируется. Поддержка миллисекундных ограничений
времени работает только, если используется последняя версия
библиотеки reuse (4.2.0). Если ядро Linux не поддерживает
миллисекундные ограничения времени, reuse будет эмулировать их с
помощью секундных ограничений времени.

Добавлена новая конфигурационная переменная `check_cmd' секции
описания задачи. Данная переменная имеет точно такое же
значение, как и одноимённая переменная секции описания
тестировщика, то есть позволяет задавать шаблон имени
проверяющей программы для данной задачи. Поскольку проверяющая
программа не зависит от архитектуры, под которой выполняется
тестирующая программа (так как в конечном итоге все архитектуры
работают под Linux), переменная `check_cmd' всегда имела
одинаковое значение для всех тестировщиков турнира, поэтому
целесообразно перенести её в секцию описания задачи.

Переменная `check_cmd' секции описания тестировщика сохранена и
имеет приоритет над соответствующей переменной секции описания
задачи, однако её использование не рекомендуется, так как в этом
случае становится невозможным редактирование настроек турнира с
помощью CGI-программы serve-control. 

serve
-----
Более не поддерживается опция командной строки -E (запуск
внешней программы-препроцессора на конфигурационный файл).

Исправлена ошибка, из-за которой каталог аудит-записей
создавался раньше, чем тот каталог, в котором он должен быть
расположен, из-за чего программа serve завершалась с ошибкой при
запуске нового турнира.

run
---
Более не поддерживается опция командной строки -E (запуск
внешней программы-препроцессора на конфигурационный файл).

При работе под управлением программы `super-serve' период
неактивности отсчитывается с момента завершения тестирования
программы, а не с момента начала тестирования. В предыдущих
версиях это приводило к тому, что если тестирование одной
программы продолжалось дольше, чем период неактивности,
программа run завершалась даже если очередь на тестирование была
не пуста.

В режиме турнира ACM не требуется, чтобы сумма баллов по всем
тестам была не больше, чем полное число баллов за задачу. Так
как по умолчанию задача оценивается в 25 баллов, а каждый тест -
в 1 балл, это приводило к тому, что если у задачи было более 25
тестов, требовалось указание либо параметра `full_score', либо
параметра `test_score' в секции описания задачи. Теперь этого не
требуется.

serve
-----
Исправлена ошибка в обработчике команды "Reset Contest". В
предыдущих версиях в результате очистки турнира создавался
некорректный файл журнала посылок, после чего программа `serve'
отказывалась работать.

serve,master
------------
Поддерживается изменение длительности турнира с конечной на
бесконечную и наоборот. Если в окне ввода указать "0", то будет
установлена неограниченная продолжительность турнира.

run
---
Для каждого поддерживаемого языка программирования LANG помимо
скрипта компиляции создаётся и скрипт версии LANG-version
(например, gcc и gcc-version). При запуске скрипт печатает на
стандартный поток вывода версию языка. Кроме того,
поддерживаются две опции:
-f	Напечатать на стандартный поток вывода название
	компилятора и его версию. 
-p	Напечатать на стандартный поток вывода путь к
	компилятору.

master,judge,team,serve-control,register,users
----------------------------------------------
Поддерживается протокол https.

master,judge
------------
На главной страничке отображается суммарное количество посылок,
находящихся в стадии компиляции или тестирования.

При просмотре протокола тестирования отображается
астрономическое время работы программы на каждом тесте (если эта
информация присутствует в протоколе тестирования).

В режиме сохранения полного архива вывода тестируемых программ
(full_archive) если контрольная сумма тестового файла в момент
тестирования не совпадает с контрольной суммой файла при
просмотре, выдаётся предупреждение.

serve-cmd
---------
Поддерживаются новые команды:
serve-cmd CONTEST-ID dump-problems SESSION-ID-FILE
	Печатает информацию о задачах указанного турнира в
	CSV-формате (поля разделяются знаком ';').
	[0] - id
	[1] - short_name
	[2] - long_name
serve-cmd CONTEST-ID dump-standings SESSION-ID-FILE
	Печатает текущую таблицу результатов в CSV-формате.
	Печатается полная версия таблицы результатов, доступная
	для привилегированных пользователей. Данная команда
	эквивалентна команде "Dump standings" CGI-программы
	master.
serve-cmd CONTEST-ID dump-all-users SESSION-ID-FILE
	Печатает таблицу всех пользователей в CSV-формате. Номер
	турнира CONTEST-ID не используется и может быть
	произвольным.
serve-cmd CONTEST-ID get-contest-name SESSION-ID-FILE
	Печатает название указанного турнира.
serve-cmd CONTEST-ID get-contest-type SESSION-ID-FILE
	Печатает тип указанного турнира. На стандартный поток
	вывода печатается одна из трёх возможных строк:
	acm, kirov, olympiad.


testlib
-------
Добавлена версия testlib для delphi/kylix. Версия для fpc
инсталлируется в ${prefix}/share/ejudge/testlib/fpc, а версия
для delphi инсталлируется в ${prefix}/share/ejudge/testlib/delphi.
Если при конфигурировании системы поддержка соответствующих
языков была включена, при инсталляции файлы библиотеки testlib
компилируются соответствующими компиляторами.

Путь к библиотеке testlib для соответствующего языка
устанавливается автоматически при выполнении команды "Check
contest settings" программы serve-control. То есть, не требуется
присутствие файла testlib.pas в каталоге чекеров турнира.

Версия 2.1.38 (20050607)
========================

libchecker
----------
Проверяющие программы не выдают ошибки "Check Failed", если им
передано больше параметров, чем требуется. Лишние параметры
игнорируются. Это позволяет использовать стандартные проверяющие
программы (например, cmp_int) в конфигурациях задачи совместно с
дополнительной информацией о тестах (.inf-файлами).

run,serve
---------
Переработан интерфейс взаимодействия программ run и serve. run
всегда генерирует протокол тестирования в XML-формате.
Отображение протокола тестирования в HTML-представлении
выполняется теперь программой serve. Поэтому отпала
необходимость в двух отдельных протоколах: судейском и протоколе
участника. XML-протоколы тестирования сохраняются в подкаталогах
каталога ${contest_root}/var/archive/xmlreport. Поддерживается
обратная совместимость с каталогами турниров, созданных
предыдущими версиями ejudge. Если для некоторой посылки не
существует протокола в формате XML, используются протоколы
тестирования, сгенерированные предыдущими версиями.

Так как run всегда генерирует отчёт в формате XML, глобальная
конфигурационная переменная html_report потеряла своё значение.
Она сохранена (для совместимости), но её значение игнорируется. 

Добавлена возможность сохранения в архиве запуска полного вывода
программы. По умолчанию входные тестовые данные, вывод
программы, вывод проверяющей программы для каждого теста
добавляются непосредственно в протокол тестирования. Однако
максимальный размер и длина строки в файле добавляемом в
протокол тестирования ограничены (см. конфигурационные
переменные max_file_length, max_line_length), и если ограничение
превышается, вместо содержимого файла добавляется короткое
сообщение о том, что файл или строка слишком длинные.
В данной версии добавлена глобальная конфигурационная переменная
`enable_full_archive'. Если эта переменная установлена в 1,
вывод тестируемой программы сохраняется без ограничений, но не в
XML-протоколе тестирования, а в отдельном файле. В режиме
полного архива XML-протокол не содержит ни входных, ни выходных
файлов тестируемой программы, за исключением параметров
командной строки, передаваемых тестируемой программе, если
таковые имеются. Вывод тестирующей программы и вывод проверяющей
программы сохраняются в отдельном файле в специальном архивном
формате. Формат архива в данной версии ejudge не совместим ни с
какой архивной программой. Для каждого файла в архиве хранится
служебная информация и содержимое файла, сжатое алгоритмом
gzip. Архивные файлы находятся в подкаталогах каталога
${contest_root}/var/archive/output.

serve,master,judge,team
-----------------------
Так как в режиме полного архива протокол тестирования не
содержит входных данных, добавлена возможность просмотра файлов
в архиве. Выходной файл тестируемой программы, stderr, вывод
проверяющей программы для каждого теста берутся из архивного
файла, входной файл, файл с правильным ответом (если есть) и
файл с дополнительной информацией (если есть) берутся из
каталога с тестами. При этом возможно рассогласование между теми
тестами, которые использовались при запуске программы, и
отображаемым в текущий момент (например, если тесты с тех пор
были обновлены). В текущей версии нет механизма контроля
соответствия (например, контрольной суммы).

serve
-----
Для каждой посылки хранится административный журнал (audit log),
в котором хранится информация обо всех операциях с данной
посылкой. В журнал информация только добавляется, но никогда не
удаляется и не редактируется. Файлы журналов находятся в
подкаталогах каталога ${contest_root}/var/archive/audit.

serve,master
------------
Поддерживается отображение административного журнала. Чтобы
пользователь мог просмотреть административный журнал, у него
должен быть установлен бит CONTROL_CONTEST.

serve,master,judge,team
-----------------------
Удалена поддержка старых сессионных режимов (логин/пароль в
форме, cookie, ключ сессии в форме). Эти режимы никогда не
использовались, но их в поддержка в коде присутствовала.
Теперь поддержка этих режимов удалена. URL, используемый в
работе в результате упростился, так как отпала необходимость в
переменной sid_mode.

userlist-server
---------------
Программа не падает при попытке входа пользователя, у которого
не установлен пароль (т. е. поле register_password в XML-файле
отсутствует).

Версия 2.1.37 (20050422)
========================
В данной версии исправлены проблемы компиляции на Win32, а также
некоторые ошибки в документации.

Добавлена поддержка "премий" в режиме турнира KIROV. Премия
даётся нескольким участникам, которые решили задачу первыми.

Незначительно изменилась структура каталогов обмена
serve<->compile и serve<->run. Новая структура каталогов не
совместима со структурой каталогов предыдущей версии.

INSTALL,INSTALL.RUS
-------------------
Описаны все новые опции, добавленные с момента последнего
обновления файла. Исправлены найденные ошибки.

serve,compile,run,userlist-server,super-serve
---------------------------------------------
Программы отказываются работать, если запускаются из-под
пользователя root. В предыдущих версиях системы работа из-под
root также не поддерживалась, но явного сообщения об ошибке не
печаталось.

configure
---------
Поддерживается система Mono (www.mono-project.com) - свободная
реализация .NET для ряда платформ. В её рамках поддерживается
автоматическое обнаружение компиляторов языков C# (mcs) и Visual
Basic (mbas). Для явного указания путей к этим компиляторам
могут использоваться новые опции --with-mcs и --with-mbas.

Обратите внимание, что текущая версия системы Mono не
поддерживает настройку политики безопастности. Поэтому
тестируемые программы на C# и VB запускаются с полными правами
пользователя, под которым работает программа run. По этой
причина использование этих языков не безопасно и не
рекомендуется в турнирах, где нет контроля за программами,
посылаемыми участниками.

Улучшена проверка на библиотеку libcap и ядро с поддержкой
специальных бит привелегий. Если программа, использующая libcap
и биты CAP_SYS_OPERATIONS и CAP_SYS_ONE_EXEC компилируется, но
запуск не приводит к ограничению прав программы, то после
окончания скрипта configure выдаётся предупреждение.

Исправлена неправильная установка макроса CONF_HAS_LIBCAP в
config.h. Макрос устанавливался в 1 всегда.

Проверяется, что в системе доступна программа uudecode, и если
эта программа не найдена, после завершения работы configure
печатается предупреждение.

ejudge-setup
------------
В сгенерированных .cfg-файлах в качестве символа комментария
используется `#' вместо `;'.

Добавлена поддержка языков C# и Visual Basic (Mono) - см.
комментарий выше. Конфигурационный файл тестового турнира 1
генерируется таким образом, что эти языки в нём недоступны для
использования, то есть для них установлен флаг "disabled = 1".
Для того, чтобы активировать эти языки, необходимо изменить
конфигурационный файл serve.cfg вручную.

Название турнира "Тестовый турнир" заменено на "Test contest",
чтобы не создавать проблем с кодировками файлов, отличных от
koi8-r.

В настроечном скрипте, генерируемом программой, используется имя
программы uudecode, которое берётся из config.h.

serve
-----
Поддерживается новая конфигурационная переменная score_bonus
секции описания задачи файла serve.cfg. Эта переменная позволяет
задавать премию в баллах к решениям задачи. Переменная действует
только для турниров по системе KIROV. Значение переменной - это
последовательность целых чисел (которые могут быть
положительными и отрицательными), числа в которой разделены
пробельными символами. Например,
score_bonus = "10 5"
В этом случае для той задачи, для которой установлена
`score_bonus' дополнительные баллы будут начисляться по
следующим правилам:
  - первое полное решение (то есть получившее статус OK) этой
    задачи получит +10 баллов к тому числу баллов, которое
    набрало это решение с учётов всевозможных штрафов (за
    предыдущии попытки, за несвоевременную сдачу, и т. д.);
  - второе полное решение получит +5 баллов к общему числу
    баллов;
  - третье и последующие решения не получат никаких
    дополнительных баллов.

При подсчёте номера решения игнорируются следующие полные
решения:
  - тех, кто уже решили эту задачу раньше. Таким образом, если
    участник получил +10 за задачу, то за вторую успешную сдачу
    той же самой задачи он ничего не получит, и вторая успешная
    сдача задачи будет проигнорирована при вычислении премии
    других участников.
  - посылок, для которых установлен флаг `hidden'. Такие
    посылки, как правило, выполняются с помощью
    привилегированных CGI-программ judge и master, и
    следовательно не должны учитываться при подсчёте баллов
    участников.
  - посылок пользователей, которые невидимы (invisible) или
    дисквалифицированы (banned) в турнире. Невидимые
    участники - это, как правило, привилегированные участники,
    которые не отображаются в таблице результатов.

serve
-----
Добавлена новая глобальная конфигурационная переменная
`disable_sound' конфигурационного файла serve.cfg. Если эта
переменная установлена в 1, то при тестировании программы не
будет выдаваться никаких звуковых сообщений, даже если звуковые
сообщения настроены в программе `run'. Данная переменная
предназначена для использования в ситуациях, когда программа
`run' проверяет решения сразу нескольких турниров (например,
основного турнира и интернет турнира), и для каких-то турниров
звуковые сообщения должны быть разрешены, а для каких-то - нет.
В этом случае можно использовать эту переменную в
конфигурационном файле турниров, для которых звуковые сообщения
должны быть отключены.

Версия 2.1.36 (20050402)
========================
В данной версии исправлено несколько серьёзных ошибок в
программах userlist-server и serve. Рекомендуется обновиться до
данной версии.

Программы `compile' и `run' снова собираются на платформе
Win32. Для компиляции программ необходим пакет Cygwin, но для
их последующего выполнения пакет Cygwin не требуется. Для сборки
и работы требуется Windows 2000 или выше.

Для компиляции на Win32 необходима последняя версия библиотеки
reuse: 4.0.1. Рекомендуется использовать последнюю версию reuse
и при компиляции на Linux.

Добавлено много усовершенствований для турниров по системе
OLYMPIAD.

serve
-----
В базу посылок добавлено два новых статуса проверки посылки:
"Memory Limit" (RUN_MEM_LIMIT_ERR) и "Security Error"
(RUN_SECURITY_ERR). Они обрабатываются везде точно также, как,
например, "Run-time error" (RUN_RUN_TIME_ERR) и могут
использоваться для более точного указания причины ошибки.

Хотя два новых статуса ошибки были добавлены в базу, программа
`run' пока не поддерживает диагностику этих кодов ошибок по
причине невозможности их надёжного определения на Linux. Два
новых статуса пока могут быть установлены только вручную при
редактировании базы посылок.

Добавлен новый статус посылки "Pending" (RUN_PENDING). Посылка
устанавливается в этот статус, когда она была принята сервером,
но по каким-либо причинам не была отправлена на тестирование,
например, если установлен флаг задачи или языка программирования
`disable_testing' или `disable_auto_testing', или если в турнире
приостановлено тестирование поступающих решений. Ранее в этих
случаях посылка получала статус "Accepted for Testing"
(RUN_ACCEPTED), однако этот статус используется и в турнирах по
системе OLYMPIAD при предварительном тестировании задач, поэтому
эти два типа использования RUN_ACCEPTED были разделены и введён
специальный статус RUN_PENDING.

В выражении фильтра посылок новые статусы кодируются следующим
образом:
PD	RUN_PENDING
ML	RUN_MEM_LIMIT_ERR
SE	RUN_SECURITY_ERR

compile
-------
Программа `compile' собирается на Win32 (см. выше). Данная
версия программы не тестировалась на Win32, поэтому поддержка
Win32 находится в альфа-стадии.

compile, serve
--------------
Переработан формат управляющих пакетов, с помощью которых serve
передаёт задания на компиляцию compile и получает результаты
компиляции. Теперь данные передаются в бинарном формате. Кроме
того, пакеты включают поля временных отметок, которые
используются затем для выдачи подробной статистики о ходе
прохождения задания на тестирование.

configure
---------
Поддерживается платформа Win32 (Cygwin с опцией -mno-cygwin).

edit-userlist
-------------
Добавлена частичная поддержка выполнения команд над группой
пользователей. При просмотре списка пользователей,
зарегистрированных на некоторый турнир, можно ставить/снимать
выделение каждого пользователя. Для этого используется команда
':'. Если выделено несколько пользователей, команды 'r'
(изменить статус регистрации), 'd' (удалить регистрацию), 'i'
(изменить статус видимости), 'b' (изменить статус
дисквалификации), 'l' (изменить статус заблокированности)
выполняются над всеми выделенными пользователями. Если ни один
пользователь не выделен, указанные выше команды выполняются над
текущим пользователем.

В режим просмотра участников, зарегистрированных на турнир,
добавлена команда 'c', которая позволяет зарегистрировать
данного участника или группу участников на другой турнир. Данная
команда совместно с командной группового выделения ':' даёт
возможность зарегистрировать всех участников одного турнира на
другой турнир, что может использоваться, например, при
подготовке пробного тура, виртуального турнира по результатам
реального турнира и т. д.

serve
-----
Улучшена диагностика неправильных выражений фильтра. Теперь если
пользователь вводит неправильное ключевое слово, например,
problem вместо prob, то будет выдана ошибка о недопустимом
ключевом слове problem вместо трёх ошибок о недопустимых
символах l, e, m.

Исправлена серьёзная ошибка, проявлявшаяся при вводе ошибочного
выражения фильтра. В этом случае выделялся блок динамической
памяти, размер которого задавался неинициализированной
переменной. В дальнейшем это могло приводить к фатальному
завершению `serve' из-за нехватки памяти, неправильной работе и
т. п.

serve
-----
Убрано ограничение на то, что количество баллов, полученное за
задачу с учётом всех дополнительных факторов (штраф за время и
т. п.), не может привышать полного балла задачи (full_score).

В турнире по системе OLYMPIAD в режиме предварительного
тестирования переработан вид таблицы текущих результатов
участников. В этом режиме каждый из предварительных тестов
оценивается в 1 балл вне зависимости от оценки этого теста в
конфигурационном файле (обычно это --- 0 баллов). Задача
помечается как сданная (выделяется жирным шрифтом), если она
прошла все предварительные тесты. Участники ранжирутся по числу
сданных задач, а после этого по количеству набранных баллов.

В режиме окончательного тестирования вид таблицы текущих
результатов не изменился и совпадает с видом таблицы текущих
результатов в турнире по системе KIROV.

serve, team
-----------
CGI-программа team также поддерживает отображение протоколов в
формате HTML. Хотя только судейские протоколы могут
генерироваться в формате HTML, участник получает доступ к ним,
если установлена глобальная конфигурационная переменная
`team_show_judge_report' конфигурационного файла serve.cfg.

run
---
Программа `run' собирается на Win32 (см. выше). Данная
версия программы не тестировалась на Win32, поэтому поддержка
Win32 находится в альфа-стадии.

serve,run
---------
Переработан формат управляющих пакетов, с помощью которых serve
передаёт задания на выполнение run и получает результаты
тестирования. Теперь данные передаются в бинарном формате. Кроме
того, пакеты включают поля временных отметок, которые
используются затем для выдачи подробной статистики о ходе
прохождения задания на тестирование.

run
---
В судейский протокол тестирования печатается статистика о
прохождении задания по этапам тестирования. Отслеживается
постановка задания в очередь на компиляцию, компиляция, ожидание
в очереди скомпилированных заданий, постановка задания в очередь
на выполнение, выполнение.

serve, master, judge
--------------------
В турнире по системе OLYMPIAD в режиме предварительного
тестирования поддерживается команда "Full rejudge", которая
вызывает полное тестирование задачи на всех тестах. Эта команда
может использоваться, когда в режиме предварительного
тестирования необходимо полностью протестировать, например,
судейское решение.

serve
-----
Улучшена обработка ситуации, когда ошибка возникает в процессе
добавления новой посылки. Если запись новой посылки в файл
завершилась с ошибкой, эта посылка будет удалена и из базы
посылок. Таким образом исправлена старая ошибка, которая
возникала в случае, если на файловой системе, на которой
хранится архив посылок, заканчивалось свободное место. В этом
случае исходный текст программы в архив не записывался, но в
базе посылок запись сохранялась и имела статус "Available".

В базу посылок добавлено новое поле judge_id, которое принимает
значения от 0 до 65535. Когда посылка направляется на
тестирование или перетестирование, ей назначается некоторый
judge_id, который сохраняется в базе. Когда serve получает
пакеты с результатами компиляции или тестирования программы,
judge_id, указанный в пакете, проверяется на соответствие
judge_id, сохранённому в базе посылок, и если judge_id не
совпадают, полученный пакет игнорируется.

Таким образом решается проблема, когда посылка, находящаяся на
тестировании, снова направляется на тестирование. В этом случае
старый judge_id в базе будет замещён новым и таким образом
результаты более старого перетестирования будут
проигнорированы. Раньше этого гарантировать было нельзя, так как
более ранний запрос на тестирование мог выполниться первым,
после чего статус посылки менялся на статус, определённый в
результате тестирования, и более новые результаты тестирования
игнорировались.

Поле judge_id в структуре описания посылки занимает 2 байта.
Таким образом размер всех значимых полей стал равным 64 байта, и
в структуре не осталось неиспользуемого места, так как с момента
перехода с текстового формата журнала посылок на бинарный размер
одной записи равен 64 байта. В журнале посылок не осталось места
для дальнейшего добавления полей без изменения формата журнала
(например, перехода к 128-байтовым записям).

Добавлено новое форматное преобразование '%M1', которое выводит
значение поля `extra1' структуры информации о пользователе.
Это поле не доступно для редактирования ни обычным
пользователем, ни администратором и используется для служебных
целей. Текущая версия программы userlist-server при передаче
списка пользователей, зарегистрированных на турнир, помещает в
данное поле значение поля `grade' первого участника команды.
В личных олимпиадах это поле содержит класс или курс участника.
Таким образом, можно считать, что форматное преобразование '%M1'
отображает класс или курс участника личной олимпиады.

userlist-server
---------------
Исправлена ошибка разыменования нулевого указателя при попытке
регистрации нового пользователя в системе если не был задан
номер турнира. Она проявлялась, если для регистрации
пользователя использовался URL без задания параметра contest_id,
например, http://acm.msu.ru/cgi-bin/register. Если параметр
contest_id был указан, например,
http://acm.msu.ru/cgi-bin/register?contest_id=83,
проблема не возникала. Данная ошибка была внесена в предыдущей
версии, когда была добавлена поддержка шаблонов регистрационных
писем.

super-serve
-----------
UNIX-сокеты для управления программами serve всех управляемых
турниров, которые создаются программой super-serve при старте,
удаляются при завершении работы.

Версия 2.1.35 (20050118)
========================
В данной версии исправлены некоторые некритические ошибки и
добавлены некоторые новые возможности.

userlist-server
---------------
При чтении XML-файла базы пользователей не выдаётся ошибка
разбора XML файла, если какой-либо пользователь имеет пустой
пароль (то есть пароль, установленный в пустую строку).

Попытка установить пустой пароль (пароль, равный пустой строке)
с помощью программы `edit-userlist' теперь приводит к ошибке
"Invalid password". Пустые пароли всё равно считаются
недопустимыми при проверке пароля при входе в систему.

serve
-----
Добавлены новые конфигурационные переменные секции описания
языка программирования: `disable_testing',
`disable_auto_testing'. Они ведут себя точно так же, как
одноимённые переменные секции описания задачи, то есть
переменная `disable_testing' запрещает всякое тестирование
посылки на заданном языке, а переменная `disable_auto_testing'
предотвращает автоматическое тестирование посылки на заданном
языке сразу после её получения. Такая посылка получает статус
"Accepted for testing" и может быть протестирована с помощью
явной команды перетестирования посылки администратором турнира.

serve
-----
Добавлена новая конфигурационная переменная секции описания
задачи `disqualified_penalty'. Эта переменная позволяет задать
штраф за дисквалифицированную посылку. В данной версии системы
ejudge дисквалифицированные посылки учитываются отдельно от
обычных посылок и штрафуются отдельно. По умолчанию значение
переменной `disqualified_penalty' равно значению переменной
`run_penalty'.

Таким образом, в текущей версии системы балл за посылку в
системе KIROV или OLYMPIAD вычисляется по следующей формуле:
S = I * M - A * P + D + J - B * Q
Переменные `S', `I', `M', `A', `P', `J' описаны ниже.
Переменная `B' - это количество дисквалифицированных посылок,
`Q' - штраф за одну дисквалифицированную посылку, задаваемый
конфигурационной переменной `disqualified_penalty'.

В режиме турнира KIROV или OLYMPIAD в поле "баллы" таблицы
посылок пользователя соответственно изменилось отображение
формулы, по которой вычислялись баллы за данную посылку.
Полный вид отображения формулы выглядит следующим образом:
S = I [ * M ] [ - A * P ] [ +/- D ] [ +/- J ] [ - B * Q ]
если M == 1, то соответствующая часть формулы не отображается,
аналогично для A * P == 0, D == 0, J == 0, B * Q == 0.

В журнал посылок в CVS-форме, выводимый с помощью команды
serve-cmd dump-master-runs
добавлены два поля
          [27] disq_attempts
          [28] disq_penalty

serve
-----
При просмотре листинга программы с помощью команды "View source"
CGI программ `judge' или `master' строки программы нумеруются.

serve,master,judge
------------------
Кнопка "Reset filter" выражения фильтра теперь очищает только
выражение фильтра и номер первой и последней просматриваемой
посылки и не очищает параметры просмотра списка сообщений.

В диалог задания параметров просмотра списка сообщений добавлен
новый параметр, выбираемый с помощью выпадающего меню. Параметр
позволяет просматривать либо все сообщения, либо только
неотвеченные сообщения. Для программы `judge' по умолчанию
устанавливается режим просмотра неотвеченных сообщений, а для
программы `master' - режим просмотра всех сообщений.

Добавлена кнопка "Reset filter" для сброса параметров просмотра
списка сообщений. Данная кнопка расположена рядом с кнопкой
"View" просмотра списка сообщений.

contest.xml
-----------     
Добавлен новый элемент <register_email_file>. Данный элемент
позволяет задать шаблон письма, посылаемого после регистрации
нового пользователя. Значение элемента может быть либо полным
путём к файлу, либо относительным путём. В последнем случае путь
вычисляется относительно каталога конфигурационных файлов
турнира, задаваемого либо с помощью элемента <root_dir>, либо с
помощью элемента <conf_dir>. В значении элемента допускаются
форматные преобразования, например, %Vl - номер текущего
языкового окружения (0 - английский язык, 1 - русский язык),
например:
<register_email_file>email_tmpl_%Vl.txt</register_email_file>
Тогда если выбран русский язык, тогда в качестве шаблона
регистрационного письма будет использоваться файл
email_tmpl_1.txt в каталоге conf (<root_dir>/conf) каталога
турнира, а если выбран английский язык, будет использоваться
файл email_tmpl_0.txt. Если файл шаблона письма не существует
для текущего языкового окружения, загружается файл для шаблона
для языкового окружения 0, если и этот шаблон письма не
существует, используется шаблон письма в текущем языковом
окружении. Если значение элемента <register_email_file> не
установлено, всегда используется шаблон письма по умолчанию.

В тексте шаблона письма также допускаются форматные
преобразования, подставляющие параметры нового пользователя в
текст письма. Допустимые форматные преобразования перечислены
ниже:
%Vu - URL для продолжения регистрации в системе
%Vl - идентификатор языкового окружения
%Ul - регистрационное имя пользователя
%Ui - регистрационный номер пользователя
%Un - имя пользователя
%Ue - регистрационный email пользователя
%Uz - автоматически сгенерированный новый пароль пользователя

Пример текста письма по умолчанию на английском языке:
--------
Hello,

Somebody (probably you) have specified this e-mail address (%Ue)
when registering an account on the Moscow Programming Contests
Server.

To confirm registration, you should enter the provided login
and password on the login page of the server at the
following url: %Vu.

Note, that if you do not do this in 24 hours from the moment
of sending this letter, registration will be void.

login:    %Ul
password: %Uz

Regards
The ejudge contest administration system
--------

serve-cmd,serve
---------------
Реализована новая команда проверки, есть ли в данный момент в
турнире посылки в состоянии компиляции или тестирования. Данная
команда доступна только с помощью программы `serve-cmd':
serve-cmd CONTEST-ID has-transient-runs SESSION-ID-FILE
Если такие посылки есть, то код возврата программы равен 2, если
таких посылок нет, код возврата равен 0. Кроме того,
вырабатывается код возврата 1, если возникла какая-либо другая
ошибка выполнения команды.

serve-cmd
---------
Реализовано несколько новых команд управления турниром из
командной строки:
serve-cmd CONTEST-ID suspend-testing SESSION-ID-FILE
          Данная команда приостанавливает тестирование всех
          поступающих посылок. Посылки получают статус "Accepted
          for testing" (RUN_ACCEPTED) и не направляются на
          компиляцию и тестирование.
serve-cmd CONTEST-ID resume-testing SESSION-ID-FILE
          Данная команда отменяет действие предыдущей команды,
          то есть все поступающие посылки будут обрабатываться
          как обычно.
serve-cmd CONTEST-ID judge-suspended-runs SESSION-ID-FILE
          Данная команда отправляет на компиляцию и тестирование
          все посылки, которые имеют статус "Accepted for
          testing" (RUN_ACCEPTED).

Эти команды могут использоваться для корректного импорта
внешнего журнала посылок в систему. Как было сказано ниже,
команда `import-xml-runs' не работает, если в текущий момент в
системе есть посылки в состоянии компиляции или тестирования.
Поэтому алгоритм импорта внешнего журнала посылок в работающий
турнир может выглядеть следующим образом:
	serve-cmd CONTEST-ID suspend-testing SESSION-ID-FILE
	serve-cmd CONTEST-ID has-transient-runs SESSION-ID-FILE
	while [ "$?" = 2 ]
	do
                sleep 1
		serve-cmd CONTEST-ID has-transient-runs SESSION-ID-FILE
	done
        serve-cmd CONTEST-ID import-xml-runs SESSION-ID-FILE RUNLOG-FILE
        serve-cmd CONTEST-ID resume-testing SESSION-ID-FILE
        serve-cmd CONTEST-ID judge-suspended-runs SESSION-ID-FILE
В данном фрагменте отсутствует проверка возможных ошибочных ситуаций.

serve-cmd CONTEST-ID full-import-xml-runs SESSION-ID-FILE XML-FILE1 ...
	Данная команда реализует полный алгоритм импорта
	внешнего журнала посылок в систему, описанный выше. В
	качестве аргументов команды допускается задание сразу
	нескольких файлов с журналами посылок, все эти файлы
	будут проимпортированы. Команда возвращает 0 при
	успешном завершении, когда все файлы были успешно
	проимпортированы, 1 - когда ни один файл не был
	проимпортирован из-за возникшей ошибки, 2 - если ни один
	файл не был проимпортирован, так как программа была
	прервана пользователем, 3 - если часть файлов была
	проимпортирована, а часть нет из-за ошибки в этих
	файлах. Данная команда корректно восстанавливает
	состояние турнира в случае, если её выполнение было
	прервано пользователем, при этом учитывается состояние
	турнира (то есть, было ли приостановлено тестирование
	поступающих посылок) на момент начала выполнения
	команды.

serve
-----
Добавлены новые возможности в выражение фильтра посылок.
Поддерживаются следующие новые предикаты проверки состояния
посылки:
userinvisible [ ( RUN-ID ) ]
        Вырабатывает булевский результат TRUE, если посылка
        RUN-ID выполнена пользователем, который в данном турнире
        имеет статус "невидимый" (invisible). В противном случае
        вырабатывается булевский результат FALSE. Если выражение
        RUN-ID опущено, берётся текущая посылка.
userbanned [ ( RUN-ID ) ]
        Вырабатывает булевский результат TRUE, если посылка
        RUN-ID выполнена пользователем, который в данном турнире
        имеет статус "дисквалифицированный" (banned). В
        противном случае вырабатывается булевский результат
        FALSE. Если выражение RUN-ID опущено, берётся текущая
        посылка.
userlocked [ ( RUN-ID ) ]
        Вырабатывает булевский результат TRUE, если посылка
        RUN-ID выполнена пользователем, который в данном турнире
        имеет статус "заблокированный" (locked). В противном
        случае вырабатывается булевский результат FALSE. Если
        выражение RUN-ID опущено, берётся текущая посылка.
curuserinvisible
        Вырабатывает булевский результат TRUE, если текущая
        посылка выполнена пользователем, который в данном турнире
        имеет статус "невидимый" (invisible). В противном случае
        вырабатывается булевский результат FALSE.
curuserbanned
        Вырабатывает булевский результат TRUE, если текущая
        посылка выполнена пользователем, который в данном турнире
        имеет статус "дисквалифицированный" (banned). В
        противном случае вырабатывается булевский результат
        FALSE.
curuserlocked
        Вырабатывает булевский результат TRUE, если текущая
        посылка выполнена пользователем, который в данном турнире
        имеет статус "заблокированный" (locked). В противном
        случае вырабатывается булевский результат FALSE.
Новые предикаты проверки состояния посылки могут далее
связываться логическими связками друг с другом и с другими
допустимыми выражениями фильтра, например:
!userinvisible && !invisible
Этому выражению фильтра удовлетворяют все посылки, которые не
являются собственно "невидимыми", и не посланы "невидимыми"
пользователями.

serve
-----
e-mail адреса участников турнира теперь отображаются на странице
"View users" CGI-программ `judge' и `master'.

serve,run
---------
Добавлена новая глобальная конфигурационная переменная
`html_report'. Если эта переменная установлена в ненулевое
значение, судейский протокол тестирования будет генерироваться
программой `run' в формате HTML, а не как простой текст. В
HTML-протоколе тестирования добавлены ссылки от таблицы сводной
информации, находящейся вверху страницы к результатам
тестирования для каждого.

В одном турнире могут быть смешаны протоколы тестирования разных
типов. Чтобы изменить тип протокола тестирования по ходу турнира
необходимо изменить значение переменной `html_report' и
перезапустить программу `serve'. Программа `run' в этом случае
может не перезапускаться.

Версия 2.1.34 (20050108)
========================
В данной версии исправлено значительное количество ошибок и
внесены некоторые улучшения во все программы системы.
Реализованы новые программы, в частности управление турниром из
командной строки.

Начата работа по переносу программ `compile' и `run' на
платформу Windows. Вся серверная часть по-прежнему пока работает
только под Linux. Перенос `compile' и `run' позволит
сделать доступными участникам все системы и языки
программирования, доступные для Windows. Естественно, для
компиляции и проверки потребуется (помимо сервера) компьютер под
Windows. Работы предполагается завершить в следующей версии
системы.

configure
---------
Добавлена опция `--enable-super-serve-socket', которая позволяет
установить путь по умолчанию к командному сокету программы
`super-serve'. Эта программа принимает команды управления
турнирами через указанный Unix-сокет аналогично программам
`userlist-server' и `serve'. На данный момент поддержка
управляющих команд реализована лишь частично и не рекомендуется
для использования. Окончательная реализация предполагается в
следующей версии.

ejudge-setup
------------
Поддерживается редактирования значения пути к командному сокету
программы `super-serve' (см. опцию `--enable-super-serve-socket'
выше).

serve-cmd
---------
Новая программа, предназначенная для управления сервером турнира
`serve' из командной строки. На настоящий момент реализовано
подмножество команд управления турниром, доступных через
интерактивную CGI-программу `master'.

Программа serve-cmd поддерживает следующие команды управления
турниром из командной строки:
serve-cmd CONTEST-ID login SESSION-ID-FILE LOGIN PASSWORD
          Команда входа в систему. Данную команду необходимо
          выполнить до любой операции. Здесь CONTEST-ID - это
          идентификатор турнира, то есть число.
          SESSION-ID-FILE - это имя файла, в который будет
          записан идентификатор сессии (cookie). Файл с
          идентификатором сессии необходимо будет указать во
          всех командах.
          LOGIN - регистрационное имя пользователя, PASSWORD -
          пароль пользователя. Пользователь должен иметь биты
          полномочий MASTER_LOGIN или JUDGE_LOGIN для данного
          турнира.
serve-cmd CONTEST-ID logout SESSION-ID-FILE
          Команда завершения работы. После выполнения данной
          команды идентификатор сессии, находящийся в файле
          SESSION-ID-FILE, становится недействительным. Если
          команда logout не выполнена, идентификатор сессии
          действует 24 часа с момента выполнения команды login.
serve-cmd CONTEST-ID write-xml-runs SESSION-ID-FILE
          Данная команда выводит на стандартный поток вывода
          журнал посылок во внутреннем формате. См. далее
          описание команды "write XML runs" в документации на
          CGI-программу `master'.
serve-cmd CONTEST-ID export-xml-runs SESSION-ID-FILE
          Данная команда выводит на стандартный поток вывода
          журнал посылок во внешнем формате. См. далее описание
          команды "export XML runs" в документации на
          CGI-программу `master'.
serve-cmd CONTEST-ID dump-runs SESSION-ID-FILE
          Данная команда выводит на стандартный поток вывода
          журнал посылок в формате CSV, то есть в формате, в
          котором одна запись занимает одну строку, а поля
          записи разделяются символом ';' (точка с запятой).
          См. далее описание команды "dump XML runs" в
          документации на CGI-программу `master'.
serve-cmd CONTEST-ID soft-update-stand SESSION-ID-FILE
          Данная команда обновляет таблицу текущих результатов.
          При этом учитывается промежуток времени, когда таблица
          текущих результатов не должна обновляться. В это время
          данная команда не производит никакого эффекта. Эта
          команда может использоваться после того, когда в
          турнир были проимпортированы новые посылки с помощью
          команды import-xml-runs.
serve-cmd CONTEST-ID import-xml-runs SESSION-ID-FILE XML-FILE
          Данная команда импортирует новые посылки в работающий
          турнир. XML-FILE - это файл с XML-журналом посылок,
          который может быть либо во внешнем, либо во внутреннем
          формате. См. далее описание команды "import XML runs"
          в документации на CGI-программу `master'. Обратите
          внимание, что команда import-xml-runs не выполнится,
          если в текущий момент в турнире, в который
          импортируются посылки, есть посылки в состоянии
          компиляции или выполнения.
serve-cmd CONTEST-ID dump-source SESSION-ID-FILE RUN-ID
          Данная команда выводит на стандартный поток вывода
          исходный код посылки с номером RUN-ID.
serve-cmd CONTEST-ID dump-report SESSION-ID-FILE RUN-ID
          Данная команда выводит на стандартный поток вывода
          судейский протокол тестирования посылки с номером
          RUN-ID.
serve-cmd CONTEST-ID dump-team-report SESSION-ID-FILE RUN-ID
          Данная команда выводит на стандартный поток вывода
          пользовательский протокол тестирования посылки с
          номером RUN-ID.
serve-cmd CONTEST-ID dump-master-runs SESSION-ID-FILE FILTER-EXPR FIRST-RUN LAST-RUN
          Данная команда выводит на стандартный поток вывода
          список посылок, удовлетворяющих заданному критерию,
          как при задании выражения фильтра на главной странице
          программы `master'. FILTER-EXPR - это выражение
          фильтра, описание которого дано в соответствующем
          разделе документации. FIRST-RUN - это номер первой
          посылки, а LAST-RUN - это номер последней посылки.
          Отобранные посылки выводятся в формате CSV, в котором
          каждая запись занимает одну строку текста, а поля
          записи разделены символом '&'. Этот символ
          используется, так как он не может использоваться в
          полях. Запись имеет следующие поля:
          [0]  run_id
          [1]  imported_flag
          [2]  hidden_flag
          [3]  read_only_flag
          [4]  absolute_time
          [5]  absolute_time_nsec
          [6]  time_from_start
          [7]  ip_address
          [8]  size
          [9]  hash_value
          [10] user_id
          [11] user_login
          [12] user_name
          [13] problem
          [14] variant
          [15] language
          [16] language_suffix
          [17] status_num
          [18] status_str
          [19] tests_passed/failed_test
          [20] score_gained
          [21] base_score
          [22] score_multiplier
          [23] attempt
          [24] run_penalty
          [25] date_penalty
          [26] score_adjustment

serve-control
-------------
Новая CGI-программа для управлением сервером серверов турнира
`super-serve'. Программа `serve-control' использует управляющий
сокет программы `super-serve' для взаимодействия аналогично
тому, как программа `master' использует управляющий сокет для
взаимодействия с программой `serve'. Путь по умолчанию к
управляющему сокету программы `super-serve' задаётся с помощью
опции `--enable-super-serve-socket' скрипта `configure'. В
текущей версии системы ejudge требуемая функциональность
реализована в `serve-control' лишь частично. Так, в настоящее
время доступны лишь функции просмотра состояния турнира.

Для работы с программой `serve-control' у пользователя должен
быть установлен бит MASTER_LOGIN или JUDGE_LOGIN в глобальном
конфигурационном файле `ejudge.xml'.

slice-userlist
--------------
Новая программа, которая строит "срез" базы пользователей по
указанному множеству турниров. Программа используется следующим
образом:
slice-userlist [ -i CONTEST ]... [CONFIG_FILE]
здесь CONFIG_FILE - это путь к конфигурационному файлу
ejudge.xml. Если путь к конфигурационному файлу совпадает с
указанным в опции `--enable-ejudge-xml' скрипта `configure', то
есть с путём по умолчанию, то путь CONFIG_FILE можно не
указывать. CONTEST - это номер турнира. Опция -i может быть
указана несколько раз. В этом случае в "срез" базы пользователей
попадут все пользователи, зарегистрированные хотя бы в одном из
указанных турниров. Срез базы печатается на стандартный поток
вывода. Пример использования программы:
slice-userlist -i 10 -i 12

Обратите внимание, что для построения среза используется база
пользователей, находящяяся в файле базы, а не её текущее
состояние, хранящееся в памяти программы `userlist-server'. Если
состояние в памяти и состояние в файле рассогласованы, срез базы
окажется построенным по файлу, то есть будет немного устаревшим.

run
---
Исправлена ошибка, которая приводила к аварийному завершению
программы `run' по нехватке памяти в случае, если тестируемая
программа генерировала очень большой вывод на стандартный поток
вывода или стандартный поток ошибок (размер файла вывода должен
составлять 10 и более Мб в зависимости от размера оперативной
памяти). В предыдущей версии все выходные файлы тестируемой
программы считывались в память, а в текущей версии считываются в
память только файлы, размер которых не превышает максимального
размера, задаваемого с помощью глобальной конфигурационной
переменной `max_file_length' конфигурационного файла
`serve.cfg'.

serve
-----
В случае, если в момент времени, на который было запланировано
начало турнира (scheduled start time), программа `serve' не
работала, а была запущена позднее, в качестве времени начала
турнира устанавливается запланированное время старта турнира, а
не текущее время, как в предыдущей версии.

serve
-----
Исправлены многочисленные ошибки в коде слияния журналов посылки
(import XML logs). В частности, исправлена ошибка, приводившая к
очистке архивов посылок при слиянии журналов. Исправлена ошибка,
приводившая к появлению дубликатов записей в журнале посылок.

serve,master,judge
------------------
Добавлен новый статус посылки RUN_DISQUALIFIED
(дисквалифицирован). Статус может использоваться, например, для
снятия "списанных" посылок. Статус DISQUALIFIED аналогичен
статусу IGNORED, но при подсчёте очков учитывается как одна
попытка, и соответственно, за неё начисляется штраф, задаваемый
параметром run_penalty секции описания задачи конфигурационного
файла serve.cfg. В выражении фильтра посылок данный статус
задаётся как DQ, например, "status == DQ".

contest.xml
-----------
В формат конфигурационного файла описания турнира добавлены три
новых элемента: <serve_control_access>, <run_user>, <run_group>
и новый атрибут "invisible" элемента <contest>.

Атрибут "invisible" элемента <contest> может принимать значения
"yes" или "no". Если атрибут установлен в "yes", то данный
турнир не отображается в списке турниров в программе
`serve-control'. Значение атрибута по умолчанию - "no".

Элемент <serve_control_access> позволяет задать ограничение на
IP-адрес для управления турниром с помощью программы
`serve-control'.

Элемент <run_user> позволяет задать пользователя, под которым
будет запускаться программа `run', если турнир управляется
программой `super-serve', а элемент <run_group> позволяет задать
группу, под которой будет запускаться программа `run'. Если
какой-либо из элементов не задан, будет использоваться значение
соответствующего элемента <serve_user> или <serve_group>, а если
и они не заданы, программа `run' будет запускаться под тем же
пользователем/группой, под которой запущена программа
`super-serve'.

serve
-----
Исправлена ошибка, которая не позволяла сравнивать программы,
которые хранились в сжатом виде. В предыдущей версии выдавалась
ошибка "System call failed".

userlist.xml
------------
Добавлен новый атрибут "privileged" элемента <user> описания
пользователя. Атрибут может принимать значения "yes" или "no"
(по умолчанию - "no"). Если атрибут установлен в "yes", данный
пользователь считается привилегированным, то есть для того,
чтобы выполнить действие с этим пользователем, необходим более
высокий уровень полномочий, чем для обычного пользователя.
Например, чтобы редактировать данные обычных пользователей
достаточно бита полномочий EDIT_USER, а для редактирования
привилегированных пользователей необходим бит полномочий
PRIV_EDIT_USER.

edit-userlist
-------------
Поддерживается редактирование атрибута "privileged" (см. выше).

userlist-server
---------------
Поддерживается редактирование атрибута "privileged"
пользователей. Пользователь, у которого атрибут "privileged" не
установлен, не может устанавливать или сбрасывать этот атрибут у
других пользователей. Привилегированный пользователь может
только установить атрибут "privileged", но не сбросить его.

ejudge.xml
----------
В конфигурационный файл системы ejudge добавлены новые элементы
<super_serve_socket> - путь к управляющему сокету программы
super-serve, <super_serve_user> - идентификатор системного
пользователя, под которым будет запущена программа super-serve,
<super_serve_group> - идентификатор системной группы, под
которой будет запущена программа super-serve, <userlist_user> -
идентификатор системного пользователя, под которым будет
запущена программа userlist-server, <userlist_group> -
идентификатор системной группы, под которой будет запущена
программа userlist-server. В текущей версии системы запуск
программ userlist-server и super-serve под другими
идентификаторами пользователей пока не поддерживается.

serve,master,judge
------------------
В журнал посылок добавлено поле `score_adj'. Данное поле
используется в режимах турнира KIROV или OLYMPIAD и хранит
дополнительную поправку к количеству баллов за посылку,
полученному в результате автоматического тестирования. Поле
`score_adj' может принимать значения от -128 до 127 (1 знаковый
байт). Например, если по результатам автоматического
тестирования посылка получила 50 баллов, а дополнительная
поправка score_adj для данной посылки равна -20 баллам, посылка
будет оценена в 30 баллов, из которых будет затем вычтен штраф
за попытки или за время сдачи.

Если значение score_adj положительно и получается, что балл за
посылку превышает максимальный балл, установленный в
конфигурационной переменной `full_score' описания задачи, такая
посылка будет оценена в полный бал, как установлено переменной
`full_score'.

Добавлена новая конфигурационная переменная `score_multiplier'
секции описания задачи конфигурационного файла `serve.cfg'. Эта
переменная позволяет задать коэффициент, на который будет
умножено количество баллов, заданное в поле `score' записи в
журнале посылок. По умолчанию значение мультипликатора равно 1.

Таким образом, балл за посылку в системе KIROV или OLYMPIAD
вычисляется по следующей формуле:
S = I * M - A * P + D + J
здесь I - исходное количество баллов, хранящееся в поле `score',
то есть, как правило, количество баллов, полученное в результате
автоматического тестирования. Обратите внимание, что если статус
посылки - OK, и для данной задачи не установлена
конфигурационная переменная `variable_full_score', то в качестве
исходного количества баллов всегда будет выбран полный балл за
задачу (переменная `full_score' секции описания задачи)
независимо от значения поля `score' записи в журнале посылок.
M - это мультипликатор (переменная `score_multiplier' секции
описания задачи, или 1 по умолчанию). A - количество предыдущих
попыток по данной задаче данного пользователя. P - штраф за одну
попытку (переменная `run_penalty' секции описания задачи). D -
календарный штраф (переменная `date_penalty' секции описания
задачи). J - дополнительная поправка к баллам (переменная
score_adj секции описания задачи). Полученное значение S не
может быть большее значения переменной `full_score' секции
описания задачи (тогда берётся значение `full_score') либо быть
меньше 0 (берётся 0).

serve,master,judge,team
-----------------------
В режиме турнира KIROV или OLYMPIAD в поле "баллы" таблицы
посылок пользователя отображается формула, по которой
вычислялись баллы за данную посылку. Формула отображается
следующим образом:
S
(то есть просто количество баллов), если
M == 1 && (A == 0 || P == 0) && D == 0 && J == 0, то есть тогда,
когда исходное количество баллов I не модифицируется.
Второй вид отображения формулы - полный:
S = I [ * M ] [ - A * P ] [ +/- D ] [ +/- J ]
если M == 1, то соответствующая часть формулы не отображается,
аналогично для A * P == 0, D == 0, J == 0.

serve,master,judge
------------------
Для поддержки новых возможностей управления пользователями
переработана страница просмотра участников турнира. Теперь
вместо трёх кнопок "Ban", "Make Invisible" и т. д. добавлена
ссылка на страницу отображения информации об участнике. 

На странице отображения информации об участнике отображаются его
идентификатор, регистрационное имя, является ли данный
пользователь привилегированным, является ли он невидимым и
кнопка изменения статуса невидимости (если текущий пользователь
имеет достаточно полномочий), является ли участник
дисквалифицированным (banned) и кнопка изменения статуса
дисквалификации (если текущий пользователь имеет достаточно
полномочий), является ли участник заблокированным (locked) и
кнопка изменения статуса блокировки, количество посылок, общий
размер посылок, количество сообщений, общий размер сообщений,
общее число напечатанных страниц, дополнительный статус
участника (см. ниже) и кнопка изменения дополнительного статуса
участника (если достаточно полномочий), общее количество
предупреждений (см. ниже), все вынесенные предупреждения, а
также форма нового предупреждения (если достаточно полномочий).

Поддерживается возможность выносить участникам турнира
предупреждения (например, за нарушение правил и т. п.).

Чтобы пользователь мог просматривать список участников турнира,
он должен иметь полномочия MASTER_LOGIN или JUDGE_LOGIN и
LIST_CONTEST_USERS. Чтобы пользователь мог просматривать
подробную информацию об участниках, он должен дополнительно
иметь полномочия GET_USER. Чтобы иметь возможность изменять
параметры участника турнира (то есть делать невидимым, выносить
предупреждения, менять статус и т. д.), необходим бит полномочий
EDIT_REG.

serve
-----
Добавлена возможность спецификации дополнительного статуса
участника. Дополнительный статус - это произвольная строка.
Множество дополнительных статусов участников задаётся в
конфигурационном файле турнира serve.cfg, далее на страцице
просмотра и редактирования информации об участнике статус может
быть изменён. Общее количество различных статусов задаётся с
помощью глобальной конфигурационной переменной
`contestant_status_num', затем с помощью конфигурационной
переменной `contestant_status_legend' должны быть заданы строки
для всех статусов. Первый статус получает номер 0, второй - 1
и т. д. Каждый участник турнира получит статус по умолчанию,
равный 0, который затем может быть изменён. Пример задания
статусов:
contestant_status_num = 3
contestant_status_legend = "Status 0"
contestant_status_legend = "Status 1"
contestant_status_legend = "Status 2"

Дополнительно для части или всех статусов может быть задан
HTML-атрибут, с которым будет отображаться строка таблицы
текущих результатов участников турнира с данным статусом.
Для этого используется глобальная конфигурационная переменная
`contestant_status_row_attr'. Переменная может не использоваться
в конфигурационном файле, но если она используется,
дополнительные атрибуты должны быть заданы для всех статусов.
Дополнительные атрибуты задаются в том же порядке, что и
значения статусов, например:
contestant_status_row_attr = ' bgcolor="#ff00ff"'
contestant_status_row_attr = ""
contestant_status_row_attr = ' bgcolor="#00ff00"'
установит для статуса `Status 0' дополнительный атрибут строки
` bgcolor="#ff00ff"', для статуса `Status 2' - 
` bgcolor="#00ff00"',  а для `Status 1' - пустая строка, что
эквивалентно отсутствию атрибута. Обратите внимание на пробел в
начале значения атрибута. Он необходим для разделения тега <tr>
HTML-таблицы и дополнительного атрибута.

С помощью глобальной переменной `stand_show_contestant_status'
можно включить отображение столбца статуса участников. Для
каждого участника будет напечатан его статус, как задано в
переменной `contestant_status_legend'. С помощью глобальной
конфигурационной переменной `stand_contestant_status_attr' можно
задать дополнительные атрибуты этого столбца, например:
stand_show_contestant_status
stand_contestant_status_attr = ' width = "10%"'
Обратите внимание на пробел в начале значения атрибута. Он
необходим для разделения тега <td> и значения атрибута.

serve,master,judge,team
-----------------------
Добавлена возможность вынесения участникам турнира
предупреждений. Каждое вынесенное участнику предупреждение
отображается на его персональной странице в её начале. Участнику
доступен основной текст предупреждения и время отправки
предупреждения. 

Если пользователь имеет достаточно полномочий для просмотра
подробной информации об участнике (т. е. установлены биты
полномочий MASTER_LOGIN/JUDGE_LOGIN + LIST_CONTEST_USERS +
GET_USER, на странице подробной информации для участника турнира
отображаются предупреждения, вынесенные участнику, при этом
отображается: 1) время выдачи предупреждения, 2) имя
пользователя, который выдал предупреждение, 3) IP-адрес
компьютера, с которого было выдано предупреждение, 3) основной
текст предупреждения, 4) дополнительный текст предупреждения,
доступный только привилегированным пользователям.

Если пользователь к тому же имеет бит полномочий EDIT_REG, он
может выносить предупреждения. Для этого он должен задать
основной текст предупреждения, который будет доступен участнику,
и может задать дополнительный текст предупреждения, который
будет доступен только привилегированным пользователям. Затем
необходимо нажать кнопку "Issue Warning".

Если установлена глобальная конфигурационная переменая
`stand_show_warn_number' (см. ниже) файла `serve.cfg', в таблице
текущих результатов отображается общее количество
предупреждений, полученных каждым участником.

serve
-----
Добавлена новая глобальная конфигурационная переменная
`stand_show_warn_number'. Если эта переменная установлена, в
таблице текущих результатов печатается столбец с общим
количеством предупреждений для каждого участника. С помощью
глобальной конфигурационной переменной `stand_warn_number_attr'
можно задать HTML-атрибуты этого столбца, например:
stand_show_warn_number
stand_warn_number_attr = ' width = "5%"'
Обратите внимание на пробел в начале значения атрибута. Он
необходим для разделения тега <td> и значения атрибута.

serve
-----
Для хранения предупреждений и статуса участника турнира изменён
формат XML-файла дополнительной информации об участнике. Формат
совместим снизу вверх с форматом предыдущей версии программы
ejudge. В формат добавлены новые элементы <warnings>, <warning>,
<text>, <comment>, <status> и новые атрибуты "ussuer_id",
"issuer_ip", "date" для элемента <warning>.

serve
-----
При генерации таблицы текущих результатов невиртуальных турниров
посылки, время которых больше текущего времени, игнорируются.
Такая ситуация может возникать при проведении турнира в
нескольких точках, когда моменты начала турнира существенно
различаются.

serve
-----
Если в архивных каталогах отсутствует какой-либо файл (исходный
текст, протокол или пользовательский протокол), при попытке его
просмотра выдаётся ошибка, что файл не существует, вместо ошибки
"System call failed".

serve
-----
Добавлена конфигурационная переменная `personal_deadline' секции
описания задачи конфигурационного файла `serve.cfg'. Данная
переменная позволяет устанавливать крайний строк сдачи данной
задачи для указанного пользователя. Переменная может быть
использована несколько раз в описании задачи, и каждое
использование задаёт крайний срок для одного пользователя.
Формат конфигурационной переменной следующий:
LOGIN [DATE [TIME]]
здесь LOGIN - это регистрационное имя пользователя, для которого
устанавливается крайний срок сдачи задания, TIME -
необязательное время суток в формате HH:MM:SS, а DATE - дата в
формате YYYY/MM/DD. Если TIME отсутствует, принимается значение
времени, равное 00:00:00, а если TIME и DATE отсутствуют,
крайний срок устанавливается в 2038/01/19 00:00:00. Персональный
крайний срок имеет приоритет над крайним сроком для всех
пользователей, устанавливаемым с помощью конфигурационной
переменной `deadline' секции описания задачи.

serve,master,judge,team
-----------------------
В выпадающем меню выбора задачи при сдаче решения помимо
крайнего срока сдачи указывается календарный штраф, который
будет наложен на посылку.

master
------
При установке запланированного времени начала турнира возможно
как задание времени начала в краткой форме в формате HH:MM, так
и задание времени начала в полной форме в формате
"YYYY/MM/DD hh:mm:ss". Таким образом можно задавать время начала
турнира не в текущих сутках.

serve
-----
Добавлена опция командной строки `-f'. Если опция указана, перед
созданием управляющего сокета старый файл сокета удаляется.
Данная опция полезна при перезапуске системы после аварийного
завершения работы программы или операционной системы.

Добавлена опция командной строки `-i'. Если опция указана,
производятся все действия по инициализации турнира (создание
необходимых каталогов и файлов), а затем программа завершает
работу.

Исправлена ошибка, из-за которой программа `serve' могла
"подвисать" для всех пользователей, так как была заблокирована
из-за ожидания завершения передачи данных по медленному каналу.

При выполнении привилегированных команд не требуется указание
корректного идентификатора пользователя в структуре пакета
команды. Идентификатор пользователя берётся из структуры,
описывающей соединение, по которому пришёл управляющий пакет.

userlist-server
---------------
Добавлена опция командной строки `-f'. Если опция указана, перед
созданием управляющего сокета старый файл сокета удаляется.
Данная опция полезна при перезапуске системы после аварийного
завершения работы программы или операционной системы.

Исправлена ошибка, из-за которой программа `userlist-server'
могла "подвисать" для всех пользователей, так как была
заблокирована из-за ожидания завершения передачи данных по
медленному каналу.

Один и тот же cookie может использоваться для привилегированного
входа в различные турниры, если у пользователя достаточно на это
полномочий. В предыдущей версии ejudge каждый привилегированный
cookie жёстко привязывался к одному турниру.

Если запрашиваемый уровень привилегий при привилегированном
входе в турнир выше, чем максимально допустимый (т. е.,
например, запрашивается уровень привилегий ADMIN, хотя данный
пользователь имеет только уровень привилегий JUDGE), уровень
привилегий понижается. В предыдущей версии в этом случае
выдавалась ошибка "Permission denied".

При привилегированном входе идентификатор турнира может быть
равен 0, в этом случае предполагается, что пользователь входит в
программу serve-control. Тогда проверяемые полномочия
пользователя берутся из глобального конфигурационного файла
ejudge.xml.

При генерации случайных паролей пароли не генерируются для
невидимых, заблокированных, дисквалифицированных и
привилегированных пользователей.

run
---
Исправлена критическая ошибка, связанная с тем, что проверяющей
программе на вход передавался путь к файлу исходных данных теста
в текущем каталоге, то есть в рабочем каталоге тестируемой
программы. При некоторых условиях тестируемая программа могла
модифицировать свой входной файл. В текущей версии в качестве
пути к входному файлу теста передаётся путь к входному файлу в
архивном каталоге.

Версия 2.1.33 (20041029)
========================
Реализована поддержка языка Java компилятора и среды выполнения
JDK (тестировалось с Sun JDK 1.4.2 и Sun JDK 1.5.0, должно
работать с другими совместимыми реализациями JDK). Утилита
конфигурирования configure поддерживает новую опцию --with-javac
с помощью которой можно указать путь к компилятору javac в
составе JDK. Обратите внимание, что это должен быть полный путь
к программе, например, /usr/local/java/bin/javac. Если
--with-javac не указана, производится поиск по каталогам в
переменной окружения PATH.

Для компиляции Java-программ используется скрипт javac, а для
запуска - скрипт runjava, то есть требуется указание параметра
start_cmd = "runjava"
в секции описания тестера для Java-программ. Скрипт runjava
требует для своей работы установленной переменной
EJUDGE_PREFIX_DIR, если только не будет указан полный путь к
файлу политики безопасности. Таким образом, набор необходимых
конфигурационных параметров для тестировщика Java-программ
следующий:
kill_signal = TERM
arch = java
start_env = "EJUDGE_PREFIX_DIR"
start_cmd = runjava

Кроме этого в переменной окружения EJUDGE_JAVA_FLAGS могут
передаваться дополнительные параметры для java-машины, например,
устанавливающие максимальный размер кучи и стека:
start_env = "EJUDGE_JAVA_FLAGS=-Xmx64M -Xss8M"

По умолчанию Java-программы запускаются с установленной жесткой
политикой безопасности, которая позволяет только чтение со
стандартного потока ввода и вывод на стандартный поток вывода.
Поддерживается политика безопасности, при которой работающей
программе разрешено чтение и запись файлов в текущем каталоге.
Такая политика безопасности включается с помощью установки
перемнной окружения EJUDGE_JAVA_POLICY следующим образом.
start_env = "EJUDGE_JAVA_POLICY=fileio.policy"
В переменной окружения EJUDGE_JAVA_POLICY возможно задание
произвольной политики безопастности. Может быть указан либо
полный путь, либо имя файла политики. В последнем случае файл
политики должен находиться в каталоге
${EJUDGE_PREFIX_DIR}/share/ejudge.

Возможно полное отключение политики безопасности. Для этого
переменная окружения EJUDGE_JAVA_POLICY должна быть установлена
в значение none следующим образом:
start_env = "EJUDGE_JAVA_POLICY=none"

Программы на Java должны удовлетворять следующим условиям:
  1) они должны содержать единственный класс с именем Main;
  2) допускаются вложенные в Main классы;
  3) класс Main должен содержать метод main.

Исправлены ошибки работы с каледарным временем, когда из-за
неправильно инициализированной переменной (точнее, поля флага
летнего времени) время могло отличаться на 1 час от
астрономического времени.

В базу данных пользователей добавлено новое поле languages,
предназначенное для указания сред программирования, в которых
работает участник (команда). Поле languages может быть сделано
обязательным или необязательным для заполнения при регистрации
на турнире с помощью элемента
<field="languages" mandatory="yes">
или
<field="languages" mandatory="no">
файла конфигурации турнира contest.xml.

configure
---------
Добавлена опция командной строк --with-javac (см. выше).

edit-userlist
-------------
Поддерживается редактирование поля languages (см. выше).

ejudge-setup
------------
Поддерживаются компилятор языка Java и среда выполнения JDK
(см. выше).

serve
-----
В таблице текущего положения участников (как в режиме ACM, так и
в режиме KIROV/OLYMPIAD) внизу таблицы печатается статистика по
сдачам каждой задачи. Для каждой задачи указывается общее число
посылок по этой задаче, число успешных посылок и процент
успешных посылок.

Добавлена глобальная конфигурационная переменная
stand_show_ok_time файла serve.cfg и конфигурационная переменная
задачи stand_hide_time. Обе переменных действуют только в режиме
турнира KIROV. Если глобальная переменная stand_show_ok_time
установлена в ненулевое значение, в таблице текущих результатов
печатается время успешной сдачи задания (оно может быть как
относительным от начала турнира, так и астрономическим в
зависимости от значения глобальной конфигурационной переменной
show_astr_time). Переменная stand_hide_time отменяет печать
времени успешной сдачи для отдельной задачи.

В таблице текущих результатов корректно вычисляется календарный
штраф по задаче.

Добавлена конфигурационная переменная start_date секции описания
задачи файла serve.cfg. В этой переменной указывается
астрономическое время, начиная с которого данная задача
становится доступной для сдачи.

Спецификация календарного штрафа может иметь одну из следующих
форм:
DATE TIME PENALTY               напр.   2004/10/10 12:00 -10
или
DATE PENALTY                    напр.   2004/10/12 -20
или
PENALTY                         напр.   -30
в последнем случае дата предполагается достаточно большой
(2038/01/19 - то есть максимум, который позволяет точность типа
time_t).

Исправлена ошибка в работе с вариантными задачами.

Поддерживаются новые форматные преобразования. Форматные
преобразования, например, используются в глобальной
кофигурационной переменной stand_extra_format. Поддерживаются
следующие форматные преобразования:
%Mf       - короткое имя факультета участника
%MF       - короткое имя факультета участника на англ. языке
%Md       - полное имя факультета участника
%MD       - полное имя факультета участника на англ. языке
%Mp       - имя принтера, назначенного данному участнику

run
---
Добавлена специальная поддержка для спецификации переменной
окружения "EJUDGE_PREFIX_DIR", передаваемой в тестируемую
программу. В этом случае в переменные окружения добавляется
переменная EJUDGE_PREFIX_DIR со значением, равным префиксу
инсталляции системы ejudge (то есть значению опции --prefix
программы configure). Пример использования:
[tester]
start_env = "EJUDGE_PREFIX_DIR"

Расширенный генератор звуков (то есть по умолчанию генератор
речи festival) поддерживается и в режиме турнира KIROV. Для
включения генератора речи необходимо при конфигурировании
системы корректно указать путь к корню инсталляции системы
festival и задать следующие глобальные переменные:
sound_player = "${script_dir}/festival"
extended_sound

Исправлена ошибка при разборе файлов дополнительной информации о
тестах (.inf), связанная с неправильной обработкой символов
кавычек внутри строк.

master
------
Исправлена ошибка в обработке команды "Rejudge displayed". Эта
ошибка приводила к аварийному завершению программы master.

userlist-server,master
----------------------
При генерации случайных паролей в таблице новых паролей
печатается размещение команды (то есть значение поля location).

register
--------
Поддерживается поле `languages' (см. выше).

collect-emails
--------------
Новая утилита, которая извлекает из базы пользователей адреса
email всех пользователей, зарегистрированных на некоторое
множество турниров.

Версия 2.1.32 (20041001)
========================
Добавлена поддержка библиотеки reuse версии 4. Система ejudge
может быть скомпилирована как с библиотекой reuse версии 3,
так и с библиотекой reuse версии 4. Новая версия reuse
использует стандартные инструменты autoconf/automake/libtool.
Кроме того, в ней исправлены некоторые ошибки в модуле
интерфейса запуска процессов, которые приводили к необнаружению
ошибки типа "Time-limit exceeded" в некоторых случаях.

Реализован интерфейс к программам-генераторам речи. В качестве
генератора речи автоматически поддерживается программа
festival. В базу данных пользователей для каждого пользователя
добавлено поле `spelling', которое может быть изменено только
привилегированным пользователем (не самим пользователем).
Значение этого поля может отражать нюансы произношения имени
пользователя генератором речи.

Добавлена возможность направлять запрос на печать, посланный
пользователем, на поименованный принтер. Для этого в базу
данных пользователей для каждого пользователя добавлено поле
`printer_name', которое может быть изменено только
привилегированным пользователем. Данное поле указывает имя
очереди принтера и будет передано в качестве аргумента
опции `-P' команды `lpr'.

configure
---------
Поддерживается reuse-4. Если скрипт `reuse-config' находится в
каталоге, указанном в переменной PATH, все необходимые опции
компилятора для использования reuse будут определены
автоматически, и указание опции `--with-reuse' не обязательно.

Добавлена опция `--with-festival=FEST_PATH', с помощью которой
можно указать каталог, в котором проинсталлирован генератор речи
festival. FEST_PATH должен быть указан таким образом, чтобы
программа festival находилась в каталоге ${FEST_PATH}/bin.
В настоящий момент правильность указания FEST_PATH не
контролируется.

serve, compile, run
-------------------
В конфигурационном файле турнира serve.cfg допускаются директивы
условной компиляции, аналогичные директивам препроцессора Си.
Эти директивы позволяют включать или выключать фрагменты
конфигурационного файла в зависимости от окружения системы. В
данной версии поддержка условной компиляции реализована в
ограниченном объёме. В дальнейшем планируется реализовать полную
поддержку выражений.

Пока поддерживаются операции сравнения ==, !=, >=, <=, >, < для
строк и чисел, а также логические связки && и ||. В выражениях
могут участвовать целые числа, записываемые в только в
десятичном виде, строки, записываемые как в Си, и
предопределённые переменные. Для хранения целых чисел
используется 64-битный тип long long. Поддерживаются следующие
предопределённые переменные:

name    | type      | desc
host    | string    | Имя комьютера, на котором запущена данная
        |           | программа.
mode    | long long | Код стартующей программы: 0 - `serve',
        |           | 1 - `compile', 2 - `run'.
major   | long long | Старший номер версии системы.
minor   | long long | Средний номер версии системы.
patch   | long long | Младший номер версии системы.
build   | long long | Порядковый номер перекомпиляции.
managed | long long | 1, если программа запущена из-под
        |           | super-serve, и 0 в противном случае

Синтаксис директив условной компиляции аналогичен синтаксису
директив условной компиляции препроцессора языка Си. Директива
условной компиляции должна начинатся с символа `@' --- первого
непробельного символа в строке. Поддерживаются директивы `@if,'
`@elif', `@else', `@endif'.  Синтаксис каждой директивы приведён
ниже.
@if expression
@elif expression
@else
@endif

В конфигурационном файле турнира serve.cfg поддерживаются
суффиксы `M', `K' для числовых параметров. Суффикс `K' означает
умножение на 1024, а `M' --- на 1024*1024. Например,
max_vm_size = 8M

serve, compile
--------------
Незначительно изменён формат управляющего пакета запроса на
компиляцию. В конце пакета (после всех переменных окружения)
теперь должно стоять число 0.

serve, run
----------
Изменён формат управляющего пакета запроса на тестирование. В
новом формате корректно реализована поддержка строк, содержащих
произвольные символы, и неограниченной длины. Кроме этого,
программа `serve' передаёт программе `run' идентификатор
пользователя, имя пользователя (первое из установленных полей
`spelling', `name', `login'), имя задачи (первое из
установленных полей `spelling', `short_name' описания задачи),
которые могут быть затем переданы программе-генератору речи.

В раздел описания задачи файла serve.cfg добавлено поле
`spelling', которое позволяет задать особенности произношения
имени задачи генератором речи.

edit-userlist
-------------
Поддерживается редактирование нового поля `spelling' информации
пользователя.

Поддерживается редактирование нового поля `printer_name' информации
пользователя.

master
------
Улучшена диагностика, выдаваемая, когда пользователь с
административными привилегиями пытается войти в турнир, на
который он не зарегистрирован.

Улучшена диагностика, выдаваемая, когда пользователь пытается
войти в турнир, сервер которого не работает.

run
---
Реализован интерфейс с генератором речи. Если новая глобальная
конфигурационная переменная `extended_sound' файла serve.cfg
установлена, программе-генератору звука, указываемому в
глобальной конфигурационной переменной serve.cfg, передаются
дополнительные параметры: статус завершения, номер теста, имя
пользователя, имя задачи. Эта программа-генератор звука может
использовать эти данные для генерации соответствующего
сообщения. В этом случае глобальные конфигурационные переменные
accept_sound и т. д. не используются.

Для глобальной конфигурационной переменной `sound_player' при
инициализации выполняется подстановка переменных. Таким образом,
можно устанавливать значение этой переменной, например,
следующим образом:
sound_player = "${script_dir}/festival"

run
---
Убрано неявное ограничение на 254 теста для одной задачи. В
предыдущей версии это ограничение не проверялось, что приводило
к краху программы, если какая-либо из задач содержала большее
количество тестов. Теперь количество тестов не ограничено,
память под хранение информации о тестах автоматически
расширяется.

run
---
Ослаблены требования к именованию файлов тестов, правильных
ответов и т. д. В конфигурационном файле описания турнира
serve.cfg в глобальной секции или в секции описания задачи могут
использоваться переменные `test_pat', `corr_pat', `info_pat',
`tgz_pat'. Значение этой переменной должно представлять собой
форматную строку оператора printf, которая используется при
генерации имени файла теста. Дополнительно в функцию printf
будет передаваться целое число - номер теста. Если используется
переменная X_pat, то соответствующая переменная X_sfx не
используется.

Например, имена тестов по умолчанию при значении переменной
test_sfx=".dat" моделируются с помощью переменной test_pat
следующим образом:
test_pat = "%03d.dat"

serve
-----
В режиме турнира ACM поддерживаются три режима округления
времени, прошедшего от начала турнира, до минут при подсчёте
штрафа за сданную задачу. Режим выбирается установкой глобальной
конфигурационной переменной `rounding_mode' файла конфигурации
турнира serve.cfg. Конфигурационная переменная может принимать
следующие значения:
  o ceil (по умолчанию) - берётся минимальное целое количество
    минут, не меньшее времени от начала турнира до момента сдачи
    задания.
  o floor - берётся максимальное целое количество минут, не
    превосходящее время от начала турнира до момента сдачи
    задания. 
  o round - количество минут получается округлением секунд до
    минут (то есть если прошло >= 30 секунд, берётся число минут
    на 1 большее).

team
----
Улучшена диагностика, выдаваемая, когда пользователь пытается
войти в турнир, сервер которого не работает.

userlist-server
---------------
Реализован режим демона. Режим демона включается указанием в
командной строке ключа -D. В режиме демона программа переходит в
фоновый режим и отключает вывод на стандартный поток вывода,
направляя диагностический вывод в файл журнала. Путь к файлу
журнала задаётся с помощью нового элемента <userlist_log>
конфигурационного файла ejudge.xml. Если данный элемент в
конфигурационном файле не установлен, userlist-server в режиме
демона запускаться отказывается. В режиме демона вывод в файл
журнала не содержит некоторых справочных сообщений, доступных в
основном режиме работы программы.

Формат выдачи сообщений в файл журнала достаточно сильно изменён,
чтобы сделать его более кратким и более рациональным, а также
упростить разбор журнала программами-анализаторами журналов.

master,serve
------------
Привилегированный пользователь может сразу добавлять в базу
посылок посылку с нужными параметрами, а не выполнять сначала
команду submit_run, а затем edit_run. Для этого у пользователя в
контесте должны быть установлены полномочия SUBMIT_RUN и
EDIT_RUN. Форма заполнения информации о новой посылке доступна
по ссылке "Add new run", расположенной под диалогом об отправке
решения на проверку на главной странице программы master.

Новые записи, добавленные таким образом в базу посылок, не
отправляются автоматически на тестирование.

serve
-----
Скрытые посылки (hidden runs) могут редактироваться и пересуживаться
до начала турнира.

users,register,master,judge,team
--------------------------------
Реализована поддержка IPv6 адреса ::1 (localhost). Он трансформируется
в адрес 127.0.0.1.

run
---
Исправлена ошибка, заключавшаяся в ненаследовании имени стандартной
проверяющей программы (standard_checker) из описания задачи в
описание тестера для задачи.

edit-userlist
-------------
Устранена утечка памяти при просмотре списка всех пользователей,
внесённых в базу.

Устранена утечка при разборе XML-файлов. Утечка памяти происходила
при разборе любого XML-файла, что затрагивало все программы системы
ejudge.

serve
-----
Добавлена возможность запуска произвольной программы в момент начала
турнира. Эта программа, например, может изменять права доступа
к условиям задач на web-сервере. Для этого в конфигурационном файле
serve.cfg поддерживается новая конфигурационная переменная
contest_start_cmd, которая может быть установлена в имя программы.
Если указывается полный путь к программе (то есть строка, начинающаяся
с '/'), то программа будет запущена из этого пути. Если указывается
относительный путь, полный путь вычисляется относительно глобальной
конфигурационной переменной conf_dir.

Если в глобальных конфигурационных переменных stand_header_file,
stand_footer_file, stand2_header_file, stand2_footer_file,
plog_header_file, plog_footer_file указан относительный путь,
полный путь вычисляется относительно глобальной конфигурационной
переменной conf_dir.

contest.xml
-----------
Если элемент <root_dir> установлен, он должен быть абсолютным
путём к каталогу.

В конфигурационный файл турнира contest.xml добавлен новый элемент
<conf_dir>. Этот элемент содержит путь к каталогу конфигурационных
файлов турнира. Если элемент <root_dir> установлен, то значение
по умолчанию элемента <conf_dir> установливается в <root_dir>/conf.

Если в элементах <register_header_file>, <register_footer_file>,
<users_header_file>, <users_footer_file>, <team_header_file>,
<team_footer_file> указаны относительные пути, полный путь
вычисляется относительно значения элемента <conf_dir>

ejudge.xml
----------
Добавлен новый элемент <var_dir>. В этом элементе хранится путь
к каталогу файлов журналов программ userlist-server, super-serve,
compile. Он используется как путь, относительно которого
вычисляется полный путь, если значения элементов <userlist_log>,
<super_serve_log> и <compile_log> не являются абсолютными путями.

Добавлены новые элементы <super_serve_log>, <compile_log> для
задания пути к файлам журналов утилит super-serve и compile.
Однако, режим демона в этих утилитах пока не реализован.

ejudge-setup
------------
Поддерживается настройка элемента <var_dir> конфигурационного
файла ejudge.xml.

Версия 2.1.31 (20040620)
========================
Существенно улучшена работа с кодировками символов. Из исходного
кода убраны все явные упоминания о кодировке "KOI8-R" и заменены
на кодировку, заданную пользователем в опции --enable-charset
скрипта configure. Если данная опция не была указана,
используется кодировка "UTF-8".

Теперь при разборе XML-файлов выполняется преобразование из
кодировки, указанной в заголовке XML-файла, во внутреннюю
кодировку, задаваемую конфигурационной опцией --enable-charset.
Для этого используется функция `iconv' стандартной библиотеки,
поэтому поддерживаюся почти все существующие кодировки.
Внутренняя кодировка должна быть совместима со строковыми
функциями стандартной библиотеки языка Си, т. е. не должна в
середине строк содержать нулевой байт. Например, UTF-16 не
является такой кодировкой, а UTF-8 --- является.

При генерации HTML-файлов в их заголовок проставляется
кодировка, указанная в конфигурационных файлах (по умолчанию ---
это внутренняя кодировка), однако перекодирование строк из
внутренней кодировки в кодировку HTML-файлов пока не
поддерживается, поэтому в текущей версии системы кодировка
генерируемых HTML-файлов и внутренняя кодировка должны
совпадать. Следовательно, явное задание кодировки генерируемых
HTML-файлов в конфигурационных файлах не рекомендуется.

serve
-----
Удалена конфигурационная переменная `standings_charset'.
Реализация её поддержки в предыдущих версиях была некорректной и
небезопасной. Возможно, когда будет реализована поддержка
перекодировки строк из внутренней кодировки в кодировку HTML
документов данная конфигурационная переменная будет
восстановлена.

ejudge-setup
------------
Исправлено несколько ошибок в функции генерации настроечного
скрипта.

Версия 2.1.30 (20040619)
========================
Полностью переработана процедура компиляции и инсталляции
системы в сторону большего соответствия стандартам GNU. Процесс
инсталляции системы и настройки тестового турнира подробно
описан в файле INSTALL.RUS. Для настройки под текущую систему
теперь используется скрипт configure, генерируемый с помощью
утилиты autoconf. Утилита configure принимает большое количество
опций, которые подробно описаны в файле INSTALL.RUS.

configure
---------
При конфигурировании системы с помощью configure можно указать
значения по умолчанию для важнейших конфигурационных параметров
системы ejudge, например, для пути к каталогу файлов
конфигурации турниров или для пути к сокету связи с сервером
базы пользователей и т. д. Теперь если соответствующая
переменная в конфигурационном файле не установлена, программы
системы ejudge будут использовать "встроенное" (т. е. указанное
при конфигурировании системы) значение. В случае CGI-программ
`master', `judge', `team', `register', `users' это позволяет
вообще обходиться без конфигурационных файлов, если значения
всех переменных заданы при конфигурировании системы. Если
используется путь к конфигурационному файлу, заданный при
конфигурировании системы, можно не указывать его как параметр
запуска программ edit-userlist, userlist-server и т. д.
Таким образом, процесс конфигурирования системы ejudge перенесён
отчасти и на процесс компиляции системы из исходников.

Использование скрипта configure позволяет автоматически
адаптироваться к некоторым вариантам системы Linux. Так, если в
системе не установлен патч на ядро для понижения привилегий
процессов, не будут компилироваться соответствующие утилиты.
Если не установлены утилиты локализации, локализация будет
отключена. Для более подробного описания см. INSTALL.RUS.
По прежнему поддерживается только Linux, попыток переноса
системы на другие платформы пока не принималось.

Скрипт configure определяет присутствие в системе некоторых
систем программирования на языках C, C++, Java, Pascal и др. В
случае их обнаружения автоматически настраиваются скрипты
компиляции. Если системы программирования располагаются не в
стандартных каталогах, их местоположение можно указать явно с
помощью ключей configure.

ejudge-setup
------------
Появилась новая утилита ejudge-setup, предназначенная для
начальной настройки системы ejudge после её компиляции. Утилита
предоставляет интерфейс меню и работает в консольном режиме. С
помощью неё можно уточнить настройки системы ejudge. Задача этой
утилиты --- сгенерировать настроечный скрипт, который, будучи
выполненым, создаст все необходимые каталоги и скопирует в них
необходимые файлы. Утилита начальной настройки может запускаться
из-под обычного непривилегированного пользователя, в то время
как для выполнения настроечного скрипта необходимы, как правило,
привилегии суперпользователя root.

Сгенерированная утилита начальной настройки создаёт все
необходимые конфигурационные файлы, создаёт базу пользователя с
единственным пользователем (параметры которого определяются с
помощью ejudge-setup), обладающим всеми полномочиями системы
ejudge, создаёт конфигурационные файлы для сервера компиляции с
поддержкой всех обнаруженных при конфигурировании системы систем
программирования, создаёт конфигурационные файлы для тестового
турнира и копирует тесты в каталог тестового турнира. Кроме
этого автоматически создаётся рабочий диск для тестирования
программ, а также в каталог CGI-программ веб-сервера
устанавливаются символические ссылки на CGI-программы системы
ejudge.

Скомпилированные программы и файлы, необходимые для их работы,
по команде `make install' инсталлируются в каталог, указанный с
помощью опции --prefix=PREFIX скрипта configure. Если эта опция
не указана, используется путь по умолчанию, равный
HOME/inst-ejudge, где HOME --- домашний каталог пользователя,
запустившего configure. В каталоге PREFIX при инсталляции
создаются следующие каталоги:
        bin/            исполняемые файлы
        cgi-bin/        исполняемые файлы CGI программ
        include/        заголовочные файлы библиотеки libchecker
        lib/            объектные модули библиотеки libchecker
        libexec/ejudge  различные вспомогательные скрипты и программы
        share/ejudge    исходный код библиотеки testlib (pascal)
        share/locale    каталог сообщений
То есть, за исключением каталога cgi-bin структура каталогов
соответствует стандартам GNU.

ejudge-config
-------------
Данный скрипт предназначается для получения информации о
параметрах системы ejudge (точнее, библиотеки libchecker),
необходимой для компиляции проверяющих программ. Скрипт
поддерживает следующие опции:
        --cflags
                возвращает флаги, необходимые для компилятора
                языка Си (например, путь к каталогам
                заголовочных файлов)
        --ldflags
                возвращает флаги, необходимые для компоновщика
        --libs
                возвращает необходимые библиотеки

Таким образом, для компиляции проверяющей программы можно
использовать следующую командную строку:
gcc `ejudge-config --clags --ldflags` prog.c -o prog `ejudge-config --libs`
Здесь предполагается, что скрипт ejudge-config находится в
каталоге, указанном в переменной PATH.

ejudge.xml
----------
Для хранения новых конфигурационных переменных расширен набор
тегов в файле ejudge.xml. Поддерживаются следующие новые теги:
charset, config_dir, contests_home_dir, full_cgi_data_dir,
compile_home_dir, testing_work_dir, script_dir,
serialization_key. Предполагается, что в дальнейшем эти элементы
будут использоваться в утилите редактирования конфигурационных
настроек системы. Кроме того, введён новый атрибут ejudge_user,
являющийся синонимом атрибута local_user. Новое имя атрибута
лучше отражает его семантику.

run
---
Система ejudge теперь поддерживает набор "стандартных
проверяющих программ". К стандартным проверяющим программам, в
частности, относятся программа, сравнивающая два файла
текстуально, или программа, сравнивающая два целых числа в
файлах. Набор стандартных проверяющих программ компилируется
вместе с компиляцией всей системы и инсталлируется в каталог
скриптов (PREFIX/libexec/ejudge). Чтобы использовать стандартную
проверяющую программу нужно в секции описания задачи установить
конфигурационную переменную `standard_checker' в имя стандартной
проверяющей программы. Например,
standard_checker = cmp_int
Набор стандартных проверяющих программ позволяет во многих
случаях избежать написания новых проверяющих программ для
задач. Для полного описания стандартных проверяющих программ
обратитесь к документации.

Местоположение стандартных проверяющих программ можно задать
явно с помощью глобальной конфигурационной переменной
`ejudge_checkers_dir'. По умолчанию её значение равно
PREFIX/libexec/ejudge. Изменить значение по умолчанию можно либо
при конфигурировании системы с помощью configure, либо при
последующей начальной настройке с помощью ejudge-setup.

libchecker
----------
Существенно доработана библиотека для написания проверяющих
программ libchecker. Добавлены новые функции
normalize_spaces_in_file, read_corr_unsigned_int,
read_corr_unsigned_long_long, read_in_long_long, read_int,
read_in_unsigned_int, read_in_unsigned_long_long,
read_team_unsigned_int, read_team_unsigned_long_long,
read_unsigned_int, read_unsigned_long_long. Заголовочные файлы
библиотеки могут использоваться из программы на C++.

serve, compile
--------------
Поддерживается возможность передачи серверу компиляции compile
произвольного количества переменных окружения в запросе на
компиляцию. Переданные переменные окружения будут затем переданы
далее в запускаемый скрипт компиляции. Чтобы установить
переменные окружения, необходимо в конфигурационном файле
турнира serve.cfg в секции описания языка программирования
использовать конфигурационную переменную `compiler_env'. Каждое
использование этой переменной устанавливает одну переменную
окружения, но конфигурационная переменная `compiler_env' может
повторяться в секции описания языка программирования несколько
раз.

run
---
Поддерживается возможность передачи произвольных переменных
окружения в проверяющую программу. Для задания переменных
окружения используется конфигурационная переменная
`checker_env', которая может появляться как в секции описания
задачи, так и в секции описания тестировщика. Поддерживается
наследоваение значений этой переменной от абстрактной задачи или
абстрактного тестировщика. Переменные окружения, полученные из
всех источников (секция описания задачи, секция описания
тестировщика и т. д.) объединяются и передаются проверяющей
программе. Каждое использование конфигурационной переменной
`checker_env' позволяет установить одну переменную окружения, но
конфигурационная переменная `checker_env' может быть
использована несколько раз.

serve, compile, run
-------------------
Поддерживаются подстановки значений одних конфигурационных
переменных в значения других конфигурационных переменных. Такие
подстановки похожи на подстановки значений переменных в
программах на языке shell и тому подобных. Например, чтобы в
определении конфигурационной переменной `start_env' использовать
глобальную конфигурационную переменную `script_dir', определение
конфигурационной переменной `start_env' может выглядеть
следующим образом:
start_env = "LD_PRELOAD=${script_dir}/libdropcaps.so"

Подстановки такого рода пока обрабатываются только для
переменных `compiler_env', `checker_env' и `start_env'. Кроме
того, в подстановках пока можно использовать только глобальные
конфигурационные переменные. Механизм подстановок в чём-то
дублирует механизм форматных преобразований, и, возможно, в
следующих версиях появится некоторый объединённый механизм
подстановок и форматных преобразований.

serve
-----
При старте сервер турнира может создать в каталогах
html-документов веб-сервера символические ссылки на html файлы с
таблицами текущего положения участников. В предыдущих версиях
символические ссылки необходимо было создавать вручную.

Чтобы автоматическое создание символических ссылок работало,
необходимо, чтобы в файле конфигурации турнира serve.cfg была
установлена глобальная конфигурационная переменная
`htdocs_dir'. В ней должен быть указан путь к корневому каталогу
html-документов веб-сервера (на многих Linux-системах это
/home/httpd/html). Если переменная `htdocs_dir' не определена,
используется значение по умолчанию, которое можно установить при
конфигурировании системы с помощью configure. Все пути к
символическим ссылкам указываются относительно этой
конфигурационной переменной.

Для указания пути, по которому должны быть созданы символические
ссылки, используются глобальные конфигурационные переменные
`stand_symlink_dir', `stand2_symlink_dir', `plog_symlink_dir'
для основного файла таблицы результатов, дополнительного файла
таблицы результатов и файла журнала посылкок. Все пути
указываются относительно корневого каталога html документов,
задаваемого в конфигурационной переменной `htdocs_dir'. Имена
файлов в этих каталогах будут совпадать с именами файлов,
задаваемыми в конфигурационных переменных `standings_file_name',
`stand2_file_name', `plog_file_name'. Например, если переменная
`standings_file_name' установлена в значение "standings.shtml",
переменная `htdocs_dir' --- в значение /home/httpd/html, а
переменная `stand_symlink_dir' --- в значение /contests/1, то
при старте программы `serve' в каталоге
/home/httpd/html/contests/1 будет создана символическая ссылка
на файл с таблицей текущих результатов, которая будет иметь имя
standings.shtml. Если в настройках веб-сервера нет особенностей
(типа виртуальных хостов), то таблица результатов будет доступна
по URL http://HOST/contests/1/standings.shtml. Естественно,
чтобы `serve' мог создать символическую ссылку, необходимо,
чтобы у пользователя, под которым работает `serve' было
достаточно полномочий для записи в соответствующий каталог.

Версия 2.1.29 (20040420)
========================
Все параметры периода компиляции, которые не могут быть изменены
с помощью конфигурационных файлов, вынесены в отдельный
заголовочный файл settings.h. Файл содержит определения
следующих констант:
MAX_CGI_VALUE_LEN
  Максимальный размер данных, принимаемый в одной
  CGI-переменной CGI-программами от браузеров клиентов. Таким
  образом, эта константа определяет   максимальный размер файла,
  который может быть принят CGI-программами. В особенности это
  затрагивает:
    o максимальный размер посылки пользователя или
      привилегированного пользователя;
    o максимальный размер сообщения;
    o максимальный размер загружаемого на сервер протокола
      тестирования;
    o максимальный размер сливаемых журналов посылок.
  Обратите внимание, что некоторые глобальные конфигурационные
  переменные, например, max_run_size, накладывают дополнительные
  ограничения на размер принимаемых данных.
  Размер этой константы по умолчанию - 1 мегабайт.
MAX_SERVE_PACKET_LEN
  Максимальный размер пакета данных, принимаемого программой
  `serve' от CGI-программ. Если пакет данных превышает
  максимальный размер, диагностируется ошибка протокола. Эта
  константа накладывает ограничения на все данные, пересылаемые
  от CGI-программ `master', `judge', `team'. Затрагиваемые
  аспекты перечислены выше. 
  Обратите внимание, что некоторые глобальные конфигурационные
  переменные, например, max_run_size, накладывают дополнительные
  ограничения на размер принимаемых данных.
  Размер этой константы по умолчанию - 1 мегабайт.
MAX_USERLIST_PACKET_LEN
  Максимальный размер пакета данных, принимаемого программой
  `userlist-serve' от своих клиентов. Данная константа имеет
  меньшее значение, чем две предыдущих, так как клиенты
  программы `userlist-serve' никогда не пересылают ей
  значительных объёмов данных.
SERVE_PACKET_NAME_SIZE
  Размер буфера, необходимого для хранения имени файла,
  содержащего команду, передаваемую от программы `serve'
  программам `compile' и `run'. Текущее значение этой константы
  равно 13. Таким образом, длина имени файла пакета равно 12, из
  которых первый символ отводится под приоритет пакета, а
  оставшиеся 11 задают уникальное имя пакета, формируемое из
  текущего времени, идентификатора процесса команды `serve',
  номера посылки и т. д.
MAX_LANGUAGE
  Максимальное количество одновременно поддерживаемых в одном
  турнире языков программирования. Каждому языку
  программирования соответствует его идентификатор в диапазоне
  от 1 до MAX_LANGUAGE. Если в конфигурационном файле описания
  турнира `serve.cfg' задано более чем MAX_LANGUAGE описаний
  языков программирования (т. е. секций [language]), сервер
  турнира не может быть запущен.
  Текущее значение этой константы - 31.
MAX_PROBLEM
  Максимальное количество поддерживаемых в одном турнире
  неабстрактных задач. Каждая неабстрактная задача получает свой
  уникальный идентификатор задачи в диапазоне от 1 до
  MAX_PROBLEM. Абстрактные задачи не имеют идентификатора,
  поэтому данное ограничение на них не распространяется. Если в
  конфигурационном файле описания турнира `serve.cfg' задано
  более чем MAX_PROBLEM описаний неабстрактных задач, сервер
  турнира не может быть запущен.
  Текущее значение этой константы - 100.
MAX_TESTER
  Максимальное количество поддерживаемых в одном турнире
  неабстрактных тестировщиков. Каждый неабстрактный тестировщик
  получает свой уникальный идентификатор в диапазоне от 1 до
  MAX_TESTER. Абстрактные тестировщики не имеют идентификатора.
  Тестировщик по умолчанию (т. е. для которого конфигурационная
  переменная any установлена в true) получает единственный
  идентификатор тестировщика вне зависимости от того, ко скольки
  задачам он применяется. Если в конфигурационном файле описания
  турнира `serve.cfg' задано более чем MAX_TESTER описаний
  неабстрактных тестировщиков, сервер турнира не может быть
  запущен.
  Текущее значение этой константы - 100.

В конфигурационный файл описания турнира contest.xml добавлен
новый атрибут closed элемента <contest>. Атрибут может принимать
значения "yes" и "no". Его значение по умолчанию - "no". Если
этот атрибут равен "yes", данный турнир считается "закрытым"
(оконченным), то есть регистрация на него с помощью
CGI-программы `register' невозможна, и запуск CGI-программы
`team' для данного турнира также невозможен (будет выведено
сообщение о том, что данный турнир закрыт). Данный атрибут
турнира может устанавливаться, когда желательно предотвратить
случайные бессмысленные попытки регистрации на турнир и участия
в нём.

В конфигурационный файл описания турнира serve.cfg добавлены
конфигурационные переменные `priority_adjustment',
`user_priority_adjustment' для установки приоритета проверки
решений. Приоритет проверки решений изменяется от -16 (самый
высокий приоритет) до 15 (самый низкий приоритет) и может
устанавливаться глобально для турнира, в зависимости от
участника турнира, в зависимости от языка программирования,
задачи или тестировщика. Приоритет по умолчанию - 0,
конфигурационные переменные описывают изменение приоритета,
например, priority_adjustment равный -2 в секции описания задачи
указывает, что проверка решений по данной задаче получает -2 к
текущему значению приоритета. Полное значение приоритета
получается сложением глобального приоритета, приоритета задачи,
приоритета языка программирования и приоритета тестировщика.

Программа `run' выбирает запросы на тестирование из каталога
запросов в зависимости от приоритета запроса. Более приоритетный
запрос обрабатывается первым. Если во время тестирования
некоторой посылки поступает более приоритетная посылка,
тестирование текущей посылки доводится до конца. Обратите
внимание, что приоритет тестирования не имеет отношения к
приоритету процесса (т. н. nice), с которым работает программа
тестирования.

В конфигурационный файл serve.cfg добавлена конфигурационная
переменная `disable_language' секции описания задачи. Данная
конфигурационная переменная позволяет указать языки
программирования, которые не могут использоваться для посылок по
данной задаче. Каждый раз указывается только одно короткое имя
языка программирования, но переменная `disable_language' может
быть использована несколько раз в описании одной задачи.
Например,
disable_language = "gcc"
disable_language = "g++"
Запрещает для некоторой задачи использование языков с коротким
именем gcc и g++.

register
--------
Поддерживается атрибут closed файла описания турнира
contest.xml. Если атрибут установлен, данный турнир не
отображается в списке турниров, на которые возможна регистрация,
либо для такого турнира не отображается ссылка на страницу сдачи
решений.

serve
-----
Параметры настройки фильтра посылок привилегированных программ
`master' и `judge' теперь сохраняются не только для данного
пользователя, но для пользователя и идентификатора сессии. Таким
образом для каждого окна браузера, в котором отображаются
страницы программ `master' или `judge' установки фильтра посылок
отслеживаются независимо, даже если все они работают под одним
идентификатором пользователя.

serve,run
---------
Поддерживается система приоритетов тестирования, описанная выше.

team
----
Не поддерживаются конфигурационные переменные `max_run_size' и
`max_clar_size'. Проверка соответствующих ограничений полностью
переложена на сервер турнира `serve', где она уже была
реализована.

Поддерживается атрибут closed файла конфигурации турнира
contest.xml. Если атрибут установлен в "yes", сразу же после
запуска программы генерируется страница с сообщением о том, что
турнир закрыт.

userlist-server
---------------
Поддерживается атрибут closed файла конфигурации турнира
contest.xml.

master,serve
------------
Добавлена возможность перетестирования всех посылок, которые
удовлетворяют текущему выражению фильтра. Для этого нужно нажать
на кнопку "Rejudge displayed runs". После нажатия на кнопку
будет отображена страница подтверждения операции, на которой
будут перечислены все пересуживаемые посылки.

serve
-----
Поддерживается конфигурационная переменная `disable_language'
секции описания задачи.

Версия 2.1.28 (20040402)
========================
Добавлена новая глобальная конфигурационная переменная
`enable_report_upload'. Добавлена новая конфигурационная
переменная описания задачи `date_penalty'.

clean-users
-----------
Добавлена поддержка автоматического удаления неактивных
регистрационных имён из базы пользователей. Регистрационное имя
считается неактивным, если под данным регистрационным именем не
была сделана ни одна попытка сдачи задач и не был задан ни один
вопрос. Регистрационное имя никогда не считается неактивным,
если оно привилегированное (т. е. указано в элементе <cap>
конфигурационного файла ejudge.xml), или если для него
установлен флаг never_clean.

Для активации режима удаления записей из базы пользователей
необходимо в командной строке программы clean-users указать
опцию -r. При обнаружении неактивного регистрационного имени на
стандартный поток вывода будет напечатан запрос о подтверждении
операции удаления, на который нужно ответить либо 'y', либо
'n'. Если дополнительно к опции -r указана опция -f, запрос о
подтверждении не выводится, и все неактивные регистрационные
имена удаляются автоматически.

serve,master,judge
------------------
Привилегированные пользователи могут просматривать как судейский
протокол тестирования, так и протокол тестирования,
предназначенный для участников. На странице просмотра исходного
текста посылки и протокола тестирования добавлена ссылка
"View team report", при нажатии на которую отображается
пользовательский протокол тестирования. Естественно, что для
того, чтобы пользовательский протокол тестирования генерировался
и отображался глобальная конфигурационная переменная
`team_enable_rep_view' должна быть установлена в true. Чтобы
пользователь мог просматривать протокол тестирования, для него в
соответствующем турнире должен быть установлен бит полномочий
VIEW_REPORT.

serve,master,judge
------------------
Привилегированный пользователь может загружать на сервер протокол
тестирования (как пользовательский, так и судейский). После
этого новый загруженный протокол тестирования будет отображаться
по команде "View report". Чтобы пользователь мог загрузить
протокол тестирования на сервер, глобальная конфигурационная
переменная `enable_report_upload' должна быть установлена в
true, а для пользователя в соответствующем турнире должен быть
установлен бит полномочий EDIT_RUN. Если в турнире включена
поддержка протоколов тестирования участников
(`team_enable_rep_view') при загрузке протокола на сервер можно
выбрать, заместит ли загружаемый протокол протокол участника,
судьи или сразу оба.

serve
-----
Добавлена возможность назначения штрафа за задачу в зависимости
от времени сдачи задачи. Например, если попытка по задаче
послана до 5 апреля 2004 г., она не получает штрафных очков,
если она послана 5-11 апреля, она получает одно штрафное очко, а
если 12 апреля и позднее - 2 штрафных очка. Для этого
используется конфигурационная переменная `date_penalty' секции
определения задачи. Чтобы реализовать указанную выше политику
штрафования, секция описания задачи должна содержать следующий
фрагмент:
date_penalty = "2004/04/05 0"
date_penalty = "2004/04/12 -1"
date_penalty = "2005/01/01 -2"
Каждое определение переменной `date_penalty' в рамках одной
секции описания задачи добавляет новую спецификацию штрафования
к уже существующим. Значение переменной `date_penalty' не
наследуется от абстрактных задач. Спецификации `date_penalty'
одной задачи не зависят от `date_penalty' других задач.
Спецификации упорядочены и проверяются в порядке их задания в
конфигурационном файле. Каждая спецификация штрафа имеет вид
DATE ADD-VALUE
где DATE - календарная дата, задаваемая в стандартном для ejudge
формате YYYY/MM/DD [hh[:mm[:ss]]], ADD-VALUE - значение,
прибавляемое к количеству баллов, полученному в результате
тестирования. Получившееся значение не может быть меньше 0 (в
этом случае оно устанавливается в 0) и больше максимального
значения баллов за данную задачу (в этом случае оно
устанавливается в максимальное количество баллов). Штрафование в
зависимости от времени работает только в режиме турнира KIROV.

userlist-server
---------------
Поддерживаются произвольные идентификаторы пользователя и группы
(в том числе отрицательные).

Версия 2.1.27 (20040327)
========================
Добавлены несколько новых возможностей администраторского
режима (приостановка/возобновление печати, загрузка исходного
текста посылки в бинарном виде, сравнение посылок). Добавлена
поддержка бинарных файлов. Добавлено отображение времени
последней успешной сдачи в таблицу текущего положения участников
турнира. Добавлены несколько новых конфигурационных переменных.

Изменён формат XML-представления журнала посылок. В элемент
<run> добавлен атрибут nsec, который содержит наносекундную
составляющую времени посылки. Как следствие, атрибут time теперь
содержит время в секундах вместо времени в миллисекундах, как
в предыдущей версии.

master,judge,team,register,users
--------------------------------
Максимальный размер данных, которые принимаются от веб-клиента
увеличен до 1 МБайта.

master,judge,team,serve
-----------------------
При отправке решений на проверку допускаются бинарные файлы, то
есть файлы, содержащие нулевой байт. Такие файлы без изменений
передаются на сервер.

Если для языка программирования, выбранного для данной посылки,
установлена в true конфигурационная переменная `binary',
поступивший файл будет записан в архив без изменений (т. е. со
всеми нулевыми байтами). В противном случае файл будет обрезан
по первому нулевому байту и будет диагностирована ошибка посылки
решения. По умолчанию установлен режим текстовых посылок.

master,judge,team,serve
-----------------------
Обновлён формат файла состояния сервера турнира. Его размер
установлен равным 128 байт, при этом в настоящее время 77 байт
не используются. Это позволит безболезненно добавлять новые поля
состояния сервера, аналогично тому, как добавлялись поля в базу
посылок. Новая версия формата файла состояния получила номер 2 и
новое значение магической константы в заголовке. Для обратной
совместимости утилиты master,judge,team поддерживают чтение
файла состояния сервера версии 1.

master,serve
------------
Администратор турнира может приостановить обслуживание запросов
на печать. Для этого он должен иметь установленным бит
полномочий CONTROL_CONTEST. Для приостановки печати используется
кнопка ``Suspend printing'', появляющаяся на главной странице
интерфейса администратора, если в данном турнире печать
разрешена. Снова разрешить печать посылок можно с помощью
кнопки ``Resume printing'', появляющейся вместо предыдущей
кнопки в режиме приостановки печати. В режиме приостановки
печати участники турнира не смогут послать запрос на печать,
однако привилегированные пользователи могут печатать как
обычно.

serve
-----
При запуске сервер считывает своё предыдущее состояние,
восстанавливая таким образом значения флагов приостановки
обслуживания клиентов, приостановки проверки решений,
окончательной проверки решения (для турнира по системе
OLYMPIADS) и приостановки печати решений.

serve
-----
В базу посылок добавлена наносекундная составляющая времени
посылки. Теперь все посылки, принятые одним сервером, будут
иметь уникальное время приёма. Это позволяет наконец решить
проблему упорядочивания нескольких посылок, пришедших в одну
секунду. Стабильность слияния посылок от нескольких серверов
распределённого турнира требует, чтобы при одинаковом времени
приёма посылки были как-то упорядочены по вторичному критерию,
но любой вторичный критерий может привести к необходимости
переупорядочивать посылки во время работы сервера турнира.
Переупорядочивание посылок, которые были отправлены на
компиляцию или проверку приведёт либо к потере результатов, либо
к подмене результатов. Решением этой проблемы является
требование уникальности времени приёма для всех посылок,
обрабатываемых одним сервером, что достигается добавлением
наносекундной компоненты. С большой вероятностью каждая посылка
будет иметь уникальное время получения даже и в распределённом
турнире, но полагаться на это нельзя.

Формат базы посылок новой версии совместим снизу вверх с
форматом базы посылок предыдущей версии (значение наносекундной
составляющей времени полагается равным нулю).

userlist-server
---------------
В базу пользователей добавлено поле `location', которое
предназначено для использования администратором очного турнира
для указания местоположения команды в классе. Значение этого
поля выводится на заглавную страницу распечатки листинга
программы.

edit-userlist
-------------
Поддерживается редактирование поля `location'.

serve
-----
В таблице текущего положения команд печатается информация о
последней успешной сдаче (Last success).

serve,master,judge
------------------
Из страницы просмотра исходного текста посылки возможна загрузка
исходного текста. Для этого необходимо нажать на ссылку
"Download run". Страница просмотра исходного текста уже содержит
сам исходный текст, но возможность загрузки исходного текста
необходима по следующим причинам:
  1. Исходный текст можно сразу сохранить в файл, а не
     копировать его через буфер обмена, избегая таким образом
     искажения данных, возможных при копировании через буфер
     обмена.
  2. Для посылок, в секции описания которых установлен флаг
     `binary', исходный текст посылки не отображается, так как
     может содержать непечатные символы, и во многих случаях
     (например, в случае посылки архива исходных текстов) его
     отображение вообще бессмысленно.

serve,master,judge
------------------
Из страницы просмотра исходного текста возможно сравнение
исходного текста данной посылки с исходным текстом другой
посылки. Для этого нужно ввести номер посылки и нажать на кнопку
"Compare". Сравнение ведётся с помощью программы diff командой
"diff -u". Путь к команде diff можно задать с помощью глобальной
конфигурационной переменной `diff_path'. При отображении
страницы просмотра исходного текста в поле ввода номера
сравниваемой посылки записывается номер ближайшей (в сторону
уменьшения) посылки, для которой значения идентификатора
команды, идентификатора языка программирования и идентификатора
задачи совпадают со значениями соответствующих полей текущей
посылки. 

userlist-server
---------------
В базу пользователей добавлено новое поле `never_clean'. Если
для некоторого пользователя это поле установлено в значение
`true', утилита clean-users, которая просматривает все базы
посылок и отмечает команды, не задавшие ни одного вопроса и не
пославшие ни одну посылку, как кандидаты на удаление, никогда не
будет отмечать таких пользователей как кандидатов на удаление.

edit-userlist
-------------
Поддерживается редактирование нового поля `never_clean'.

clean-users
-----------
Корректно обрабатываются турниры с пустым журналом посылок.
Поддерживается флаг `never_clean' участника.
Для каждого пользователя собирается информация о турнирах, в
которых этот пользователь запускал команду VIRTUAL_START или
VIRTUAL_STOP. Если некоторый пользователь не послал ни одной
программы и не задал ни одного вопроса, но имеет события
VIRTUAL_START или VIRTUAL_STOP, зарегистрированные за ним, все
номера виртуальных турниров, в которых есть такие события,
печатаются в разделе "Virtual contests for start/stop only
users".

serve
-----
Исправлены некоторые ошибки в процедуре слияния журналов
посылки. Данная возможность должна теперь работать нормально
во всех ситуациях.

Версия 2.1.26 (20040219)
========================
Добавлено сохранение некоторых параметров состояния клиента
участника турнира. Добавлена новая конфигурационная переменная
для указания каталога сохранения состояния.

Добавлена поддержка печати на принтер.

Исправлено большое количество ошибок, проявляющихся в режиме турнира
`OLYMPIADS'.

В формат конфигурационного файла `contest.xml' внесено изменение,
которое делают его несовместимым с форматом файла предыдущих версий.
Система ejudge при чтении конфигурационных файлов старых версий будет
выдавать ошибку. Чтобы исправить конфигурационный файл сделайте в нем
замену названия бита полномочий SUBMIT_RUNS на SUBMIT_RUN.

serve
-----
В базу посылок добавлено поле `pages' для сохранения количества
напечатанных страниц для данной посылки. Это поле
устанавливается, когда посылка печатается самим участником с
помощью CGI-программы team. Поле используется, чтобы не печатать
несколько раз одну и ту же посылку, и для подсчёта общего
количества напечатанных страниц для проверки квоты страниц.

serve,master
------------
Добавлена поддержка редактирования значения поля `pages'.

serve,master,judge,team
-----------------------
Добавлена поддержка печати листинга программы на принтер. Для
привилегированных пользователей печать доступна всегда из
диалога просмотра информации о посылке. Для печати
привилегированный пользователь должен иметь полномочие
`PRINT_RUN'. Привилегированный пользователь может напечатать
несколько раз одну и ту же посылку, для него не ограничивается
количество напечатанных страниц. Обычному участнику турнира
печать доступна, если установлена глобальная конфигурационная
переменная `enable_printing'. Максимальное количество страниц
для одного пользователя устанавливается с помощью глобальной
конфигурационной переменной `team_page_quota' (по умолчанию
значение равно 50). Квота учитывает заглавную страницу,
содержащую информацию о посылке.

Для печати используется программа `a2ps'. Путь к данной
программе задаётся с помощью глобальной конфигурационной
переменной `a2ps_path'. Дополнительные аргументы программы
`a2ps' задаются с помощью глобальной конфигурационной переменной
`a2ps_args'. Путь к программе постановки в очередь печати `lpr'
задаётся с помощью глобальной конфигурационной переменной
`lpr_path'. Дополнительные аргументы для программы `lpr'
задаются с помощью глобальной конфигурационной переменной
`lpr_args'.

contest.xml
-----------
Добавлен новый бит полномочий `PRINT_RUN'. Бит полномочий
`SUBMIT_RUNS' переименован в `SUBMIT_RUN', поэтому новая версия
системы будет выдавать ошибку при чтении конфигурационных файлов
предыдущих версий.

userlist-server
---------------
При генерации случайных паролей в паролях не используются
символы, которые легко спутать друг с другом: 'l', 'I', '1',
'O', '0'.

serve,run
---------
Добавлена новая конфигурационная переменная описания задачи
`accept_partial'. Переменная действует только в режиме турнира
OLYMPIAD. Если эта переменная установлена в true, то решения
участников принимаются на проверку даже в случае, когда они не
прошли всех тестов из условия. Соответствующим образом обновлён
протокол взаимодействия программ `serve' и `run'.

serve
-----
В действительности сделано, чтобы привилегированный пользователь
мог делать посылки до начала и после окончания турнира. Эта
возможность заявлялась, но была отключена.

serve
-----
Поскольку добавление очередной посылки может добавлять её не в
конец базы посылок, после добавления посылки может потребоваться
переименование архивных файлов. Ранее добавление посылки не в
конец приводило к потере посылки.

serve
-----
В режиме турнира OLYMPIAD переключиться в режим проверки можно и
до конца турнира.

serve,master
------------
Добавлена поддержка команды `Set accepting mode', которая
переключает турнир из режима проверки в режим приёма посылок.
Команда действует только в режиме турнира OLYMPIAD.

run
---
Существенно улучшена поддержка режима турнира `OLYMPIAD'. Этот
режим почти всегда обрабатывается так же, как `KIROV'. Улучшены
возможности по прерыванию работы программы по Ctrl-C. Во всех
случаях поддерживаются тесты с нулевой суммой баллов.

serve
-----
При перезаписи архивного файла (например, протокола
тестирования) предварительно удаляются предыдущая запись с
данным номером. Это исправляет ошибку, когда, например,
предыдущая запись не была сжата (не имела суффикс .gz), а новая
запись - сжата (имеет суффикс .gz в имени файла). Таким образом
оказывается, что архив протоколов содержит два протокола для
некоторой посылки. Эти два протокола в некоторых ситуациях
конфликтуют друг с другом.

serve
-----
Добавлена поддержка сохранения параметров состояния клиента
участника турнира. Синтаксис файла состояния основан на XML. В
настоящее время сохраняется пока статус просмотра сообщений, то
есть для каждого сообщения, адресованного участнику турнира
сохраняется, просматривал ли участник это сообщение. Файлы
состояния участника подгружаются по требованию и создаются при
необходимости. Если сохраняемое состояние участника изменилось,
оно сохраняется в момент завершения работы программы serve.

Добавлена новая глобальная конфигурационная переменная
`team_extra_dir'. Она содержит каталог, в котором размещаются
файлы сохраняемого состояния участников. По умолчанию эта
переменная равна ${var_dir}/team_extra, где ${var_dir} -
значение глобальной конфигурационной переменной `var_dir'.
Файлы сохраняемого состояния хранятся в подкаталогах этого
каталога, организованные в дерево каталогов. В каждом каталоге
находится не более 32 подкаталогов или непосредственно файлов,
аналогично тому, как организован архив посылок.

serve,team
----------
Если у участника турнира есть непросмотренные сообщения, в
разделе состояния турнира выводится сообщение "You have X unread
message(s)" (или "Непросмотренных сообщений: X"). У участника
турнира сообщения, направленные участником судьям имеют статус
"U", если эти сообщения не просмотрены судьями (у судей эти же
сообщения имеют статус "N"). Сообщения от судей всем участникам
или от судей конкретному участнику имеют статус "N", если
сообщения не были ни разу просмотрены этим участником.
Просмотренные сообщения не имеют специального статуса.

serve
-----
Добавлена новая конфигурационная переменная описания задачи
`hidden'. Если эта переменная установлена в true, такая задача
не показывается в таблице текущих результатов турнира, но
остаётся доступной для сдачи участниками.

master,judge
------------
Если в URL не задан идентификатор турнира contest_id, и имя
CGI-программы имеет вид master или judge, то выводится
приглашение ко вводу регистрационного имени, пароля и
идентификатора турнира.

userlist-server
---------------
Резервные копии базы данных пользователей, которые сохраняются
один раз в 24 часа, теперь записываются в сжатом формате GZIP.

Если сохранение текущего состояния базы пользователей
завершилось из-за ошибки, временный файл, создаваемый в процессе
записи, удаляется.

compile
-------
Улучшена обработка ошибочных ситуаций. Программа compile теперь
не завершит свою работу в случае, если исчерпано дисковое
пространство. Вместо этого она будет пытаться выполнить запись с
интервалом 5 сек.

compile,run
-----------
Если программа переходит в состояние ожидания сериализационного
семафора (см. описание глобальной конфигурационной переменной
`cr_serialization_key'), на стандартный поток ошибок печатается
диагностическое сообщение "waiting for lock".

Версия 2.1.25 (20031229)
========================
Добавлены новые возможности редактирования базы посылок. Формат
конфигурационных файлов не изменился.

serve,master
------------
На странице просмотра исходного кода текущей посылки
администратор турнира может редактировать количество тестов, на
которых прошла данная посылка, а также количество очков за эту
посылку. Последнее доступно только в режиме турнира KIROV или
OLYMPIAD.

serve,master
------------
Со страницы просмотра исходного кода текущей посылки
привилегированный пользователь может быстро перейти к просмотру
протокола тестирования и наоборот.

userlist-server,register
------------------------
При добавлении новых членов команды сервер базы пользователей
строже проверяет ограничения на максимальное количество членов
команды. 

serve
-----
В базу данных посылок добавлено поле `is_readonly', которое
может принимать булевское значение. Если это поле установлено в
true, всякое изменение полей данной посылки, за исключением
самого поля `is_readonly' запрещено. Посылка с установленным
флагом `is_readonly' никогда не пересуживается.

serve,master
------------
Добавлена поддержка редактирования нового поля `is_readonly'.

serve,run
---------
Добавлена новая конфигурационная переменная `disable_testing',
которая доступна как на глобальном уровне, так и на уровне
описания задачи. Если эта конфигурационная переменная для
некоторой задачи установлена в true, никакого тестирования
посылок по этой задаче не ведётся. При поступлении они получают
статус "Accepted for testing", который может быть изменён
вручную. Программа run для задач с установленным флагом
`disable_testing' не проверяет наличия тестов и проверяющей
программы. Все запросы на тестирование данной задачи
игнорируются.

serve,master,judge
------------------
В язык фильтра посылок добавлены новые выражения для новых полей
базы данных посылок: imported[(run_id)], curimported,
hidden[(run_id)], curhidden, readonly[(run_id)], curreadonly,
varant[(run_id)], curvariant, rawvariant[(run_id)],
currawvariant. Отличие конструкции rawvariant от variant в том,
что rawvariant всегда берёт значение номера варианта из базы
посылок. variant, если значение в базе посылок установлено в 0
(то есть используется вариант из таблицы вариантов), возвращает
номер варианта из таблицы вариантов.

serve,master,judge
------------------
При просмотре подробной информации о посылке ("View source")
некоторые поля помечаются как гиперссылки. При нажатии на них
автоматически конструируется выражение для фильтра посылок,
отбирающее только посылки, у которых значение соответствующего
поля совпадает со значением поля у текущей посылки. Например,
если проследовать по гиперссылке в поле "IP-address", выражение
фильтра будет равно "ip == ip(run_id)", где вместо run_id будет
подставлен номер текущей посылки. Таким образом фильтруются
только записи в базе, соответствующие посылкам с того же самого
IP-адреса. Предыдущее выражение фильтра будет очищено.

serve
-----
Добавлена конфигурационная переменная описания задачи
`variable_full_score'. Если эта переменная установлена в true,
изменяется правило вычисления баллов за полностью решённую
задачу в режимах турнира OLYMPIAD или KIROV. В обычном режиме за
полностью решённую задачу (то есть за посылку, которая имеет
статус OK) даётся количество баллов, определённое в переменной
`full_score' описания задачи (далее из этого числа вычитаются
штрафные баллы и т. д.). В режиме, включаемом конфигурационной
переменной `variable_full_score' за удачную посылку (то есть
посылку, имеющую статус OK) даётся столько баллов, сколько
указано в поле score этой посылки. Данная конфигурационная
переменная удобна в случаях, если статус OK выставляется вручную
(например, по результатам ручного тестирования), и необходимо
ранжировать принятые решения по баллам.

serve,master,judge
------------------
В список участников турнира, генерируемый по ссылке "View teams"
из главного экрана, добавлена возможность быстрого включения
фильтра посылок для некоторого участника. Для этого нужно
кликнуть на гиперссылке идентификатора участника (первое поле).
Просмотр вернётся в главный экран и будет включён фильтр на
идентификатор пользователя.

После редактирования поля в режиме просмотра исходного текста
посылки ("View source" из главного экрана) текущий экран не
переключается на главный, а остаётся в режиме просмотра
исходного текста этой посылки.

master,judge
------------
Из формы входа в программу убран выбор возможного варианта
поддержки сессии. Программы master и judge поддерживают три
варианта: 1) передавать всегда login/password в скрытых
переменных формы, 2) генерировать идентификатор сессии и
передавать его в скрытых переменных формы, 3) генерировать
идентификатор сессии и передавать его в URL, 4) генерировать
идентификатор сессии и сохранять его в cookie. По умолчанию
предлагался выбор третьего варианта. Теперь меню выбора удалено,
и всегда выбирается третий вариант. В дальнейшем планируется
удалить из программ master, judge, team обработку остальных
вариантов поддержки сессии.

Версия 2.1.24 (20031208)
========================
В данной версии добавлены новые возможности, и незначительно
изменились некоторые директивы конфигурационных
файлов. Изменился формат файла состояния сервера, который
генерируется программой serve и используется CGI-программами
master, judge и team. Новые версии этих программ выдадут ошибку
чтения файла состояния и немедленно завершатся при попытке их
запустить в каталоге турнира старой версии. Чтобы устранить эту
неприятность, один раз запустите serve на этом турнире. Как
только файл состояния будет перегенерирован, serve можно
остановить.

Из архива исходных текстов системы удалены все неиспользуемые
исходные тексты и устаревшие дополнительные материалы. В
результате архив значительно сократился в размере.

Конфигурационный файл contest.xml
---------------------------------
Удалена поддержка элемента <observer_access>. Этот элемент был
введён для CGI-программы `observer', которая не была
реализована. Удалена поддержка бита полномочий OBSERVER_LOGIN.

Добавлен новый бит полномочий SUBMIT_RUNS. Если этот бит для
некоторого пользователя установлен, этот пользователь позволяет
отправлять решения на проверку из-под CGI-программ master или
judge. Естественно, этот пользователь должен иметь полномочия
запускать соответствующую программу.

serve
-----
Оптимизирована структура архивов посылок и протоколов
тестирования. Вместо размещения всех файлов архива в одном
каталоге (например, все протоколы тестирования размещались в
каталоге var/archive/reports каталога турнира), файлы архива
структурируются в дерево таким образом, чтобы каталог на каждом
уровне содержал не более 32 записей. Максимальное количество
файлов в архиве ограничено примерно 1 миллионом, поэтому для
размещения всех файлов достаточно 3 уровней подкаталогов.
Например, протокол тестирования для посылки с номером 1905 будет
размещён в файле var/archive/reports/0/1/R/001905.
Данная оптимизация позволяет существенно увеличить скорость
открытия файлов для файловых систем, в которых записи в каталоге
хранятся в неупорядоченном виде (например, ext2/ext3).
Чтобы отменить такую форму хранения архивных файлов, необходимо
установить глобальную конфигурационную переменную
use_dir_hierarchy в 0 следующим образом:
use_dir_hierarchy = 0
По умолчанию поддержка иерархической структуры архивных каталогов
включена.

Старый и новый форматы хранения архивных файлов совместимы снизу
вверх, то есть новая версия системы ejudge будет корректно
открывать архивы, созданные в системах предыдущих версий. Однако
если поддержка иерархической структуры включена, то все
последующие посылки уже будут сохраняться в иерархической
системе каталогов и таким образом станут недоступными для
системы ejudge предыдущих версий.

Все архивные файлы, размер которых больше некоторого значения
(по умолчанию - 4096 байт) сжимаются алгоритмом gzip и
сохраняются в файле с суффиксом .gz. Настроить минимальный
размер сжимаемого файла можно с помощью глобальной
конфигурационной переменной `min_gzip_size' файла конфигурации
турнира serve.cfg. Размер по умолчанию в 4 килобайта выбран, так
как 4 Кб - размер минимальной единицы выделения дискового
пространства в современных версиях ext2/ext3 на архитектуре ia32
(этот размер совпадает с размером страницы виртуальной памяти).
Сжимать файлы меньшего размера бессмысленно, так как размер
занимаемой дисковой памяти от этого не уменьшится. Чтобы
полностью отменить сжатие архивных файлов необходимо установить
в 0 конфигурационную переменную use_gzip:
use_gzip = 0

В базе данных посылок добавлено поле для сохранения варианта
задачи. По умолчанию вариант задачи равен 0, то есть берётся
вариант задачи согласно файлу отображения вариантов
(varant_map_file). Но из-под программ judge и serve можно
послать решения, выбирая вариант явно. Кроме того, администратор
может принудительно изменить вариант задачи.

В базе данных посылок добавлен флаг "скрытой" посылки. Такие
посылки тестируются, но никак не влияют на таблицу текущих
результатов, не отображаются в публичном журнале посылок и не
могут быть проэкспортированы в XML.

serve,master,judge
------------------
Привилегированный пользователь может отправлять решения на
проверку, если у него установлен бит полномочий SUBMIT_RUNS. В
генерируемую программами master и judge html-страницу добавлена
форма посылки решения. Решение, посылаемое из программ master и
judge добавляется в базу посылок с флагом "невидимое" (hidden),
то есть оно тестируется, но никак не влияет на таблицу текущих
результатов, не отображается в публичном журнале посылок и не
может быть проэкспортировано в XML. Привилегированный
пользователь может посылать решения любой задачи (даже той,
deadline по которой уже истёк), любого варианта задачи на выбор
(если задача вариантная) с использованием любого языка
программирования (даже такого, для которого установлен флаг
disabled). Для таких посылок не проверяется время посылки, то
есть они могут быть сделаны до момента начала или после момента
окончания турнира. Для таких посылок не проверяются квоты
суммарного размера посланных файлов, количества посылок и т. д.

serve,master
------------
Добавлена возможность редактирования новых полей базы данных
посылок: variant, is_hidden. Установка номера варианта в 0
означает, что для нахождения номера варианта будет
использоваться файл отображения вариантов. 

judge
-----
Исправлена ошибка неправильного форматирования таблицы посылок
участников для событий VIRTUAL START, VIRTUAL STOP и пустой
записи EMPTY.

run
---
Допускается указание цены одного теста равной 0 баллов. Ранее
установка цены теста в 0 баллов была эквивалентна установке цены
теста в значение по умолчанию (1 балл). Тесты ценой 0 баллов
корректно обрабатываются. Тесты ценой 0 баллов полезны для того,
чтобы оценивать задачу по системе "принято"/"непринято", но при
этом предоставлять участникам детализированную информацию о
результатах работы их программы.

serve,master
------------
Изменить продолжительность турнира можно и после его окончания
(как окончания из-за команды администратора "Stop contest", так и
из-за истечения времени). Для этого должна быть установлена
конфигурационная переменная `enable_continue' файла конфигурации
турнира `serve.cfg', например
enable_continue

Администратор турнира может уменьшить заявленную продолжительность
турнира с помощью команды "Change duration" (в предыдущих версиях
продолжительность турнира могла только увеличиваться). Однако в случае,
если турнир уже идёт, уменьшение его длительности не может приводить
к тому, что текущий момент времени окажется позднее момента окончания
турнира из-за исчерпания времени турнира. Попытка такого изменения
продолжительности блокируется.

Запрещено уменьшение длительности неограниченного по времени турнира,
а также увеличение длительности ограниченного по времени турнира
до неограниченного по времени турнира.

Расширены возможности продолжения остановленного турнира.
Можно продолжить турнир конечной длительности, если его
установленная длительность такова, что текущий момент времени не
находится после окончания турнира из-за истечения времени
турнира. Турнир, уже закончившийся из-за истечения времени,
можно продлить, сначала увеличив его длительность с помощью
команды "Change duration", а затем продолжив турнир с помощью
команды "Continue". Обратите внимание, что возможность
продолжения турнира доступна, только если в конфигурационном
файле турнира установлена глобальная конфигурационная переменная
enable_continue.

serve
-----
Значение конфигурационной переменной board_fog_time, равное 0
означает, что таблица результатов вообще не "замораживается".
В предыдущих версиях отключить заморозку было невозможно (можно
было включить заморозку за 1 минуту до конца турнира).

Введены новые глобальные конфигурационные переменные турнира
`stand_freeze_time' и `stand_melt_time', которые являются
синонимами для `board_fog_time' и `board_unfog_time'
соответственно. Новые имена более соответствуют своему
назначению. Поддержка старых имён сохранена. 

serve,master,judge,team
-----------------------
Если для турнира установлен режим заморозки результатов, время
заморозки отображается клиентам в разделе состояния сервера.

team
----
Из раздела состояния сервера убрана строка "Время клиента:", так
как её название не соответствует её назначению. Время клиента
всегда означало момент календарного времени, в который на
сервере работает CGI-программа обслуживания клиентов team,
master или judge.

serve,team
----------
В конфигурационном файле турнира поддерживается новая глобальная
конфигурационная переменная `team_enable_ce_view'. Если эта
переменная установлена в ненулевое значение, в случае, если
участник на некоторой посылке получает ошибку компиляции, ему
становится доступным файл диагностики компилятора, даже если
показ протокола тестирования для участников (глобальная
конфигурационная переменная `team_enable_rep_view') отключён.

В конфигурационном файле турнира поддерживается новая глобальная
переменная и переменная описания задачи
`team_show_judge_report'. Если эта конфигурационная переменная
установлена в ненулевое значение, и включён режим показа
протокола тестирования участникам (глобальная конфигурационная
переменная `team_enable_rep_view'), участникам становится
доступным судейский протокол тестирования. Судейский протокол
тестирования содержит входные данные (тесты), результат работы
программы, вывод программы на стандартный поток ошибок, вывод
проверяющей программы и т. д. По умолчанию участники могут
видеть только сокращённый протокол, содержащий лишь результаты
проверки программы на тестах, но не сами тесты и результат
работы программы на них. Режим показа полного протокола
тестирования может включаться и выключаться для каждой задачи
индивидуально с помощью явного указания значения
конфигурационной переменной `team_show_judge_report' в описании
задачи. 

serve
-----
Исправлена ошибка, когда serve завершается аварийно (по assert),
если на турнир не был зарегистрирован ни один пользователь.

serve,master
------------
Администратор турнира может приостановить проверку поступающих
решений с помощью команды "Suspend testing". В режиме
приостановленного тестирования все решения принимаются от
участников как обычно, но не отправляются на тестирование, а
заносятся в базу посылок со статусом "Accepted for testing"
("Принято на проверку"). Решения будут оставаться в этом статусе
до тех пор, пока администратор не отправит их на проверку явно
или с помощью команды "Judge suspended runs". Назначение этой
команды --- снизить нагрузку на сервер турнира, если он
одновременно является компьютером, на котором идёт компиляция
и/или запуск решений, в конце турнира, когда поток посылок,
обычно, очень интенсивный. В режиме приостановки проверки вместо
команды "Suspend testing" становится доступна команда
"Resume testing", снова включающая режим немедленной проверки
решений.

Администратор турнира может направить на проверку все решения,
полученные в период приостановки тестирования, с помощью команды
"Judge suspended runs".

serve,master,judge
------------------
В выражении для фильтра посылок можно использовать конструкции
`status' и `curstatus', которые являются синонимами для `result'
и `curresult'.

Версия 2.1.23 (20031121)
========================
В данной версии исправлены замеченные ошибки предыдущей версии.
Новых возможностей не добавлено. Формат конфигурационных файлов
не изменился.

В архив исходных текстов добавлен неофициальный русский перевод
Стандартной общественной лицензии GNU (автор перевода - Елена
Тяпкина). Система ejudge распространяется на условиях данной
лицензии. Перевод находится в файле COPYING.RUS.

serve, compile, run
-------------------

В конфигурационных файлах поддерживаются два вида кавычек:
одинарные и двойные, а также символ \ для экранирования
следующего за ним символа. Правила использования этих
специальных символов такие же, как в файле дополнительной
информации о тестах test.inf. Например:
table_head_style = 'h2 style="common"'

serve/master
------------

При экспорте журнала посылок в формате XML корректно
обрабатываются специальные символы (", &) - они заменяются на
соответствующие HTML/XML последовательности (&quot; &amp;).

team
----

В случае ошибки регистрации пользователя выдаётся сообщение об
ошибке, в котором более точно указывается причина ошибки:
пользователь не зарегистрирован на турнир, пользователь
заблокирован администратором или неверный
логин/пароль/идентификатор турнира.

run
---

Символы `#' внутри последовательностей символов в кавычках " и
', а также после \ обрабатываются корректно. Таким образом можно
использовать символ `#' в аргументах командной строки,
передаваемых тестируемой программе.

userlist-server
---------------

При записи базы пользователей в формате XML специальных
XML-cимволы (", &, <, >) обрабатываются корректно, то есть
заменяются на соответствующие последовательности (&quot; и т. д.).

Для поиска логина пользователя или его cookie реализован
просмотр хэш-таблиц вместо последовательного просмотра
списков. Это позволило ускорить поиск в 100 раз.

register
--------

Исправлено обрезание полей ввода по символу "Номер". Этот символ
теперь корректно заменяется на свой Unicode-код &#XXXX;.

libchecker.a
------------

Если в проверяющей программе установлен флаг NEED_TGZ,
библиотека libchecker.a сохраняет в глобальных переменных
`dir_in_path' и `dir_out_path'. В переменной `dir_in_path'
находится путь к каталогу, в котором находится содержимое
рабочего каталога, создаваемого перед запуском тестируемой
программы (dir_in_path). В переменной `dir_out_path' находится
путь к каталогу в рабочем каталоге тестирования. Таким образом,
чтобы открыть входной каталог тестируемой программы можно
использовать вызов функции opendir(dir_in_path), а чтобы открыть
выходной каталог тестируемой программы - opendir(dir_out_path).

В библиотеку добавлены новые функции:
  checker_read_corr_double,
  checker_read_corr_long_long,
  checker_read_int,
  checker_read_in_long_double,
  checker_read_long_double,
  checker_read_long_long.

