- sub (/ct/:contest) { response ct_entry => contest->name, db->contest_entry($_{contest}) },
- sub (/log/:job) { response log_entry => "Job $_{job}", db->job_entry($_{job}) },
- sub (/pb/:problem + ?:contest~) {
- return NOT_FOUND if !contest && !problem->is_in_archive || contest && !db->contest_problems->find($_{contest}, $_{problem});
- forbid problem->is_private;
- response pb_entry => problem->name, db->problem_entry($_{problem}, $_{contest}, remote_user && remote_user->id);
+ sub (/ct/:contest) { response ct_entry => contest->name, db->contest_entry($_{contest}), 60 },
+ sub (/log/:job) {
+ forbid job->private;
+ response log_entry => "Job $_{job}", db->job_entry($_{job}), 10
+ },
+ sub (/pb/:problem + ?contest~) {
+ my (undef, undef, $contest) = @_;
+ $_{contest} = $contest;
+ return NOT_FOUND if contest && !db->contest_problems->find($_{contest}, $_{problem});
+ forbid problem->private && !contest;
+ if (contest) {
+ return redirect "/pb/$_{problem}" unless contest->is_running;
+ forbid !remote_user;
+ $privacy = 'private';
+ }
+ response pb_entry => problem->name, db->problem_entry($_{problem}, $_{contest}, remote_user && remote_user->id), $_{contest} ? 10 : ();
+ },
+ sub (/sol/:problem) {
+ forbid problem->private;
+ response sol => 'Solution of ' . problem->name, {solution => db->problem($_{problem})->solution};