| 7 |
- |
1 |
#!/usr/bin/perl
|
|
|
2 |
|
| 56 |
bgadell |
3 |
# Redirect error messages to a log of my choosing. (it's annoying to filter for errors in the shared env)
|
| 180 |
- |
4 |
#my $error_log_path = $ENV{SERVER_NAME} eq "volunteers.rollercon.com" ? "/home3/rollerco/logs/" : "/tmp/";
|
|
|
5 |
#close STDERR;
|
|
|
6 |
#open STDERR, '>>', $error_log_path.'vorc_error.log' or warn "Failed to open redirected logfile ($0): $!";
|
| 56 |
bgadell |
7 |
#warn "Redirecting errors to ${error_log_path}vorc_error.log";
|
|
|
8 |
|
| 7 |
- |
9 |
use strict;
|
| 8 |
- |
10 |
use cPanelUserConfig;
|
| 7 |
- |
11 |
use RollerCon;
|
| 50 |
bgadell |
12 |
use CGI qw/param header start_html url/;
|
| 7 |
- |
13 |
use CGI::Cookie;
|
|
|
14 |
our $h = HTML::Tiny->new( mode => 'html' );
|
| 138 |
- |
15 |
my $dbh = getRCDBH ();
|
| 7 |
- |
16 |
|
| 50 |
bgadell |
17 |
my $cookie_string = authenticate (1) || die;
|
| 7 |
- |
18 |
my ($EML, $PWD, $LVL) = split /&/, $cookie_string;
|
| 50 |
bgadell |
19 |
my $user = $ORCUSER;
|
| 65 |
bgadell |
20 |
my $activated = $ORCUSER->{access};
|
| 50 |
bgadell |
21 |
my $DEPTS = getDepartments ();
|
| 7 |
- |
22 |
|
| 138 |
- |
23 |
print header (-cookie=>CGI::Cookie->new(-name=>'RCAUTH',-value=>"$cookie_string",-expires=>"+30m"));
|
| 7 |
- |
24 |
|
|
|
25 |
#foreach (sort keys %ENV) {
|
|
|
26 |
# print "$_: $ENV{$_}\n<br>";
|
|
|
27 |
#}
|
|
|
28 |
|
|
|
29 |
use DateTime;
|
|
|
30 |
my $dt = DateTime->today;
|
|
|
31 |
$dt =~ s/T00\:00\:00$//;
|
|
|
32 |
|
| 50 |
bgadell |
33 |
my @announcements;
|
| 134 |
- |
34 |
if ($user->{department}->{EMT} >= RollerCon::USER and !$user->{emt_verified}) {
|
| 135 |
- |
35 |
push @announcements, $h->li ("NOTE: Anyone in the EMT department can see shifts, but you cannot sign up for them until your credentials have been verified. Start here: ".$h->a ({ href => "https://rollercon.com/help-wanted/emts/", target => "_blank" }, "https://rollercon.com/help-wanted/emts/"));
|
| 134 |
- |
36 |
}
|
|
|
37 |
|
| 180 |
- |
38 |
my $volhours = getSchedule ($user->{RCid}, 'all', 'hours');
|
|
|
39 |
if ($volhours) {
|
|
|
40 |
push @announcements, $h->li ("Volunteer Hours: You currently have credit for $volhours hour(s) of volunteer time.");
|
|
|
41 |
}
|
|
|
42 |
|
| 56 |
bgadell |
43 |
my ($announcement) = $dbh->selectrow_array ("select value from setting where setting.key = ?", undef, "ANNOUNCEMENT");
|
|
|
44 |
push @announcements, $h->li ($announcement) if $announcement;
|
| 50 |
bgadell |
45 |
|
| 194 |
- |
46 |
#if ($user->{department}->{OFF} > 0) {
|
|
|
47 |
# my @days = ("Thursday", "Friday", "Saturday");
|
|
|
48 |
# my @dayschecked;
|
|
|
49 |
# foreach my $day (@{$dbh->selectall_arrayref ("select dayofweek from v_shift where year(date) = year(now()) and RCid = ? and role = 'Officiating Huddle'", undef, $user->{RCid})}) {
|
|
|
50 |
# push @dayschecked, @{$day};
|
|
|
51 |
# }
|
|
|
52 |
#
|
|
|
53 |
# use tableViewer qw/inArray/;
|
|
|
54 |
# push @announcements, $h->li ("Did you attend the Officiating Huddle on:"),
|
|
|
55 |
# $h->form ({ action => "add_officiating_huddle_time.pl", target => "_blank" }, [
|
|
|
56 |
# map ({ inArray($_, \@dayschecked) ? $h->input ({ type => "checkbox", name => $_, checked => [] }).$_.$h->br : $h->input ({ type => "checkbox", name => $_ }).$_.$h->br } @days),
|
|
|
57 |
# $h->input ({ type => "submit", value => scalar @dayschecked ? "Update my hours." : "Give me credit!" })
|
|
|
58 |
# ]);
|
|
|
59 |
#}
|
| 56 |
bgadell |
60 |
|
| 112 |
- |
61 |
|
| 7 |
- |
62 |
my $schedule = getSchedule ($user->{RCid});
|
|
|
63 |
|
|
|
64 |
my @everyone;
|
|
|
65 |
my @printDEPTS = map { $DEPTS->{$_} } grep { $user->{department}->{$_} > 0 } grep { !/(ANN)|(OFF)/ } sort keys %{$user->{department}};
|
|
|
66 |
push @printDEPTS, "Officiating Lead" if $user->{department}->{"OFF"} > 1;
|
|
|
67 |
my $printDEPTS = join ", ", @printDEPTS;
|
|
|
68 |
push @everyone, $h->li ($h->a ({ href=>"/schedule/shifts.pl" }, "View and Sign Up for $printDEPTS Shifts")) if $printDEPTS;
|
|
|
69 |
push @everyone, $h->li ($h->a ({ href=>"/schedule/officiating_shifts.pl" }, "View and Sign Up for Officiating Shifts")) if $user->{department}->{OFF} > 0;
|
| 183 |
- |
70 |
|
| 194 |
- |
71 |
my @OHD_YEARS;
|
| 183 |
- |
72 |
if ($user->{department}->{OFF} > 0) {
|
| 194 |
- |
73 |
foreach my $officiating_year (@{$dbh->selectall_arrayref ("select distinct year(date) as year from v_shift_officiating where RCid = ? and gtype in ('challenge', 'full length', 'selected', 'challenge-rs1', 'challenge-rs2') order by year desc", undef, $user->{RCid})}) {
|
|
|
74 |
push @OHD_YEARS, $h->li ($h->a ({ href=>"/schedule/ohd.pl?year=".$officiating_year->[0] }, $officiating_year->[0]));
|
|
|
75 |
}
|
| 183 |
- |
76 |
}
|
| 194 |
- |
77 |
push @everyone, $h->li (["Export your officiating game assignments in OHD Format (CSV File):", $h->ul ([@OHD_YEARS])]) unless !scalar @OHD_YEARS;
|
| 183 |
- |
78 |
|
| 29 |
- |
79 |
push @everyone, $h->li ($h->a ({ href=>"/schedule/announcer_shifts.pl" }, "View and Sign Up to Announce Games")) if $user->{department}->{ANN} > 0;
|
| 56 |
bgadell |
80 |
push @everyone, $h->li ($h->a ({ href=>"/schedule/games.pl" }, "View Games"));
|
|
|
81 |
push @everyone, $h->li ($h->a ({ href=>"/schedule/personal_time.pl" }, "Block Personal Time"));
|
| 193 |
- |
82 |
push @everyone, $h->li ($h->a ({ href=>"/schedule/missing_hours.pl" }, "Request Missing Volunteer Time"));
|
| 56 |
bgadell |
83 |
push @everyone, $h->li ($h->a ({ href=>"/schedule/view_user.pl?submit=Edit&RCid=$user->{RCid}" }, "Edit your profile"));
|
| 7 |
- |
84 |
|
| 35 |
- |
85 |
my @mvppass;
|
| 105 |
bgadell |
86 |
my $reviews;
|
|
|
87 |
if ($user->{MVPid} or $user->{department}->{MVP} >= RollerCon::USER or $user->{department}->{COA} >= RollerCon::USER or $LVL >= RollerCon::SYSADMIN) {
|
|
|
88 |
push @mvppass, $h->li ($h->a ({ href=>"/schedule/classes.pl" }, "View and Sign Up for MVP Classes"));
|
| 222 |
- |
89 |
push @mvppass, $h->li ($h->a ({ href=>"/schedule/current_coaches.pl" }, "View the list of current MVP Coaches"));
|
| 105 |
bgadell |
90 |
|
|
|
91 |
# Get a list of classes attended to ask for reviews...
|
| 112 |
- |
92 |
my (@reviews_done, @reviews_tbd);
|
| 208 |
- |
93 |
# foreach my $class (@{$dbh->selectall_arrayref ("select id, date, time, name, coach, count(*) as answers from v_class_signup_new left join v_survey_answer on id = classid and v_class_signup_new.RCid = v_survey_answer.RCid where v_class_signup_new.RCid = ? and year(date) = year(now()) and concat_ws(' ', date, end_time) < date_sub(now(), interval 2 hour) group by id order by date, start_time", undef, $user->{RCid})}) {
|
|
|
94 |
foreach my $class (@{$dbh->selectall_arrayref ("select id, date, time, name, null, count(*) as answers from v_class_signup_new left join v_survey_answer on id = classid and v_class_signup_new.RCid = v_survey_answer.RCid where v_class_signup_new.RCid = ? and year(date) = year(now()) and concat_ws(' ', date, end_time) < date_sub(now(), interval 2 hour) group by id order by date, start_time", undef, $user->{RCid})}) {
|
| 105 |
bgadell |
95 |
my ($id, $date, $time, $name, $coach, $answers) = @{$class};
|
|
|
96 |
next unless $id;
|
|
|
97 |
$time = convertTime $time;
|
|
|
98 |
|
|
|
99 |
if ($answers > 1) {
|
|
|
100 |
push @reviews_done, $h->li ("$date $time: ".$h->a ({ href=>"/schedule/survey.pl?classid=$id" }, "$name [".getUserDerbyName ($coach)."]"));
|
|
|
101 |
} else {
|
|
|
102 |
push @reviews_tbd, $h->li ("$date $time: ".$h->a ({ href=>"/schedule/survey.pl?classid=$id" }, "$name [".getUserDerbyName ($coach)."]"));
|
| 112 |
- |
103 |
}
|
| 105 |
bgadell |
104 |
}
|
| 112 |
- |
105 |
$reviews = $h->li (["Please submit feedback:", $h->ul ([@reviews_tbd])]) unless !scalar @reviews_tbd;
|
|
|
106 |
$reviews .= $h->li (["View the feedback you've submitted:", $h->ul ([@reviews_done])]) unless !scalar @reviews_done;
|
| 35 |
- |
107 |
}
|
| 7 |
- |
108 |
|
|
|
109 |
my @leads = ();
|
|
|
110 |
if ($LVL > 1) {
|
| 56 |
bgadell |
111 |
push @leads, $h->li ($h->a ({ href=>"/schedule/users.pl" }, "View Users in your Department(s)."));
|
| 7 |
- |
112 |
push @leads, $h->li ($h->a ({ href=>"/schedule/password_reset.pl" }, "Reset a Password."));
|
|
|
113 |
|
|
|
114 |
# Officiating Leads:
|
|
|
115 |
if ($user->{department}->{OFF} > 1) {
|
|
|
116 |
unshift @leads, $h->li ($h->a ({ href=>"/schedule/scores.pl" }, "View / Update Game Scores"));
|
|
|
117 |
push @leads, $h->li (["What's happening right now on...", $h->ul ([
|
|
|
118 |
$h->li ($h->a ({ href=>"right_now.pl?t=C1" }, "Track C1")),
|
|
|
119 |
$h->li ($h->a ({ href=>"right_now.pl?t=C2" }, "Track C2")),
|
|
|
120 |
$h->li ($h->a ({ href=>"right_now.pl?t=C3" }, "Track C3")),
|
| 141 |
- |
121 |
$h->li ($h->a ({ href=>"right_now.pl?t=C5" }, "Track C5")),
|
|
|
122 |
$h->li ($h->a ({ href=>"right_now.pl?t=BT" }, "Banked Track")),
|
| 7 |
- |
123 |
])]);
|
|
|
124 |
}
|
|
|
125 |
}
|
|
|
126 |
|
|
|
127 |
my @managers;
|
|
|
128 |
if ($LVL >= 3) {
|
|
|
129 |
my $manager_departments = join " or ", map { "department like '%$_-0%'" } grep { $user->{department}->{$_} > 2 } keys %{$user->{department}};
|
| 8 |
- |
130 |
if ($manager_departments) {
|
|
|
131 |
my ($count) = $dbh->selectrow_array ("select count(*) from official where $manager_departments");
|
|
|
132 |
my $counttxt = $count == 1 ? "is 1 user" : "are $count users";
|
| 56 |
bgadell |
133 |
push @managers, $h->li ($h->a ({ href=>"users.pl?autoload=1&RCid=true&derby_name=true&email=true&real_name=true&access=true&department=true&added=true&filter-RCid=&filter-derby_name=&filter-email=&filter-real_name=&filter-access=0&filter-department=&filter-added=&sortby=derby_name&limit=25&page=1" }, "There $counttxt waiting to be activated")) if $count;
|
| 8 |
- |
134 |
}
|
|
|
135 |
push @managers, $h->li ($h->a ({ href=>"/schedule/log.pl" }, "Activity Log"));
|
| 29 |
- |
136 |
push @managers, $h->li ($h->a ({ href=>"/schedule/volhours.pl" }, "View Volunteer Hours by Department"));
|
| 39 |
- |
137 |
|
|
|
138 |
foreach (grep { $user->{department}->{$_} > 2 } keys %{$user->{department}}) {
|
|
|
139 |
push @managers, $h->li ($h->a ({ href=>"/schedule/shifts.pl?autoload=1&dept=true&role=true&dayofweek=true&location=true&time=true¬e=true&derby_name=true&filter-dept=$_&sortby=dayofweek&limit=All&page=1" }, "$DEPTS->{$_} Staff Schedule"));
|
|
|
140 |
}
|
|
|
141 |
|
| 46 |
- |
142 |
if ($user->{department}->{VCI} > 2 or $user->{department}->{MVP} > 2 or $LVL > 4) {
|
| 56 |
bgadell |
143 |
push @managers, $h->li ($h->a ({ href=>"/schedule/classes.pl" }, "View MVP Classes"));
|
| 46 |
- |
144 |
push @managers, $h->li ($h->a ({ href=>"/schedule/mvp_class_report.pl", target=>"_new" }, "Daily MVP Class Report (for print)"));
|
| 112 |
- |
145 |
push @managers, $h->li ($h->a ({ href=>"/schedule/mvp_class_report_without_skaters.pl", target=>"_new" }, "Daily MVP Class Report without Skaters (for print)"));
|
| 46 |
- |
146 |
push @managers, $h->li ($h->a ({ href=>"/schedule/daily_print.pl", target=>"_new" }, "Daily Officiating Report (for print)"));
|
|
|
147 |
push @managers, $h->li ($h->a ({ href=>"/schedule/daily_print_announcers.pl", target=>"_new" }, "Daily Announcers Report (for print)"));
|
|
|
148 |
push @managers, $h->li ($h->a ({ href=>"/schedule/print_dept_by_day.pl", target=>"_new" }, "BETA: Daily Shift Report (for print)"));
|
|
|
149 |
}
|
|
|
150 |
|
| 220 |
- |
151 |
push @managers, $h->li ($h->a ({ href=>"/schedule/leadership.pl" }, "View Leadership Team"));
|
|
|
152 |
|
| 7 |
- |
153 |
# Shift Report: select dayofweek, count(RCid) as filled_shifts, count(*) - count(RCid) as open_shifts, count(*) as total_shifts from v_shift group by date order by date
|
|
|
154 |
}
|
|
|
155 |
|
| 90 |
bgadell |
156 |
my (@sysadmins, @mvpcounts);
|
| 16 |
- |
157 |
if ($LVL >= 5) {
|
|
|
158 |
push @sysadmins, $h->li ($h->a ({ href=>"/schedule/bulk_upload.pl" }, "Upload a CSV of Department Shifts"));
|
| 60 |
bgadell |
159 |
push @sysadmins, $h->li ($h->a ({ href=>"/schedule/shifts.pl" }, "Update department shift schedule"));
|
| 58 |
bgadell |
160 |
push @sysadmins, $h->li ($h->a ({ href=>"/schedule/tickets.pl" }, "Manage MVP Ticket Matches"));
|
| 56 |
bgadell |
161 |
push @sysadmins, $h->li ($h->a ({ href=>"/schedule/classes.pl" }, "Manage MVP Classes"));
|
|
|
162 |
push @sysadmins, $h->li ($h->a ({ href=>"/schedule/games.pl" }, "Manage Games"));
|
|
|
163 |
push @sysadmins, $h->li ($h->a ({ href=>"/schedule/departments.pl" }, "Manage Department Settings"));
|
|
|
164 |
push @sysadmins, $h->li ($h->a ({ href=>"/schedule/settings.pl" }, "System Settings"));
|
| 50 |
bgadell |
165 |
push @sysadmins, $h->li ($h->a ({ href=>"/schedule/volhours_report.pl?limit=All" }, "YEAR END VOLUNTEER HOURS REPORT"));
|
| 214 |
- |
166 |
# push @sysadmins, $h->li ($h->a ({ href=>"/schedule/shifts.pl?excel=0&autoload=1&dept=true&date=true&dayofweek=true&time=true&doubletime=true&volhours=true&role=true&location=true¬e=true&RCid=true&derby_name=true&filter-dept=COA&filter-date=&filter-dayofweek=&filter-time=&filter-doubletime=&filter-volhours=&filter-role=&filter-location=&filter-note=&filter-RCid=&filter-derby_name=&year=2024&sortby=dayofweek&limit=25&page=1" }, "COACH HOURS REPORT"));
|
|
|
167 |
push @sysadmins, $h->li ($h->a ({ href=>"/schedule/coach_hours.pl" }, "Coach Hours"));
|
|
|
168 |
push @sysadmins, $h->li ($h->a ({ href=>"/schedule/coach_pay.pl" }, "Coach Pay Report"));
|
| 90 |
bgadell |
169 |
|
|
|
170 |
|
| 35 |
- |
171 |
|
| 90 |
bgadell |
172 |
my ($unclaimed_tix) = $dbh->selectrow_array ("select count(*) from v_ticket where isnull(RCid) = 1");
|
|
|
173 |
my ($mvpcount) = $dbh->selectrow_array ("select count(*) from v_ticket where isnull(RCid) = 0");
|
| 62 |
bgadell |
174 |
$mvpcount = 1 unless $mvpcount;
|
| 90 |
bgadell |
175 |
my $class_limit = getSetting ("MAX_CLASS_SIGNUP");
|
| 35 |
- |
176 |
|
| 90 |
bgadell |
177 |
push @mvpcounts, $h->li ($mvpcount." MVP Tickets have been matched in VORC. ($unclaimed_tix remain unmatched.)");
|
|
|
178 |
push @mvpcounts, $h->li ("They could (in theory) sign up for ".$mvpcount*$class_limit." class spots.");
|
| 35 |
- |
179 |
|
| 208 |
- |
180 |
my ($signupcount, $total_class_count, $available_count) = $dbh->selectrow_array ("select sum(count), sum(capacity), sum(available) from v_class_new where year(date) = year(now())");
|
| 90 |
bgadell |
181 |
|
| 116 |
- |
182 |
$total_class_count //= 0;
|
| 90 |
bgadell |
183 |
push @mvpcounts, $h->li ($total_class_count." Total Class Spots");
|
| 116 |
- |
184 |
push @mvpcounts, $h->li ($signupcount." Filled Class Spots (".sprintf("%.2f", ($signupcount / $total_class_count) * 100)."\%)") unless !$total_class_count;
|
|
|
185 |
push @mvpcounts, $h->li ($available_count." Available Class Spots (".sprintf("%.2f", ($available_count / $total_class_count) * 100)."\%)") unless !$total_class_count;
|
| 90 |
bgadell |
186 |
|
| 138 |
- |
187 |
my ($active) = $dbh->selectrow_array ("select count(*) from official where last_active > (now() - interval 30 minute)");
|
| 35 |
- |
188 |
push @sysadmins, $h->li ("There seem to be about $active user session(s) right now.");
|
| 16 |
- |
189 |
}
|
|
|
190 |
|
| 7 |
- |
191 |
my @activity_log;
|
|
|
192 |
my $alog = $dbh->prepare("select timestamp, event from v_log where RCid = ? limit 10");
|
|
|
193 |
$alog->execute($user->{RCid});
|
|
|
194 |
while (my @logs = $alog->fetchrow_array) {
|
|
|
195 |
my ($d, $t) = split /\s+/, $logs[0];
|
|
|
196 |
push @activity_log, $h->li ({ class=>"shaded" }, join " ", @logs);
|
|
|
197 |
}
|
|
|
198 |
|
|
|
199 |
my @reference;
|
| 8 |
- |
200 |
push @reference, $h->li ($h->a ({ href=>"/info.html" }, "Information about using this tool"));
|
| 7 |
- |
201 |
push @reference, $h->li ($h->a ({ href=>"http://rollercon.com/help-wanted/officiating/" }, "RollerCon Officiating Details"));
|
|
|
202 |
|
|
|
203 |
printRCHeader("Home");
|
|
|
204 |
print $h->close ("table");
|
|
|
205 |
|
| 50 |
bgadell |
206 |
print $h->form ({ name => "Req", action => url });
|
| 7 |
- |
207 |
|
| 50 |
bgadell |
208 |
print $h->div ({ class=>"index" }, [$h->p ({ class=>"heading" }, "Announcement:"), $h->ul ([ @announcements ]) ]) if (scalar @announcements);
|
|
|
209 |
|
| 35 |
- |
210 |
print $h->div ({ class=>"index" }, [$h->p ({ class=>"heading" }, "Note:"), "<b>Your account is being reviewed.</b>", $h->br, "You won't have access to view or sign-up for things until you've been approved / added to a department.", $h->br, "Please watch your email for notifications." ]) unless $activated;
|
|
|
211 |
|
| 7 |
- |
212 |
print $h->div ({ class=>"index" }, [$h->p ({ class=>"heading" }, "Your up-coming schedule (as of $dt):"), $schedule, $h->h5 ("[".$h->a ({ href=>"export_ics.pl?RCid=$user->{RCid}" }, "use this link for iCal")."]") ]) if $schedule;
|
|
|
213 |
|
| 105 |
bgadell |
214 |
print $h->div ({ class=>"index" }, [$h->p ({ class=>"heading" }, "MVP Classes:"), $h->ul ([ @mvppass, $reviews ]) ]) if (scalar @mvppass);
|
| 35 |
- |
215 |
|
| 7 |
- |
216 |
print $h->div ({ class=>"index" }, [$h->p ({ class=>"heading" }, "Things you can do:"), $h->ul ([ @everyone ]) ]);
|
|
|
217 |
|
|
|
218 |
print $h->div ({ class=>"index" }, [$h->p ({ class=>"heading" }, "Things you can do as a Lead:"), $h->ul ([ @leads ]) ]) if ($LVL > 1);
|
|
|
219 |
|
| 16 |
- |
220 |
print $h->div ({ class=>"index" }, [$h->p ({ class=>"heading" }, "Things you can do as a Manager:"), $h->ul ([ @managers ]) ]) if ($LVL > 2);
|
| 7 |
- |
221 |
|
| 16 |
- |
222 |
print $h->div ({ class=>"index" }, [$h->p ({ class=>"heading" }, "Things you can do as a SysAdmin:"), $h->ul ([ @sysadmins ]) ]) if ($LVL >= 5);
|
|
|
223 |
|
| 90 |
bgadell |
224 |
print $h->div ({ class=>"index" }, [$h->p ({ class=>"heading" }, "MVP Class and Ticket Status:"), $h->ul ([ @mvpcounts ]) ]) if (scalar @mvpcounts);
|
|
|
225 |
|
| 8 |
- |
226 |
print $h->div ({ class=>"index" }, [$h->p ({ class=>"heading" }, "Your Latest Activity:"), $h->ul ([ @activity_log ]), $h->h5 ($h->a ({ href=>"log.pl?excel=0&autoload=1&eventid=true×tamp=true&event=true&RCid=true&derby_name=true&filter-timestamp=&filter-event=&filter-RCid=".$user->{RCid}."&filter-derby_name=&sortby=eventid&limit=25&page=1" }, "[Your entire log history]")) ]);
|
| 7 |
- |
227 |
|
|
|
228 |
print $h->div ({ class=>"index" }, [$h->p ({ class=>"heading" }, "Reference:"), $h->ul ([ @reference ]) ]);
|
|
|
229 |
|
|
|
230 |
print $h->close ("body"), $h->close ("html");
|
|
|
231 |
|
| 50 |
bgadell |
232 |
|