Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Newer
Older
100644 404 lines (358 sloc) 19.429 kb
bcc1b9d @stephjang refactored telling_time_interactive, extracted analogClock to time.js, a...
stephjang authored
1 <!DOCTYPE html>
7ef3280 @stephjang used <code> tags for hour and minute numbers in hints
stephjang authored
2 <html data-require="math math-format graphie time interactive angles word-problems">
bcc1b9d @stephjang refactored telling_time_interactive, extracted analogClock to time.js, a...
stephjang authored
3 <head>
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
5 <title>Telling time 2</title>
6 <script src="../khan-exercise.js"></script>
bcc1b9d @stephjang refactored telling_time_interactive, extracted analogClock to time.js, a...
stephjang authored
7 </head>
8 <body>
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
9 <div class="exercise">
10 <div class="problems">
11 <div id="set-hands" data-weight="3">
12
13 <div class="vars">
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
14 <div data-ensure="!(HOUR === 1 && MINUTE === 0)">
15 <var id="HOUR">randRange(1, 12)</var>
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
16 <var id="MINUTE_INCREMENT">15</var>
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
17 <var id="MINUTE">randRange(0, (60 / MINUTE_INCREMENT) - 1) * MINUTE_INCREMENT</var>
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
18 </div>
19 <var id="MINUTE_IS_ZERO">MINUTE === 0</var>
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
20 <var id="NICE_MINUTE">MINUTE &gt; 5 ? MINUTE : "0" + MINUTE</var>
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
21 <var id="TIME">HOUR + ":" + NICE_MINUTE</var>
22 </div>
23
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
24 <p class="question">Set the clock to <var>TIME</var>.</p>
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
25
26 <div class="problem">
27
28 <div class="graphie" id="clock">
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
29 init({ range: [[-4, 4], [-4, 4]], scale: 45 });
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
30
31 var clockRadius = 3.75;
32 var minuteSnapPoints = 12;
33 var hourSnapPoints = 12 * 60 / MINUTE_INCREMENT;
34
35 var outerPointRadius = clockRadius * 1.01;
36 var minuteRadius = clockRadius * 0.6;
37 var hourRadius = clockRadius * 0.45;
38
39 minuteStartAngle = 90;
40 hourStartAngle = 60;
41
42 minuteSnapDegrees = 360 / minuteSnapPoints;
43 hourSnapDegrees = 360 / hourSnapPoints;
44
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
45 var clock = addAnalogClock({ radius: clockRadius, minuteTicks: 60 });
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
46 clock.draw();
47
48 addMouseLayer();
49
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
50 function movePartnerPoint(options) {
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
51
52 var x = options.x;
53 var y = options.y;
54 var point = options.point;
55 var outerPoint = options.outerPoint;
56 var isOuterPoint = options.isOuterPoint;
57
58 var ratio = outerPoint.constraints.fixedDistance.dist / point.constraints.fixedDistance.dist;
59
60 if (isOuterPoint) {
61 ratio = 1 / ratio;
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
62 point.setCoord([x * ratio , y * ratio]);
63 outerPoint.setCoord([x, y]);
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
64 } else {
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
65 point.setCoord([x, y]);
66 outerPoint.setCoord([x * ratio, y * ratio]);
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
67 }
68
69 point.updateLineEnds();
70 return true;
71 }
72
73 minutePoint = addMovablePoint({
74 coord: polar( minuteRadius, minuteStartAngle ),
75 constraints: {
76 fixedDistance: {
77 dist: minuteRadius,
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
78 point: [0, 0],
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
79 snapPoints: 12
80 }
81 },
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
82 onMove: function(x, y) {
83 return movePartnerPoint({ x: x, y: y, point: this, outerPoint: outerMinutePoint, isOuterPoint: false });
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
84 },
85 normalStyle: {
86 fill: ORANGE,
87 stroke: ORANGE
88 },
89 highlightStyle: {
90 fill: ORANGE,
91 stroke: ORANGE
92 }
93 });
94
95 outerMinutePoint = addMovablePoint({
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
96 coord: polar(outerPointRadius, minuteStartAngle),
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
97 constraints: {
98 fixedDistance: {
99 dist: outerPointRadius,
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
100 point: [0, 0],
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
101 snapPoints: 12
102 }
103 },
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
104 onMove: function(x, y) {
105 return movePartnerPoint({ x: x, y: y, point: minutePoint, outerPoint: this, isOuterPoint: true });
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
106 },
107 normalStyle: {
108 fill: ORANGE,
109 stroke: ORANGE
110 },
111 highlightStyle: {
112 fill: ORANGE,
113 stroke: ORANGE
114 }
115 });
116
117 hourPoint = addMovablePoint({
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
118 coord: polar(hourRadius, hourStartAngle),
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
119 constraints: {
120 fixedDistance: {
121 dist: hourRadius,
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
122 point: [0, 0],
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
123 snapPoints: hourSnapPoints
124 }
125 },
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
126 onMove: function(x, y) {
127 return movePartnerPoint({ x: x, y: y, point: this, outerPoint: outerHourPoint, isOuterPoint: false });
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
128 },
129 normalStyle: {
130 fill: BLUE,
131 stroke: BLUE
132 },
133 highlightStyle: {
134 fill: BLUE,
135 stroke: BLUE
136 }
137 });
138
139 outerHourPoint = addMovablePoint({
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
140 coord: polar(outerPointRadius, hourStartAngle),
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
141 constraints: {
142 fixedDistance: {
143 dist: outerPointRadius,
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
144 point: [0, 0],
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
145 snapPoints: hourSnapPoints
146 }
147 },
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
148 onMove: function(x, y) {
149 return movePartnerPoint({ x: x, y: y, point: hourPoint, outerPoint: this, isOuterPoint: true });
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
150 },
151 normalStyle: {
152 fill: BLUE,
153 stroke: BLUE
154 },
155 highlightStyle: {
156 fill: BLUE,
157 stroke: BLUE
158 }
159 });
160
161 minuteHand = addMovableLineSegment({
162 pointA: minutePoint,
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
163 coordZ: [0, 0],
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
164 fixed: true,
165 normalStyle: {
166 stroke: ORANGE,
167 "stroke-width": 10
168 }
169 });
170
171 hourHand = addMovableLineSegment({
172 pointA: hourPoint,
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
173 coordZ: [0, 0],
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
174 fixed: true,
175 normalStyle: {
176 stroke: BLUE,
177 "stroke-width": 10
178 }
179 });
180
181 centerPoint = addMovablePoint({
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
182 coord: [0, 0],
c905494 @beneater Revert to Raphael 1.5.2
beneater authored
183 constraints: {
184 fixed: true
185 },
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
186 normalStyle: {
187 fill: "#fff",
188 stroke: "#000",
189 "stroke-width": 2
190 }
191 });
192
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
193 correctMinuteAngle = timeToDegrees(MINUTE);
194 correctHourAngle = timeToDegrees(5 * (HOUR + MINUTE / 60));
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
195
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
196 correctMinuteAngle = roundToNearest(minuteSnapDegrees, correctMinuteAngle);
197 correctHourAngle = roundToNearest(hourSnapDegrees, correctHourAngle);
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
198 </div>
199 </div>
200
201 <div class="solution" data-type="custom">
202 <div class="instruction">
203 Drag the two hands so the clock reads <var>HOUR</var>:<var>NICE_MINUTE</var>.
204 </div>
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
205 <div class="guess">[minutePoint.coord, hourPoint.coord]</div>
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
206 <div class="validator-function">
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
207 var minuteAngle = cartToPolar(guess[0])[1];
208 var hourAngle = cartToPolar(guess[1])[1];
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
209
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
210 minuteAngle = roundToNearest(minuteSnapDegrees, minuteAngle);
211 hourAngle = roundToNearest(hourSnapDegrees, hourAngle);
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
212
213 // if hands have not been moved, return `""`
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
214 if (minuteAngle === minuteStartAngle &amp;&amp; hourAngle === hourStartAngle) {
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
215 return "";
216 }
1530e08 @beneater Fix telling_time_2 validator for case where hour and minute hand are in ...
beneater authored
217 if ((minuteAngle !== correctMinuteAngle) || (hourAngle !== correctHourAngle)) {
218 if ((minuteAngle === correctHourAngle) &amp;&amp; (hourAngle === correctMinuteAngle)) {
219 return "Remember the hour hand is the short hand and the minute hand is the long hand";
220 }
221 else if ((minuteAngle === correctMinuteAngle) &amp;&amp; (hourAngle !== correctHourAngle)
222 &amp;&amp; (hourAngle === roundToNearest(hourSnapDegrees, timeToDegrees(5 * HOUR)))) {
223 return "Remember the hour hand needs to move over the course of the hour";
224 }
225 return false;
f5655f3 @beneater Merge branch 'time' of https://github.com/Christi/khan-exercises
beneater authored
226 }
1530e08 @beneater Fix telling_time_2 validator for case where hour and minute hand are in ...
beneater authored
227 return true;
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
228 </div>
229 <div class="show-guess">
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
230 minutePoint.moveTo(guess[0][0], guess[0][1], true);
231 hourPoint.moveTo(guess[1][0], guess[1][1], true);
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
232 </div>
233 </div>
234
235 <div class="hints">
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
236 <p>
237 The <span class="hint_blue" style="font-weight: bold">hour</span> hand is the short
238 <span class="hint_blue" style="font-weight: bold">blue</span> bar and the
239 <span class="hint_orange" style="font-weight: bold">minute</span> hand is the long
240 <span class="hint_orange" style="font-weight: bold">orange</span> bar.
241 </p>
242
243 <p>
244 The number after the <code>\Large{:}</code> symbol represents the number of minutes past
245 the hour. So <code><var>TIME</var></code> represents <code><var>MINUTE</var></code>
246 minutes past hour <code><var>HOUR</var></code>.
247 </p>
248
249 <p>
250 First, let's set the <span class="hint_orange" style="font-weight: bold">minute</span> hand.
251 </p>
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
252
253 <div>
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
254 <p>
255 Each long tick mark is an increment of 5 minutes, because
256 60 minutes / 12 tick marks = 5 minutes per tick mark.
257 </p>
258 <p>
259 Since we are <code><var>MINUTE</var></code> minutes past the hour,
260 <span data-if="MINUTE_IS_ZERO">
261 the minute hand should be at the mark numbered
262 <code class="hint_orange">12</code>, which is the first tick mark on the clock
263 and represents <code>0</code> minutes past the hour
264 </span><span data-else>
265 and there are 5 minutes per tick mark, the minute hand should be at the mark numbered
266 <code class="hint_orange"><var>fraction(MINUTE, 5)</var> = <var>MINUTE/5</var></code>
267 </span>.
268 </p>
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
269 </div>
270
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
271 <p>
272 Next, let's set the <span class="hint_blue" style="font-weight: bold">hour</span> hand.
273 </p>
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
274
275 <div>
276 <p>The 12 long tick marks correspond to the hours in the day (assuming AM/PM time).</p>
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
277 <p>
278 If it is <code>0</code> minutes past the hour, the hour hand belongs directly on the
279 corresponding hour mark. But, over the hour, the hour hand must travel so it reaches
280 the next hour by the time the hour changes.
281 </p>
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
282 </div>
283
284 <div>
285 <p data-if="MINUTE_IS_ZERO">
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
286 Since it's <code>0</code> minutes past the hour, the hour hand should be right on the
287 <code class="hint_blue"><var>HOUR</var></code> hour mark.
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
288 </p>
f5655f3 @beneater Merge branch 'time' of https://github.com/Christi/khan-exercises
beneater authored
289 <div data-else data-unwrap>
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
290 <p>
291 Since it's <code><var>MINUTE</var></code> minutes past the hour, the hour hand will have
292 traveled <code class="hint_blue"><var>fraction(MINUTE, 60)</var> =
293 <var>fraction(MINUTE, 60, false, true)</var></code> of the way to the
294 <code><span data-if="HOUR + 1 ===13">1</span><span data-else><var>HOUR + 1</var></span>
295 </code> hour mark.
296 </p>
297 <p>
298 So the hour hand needs to be placed
299 <span data-if="MINUTE === 20">just before the second
300 </span><span data-else-if="MINUTE === 40">just past the third
301 </span><span data-else-if="MINUTE === 15">just past the first
302 </span><span data-else-if="MINUTE === 30">between the second and third
303 </span><span data-else>just before the fourth </span>
304 small tick mark past the <code class="hint_blue"><var>HOUR</var></code> hour mark.
305 </p>
f5655f3 @beneater Merge branch 'time' of https://github.com/Christi/khan-exercises
beneater authored
306 </div>
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
307 </div>
308
309 <div class="graphie" data-update="clock">
310 var minuteRadius = minutePoint.constraints.fixedDistance.dist;
311 var hourRadius = hourPoint.constraints.fixedDistance.dist;
312
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
313 var minuteCoord = polar(minuteRadius, correctMinuteAngle);
314 var hourCoord = polar(hourRadius, correctHourAngle);
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
315
316 var dotOpacity = 0.4;
317 var handOpacity = 0.3;
318
319 addMovableLineSegment({
320 coordA: minuteCoord,
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
321 coordZ: [0, 0],
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
322 fixed: true,
323 normalStyle: {
324 stroke: ORANGE,
325 "stroke-width": 10,
326 "stroke-dasharray": ".",
327 "stroke-linecap": "round",
328 "stroke-opacity": dotOpacity
329 },
330 });
331
332 addMovableLineSegment({
333 coordA: minuteCoord,
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
334 coordZ: [0, 0],
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
335 fixed: true,
336 normalStyle: {
337 stroke: ORANGE,
338 "stroke-width": 10,
339 "stroke-linecap": "round",
340 "stroke-opacity": handOpacity
341 },
342 });
343
344 addMovableLineSegment({
345 coordA: hourCoord,
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
346 coordZ: [0, 0],
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
347 fixed: true,
348 normalStyle: {
349 stroke: BLUE,
350 "stroke-width": 10,
351 "stroke-dasharray": ".",
352 "stroke-linecap": "round",
353 "stroke-opacity": dotOpacity
354 },
355 });
356
357 addMovableLineSegment({
358 coordA: hourCoord,
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
359 coordZ: [0, 0],
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
360 fixed: true,
361 normalStyle: {
362 stroke: BLUE,
363 "stroke-width": 10,
364 "stroke-linecap": "round",
365 "stroke-opacity": handOpacity
366 },
367 });
368
369 // for some reason this doesn't work, so for now, create another center point
370 // centerPoint.toFront();
371 addMovablePoint({
78735b6 @beneater fix #11230; fix #11347; fix #11388; fix #11396; fix #11399; fix #11427; ...
beneater authored
372 coord: [0, 0],
4e4cb9b @beneater lint: tabs->spaces and jQuery->$ for exercises
beneater authored
373 constraints: {
374 fixed: true
375 },
376 normalStyle: {
377 fill: "#fff",
378 stroke: "#000",
379 "stroke-dasharray": "",
380 "stroke-width": 2,
381 "stroke-opacity": 1
382 }
383 });
384 </div>
385
386 </div>
387 </div>
388
389 <div id="set-hands-20-minutes" data-type="set-hands" data-weight="2">
390 <div class="vars">
391 <var id="MINUTE_INCREMENT">20</var>
392 </div>
393 </div>
394
395 <div id="set-hands-30-minutes" data-type="set-hands" data-weight="2">
396 <div class="vars">
397 <var id="MINUTE_INCREMENT">30</var>
398 </div>
399 </div>
400 </div>
401 </div>
bcc1b9d @stephjang refactored telling_time_interactive, extracted analogClock to time.js, a...
stephjang authored
402 </body>
65eec09 @spicyj Content-Type meta tag for libxml2 compatibility
spicyj authored
403 </html>
Something went wrong with that request. Please try again.