Skip to content

Masses

rionid.masses

Nuclide mass and mass-to-charge utilities.

Loads and caches the AME2020 mass table and computes ionic mass-to-charge ratios via the electron-binding-energy correction. The physical constants and electron-binding-energy table (AMEData.ElBiEn) below must not be hand-edited.

AMEData

Loads and caches the AME2020 mass table.

On construction, reads ~/.ame/ame.data, downloading it first if absent. Also builds an index for O(1) (element name, mass number) lookup via lookup(), replacing the linear table scan that was an O(N x table-size) hot spot.

Source code in src/rionid/masses.py
 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
class AMEData:
    """Loads and caches the AME2020 mass table.

    On construction, reads `~/.ame/ame.data`, downloading it first if
    absent.
    Also builds an index for O(1) (element name, mass number) lookup via
    `lookup()`, replacing the linear table scan that was an
    O(N x table-size) hot spot.
    """

    AME_DATA_LINK = "https://www-nds.iaea.org/amdc/ame2020/mass_1.mas20.txt"
    FOLDER_NAME = "/.ame/"

    def __init__(self):
        self.home_folder = os.path.expanduser("~") + AMEData.FOLDER_NAME
        os.makedirs(self.home_folder, exist_ok=True)
        self.ame_table = []
        self.ame_data_filename = f"{self.home_folder}ame.data"
        if not os.path.exists(self.ame_data_filename):
            self._download()
        self._parse_ame()
        self._index = {}
        for row in self.ame_table:
            key = (row[6], row[5])
            if key not in self._index:
                self._index[key] = row

    def lookup(self, name, aa):
        """Returns the AME table row for (element name, mass number `aa`),
        or `None` if not present in the table."""
        return self._index.get((name, aa))

    def _download(self):
        """Downloads the AME2020 table into `self.home_folder`."""
        req = ur.Request(AMEData.AME_DATA_LINK, headers={"User-Agent": "Magic Browser"})
        g = ur.urlopen(req)
        with open(self.home_folder + "ame.data", "b+w") as f:
            f.write(g.read())

    def _parse_ame(self):
        """Parses the fixed-width AME2020 mass table. The FORTRAN format
        string and 36-line header skip are the AME2020 file layout and
        must not change without a new AME release."""
        ffline = ff.FortranRecordReader(
            "(a4,a1,i3,i5,i5,i5,1x,a3,a4,1x,f14.6,f12.6,f13.5,1x,f10.5,1x,a2,f13.5,f11.5,1x,i3,1x,f13.6,f12.6)"
        )
        with open(self.ame_data_filename) as f:
            for _ in range(36):
                next(f)
            for line in f:
                if "*" in line:
                    line = line.replace("*", "0")
                if "#" in line:
                    line = line.replace("#", ".")
                    line = "sys " + line
                else:
                    line = "exp " + line
                dataline = ffline.read(line)
                for i in range(len(dataline)):
                    if isinstance(dataline[i], str):
                        dataline[i] = dataline[i].strip()
                self.ame_table.append(dataline)

    @staticmethod
    def to_mev(m_u):
        return m_u * AMEData.UU

    @staticmethod
    def to_u(m_mev):
        return m_mev / AMEData.UU

    @staticmethod
    def get_elbien(zz, qq):
        return AMEData.ElBiEn[zz][zz - qq]

    #
    # Table of electron binding energies. V.:09.09.2007 (YAL)
    # All energies are given in Ev.
    # TBE and energies for 3e- upto 105e-:
    # Rodrigues et al., At. Data Nucl. Data Tables 86 (2004) 117-233.
    # Older tables are used for 1e- and 2e-ions:
    # K.N. Huang et al., At. Data Nucl. Data Tables 18 (1976) 243.
    # W.R. Johnson, G. Soff, At. Data Nucl. Data Tables 39 (1988) 265.
    # D.R. Plante, W.R. Johnson, J. Sapirstein, Phys. Rev. A 49 (1994) 3519.
    #

    CC = 299792458  # m/s
    UU = 931.4940023  # MeV/C^2
    EE = 1.602176565e-19  # Coulombs
    ME = 0.510998928  # MeV/C^2

    # Usage: e.g. show all electron binding energies for 4-Be:
    #
    # ElBiEn[4][:4+1]
    # ---> [0, 218, 372, 389, 397]
    # This means that the binding energy for
    # ElBiEn[4][0] i.e. 0-e ion (bare) = 0
    # ElBiEn[4][1] i.e. 1-e ion (H-like) = 218 eV
    # ElBiEn[4][2] i.e. 2-e ion (He-like) = 372 eV
    # ElBiEn[4][3] i.e. 3-e ion (Li-like) = 389 eV
    # ElBiEn[4][4] i.e. 4-e ion (full atom) = 397 eV
    #
    # This table starts at zero/zero to be consistent with programming arrays#
    # values for H and He are taken from general sources, while being rounded up to integer values
    #
    # In order to calculate the ionization energy, subtract levels. e.g.
    # first ionization energy:
    # AMEData.ElBiEn[4][4] - AMEData.ElBiEn[4][4-1]
    # second ionization energy:
    # AMEData.ElBiEn[4][4-1] - AMEData.ElBiEn[4][4-2]

    # fmt: off
    ElBiEn = [
        [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 54, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 122, 198, 202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 218, 372, 389, 397, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 340, 600, 636, 660, 668, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 490, 882, 945, 991, 1015, 1026, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 667, 1219, 1316, 1391, 1438, 1467, 1482, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 871, 1611, 1747, 1859, 1936, 1990, 2025, 2037, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 1103, 2057, 2241, 2395, 2509, 2596, 2658, 2691, 2707, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 1362, 2558, 2796, 2999, 3157, 3283, 3380, 3442, 3481, 3501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 1649, 3114, 3412, 3673, 3881, 4053, 4192, 4289, 4359, 4404, 4409, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0],
        [0, 1963, 3725, 4091, 4414, 4681, 4906, 5092, 5231, 5339, 5418, 5432, 5439, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0],
        [0, 2304, 4390, 4831, 5225, 5555, 5840, 6082, 6270, 6423, 6541, 6569, 6587, 6592, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0],
        [0, 2673, 5111, 5633, 6104, 6506, 6857, 7161, 7406, 7609, 7774, 7819, 7851, 7867, 7875, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0],
        [0, 3070, 5887, 6497, 7053, 7533, 7957, 8329, 8637, 8899, 9118, 9183, 9233, 9262, 9281, 9291, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0],
        [0, 3494, 6718, 7423, 8070, 8635, 9140, 9588, 9966, 10293, 10572, 10660, 10731, 10777, 10811, 10834, 10843, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 3946, 7605, 8412, 9157, 9814, 10406, 10936, 11391, 11790, 12137, 12250, 12345, 12412, 12465, 12504, 12526,
         12538, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 4426, 8547, 9464, 10314, 11070, 11756, 12375, 12913, 13391, 13812, 13955, 14077, 14167, 14241, 14300, 14339,
         14365, 14380, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 4934, 9545, 10578, 11540, 12402, 13189, 13903, 14532, 15096, 15598, 15773, 15926, 16043, 16141, 16223,
         16282, 16326, 16357, 16361, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 5470, 10599, 11755, 12836, 13811, 14706, 15523, 16249, 16905, 17495, 17706, 17892, 18039, 18165, 18272,
         18355, 18421, 18470, 18482, 18487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 6034, 11709, 12995, 14202, 15297, 16307, 17233, 18064, 18819, 19504, 19753, 19976, 20156, 20313, 20449,
         20558, 20649, 20721, 20745, 20757, 20762, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 6626, 12875, 14298, 15638, 16860, 17992, 19034, 19976, 20838, 21624, 21915, 22178, 22394, 22585, 22753,
         22892, 23010, 23108, 23150, 23177, 23190, 23195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 7246, 14098, 15665, 17146, 18501, 19762, 20927, 21987, 22963, 23857, 24193, 24498, 24753, 24981, 25184,
         25356, 25505, 25632, 25696, 25742, 25770, 25783, 25790, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 7895, 15377, 17096, 18724, 20221, 21617, 22912, 24097, 25192, 26202, 26585, 26937, 27234, 27503, 27744,
         27951, 28134, 28293, 28383, 28452, 28500, 28529, 28544, 28550, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 8572, 16727, 18591, 20373, 22018, 23557, 24988, 26306, 27528, 28659, 29094, 29494, 29837, 30149, 30431,
         30678, 30898, 31092, 31210, 31305, 31377, 31427, 31459, 31474, 31480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 9278, 18106, 20150, 22093, 23894, 25584, 27157, 28614, 29969, 31230, 31718, 32171, 32562, 32921, 33247,
         33536, 33797, 34029, 34179, 34303, 34401, 34475, 34529, 34557, 34573, 34579, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 10012, 19571, 21773, 23886, 25849, 27696, 29419, 31022, 32518, 33914, 34460, 34968, 35410, 35819, 36192,
         36527, 36830, 37104, 37289, 37446, 37574, 37676, 37754, 37803, 37834, 37849, 37857, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 10775, 21064, 23462, 25750, 27883, 29894, 31774, 33530, 35173, 36712, 37318, 37885, 38382, 38843, 39267,
         39650, 40000, 40318, 40541, 40733, 40895, 41027, 41134, 41208, 41261, 41293, 41308, 41316, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 11568, 22645, 25215, 27687, 29997, 32180, 34223, 36139, 37936, 39624, 40294, 40922, 41477, 41994, 42471,
         42906, 43305, 43671, 43935, 44166, 44364, 44530, 44668, 44770, 44849, 44904, 44938, 44955, 44962, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 12389, 24254, 27034, 29697, 32191, 34553, 36766, 38848, 40806, 42650, 43387, 44080, 44697, 45272, 45806,
         46295, 46747, 47163, 47472, 47745, 47983, 48186, 48359, 48492, 48599, 48680, 48737, 48774, 48791, 48799, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 13239, 25950, 28919, 31779, 34465, 37013, 39404, 41659, 43785, 45792, 46599, 47360, 48041, 48679, 49272,
         49819, 50326, 50796, 51152, 51471, 51751, 51994, 52205, 52373, 52512, 52623, 52706, 52767, 52797, 52815, 52821,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 14119, 27677, 30869, 33936, 36820, 39562, 42137, 44573, 46873, 49050, 49930, 50762, 51510, 52213, 52869,
         53476, 54042, 54569, 54976, 55343, 55669, 55955, 56207, 56413, 56588, 56731, 56845, 56933, 56977, 57010, 57025,
         57032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 15029, 29492, 32886, 36166, 39257, 42199, 44965, 47588, 50070, 52424, 53380, 54287, 55105, 55877, 56598,
         57269, 57897, 58484, 58944, 59362, 59737, 60070, 60366, 60613, 60826, 61006, 61153, 61272, 61333, 61381, 61409,
         61427, 61436, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 15968, 31336, 34970, 38470, 41775, 44926, 47890, 50706, 53377, 55914, 56950, 57934, 58827, 59670, 60459,
         61198, 61891, 62540, 63057, 63530, 63956, 64339, 64682, 64973, 65228, 65447, 65631, 65784, 65865, 65930, 65973,
         66004, 66024, 66033, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 16937, 33269, 37121, 40849, 44376, 47743, 50911, 53928, 56794, 59522, 60640, 61706, 62675, 63593, 64454,
         65263, 66023, 66739, 67316, 67846, 68327, 68763, 69156, 69494, 69795, 70056, 70280, 70470, 70572, 70657, 70716,
         70762, 70797, 70817, 70828, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 17936, 35233, 39340, 43303, 47059, 50649, 54029, 57254, 60322, 63247, 64451, 65601, 66651, 67647, 68583,
         69465, 70296, 71080, 71720, 72311, 72851, 73342, 73788, 74177, 74526, 74833, 75099, 75331, 75455, 75562, 75640,
         75703, 75753, 75788, 75811, 75824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0],
        [0, 18966, 37287, 41626, 45833, 49826, 53647, 57246, 60685, 63962, 67091, 68385, 69622, 70755, 71833, 72846,
         73804, 74709, 75566, 76272, 76926, 77527, 78077, 78579, 79022, 79422, 79778, 80091, 80366, 80515, 80646, 80744,
         80827, 80895, 80945, 80983, 81010, 81013, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0],
        [0, 20025, 39371, 43981, 48439, 52676, 56736, 60560, 64221, 67713, 71054, 72440, 73768, 74988, 76150, 77244,
         78282, 79264, 80196, 80970, 81692, 82357, 82969, 83531, 84030, 84484, 84892, 85254, 85576, 85753, 85909, 86029,
         86133, 86221, 86290, 86345, 86387, 86397, 86402, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0],
        [0, 21116, 41546, 46405, 51122, 55610, 59917, 63974, 67863, 71578, 75136, 76618, 78040, 79350, 80600, 81778,
         82898, 83961, 84971, 85818, 86608, 87341, 88018, 88642, 89201, 89713, 90176, 90590, 90963, 91168, 91351, 91496,
         91623, 91733, 91822, 91896, 91956, 91975, 91986, 91992, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0],
        [0, 22237, 43753, 48898, 53881, 58630, 63190, 67487, 71611, 75556, 79339, 80920, 82440, 83843, 85184, 86449,
         87655, 88800, 89892, 90814, 91677, 92480, 93225, 93915, 94537, 95110, 95630, 96100, 96526, 96761, 96974, 97145,
         97298, 97430, 97542, 97637, 97716, 97750, 97772, 97784, 97790, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0],
        [0, 23389, 46053, 51461, 56719, 61735, 66558, 71100, 75466, 79648, 83662, 85347, 86967, 88466, 89902, 91258,
         92551, 93784, 94959, 95959, 96899, 97776, 98592, 99350, 100038, 100674, 101255, 101785, 102267, 102534, 102778,
         102977, 103157, 103315, 103451, 103569, 103670, 103719, 103756, 103780, 103793, 103799, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 24572, 48383, 54094, 59634, 64926, 70019, 74815, 79429, 83855, 88108, 89898, 91622, 93222, 94756, 96204,
         97590, 98911, 100174, 101256, 102275, 103228, 104118, 104947, 105705, 106407, 107053, 107644, 108186, 108487,
         108764, 108993, 109201, 109387, 109549, 109692, 109816, 109884, 109937, 109976, 110002, 110017, 110024, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 25787, 50808, 56798, 62629, 68204, 73574, 78631, 83501, 88177, 92676, 94575, 96407, 98110, 99745, 101290,
         102770, 104184, 105537, 106703, 107805, 108837, 109805, 110709, 111538, 112311, 113024, 113679, 114283, 114621,
         114932, 115194, 115433, 115647, 115837, 116006, 116156, 116244, 116316, 116373, 116414, 116443, 116457, 116463,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 27034, 53263, 59573, 65703, 71570, 77226, 82549, 87683, 92616, 97367, 99379, 101321, 103131, 104871, 106515,
         108093, 109602, 111050, 112303, 113490, 114605, 115653, 116634, 117539, 118384, 119168, 119891, 120561, 120936,
         121284, 121580, 121851, 122096, 122316, 122514, 122691, 122801, 122894, 122970, 123029, 123074, 123101, 123115,
         123122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 28312, 55815, 62420, 68857, 75024, 80973, 86571, 91974, 97171, 102182, 104311, 106367, 108287, 110135,
         111881, 113560, 115168, 116713, 118057, 119331, 120533, 121664, 122725, 123709, 124630, 125487, 126281, 127020,
         127434, 127821, 128152, 128458, 128735, 128987, 129215, 129421, 129556, 129671, 129768, 129848, 129911, 129953,
         129983, 129999, 130005, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 29623, 58399, 65339, 72091, 78566, 84818, 90697, 96377, 101845, 107122, 109370, 111545, 113578, 115537,
         117389, 119172, 120882, 122526, 123964, 125330, 126620, 127838, 128983, 130048, 131048, 131981, 132850, 133660,
         134116, 134543, 134912, 135254, 135565, 135851, 136111, 136348, 136508, 136649, 136769, 136870, 136954, 137015,
         137061, 137092, 137110, 137116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 30966, 61063, 68332, 75407, 82198, 88760, 94928, 100891, 106638, 112188, 114559, 116855, 119005, 121079,
         123040, 124930, 126745, 128492, 130027, 131487, 132869, 134177, 135408, 136557, 137639, 138652, 139598, 140483,
         140982, 141451, 141859, 142240, 142587, 142908, 143202, 143472, 143660, 143827, 143972, 144097, 144203, 144285,
         144350, 144399, 144432, 144451, 144458, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 32341, 63792, 71398, 78805, 85921, 92802, 99264, 105518, 111550, 117381, 119879, 122298, 124569, 126761,
         128834, 130834, 132757, 134610, 136245, 137803, 139280, 140681, 142001, 143238, 144405, 145500, 146526, 147489,
         148034, 148547, 148996, 149417, 149802, 150160, 150489, 150794, 151012, 151207, 151380, 151530, 151660, 151765,
         151852, 151920, 151971, 152006, 152022, 152029, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 33750, 66605, 74539, 82286, 89735, 96942, 103707, 110258, 116582, 122701, 125329, 127877, 130272, 132585,
         134773, 136887, 138921, 140883, 142621, 144280, 145855, 147351, 148764, 150092, 151347, 152528, 153637, 154680,
         155272, 155832, 156324, 156786, 157211, 157607, 157975, 158316, 158565, 158791, 158992, 159170, 159326, 159456,
         159565, 159655, 159726, 159781, 159807, 159824, 159830, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 35192, 69449, 77754, 85851, 93641, 101184, 108258, 115114, 121737, 128149, 130911, 133591, 136113, 138552,
         140858, 143088, 145236, 147311, 149155, 150918, 152594, 154190, 155698, 157119, 158466, 159735, 160930, 162057,
         162698, 163306, 163843, 164349, 164815, 165252, 165659, 166038, 166320, 166578, 166810, 167018, 167202, 167358,
         167493, 167606, 167700, 167775, 167814, 167842, 167856, 167863, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 36668, 72394, 81045, 89500, 97640, 105527, 112917, 120084, 127013, 133727, 136626, 139441, 142095, 144662,
         147090, 149439, 151705, 153895, 155849, 157718, 159499, 161197, 162803, 164321, 165762, 167122, 168407, 169621,
         170313, 170970, 171554, 172106, 172616, 173095, 173542, 173962, 174279, 174571, 174836, 175074, 175288, 175473,
         175635, 175774, 175891, 175989, 176043, 176084, 176109, 176125, 176133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 38178, 75374, 84412, 93233, 101732, 109972, 117686, 125171, 132414, 139436, 142476, 145430, 148218, 150918,
         153470, 155942, 158328, 160637, 162703, 164682, 166571, 168374, 170081, 171699, 173237, 174692, 176069, 177373,
         178118, 178827, 179460, 180059, 180614, 181136, 181627, 182088, 182442, 182770, 183069, 183341, 183586, 183801,
         183992, 184159, 184302, 184425, 184494, 184550, 184587, 184614, 184632, 184640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0],
        [0, 39721, 78454, 87857, 97053, 105920, 114521, 122565, 130376, 137939, 145276, 148461, 151557, 154483, 157319,
         159999, 162597, 165107, 167538, 169719, 171812, 173811, 175722, 177534, 179254, 180893, 182446, 183918, 185315,
         186115, 186877, 187560, 188209, 188810, 189379, 189914, 190419, 190812, 191177, 191512, 191819, 192098, 192345,
         192566, 192763, 192934, 193084, 193170, 193242, 193293, 193332, 193361, 193379, 193388, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0],
        [0, 41300, 81571, 91379, 100960, 110203, 119174, 127556, 135700, 143589, 151249, 154582, 157825, 160893, 163868,
         166679, 169405, 172042, 174598, 176898, 179107, 181220, 183243, 185162, 186988, 188730, 190383, 191954, 193447,
         194303, 195121, 195857, 196557, 197207, 197823, 198405, 198954, 199388, 199792, 200166, 200509, 200823, 201104,
         201359, 201586, 201788, 201966, 202070, 202160, 202226, 202280, 202321, 202351, 202371, 202382, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0],
        [0, 42913, 84791, 94980, 104954, 114583, 123933, 132659, 141143, 149367, 157356, 160841, 164233, 167447, 170565,
         173510, 176369, 179136, 181819, 184241, 186570, 188800, 190937, 192966, 194902, 196750, 198507, 200179, 201771,
         202686, 203561, 204352, 205105, 205805, 206471, 207100, 207697, 208173, 208618, 209031, 209413, 209765, 210081,
         210370, 210631, 210864, 211073, 211197, 211305, 211388, 211457, 211513, 211556, 211588, 211610, 211614, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0],
        [0, 44561, 88047, 98661, 109037, 119060, 128799, 137876, 146707, 155272, 163598, 167238, 170784, 174147, 177413,
         180494, 183488, 186389, 189203, 191750, 194202, 196551, 198807, 200949, 202996, 204954, 206818, 208594, 210289,
         211264, 212199, 213045, 213854, 214606, 215323, 216002, 216648, 217168, 217656, 218111, 218533, 218923, 219277,
         219602, 219898, 220165, 220406, 220551, 220679, 220780, 220866, 220937, 220995, 221041, 221076, 221085, 221089,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0],
        [0, 46246, 91408, 102421, 113210, 123636, 133772, 143209, 152393, 161307, 169976, 173776, 177480, 180995,
         184411, 187633, 190766, 193802, 196752, 199426, 202003, 204476, 206853, 209112, 211274, 213343, 215317, 217201,
         219001, 220039, 221034, 221940, 222805, 223611, 224381, 225112, 225808, 226374, 226907, 227405, 227869, 228300,
         228693, 229057, 229389, 229692, 229967, 230134, 230284, 230403, 230508, 230596, 230670, 230731, 230780, 230798,
         230808, 230813, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 47966, 94806, 106263, 117473, 128313, 138855, 148658, 158203, 167472, 176492, 180455, 184320, 187992,
         191562, 194928, 198202, 201378, 204465, 207271, 209977, 212577, 215077, 217455, 219735, 221920, 224007, 226001,
         227909, 229011, 230071, 231036, 231960, 232822, 233646, 234431, 235180, 235793, 236372, 236915, 237424, 237896,
         238331, 238734, 239105, 239445, 239757, 239947, 240119, 240259, 240384, 240490, 240581, 240659, 240723, 240758,
         240777, 240788, 240792, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 49722, 98311, 110187, 121828, 133090, 144049, 154224, 164137, 173769, 183147, 187277, 191307, 195139,
         198868, 202380, 205799, 209118, 212345, 215286, 218124, 220853, 223481, 225982, 228382, 230686, 232888, 234996,
         237015, 238184, 239308, 240336, 241321, 242241, 243121, 243961, 244764, 245427, 246054, 246644, 247198, 247714,
         248192, 248637, 249049, 249427, 249777, 249992, 250188, 250350, 250495, 250621, 250731, 250826, 250908, 250964,
         251002, 251021, 251031, 251036, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 51516, 101855, 114194, 126276, 137970, 149354, 159909, 170197, 180199, 189941, 194243, 198441, 202438,
         206329, 209991, 213558, 217023, 220394, 223472, 226446, 229307, 232065, 234692, 237217, 239642, 241963, 244187,
         246321, 247558, 248749, 249841, 250890, 251868, 252807, 253703, 254562, 255276, 255954, 256592, 257194, 257756,
         258278, 258767, 259220, 259640, 260029, 260270, 260491, 260676, 260844, 260990, 261121, 261235, 261335, 261415,
         261474, 261513, 261533, 261543, 261547, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 53346, 105508, 118285, 130817, 142953, 154772, 165714, 176385, 186763, 196878, 201354, 205725, 209891,
         213947, 217763, 221481, 225094, 228613, 231832, 234944, 237941, 240833, 243588, 246240, 248789, 251232, 253576,
         255827, 257134, 258395, 259553, 260666, 261706, 262704, 263660, 264576, 265343, 266073, 266762, 267413, 268022,
         268591, 269125, 269622, 270084, 270514, 270783, 271031, 271240, 271431, 271600, 271751, 271886, 272005, 272111,
         272194, 272255, 272294, 272314, 272324, 272329, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 55214, 109200, 122460, 135452, 148040, 160304, 171641, 182701, 193463, 203957, 208612, 213160, 217497,
         221724, 225695, 229568, 233334, 237003, 240366, 243619, 246756, 249784, 252671, 255453, 258129, 260698, 263164,
         265535, 266915, 268247, 269473, 270653, 271756, 272816, 273832, 274808, 275630, 276412, 277154, 277856, 278514,
         279131, 279712, 280255, 280761, 281235, 281532, 281807, 282042, 282258, 282450, 282624, 282780, 282920, 283054,
         283163, 283248, 283310, 283349, 283370, 283380, 283385, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 57121, 113005, 126722, 140184, 153234, 165952, 177691, 189148, 200301, 211181, 216019, 220748, 225261,
         229661, 233792, 237823, 241744, 245567, 249077, 252475, 255754, 258922, 261944, 264858, 267665, 270362, 272953,
         275448, 276902, 278308, 279604, 280853, 282020, 283144, 284222, 285259, 286138, 286976, 287771, 288526, 289235,
         289902, 290532, 291122, 291675, 292193, 292520, 292824, 293086, 293328, 293544, 293742, 293921, 294083, 294247,
         294384, 294496, 294581, 294643, 294683, 294706, 294716, 294721, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 59066, 116849, 131071, 145014, 158535, 171718, 183865, 195726, 207278, 218551, 223576, 228490, 233183,
         237761, 242055, 246246, 250326, 254306, 257966, 261512, 264936, 268248, 271408, 274458, 277399, 280226, 282946,
         285567, 287098, 288579, 289947, 291268, 292501, 293690, 294832, 295932, 296869, 297764, 298615, 299425, 300186,
         300905, 301585, 302224, 302825, 303390, 303748, 304083, 304373, 304642, 304884, 305107, 305310, 305495, 305691,
         305858, 305998, 306110, 306196, 306259, 306302, 306321, 306333, 306337, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 61050, 120809, 135509, 149943, 163946, 177604, 190167, 202439, 214396, 226069, 231286, 236389, 241266,
         246026, 250486, 254841, 259083, 263222, 267036, 270734, 274307, 277765, 281065, 284254, 287332, 290293, 293145,
         295895, 297504, 299063, 300506, 301899, 303200, 304456, 305664, 306829, 307826, 308780, 309689, 310555, 311371,
         312143, 312875, 313565, 314216, 314829, 315219, 315586, 315905, 316203, 316472, 316720, 316949, 317159, 317388,
         317588, 317758, 317899, 318011, 318099, 318164, 318200, 318218, 318228, 318233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 63073, 124810, 140034, 154970, 169465, 183609, 196595, 209285, 221655, 233736, 239148, 244444, 249510,
         254455, 259084, 263607, 268014, 272317, 276287, 280139, 283864, 287471, 290916, 294247, 297464, 300562, 303549,
         306431, 308121, 309759, 311279, 312747, 314118, 315443, 316718, 317950, 319009, 320023, 320992, 321916, 322788,
         323615, 324401, 325144, 325846, 326510, 326933, 327333, 327683, 328011, 328307, 328583, 328838, 329073, 329339,
         329573, 329775, 329947, 330088, 330203, 330292, 330350, 330388, 330408, 330418, 330423, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 65137, 128928, 144652, 160100, 175098, 189737, 203154, 216270, 229060, 241555, 247166, 252660, 257918,
         263053, 267855, 272548, 277124, 281593, 285724, 289733, 293613, 297373, 300965, 304441, 307800, 311038, 314163,
         317181, 318954, 320673, 322271, 323816, 325259, 326654, 328000, 329300, 330422, 331499, 332528, 333513, 334442,
         335327, 336169, 336966, 337721, 338436, 338895, 339328, 339711, 340070, 340395, 340699, 340982, 341244, 341547,
         341817, 342054, 342258, 342430, 342574, 342691, 342774, 342834, 342873, 342891, 342902, 342907, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 67242, 133090, 149361, 165332, 180843, 195989, 209844, 223392, 236609, 249527, 255342, 261037, 266492,
         271821, 276799, 281665, 286413, 291052, 295346, 299516, 303554, 307470, 311212, 314836, 318341, 321722, 324987,
         328144, 330002, 331805, 333483, 335108, 336624, 338092, 339508, 340878, 342066, 343208, 344300, 345346, 346335,
         347278, 348177, 349030, 349840, 350610, 351104, 351573, 351989, 352380, 352736, 353070, 353381, 353672, 354014,
         354322, 354595, 354834, 355039, 355213, 355360, 355469, 355554, 355616, 355655, 355673, 355684, 355689, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 69387, 137372, 154164, 170669, 186705, 202368, 216668, 230656, 244307, 257654, 263677, 269578, 275234,
         280761, 285918, 290962, 295884, 300696, 305157, 309492, 313691, 317766, 321661, 325436, 329089, 332617, 336026,
         339324, 341269, 343158, 344919, 346625, 348216, 349758, 351248, 352690, 353945, 355152, 356309, 357419, 358469,
         359473, 360431, 361342, 362208, 363033, 363565, 364071, 364521, 364946, 365334, 365698, 366039, 366359, 366743,
         367090, 367402, 367677, 367916, 368124, 368302, 368440, 368553, 368640, 368701, 368740, 368758, 368770, 368775,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 71575, 141697, 159060, 176110, 192682, 208873, 223625, 238060, 252153, 265937, 272173, 278284, 284144,
         289875, 295214, 300438, 305539, 310527, 315157, 319659, 324023, 328261, 332312, 336241, 340046, 343723, 347278,
         350721, 352755, 354733, 356578, 358375, 360036, 361654, 363218, 364734, 366058, 367333, 368557, 369732, 370846,
         371911, 372930, 373901, 374825, 375707, 376278, 376822, 377308, 377768, 378188, 378585, 378957, 379307, 379734,
         380123, 380475, 380788, 381064, 381307, 381517, 381687, 381829, 381943, 382030, 382091, 382131, 382151, 382163,
         382168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 73805, 146149, 164052, 181659, 198777, 215508, 230719, 245609, 260151, 274379, 280831, 287157, 293227,
         299164, 304689, 310097, 315379, 320547, 325350, 330023, 334555, 338958, 343169, 347255, 351215, 355043, 358749,
         362339, 364465, 366532, 368465, 370340, 372087, 373783, 375424, 377015, 378410, 379755, 381047, 382289, 383467,
         384597, 385678, 386710, 387695, 388636, 389247, 389829, 390353, 390849, 391303, 391733, 392137, 392519, 392991,
         393423, 393817, 394170, 394484, 394764, 395010, 395213, 395386, 395530, 395645, 395731, 395794, 395835, 395855,
         395868, 395872, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 76078, 150643, 169142, 187318, 204995, 222276, 237955, 253306, 268305, 282983, 289657, 296202, 302486,
         308635, 314348, 319943, 325411, 330761, 335741, 340587, 345290, 349863, 354235, 358481, 362599, 366583, 370441,
         374182, 376402, 378561, 380583, 382546, 384373, 386149, 387868, 389537, 391004, 392421, 393783, 395094, 396339,
         397534, 398680, 399774, 400821, 401823, 402475, 403098, 403660, 404194, 404683, 405147, 405585, 406000, 406518,
         406995, 407432, 407828, 408183, 408501, 408784, 409022, 409229, 409405, 409549, 409663, 409752, 409816, 409849,
         409870, 409883, 409889, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 78395, 155267, 174332, 193088, 211335, 229179, 245332, 261153, 276614, 291751, 298651, 305420, 311922,
         318286, 324193, 329978, 335633, 341170, 346329, 351353, 356230, 360975, 365512, 369922, 374200, 378343, 382357,
         386252, 388567, 390821, 392934, 394987, 396897, 398754, 400553, 402301, 403843, 405333, 406767, 408149, 409462,
         410724, 411935, 413095, 414205, 415269, 415964, 416629, 417231, 417804, 418329, 418828, 419301, 419750, 420316,
         420841, 421323, 421762, 422160, 422519, 422840, 423116, 423358, 423567, 423743, 423888, 424004, 424095, 424142,
         424177, 424200, 424214, 424220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0], [0, 80756, 159937, 179621, 198969, 217798, 236216, 252850, 269147, 285080, 300683, 307813, 314810, 321535,
              328120, 334222, 340201, 346047, 351774, 357115, 362320, 367375, 372295, 377001, 381576, 386019, 390322,
              394495, 398547, 400960, 403312, 405517, 407662, 409657, 411597, 413479, 415308, 416926, 418490, 419998,
              421453, 422836, 424167, 425446, 426672, 427848, 428976, 429715, 430423, 431066, 431679, 432241, 432777,
              433286, 433770, 434386, 434960, 435489, 435974, 436415, 436817, 437179, 437494, 437773, 438018, 438228,
              438404, 438551, 438670, 438733, 438784, 438820, 438845, 438860, 438866, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
              0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 83162, 164739, 185013, 204966, 224389, 243393, 260516, 277297, 293708, 309784, 317150, 324380, 331332,
         338142, 344442, 350618, 356660, 362579, 368107, 373495, 378731, 383830, 388707, 393452, 398061, 402529, 406864,
         411075, 413589, 416039, 418341, 420581, 422661, 424686, 426652, 428564, 430260, 431901, 433484, 435014, 436468,
         437870, 439219, 440513, 441755, 442949, 443734, 444487, 445171, 445826, 446427, 447001, 447546, 448066, 448735,
         449359, 449938, 450470, 450957, 451403, 451807, 452163, 452482, 452764, 453010, 453220, 453399, 453548, 453630,
         453697, 453749, 453788, 453815, 453830, 453836, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0],
        [0, 85614, 169590, 190507, 211077, 231107, 250708, 268328, 285601, 302497, 319053, 326659, 334127, 341312,
         348351, 354854, 361230, 367470, 373585, 379302, 384877, 390298, 395578, 400630, 405547, 410326, 414961, 419462,
         423836, 426452, 429004, 431404, 433740, 435908, 438020, 440072, 442068, 443844, 445564, 447224, 448830, 450358,
         451832, 453252, 454616, 455927, 457189, 458020, 458819, 459547, 460245, 460885, 461498, 462082, 462639, 463362,
         464038, 464667, 465249, 465783, 466275, 466724, 467122, 467482, 467805, 468088, 468334, 468547, 468729, 468830,
         468915, 468985, 469040, 469081, 469106, 469122, 469128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0],
        [0, 88113, 174578, 196109, 217309, 237957, 258169, 276293, 294065, 311454, 328498, 336348, 344059, 351480,
         358754, 365462, 372042, 378483, 384798, 390708, 396473, 402082, 407548, 412777, 417869, 422821, 427627, 432295,
         436835, 439556, 442212, 444712, 447147, 449405, 451606, 453745, 455828, 457685, 459486, 461225, 462909, 464512,
         466060, 467553, 468989, 470370, 471701, 472580, 473426, 474200, 474942, 475623, 476276, 476899, 477495, 478273,
         479003, 479685, 480317, 480901, 481442, 481936, 482379, 482782, 483146, 483468, 483753, 484002, 484218, 484340,
         484445, 484534, 484606, 484663, 484703, 484731, 484747, 484754, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0],
        [0, 90660, 179614, 201818, 223661, 244941, 265777, 284412, 302689, 320579, 338118, 346219, 354176, 361840,
         369352, 376270, 383057, 389703, 396220, 402326, 408285, 414085, 419739, 425149, 430419, 435547, 440527, 445366,
         450075, 452903, 455665, 458268, 460804, 463154, 465445, 467673, 469844, 471785, 473668, 475489, 477252, 478932,
         480556, 482123, 483632, 485086, 486488, 487417, 488312, 489131, 489919, 490642, 491336, 492000, 492636, 493471,
         494257, 494993, 495678, 496313, 496903, 497446, 497935, 498383, 498789, 499154, 499478, 499765, 500018, 500162,
         500288, 500397, 500488, 500563, 500619, 500662, 500691, 500708, 500715, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 93254, 184793, 207635, 230133, 252058, 273530, 292684, 311475, 329872, 347914, 356270, 364480, 372390,
         380146, 387276, 394273, 401127, 407851, 414156, 420312, 426306, 432152, 437746, 443198, 448505, 453661, 458674,
         463555, 466493, 469363, 472071, 474711, 477154, 479537, 481857, 484118, 486144, 488111, 490015, 491860, 493618,
         495320, 496964, 498548, 500075, 501550, 502529, 503474, 504342, 505176, 505942, 506679, 507384, 508061, 508955,
         509799, 510591, 511331, 512019, 512661, 513252, 513789, 514284, 514736, 515144, 515509, 515836, 516128, 516295,
         516444, 516574, 516686, 516780, 516854, 516914, 516959, 516989, 517008, 517015, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 95898, 190021, 213563, 236731, 259314, 281436, 301116, 320428, 339341, 357892, 366508, 374975, 383137,
         391142, 398488, 405699, 412765, 419698, 426206, 432562, 438754, 444795, 450575, 456211, 461701, 467036, 472227,
         477282, 480333, 483314, 486129, 488874, 491413, 493891, 496303, 498657, 500770, 502822, 504811, 506739, 508578,
         510358, 512081, 513742, 515345, 516894, 517926, 518922, 519838, 520721, 521531, 522311, 523060, 523779, 524733,
         525636, 526487, 527282, 528025, 528720, 529363, 529950, 530494, 530992, 531445, 531854, 532223, 532555, 532747,
         532920, 533073, 533207, 533321, 533415, 533493, 533555, 533601, 533634, 533651, 533660, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 98592, 195399, 219605, 243457, 266712, 289496, 309710, 329551, 348986, 368055, 376935, 385665, 394084,
         402343, 409908, 417336, 424617, 431763, 438477, 445037, 451429, 457670, 463639, 469463, 475137, 480655, 486026,
         491260, 494425, 497519, 500444, 503298, 505933, 508507, 511015, 513462, 515664, 517804, 519879, 521893, 523813,
         525675, 527477, 529217, 530898, 532523, 533608, 534657, 535624, 536556, 537412, 538237, 539029, 539791, 540808,
         541772, 542683, 543536, 544336, 545086, 545781, 546420, 547014, 547561, 548061, 548515, 548928, 549302, 549520,
         549718, 549895, 550053, 550188, 550304, 550402, 550482, 550546, 550595, 550623, 550642, 550647, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 101336, 200827, 225763, 250311, 274252, 297714, 318469, 338845, 358810, 378404, 387555, 396553, 405233,
         413751, 421539, 429188, 436687, 444049, 450973, 457740, 464337, 470779, 476941, 482956, 488818, 494521, 500076,
         505490, 508772, 511983, 515019, 517984, 520719, 523390, 525995, 528538, 530830, 533060, 535223, 537324, 539328,
         541273, 543157, 544976, 546736, 548440, 549580, 550683, 551702, 552685, 553587, 554458, 555295, 556102, 557183,
         558210, 559182, 560095, 560953, 561760, 562510, 563203, 563848, 564446, 564994, 565496, 565954, 566373, 566618,
         566842, 567045, 567227, 567385, 567523, 567643, 567743, 567826, 567893, 567934, 567964, 567978, 567985, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 104133, 206410, 232038, 257298, 281939, 306092, 327395, 348315, 368818, 388945, 398371, 407642, 416589,
         425372, 433385, 441258, 448979, 456561, 463698, 470675, 477479, 484127, 490485, 496693, 502747, 508639, 514379,
         519978, 523380, 526709, 529860, 532938, 535773, 538544, 541247, 543888, 546273, 548594, 550847, 553037, 555127,
         557156, 559123, 561025, 562865, 564649, 565845, 567004, 568076, 569112, 570062, 570979, 571863, 572716, 573863,
         574954, 575988, 576963, 577881, 578747, 579553, 580301, 581000, 581650, 582249, 582800, 583306, 583770, 584044,
         584296, 584525, 584733, 584916, 585077, 585220, 585342, 585445, 585532, 585586, 585629, 585654, 585670, 585676,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 106983, 212045, 238433, 264421, 289776, 314634, 336494, 357965, 379013, 399679, 409387, 418937, 428156,
         437208, 445451, 453552, 461497, 469303, 476656, 483847, 490862, 497718, 504275, 510680, 516928, 523012, 528942,
         534727, 538251, 541701, 544969, 548163, 551101, 553974, 556777, 559517, 561997, 564411, 566756, 569037, 571214,
         573329, 575381, 577367, 579290, 581155, 582409, 583624, 584751, 585841, 586840, 587806, 588737, 589636, 590851,
         592009, 593108, 594146, 595126, 596052, 596916, 597721, 598476, 599179, 599831, 600432, 600988, 601499, 601803,
         602084, 602341, 602576, 602785, 602971, 603137, 603283, 603408, 603516, 603585, 603642, 603678, 603705, 603720,
         603728, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 109886, 217842, 244950, 271679, 297764, 323342, 345766, 367796, 389396, 410610, 420604, 430438, 439935,
         449262, 457738, 466069, 474244, 482276, 489849, 497257, 504487, 511555, 518314, 524918, 531363, 537642, 543764,
         549740, 553389, 556962, 560350, 563662, 566704, 569681, 572586, 575427, 578003, 580513, 582952, 585325, 587591,
         589794, 591933, 594004, 596011, 597959, 599272, 600547, 601730, 602875, 603924, 604939, 605919, 606866, 608150,
         609376, 610542, 611645, 612688, 613676, 614600, 615464, 616276, 617035, 617741, 618395, 619001, 619562, 619897,
         620208, 620495, 620758, 620994, 621206, 621398, 621567, 621716, 621846, 621931, 622003, 622053, 622092, 622117,
         622134, 622143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 112844, 223690, 251591, 279077, 305906, 332220, 355215, 377811, 399972, 421741, 432027, 442150, 451931,
         461539, 470251, 478817, 487223, 495485, 503281, 510910, 518358, 525641, 532605, 539412, 546058, 552534, 558852,
         565021, 568797, 572496, 576006, 579439, 582588, 585670, 588680, 591624, 594298, 596904, 599439, 601906, 604263,
         606556, 608783, 610941, 613035, 615068, 616441, 617776, 619016, 620218, 621318, 622384, 623414, 624410, 625765,
         627061, 628295, 629464, 630573, 631625, 632611, 633535, 634406, 635223, 635984, 636692, 637351, 637964, 638331,
         638673, 638990, 639283, 639547, 639787, 640005, 640200, 640374, 640528, 640630, 640718, 640782, 640835, 640872,
         640899, 640917, 640927, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 115859, 229709, 258362, 286621, 314211, 341275, 364849, 388019, 410748, 433079, 443664, 454082, 464152,
         474046, 482998, 491801, 500443, 508939, 516961, 524814, 532483, 539985, 547157, 554170, 561019, 567697, 574213,
         580578, 584484, 588312, 591947, 595503, 598760, 601950, 605065, 608114, 610888, 613594, 616225, 618789, 621239,
         623623, 625940, 628187, 630369, 632488, 633924, 635320, 636619, 637880, 639032, 640150, 641230, 642277, 643705,
         645072, 646376, 647614, 648790, 649908, 650956, 651942, 652874, 653750, 654569, 655333, 656047, 656713, 657113,
         657488, 657837, 658161, 658454, 658723, 658968, 659190, 659390, 659569, 659689, 659795, 659875, 659942, 659992,
         660031, 660060, 660080, 660083, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 118931, 235785, 265263, 294311, 322677, 350507, 374669, 398420, 421724, 444626, 455514, 466234, 476599,
         486784, 495980, 505024, 513905, 522638, 530890, 538970, 546864, 554588, 561971, 569193, 576249, 583130, 589848,
         596413, 600452, 604411, 608173, 611855, 615223, 618521, 621745, 624900, 627776, 630582, 633313, 635975, 638519,
         640996, 643405, 645743, 648014, 650222, 651722, 653180, 654540, 655860, 657066, 658237, 659370, 660468, 661970,
         663410, 664786, 666094, 667339, 668524, 669637, 670688, 671682, 672618, 673497, 674318, 675089, 675809, 676244,
         676653, 677035, 677391, 677715, 678014, 678288, 678538, 678765, 678970, 679110, 679234, 679331, 679413, 679477,
         679530, 679571, 679602, 679612, 679616, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 122063, 242035, 272298, 302152, 331311, 359924, 384680, 409020, 432908, 456387, 467585, 478612, 489277,
         499760, 509203, 518492, 527616, 536589, 545074, 553386, 561507, 569457, 577055, 584489, 591754, 598842, 605765,
         612532, 616706, 620799, 624692, 628503, 631982, 635391, 638725, 641989, 644969, 647877, 650710, 653472, 656111,
         658683, 661186, 663616, 665978, 668276, 669841, 671364, 672786, 674167, 675428, 676653, 677839, 678990, 680569,
         682083, 683533, 684913, 686228, 687482, 688662, 689778, 690836, 691835, 692775, 693656, 694484, 695262, 695732,
         696176, 696592, 696982, 697337, 697667, 697972, 698251, 698506, 698739, 698900, 699044, 699158, 699257, 699336,
         699403, 699458, 699502, 699518, 699529, 699533, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 125253, 248346, 279458, 310135, 340103, 369515, 394874, 419811, 444289, 468354, 479868, 491208, 502180,
         512967, 522660, 532197, 541567, 550784, 559506, 568052, 576405, 584584, 592399, 600047, 607525, 614824, 621954,
         628926, 633239, 637469, 641494, 645437, 649030, 652552, 655997, 659372, 662458, 665471, 668406, 671270, 674007,
         676676, 679274, 681798, 684253, 686643, 688275, 689864, 691349, 692793, 694110, 695390, 696630, 697835, 699492,
         701083, 702607, 704061, 705448, 706774, 708021, 709205, 710329, 711393, 712395, 713337, 714225, 715061, 715569,
         716049, 716500, 716924, 717313, 717675, 718011, 718321, 718606, 718868, 719049, 719214, 719347, 719465, 719560,
         719642, 719711, 719769, 719796, 719814, 719825, 719830, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 128507, 254839, 286769, 318285, 349081, 379310, 405278, 430820, 455896, 480554, 492390, 504050, 515335,
         526431, 536378, 546167, 555786, 565251, 574214, 582997, 591585, 599997, 608032, 615899, 623592, 631104, 638445,
         645626, 650079, 654449, 658610, 662687, 666396, 670033, 673591, 677079, 680272, 683391, 686431, 689399, 692236,
         695002, 697698, 700318, 702868, 705351, 707051, 708707, 710258, 711766, 713140, 714476, 715772, 717032, 718769,
         720438, 722039, 723569, 725030, 726428, 727745, 728998, 730189, 731319, 732385, 733391, 734341, 735236, 735782,
         736300, 736788, 737248, 737671, 738066, 738435, 738777, 739093, 739385, 739588, 739775, 739928, 740065, 740176,
         740275, 740360, 740432, 740475, 740505, 740523, 740534, 740538, 0, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 131821, 261395, 294218, 326592, 358233, 389295, 415881, 442035, 467718, 492976, 505141, 517127, 528731,
         540143, 550347, 560392, 570264, 579980, 589186, 598211, 607038, 615685, 623943, 632031, 639944, 647672, 655226,
         662619, 667216, 671729, 676028, 680242, 684069, 687822, 691497, 695099, 698400, 701628, 704775, 707848, 710786,
         713653, 716447, 719165, 721811, 724389, 726160, 727885, 729502, 731076, 732508, 733902, 735255, 736571, 738389,
         740139, 741819, 743425, 744961, 746434, 747823, 749146, 750407, 751604, 752737, 753807, 754820, 755778, 756363,
         756920, 757445, 757942, 758400, 758831, 759233, 759608, 759956, 760279, 760506, 760716, 760889, 761047, 761176,
         761292, 761393, 761482, 761543, 761589, 761620, 761639, 761650, 761653, 0, 0, 0, 0, 0, 0, 0, 0],
        [0, 135202, 268144, 301818, 335070, 367574, 399488, 426700, 453474, 479770, 505637, 518137, 530455, 542384,
         554119, 564584, 574888, 585017, 594987, 604441, 613710, 622779, 631666, 640150, 648463, 656597, 664544, 672316,
         679923, 684667, 689325, 693766, 698119, 702066, 705938, 709730, 713448, 716861, 720199, 723454, 726635, 729676,
         732645, 735539, 738356, 741101, 743776, 745618, 747414, 749099, 750740, 752232, 753685, 755096, 756469, 758370,
         760202, 761962, 763647, 765261, 766809, 768272, 769667, 770999, 772266, 773466, 774603, 775681, 776702, 777328,
         777924, 778489, 779024, 779519, 779985, 780423, 780831, 781213, 781568, 781820, 782053, 782249, 782428, 782576,
         782710, 782829, 782934, 783015, 783080, 783128, 783160, 783179, 783189, 783195, 0, 0, 0, 0, 0, 0, 0],
        [0, 138646, 274954, 309566, 343713, 377099, 409884, 437729, 465131, 492049, 518532, 531374, 544031, 556292,
         568356, 579086, 589652, 600041, 610269, 619973, 629491, 638805, 647935, 656650, 665189, 673548, 681718, 689709,
         697534, 702428, 707235, 711820, 716316, 720384, 724377, 728288, 732124, 735651, 739100, 742466, 745756, 748902,
         751974, 754971, 757889, 760733, 763507, 765422, 767291, 769046, 770756, 772308, 773821, 775291, 776723, 778709,
         780624, 782466, 784232, 785925, 787551, 789089, 790558, 791962, 793300, 794570, 795775, 796919, 798006, 798674,
         799311, 799916, 800491, 801023, 801526, 802000, 802444, 802860, 803249, 803527, 803785, 804004, 804204, 804373,
         804526, 804663, 804787, 804889, 804973, 805040, 805089, 805122, 805140, 805153, 805157, 0, 0, 0, 0, 0, 0],
        [0, 142161, 281971, 317467, 352529, 386816, 420491, 448977, 477015, 504562, 531669, 544859, 557862, 570462,
         582862, 593859, 604692, 615345, 625834, 635793, 645562, 655126, 664502, 673449, 682219, 690806, 699201, 707416,
         715461, 720508, 725466, 730199, 734841, 739032, 743147, 747180, 751136, 754777, 758340, 761819, 765221, 768472,
         771650, 774751, 777772, 780718, 783592, 785582, 787524, 789351, 791131, 792745, 794319, 795850, 797342, 799414,
         801414, 803340, 805188, 806962, 808668, 810282, 811827, 813306, 814716, 816058, 817332, 818545, 819698, 820409,
         821089, 821735, 822351, 822922, 823463, 823974, 824455, 824906, 825330, 825635, 825919, 826161, 826386, 826575,
         826748, 826905, 827047, 827172, 827278, 827365, 827433, 827483, 827517, 827539, 827550, 827554, 0, 0, 0, 0, 0],
        [0, 145743, 289053, 325526, 361522, 396731, 431316, 460451, 489132, 517316, 545055, 558601, 571956, 584902,
         597644, 608913, 620015, 630935, 641690, 651907, 661932, 671748, 681374, 690557, 699560, 708378, 717001, 725442,
         733711, 738915, 744027, 748910, 753701, 758018, 762257, 766413, 770491, 774249, 777928, 781521, 785036, 788396,
         791680, 794887, 798012, 801062, 804038, 806105, 808123, 810022, 811874, 813552, 815188, 816780, 818333, 820494,
         822581, 824592, 826524, 828380, 830167, 831860, 833483, 835037, 836522, 837936, 839282, 840565, 841788, 842543,
         843266, 843955, 844612, 845223, 845803, 846353, 846871, 847360, 847820, 848152, 848463, 848731, 848979, 849190,
         849384, 849562, 849724, 849872, 850001, 850110, 850199, 850268, 850319, 850357, 850376, 850388, 850393, 0, 0,
         0, 0],
        [0, 149398, 296348, 333750, 370702, 406854, 442368, 472160, 501492, 530322, 558699, 572608, 586324, 599623,
         612714, 624259, 635634, 646825, 657848, 668327, 678610, 688682, 698562, 707983, 717223, 726276, 735130, 743800,
         752296, 757659, 762929, 767965, 772908, 777353, 781718, 785999, 790201, 794078, 797875, 801584, 805214, 808683,
         812076, 815391, 818623, 821777, 824857, 827002, 829097, 831071, 832997, 834739, 836439, 838094, 839709, 841959,
         844135, 846234, 848251, 850192, 852062, 853835, 855536, 857168, 858730, 860218, 861637, 862992, 864285, 865085,
         865853, 866586, 867286, 867938, 868559, 869149, 869706, 870232, 870729, 871090, 871429, 871723, 871997, 872230,
         872447, 872645, 872828, 873002, 873155, 873287, 873398, 873488, 873558, 873614, 873648, 873667, 873679, 873683,
         0, 0, 0],
        [0, 153124, 303712, 342135, 380064, 417180, 453645, 484101, 514093, 543575, 572600, 586879, 600962, 614621,
         628069, 639893, 651544, 663010, 674306, 685049, 695595, 705927, 716064, 725727, 735207, 744496, 753585, 762487,
         771213, 776738, 782170, 787362, 792460, 797034, 801528, 805935, 810264, 814262, 818177, 822005, 825752, 829333,
         832836, 836260, 839600, 842861, 846047, 848272, 850446, 852496, 854498, 856305, 858070, 859789, 861467, 863809,
         866075, 868263, 870368, 872394, 874349, 876203, 877986, 879697, 881336, 882901, 884395, 885823, 887188, 888035,
         888849, 889627, 890371, 891066, 891728, 892358, 892955, 893521, 894057, 894447, 894815, 895136, 895437, 895694,
         895933, 896154, 896358, 896559, 896738, 896894, 897028, 897141, 897232, 897307, 897359, 897394, 897415, 897426,
         897431, 0, 0],
        [0, 156926, 311302, 350696, 389624, 427725, 465163, 496291, 526950, 557093, 586773, 601430, 615887, 629914,
         643726, 655832, 667765, 679509, 691080, 702092, 712905, 723499, 733897, 743805, 753527, 763057, 772384, 781521,
         790480, 796171, 801767, 807119, 812375, 817080, 821704, 826241, 830697, 834817, 838855, 842802, 846668, 850362,
         853978, 857513, 860962, 864332, 867626, 869932, 872187, 874315, 876394, 878268, 880098, 881883, 883625, 886061,
         888419, 890697, 892891, 895006, 897046, 898985, 900849, 902641, 904360, 906003, 907573, 909077, 910515, 911410,
         912271, 913095, 913885, 914623, 915328, 916000, 916638, 917244, 917820, 918241, 918639, 918989, 919317, 919598,
         919861, 920104, 920331, 920560, 920766, 920949, 921107, 921244, 921357, 921454, 921525, 921579, 921616, 921634,
         921648, 921653, 0],
        [0, 160804, 318971, 359432, 399382, 438491, 476924, 508733, 540067, 570879, 601222, 616264, 631104, 645506,
         659689, 672082, 684299, 696324, 708176, 719460, 730542, 741403, 752065, 762221, 772189, 781962, 791530, 800905,
         810101, 815960, 821724, 827239, 832657, 837495, 842252, 846919, 851505, 855750, 859910, 863980, 867966, 871776,
         875506, 879153, 882714, 886194, 889597, 891986, 894324, 896532, 898690, 900631, 902529, 904380, 906188, 908719,
         911171, 913542, 915826, 918030, 920159, 922182, 924131, 926006, 927805, 929528, 931177, 932757, 934271, 935215,
         936124, 936995, 937832, 938614, 939363, 940079, 940759, 941406, 942022, 942475, 942905, 943284, 943641, 943947,
         944234, 944502, 944752, 945010, 945244, 945454, 945639, 945801, 945937, 946057, 946150, 946224, 946279, 946314,
         946337, 946349, 946354]]

lookup(name, aa)

Returns the AME table row for (element name, mass number aa), or None if not present in the table.

Source code in src/rionid/masses.py
50
51
52
53
def lookup(self, name, aa):
    """Returns the AME table row for (element name, mass number `aa`),
    or `None` if not present in the table."""
    return self._index.get((name, aa))

Ring

A storage ring, reduced to what RionID uses: name and circumference.

Source code in src/rionid/masses.py
15
16
17
18
19
20
class Ring:
    """A storage ring, reduced to what RionID uses: name and circumference."""

    def __init__(self, name, circumference):
        self.name = name
        self.circumference = circumference

get_ame_data()

Returns a process-lifetime-cached AMEData instance.

The AME table is immutable for the life of the process (it only changes if a user re-downloads it between runs), so re-parsing on every ImportData construction is wasted work.

Source code in src/rionid/masses.py
681
682
683
684
685
686
687
688
689
690
691
def get_ame_data():
    """Returns a process-lifetime-cached `AMEData` instance.

    The AME table is immutable for the life of the process (it
    only changes if a user re-downloads it between runs), so re-parsing
    on every `ImportData` construction is wasted work.
    """
    global _ame_cache
    if _ame_cache is None:
        _ame_cache = AMEData()
    return _ame_cache

ionic_mass_u(ame_row, qq)

Ionic mass in u for an ion in charge state qq, given its AME table row.

Implements the atomic-to-ionic mass correction: the ionic mass is the atomic mass minus the removed electrons' rest mass, plus the corresponding change in total electron binding energy divided by c^2. Do not change this arithmetic.

Source code in src/rionid/masses.py
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
def ionic_mass_u(ame_row, qq):
    """Ionic mass in u for an ion in charge state `qq`, given its AME
    table row.

    Implements the atomic-to-ionic mass correction: the ionic mass is the atomic
    mass minus the removed electrons' rest mass, plus the corresponding
    change in total electron binding energy divided by c^2. Do not change
    this arithmetic.
    """
    zz = ame_row[4]
    atomic_mass_u = (ame_row[15] * 1.0e6 + ame_row[16]) / 1.0e6
    if zz > 100:
        return atomic_mass_u
    return atomic_mass_u + AMEData.to_u(
        (AMEData.get_elbien(zz, 0) - AMEData.get_elbien(zz, qq)) / 1.0e6 - qq * AMEData.ME
    )

ionic_moq_u(ame_row, qq)

Ionic mass-to-charge ratio in u, for an ion in charge state qq.

Source code in src/rionid/masses.py
712
713
714
def ionic_moq_u(ame_row, qq):
    """Ionic mass-to-charge ratio in u, for an ion in charge state `qq`."""
    return ionic_mass_u(ame_row, qq) / qq