UNPKG

27.1 kBHTMLView Raw
1<!DOCTYPE html>
2
3<html>
4<head>
5 <title>denodify.js</title>
6 <meta http-equiv="content-type" content="text/html; charset=UTF-8">
7 <meta name="viewport" content="width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">
8 <link rel="stylesheet" media="all" href="docco.css" />
9</head>
10<body>
11 <div id="container">
12 <div id="background"></div>
13
14 <ul class="sections">
15
16 <li id="title">
17 <div class="annotation">
18 <h1>denodify.js</h1>
19 </div>
20 </li>
21
22
23
24 <li id="section-1">
25 <div class="annotation">
26
27 <div class="pilwrap ">
28 <a class="pilcrow" href="#section-1">&#182;</a>
29 </div>
30
31 </div>
32
33 <div class="content"><div class='highlight'><pre>(<span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(global)</span> {</span>
34
35 <span class="hljs-keyword">if</span> (global.denodify) <span class="hljs-keyword">return</span>;
36
37 <span class="hljs-keyword">var</span> m = {};
38 <span class="hljs-keyword">var</span> f = {};
39
40 <span class="hljs-keyword">var</span> process = {
41 platform: <span class="hljs-string">'browser'</span>
42 };</pre></div></div>
43
44 </li>
45
46
47 <li id="section-2">
48 <div class="annotation">
49
50 <div class="pilwrap ">
51 <a class="pilcrow" href="#section-2">&#182;</a>
52 </div>
53 <h3 id="api">API</h3>
54
55 </div>
56
57 <div class="content"><div class='highlight'><pre> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">require</span><span class="hljs-params">(parent, moduleid)</span> {</span>
58 <span class="hljs-keyword">if</span> (moduleid.indexOf(<span class="hljs-string">'/'</span>) === -<span class="hljs-number">1</span>) parent = <span class="hljs-string">''</span>;
59 <span class="hljs-keyword">else</span> {
60 <span class="hljs-keyword">if</span> (Path.isAbsolute(moduleid)) parent = <span class="hljs-string">'/'</span>;
61 <span class="hljs-keyword">else</span> moduleid = Path.join(parent, moduleid);
62 <span class="hljs-keyword">if</span> (!Path.extname(moduleid)) moduleid += <span class="hljs-string">'.js'</span>;
63 }
64 <span class="hljs-keyword">var</span> module = m[moduleid];
65 <span class="hljs-keyword">if</span> (module) <span class="hljs-keyword">return</span> module.exports;
66 <span class="hljs-keyword">var</span> func = f[moduleid];
67 <span class="hljs-keyword">if</span> (!func)
68 <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Error</span>(<span class="hljs-string">'Couldn\'t resolve module with resolved path of '</span> +
69 Path.join(Path.dirname(parent), moduleid));
70 func(<span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(__filename)</span> {</span> <span class="hljs-keyword">return</span> <span class="hljs-built_in">require</span>(Path.dirname(moduleid), __filename); },
71 module = m[moduleid] = {},
72 module.exports = {},
73 moduleid,
74 Path.dirname(moduleid),
75 process);
76 <span class="hljs-keyword">return</span> module.exports;
77 }</pre></div></div>
78
79 </li>
80
81
82 <li id="section-3">
83 <div class="annotation">
84
85 <div class="pilwrap ">
86 <a class="pilcrow" href="#section-3">&#182;</a>
87 </div>
88 <h3 id="denodify">denodify</h3>
89<p>Use this to denodify javascript. Wrap your source code with</p>
90
91 </div>
92
93 </li>
94
95
96 <li id="section-4">
97 <div class="annotation">
98
99 <div class="pilwrap ">
100 <a class="pilcrow" href="#section-4">&#182;</a>
101 </div>
102 <pre><code>denodify(<span class="hljs-string">'moduleid'</span>,<span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(require, module, exports, __filename, __dirname, process)</span> {</span>
103 [your source code]
104});
105</code></pre>
106 </div>
107
108 <div class="content"><div class='highlight'><pre> global.denodify = <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-params">(__filename, func)</span> {</span>
109 f[__filename] = func;
110 };</pre></div></div>
111
112 </li>
113
114
115 <li id="section-5">
116 <div class="annotation">
117
118 <div class="pilwrap ">
119 <a class="pilcrow" href="#section-5">&#182;</a>
120 </div>
121 <h3 id="require">require</h3>
122<p>Use this function to pull in or kickstart any defined nodejs modules from
123outside nodejs modules. </p>
124
125 </div>
126
127 <div class="content"><div class='highlight'><pre> global.denodify.require = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(__filename)</span> {</span>
128 <span class="hljs-built_in">require</span>(<span class="hljs-string">''</span>, __filename);
129 };</pre></div></div>
130
131 </li>
132
133
134 <li id="section-6">
135 <div class="annotation">
136
137 <div class="pilwrap ">
138 <a class="pilcrow" href="#section-6">&#182;</a>
139 </div>
140 <h3 id="debug">debug</h3>
141
142 </div>
143
144 <div class="content"><div class='highlight'><pre> global.denodify.debug = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(__filename)</span> {</span>
145 console.log(<span class="hljs-string">'modules\n:'</span>, m);
146 console.log(<span class="hljs-string">'funcs\n:'</span>, f);
147 };</pre></div></div>
148
149 </li>
150
151
152 <li id="section-7">
153 <div class="annotation">
154
155 <div class="pilwrap ">
156 <a class="pilcrow" href="#section-7">&#182;</a>
157 </div>
158 <p>End of API ———————————————————————-</p>
159
160 </div>
161
162 </li>
163
164
165 <li id="section-8">
166 <div class="annotation">
167
168 <div class="pilwrap ">
169 <a class="pilcrow" href="#section-8">&#182;</a>
170 </div>
171 <p>The rest is <code>path</code>, copied from path-browserify</p>
172
173 </div>
174
175 <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> path = (<span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">()</span> {</span>
176 <span class="hljs-keyword">var</span> exports = {};
177 <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">normalizeArray</span><span class="hljs-params">(parts, allowAboveRoot)</span> {</span></pre></div></div>
178
179 </li>
180
181
182 <li id="section-9">
183 <div class="annotation">
184
185 <div class="pilwrap ">
186 <a class="pilcrow" href="#section-9">&#182;</a>
187 </div>
188 <p>if the path tries to go above the root, <code>up</code> ends up &gt; 0</p>
189
190 </div>
191
192 <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> up = <span class="hljs-number">0</span>;
193 <span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i = parts.length - <span class="hljs-number">1</span>; i &gt;= <span class="hljs-number">0</span>; i--) {
194 <span class="hljs-keyword">var</span> last = parts[i];
195 <span class="hljs-keyword">if</span> (last === <span class="hljs-string">'.'</span>) {
196 parts.splice(i, <span class="hljs-number">1</span>);
197 } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (last === <span class="hljs-string">'..'</span>) {
198 parts.splice(i, <span class="hljs-number">1</span>);
199 up++;
200 } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (up) {
201 parts.splice(i, <span class="hljs-number">1</span>);
202 up--;
203 }
204 }</pre></div></div>
205
206 </li>
207
208
209 <li id="section-10">
210 <div class="annotation">
211
212 <div class="pilwrap ">
213 <a class="pilcrow" href="#section-10">&#182;</a>
214 </div>
215 <p>if the path is allowed to go above the root, restore leading ..s</p>
216
217 </div>
218
219 <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (allowAboveRoot) {
220 <span class="hljs-keyword">for</span> (; up--; up) {
221 parts.unshift(<span class="hljs-string">'..'</span>);
222 }
223 }
224
225 <span class="hljs-keyword">return</span> parts;
226 }</pre></div></div>
227
228 </li>
229
230
231 <li id="section-11">
232 <div class="annotation">
233
234 <div class="pilwrap ">
235 <a class="pilcrow" href="#section-11">&#182;</a>
236 </div>
237 <p>Split a filename into [root, dir, basename, ext], unix version
238‘root’ is just a slash, or nothing.</p>
239
240 </div>
241
242 <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> splitPathRe =
243 <span class="hljs-regexp">/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/</span>;
244 <span class="hljs-keyword">var</span> splitPath = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(filename)</span> {</span>
245 <span class="hljs-keyword">return</span> splitPathRe.exec(filename).slice(<span class="hljs-number">1</span>);
246 };</pre></div></div>
247
248 </li>
249
250
251 <li id="section-12">
252 <div class="annotation">
253
254 <div class="pilwrap ">
255 <a class="pilcrow" href="#section-12">&#182;</a>
256 </div>
257 <p>path.resolve([from …], to)
258posix version</p>
259
260 </div>
261
262 <div class="content"><div class='highlight'><pre> exports.resolve = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">()</span> {</span>
263 <span class="hljs-keyword">var</span> resolvedPath = <span class="hljs-string">''</span>,
264 resolvedAbsolute = <span class="hljs-literal">false</span>;
265
266 <span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i = <span class="hljs-built_in">arguments</span>.length - <span class="hljs-number">1</span>; i &gt;= -<span class="hljs-number">1</span> &amp;&amp; !resolvedAbsolute; i--) {
267 <span class="hljs-keyword">var</span> path = (i &gt;= <span class="hljs-number">0</span>) ? <span class="hljs-built_in">arguments</span>[i] : process.cwd();</pre></div></div>
268
269 </li>
270
271
272 <li id="section-13">
273 <div class="annotation">
274
275 <div class="pilwrap ">
276 <a class="pilcrow" href="#section-13">&#182;</a>
277 </div>
278 <p>Skip empty and invalid entries</p>
279
280 </div>
281
282 <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> path !== <span class="hljs-string">'string'</span>) {
283 <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">TypeError</span>(<span class="hljs-string">'Arguments to path.resolve must be strings'</span>);
284 } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (!path) {
285 <span class="hljs-keyword">continue</span>;
286 }
287
288 resolvedPath = path + <span class="hljs-string">'/'</span> + resolvedPath;
289 resolvedAbsolute = path.charAt(<span class="hljs-number">0</span>) === <span class="hljs-string">'/'</span>;
290 }</pre></div></div>
291
292 </li>
293
294
295 <li id="section-14">
296 <div class="annotation">
297
298 <div class="pilwrap ">
299 <a class="pilcrow" href="#section-14">&#182;</a>
300 </div>
301 <p>At this point the path should be resolved to a full absolute path, but
302handle relative paths to be safe (might happen when process.cwd() fails)</p>
303
304 </div>
305
306 </li>
307
308
309 <li id="section-15">
310 <div class="annotation">
311
312 <div class="pilwrap ">
313 <a class="pilcrow" href="#section-15">&#182;</a>
314 </div>
315 <p>Normalize the path</p>
316
317 </div>
318
319 <div class="content"><div class='highlight'><pre> resolvedPath = normalizeArray(filter(resolvedPath.split(<span class="hljs-string">'/'</span>), <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(p)</span> {</span>
320 <span class="hljs-keyword">return</span> !!p;
321 }), !resolvedAbsolute).join(<span class="hljs-string">'/'</span>);
322
323 <span class="hljs-keyword">return</span> ((resolvedAbsolute ? <span class="hljs-string">'/'</span> : <span class="hljs-string">''</span>) + resolvedPath) || <span class="hljs-string">'.'</span>;
324 };</pre></div></div>
325
326 </li>
327
328
329 <li id="section-16">
330 <div class="annotation">
331
332 <div class="pilwrap ">
333 <a class="pilcrow" href="#section-16">&#182;</a>
334 </div>
335 <p>path.normalize(path)
336posix version</p>
337
338 </div>
339
340 <div class="content"><div class='highlight'><pre> exports.normalize = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(path)</span> {</span>
341 <span class="hljs-keyword">var</span> isAbsolute = exports.isAbsolute(path),
342 trailingSlash = substr(path, -<span class="hljs-number">1</span>) === <span class="hljs-string">'/'</span>;</pre></div></div>
343
344 </li>
345
346
347 <li id="section-17">
348 <div class="annotation">
349
350 <div class="pilwrap ">
351 <a class="pilcrow" href="#section-17">&#182;</a>
352 </div>
353 <p>Normalize the path</p>
354
355 </div>
356
357 <div class="content"><div class='highlight'><pre> path = normalizeArray(filter(path.split(<span class="hljs-string">'/'</span>), <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(p)</span> {</span>
358 <span class="hljs-keyword">return</span> !!p;
359 }), !isAbsolute).join(<span class="hljs-string">'/'</span>);
360
361 <span class="hljs-keyword">if</span> (!path &amp;&amp; !isAbsolute) {
362 path = <span class="hljs-string">'.'</span>;
363 }
364 <span class="hljs-keyword">if</span> (path &amp;&amp; trailingSlash) {
365 path += <span class="hljs-string">'/'</span>;
366 }
367
368 <span class="hljs-keyword">return</span> (isAbsolute ? <span class="hljs-string">'/'</span> : <span class="hljs-string">''</span>) + path;
369 };</pre></div></div>
370
371 </li>
372
373
374 <li id="section-18">
375 <div class="annotation">
376
377 <div class="pilwrap ">
378 <a class="pilcrow" href="#section-18">&#182;</a>
379 </div>
380 <p>posix version</p>
381
382 </div>
383
384 <div class="content"><div class='highlight'><pre> exports.isAbsolute = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(path)</span> {</span>
385 <span class="hljs-keyword">return</span> path.charAt(<span class="hljs-number">0</span>) === <span class="hljs-string">'/'</span>;
386 };</pre></div></div>
387
388 </li>
389
390
391 <li id="section-19">
392 <div class="annotation">
393
394 <div class="pilwrap ">
395 <a class="pilcrow" href="#section-19">&#182;</a>
396 </div>
397 <p>posix version</p>
398
399 </div>
400
401 <div class="content"><div class='highlight'><pre> exports.join = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">()</span> {</span>
402 <span class="hljs-keyword">var</span> paths = <span class="hljs-built_in">Array</span>.prototype.slice.call(<span class="hljs-built_in">arguments</span>, <span class="hljs-number">0</span>);
403 <span class="hljs-keyword">return</span> exports.normalize(filter(paths, <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(p, index)</span> {</span>
404 <span class="hljs-keyword">if</span> (<span class="hljs-keyword">typeof</span> p !== <span class="hljs-string">'string'</span>) {
405 <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">TypeError</span>(<span class="hljs-string">'Arguments to path.join must be strings'</span>);
406 }
407 <span class="hljs-keyword">return</span> p;
408 }).join(<span class="hljs-string">'/'</span>));
409 };</pre></div></div>
410
411 </li>
412
413
414 <li id="section-20">
415 <div class="annotation">
416
417 <div class="pilwrap ">
418 <a class="pilcrow" href="#section-20">&#182;</a>
419 </div>
420 <p>path.relative(from, to)
421posix version</p>
422
423 </div>
424
425 <div class="content"><div class='highlight'><pre> exports.relative = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(from, to)</span> {</span>
426 from = exports.resolve(from).substr(<span class="hljs-number">1</span>);
427 to = exports.resolve(to).substr(<span class="hljs-number">1</span>);
428
429 <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">trim</span><span class="hljs-params">(arr)</span> {</span>
430 <span class="hljs-keyword">var</span> start = <span class="hljs-number">0</span>;
431 <span class="hljs-keyword">for</span> (; start &lt; arr.length; start++) {
432 <span class="hljs-keyword">if</span> (arr[start] !== <span class="hljs-string">''</span>) <span class="hljs-keyword">break</span>;
433 }
434
435 <span class="hljs-keyword">var</span> end = arr.length - <span class="hljs-number">1</span>;
436 <span class="hljs-keyword">for</span> (; end &gt;= <span class="hljs-number">0</span>; end--) {
437 <span class="hljs-keyword">if</span> (arr[end] !== <span class="hljs-string">''</span>) <span class="hljs-keyword">break</span>;
438 }
439
440 <span class="hljs-keyword">if</span> (start &gt; end) <span class="hljs-keyword">return</span> [];
441 <span class="hljs-keyword">return</span> arr.slice(start, end - start + <span class="hljs-number">1</span>);
442 }
443
444 <span class="hljs-keyword">var</span> fromParts = trim(from.split(<span class="hljs-string">'/'</span>));
445 <span class="hljs-keyword">var</span> toParts = trim(to.split(<span class="hljs-string">'/'</span>));
446
447 <span class="hljs-keyword">var</span> length = <span class="hljs-built_in">Math</span>.min(fromParts.length, toParts.length);
448 <span class="hljs-keyword">var</span> samePartsLength = length;
449 <span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i = <span class="hljs-number">0</span>; i &lt; length; i++) {
450 <span class="hljs-keyword">if</span> (fromParts[i] !== toParts[i]) {
451 samePartsLength = i;
452 <span class="hljs-keyword">break</span>;
453 }
454 }
455
456 <span class="hljs-keyword">var</span> outputParts = [];
457 <span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i = samePartsLength; i &lt; fromParts.length; i++) {
458 outputParts.push(<span class="hljs-string">'..'</span>);
459 }
460
461 outputParts = outputParts.concat(toParts.slice(samePartsLength));
462
463 <span class="hljs-keyword">return</span> outputParts.join(<span class="hljs-string">'/'</span>);
464 };
465
466 exports.sep = <span class="hljs-string">'/'</span>;
467 exports.delimiter = <span class="hljs-string">':'</span>;
468
469 exports.dirname = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(path)</span> {</span>
470 <span class="hljs-keyword">var</span> result = splitPath(path),
471 root = result[<span class="hljs-number">0</span>],
472 dir = result[<span class="hljs-number">1</span>];
473
474 <span class="hljs-keyword">if</span> (!root &amp;&amp; !dir) {</pre></div></div>
475
476 </li>
477
478
479 <li id="section-21">
480 <div class="annotation">
481
482 <div class="pilwrap ">
483 <a class="pilcrow" href="#section-21">&#182;</a>
484 </div>
485 <p>No dirname whatsoever</p>
486
487 </div>
488
489 <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">return</span> <span class="hljs-string">'.'</span>;
490 }
491
492 <span class="hljs-keyword">if</span> (dir) {</pre></div></div>
493
494 </li>
495
496
497 <li id="section-22">
498 <div class="annotation">
499
500 <div class="pilwrap ">
501 <a class="pilcrow" href="#section-22">&#182;</a>
502 </div>
503 <p>It has a dirname, strip trailing slash</p>
504
505 </div>
506
507 <div class="content"><div class='highlight'><pre> dir = dir.substr(<span class="hljs-number">0</span>, dir.length - <span class="hljs-number">1</span>);
508 }
509
510 <span class="hljs-keyword">return</span> root + dir;
511 };
512
513
514 exports.basename = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(path, ext)</span> {</span>
515 <span class="hljs-keyword">var</span> f = splitPath(path)[<span class="hljs-number">2</span>];</pre></div></div>
516
517 </li>
518
519
520 <li id="section-23">
521 <div class="annotation">
522
523 <div class="pilwrap ">
524 <a class="pilcrow" href="#section-23">&#182;</a>
525 </div>
526 <p>TODO: make this comparison case-insensitive on windows?</p>
527
528 </div>
529
530 <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">if</span> (ext &amp;&amp; f.substr(-<span class="hljs-number">1</span> * ext.length) === ext) {
531 f = f.substr(<span class="hljs-number">0</span>, f.length - ext.length);
532 }
533 <span class="hljs-keyword">return</span> f;
534 };
535
536
537 exports.extname = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(path)</span> {</span>
538 <span class="hljs-keyword">return</span> splitPath(path)[<span class="hljs-number">3</span>];
539 };
540
541 <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">filter</span> <span class="hljs-params">(xs, f)</span> {</span>
542 <span class="hljs-keyword">if</span> (xs.filter) <span class="hljs-keyword">return</span> xs.filter(f);
543 <span class="hljs-keyword">var</span> res = [];
544 <span class="hljs-keyword">for</span> (<span class="hljs-keyword">var</span> i = <span class="hljs-number">0</span>; i &lt; xs.length; i++) {
545 <span class="hljs-keyword">if</span> (f(xs[i], i, xs)) res.push(xs[i]);
546 }
547 <span class="hljs-keyword">return</span> res;
548 }</pre></div></div>
549
550 </li>
551
552
553 <li id="section-24">
554 <div class="annotation">
555
556 <div class="pilwrap ">
557 <a class="pilcrow" href="#section-24">&#182;</a>
558 </div>
559 <p>String.prototype.substr - negative index don’t work in IE8</p>
560
561 </div>
562
563 <div class="content"><div class='highlight'><pre> <span class="hljs-keyword">var</span> substr = <span class="hljs-string">'ab'</span>.substr(-<span class="hljs-number">1</span>) === <span class="hljs-string">'b'</span>
564 ? <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-params">(str, start, len)</span> {</span> <span class="hljs-keyword">return</span> str.substr(start, len) }
565 : <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-params">(str, start, len)</span> {</span>
566 <span class="hljs-keyword">if</span> (start &lt; <span class="hljs-number">0</span>) start = str.length + start;
567 <span class="hljs-keyword">return</span> str.substr(start, len);
568 };
569 <span class="hljs-keyword">return</span> { exports: exports };
570 })();
571
572
573 m[<span class="hljs-string">'path'</span>] = path;
574 <span class="hljs-keyword">var</span> Path = path.exports;
575
576})(<span class="hljs-keyword">this</span>);</pre></div></div>
577
578 </li>
579
580 </ul>
581 </div>
582</body>
583</html>