aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Model/Services/HttpUtility.cs
blob: be180334c635a5baa38adbe2a84e241a6901447f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
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
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;

namespace MediaBrowser.Model.Services
{
    public static class MyHttpUtility
    {
        // Must be sorted
        static readonly long[] entities = new long[] {
            (long)'A' << 56 | (long)'E' << 48 | (long)'l' << 40 | (long)'i' << 32 | (long)'g' << 24,
            (long)'A' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16,
            (long)'A' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24,
            (long)'A' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16,
            (long)'A' << 56 | (long)'l' << 48 | (long)'p' << 40 | (long)'h' << 32 | (long)'a' << 24,
            (long)'A' << 56 | (long)'r' << 48 | (long)'i' << 40 | (long)'n' << 32 | (long)'g' << 24,
            (long)'A' << 56 | (long)'t' << 48 | (long)'i' << 40 | (long)'l' << 32 | (long)'d' << 24 | (long)'e' << 16,
            (long)'A' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32,
            (long)'B' << 56 | (long)'e' << 48 | (long)'t' << 40 | (long)'a' << 32,
            (long)'C' << 56 | (long)'c' << 48 | (long)'e' << 40 | (long)'d' << 32 | (long)'i' << 24 | (long)'l' << 16,
            (long)'C' << 56 | (long)'h' << 48 | (long)'i' << 40,
            (long)'D' << 56 | (long)'a' << 48 | (long)'g' << 40 | (long)'g' << 32 | (long)'e' << 24 | (long)'r' << 16,
            (long)'D' << 56 | (long)'e' << 48 | (long)'l' << 40 | (long)'t' << 32 | (long)'a' << 24,
            (long)'E' << 56 | (long)'T' << 48 | (long)'H' << 40,
            (long)'E' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16,
            (long)'E' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24,
            (long)'E' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16,
            (long)'E' << 56 | (long)'p' << 48 | (long)'s' << 40 | (long)'i' << 32 | (long)'l' << 24 | (long)'o' << 16 | (long)'n' << 8,
            (long)'E' << 56 | (long)'t' << 48 | (long)'a' << 40,
            (long)'E' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32,
            (long)'G' << 56 | (long)'a' << 48 | (long)'m' << 40 | (long)'m' << 32 | (long)'a' << 24,
            (long)'I' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16,
            (long)'I' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24,
            (long)'I' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16,
            (long)'I' << 56 | (long)'o' << 48 | (long)'t' << 40 | (long)'a' << 32,
            (long)'I' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32,
            (long)'K' << 56 | (long)'a' << 48 | (long)'p' << 40 | (long)'p' << 32 | (long)'a' << 24,
            (long)'L' << 56 | (long)'a' << 48 | (long)'m' << 40 | (long)'b' << 32 | (long)'d' << 24 | (long)'a' << 16,
            (long)'M' << 56 | (long)'u' << 48,
            (long)'N' << 56 | (long)'t' << 48 | (long)'i' << 40 | (long)'l' << 32 | (long)'d' << 24 | (long)'e' << 16,
            (long)'N' << 56 | (long)'u' << 48,
            (long)'O' << 56 | (long)'E' << 48 | (long)'l' << 40 | (long)'i' << 32 | (long)'g' << 24,
            (long)'O' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16,
            (long)'O' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24,
            (long)'O' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16,
            (long)'O' << 56 | (long)'m' << 48 | (long)'e' << 40 | (long)'g' << 32 | (long)'a' << 24,
            (long)'O' << 56 | (long)'m' << 48 | (long)'i' << 40 | (long)'c' << 32 | (long)'r' << 24 | (long)'o' << 16 | (long)'n' << 8,
            (long)'O' << 56 | (long)'s' << 48 | (long)'l' << 40 | (long)'a' << 32 | (long)'s' << 24 | (long)'h' << 16,
            (long)'O' << 56 | (long)'t' << 48 | (long)'i' << 40 | (long)'l' << 32 | (long)'d' << 24 | (long)'e' << 16,
            (long)'O' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32,
            (long)'P' << 56 | (long)'h' << 48 | (long)'i' << 40,
            (long)'P' << 56 | (long)'i' << 48,
            (long)'P' << 56 | (long)'r' << 48 | (long)'i' << 40 | (long)'m' << 32 | (long)'e' << 24,
            (long)'P' << 56 | (long)'s' << 48 | (long)'i' << 40,
            (long)'R' << 56 | (long)'h' << 48 | (long)'o' << 40,
            (long)'S' << 56 | (long)'c' << 48 | (long)'a' << 40 | (long)'r' << 32 | (long)'o' << 24 | (long)'n' << 16,
            (long)'S' << 56 | (long)'i' << 48 | (long)'g' << 40 | (long)'m' << 32 | (long)'a' << 24,
            (long)'T' << 56 | (long)'H' << 48 | (long)'O' << 40 | (long)'R' << 32 | (long)'N' << 24,
            (long)'T' << 56 | (long)'a' << 48 | (long)'u' << 40,
            (long)'T' << 56 | (long)'h' << 48 | (long)'e' << 40 | (long)'t' << 32 | (long)'a' << 24,
            (long)'U' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16,
            (long)'U' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24,
            (long)'U' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16,
            (long)'U' << 56 | (long)'p' << 48 | (long)'s' << 40 | (long)'i' << 32 | (long)'l' << 24 | (long)'o' << 16 | (long)'n' << 8,
            (long)'U' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32,
            (long)'X' << 56 | (long)'i' << 48,
            (long)'Y' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16,
            (long)'Y' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32,
            (long)'Z' << 56 | (long)'e' << 48 | (long)'t' << 40 | (long)'a' << 32,
            (long)'a' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16,
            (long)'a' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24,
            (long)'a' << 56 | (long)'c' << 48 | (long)'u' << 40 | (long)'t' << 32 | (long)'e' << 24,
            (long)'a' << 56 | (long)'e' << 48 | (long)'l' << 40 | (long)'i' << 32 | (long)'g' << 24,
            (long)'a' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16,
            (long)'a' << 56 | (long)'l' << 48 | (long)'e' << 40 | (long)'f' << 32 | (long)'s' << 24 | (long)'y' << 16 | (long)'m' << 8,
            (long)'a' << 56 | (long)'l' << 48 | (long)'p' << 40 | (long)'h' << 32 | (long)'a' << 24,
            (long)'a' << 56 | (long)'m' << 48 | (long)'p' << 40,
            (long)'a' << 56 | (long)'n' << 48 | (long)'d' << 40,
            (long)'a' << 56 | (long)'n' << 48 | (long)'g' << 40,
            (long)'a' << 56 | (long)'p' << 48 | (long)'o' << 40 | (long)'s' << 32,
            (long)'a' << 56 | (long)'r' << 48 | (long)'i' << 40 | (long)'n' << 32 | (long)'g' << 24,
            (long)'a' << 56 | (long)'s' << 48 | (long)'y' << 40 | (long)'m' << 32 | (long)'p' << 24,
            (long)'a' << 56 | (long)'t' << 48 | (long)'i' << 40 | (long)'l' << 32 | (long)'d' << 24 | (long)'e' << 16,
            (long)'a' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32,
            (long)'b' << 56 | (long)'d' << 48 | (long)'q' << 40 | (long)'u' << 32 | (long)'o' << 24,
            (long)'b' << 56 | (long)'e' << 48 | (long)'t' << 40 | (long)'a' << 32,
            (long)'b' << 56 | (long)'r' << 48 | (long)'v' << 40 | (long)'b' << 32 | (long)'a' << 24 | (long)'r' << 16,
            (long)'b' << 56 | (long)'u' << 48 | (long)'l' << 40 | (long)'l' << 32,
            (long)'c' << 56 | (long)'a' << 48 | (long)'p' << 40,
            (long)'c' << 56 | (long)'c' << 48 | (long)'e' << 40 | (long)'d' << 32 | (long)'i' << 24 | (long)'l' << 16,
            (long)'c' << 56 | (long)'e' << 48 | (long)'d' << 40 | (long)'i' << 32 | (long)'l' << 24,
            (long)'c' << 56 | (long)'e' << 48 | (long)'n' << 40 | (long)'t' << 32,
            (long)'c' << 56 | (long)'h' << 48 | (long)'i' << 40,
            (long)'c' << 56 | (long)'i' << 48 | (long)'r' << 40 | (long)'c' << 32,
            (long)'c' << 56 | (long)'l' << 48 | (long)'u' << 40 | (long)'b' << 32 | (long)'s' << 24,
            (long)'c' << 56 | (long)'o' << 48 | (long)'n' << 40 | (long)'g' << 32,
            (long)'c' << 56 | (long)'o' << 48 | (long)'p' << 40 | (long)'y' << 32,
            (long)'c' << 56 | (long)'r' << 48 | (long)'a' << 40 | (long)'r' << 32 | (long)'r' << 24,
            (long)'c' << 56 | (long)'u' << 48 | (long)'p' << 40,
            (long)'c' << 56 | (long)'u' << 48 | (long)'r' << 40 | (long)'r' << 32 | (long)'e' << 24 | (long)'n' << 16,
            (long)'d' << 56 | (long)'A' << 48 | (long)'r' << 40 | (long)'r' << 32,
            (long)'d' << 56 | (long)'a' << 48 | (long)'g' << 40 | (long)'g' << 32 | (long)'e' << 24 | (long)'r' << 16,
            (long)'d' << 56 | (long)'a' << 48 | (long)'r' << 40 | (long)'r' << 32,
            (long)'d' << 56 | (long)'e' << 48 | (long)'g' << 40,
            (long)'d' << 56 | (long)'e' << 48 | (long)'l' << 40 | (long)'t' << 32 | (long)'a' << 24,
            (long)'d' << 56 | (long)'i' << 48 | (long)'a' << 40 | (long)'m' << 32 | (long)'s' << 24,
            (long)'d' << 56 | (long)'i' << 48 | (long)'v' << 40 | (long)'i' << 32 | (long)'d' << 24 | (long)'e' << 16,
            (long)'e' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16,
            (long)'e' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24,
            (long)'e' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16,
            (long)'e' << 56 | (long)'m' << 48 | (long)'p' << 40 | (long)'t' << 32 | (long)'y' << 24,
            (long)'e' << 56 | (long)'m' << 48 | (long)'s' << 40 | (long)'p' << 32,
            (long)'e' << 56 | (long)'n' << 48 | (long)'s' << 40 | (long)'p' << 32,
            (long)'e' << 56 | (long)'p' << 48 | (long)'s' << 40 | (long)'i' << 32 | (long)'l' << 24 | (long)'o' << 16 | (long)'n' << 8,
            (long)'e' << 56 | (long)'q' << 48 | (long)'u' << 40 | (long)'i' << 32 | (long)'v' << 24,
            (long)'e' << 56 | (long)'t' << 48 | (long)'a' << 40,
            (long)'e' << 56 | (long)'t' << 48 | (long)'h' << 40,
            (long)'e' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32,
            (long)'e' << 56 | (long)'u' << 48 | (long)'r' << 40 | (long)'o' << 32,
            (long)'e' << 56 | (long)'x' << 48 | (long)'i' << 40 | (long)'s' << 32 | (long)'t' << 24,
            (long)'f' << 56 | (long)'n' << 48 | (long)'o' << 40 | (long)'f' << 32,
            (long)'f' << 56 | (long)'o' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'l' << 24 | (long)'l' << 16,
            (long)'f' << 56 | (long)'r' << 48 | (long)'a' << 40 | (long)'c' << 32 | (long)'1' << 24 | (long)'2' << 16,
            (long)'f' << 56 | (long)'r' << 48 | (long)'a' << 40 | (long)'c' << 32 | (long)'1' << 24 | (long)'4' << 16,
            (long)'f' << 56 | (long)'r' << 48 | (long)'a' << 40 | (long)'c' << 32 | (long)'3' << 24 | (long)'4' << 16,
            (long)'f' << 56 | (long)'r' << 48 | (long)'a' << 40 | (long)'s' << 32 | (long)'l' << 24,
            (long)'g' << 56 | (long)'a' << 48 | (long)'m' << 40 | (long)'m' << 32 | (long)'a' << 24,
            (long)'g' << 56 | (long)'e' << 48,
            (long)'g' << 56 | (long)'t' << 48,
            (long)'h' << 56 | (long)'A' << 48 | (long)'r' << 40 | (long)'r' << 32,
            (long)'h' << 56 | (long)'a' << 48 | (long)'r' << 40 | (long)'r' << 32,
            (long)'h' << 56 | (long)'e' << 48 | (long)'a' << 40 | (long)'r' << 32 | (long)'t' << 24 | (long)'s' << 16,
            (long)'h' << 56 | (long)'e' << 48 | (long)'l' << 40 | (long)'l' << 32 | (long)'i' << 24 | (long)'p' << 16,
            (long)'i' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16,
            (long)'i' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24,
            (long)'i' << 56 | (long)'e' << 48 | (long)'x' << 40 | (long)'c' << 32 | (long)'l' << 24,
            (long)'i' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16,
            (long)'i' << 56 | (long)'m' << 48 | (long)'a' << 40 | (long)'g' << 32 | (long)'e' << 24,
            (long)'i' << 56 | (long)'n' << 48 | (long)'f' << 40 | (long)'i' << 32 | (long)'n' << 24,
            (long)'i' << 56 | (long)'n' << 48 | (long)'t' << 40,
            (long)'i' << 56 | (long)'o' << 48 | (long)'t' << 40 | (long)'a' << 32,
            (long)'i' << 56 | (long)'q' << 48 | (long)'u' << 40 | (long)'e' << 32 | (long)'s' << 24 | (long)'t' << 16,
            (long)'i' << 56 | (long)'s' << 48 | (long)'i' << 40 | (long)'n' << 32,
            (long)'i' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32,
            (long)'k' << 56 | (long)'a' << 48 | (long)'p' << 40 | (long)'p' << 32 | (long)'a' << 24,
            (long)'l' << 56 | (long)'A' << 48 | (long)'r' << 40 | (long)'r' << 32,
            (long)'l' << 56 | (long)'a' << 48 | (long)'m' << 40 | (long)'b' << 32 | (long)'d' << 24 | (long)'a' << 16,
            (long)'l' << 56 | (long)'a' << 48 | (long)'n' << 40 | (long)'g' << 32,
            (long)'l' << 56 | (long)'a' << 48 | (long)'q' << 40 | (long)'u' << 32 | (long)'o' << 24,
            (long)'l' << 56 | (long)'a' << 48 | (long)'r' << 40 | (long)'r' << 32,
            (long)'l' << 56 | (long)'c' << 48 | (long)'e' << 40 | (long)'i' << 32 | (long)'l' << 24,
            (long)'l' << 56 | (long)'d' << 48 | (long)'q' << 40 | (long)'u' << 32 | (long)'o' << 24,
            (long)'l' << 56 | (long)'e' << 48,
            (long)'l' << 56 | (long)'f' << 48 | (long)'l' << 40 | (long)'o' << 32 | (long)'o' << 24 | (long)'r' << 16,
            (long)'l' << 56 | (long)'o' << 48 | (long)'w' << 40 | (long)'a' << 32 | (long)'s' << 24 | (long)'t' << 16,
            (long)'l' << 56 | (long)'o' << 48 | (long)'z' << 40,
            (long)'l' << 56 | (long)'r' << 48 | (long)'m' << 40,
            (long)'l' << 56 | (long)'s' << 48 | (long)'a' << 40 | (long)'q' << 32 | (long)'u' << 24 | (long)'o' << 16,
            (long)'l' << 56 | (long)'s' << 48 | (long)'q' << 40 | (long)'u' << 32 | (long)'o' << 24,
            (long)'l' << 56 | (long)'t' << 48,
            (long)'m' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'r' << 32,
            (long)'m' << 56 | (long)'d' << 48 | (long)'a' << 40 | (long)'s' << 32 | (long)'h' << 24,
            (long)'m' << 56 | (long)'i' << 48 | (long)'c' << 40 | (long)'r' << 32 | (long)'o' << 24,
            (long)'m' << 56 | (long)'i' << 48 | (long)'d' << 40 | (long)'d' << 32 | (long)'o' << 24 | (long)'t' << 16,
            (long)'m' << 56 | (long)'i' << 48 | (long)'n' << 40 | (long)'u' << 32 | (long)'s' << 24,
            (long)'m' << 56 | (long)'u' << 48,
            (long)'n' << 56 | (long)'a' << 48 | (long)'b' << 40 | (long)'l' << 32 | (long)'a' << 24,
            (long)'n' << 56 | (long)'b' << 48 | (long)'s' << 40 | (long)'p' << 32,
            (long)'n' << 56 | (long)'d' << 48 | (long)'a' << 40 | (long)'s' << 32 | (long)'h' << 24,
            (long)'n' << 56 | (long)'e' << 48,
            (long)'n' << 56 | (long)'i' << 48,
            (long)'n' << 56 | (long)'o' << 48 | (long)'t' << 40,
            (long)'n' << 56 | (long)'o' << 48 | (long)'t' << 40 | (long)'i' << 32 | (long)'n' << 24,
            (long)'n' << 56 | (long)'s' << 48 | (long)'u' << 40 | (long)'b' << 32,
            (long)'n' << 56 | (long)'t' << 48 | (long)'i' << 40 | (long)'l' << 32 | (long)'d' << 24 | (long)'e' << 16,
            (long)'n' << 56 | (long)'u' << 48,
            (long)'o' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16,
            (long)'o' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24,
            (long)'o' << 56 | (long)'e' << 48 | (long)'l' << 40 | (long)'i' << 32 | (long)'g' << 24,
            (long)'o' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16,
            (long)'o' << 56 | (long)'l' << 48 | (long)'i' << 40 | (long)'n' << 32 | (long)'e' << 24,
            (long)'o' << 56 | (long)'m' << 48 | (long)'e' << 40 | (long)'g' << 32 | (long)'a' << 24,
            (long)'o' << 56 | (long)'m' << 48 | (long)'i' << 40 | (long)'c' << 32 | (long)'r' << 24 | (long)'o' << 16 | (long)'n' << 8,
            (long)'o' << 56 | (long)'p' << 48 | (long)'l' << 40 | (long)'u' << 32 | (long)'s' << 24,
            (long)'o' << 56 | (long)'r' << 48,
            (long)'o' << 56 | (long)'r' << 48 | (long)'d' << 40 | (long)'f' << 32,
            (long)'o' << 56 | (long)'r' << 48 | (long)'d' << 40 | (long)'m' << 32,
            (long)'o' << 56 | (long)'s' << 48 | (long)'l' << 40 | (long)'a' << 32 | (long)'s' << 24 | (long)'h' << 16,
            (long)'o' << 56 | (long)'t' << 48 | (long)'i' << 40 | (long)'l' << 32 | (long)'d' << 24 | (long)'e' << 16,
            (long)'o' << 56 | (long)'t' << 48 | (long)'i' << 40 | (long)'m' << 32 | (long)'e' << 24 | (long)'s' << 16,
            (long)'o' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32,
            (long)'p' << 56 | (long)'a' << 48 | (long)'r' << 40 | (long)'a' << 32,
            (long)'p' << 56 | (long)'a' << 48 | (long)'r' << 40 | (long)'t' << 32,
            (long)'p' << 56 | (long)'e' << 48 | (long)'r' << 40 | (long)'m' << 32 | (long)'i' << 24 | (long)'l' << 16,
            (long)'p' << 56 | (long)'e' << 48 | (long)'r' << 40 | (long)'p' << 32,
            (long)'p' << 56 | (long)'h' << 48 | (long)'i' << 40,
            (long)'p' << 56 | (long)'i' << 48,
            (long)'p' << 56 | (long)'i' << 48 | (long)'v' << 40,
            (long)'p' << 56 | (long)'l' << 48 | (long)'u' << 40 | (long)'s' << 32 | (long)'m' << 24 | (long)'n' << 16,
            (long)'p' << 56 | (long)'o' << 48 | (long)'u' << 40 | (long)'n' << 32 | (long)'d' << 24,
            (long)'p' << 56 | (long)'r' << 48 | (long)'i' << 40 | (long)'m' << 32 | (long)'e' << 24,
            (long)'p' << 56 | (long)'r' << 48 | (long)'o' << 40 | (long)'d' << 32,
            (long)'p' << 56 | (long)'r' << 48 | (long)'o' << 40 | (long)'p' << 32,
            (long)'p' << 56 | (long)'s' << 48 | (long)'i' << 40,
            (long)'q' << 56 | (long)'u' << 48 | (long)'o' << 40 | (long)'t' << 32,
            (long)'r' << 56 | (long)'A' << 48 | (long)'r' << 40 | (long)'r' << 32,
            (long)'r' << 56 | (long)'a' << 48 | (long)'d' << 40 | (long)'i' << 32 | (long)'c' << 24,
            (long)'r' << 56 | (long)'a' << 48 | (long)'n' << 40 | (long)'g' << 32,
            (long)'r' << 56 | (long)'a' << 48 | (long)'q' << 40 | (long)'u' << 32 | (long)'o' << 24,
            (long)'r' << 56 | (long)'a' << 48 | (long)'r' << 40 | (long)'r' << 32,
            (long)'r' << 56 | (long)'c' << 48 | (long)'e' << 40 | (long)'i' << 32 | (long)'l' << 24,
            (long)'r' << 56 | (long)'d' << 48 | (long)'q' << 40 | (long)'u' << 32 | (long)'o' << 24,
            (long)'r' << 56 | (long)'e' << 48 | (long)'a' << 40 | (long)'l' << 32,
            (long)'r' << 56 | (long)'e' << 48 | (long)'g' << 40,
            (long)'r' << 56 | (long)'f' << 48 | (long)'l' << 40 | (long)'o' << 32 | (long)'o' << 24 | (long)'r' << 16,
            (long)'r' << 56 | (long)'h' << 48 | (long)'o' << 40,
            (long)'r' << 56 | (long)'l' << 48 | (long)'m' << 40,
            (long)'r' << 56 | (long)'s' << 48 | (long)'a' << 40 | (long)'q' << 32 | (long)'u' << 24 | (long)'o' << 16,
            (long)'r' << 56 | (long)'s' << 48 | (long)'q' << 40 | (long)'u' << 32 | (long)'o' << 24,
            (long)'s' << 56 | (long)'b' << 48 | (long)'q' << 40 | (long)'u' << 32 | (long)'o' << 24,
            (long)'s' << 56 | (long)'c' << 48 | (long)'a' << 40 | (long)'r' << 32 | (long)'o' << 24 | (long)'n' << 16,
            (long)'s' << 56 | (long)'d' << 48 | (long)'o' << 40 | (long)'t' << 32,
            (long)'s' << 56 | (long)'e' << 48 | (long)'c' << 40 | (long)'t' << 32,
            (long)'s' << 56 | (long)'h' << 48 | (long)'y' << 40,
            (long)'s' << 56 | (long)'i' << 48 | (long)'g' << 40 | (long)'m' << 32 | (long)'a' << 24,
            (long)'s' << 56 | (long)'i' << 48 | (long)'g' << 40 | (long)'m' << 32 | (long)'a' << 24 | (long)'f' << 16,
            (long)'s' << 56 | (long)'i' << 48 | (long)'m' << 40,
            (long)'s' << 56 | (long)'p' << 48 | (long)'a' << 40 | (long)'d' << 32 | (long)'e' << 24 | (long)'s' << 16,
            (long)'s' << 56 | (long)'u' << 48 | (long)'b' << 40,
            (long)'s' << 56 | (long)'u' << 48 | (long)'b' << 40 | (long)'e' << 32,
            (long)'s' << 56 | (long)'u' << 48 | (long)'m' << 40,
            (long)'s' << 56 | (long)'u' << 48 | (long)'p' << 40,
            (long)'s' << 56 | (long)'u' << 48 | (long)'p' << 40 | (long)'1' << 32,
            (long)'s' << 56 | (long)'u' << 48 | (long)'p' << 40 | (long)'2' << 32,
            (long)'s' << 56 | (long)'u' << 48 | (long)'p' << 40 | (long)'3' << 32,
            (long)'s' << 56 | (long)'u' << 48 | (long)'p' << 40 | (long)'e' << 32,
            (long)'s' << 56 | (long)'z' << 48 | (long)'l' << 40 | (long)'i' << 32 | (long)'g' << 24,
            (long)'t' << 56 | (long)'a' << 48 | (long)'u' << 40,
            (long)'t' << 56 | (long)'h' << 48 | (long)'e' << 40 | (long)'r' << 32 | (long)'e' << 24 | (long)'4' << 16,
            (long)'t' << 56 | (long)'h' << 48 | (long)'e' << 40 | (long)'t' << 32 | (long)'a' << 24,
            (long)'t' << 56 | (long)'h' << 48 | (long)'e' << 40 | (long)'t' << 32 | (long)'a' << 24 | (long)'s' << 16 | (long)'y' << 8 | (long)'m' << 0,
            (long)'t' << 56 | (long)'h' << 48 | (long)'i' << 40 | (long)'n' << 32 | (long)'s' << 24 | (long)'p' << 16,
            (long)'t' << 56 | (long)'h' << 48 | (long)'o' << 40 | (long)'r' << 32 | (long)'n' << 24,
            (long)'t' << 56 | (long)'i' << 48 | (long)'l' << 40 | (long)'d' << 32 | (long)'e' << 24,
            (long)'t' << 56 | (long)'i' << 48 | (long)'m' << 40 | (long)'e' << 32 | (long)'s' << 24,
            (long)'t' << 56 | (long)'r' << 48 | (long)'a' << 40 | (long)'d' << 32 | (long)'e' << 24,
            (long)'u' << 56 | (long)'A' << 48 | (long)'r' << 40 | (long)'r' << 32,
            (long)'u' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16,
            (long)'u' << 56 | (long)'a' << 48 | (long)'r' << 40 | (long)'r' << 32,
            (long)'u' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24,
            (long)'u' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16,
            (long)'u' << 56 | (long)'m' << 48 | (long)'l' << 40,
            (long)'u' << 56 | (long)'p' << 48 | (long)'s' << 40 | (long)'i' << 32 | (long)'h' << 24,
            (long)'u' << 56 | (long)'p' << 48 | (long)'s' << 40 | (long)'i' << 32 | (long)'l' << 24 | (long)'o' << 16 | (long)'n' << 8,
            (long)'u' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32,
            (long)'w' << 56 | (long)'e' << 48 | (long)'i' << 40 | (long)'e' << 32 | (long)'r' << 24 | (long)'p' << 16,
            (long)'x' << 56 | (long)'i' << 48,
            (long)'y' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16,
            (long)'y' << 56 | (long)'e' << 48 | (long)'n' << 40,
            (long)'y' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32,
            (long)'z' << 56 | (long)'e' << 48 | (long)'t' << 40 | (long)'a' << 32,
            (long)'z' << 56 | (long)'w' << 48 | (long)'j' << 40,
            (long)'z' << 56 | (long)'w' << 48 | (long)'n' << 40 | (long)'j' << 32
        };

        static readonly char[] entities_values = new char[] {
            '\u00C6', '\u00C1', '\u00C2', '\u00C0', '\u0391', '\u00C5', '\u00C3', '\u00C4', '\u0392', '\u00C7', '\u03A7',
            '\u2021', '\u0394', '\u00D0', '\u00C9', '\u00CA', '\u00C8', '\u0395', '\u0397', '\u00CB', '\u0393', '\u00CD',
            '\u00CE', '\u00CC', '\u0399', '\u00CF', '\u039A', '\u039B', '\u039C', '\u00D1', '\u039D', '\u0152', '\u00D3',
            '\u00D4', '\u00D2', '\u03A9', '\u039F', '\u00D8', '\u00D5', '\u00D6', '\u03A6', '\u03A0', '\u2033', '\u03A8',
            '\u03A1', '\u0160', '\u03A3', '\u00DE', '\u03A4', '\u0398', '\u00DA', '\u00DB', '\u00D9', '\u03A5', '\u00DC',
            '\u039E', '\u00DD', '\u0178', '\u0396', '\u00E1', '\u00E2', '\u00B4', '\u00E6', '\u00E0', '\u2135', '\u03B1',
            '\u0026', '\u2227', '\u2220', '\u0027', '\u00E5', '\u2248', '\u00E3', '\u00E4', '\u201E', '\u03B2', '\u00A6',
            '\u2022', '\u2229', '\u00E7', '\u00B8', '\u00A2', '\u03C7', '\u02C6', '\u2663', '\u2245', '\u00A9', '\u21B5',
            '\u222A', '\u00A4', '\u21D3', '\u2020', '\u2193', '\u00B0', '\u03B4', '\u2666', '\u00F7', '\u00E9', '\u00EA',
            '\u00E8', '\u2205', '\u2003', '\u2002', '\u03B5', '\u2261', '\u03B7', '\u00F0', '\u00EB', '\u20AC', '\u2203',
            '\u0192', '\u2200', '\u00BD', '\u00BC', '\u00BE', '\u2044', '\u03B3', '\u2265', '\u003E', '\u21D4', '\u2194',
            '\u2665', '\u2026', '\u00ED', '\u00EE', '\u00A1', '\u00EC', '\u2111', '\u221E', '\u222B', '\u03B9', '\u00BF',
            '\u2208', '\u00EF', '\u03BA', '\u21D0', '\u03BB', '\u2329', '\u00AB', '\u2190', '\u2308', '\u201C', '\u2264',
            '\u230A', '\u2217', '\u25CA', '\u200E', '\u2039', '\u2018', '\u003C', '\u00AF', '\u2014', '\u00B5', '\u00B7',
            '\u2212', '\u03BC', '\u2207', '\u00A0', '\u2013', '\u2260', '\u220B', '\u00AC', '\u2209', '\u2284', '\u00F1',
            '\u03BD', '\u00F3', '\u00F4', '\u0153', '\u00F2', '\u203E', '\u03C9', '\u03BF', '\u2295', '\u2228', '\u00AA',
            '\u00BA', '\u00F8', '\u00F5', '\u2297', '\u00F6', '\u00B6', '\u2202', '\u2030', '\u22A5', '\u03C6', '\u03C0',
            '\u03D6', '\u00B1', '\u00A3', '\u2032', '\u220F', '\u221D', '\u03C8', '\u0022', '\u21D2', '\u221A', '\u232A',
            '\u00BB', '\u2192', '\u2309', '\u201D', '\u211C', '\u00AE', '\u230B', '\u03C1', '\u200F', '\u203A', '\u2019',
            '\u201A', '\u0161', '\u22C5', '\u00A7', '\u00AD', '\u03C3', '\u03C2', '\u223C', '\u2660', '\u2282', '\u2286',
            '\u2211', '\u2283', '\u00B9', '\u00B2', '\u00B3', '\u2287', '\u00DF', '\u03C4', '\u2234', '\u03B8', '\u03D1',
            '\u2009', '\u00FE', '\u02DC', '\u00D7', '\u2122', '\u21D1', '\u00FA', '\u2191', '\u00FB', '\u00F9', '\u00A8',
            '\u03D2', '\u03C5', '\u00FC', '\u2118', '\u03BE', '\u00FD', '\u00A5', '\u00FF', '\u03B6', '\u200D', '\u200C'
        };

        #region Methods

        static void WriteCharBytes(IList buf, char ch, Encoding e)
        {
            if (ch > 255)
            {
                foreach (byte b in e.GetBytes(new char[] { ch }))
                    buf.Add(b);
            }
            else
                buf.Add((byte)ch);
        }

        public static string UrlDecode(string s, Encoding e)
        {
            if (null == s)
                return null;

            if (s.IndexOf('%') == -1 && s.IndexOf('+') == -1)
                return s;

            if (e == null)
                e = Encoding.UTF8;

            long len = s.Length;
            var bytes = new List<byte>();
            int xchar;
            char ch;

            for (int i = 0; i < len; i++)
            {
                ch = s[i];
                if (ch == '%' && i + 2 < len && s[i + 1] != '%')
                {
                    if (s[i + 1] == 'u' && i + 5 < len)
                    {
                        // unicode hex sequence
                        xchar = GetChar(s, i + 2, 4);
                        if (xchar != -1)
                        {
                            WriteCharBytes(bytes, (char)xchar, e);
                            i += 5;
                        }
                        else
                            WriteCharBytes(bytes, '%', e);
                    }
                    else if ((xchar = GetChar(s, i + 1, 2)) != -1)
                    {
                        WriteCharBytes(bytes, (char)xchar, e);
                        i += 2;
                    }
                    else
                    {
                        WriteCharBytes(bytes, '%', e);
                    }
                    continue;
                }

                if (ch == '+')
                    WriteCharBytes(bytes, ' ', e);
                else
                    WriteCharBytes(bytes, ch, e);
            }

            byte[] buf = bytes.ToArray();
            bytes = null;
            return e.GetString(buf, 0, buf.Length);

        }

        static int GetInt(byte b)
        {
            char c = (char)b;
            if (c >= '0' && c <= '9')
                return c - '0';

            if (c >= 'a' && c <= 'f')
                return c - 'a' + 10;

            if (c >= 'A' && c <= 'F')
                return c - 'A' + 10;

            return -1;
        }

        static int GetChar(string str, int offset, int length)
        {
            int val = 0;
            int end = length + offset;
            for (int i = offset; i < end; i++)
            {
                char c = str[i];
                if (c > 127)
                    return -1;

                int current = GetInt((byte)c);
                if (current == -1)
                    return -1;
                val = (val << 4) + current;
            }

            return val;
        }

        static bool TryConvertKeyToEntity(string key, out char value)
        {
            var token = CalculateKeyValue(key);
            if (token == 0)
            {
                value = '\0';
                return false;
            }

            var idx = Array.BinarySearch(entities, token);
            if (idx < 0)
            {
                value = '\0';
                return false;
            }

            value = entities_values[idx];
            return true;
        }

        static long CalculateKeyValue(string s)
        {
            if (s.Length > 8)
                return 0;

            long key = 0;
            for (int i = 0; i < s.Length; ++i)
            {
                long ch = s[i];
                if (ch > 'z' || ch < '0')
                    return 0;

                key |= ch << ((7 - i) * 8);
            }

            return key;
        }

        /// <summary>
        /// Decodes an HTML-encoded string and returns the decoded string.
        /// </summary>
        /// <param name="s">The HTML string to decode. </param>
        /// <returns>The decoded text.</returns>
        public static string HtmlDecode(string s)
        {
            if (s == null)
                throw new ArgumentNullException(nameof(s));

            if (s.IndexOf('&') == -1)
                return s;

            var entity = new StringBuilder();
            var output = new StringBuilder();
            int len = s.Length;
            // 0 -> nothing,
            // 1 -> right after '&'
            // 2 -> between '&' and ';' but no '#'
            // 3 -> '#' found after '&' and getting numbers
            int state = 0;
            int number = 0;
            int digit_start = 0;
            bool hex_number = false;

            for (int i = 0; i < len; i++)
            {
                char c = s[i];
                if (state == 0)
                {
                    if (c == '&')
                    {
                        entity.Append(c);
                        state = 1;
                    }
                    else
                    {
                        output.Append(c);
                    }
                    continue;
                }

                if (c == '&')
                {
                    state = 1;
                    if (digit_start > 0)
                    {
                        entity.Append(s, digit_start, i - digit_start);
                        digit_start = 0;
                    }

                    output.Append(entity.ToString());
                    entity.Length = 0;
                    entity.Append('&');
                    continue;
                }

                switch (state)
                {
                    case 1:
                        if (c == ';')
                        {
                            state = 0;
                            output.Append(entity.ToString());
                            output.Append(c);
                            entity.Length = 0;
                            break;
                        }

                        number = 0;
                        hex_number = false;
                        if (c != '#')
                        {
                            state = 2;
                        }
                        else
                        {
                            state = 3;
                        }
                        entity.Append(c);

                        break;
                    case 2:
                        entity.Append(c);
                        if (c == ';')
                        {
                            string key = entity.ToString();
                            state = 0;
                            entity.Length = 0;

                            if (key.Length > 1)
                            {
                                var skey = key.Substring(1, key.Length - 2);
                                if (TryConvertKeyToEntity(skey, out c))
                                {
                                    output.Append(c);
                                    break;
                                }
                            }

                            output.Append(key);
                        }

                        break;
                    case 3:
                        if (c == ';')
                        {
                            if (number < 0x10000)
                            {
                                output.Append((char)number);
                            }
                            else
                            {
                                output.Append((char)(0xd800 + ((number - 0x10000) >> 10)));
                                output.Append((char)(0xdc00 + ((number - 0x10000) & 0x3ff)));
                            }
                            state = 0;
                            entity.Length = 0;
                            digit_start = 0;
                            break;
                        }

                        if (c == 'x' || c == 'X' && !hex_number)
                        {
                            digit_start = i;
                            hex_number = true;
                            break;
                        }

                        if (char.IsDigit(c))
                        {
                            if (digit_start == 0)
                                digit_start = i;

                            number = number * (hex_number ? 16 : 10) + ((int)c - '0');
                            break;
                        }

                        if (hex_number)
                        {
                            if (c >= 'a' && c <= 'f')
                            {
                                number = number * 16 + 10 + ((int)c - 'a');
                                break;
                            }
                            if (c >= 'A' && c <= 'F')
                            {
                                number = number * 16 + 10 + ((int)c - 'A');
                                break;
                            }
                        }

                        state = 2;
                        if (digit_start > 0)
                        {
                            entity.Append(s, digit_start, i - digit_start);
                            digit_start = 0;
                        }

                        entity.Append(c);
                        break;
                }
            }

            if (entity.Length > 0)
            {
                output.Append(entity);
            }
            else if (digit_start > 0)
            {
                output.Append(s, digit_start, s.Length - digit_start);
            }
            return output.ToString();
        }

        public static QueryParamCollection ParseQueryString(string query)
        {
            return ParseQueryString(query, Encoding.UTF8);
        }

        public static QueryParamCollection ParseQueryString(string query, Encoding encoding)
        {
            if (query == null)
                throw new ArgumentNullException(nameof(query));
            if (encoding == null)
                throw new ArgumentNullException(nameof(encoding));
            if (query.Length == 0 || (query.Length == 1 && query[0] == '?'))
                return new QueryParamCollection();
            if (query[0] == '?')
                query = query.Substring(1);

            var result = new QueryParamCollection();
            ParseQueryString(query, encoding, result);
            return result;
        }

        internal static void ParseQueryString(string query, Encoding encoding, QueryParamCollection result)
        {
            if (query.Length == 0)
                return;

            string decoded = HtmlDecode(query);
            int decodedLength = decoded.Length;
            int namePos = 0;
            bool first = true;
            while (namePos <= decodedLength)
            {
                int valuePos = -1, valueEnd = -1;
                for (int q = namePos; q < decodedLength; q++)
                {
                    if (valuePos == -1 && decoded[q] == '=')
                    {
                        valuePos = q + 1;
                    }
                    else if (decoded[q] == '&')
                    {
                        valueEnd = q;
                        break;
                    }
                }

                if (first)
                {
                    first = false;
                    if (decoded[namePos] == '?')
                        namePos++;
                }

                string name, value;
                if (valuePos == -1)
                {
                    name = null;
                    valuePos = namePos;
                }
                else
                {
                    name = UrlDecode(decoded.Substring(namePos, valuePos - namePos - 1), encoding);
                }
                if (valueEnd < 0)
                {
                    namePos = -1;
                    valueEnd = decoded.Length;
                }
                else
                {
                    namePos = valueEnd + 1;
                }
                value = UrlDecode(decoded.Substring(valuePos, valueEnd - valuePos), encoding);

                result.Add(name, value);
                if (namePos == -1)
                    break;
            }
        }
        #endregion // Methods
    }
}