syncterm.c 85.4 KB
Newer Older
deuce's avatar
deuce committed
1
2
/* Copyright (C), 2007 by Stephen Hurd */

3
/* $Id: syncterm.c,v 1.261 2020/06/27 00:04:50 deuce Exp $ */
4

deuce's avatar
deuce committed
5
#if defined(__APPLE__) && defined(__MACH__)
Deucе's avatar
Deucе committed
6
 #include <CoreServices/CoreServices.h> // FSFindFolder() and friends
deuce's avatar
deuce committed
7
8
#endif

Deucе's avatar
Deucе committed
9
10
11
12
13
14
15
#define NOCRYPT                         /* Stop windows.h from loading wincrypt.h */
/* Is windows.h REALLY necessary?!?! */
#define __WINCRYPT_H__                  /* Really REALLY stop wincrypt.h har har
                                         * This is to workaround an issue in MinGW-w64 headers where
                                         * shlobj.h (which we need to include) unconditionally
                                         * includes wincrypt.h (which we need to not be included).
                                         */
16
#define WIN32_LEAN_AND_MEAN
17
#include <sys/stat.h>
18
#ifdef _WIN32
Deucе's avatar
Deucе committed
19
20
 #include <shlobj.h>
 #ifndef REFKNOWNFOLDERID
21
typedef GUID KNOWNFOLDERID;
22
  #define REFKNOWNFOLDERID const KNOWNFOLDERID *
Deucе's avatar
Deucе committed
23

24
// Not shared
Deucе's avatar
Deucе committed
25
26
27
28
29
30
31
32
33
34
static const KNOWNFOLDERID FOLDERID_Downloads = {
	0x374DE290, 0x123F, 0x4565, {0x91, 0x64, 0x39, 0xC4, 0x92, 0x5E, 0x46, 0x7B}
};
static const KNOWNFOLDERID FOLDERID_RoamingAppData = {
	0x3EB685DB, 0x65F9, 0x4CF6, {0xA0, 0x3A, 0xE3, 0xEF, 0x65, 0x72, 0x9F, 0x3D}
};
static const KNOWNFOLDERID FOLDERID_InternetCache = {
	0x352481E8, 0x33BE, 0x4251, {0xBA, 0x85, 0x60, 0x07, 0xCA, 0xED, 0xCF, 0x9D}
};

35
// Shared
Deucе's avatar
Deucе committed
36
37
38
39
40
41
42
43
44
45
static const KNOWNFOLDERID FOLDERID_PublicDownloads = {
	0x3D644C9B, 0x1FB8, 0x4f30, {0x9B, 0x45, 0xF6, 0x70, 0x23, 0x5F, 0x79, 0xC0}
};
static const KNOWNFOLDERID FOLDERID_ProgramData = {
	0x62AB5D82, 0xFDC1, 0x4DC3, {0xA9, 0xDD, 0x07, 0x0D, 0x1D, 0x49, 0x5D, 0x97}
};
 #endif /* ifndef REFKNOWNFOLDERID */
 #ifndef KF_FLAG_CREATE
  #define KF_FLAG_CREATE 0x00008000
 #endif
46
 #include <xp_dl.h> /* xp_dlopen() and friends */
Deucе's avatar
Deucе committed
47
#endif /* ifdef _WIN32 */
48

deuce's avatar
deuce committed
49
#include <ciolib.h>
deuce's avatar
deuce committed
50
#include <cterm.h>
Deucе's avatar
Deucе committed
51
52
53
54
55
56
#include <dirwrap.h>
#include <filewrap.h> // STDOUT_FILENO
#include <gen_defs.h>
#include <ini_file.h>
#include <stdbool.h>
#include <stdlib.h>
57
#include <vidmodes.h>
58
59
60
61
#if !(defined __BORLANDC__ || defined _MSC_VER)
 #include <stdbool.h>
#else
 #define bool int
Deucе's avatar
Deucе committed
62
63
64
65
66
enum {
	false,
	true
};

67
#endif
deuce's avatar
deuce committed
68

69
#include "bbslist.h"
70
#include "conn.h"
Deucе's avatar
Deucе committed
71
72
73
74
#include "fonts.h"
#include "scale.h"
#include "st_crypt.h"
#include "syncterm.h"
deuce's avatar
deuce committed
75
#include "term.h"
76
#include "uifcinit.h"
deuce's avatar
deuce committed
77
#include "window.h"
78

79
char *syncterm_version = "SyncTERM 1.2b"
Deucе's avatar
Deucе committed
80
81

// #define ALPHA
rswindell's avatar
rswindell committed
82
#ifdef _DEBUG
Deucе's avatar
Deucе committed
83
    " Debug ("__DATE__ ")"
rswindell's avatar
rswindell committed
84
#endif
Deucе's avatar
Deucе committed
85
86
;

87
char *usage =
Deucе's avatar
Deucе committed
88
89
90
91
92
93
94
95
96
97
    "\nusage: syncterm [options] [URL]"
    "\n\noptions:\n\n"
    "-4  =  Only resolve IPv4 addresses\n"
    "-6  =  Only resolve IPv6 addresses\n"
    "-b/path/to/list = specify user BBS list path\n"
    "-c  =  Hide the status line\n"
    "-e# =  set escape delay to #msec\n"
    "-h  =  use SSH mode if URL does not include the scheme\n"
    "-iX =  set interface mode to X (default=auto) where X is one of:\n"
    "       S[W|F] = SDL surface mode W for windowed and F for fullscreen\n"
98
#ifdef __unix__
Deucе's avatar
Deucе committed
99
100
101
102
    "       X = X11 mode\n"
    "       C = Curses mode\n"
    "       I = Curses mode with forced ASCII charset\n"
    "       F = Curses mode with forced IBM charset\n"
103
#else
Deucе's avatar
Deucе committed
104
    "       W[F] = Win32 native mode, F for fullscreen\n"
105
#endif
Deucе's avatar
Deucе committed
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
    "       A = ANSI mode\n"
    "-l# =  set screen lines to # (default=auto-detect)\n"
    "-n/path/to/ini = specify a config ini path\n"
    "-q  =  Quiet mode (Hide various popups such as this during a connect)\n"
    "-r  =  use rlogin mode if URL does not include the scheme\n"
    "-s  =  enable \"Safe Mode\" which prevents writing/browsing local files\n"
    "-T  =  when the ONLY argument, dumps the terminfo entry to stdout and exits\n"
    "-t  =  use telnet mode if URL does not include the scheme\n"
    "-v  =  when the ONLY argument, dumps the version info to stdout and exits\n"
    "\n"
    "URL format is: [(rlogin|telnet|ssh|raw)://][user[:password]@]domainname[:port]\n"
    "raw:// URLs MUST include a port.\n"
    "shell:command URLs are supported on *nix.\n"
    "examples: rlogin://deuce:password@nix.synchro.net:5885\n"
    "          telnet://deuce@nix.synchro.net\n"
    "          nix.synchro.net\n"
    "          telnet://nix.synchro.net\n"
    "          raw://nix.synchro.net:23\n"
    "          shell:/usr/bin/sh\n"
;

char                    *inpath = NULL;
int                      default_font = 0;
129
struct syncterm_settings settings;
Deucе's avatar
Deucе committed
130
131
132
133
134
135
136
137
138
139
140
141
char                    *font_names[sizeof(conio_fontdata) / sizeof(struct conio_font_data_struct)];
struct vmem_cell        *scrollback_buf = NULL;
unsigned int             scrollback_lines = 0;
unsigned int             scrollback_mode = C80;
unsigned int             scrollback_cols = 80;
int                      safe_mode = 0;
FILE                    *log_fp;
extern ini_style_t       ini_style;
bool                     quitting = false;
int                      fake_mode = -1;
char                    *config_override;
char                    *list_override;
142

deuce's avatar
deuce committed
143
144
145
#ifdef _WINSOCKAPI_

static WSADATA WSAData;
Deucе's avatar
Deucе committed
146
147
 #define SOCKLIB_DESC WSAData.szDescription
static bool    WSAInitialized = false;
148

Deucе's avatar
Deucе committed
149
150
static bool
winsock_startup(void)
deuce's avatar
deuce committed
151
{
Deucе's avatar
Deucе committed
152
	int status; /* Status Code */
deuce's avatar
deuce committed
153

Deucе's avatar
Deucе committed
154
155
156
157
	if ((status = WSAStartup(MAKEWORD(1, 1), &WSAData)) == 0) {
		fprintf(stderr, "%s %s", WSAData.szDescription, WSAData.szSystemStatus);
		WSAInitialized = true;
		return true;
deuce's avatar
deuce committed
158
159
	}

Deucе's avatar
Deucе committed
160
161
	fprintf(stderr, "!WinSock startup ERROR %d", status);
	return false;
deuce's avatar
deuce committed
162
163
164
165
}

#else /* No WINSOCK */

Deucе's avatar
Deucе committed
166
167
 #define winsock_startup() (true)
 #define SOCKLIB_DESC NULL
deuce's avatar
deuce committed
168

Deucе's avatar
Deucе committed
169
#endif /* ifdef _WINSOCKAPI_ */
deuce's avatar
deuce committed
170

deuce's avatar
deuce committed
171
172
173
/* GIMP RGBA C-Source image dump (syncterm-icon.c) */

static const struct {
Deucе's avatar
Deucе committed
174
175
176
177
	unsigned int  width;
	unsigned int  height;
	unsigned int  bytes_per_pixel; /* 3:RGB, 4:RGBA */
	unsigned char pixel_data[64 * 64 * 4 + 1];
deuce's avatar
deuce committed
178
} syncterm_icon = {
179
180
	64, 64, 4,
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
Deucе's avatar
Deucе committed
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0xxx\377ppp\377hh"
	"h\377bbb\377]]]\377ZZZ\377WWW\377VVV\377VVV\377WWW\377ZZZ\377]]]\377bbb\377"
	"hhh\377ppp\377xxx\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0rrr\377"
	"bbb\377UUU\377JJJ\377AAA\377:::\377333\377---\377(((\377$$$\377\"\"\"\377"
	"\37\37\37\377\36\36\36\377\36\36\36\377\36\36\36\377\36\36\36\377\37\37\37"
	"\377\"\"\"\377$$$\377(((\377---\377333\377:::\377AAA\377JJJ\377UUU\377bb"
	"b\377rrr\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0ooo\377ZZZ\377III\377"
	"<<<\377///\377%%%\377\36\36\36\377\36\36\36\377\37\37\37\377\40\40\40\377"
	"!!!\377\"\"\"\377!!!\377\33\33\33\377\36\36\36\377###\377###\377###\377#"
	"##\377###\377###\377\36\36\36\377\33\33\33\377!!!\377\"\"\"\377!!!\377\40"
	"\40\40\377\37\37\37\377\36\36\36\377\36\36\36\377%%%\377///\377;;;\377II"
	"I\377ZZZ\377ooo\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0jjj\377RRR\377>>>\377---\377\"\"\"\377\36\36\36\377\40\40\40\377\"\"\""
	"\377\33\33\33\377###\377###\377\26\26\26\377\15\15\15\377\15\15\15\377\15"
	"\15\15\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
	"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\15\15"
	"\15\377\15\15\15\377\26\26\26\377\26\26\26\377###\377\33\33\33\377\"\"\""
	"\377\40\40\40\377\36\36\36\377\"\"\"\377---\377>>>\377QQQ\377jjj\377\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0uuu\377WWW\377???\377,,,\377\36\36\36\377\37\37\37\377\"\"\"\377\33\33"
	"\33\377###\377\26\26\26\377\15\15\15\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
	"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
	"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
	"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
	"\0\0\0\377\15\15\15\377\26\26\26\377###\377\36\36\36\377\"\"\"\377\37\37"
	"\37\377\36\36\36\377,,,\377???\377WWW\377uuu\377\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0mmm\377MMM\377333\377\"\"\"\377\37\37\37\377\"\"\"\377##"
	"#\377\26\26\26\377\15\15\15\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
	"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
	"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
	"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\14\377"
	"\0\0z\377\0\0t\377\0\0\0\377\0\0\0\377\0\0j\377\0\0\6\377\0\0\0\377\0\0\0"
	"\377\15\15\15\377\26\26\26\377###\377\"\"\"\377\37\37\37\377!!!\377333\377"
	"LLL\377mmm\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0ppp\377KKK\377///\377\36\36\36\377!!!\377\33\33\33"
	"\377\26\26\26\377\15\15\15\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
	"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\7\377\0\0"
	"\12\377\0\0\0\377\0\0\20\377\0\0\26\377\0\0)\377\0\0\17\377\0\0\0\377\0\0"
	"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
	"\377\0\0\0\377\0\0\20\377\0\0\177\377\0\0G\377\0\0" "2\377\0\0\0\377\0\0\0"
	"\377\0\0-\377\0\0\2\377\0\0\0\377\6\6\6\377\10\10\10\377\14\14\14\377\7\7"
	"\7\377\33\34\33\377\26\26\26\377\33\33\33\377!!!\377\36\36\36\377///\377"
	"KKK\377ppp\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0}}}\377SSS"
	"\377222\377\36\36\36\377!!!\377\36\36\36\377\26\26\26\377\0\0\0\377\0\0\0"
	"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\2\2\2\377"
	"\3\3\3\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0;\377\0\0T\377\0\0\3\377\0\0"
	"\214\377\0\0\223\377\0\0;\377\0\0!\377\0\0\16\377\0\0\3\377\0\0\0\377\0\0"
	"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\2\377\0\0\224"
	"\377\0\0Q\377\0\0\3\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
	"\0\0\0\377\25\25\25\377\33\34\33\377\27\27\27\377\27\27\27\377\21\21\21\377"
	"\0\0\0\377\0\0\0\377\15\15\15\377\36\36\36\377!!!\377\36\36\36\377222\377"
	"SSS\377}}}\377\0\0\0\0\0\0\0\0\0\0\0\0aaa\377>>>\377###\377\40\40\40\377"
	"\36\36\36\377\26\26\26\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
	"\377\0\0\0\377\0\0\0\377\1\1\1\377\26\26\26\377\25\25\25\377\21\22\21\377"
	"\27\30\27\377\0\0\0\377\0\0\7\377\0\0:\377\0\0\0\377\0\0\0\377\0\0\0\377"
	"\0\0\0\377\0\0\0\377\0\0,\377\0\0\213\377\0\0\300\377\0\0_\377\0\0=\377\0"
	"\0\0\377\0\0\0\377\0\0/\377\0\0H\377\0\0\1\377\0\0\0\377\0\0!\377\0\0\237"
	"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
	"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
	"\0\0\377\0\0\0\377\0\0\0\377\26\26\26\377\36\36\36\377\40\40\40\377###\377"
	"===\377aaa\377\0\0\0\0;;;\377)))\377\36\36\36\377!!!\377\26\26\26\377\0\0"
	"\1\377\0\0\2\377\0\0\4\377\0\0\0\377\0\0\0\377\0\0\0\377\1\1\1\377\1\1\1"
	"\377&&&\377OPO\377QRQ\377#$#\377\0\0\0\377\0\0\0\377\0\0\1\377\0\0\2\377"
	"\0\0\14\377\0\0\36\377\0\0V\377\0\0V\377\0\0V\377\0\0X\377\0\0" "9\377\0\0"
	"" "6\377\0\0\300\377\0\0\274\377\0\0\250\377\0\0:\377\0\0\6\377\0\0\251\377"
	"\0\0\327\377\0\0)\377\0\0\21\377\0\0\24\377\0\4\240\377\7\7\34\377???\377"
	"-.-\377WWW\377`_`\377`_`\377`_`\377TST\377\"\"\"\377\0\0\0\377\0\0\6\377"
	"\0\0A\377\0\0\0\377\0\0%\377\0\0U\377\0\0\24\377\0\0\1\377\0\0\0\377\0\0"
	"\0\377\26\26\26\377!!!\377\36\36\36\377)))\377;;;\377\40\40\40\377!!!\377"
	"###\377\15\15\15\377\0\0\6\377\0\0q\377\0\0\25\377\0\0" "2\377\0\0\0\377\0"
	"\0\0\377\17\20\17\377xyx\377\203\203\203\377\230\230\230\377\272\273\272"
	"\377lll\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0a\377\0\0\216\377\0\0\216\377"
	"\0\0\244\377\0\0\337\377\0\0\334\377\0\0\315\377\0\0\342\377\0\0\270\377"
	"\0\0d\377\0\0\301\377\0\0\242\377\0\0\214\377\0\0+\377\0\0\16\377\0\0\333"
	"\377\0\0\346\377\0\0^\377\0\0S\377\0\0\236\377\0\12\340\377\5\5" "7\377//"
	"/\377HIH\377\303\303\303\377\312\311\312\377\312\311\312\377\312\311\312"
	"\377\265\265\265\377QRQ\377\0\0\0\377\0\0\5\377\0\0" "0\377\0\0\0\377\0\0"
	"\34\377\0\0?\377\0\0|\377\0\0y\377\0\0\7\377\0\0\0\377\0\0\0\377\15\15\15"
	"\377###\377!!!\377\40\40\40\377\26\26\26\377\15\15\15\377\0\0\10\377\0\0"
	"W\377\0\0)\377\0\0&\377\3\3\3\377\17\17\17\377ede\377\231\231\231\377\226"
	"\227\226\377\271\272\271\377\275\276\275\377\274\275\274\377\200\200\200"
	"\377&&&\377\0\0\3\377\0\0D\377\0\0\241\377\0\0\331\377\0\0\344\377\0\0\330"
	"\377\0\0\214\377\10\10>\377\17\17D\377\17\17?\377\0\0" "3\377\0\0s\377\0\0"
	"\305\377\0\0\277\377\1\1?\377\16\16-\377\17\17\17\377\10\10\13\377\0\0X\377"
	"\0\0\360\377\0\5>\377\0+\225\377\0\20\333\377\0\3\352\377\0\0\223\377\0\0"
	"\20\377\15\15\15\377xwx\377\343\342\343\377\357\360\357\377\357\360\357\377"
	"\340\341\340\377~~~\377\0\0\0\377\14\14\14\377\17\17\17\377\17\17\17\377"
	"\17\17\17\377\17\17\17\377\4\4(\377\0\0\210\377\0\0Q\377\0\0\0\377\0\0\0"
	"\377\0\0\0\377\0\0\0\377\0\0\0\377\15\15\15\377\0\0\0\377\0\0\0\377\0\0j"
	"\377\0\0c\377\0\0\2\377\0\0\0\377222\377\266\267\266\377\273\274\273\377"
	"\275\276\275\377\275\276\275\377\275\276\275\377\275\276\275\377\275\276"
	"\275\377sss\377\16\16\16\377\0\1F\377\2\3\335\377\0\2\375\377\0\0\374\377"
	"\4\4H\377\35\35'\377\36\36#\377klk\377\264\265\264\377\235\236\235\377\0"
	"\0&\377\0\0\317\377\0\0\307\377\26\26V\377--.\377\246\247\246\377\266\267"
	"\266\377jjj\377\0\0)\377\0\32\347\377\0\7\302\377\0/\220\377\0\22_\377\25"
	"\25\37\377!!)\377!!\"\377!!!\377121\377\262\262\262\377\365\365\365\377\365"
	"\365\365\377\352\352\352\377\213\213\213\377\6\6\6\377\216\217\216\377\266"
	"\267\266\377\266\267\266\377\252\253\252\377\230\231\230\377##<\377\0\0\216"
	"\377\0\0Y\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
	"\0\0\0\377\0\0\0\377\0\0\246\377\0\0\33\377\0\0\0\377\0\0\0\377klk\377\276"
	"\277\276\377\275\276\275\377\275\276\275\377\311\311\311\377\312\311\312"
	"\377\275\276\275\377\275\276\275\377\207\210\207\377\1\1\4\377\0\5\352\377"
	"\13\20\373\377\0\12\375\377\0\0\363\377\30\27?\377\260\257\260\377\265\266"
	"\265\377\271\272\271\377\260\261\260\377)))\377\0\0~\377\0\0\317\377%%i\377"
	"\237\236\242\377\271\271\271\377\274\275\274\377\275\276\275\377\255\255"
	"\255\377\0\1\4\377\0\\\251\377\0\3\201\377\11\14\25\377237\377\234\234\234"
	"\377\310\307\310\377\310\307\310\377\310\307\310\377\217\216\217\377\225"
	"\226\225\377\302\302\302\377\300\301\300\377\277\300\277\377\210\211\210"
	"\377###\377\224\224\224\377\275\276\275\377\301\301\301\377xwx\377\10\10"
	"" "9\377\2\2n\377\0\0\225\377\0\0r\377\0\0[\377\0\0\40\377\0\0\0\377\0\0\0"
	"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\11d\377\0\13\27\377\0\0\0"
	"\377\24\24\24\377\261\261\261\377\334\334\334\377\333\334\333\377\324\324"
	"\324\377\205\203\205\377\211\210\211\377\275\276\275\377\275\276\275\377"
	"\236\237\236\377\17\17\21\377\0\3\233\377\7\12\375\377\0\6\301\377\0\0\313"
	"\377\31\30?\377\270\267\270\377\275\276\275\377\271\272\271\377\240\241\240"
	"\377\22\23D\377\0\4\350\377\0\0]\377RRR\377\300\300\300\377\301\301\301\377"
	"\275\276\275\377\275\276\275\377\261\261\261\377\36\36\37\377\0\0Z\377\21"
	"\21\23\377iii\377\235\236\235\377\305\305\305\377\310\310\310\377\310\310"
	"\310\377\310\310\310\377\303\303\303\377\207\207\207\377\243\243\243\377"
	"\331\332\331\377\333\334\333\377\270\270\270\377@@@\377qqq\377\303\304\303"
	"\377\277\300\277\377\224\224\224\377\0\0|\377\0\0\177\377\2\2\211\377\2\2"
	"\370\377\0\0\354\377\0\0\207\377\0\0" "1\377\0\0\7\377\0\0\24\377\0\0\0\377"
	"\0\0\0\377\0\0\0\377\0\25\25\377\0\24\27\377\0\0\1\377*+*\377\372\372\372"
	"\377\375\375\375\377\376\376\376\377\372\371\372\377\211\211\211\377\31\31"
	"\31\377nmn\377\326\323\326\377\300\300\300\377\214\215\214\377\0\0\15\377"
	"\0\0C\377\2\2\"\377\0\0\240\377\31\30?\377\270\267\270\377\275\276\275\377"
	"\263\264\263\377\214\215\214\377\0\1i\377\0\16\315\377\22\22\26\377\\]\\"
	"\377TTT\377\246\246\246\377\276\277\276\377\275\276\275\377\264\265\264\377"
	"BCB\377\1\1\1\377\226\226\226\377\314\313\314\377\277\300\277\377\275\276"
	"\275\377\275\276\275\377\275\276\275\377\275\276\275\377\275\276\275\377"
	"EEE\377~}~\377\373\373\373\377\377\377\377\377\362\362\362\377bbb\377FGF"
	"\377\312\311\312\377\275\276\275\377\271\272\271\377\2\2#\377\0\0\267\377"
	"\6\6\367\377\6\6\371\377\0\0\355\377\0\0\274\377\0\0l\377\0\0\16\377\0\0"
	",\377\0\0\1\377\0\0\0\377\0\0\5\377\0\5\35\377\0\4p\377\0\0B\377\14\14\17"
	"\377yzy\377\300\300\300\377\320\320\320\377\315\315\315\377\274\274\274\377"
	"\220\216\220\377\40\40\40\377212\377222\377;;;\377\25\26\25\377\40\40\40"
	"\377<=<\377\6\6c\377\31\30" "0\377\270\267\270\377\275\276\275\377\262\263"
	"\262\377\200\200\200\377\37\40" "6\377\0q\234\377\5\10\10\377\26\27\"\377"
	"\13\13\23\377LML\377\263\263\263\377\275\276\275\377\301\302\301\377HGH\377"
	"555\377\276\277\276\377\301\302\301\377\276\277\276\377\300\300\300\377\276"
	"\277\276\377\275\276\275\377\266\267\266\377\266\267\266\377\17\17\17\377"
	"111\377\367\367\367\377\377\377\377\377\375\375\375\377ooo\377...\377\260"
	"\261\260\377\275\276\275\377\264\265\264\377UUU\377\25\26;\377\27\27L\377"
	"\27\27L\377\25\26J\377\11\11" "2\377\17\17'\377\3\3\6\377\0\0^\377\0\0\26"
	"\377\0\0\4\377\0\0D\377\0\0\314\377\0\0\305\377\0\0\303\377\0\1A\377\3\11"
	"\35\377MKM\377\300\275\300\377\276\276\276\377\275\276\275\377\275\276\275"
	"\377\201\201\201\377\21\21\21\377./.\377\243\243\243\377\267\270\267\377"
	"\225\226\225\377Z[Z\377\10\10F\377\34\34,\377\277\277\277\377\307\310\307"
	"\377\263\264\263\377\213\213\213\377\264\264\264\377(--\377\31\30\31\377"
	"\0\0S\377\0\0" "8\377111\377\270\270\270\377\307\310\307\377\314\314\314\377"
	"MMM\377[\\[\377\310\311\310\377\310\311\310\377\302\303\302\377\274\272\274"
	"\377\261\261\261\377\273\274\273\377\265\266\265\377\252\252\252\377\0\0"
	"\0\377\27\30\27\377\343\343\343\377\376\376\376\377\377\377\377\377\331\332"
	"\331\377\302\303\302\377\307\310\307\377\307\310\307\377\277\300\277\377"
	"\304\305\304\377\242\243\242\377\231\232\231\377\231\232\231\377\231\232"
	"\231\377>?>\377kkk\377\25\25\30\377\0\0t\377\0\0\27\377\0\0\32\377\0\0\300"
	"\377\0\0\355\377\0\0r\377\0\0\257\377\0\5\363\377\0%\263\377\1\1X\377\1\1"
	")\377MMM\377xxx\377\307\305\307\377\316\315\316\377\216\215\216\377\37\40"
	"\37\377\236\237\236\377\275\276\275\377\275\276\275\377\240\241\240\377\11"
	"\11\12\377111\377\346\345\346\377\377\377\377\377\261\261\261\377\310\310"
	"\310\377\376\376\376\377\374\373\374\377\305\304\305\377__`\377\33\33\34"
	"\377\30\30\30\377\343\343\343\377\377\377\377\377\364\362\364\377cbc\377"
	"\332\332\332\377\375\375\375\377\377\377\377\377\271\271\271\377(((\377K"
	"KK\377\262\263\262\377\275\276\275\377srs\377\0\0=\377\0\0\16\377\200\200"
	"\200\377\372\372\372\377\377\377\377\377\377\377\377\377\377\377\377\377"
	"\377\377\377\377\377\377\377\377\376\376\376\377\377\377\377\377;;;\377\1"
	"\1W\377\1\30h\377\1" "3b\377\1\1a\377\1\1Z\377\0\0k\377\0\0W\377\0\0\0\377"
	"\0\2>\377\0\30\307\377\0\20\342\377\0\0_\377\0\0\330\377\0\3\364\377\0\22"
	"g\377\0\0g\377\0\0/\377\0\0\0\377\16\15\16\377jhj\377\266\265\266\377\310"
	"\307\310\377\202\202\202\377\252\252\252\377\276\277\276\377\275\276\275"
	"\377\267\267\267\377)()\377AAA\377\322\322\322\377\336\337\336\377\256\257"
	"\256\377\245\245\245\377\337\337\337\377\336\337\336\377\336\337\336\377"
	"\316\316\316\377\212\211\212\377)))\377\307\310\307\377\341\341\341\377\336"
	"\335\336\377\\[\\\377\326\325\326\377\376\375\376\377\376\376\376\377\206"
	"\206\206\377\0\0\0\377)))\377\202\203\202\377\275\276\275\377\227\230\227"
	"\377##%\377\0\0\0\377www\377\343\343\343\377\336\337\336\377\313\314\313"
	"\377\200\200\200\377\212\212\212\377\337\337\337\377\336\337\336\377\336"
	"\337\336\377Z[Z\377\0\0s\377\0\33\340\377\0:\310\377\0\4\274\377\0\0\207"
	"\377\0\0q\377\0\0\0\377\0\0\0\377\0\6b\377\0" "2\315\377\0\36\330\377\0\0"
	"M\377\0\0\205\377\0\0" "7\377\37\37\37\377\223\223\223\377\223\223\223\377"
	"+++\377\0\0x\377\0\0\15\377\224\225\224\377\302\302\302\377\275\276\275\377"
	"\267\270\267\377\277\300\277\377\275\276\275\377\301\301\301\377\243\243"
	"\243\377hhh\377\275\276\275\377\275\276\275\377\254\255\254\377\202\202\202"
	"\377\277\300\277\377\275\276\275\377\275\276\275\377\275\276\275\377\302"
	"\303\302\377\241\241\241\377\272\273\272\377\304\304\304\377\310\307\310"
	"\377TUT\377\321\320\321\377\375\375\375\377\376\375\376\377\206\206\206\377"
	"\0\0\0\377\1\1t\377\22\23$\377*+*\377*+*\377\20\20\20\377\0\0\0\377jjj\377"
	"\316\315\316\377\275\276\275\377\227\230\227\377\0\0\0\377\25\25\25\377\277"
	"\300\277\377\275\276\275\377\275\276\275\377{{{\377\0\0\7\377\0\0/\377\0"
	"\0|\377\0\13\345\377\0\0>\377\0\0\0\377\0\0\0\377\0\0\0\377\0\1!\377\0\10"
	"\263\377\0\21\366\377\0\21\337\377\0\0\274\377+++\377\231\227\231\377\265"
	"\266\265\377wxw\377'('\377\37\37" "7\377@?B\377\304\303\304\377\275\276\275"
	"\377\320\316\320\377[Z[\377\310\306\310\377\331\331\331\377\361\360\361\377"
	"\363\364\363\377\351\351\351\377\365\365\365\377\365\365\365\377\205\205"
	"\205\377\215\214\215\377\301\301\301\377\300\301\300\377\223\222\223\377"
	"^^^\377\263\264\263\377\275\276\275\377\275\276\275\377\302\302\302\377\310"
	"\307\310\377FGF\377\251\247\251\377\364\363\364\377\372\371\372\377\314\314"
	"\314\377MNM\377\6\6)\377\0\0\177\377\0\0b\377\16\16\16\377=>=\377121\377"
	"***\377\273\274\273\377\275\276\275\377\227\230\227\377\0\0" "5\377\3\3" "3"
	"\377\216\216\216\377\275\276\275\377\275\276\275\377\263\264\263\377\13\25"
	"&\377\0D\262\377\0\0\277\377\0\2n\377\0\0\11\377\0\0\0\377\0\0\0\377\0\0"
	"\0\377\0\0\1\377\0\0" "4\377\0<\277\377\0N\273\377\0\0\245\377233\377\255"
	"\253\255\377\265\266\265\377\271\272\271\377\265\266\265\377\265\266\265"
	"\377\276\276\276\377\316\314\316\377\303\303\303\377\325\323\325\377\272"
	"\272\272\377WYW\377SRS\377\273\270\273\377\322\321\322\377\363\363\363\377"
	"\362\362\362\377\360\360\360\377nnn\377\230\227\230\377\304\304\304\377\303"
	"\304\303\377\225\224\225\377\7\7\7\377hhh\377\267\270\267\377\275\276\275"
	"\377\301\301\301\377\307\307\307\377SSS\377676\377\347\346\347\377\361\360"
	"\361\377\324\324\324\377\275\275\275\377HGH\377&&-\377*)/\377ghg\377\204"
	"\205\204\377HIH\377\31\31\31\377\260\260\260\377\277\300\277\377\233\234"
	"\233\377\0\0M\377\0\10\261\377\206\206\206\377\301\302\301\377\301\302\301"
	"\377\276\277\276\377\37*:\377\0\\\234\377\0\6\21\377\0\0\4\377\0\0\0\377"
	"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
	"\0\0\377232\377\255\253\255\377\275\276\275\377\275\276\275\377\275\276\275"
	"\377\275\276\275\377\301\302\301\377\321\320\321\377\332\330\332\377\311"
	"\311\311\377\275\276\275\377\265\265\265\377kkk\377\21\21\21\377232\377\277"
	"\300\277\377\275\276\275\377\261\262\261\377+++\377\276\277\276\377\320\316"
	"\320\377\316\315\316\377\275\276\275\377\20\20\20\377\0\0\0\377[\\[\377\264"
	"\265\264\377\275\276\275\377\307\307\307\377\230\230\230\377\0\0\0\377yy"
	"y\377\313\311\313\377\275\276\275\377\327\325\327\377\325\323\325\377\304"
	"\304\304\377\312\311\312\377\275\276\275\377\237\240\237\377\200\201\200"
	"\377\0\0L\377\215\215\221\377\310\310\310\377\253\254\253\377\0\2Y\377\0"
	"(\275\377\213\212\213\377\322\320\322\377\322\320\322\377\302\302\302\377"
	"opo\377\0\212\214\377\0\37\40\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
	"\0\0\0\377\0\0\0\377\0\0\0\377\0\11\11\377\0\36\36\377\0\6\7\377\34\34\34"
	"\377\267\266\267\377\322\321\322\377\322\321\322\377\277\277\277\377\232"
	"\233\232\377\263\264\263\377\303\303\303\377\307\306\307\377{{{\377WX[\377"
	"[[`\377PPT\377\20\21\22\377]]]\377\311\310\311\377\310\310\310\377\234\234"
	"\234\377FFF\377\272\273\272\377\302\302\302\377\332\327\332\377\323\321\323"
	"\377ono\377\13\14R\377\10\10\37\377^^^\377\274\274\274\377\302\302\302\377"
	"\245\245\245\377\26\27\26\377\22\22\23\377^]`\377\206\207\206\377\306\305"
	"\306\377\300\301\300\377\301\301\301\377\266\265\266\377\257\260\257\377"
	"\253\254\253\377PPP\377\0\0K\377\211\211\214\377\301\301\301\377uuu\377\0"
	";w\377\0\35e\377\200\200\200\377\306\306\306\377\302\300\302\377\320\317"
	"\320\377<PP\377\0\232\233\377\0\16\16\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
	"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\23\23\377\0" "78\377\0\14\14\377"
	"\2\2\2\377HHH\377\303\302\303\377\303\302\303\377\262\263\262\377jkj\377"
	"$$$\377'**\377'**\377\14\17\25\377\0\2\251\377\0\1\302\377\0\0\243\377\0"
	"\0O\377\203\203\203\377\320\317\320\377\322\320\320\377\211\210\210\377\24"
	"\24\24\377(((\377'''\377\303\302\303\377\303\302\303\377\257\260\257\377"
	"\26\26" "2\377\0\1\232\377\6\6\36\377XXX\377\272\273\272\377\263\263\263\377"
	"\236\237\236\377\5\6!\377\0\0j\377\22\22\22\377'')\377\235\236\236\377\274"
	"\274\274\377\230\226\230\377bbb\377'''\377\10\10\10\377\0\0\0\377\206\207"
	"\206\377yzy\377\17\17\20\377\0h\220\377\3\30\35\377z{z\377\275\276\275\377"
	"\264\263\264\377\334\333\334\377\20\30\30\377\0$$\377\0\0\0\377\0\0\0\377"
	"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\3\3\377\0"
	"\7\7\377\0bc\377\0\27\27\377\5\14\14\377\31--\377\31\31\31\377\27//\377\16"
	"//\377\0=>\377\0\217\221\377\0\240\243\377\0\275\304\377\0w\345\377\0$\311"
	"\377\0\0\245\377\31\31k\377\306\304\306\377\311\311\303\377\353\352y\377"
	"ff\32\377!!!\377333\377\10\10\10\377\31\31\37\377\31\31.\377YZY\377000\377"
	"\0Is\377\0$\263\377\10\10" "1\377\31\31.\377ooo\377\236\237\236\377{|\200"
	"\377():\377\20\20\20\377\0\0]\377\24\24" "3\377\31\31" "6\377\24\24" "5\377"
	"\13\13\34\377\0\0\0\377\0\0\0\377666\377\224\224\224\377WWW\377\0\0,\377"
	"\12\30M\377uxx\377\226\226\226\377\236\237\236\377\235\236\235\377<<<\377"
	"\2\2\2\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
	"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0!!"
	"\377\0_`\377\0\0\0\377\0ln\377\0\235\237\377\0\226\227\377\0\0\4\377\0QY"
	"\377\0\244\262\377\0g\273\377\0\37\223\377\0\0K\377333\377\325\323\325\377"
	"\325\325\232\377\363\362Q\377\207\207\34\377[\\[\377kjj\377EE\22\377\0\0"
	"\35\377\0\0e\377\0\0\31\377\0\0" "2\377\0P~\377\0\247\315\377\0$\363\377\0"
	"\10\225\377\0\0:\377\0\0\22\377\31\31\31\377\213\213\213\377KKK\377\0\0\0"
	"\377\0\0\15\377\0\0\211\377\0\0\233\377\0\0S\377\35\35\35\377\12\12\12\377"
	"\231\231\231\377\10\10\10\377\0\0\0\377\0\0&\377\0\0*\377\0\0\0\377\0\0\0"
	"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
	"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
	"\0\0\377\0\0\0\377\0\0\0\377\0\1\1\377\0\2\2\377\0\0\0\377\0\2\2\377\0\3"
	"\3\377\0\3\3\377\0\0\20\377\0\2\34\377\0\3&\377\0\2" "5\377\0\1\3\377\"\""
	"#\377\231\231\231\377\350\346\217\377\374\374\23\377\377\377\1\377\375\375"
	"W\377\374\374\374\377\372\372\367\377\221\221-\377\0\0\1\377\0\0\2\377\0"
	"\0" "1\377\0\0b\377\0\13\272\377\0Y\315\377\0M\316\377\0\37\314\377\0\0\227"
	"\377\0\0\214\377\0\0\3\377\3\3\3\377\1\1\1\377\0\0\0\377FFF\377\2\2\4\377"
	"\0\0\3\377\0\0\2\377999\377\23\23\23\377\3\3\3\377\0\0\0\377\0\0\0\377\0"
	"\0\1\377\0\0K\377\0\0\3\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
	"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
	"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
	"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\7\377\0\0\13\377\0\0"
	"\17\377\0\0\25\377\0\0\0\377\34\35\34\377PPP\377cc\31\377ll\0\377\206\206"
	"\0\377\377\377%\377\377\377l\377\232\232j\377\23\23\23\377\0\0\0\377\0\0"
	"\0\377\0\0\0\377\0\0\0\377\0\0G\377\0\0V\377\0\5V\377\0\15V\377\0\0\37\377"
	"\0\0\206\377\0\0Z\377\0\0" "9\377\0\0\15\377\0\0\0\377\0\0\0\377\0\0\0\377"
	"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
	"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
	"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
	"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
	"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
	"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\27\27\0\377\314"
	"\314\3\377\372\372\12\377\236\236\0\377\14\14\0\377\0\0\0\377\0\0\0\377\0"
	"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
	"\0\377\0\0W\377\0\0\220\377\0\0]\377\0\0\24\377\0\0\0\377\0\0\0\377\0\0\0"
	"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
	"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
	"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
	"\0\377\15\15\15\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
	"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
	"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377FF\0\377"
	"\343\343\35\377\216\216k\377\25\25\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
	"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\17\377\0\0\27\377\0"
	"\0\1\377\0\0u\377\0\0\27\377\0\0\15\377\0\0\3\377\0\0\0\377\0\0\0\377\0\0"
	"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
	"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
	"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\15"
	"\15\15\377\40\40\40\377!!!\377###\377\15\15\15\377\0\0\0\377\0\0\0\377\0"
	"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
	"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\315\315"
	"3\377\240\240\7\377\4\4\4\377\0\0\0\377\0\0\0\377\0\0\2\377\5\5\363\377\6"
	"\6\371\377\6\6\371\377\6\6\371\377\6\6\371\377\0\0#\377\3\3\231\377\6\6\371"
	"\377\6\6\371\377\6\6\371\377\6\6\371\377\0\0\"\377\3\3\207\377\6\6\371\377"
	"\6\6\371\377\5\5\363\377\4\4\250\377\0\0\2\377\5\5\351\377\5\5\352\377\0"
	"\0\17\377\0\0\17\377\5\5\352\377\5\5\347\377\0\0\0\377\0\0\0\377\0\0\0\377"
	"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\15"
	"\15\15\377###\377!!!\377\40\40\40\377:::\377(((\377\36\36\36\377!!!\377\26"
	"\26\26\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
	"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
	"\0\377\0``\377\314\341\322\377\226\226\30\377\\\\\0\377\0\0\0\377\0\0\0\377"
	"\0\0\12\377\5\5\365\377\1\1" "2\377\6\6\371\377\1\1R\377\5\5\325\377\1\1" "0"
	"\377\0\0\14\377\6\6\371\377\1\1E\377\3\3\202\377\5\5\335\377\0\0\33\377\0"
	"\0\16\377\6\6\371\377\1\1H\377\1\1I\377\6\6\371\377\0\0\37\377\2\2v\377\6"
	"\6\371\377\2\2]\377\2\2[\377\6\6\371\377\2\2u\377\0\0\0\377\0\0\0\377\0\0"
	"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\26\26"
	"\26\377!!!\377\37\37\37\377(((\377:::\377\0\0\0\0aaa\377===\377###\377!!"
	"!\377\36\36\36\377\15\15\15\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
	"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
	"\0\377\0CC\377m|W\377\315\315\11\377@@\0\377\0\0\0\377\0\0\0\377\0\0\7\377"
	"\4\4\253\377\0\0\0\377\6\6\371\377\0\0'\377\3\3\222\377\0\0!\377\0\0\0\377"
	"\6\6\371\377\6\6\371\377\6\6\371\377\0\0'\377\0\0\0\377\0\0\0\377\6\6\371"
	"\377\6\6\371\377\6\6\371\377\3\3\245\377\0\0\0\377\2\2j\377\4\4\303\377\4"
	"\4\262\377\4\4\255\377\4\4\303\377\2\2i\377\0\0\0\377\0\0\0\377\0\0\0\377"
	"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\15\15\15\377\36\36\36\377!!!\377"
	"###\377===\377aaa\377\0\0\0\0\0\0\0\0\0\0\0\0}}}\377SSS\377222\377\36\36"
	"\36\377!!!\377\36\36\36\377\15\15\15\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
	"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
	"\0\377\257\257\0\377==\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
	"\0\377\0\0\0\377\6\6\371\377\0\0'\377\0\0\0\377\0\0\0\377\0\0\0\377\6\6\371"
	"\377\1\1E\377\4\4\305\377\3\3\210\377\0\0\11\377\0\0\0\377\6\6\371\377\1"
	"\1R\377\5\5\354\377\3\3\216\377\0\0\0\377\2\2t\377\3\3\233\377\4\4\306\377"
	"\4\4\302\377\3\3\234\377\2\2s\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
	"\0\0\0\377\15\15\15\377###\377\"\"\"\377\36\36\36\377222\377RRR\377}}}\377"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0ooo\377KKK\377///\377\36"
	"\36\36\377!!!\377\33\33\33\377\26\26\26\377\0\0\0\377\0\0\0\377\0\0\0\377"
	"\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\207\207\0\377"
	"\1\1\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\12\377\1\1" "2\377"
	"\6\6\371\377\1\1R\377\0\0\22\377\0\0\0\377\0\0\15\377\6\6\371\377\1\1H\377"
	"\0\0'\377\6\6\371\377\0\0'\377\0\0\21\377\6\6\371\377\1\1:\377\2\2{\377\5"
	"\5\353\377\0\0\36\377\3\3\214\377\4\4\246\377\1\1D\377\1\1C\377\4\4\246\377"
	"\3\3\213\377\0\0\0\377\0\0\0\377\0\0\0\377\26\26\26\377\33\33\33\377!!!\377"
	"\36\36\36\377///\377JJJ\377ooo\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0mmm\377LLL\377333\377\"\"\"\377"
	"\37\37\37\377\"\"\"\377###\377\26\26\26\377\0\0\0\377\0\0\0\377\0\0\0\377"
	"\0\0\0\377\0\0\0\377\0\0\0\377\\\\\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
	"\0\0\377\0\0\0\377\2\2\\\377\6\6\371\377\6\6\371\377\6\6\371\377\3\3\202"
	"\377\0\0\0\377\3\3\201\377\6\6\371\377\6\6\371\377\6\6\371\377\6\6\371\377"
	"\0\0!\377\3\3\205\377\6\6\371\377\4\4\275\377\0\0\14\377\5\5\342\377\4\4"
	"\272\377\5\5\351\377\5\5\370\377\0\0%\377\0\0&\377\6\6\371\377\5\5\352\377"
	"\26\26\26\377###\377\"\"\"\377\37\37\37\377!!!\377333\377LLL\377mmm\377\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0uuu\377WWW\377>>>\377+++\377\36\36"
	"\36\377\37\37\37\377\"\"\"\377\36\36\36\377\26\26\26\377\15\15\15\377\15"
	"\15\15\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
	"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
	"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0"
	"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\15\15\15\377\15\15"
	"\15\377\26\26\26\377\36\36\36\377\"\"\"\377\37\37\37\377\36\36\36\377+++"
	"\377>>>\377WWW\377uuu\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0jjj\377RRR\377>>>\377---\377!!!\377\36\36"
	"\36\377\40\40\40\377\"\"\"\377\33\33\33\377###\377\26\26\26\377\15\15\15"
	"\377\15\15\15\377\15\15\15\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0"
	"\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0"
	"\0\377\0\0\0\377\0\0\0\377\0\0\0\377\15\15\15\377\15\15\15\377\26\26\26\377"
	"###\377\33\33\33\377\"\"\"\377\40\40\40\377\36\36\36\377!!!\377---\377>>"
	">\377QQQ\377jjj\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0ooo\377ZZZ\377III\377;;;\377...\377%%%\377\36\36\36\377\36\36\36\377\37"
	"\37\37\377\40\40\40\377\"\"\"\377\"\"\"\377!!!\377\33\33\33\377\36\36\36"
	"\377###\377###\377###\377###\377###\377###\377\36\36\36\377\33\33\33\377"
	"!!!\377\"\"\"\377\"\"\"\377\40\40\40\377\37\37\37\377\36\36\36\377\36\36"
	"\36\377%%%\377...\377;;;\377III\377YYY\377nnn\377\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0rrr\377bbb\377UUU\377JJJ\377AAA\377:::\377222\377---\377"
	"(((\377$$$\377!!!\377\37\37\37\377\36\36\36\377\35\35\35\377\35\35\35\377"
	"\36\36\36\377\37\37\37\377!!!\377$$$\377(((\377---\377222\377999\377AAA\377"
	"JJJ\377UUU\377bbb\377rrr\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0xxx\377ooo\377hhh\377bbb\377]]]\377ZZZ\377WWW\377VVV\377VVV\377WWW\377"
	"ZZZ\377]]]\377bbb\377hhh\377ooo\377xxx\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
	,
deuce's avatar
deuce committed
737
738
};

739
char *output_types[] = {
Deucе's avatar
Deucе committed
740
	"Autodetect"
741
#ifdef __unix__
Deucе's avatar
Deucе committed
742
	" (X11, SDL, Curses)"
743
#elif defined(_WIN32)
Deucе's avatar
Deucе committed
744
	" (SDL, Console, ANSI)"
745
746
#endif
#ifdef __unix__
747
748
749
	, "Curses",
	"Curses on cp437 Device",
	"Curses using US-ASCII"
750
#endif
Deucе's avatar
Deucе committed
751
	, "ANSI"
752
#if defined(__unix__) && !defined(NO_X)
Deucе's avatar
Deucе committed
753
	, "X11"
754
755
#endif
#ifdef _WIN32
756
757
	, "Win32 Console",
	"Win32 Console Fullscreen"
758
#endif
759
#if defined(WITH_SDL) || defined(WITH_SDL_AUDIO)
760
761
	, "SDL",
	"SDL Fullscreen"
762
#endif
Deucе's avatar
Deucе committed
763
764
	, NULL
};
765
int   output_map[] = {
Deucе's avatar
Deucе committed
766
	CIOLIB_MODE_AUTO
767
#ifdef __unix__
768
769
770
	, CIOLIB_MODE_CURSES,
	CIOLIB_MODE_CURSES_IBM,
	CIOLIB_MODE_CURSES_ASCII
771
#endif
Deucе's avatar
Deucе committed
772
	, CIOLIB_MODE_ANSI
773
#if defined(__unix__) && !defined(NO_X)
Deucе's avatar
Deucе committed
774
	, CIOLIB_MODE_X
775
776
#endif
#ifdef _WIN32
777
778
	, CIOLIB_MODE_CONIO,
	CIOLIB_MODE_CONIO_FULLSCREEN
779
#endif
780
#if defined(WITH_SDL) || defined(WITH_SDL_AUDIO)
781
782
	, CIOLIB_MODE_SDL,
	CIOLIB_MODE_SDL_FULLSCREEN
783
#endif
Deucе's avatar
Deucе committed
784
785
	, 0
};
786
char *output_descrs[] = {
787
788
789
790
791
792
793
794
795
796
797
	"Autodetect",
	"Curses",
	"Curses on cp437 Device",
	"Curses using US-ASCII",
	"ANSI",
	"X11",
	"Win32 Console",
	"Win32 Console Fullscreen",
	"SDL",
	"SDL Fullscreen",
	NULL
Deucе's avatar
Deucе committed
798
799
};

800
char *output_enum[] = {
801
802
803
804
805
806
807
808
809
810
811
	"Autodetect",
	"Curses",
	"Curses437",
	"CursesAscii",
	"ANSI",
	"X11",
	"WinConsole",
	"WinConsoleFullscreen",
	"SDL",
	"SDLFullscreen",
	NULL
Deucе's avatar
Deucе committed
812
};
813

Deucе's avatar
Deucе committed
814
815
bool
check_exit(bool force)
816
817
818
{
	if (force || (uifc.exit_flags & UIFC_XF_QUIT)) {
		if (settings.confirm_close) {
Deucе's avatar
Deucе committed
819
			if (!confirm("Are you sure you want to exit?", NULL))
820
821
				return false;
		}
Deucе's avatar
Deucе committed
822
		quitting = false;
823
		return true;
824
	}
825
	return false;
826
}
827

Deucе's avatar
Deucе committed
828
void
829
parse_url(char *url, struct bbslist *bbs, int dflt_conn_type, int force_defaults)
830
{
831
	char             *p1, *p2, *p3;
Deucе's avatar
Deucе committed
832

833
834
835
#define BBSLIST_SIZE ((MAX_OPTS + 1) * sizeof(struct bbslist *))
	struct  bbslist **list;
	int               listcount = 0, i;
Deucе's avatar
Deucе committed
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850

	bbs->id = -1;
	bbs->added = time(NULL);
	bbs->calls = 0;
	bbs->type = USER_BBSLIST;
	if (force_defaults) {
		bbs->user[0] = 0;
		bbs->password[0] = 0;
		bbs->screen_mode = SCREEN_MODE_CURRENT;
		bbs->conn_type = dflt_conn_type;
		bbs->port = conn_ports[dflt_conn_type];
		bbs->xfer_loglevel = LOG_INFO;
		bbs->telnet_loglevel = LOG_INFO;
		bbs->music = CTERM_MUSIC_BANSI;
		strcpy(bbs->font, "Codepage 437 English");
851
	}
Deucе's avatar
Deucе committed
852
853
854
855
856
	p1 = url;
	if (!strnicmp("rlogin://", url, 9)) {
		bbs->conn_type = CONN_TYPE_RLOGIN;
		bbs->port = conn_ports[bbs->conn_type];
		p1 = url + 9;
857
	}
Deucе's avatar
Deucе committed
858
859
860
861
	else if (!strnicmp("ssh://", url, 6)) {
		bbs->conn_type = CONN_TYPE_SSH;
		bbs->port = conn_ports[bbs->conn_type];
		p1 = url + 6;
862
	}
Deucе's avatar
Deucе committed
863
864
865
866
	else if (!strnicmp("telnet://", url, 9)) {
		bbs->conn_type = CONN_TYPE_TELNET;
		bbs->port = conn_ports[bbs->conn_type];
		p1 = url + 9;
867
	}
Deucе's avatar
Deucе committed
868
869
870
871
	else if (!strnicmp("raw://", url, 6)) {
		bbs->conn_type = CONN_TYPE_TELNET;
		bbs->port = conn_ports[bbs->conn_type];
		p1 = url + 6;
872
	}
Deucе's avatar
Deucе committed
873
874
875
876
	else if (!strnicmp("shell:", url, 6)) {
		bbs->conn_type = CONN_TYPE_SHELL;
		bbs->port = conn_ports[bbs->conn_type];
		p1 = url + 6;
877
	}
Deucе's avatar
Deucе committed
878
879
880
881
	else if (!strnicmp("ghost://", url, 8)) {
		bbs->conn_type = CONN_TYPE_MBBS_GHOST;
		bbs->port = conn_ports[bbs->conn_type];
		p1 = url + 8;
882
	}
Deucе's avatar
Deucе committed
883
884
885
886
887
888
889
890

        /* ToDo: RFC2806 */
	p3 = strchr(p1, '@');
	if (p3 != NULL) {
		*p3 = 0;
		p2 = strchr(p1, ':');
		if (p2 != NULL) {
			*p2 = 0;
891
			p2++;
Deucе's avatar
Deucе committed
892
			SAFECOPY(bbs->password, p2);
893
		}
Deucе's avatar
Deucе committed
894
895
		SAFECOPY(bbs->user, p1);
		p1 = p3 + 1;
896
	}
897
	p2 = p1;
Deucе's avatar
Deucе committed
898
899
900
	if (*p1 == '[') {
		p2 = strchr(p1, ']');
		if (p2 != NULL) {
901
			p1++;
Deucе's avatar
Deucе committed
902
			*p2 = 0;
903
904
			p2++;
		}
Deucе's avatar
Deucе committed
905
		else {
906
			p2 = p1;
Deucе's avatar
Deucе committed
907
		}
908
	}
909
	if (bbs->conn_type == CONN_TYPE_MBBS_GHOST) {
Deucе's avatar
Deucе committed
910
911
912
913
		p3 = strrchr(p1, '/');
		if (p3 != NULL) {
			*p3 = 0;
			SAFECOPY(bbs->ghost_program, p3 + 1);
914
		}
915
	}
Deucе's avatar
Deucе committed
916
917
918
919
	SAFECOPY(bbs->name, p1);
	p2 = strrchr(p2, ':');
	if (p2 != NULL) {
		*p2 = 0;
920
		p2++;
Deucе's avatar
Deucе committed
921
		bbs->port = atoi(p2);
922
	}
Deucе's avatar
Deucе committed
923
	SAFECOPY(bbs->addr, p1);
924

Deucе's avatar
Deucе committed
925
        /* Find BBS listing in users phone book */
926
	list = calloc(1, BBSLIST_SIZE);
deuce's avatar
deuce committed
927
	read_list(settings.list_path, &list[0], NULL, &listcount, USER_BBSLIST);
Deucе's avatar
Deucе committed
928
929
930
931
932
933
934
	for (i = 0; i < listcount; i++) {
		if ((stricmp(bbs->addr, list[i]->addr) == 0)
		    && (bbs->port == list[i]->port)
		    && (bbs->conn_type == list[i]->conn_type)
		    && ((bbs->user[0] == 0) || (stricmp(bbs->name, list[i]->name) == 0))
		    && ((bbs->password[0] == 0) || (stricmp(bbs->password, list[i]->password) == 0))) {
			memcpy(bbs, list[i], sizeof(struct bbslist));
deuce's avatar
deuce committed
935
			break;
936
937
		}
	}
Deucе's avatar
Deucе committed
938
939
940
941
	if (i == listcount) {
		for (i = 0; i < listcount; i++) {
			if (stricmp(bbs->name, list[i]->name) == 0) {
				memcpy(bbs, list[i], sizeof(struct bbslist));
942
943
944
945
				break;
			}
		}
	}
Deucе's avatar
Deucе committed
946
	free_list(&list[0], listcount);
947
	free(list);
948
949
}

deuce's avatar
deuce committed
950
#if defined(__APPLE__) && defined(__MACH__)
951

952
953
static char *
get_new_OSX_filename(char *fn, int fnlen, int type, int shared)
deuce's avatar
deuce committed
954
{
Deucе's avatar
Deucе committed
955
956
957
958
959
960
	FSRef ref;

        /* First, get the path */
	switch (type) {
		case SYNCTERM_PATH_INI:
		case SYNCTERM_PATH_LIST:
961
962
			if (FSFindFolder(shared ? kLocalDomain : kUserDomain, kPreferencesFolderType, kCreateFolder,
			    &ref) != noErr)
Deucе's avatar
Deucе committed
963
				return NULL;
964
			if (FSRefMakePath(&ref, (unsigned char *)fn, fnlen) != noErr)
Deucе's avatar
Deucе committed
965
966
967
968
969
970
971
972
973
974
975
976
				return NULL;
			backslash(fn);
			strncat(fn, "SyncTERM", fnlen - strlen(fn) - 1);
			backslash(fn);
			if (!isdir(fn)) {
				if (MKDIR(fn))
					return NULL;
			}
			break;

		case SYNCTERM_DEFAULT_TRANSFER_PATH:
                        /* I'd love to use the "right" setting here, but don't know how */
977
978
			if (FSFindFolder(shared ? kLocalDomain : kUserDomain, kDownloadsFolderType, kCreateFolder,
			    &ref) != noErr)
Deucе's avatar
Deucе committed
979
				return NULL;
980
			if (FSRefMakePath(&ref, (unsigned char *)fn, fnlen) != noErr)
Deucе's avatar
Deucе committed
981
982
983
984
985
986
987
988
				return NULL;
			backslash(fn);
			if (!isdir(fn)) {
				if (MKDIR(fn))
					return NULL;
			}
			return fn;
		case SYNCTERM_PATH_CACHE:
989
990
			if (FSFindFolder(shared ? kLocalDomain : kUserDomain, kCachedDataFolderType, kCreateFolder,
			    &ref) != noErr)
Deucе's avatar
Deucе committed
991
				return NULL;
992
			if (FSRefMakePath(&ref, (unsigned char *)fn, fnlen) != noErr)
Deucе's avatar
Deucе committed
993
994
995
				return NULL;
			backslash(fn);
			return fn;
deuce's avatar
deuce committed
996
997
	}

Deucе's avatar
Deucе committed
998
999
1000
	switch (type) {
		case SYNCTERM_PATH_INI:
			strncat(fn, "SyncTERM.ini", fnlen - strlen(fn) - 1);
For faster browsing, not all history is shown. View entire blame