cpyte 2.7.2__tar.gz → 2.7.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. {cpyte-2.7.2/source/cpyte.egg-info → cpyte-2.7.3}/PKG-INFO +1 -1
  2. {cpyte-2.7.2 → cpyte-2.7.3}/pyproject.toml +1 -1
  3. cpyte-2.7.3/source/cpyte/__init__.py +1 -0
  4. cpyte-2.7.3/source/cpyte/_bignum_bc.py +250 -0
  5. cpyte-2.7.3/source/cpyte/_runtime_bc.py +174 -0
  6. {cpyte-2.7.2 → cpyte-2.7.3}/source/cpyte/astparse.py +128 -1
  7. {cpyte-2.7.2 → cpyte-2.7.3}/source/cpyte/bignum.c +45 -0
  8. {cpyte-2.7.2 → cpyte-2.7.3}/source/cpyte/bytecoding.py +105 -27
  9. {cpyte-2.7.2 → cpyte-2.7.3}/source/cpyte/compiling.py +114 -0
  10. {cpyte-2.7.2 → cpyte-2.7.3}/source/cpyte/formatter.py +23 -0
  11. {cpyte-2.7.2 → cpyte-2.7.3}/source/cpyte/lexar.py +162 -14
  12. {cpyte-2.7.2 → cpyte-2.7.3}/source/cpyte/lsp_server.py +2 -1
  13. {cpyte-2.7.2 → cpyte-2.7.3}/source/cpyte/mainpie.py +9 -0
  14. {cpyte-2.7.2 → cpyte-2.7.3}/source/cpyte/package_manifest.py +1 -1
  15. {cpyte-2.7.2 → cpyte-2.7.3}/source/cpyte/runtime.c +213 -20
  16. {cpyte-2.7.2 → cpyte-2.7.3}/source/cpyte/runtime_scorpion.c +78 -0
  17. {cpyte-2.7.2 → cpyte-2.7.3}/source/cpyte/semantic_analasis.py +46 -5
  18. {cpyte-2.7.2 → cpyte-2.7.3/source/cpyte.egg-info}/PKG-INFO +1 -1
  19. cpyte-2.7.2/source/cpyte/__init__.py +0 -1
  20. cpyte-2.7.2/source/cpyte/_bignum_bc.py +0 -240
  21. cpyte-2.7.2/source/cpyte/_runtime_bc.py +0 -109
  22. {cpyte-2.7.2 → cpyte-2.7.3}/MANIFEST.in +0 -0
  23. {cpyte-2.7.2 → cpyte-2.7.3}/readme.md +0 -0
  24. {cpyte-2.7.2 → cpyte-2.7.3}/setup.cfg +0 -0
  25. {cpyte-2.7.2 → cpyte-2.7.3}/source/cpyte/__main__.py +0 -0
  26. {cpyte-2.7.2 → cpyte-2.7.3}/source/cpyte/_gc_bc.py +0 -0
  27. {cpyte-2.7.2 → cpyte-2.7.3}/source/cpyte/clib.py +0 -0
  28. {cpyte-2.7.2 → cpyte-2.7.3}/source/cpyte/extension_hooks.py +0 -0
  29. {cpyte-2.7.2 → cpyte-2.7.3}/source/cpyte/gc_runtime.c +0 -0
  30. {cpyte-2.7.2 → cpyte-2.7.3}/source/cpyte/generate_bc.py +0 -0
  31. {cpyte-2.7.2 → cpyte-2.7.3}/source/cpyte/linker.py +0 -0
  32. {cpyte-2.7.2 → cpyte-2.7.3}/source/cpyte/sef.py +0 -0
  33. {cpyte-2.7.2 → cpyte-2.7.3}/source/cpyte/ui.py +0 -0
  34. {cpyte-2.7.2 → cpyte-2.7.3}/source/cpyte/update_check.py +0 -0
  35. {cpyte-2.7.2 → cpyte-2.7.3}/source/cpyte.egg-info/SOURCES.txt +0 -0
  36. {cpyte-2.7.2 → cpyte-2.7.3}/source/cpyte.egg-info/dependency_links.txt +0 -0
  37. {cpyte-2.7.2 → cpyte-2.7.3}/source/cpyte.egg-info/entry_points.txt +0 -0
  38. {cpyte-2.7.2 → cpyte-2.7.3}/source/cpyte.egg-info/requires.txt +0 -0
  39. {cpyte-2.7.2 → cpyte-2.7.3}/source/cpyte.egg-info/top_level.txt +0 -0
  40. {cpyte-2.7.2 → cpyte-2.7.3}/test/test_bignum_jit.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cpyte
3
- Version: 2.7.2
3
+ Version: 2.7.3
4
4
  Summary: The Cpyte programming language compiler
5
5
  Author: Hoang Duy Tung
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "cpyte"
7
- version = "2.7.2"
7
+ version = "2.7.3"
8
8
  description = "The Cpyte programming language compiler"
9
9
  readme = "readme.md"
10
10
  requires-python = ">=3.11"
@@ -0,0 +1 @@
1
+ __version__ = "2.7.3"
@@ -0,0 +1,250 @@
1
+ import base64, zlib
2
+ from llvmlite import binding
3
+
4
+
5
+ _B64 = (
6
+ 'eJztfH9cE1fa70xmkhlCCAMCBgkwAXSDooafBkQ6IajRpW20tsVqS4KgaBHDDxVd2k4SIFGpGy3b0tbt'
7
+ 'htZatmtb6rq+tOv1JkAttbRF63ap69qg1tK+tsWu+y67b3ff+5xJIhjs/dz7ufd+PvePWhhmvvPkmeec'
8
+ '85zv+T4nSS95ZoZj8C8Gfo9uxLD/gn/Fes+lXADEgFXINGkr1546svU/f3dv+Cq+FAdMJcOw+bEYFi5S'
9
+ 'YSK4ToFfypp6QDdIrpAwWfkH8RbZbDEdn0Tuq+AVS0XFB8OLB5isGC2t+Kk0q8Jp6KlU6duc5HJlVnFa'
10
+ '3SAdlZbOtbUzP8WzKlvog0o2dZnzcyw+s5iMn6ue61q1nk19i2uTxfdT78fGV7S3p1HxWRUZ+YOuqNTB'
11
+ 'aKc8saCyZPkgk6JfJoqfhe1h/fGkbCSZY8W2PVGr4XCgrs9okIbNWXZaXFwxhx7kr9GuQro+ddDK5tuO'
12
+ '0t+lGKxu0kNzUTGm/VjMXkyzFONTNFw8hnWm0mc8mrNKXNFhFvFzS7moI7+WYZ4Y27PYEfrMGkmb+RrN'
13
+ 'vSj704lfFOOiOXNbRVjpGlEVy4qPpPNm0opjqxQYtl+CYQljsydQ3+Ium4amG1wOS7WjvppoanI0Wqjd'
14
+ 'amoXdnE08WJXxEiXss+rxPoSL3VFjOmS+vAknyrx4qjygjuxz5o0jLupXd2Oesy5y+2wKBzbwYPLsdPt'
15
+ 'qFdQu5uoXdVEXTfVoHHUuxx5nY7GYbAcx9gxlfLqqPKMNemCSenrSuItPNVkgqfbdzgJHvy4HA1qanc1'
16
+ '0aB2WNyO3S5HfSdliujrUl6zRnzCKkesSRd1yae9SSOmiAFr0jkATcrTVqXPf6JKHMST4dZps9KHI5vT'
17
+ 'o4kX4ARPvtiVdEGwuWpWAj6oShyDS155yZrk0yVdsiJwyJrYB60D3AOxRfTpki54k8Z54VIlv+6BW4nI'
18
+ 'DE8aG0085xU8eJRfAegVDMCSS7xmVl7yJl5HzhOvdSG3F7sQAic+FRgnDcMtLOmMLmmoKzGA65LOWJVX'
19
+ '/W3kkvrMKHKI0yeEetUqhGRKGhCOw9CBfODkmnDi61KeBg/mJBijc2blmGB2TSd48ySNeyIus8jPdTzy'
20
+ 'IifvC4LXboH8JPhVEOzDR0w05sIO9+DlbShXkrH7sDR35I8J82PC/FDCWBick1rzSxJMR/z0ohFzon+w'
21
+ 'LnFKT+tMUsegH3EKjEjiJbPygkfZ15V4zpr4HV7tsJioHU2OOuzH1Poxte6YWi4FzoRj6eQ1rIbdj7Gt'
22
+ 'EWHR2GFsDUq2idl/DySbLwa7C3GUaB3tTzadkR2CVOlKPNMV4fP3UpfyKm5x7LQ48mCgaaoBo3c2OfIg'
23
+ 'eWiqiYeUczTA6NPUbo7ik652JZ3B2WtW6ATlJ10RwtBA05TQ4Ve7Iga6koa8Sui6C6akc7rkM7hnas7Y'
24
+ '63jHbgxlqRU9/YJKjtmSYBA/7FKOdUUMQTJbk74SOorPpVFe5ZXZYRbstlCPKaifmey5DLXbgMA6BVXP'
25
+ '+08cjSzVDLcUjjqUqOhkZzWcUM0Wx+5qwcblqAOcdTS64ZKob6J289SuJqoeQA21g4bWIbyBd+TRMCmo'
26
+ 'n3kI/6W2h4BbOwSzJrdjp4HaKXho6AaQ8hvA5fZOR10TtbMH3drR6UBuLQ54yk444R2WbtRvcKsJpq3G'
27
+ 'sSOAU7vUVL3L30ZiF+3YBSDEyQuhuqh6IfJdjHDkoAOJwEmncMKjKbxL7dgFY2Rw1LkFs06qTvAG8S9y'
28
+ 'Qr/Zc3uoQguRTwfBzkmw4BbYHQRpytTfRQbSKU5Ipxn+dPre23Y4CluNvepR/svUPyrYjFMJ+5djBpXG'
29
+ 'cdeIixNxUi62U39ctfdfkHVPYPfg44QvEgvrJlDiYcHEG+EMIg+V8I+qfwjJOU5gcv4u7LAnriLXz4Qx'
30
+ 'P66kP9LdD66kRo833KRhEq69HMwfLuVHKvuRyu5EZfoKMZaO3W+Se9qee8tPSqUoYZD0ak3rtAvqXbTO'
31
+ 'dGtN7INZM5p4GsZOpbygShxRJfOQJztMjp0KitdA/jh2qB15vL/rgEMoD5osF/jEMyrlEM4CQV2AjFKh'
32
+ 'aQ55+CFKCeUYnogBYwCD8Z3UbtpRVwYe0HjtVkNLHTuBiBjHbg0FGbWr2r7LQD2mprDIqYl0Gk/6Ckep'
33
+ 'S6GnVzu0GL0bRlbrqHc78jQow3d3C72HARedEeYpNGTMm3jTrERTnlOOqRL9/DPo5x+z8pxVOe5nJ5S9'
34
+ '6ORSVyKk8bg38asuwViXdFrgonNW9JLB0cQxPOnqaOKgQC8jKuWHXQHaucACSyTC9PRfXvbIgUNG/Hxl'
35
+ 'TboE5Cx4GOpKAn3rN4DL8+YkoMGLAmeOmIFqwD7xDCACEfV1JUG/IRaCuexVXgjiQEeDwoRCFKQKUBM0'
36
+ '4bRwMiiEBCSDjnhin04eODH7T9C8FggNxijxtBDVNXPSgOANcQ47yTlXbxGRaRIcuwW6gyCr5CP+Yfsn'
37
+ 'yiTMhZuwKFZsZphrbOTosPzzYcn4uPxLn/ymUf4d1tu/uFef0KPPb7HnYy2LT+oThu2FLUShR1/Q259/'
38
+ 'XLe4hVjiJrjI74yRn2PMX7jIUY3838EDG/ktF/m5Rn5zXP7dsOSyMfKaSf45G7lVE/mlGyx9ODes1w72'
39
+ '53cQS457tR79EmwUixz3oKd/zVCYLnKUjfzCKL85LLlmlI9ykX9lwVukZ1aLPn+ISDiqg0m/pNde1G5f'
40
+ '0uOd5SSWHAbQq20n8j3+E32BiyiCW+39Wg9RKJwsPg4nRFGvfslxwWawXwu4S18wDJd4/kliicdeeJLI'
41
+ 'B7CTWNwCrQPcmu/RJ7TYC4/bl/hw/yUsnHBrsWBWONy/+LB98bBgeR5Au2CALAuG+rUn7YtHkPPFQ3rk'
42
+ 'tlefDwicePTa86jf4FZhh72wU784gNsLO4j8QX8brYUt/ShyiNMjhDpICCF5C53C0Q0diAdOhoQTjz6/'
43
+ 'HTz0F8IYHe7XDgtmQ3at4G2Jz5owoEN+RoikXquyJQgO3QLxxFvg+SDYQvSYNx6bsmMgWsvY8oV6MPXH'
44
+ 'MvBHXfR/pIu4apDfCZeq/hOlk/XHperHpeqOSxW5CDvcY37kbT8L3YWl9CkhtgtdygtYoPmQ6thOEHXV'
45
+ 'BIygRUPxIKSrCcgKNPchl7RoWC1uqhGDBP6qS4lVJAFLnDYnggfoc9DeEO0lmIyc8iuvEjQwqOhrqsSb'
46
+ 'YFk4NRkUVFM3xQoTvwtx1OWpbONRQpaOdaE+vIaDZlYLehKUmJvaOeyoE6QpJGSjXyezAZ1cZ6DqPQE5'
47
+ '3eSX002OHZCKHmpntwPpXhCZCkEzG6jdgoQGAYxokBVksMlh0ToC8rjaDuS2A2Sk/9JJLAata/LraiBM'
48
+ 'gXvRLcduYGa/AVwaHbtArlsEbW9ygCQG+51qhCDBTDt2Q78JKhrmY0N1EAfaZIVJIWhmi19CQxOEUHex'
49
+ 'QkgghoVjI03lB04c/pMmmJsC8cIYNSqEqDoduxjBG9LGdu0tbey6JZjtkyraPQkGVbTdguWVXkI5EulJ'
50
+ 'x77EJvBxiifP48OUdT7P0jb0o66pPiVkEX8f9j3m4ovoGl1gCdOZ+3EJzlHWfCzBqWGxopFhpzfo7XHM'
51
+ 'wCWTJzQ2vx93jyrejhmwAnoIH3G5rFgaF9tJ9HSp/eI8sD6a9WYJ55aYeqxaP45tslvhEVJPfI3pHIsZ'
52
+ 'cK2d5Ww5vjxmyzgyINithk8CeIQtQpzwPUKZISGM5IT9eTS2mraZ+kclQJs6poa9xGMGsx2nRIJP7WVM'
53
+ '24THYAdGXINWzCWySMCGu+ZDr6Z4GU+78tIaGewwdgiai96XW6HAsDz4O6OF62RlA2SXZo7MailViPBn'
54
+ '2bQzZEpZ50ZRVMaH2VaaJJ9jS86RFS8y1TaGndG25c05sj/UlyoWjHaypndbVGWusJI5igtkxeKcWttw'
55
+ '4gzRtr5xq05Ryg6YZIOsbA450tIlG/J1Moe8LR64fLcFi5hDbtbojDDumh58VvUMSZ72eFjrrOPWBMs2'
56
+ 'jY4jtJ3Gbl1C9cWEUvqyqbhLspWl4JyRazuZo16yS7Y/rG+Wx0sWR8i1vjl0g6VUfZ6XX+R/Zgcnw1al'
57
+ 'ZRu0q0eYDkQBzItbGgAWiCbHLg+V30Ms4uHHHvGKUb51WL57XL4Vi6y3UEATDSwFC0Y90rHUTkY4F0C/'
58
+ 'AZzv4CBlqcZhyZdwFC63uuRoSrspdByWfKMJmG3VhPuRIz45eFgZSUdFF7e1x4ThOcWdhz7x/qZg4ftf'
59
+ 'vLFD+/Xjur9saCy71Hbms6++6yx64uF9f/zj9w8/8/P338gsvHfhfx/48re/v7TjyZ1GTCV72wWjhwYQ'
60
+ 'xzGPfK+mzTzzIIbxALAsho3o0iWZ48XRGMYAQoLdYvWguu0RgwhDb6jyYGeiquJP+8JXYBgHJgzYXXdr'
61
+ 'rygeV4VhGA2ISITxiR0KxSAmn2Ij+/Uwt8JvIGQPRpsMs6n3Rf4nCwiH6V8tYuNYTIKiEyCRYnVr38d+'
62
+ 'L7SAMB6XNO6wRIiGExAea1tzeVzrf6NYJECk5vBe6gou8mD+dsATeNUflqjhnPK3FT1B9uvi4joMU08N'
63
+ '6XfRUlLwMhnSc0Y4j54a0j9bRDjmmhrS3PmzwmjhXelbIe3ogvDSpoYkimgVYSZ8Ski/2KIJh66ZGlJN'
64
+ 'fzePVU8N6Z0Eh5jkiakh3dDMYrGkqSG9TB1jPeiSFExQSEWzKIynp/bSv+rWc8A7U0Kae4AgRCbRlJBi'
65
+ '9zHxDOrKyZBMh8/yWHewbSikP6TKKZK71VwUUu6BAhbLuGUEIf11xec4bsGDCIS08oEXIzGJLGiCQroS'
66
+ '/RimMQVNUEgvzvx3gseJYEeiXjpTlozJFAEjEoXkOf0PzOQJICwKqWrRpxRGSAIQjkL643tFmEITjBqF'
67
+ '1PXzv+IeHg9GDSGdeeJoaEg5laEhrU4NDSlWvTY0pJr00JC233M2JKS5zXtDQ3p5zc2QkFa+Mq2XHo0N'
68
+ 'Denyb8ZCQrr/0aWhITXPCw3pr49MC4nZFxrSO2XTQhqaFlJDXGhIKb+bFtJr00Iamj+tl7ZNC6ljWkif'
69
+ 'r58W0tfTQvrZzNCQKv7btJC+nRbSxXtDQxLbdKGPmyuxh7r6hUISGvmr+bJpUR1WlIY+sTbTHdrA1zZw'
70
+ 'ocH/413+9sC4CjtnfkKK8RnMbECykjqV8VGlrvawOctPk/qKZZj0RU7adiRFbS1WO+tZXUTH7z/c+Eq1'
71
+ '8e5DRa/8+ebC9S/s+Hi7W/P8P5PsQ6M5vy+dU9x67pD0zwNfNly4+7/OffZZ/sOvE62fXv+bolL+yqdV'
72
+ 'WfEr93z8xfHnb8MStwSw99435/3nEsmz/Zt3PFvqlEil70YfR6TyJrTzGvzNpnnlwKhyYwy+xKnXtvS3'
73
+ 'Fws1VUNnnewaFvk1I7/Jy7NlxUl9qAxTbtSIBTN7whCxZFC/pJ1YMtTUDnLzZzTaG7WA7rQQO5ocFtYR'
74
+ 'PxQlv+6Sj2oiazWRV8bl40Z5NjOQeEkFNQ8UEkkbNXvQbsiwPv84UXgSbTYtHhqPARX7s2pqEdpEoBbx'
75
+ 'qIZHmwtqaseEGNzu5B3lsK4rQFA6dnVaM74Zl3/jk//VI7+uISoGkZr3a3rlRTPS6APWxDNmyScuPdpq'
76
+ '6RSOvf3aDr0W9HBH/0J46Pe2xWg3p1/27maHpcxRb7E3ou1skKqORrcj/sP7Ir/BIr8zyq+65Fe4yFFW'
77
+ 'fh1awapRuQVV5TmVEmqSiz4oDBK/wpM2KlZpe/QFh+yLh4xpgYaYHFCuNHWuKr3pikQ9kLRF2L5XoXL3'
78
+ 'cRyVEEOqxHGzZE2rXTvUv7hHvwQ65Pu+wqv6xU647G9/RwotdeyEeGi0n1LfaV1/hZFf98g/N8r/okn1'
79
+ 'ntNBYTNzZDTxEgRgiF/cY19y3J7Q0q9t1+cP9Rf2evMH+6GNhUOG43Vos5iqEyrn+D+dll83RX7tQ1t4'
80
+ 'n2siP2cj/8Mor2XkVzRyuPyLT/KlT37VKJ/QpF6+blYKW88zr6sSoVgaQFvPiWOq5I3sLxef1C/pJfI7'
81
+ '7PlDZSdh9KGxUETtNqC3N+Lf/0L+rSZy1Cf/khN2AzX9ONrNh7aUd0KqoB5GWzmd1hZdvq8fum4JjNQQ'
82
+ 'N+BOPAMltC7pkle5MW2DRj6KxjfyS7TPqFfZtyuoBoOj3O1ohkKl880OvLC9v7CjXzusL4B0GoIekxlU'
83
+ 'scXmJAj1Q2/iamvMxtJNGvm3bOS3Psm3xsibyJX8c58ksA2qeYmz76hGWxLxq2f19i+GPDys1w5BHxL5'
84
+ 'LnvhEFEIndnRL1sWcVqFNr/OdCkftyZ9h2rg029KIAPBD4xFdnSeAlWhgR2ETu9xtHe5+GS/9nvRkpP9'
85
+ 'BR0QW/VFVthCgpoZOtAbgUbf3PYXyZhRPopFomaOQ/8LLcV2sf6F/WCSgdU7ZfFhlZWD77HWdjJr2bJl'
86
+ 'M6zFbteNgUE6HyTm5f5uYLZ9B5UfJGBD35UMuMruK/kp+0BVfcPmbbU7N1Sb68sbNu+uMq7Qs6VVO6pq'
87
+ 'tu9sNFfUVG2sN2+tmm/Ztrm2sapeZ7HUVLEbasy1m9gd/leyWZkLNAs0rFpA52dlajQLMtF/msx0SyZb'
88
+ 'sw1M0cFcu4sNeNm2tXazZVtjVW0jix573+atyKt+oX7ePHZNsU6HzMHw1ktranZsXVCzbZtlwdbtDY2W'
89
+ '+m2b6qsaGjDsyCo/k2psmrN9dLGC76f71oSn0k/Nb2dL/w3Q0T5aRABQmtHOao5pbJ6hvhhbHHUfvU45'
90
+ 'pOF0Of1s2McyIpfLlsWqPtCsac3Rm4aYjGzZXkVZtuw9dKDj4TCEzj6AQ9ry+LKNlmfxHZJPZcSsDmtu'
91
+ 'v68dDm7JFtMHmk4rsq22CPc6vbn9vGQj/4Gm3QsvJD/ag7OSalZScaefp1sl1Tz6OeWTVPsktf4fNtUa'
92
+ 'dsb55Aevf/Dy108e3f/a0Dvt86/X1HZUXCn49qetCJ/95NGhJ2s7kNzEfg08vQj+hkvroVSH/CqzdMKc'
93
+ 'Q9Mlf7jfdk152r+h6kVT088rcTlXTPIvjGhr/SoX3GDv4a0oMQNbtX4uKbMc6tcexxcfti/p6Bc9ijaj'
94
+ 'Lo4qL7JoYxOOY8LbjsNdykE/AZi9eORNmDQwh3h5uNM/EcUfCbvfQK79QAOLgXVgTRgkFmeo4SXnwJvZ'
95
+ 'WyL/nEH0+aUpchSOwNnDkr+4Ir9m5d965Gicz4KmRYszNVR42L74EJAzscRtLwSidvWjpd0Mwl8Ff1Pp'
96
+ 'vT0c5lfOAzHM3alYzv7ZDI6nwrVetjeD9LrN4mKJaEKkUlRw1Swt+UztUUneibOZhnttKkLUTETJMtkc'
97
+ 'hrR/FGNqZpmydMlqyZMdPvaG1bh+tsGQLRpA8SC5vK5tNmefT8zo9j7dFfaJ6f1xskbISRQLI8TSJsSC'
98
+ '4iPbMSjYPT8h8Xgsa8DtK2ZkcY/QbYqYh2mbty+8ZUYZr0Br7jqJigvoEsGPVvDTIfhB7Y9px5j7uFaj'
99
+ 'djZ3lsagecjxZNv2tOqntq08HdrmnAlte83mVrau1zY6dW+2soqc4+5BN/aZSfZztU0laZHYTOMvi9oj'
100
+ 'W/r0pvGSfHp1S1vv1cRBzQA/zDGyogf4G1YLr9NJV4scvZWcOFVCr5J1d2a0RO6tp9OKmJhMtVd/mTBH'
101
+ '2aNlhzPxChRPmNA/P0H9E3Pc+7RXOmx63yLe2lM1IsodyWq0JtTEn+IjJtv5vzh2m0PGLjk4didvH7t7'
102
+ 'hbFbi8au1T92pv/1sVuOo1gusBmMUM6hPu94YG2sInO2kVtqlMQ+QLfeNyd2FRHzJDacI+L+FIPnLsWi'
103
+ 'J2MdNfufMY/Md9pj+5QDXqlVftnUaqTqsGNSlANv2lgivLkPolUfg2glyrT4GF+C0+TEu6ysovk1zKGI'
104
+ 'WUfbdKnyDpl8PHZZcCTKYCS4Hh1q1iJ2ttHQzMY8ahQ5tHmKCmOlipY8mW/KKvM40rwMUUzoNBNbcHkm'
105
+ 'dxKeIFe2vLFX0kBKs+XS/IwbVkzy/IbLhEqmfVc21tmkU9lbZQfxRL6L2Zee9nq8EaeHzrpYOoshNEWM'
106
+ 'JLPpyVSI9BT4cSTT8WO4el8OtoqtaWa1zeNJK+DZNfDsu5ccsspyxnWrAsGequdnRxuiOGuHNXV/xHCm'
107
+ 'JHvAg0Ha5+yiz7HiLRiRbrQnwGsxeO0HRWQWRozfvSbY0B3859GGFXR0Mj0zvYOVG+LvsfZu4cQmo9ks'
108
+ 'IeYq2qTh2Qojrl5T1unlpXxXX59MskYTHRu3UeMW8d09Gjse277Yb4zlu+H24XGp77c9PK0z4qnpHoJx'
109
+ 'eTP4j2R9rEK5Sthu04ebxk9mKIze9Z0PrSHmdoZt2Df3hag4Kylb5Y2DF8SXvROHr6BNnFjWkcoaRoj1'
110
+ 'OEFsXiWmXbj4VHi48R0pS5Q2PzRTlqnhGZJ4bU7LGg6fd5EhCBm0ecEvh0XxTtFE3gJ1Rc8BlWTpTLup'
111
+ 'Z2JgvecgJUp/lGP+GNGNlahSeyFqdaV0kVvEtMpGJWuwF13pF3npspgs575NJC5bOc58AZadH8a+jsfK'
112
+ 'Pn6rL9ctMhU82AuWpV9I/8hL275cPzrLiHO/nLceeilrbP1oyiaGjNUctD2C4St8enVrM718Efk2W6iZ'
113
+ 'sOGx2OdrTdBhrkIZ6r72mVYvv9dwY5amyWySQL9ew4n/Gocb4QrDI4WpJaIwhc2GV7KuVsYp7TRQhRwv'
114
+ 'm1PfSFjlXsK+ELqu1976GPT3Uz3jvgSjt7OllfqMl3rSMgonwElBxXteh6gZi2cuz7BnAfMpONpmjZtV'
115
+ 'vMSNJdc6rVESyINnNiussot48wZOoqtrtUPSva0g7UtzHyeermcMb4ltvVkw7EYz54Lw2qREq+xyvM6w'
116
+ '0sdskhAF2EuyylEi/FGO2tBhzWg2mSPGsI4sV2tkxlE8EbtP8vi4tTXXbTef4eKKenokjZgxnu+j4j7h'
117
+ '5afnEWsnbg7sjSTLuLBoUidZgJ/K7rYdCycPlKx0bYsYZp10S2va+lmybpMix3CetUW18KTsgHUtf2/E'
118
+ 'JyxHruSiHPwgN2fgGcmjzABlK+pcGvaNFablMO50mpMfNSWvCvdzz0I/xzchXnR7n1ZJz5veZ8WP9lS5'
119
+ 'RXkjWR26cck6SY7rsul9jsJn1cR/xRrt8+2JJBjQrVjECdmLDLCpNUa0CIyL3ZJ1bWX0JdP7PeFWMO5T'
120
+ 'IeN8Q31PlcuBjP+CjM3JiHFdJeC57VkaHmeagYx3FD8HMawjq3uqqve5wbg+CrjQutAGnidaS6h1ko+R'
121
+ 'sXsWouoy/ZkTstejevBbHGkSOPKawJHS4LokEq+hq4xE631RiBrXEKnY8bujePLJDWElnMe/vYa4kboz'
122
+ 'N/YU99jRcodFS7mwMF+4fDSsngkw5LKZynhmCkO+GGTI/nCXTDbJkKdWI4bsFBgyh51tcO6z/4RyZg64'
123
+ 'B2EWPlfeWeniF66aXPKUFXwTpN3DC+gHbw5QxTskaZ3AqdWbOdueQRV2hfA+SkRrYIU7tYjF9ZeOxepl'
124
+ 'Mpb0cqkOFYcruGY2p5EVL8Y+6ycDN/QOlczISBYNuBHTzWqiK93WN+qCz/talPEUt1fH/E3WjV03qZTv'
125
+ 'jeMTaWqYOO26w5Ef8dKNspTHmyqH+Xv3ir6TYHs2tZjgqWt6xAcIfiC72OLiVXNHKuavI9NSeWuMDCau'
126
+ '5HK8qn4ly+ScxF/nrdaYr3FyEJN5lutgdizLSLqLh3lXeaMbT2vNZD8rEVfGYJdhKshSfm17WXqWl0sO'
127
+ 'zA3fe9goufqbHr5TxF3Mddvqjrw7y+g1fLzhney+KHigmuUkoviP6Epjh4ldaUpJfA3Ds1zE+KoHNG7b'
128
+ '2Ve/AOOmPzS8k108Y4pxbdD438B4mBg3PwjGVuJMEmItpXFwtn0n9qunxdU+sXMTuZhd6Qsf2Ax0lXJf'
129
+ 'zwRX1tqktnLrlYbVjHh8+3r2p+aYwbMRbzORVgI4vXT0rYE5RDOWrGjCo/twQwGW9kKUCEha9e+Yq2kZ'
130
+ 'LY3WlETjE28vdLVy+2s1jsdppQIWuJx7Jspeegov6HwpYcycZDsbcdMYWdzM0rN1ojYYdq27JWaNqLmS'
131
+ 'kcC6SdA6zfBERTcVc74/IlMNZG5vyxHF9xITAyZZcCS94owvWFcFM3AAetqzyMMr7BOccb0NcUIprCtn'
132
+ 'WFbOOQnGgRarXJU9iyPWaq8utufSTpJ5BoHadLuGQ6vUoQ6dQ3Kj3UKnmZzSE85NLYeFQX+n4ARtsGLE'
133
+ 'e3QxLDkw/O90cGy1NgyWHVzdGXY3czewr2b8WXwWCd7ytfaMCBjsGovk/llgPNufK1GQKyoaj9UwH9Eb'
134
+ 'eOSg2++ADr+7vQwcXMKat7gkumbW0/IwLLPODdAM557fq61KF0XVYBSweXFES66rwRLns9vz6BRRV8RA'
135
+ '31sovRIvsLvs9DJGBF0uceOnFvF2LGozLg5zyi4WN9dilPUm8Ra2fNEYeQ+Z1gnzEDj4V9XNIupIBYzI'
136
+ 'eEmqj3+gfYJjVr5EiurqNW6Cf6b/YVGq/CGGRTp3+RT92I14EjRaj7imp2oM8SSv8wFPZtIXTe9jAk9e'
137
+ 'ZquB+pIQm/nsHLDZ4wywKx6DqO8Q4knJA4hUmXBkXKtCbheSW3qqMAcyvsq+B8aJyLhHj4ybXNdArkYi'
138
+ 'nvwPlQU8r0CeuT3IOD0KPJtnI+PjLYe3xtekgIG+DBkwApFujOqFgOeLckayupfywLr/RoP45WYib9+k'
139
+ 'IIouR49mI/bIT8i6Eet6c5G34bY1wLp/Qo1yJSDWHUhFxrvIWnh0ZPqfso4u90BsE/TIlPpgnaCb3YJu'
140
+ 'pm7VB1VGOlgfTMpSbHUYqOWlSC0PFafY8WZrZqEZFmJmFpQgOylLoDT4XQ+UBsmrgNLoCNLr+5hQJNMD'
141
+ 'D+61dqhkhjAGFFnrg6LW3i8SDZkByi3i9TJmIYjzfWJCZJ9dxKRoIIUvE3g8kd6BT3SmKSpMSORdmC+L'
142
+ 'kh5JCCi+hWRWk+eVjKBSLcXjlrPvsM4NoGVMPBN+FrNFX29TsBWMzeT7uo8lH2hmSx412lphvv4b0LRT'
143
+ 'pjGK74Ol9q+S2YyzpWA8914upm3QLfd8UahTFV5+4YjYiVaraCGP5sCA25HWH0Van0F55EFLaLsOxkeS'
144
+ 'RV+A0Zag1PiERYOZQIKB087DYDYy6FVyUd6UPs8V+vzpH6xVztHcZtoXzoxGFGsG3GOwEigf1h7KCixC'
145
+ 'ZdpKIz9Zd32AK/36+YOMtCytZ5My2CPXsdOU6OwvKtiqCUNYDPS7+EFRm/bz9DA4vWc5LFAe/H7NUpUo'
146
+ 'a8CjsIPkHFTO+XUMWXeGj+YMGm/BMLZZxysCdZgatR/NIzOaR0bU/kE0jyw4pNnJqXXY20LbTgptC5uy'
147
+ 'rkta76NvK3kMw9qnOVKoPtGaTkxd06Hjvwsr/jutihYlBgqTBdostWcT2T+jLbiE7566hMvHo5ZqbuXT'
148
+ '1CVcKHKqjLa23m9upVzRrZTrF/cfPDTBeT4EObYnsiUjwuBhYmRMMv3TBMNohOfdtCCj95k9xp4/M3YR'
149
+ 'XFSfU4FqL6oKC+S+Q9pTIkqX6JTZbpGRaCljvvszQ7Qg3f52PXOaHYHS9kV7tLokbydW9GpYmp0ykakx'
150
+ 'H7yktB7GOcMsbGAJMHCz5Tn1C1FtoAxjvCui2k2yNBMtvYA+sctnkQNL37MQtEsnKfoqDFhafaPdmuO2'
151
+ 'rdrzxVOGPia2JuojOgJWom7TvhgmmvHS8mJ0Ef5yzYEWTLLaxPFShXo55zJRvSKJaHWMlGGJXOyzNHF9'
152
+ 'r3h8qVHTaV9rl8bl1A+miKyyf3nWQjTruw/OC2hUfCH/7TlRSbsoJod2ytbomuPiDKMzuWciup1rbNGw'
153
+ '4vLictZbAsVgnMdKztB5PTesGukVo8h6snbxZcIbNwgodO06DRVdSoqJd6niuYf1YeTlgoMUrHaL+Z//'
154
+ 'u+3gkKju4Q2tWCaGpd+BtzUo34bRfLMgWhtm4a5+Frm1p6rJ7oE5th1xtVeOCPOmDmnau5Dy1EhXK2vi'
155
+ 'S5Gm1c9FhFndiuj3t2hC4jPT8mEVELi6HhGmSb76RFWZA83Yr5keMEhC6T2kB8Js202PmN7nI1Gq3xS8'
156
+ '3TWl1n9QhPK9RjWl1od8zzVKxGuiWo1ascKompLzpVGyVOw+mueulImiGI3In/v0/0TPlqku6pRoj1Za'
157
+ 'vCIM5sNjy4KS9trMFCj6J+fDz2A+sI/AfHgmvE+cq5ftnQ/5HeZYIaEmnCmB/Y5fJXsmOPYTdwyRrk9w'
158
+ 'RatBmkpz1XjJ+vkDlOhdCUgImXY88W6uiAcBkNVJjKvu1gRoZ/tYJWOd1L7/xIPaN5/e4KkKPG6z417J'
159
+ 'jIm4OcHHqdHjvhEel+SKLkOPW6zGl6+fH2jDnKTTnGTmxKGfBPdjJveb7C5Jxfg7VN+sMTxMkfIrrDkq'
160
+ 'xmBgP1sqhuK6ONq+XNKFnfqp1DUs4S5j7I12BvQP/WtB6Boh9oO0Z+bd1gzyu4fXQANGkJg+4Cbi3fjE'
161
+ '3HnBva2FEFxnWZeRSLfPc0UfxfdEkltiVzLUwB9EXxJ84XWZx08K4XGVs8N97x9ni5hjZWrv0ouKYJGe'
162
+ '9voSzpt8McAKD6W4vEp+25VgFx0gMl7gzuhcE9x4TRepVHVjzMs1o4Pc7lewosxxm5PTGLxQ7yqM49Ea'
163
+ 'p4lUwaJXicl9hD2TZrxSYwc/6Ikd+Furjm2tw36pkHU71784ow+CqNYpDZoDE1y3uB4mnlFjAfnlzQd1'
164
+ '9kbcGZ8zknyYg5kGXb1Dl2jQRMXIlMn0jmE5rHK/aQW92GQxc0hAbvfJs4x9cendreEcoeUKUxuhn1+0'
165
+ 'zV8dVeMZtrOK3UwLHm1bhRM32nnJijDSJil2RQ1IFbTrSQP/RqqdPw7hctG+bPtD9Jkd8oE/FJOpI9b5'
166
+ 'JWSxT55mGmSIlxABHj5Hf4K/WbyEl4FA3sJPCuRiFxUzMlUgdxMT57iIYN/9nVQa8ZHT8Uw124/P8XwB'
167
+ 'ZXGg0+/OGcCTjZ7IYI30B7oSi/RtAHEZYONFcca8XPxUQZOdK8iDv7ydvdE/g7hHDspgbFSyV2l4ZDBs'
168
+ '/AOdkkybjR3kKvbiy0GnKgp32ZeDiWb3d5KfKwey++aRiIF79Lo3b7SPx8xm6BRFKVUKmvc63mxhKbR/'
169
+ 'cL+PfcnetMxzvosUHRA91DLXJPqdHvsQeTkRTUUmQrVvmS1PKgBRng6Da7RIHLaKK/E62d5omoyaeeTK'
170
+ 'T6Dg+Rt2Kt9tN3Fidk4tJ93K3yPKqHXiFWg345Fd9BgzRmaG8+7HmH0JFbxTR9usO5O2sGTh6HV4CX/e'
171
+ 'qh5CYvqurzDZNUycEaXmwp2RLQd84ekT4ombPjn0pwQUkNv7rilObdwXEE8Rj5NZ42Hjo7qkoEqzR5St'
172
+ 'Lkb66WOoKfhfjeAHKLoOPdIFj9QtT7atJ6ujkul5mbNmGwdntC7hUhRdb+1xcvQlVLPcu4WPPhZujFhX'
173
+ 'oilONkRZmfNLS1i6fnSZWUPp/6rLd4oy+OISVrNz9HuI2i55zPW9jkyl0cS2f4p9luws5p3/nReJSyRd'
174
+ 'qqK7sFYw0mc1c9/jXYoU4iJWrnYWw5J8lzlhti/8comZC9cvauZ5UbS08SWqIxm4pBeSaGlpmdmp84IE'
175
+ 'zahIkdywumf16mx7Bqi+LWOSsDk2mxXK8YzdUC0cWP4ovy1uiwoK556+JNkxXvRHLOa8eNAUMeiQHmZO'
176
+ '3q9u3V8pbNsZngxvesUkTf5UcfkeMydO7RR93WGTnjCU9OC1sZfjvTOjoXgRrzvM5i3g8m7gRfcbWtkU'
177
+ 'RvpnGOxDc2H0W9ZwyWuM3rj36DzPa338/g8KxLrYkbYY43BwM7M3J6z+yu9E87r1ZOrR/s8fMYfJSO1a'
178
+ 'SJgdHlAisTWZkhT01QpqY/hBpgWt48u4w1jS1dUKuukYE97HSyWtZaOyRyC4l4qPaiRvQKH2GisUbyk6'
179
+ 'K1miEVUKF6Kor7vmfpoShsvSUlA9BxTpriyyiGUk+6Lwx61y5jxJk4PsEs8X0jcY136V2il8u+zMTKbl'
180
+ 'WVq7Fjqr8U1++etQib9Xofv5epUtapATKs2lhaluvV9+bK+Jcu0FyaHxoFBXci5XCkgOycENqSA5/oUl'
181
+ 'ZwwUa9z2KKKMcTzgEj8I1ft2Y2s0XfK67Xn+55HLVOx1DxPvCZuo7oqzRYdnF8M60S2q7B5OPv1Yifex'
182
+ 'jd7Hqr2PDXgeO+N5bMjzWMbf4u1xJBLp24U9MaRR9Ugz6JBm4JBm6EWaoRrp8hNo6d+CdII5QijTdD2w'
183
+ '9C9CK7uFQqKCQzWdXY10gkLYKHtZEO4xaVvfx4Sir0LYHMtAO2nuVqQTTggV4kzk7WYxKicbUJlmkevA'
184
+ '2zmh6CtANV2nUCH+jUE1XfLhmvd9gpDgUkz2+f0GVCdo9iBv6qgeoSpEqqMEaZhfIg2DxSEN04eKPmIt'
185
+ 'Mub2IW+voBKySyj6BpYh4wuuqyBRElCF6EFFH7ELNYSL3AwV4nVk7L0LqaPvlw+DcXQYqhBTkHFNGmrU'
186
+ 'flQh+qKgQpwwIEWUGYYEzxwU5/k0iFP/PHp0z1Po0bujkSpbI9TFK5HxujCIs2ce8jYwG3l7S9BazyDj'
187
+ 'v6achUc/gox9P0XGTyBjJgsZ3zMHxfm+YTuouGeRcWbqpzB2G5Hx+VKPZEq9dF2oKQaEvcKpNQXRapTE'
188
+ '6vxlau7/Rk0xqaHQtuBUDVXzQzXFojvVFCJHrwZq03agSLxRPpI74NGiQkqdKMooYkQ5ah2oYrPBHm2o'
189
+ 'dOoOoNL4Kv+eD//MGiTdlwjtAHYDWKCgnNHmdV++tV24H20XXmX4e1eIVtBXx9pkctEfgU72tuoqLZTv'
190
+ '0aexsAqMjMCiP6KtnKiNCUP6JwbEW5poPL2UDbcq/2yUNDO9G7l3D88WXZHulX3oUf5ZQz2kedv8EqEq'
191
+ 'YsjVQoFtXixOPyyaSPlJsMAukjXwtvxelUQMa8ZwewlLLMI+I8TBcMVlfRxaI/bBSnpqmDE2s+rX4PmD'
192
+ 'bJxn0Qq8DitW8uhNFnvcqvg1xyyDy834AbRhGNu+zlCe67ZZw7/8zeX4UVogNqhZwvyk0QqkIcIlB6MQ'
193
+ 'vwHzbUm3csMWKapVjGz4cy+s5bF4k+/5V2FReElyviqi2zTGv320aVm3SCDfoxX7+DRSJWxmmmX7YWWN'
194
+ '+B0/z8RiYp97cxhFu7wJ/LfHbBOcsXW3WqdkngFNOXdEH3aVP7nADosdVhfWeYhowMpfEUdZhyWXfScg'
195
+ '4ILqsJleuhg1zpfseXc7nnIel0Yz8cftEycWwAL70IQj2k0ceJuT+/7zJH9dxLUpYtajN2JneRn7i+E6'
196
+ 'TVmZfebFn+z0Kj0zJSaGeQQbZOw2hK9PVVQYG6Gz9z160xaONrW2xDTeOCtWHGc5VD9ofqj+8SBqqEZz'
197
+ 'cgDtMRDxaNJa7IiqLIiqVEL9MyTUPwWu4/PtycjAIHDZq2gf3xuL2HCgGO1YrBWoSuC1JsRr/cJmlkag'
198
+ 'quvsO0L9A/NwRCiQHkfk4otELFmM9qrsK5GxZQ8qvTSqqnWSZxGNGmcgbztSAu8+o3m7TJi3h4S9AIQO'
199
+ 'nPfPVLSVf44u3gxz0faYbsZJneIygb8FWjWe9Y1JyPD1M5LpD5bZ9py0cZUe/qUE7RzL3c0slxw2J2Uf'
200
+ '1uyIMqSKli9q0cX0zilijmYJqTxaADOnRI5PRKe5Wrj9tZ5h1jLES48YO/WSbVjRsjDXMI4L1QFaHUtk'
201
+ 'aO7oIP8MKVj5MfIYM3g2opKjrBskjaWzUjKOugzfyDwtkmK6vVYh8uYSD83RashlkfQqphqvRtsimFxY'
202
+ 'c1IRi0f3oHFClCmuDdSpLmFfKBtRuH9f6Bx6H6Z/FlT7U3htr9A/r07ulcSM0FjmbCPRuloSu4r0143G'
203
+ 'h8TLAu8QI2K7E69FSz0zaUg8UQRwyasPu6jl71A2UtjkihmP0mv8HxfIKDcqQcI9EI9Ku27Pg0r8PawY'
204
+ 'EpyPEDaNhPTsOYPXx2RpVnhP4FDR5aCq5kOVS0cWpQX3OjZRTPqfQLafY6HcW+Xg23EuuMv2pJ2RrQNi'
205
+ 'XB52mi0h+3z5VZz4yuwqBmZsd5rsRa+yvcelJ8LbnzJyEpBzK422HHpBCq2v9FC+5582yd5B/7OOyHWY'
206
+ 'LN1kj+AcszgYc11YGxubw5bfJKHsI48dopdVCxvGL2NFaikTRbH2fOazGWJipeK9G4ovD7jx2e0F2ixv'
207
+ 'N3G18J54kCwH4zPghaXH9lSJ15GHPRG1rC1KYxPelN1D55nGdIzbLd8IAgi9KdtL6EqYeSYTlv8SljUo'
208
+ 'Hs9fHdh+e7pHi/bniUwgym4kiJfO2BwVkJ1VGSOeVRnC3I0V5q6wskfDcu8NG0afC9iC9pxz0J4zegct'
209
+ 'R3i7TYJWwKtsE1gmIgMfAYvv99YYal3bapQ0PVJkUKE7SEzNF/9nQmy3PhMy0CF8rmEhcPObYrPT+yYq'
210
+ 'GkbSORhxXxlaiWSxL5YrgJpqYHhcXcUk7vfTJfjpuS3vuM1RaNtCXWWMWhrY+T1+d5TxPpLVCe+83Xk9'
211
+ '9ewU64SZqbCJlq0er/Ew9hSUhLMeoSst/L2KYDnXhXe0kkV99KCYQaO3BTvVR+890DrBaY5GV3ofNnTV'
212
+ 'wgqJoo/IR9u6O9ngJuZlLDqS1ctceZCK481m2jm3iHn6CPmIkyZFDe+B/JW5stC7VCa+Bc/ptEd11JtM'
213
+ '5rooaSHUwWo1Hk9SB1pUWb3E+IqVmrbL6DswjvlYW8whr8Rtl0EtfdRN6l17Fa7IehseW/pd2d1kag4q'
214
+ 'SwgjWvicZYRLl+D8yGqDvDrftO+q4SM++vTMWR1lzaN1ymdgSX57UNYBL4x7s+WYbb5otVuyiPHSCv/C'
215
+ 'VkImaG6ytJGhfgtr2ZkoJm3IyqY4YzUa/lARFj8smnhOHVgMwu9149H2u0xpFD5A2dKHRUB19iL6fg/5'
216
+ 'NpFDx9CQhwY7KpTniOK/xyfmzA1usGi5Xe2iiaNz1cQ8chNMtJoXRRHQRU5o2j98ETAza9HMfKeFyelm'
217
+ 'ouji+2xltF4mXUB6TWv33WX5Iy/nZmNPqJW/EaNP3cwS8hdJV/0MpBkFsSbeBhoWvalbg3jspA9IfxNz'
218
+ 'EhhP0NEeIakLhHd6qdUnqsaIdJCcLwkLUiwyOGlLo9ZJHkIrBCb3whLyoapp6ueTSCEXyZmBt+o/j2nC'
219
+ 'RXfEd/8A/kP2/7f8/PjcH+3/X4zL/y38/7f2/pC95wfw5v99vI71f9cwS86ktFBPxTpN66zSwdhettoq'
220
+ 'ezluzLffGjmcQJ89Y426qlTjX1lj/p5SVnePLe6N2d1vPmpL+GCOVvSELe0/flLW94Rtjk3dZHPa1PvV'
221
+ 'ncV7bHOfU/eK9toyjqhH+vbaFhxTT9j22TSn1Ap9uy3rjFpLPGnL+URd1v+kLe+yusm+36b9Rt2p/7mt'
222
+ '4B/qXqLTVtiWPtLfaSs6mD5hf9bGvZCuKHnOVvxqupZ83lZyIr1s4Hnbsr70ppZDNsOH6Z0lv7StvJDe'
223
+ 'S75gK72WPjLwgu2e79InWn7l/zpWFQiKvyNtR3T0Jgf081Ok/zOcpYH1vyzAo+ivEX5HKP/1s2CHvmLy'
224
+ 'Jul/r5EM2AXvYwF79O8a3ET/Y1X0vTf0ORzh/+ORhmE3SP/7GVmY/34Q/yfp/2zikoBfhDsBF4n9+kQH'
225
+ 'v5FT7KMBnxF4XvQUfHbAviLEPlfsfx+6DvO3FeE04IVifxw7Q+JcHsCtIfjqAL4vBH84gP8iBK8O4L8K'
226
+ 'wRvEfq3/a/iNCMaTAc8L2J8IsW8P4J4Q/Bmx//VnMH+/BvHDgfZ+EtLe34j97wtdxPz3g/hvA/ZXptij'
227
+ '/n9b7NdyX2L+1wn+oZjsD8R/Y0r86LlnA/7/FeL/U7Hfrxi/Hf9M7B93GT457gi/GvDP4Lf3z3di/7gm'
228
+ '4v77QRyX+PNhHj6ZDwiPATwO5RXu19FBfK7Eb7ca8Khg/DD/CwP4hhD8HsBnwnUj7vcXxKsC+N4QvDmA'
229
+ 'u0PwpyR+PXQC8Pgp+GsB/KMQ/N2An7EQP5cC+L9C8L8G8BjR7biM8uNzQ/DUAM6F4AWUvx8eEN3eD6UB'
230
+ 'fFMI/kgAbwrBLQF8TwhuC+DPheAdAfw3IfiRAH4yBO8N4B+E4GcC+KUQ/GIA/zYE/yaAI0KciqNkRnhU'
231
+ 'CB4dwFNC8LQAnh2C5wXwkhDcEMDvD8EfCuAbQ/CaAL4zBH88gDtDcFcAfzYEfzGAvxqCHw/gvw/BTwfw'
232
+ 'oRB8JID/OQT/ivbPx2+IKfwM+D8D9miyT7WPDAv0cwiuCuApIXh2AM8OwZeG+b+iXUL6nx/E14b55/+D'
233
+ 'pP9+EK8N4I+G4PYA/kQI3hnm57FAE/w4LIovhE1+7VwyBT8SwKUh+OsBnAnBTwTwuBD8VABXhuCnA3hK'
234
+ 'CI7+PQwLwk6RsNa/Pg+uFzQ01gu/mcIxSzhmC8cc4ZgrHPMqNqOvOpXXVu0MnG2sr6pCv7cut20th5Op'
235
+ 'l9vhLC9nKgKu4KemqjYAmisrbzneFDhr2F4RONu6vSZwVrl5h/Dlqg2NNbsXbL7lc+u24Ms3bLUEziz1'
236
+ 'cBQOGy3bG9H3traaa2q2bSivqC3faN4c9Ni4DQVTXyXcw8t31m9urKpq2twoPGb7VnMTekzgYnPtgs2Z'
237
+ 'WVrhamvV1oaqxgUWza37gGyw7EKIH5zsqQUbttVULsgMBbJCuux2s9vRO9tmT+/lOziZeiMrZBTuYH4L'
238
+ 'vbNt9h3R0NH1o7mTw3v7g24BWaFAdiiQEwrkTmZKaMduut3pLSA7FMiZzLHbfdwCsiZz73aLW8A0i+xQ'
239
+ 'IGcya2/3cQvICgWyQ4FpPnJDgbxQYFEooA0F8qcFppmcSSHN3RYyUreA7FAgGKow6W734p9lP4xl3QHL'
240
+ 'zsoCMtLAvM3LmW9GX+Scv9W8YVtDU1Ye+gLnwvsbquobFm41b65daNwlzG9j/bYtVRsaGxY+uPTBhQ3b'
241
+ 'ttdvqFoIU7KxaiG4r90OtFE+OQeDp4i7/IeQKXbbtX8O3QZBoOV+EgvCkKKTD9hUPplS5ZOZUT7Z9eW3'
242
+ 'UVn5ZHcGT4HMyqf2qf+4sTzAZ+UBQgsyWvltnVge4DQ/pZUjTiu/jdTKb2e18um0Vn5HXpvSh4EBnYZk'
243
+ 'hfZliGEIt90Zzr7DANzJz230FjpCd3rBZNbdGc6+Mzxt9APzccrohzxtkuWmIdnTkJxpSO6UZJrW05tC'
244
+ 'PE9y3TQkZ0omhviZpLspKRpiM0l405DsaUjOlPwO8TNJetOQ7GnIdD+505C8aciiaYh2GpI/PULNlLkX'
245
+ '2vhtoUM4yX/TkFtBT2XA22fl/wTMuhOYXVqOdJf/uCAz8Dcr8Ddwd0FO4G9u4G/gg9//A5AH+pQ='
246
+ )
247
+
248
+ def load_bignum_bc():
249
+ data = zlib.decompress(base64.b64decode(_B64))
250
+ return binding.parse_bitcode(data)
@@ -0,0 +1,174 @@
1
+ import base64, zlib
2
+ from llvmlite import binding
3
+
4
+
5
+ _B64 = (
6
+ 'eJzte218E9eV9x2NrJFteSRjAzJIYsRbFcLL2AYjY5uMLCCGsqmApEvTbCXZFthZ28gvgO2y7cgSlkO8'
7
+ 'qUqcxEl59pFTmjjZbOtm2ZakbFeyXMchbuqwbOKyLJWJcQwlwQskS/K0T/fcOyNb9pLf86Efni8Ye3Tv'
8
+ 'f86ce+65/3vuuXfEpcjCdAQ/2fDXuQOhP8FPqT1yaQMAKYCVa/jlO77xy5dq/88/fS19l7iTAsysQahF'
9
+ 'i1C6wowUUF8Kf4xv2fdtQ8rtKl1e4XEqoFmRos4xKZ8sF/VbFaXH00sHdHnZVrX+q2l55R1lfZVme3uH'
10
+ '8kFDXuny+iF15vL7hPZO3VepvMqA+riBW7at4wrKyS1V5qyyrArteoxb9obQrsmJMe/Mzynv7FzO5OSV'
11
+ 'ry4cCmUuG5rXwRo3VW55cEi31L5NkbMIPcEhtAbbtE+pe7207YnM3XD5fn2/oywtdeW2wZTS8pXqcXFC'
12
+ 'HVquPseVBbj0tmJ1nqXse5y9LVMsVPCWttcfdlMTaqFHfSxf6VCmrGpTZFPeY0hYsTeNQukONYOe3bQa'
13
+ 'ORRhNetQIguNrL/a++yvKLHUErncZaNO5FmQQxWpPxteLWQuCCt35Bi43gGFVbjPEKkXC9vC2WnIOikI'
14
+ 'aatT5+2kljtCImVTLFU2KnVolx6hATVCi6+vuIPHgZqihbR+jhu2mfp7jGd7MuJjxnNR42SPYZzyBg97'
15
+ 'gwWuYIOaaUTqw83BgjDTomaaxWCTN9hY5T+kZloFRjSN95jOUtyEz9TvNrwPGmymSz7TWbdhcsw43pMx'
16
+ '0GMajhrO2kwXXKZztiVnqQgthoPeULDRwrRW+evFYCvqp0xxH279gplFbaZ+m+ndHsNkT8Zwj6HfZ7pm'
17
+ 'A20mcYM62NDNFOz1e11Mq5f5Gz3zbZd/g45pLcNgvZ5pEKVCsIljjsAtfbBeZJpJ4XAVFJgj3mBrFZEJ'
18
+ 'BesB54JNYajSDc1Mq8i0NDMNAPLMITX0DuONYrBAzbRUMd+O0FLV2kfDrUNErDkcPFzGHCYaGnsBZCQB'
19
+ 'qB7sDtY3M4f78K1D3UGs1huEVg5DQQx6e7Hf4FazhWnhg4dknGmxMA0hqY90izrYAiDYKRJTQ0wDsbxF'
20
+ 'R64COJCWC92kIAYb9KAh2AJjVBasDxOxbqaeaAP7N3aA3/wb+phiL12oToDdM+CmabA3AaoZF21Wovtq'
21
+ 'up8bw2RhIlr0BA8cCB6yBAtEqfvBhhATMV6KGi+IxrNmwzDFXRyDsmncbIhTJuDSu3hYDZOUEbWGgq0W'
22
+ 'RuxmWtXB+r2gAfu81QLWBg+HggW6YCvPACtaqvwtZczfWBikTSbDIGW6RmH6Mbj1qqAVqVthdKzBhnCw'
23
+ 'gMcsbe0lHkDvcwYgzKgro99nnIwab7sN130Z7wuGSbMRwEG3YYgySYVzPsMU3HIZBjEDceFSjxGoOBU1'
24
+ 'XushwjbTIOAiSOJHhsaMk5RpfMw4BGDEMGo2vEvEhinTBc4w3mO8Tmml6uUIOwy3iFjcZ7pkNl4kGoZ7'
25
+ 'TKM+oyQA1fNu0+CY8WIU3xp1m85ieeNZQKCAYEqawG9wKw7zMWq4kMDHewxDZFLALfDzBO6dCbowSApD'
26
+ 'xKQJmwFfKWO/jZULbqmA5yZogAk7bjYOEqsm3KYBog3sv8ix/dgM01QkY5wzyKBrBpycBsMJkDOIGUoK'
27
+ 'newz36cQs8VVPOPyu4E5qKnPZ1WK2QWGIRQqdbGR9iPb/y8w6btoJ2VNATqlTtL9BujChR7DBSR7CWIF'
28
+ 'OgyTooqGgfbyjAiBqIoG8nhhOgPlrHj0vWGmCU3aTNd6DKjcNGk2DLqNoAGGBmIXdOoSBBzBcC1qgBgC'
29
+ 'UWjCbLwNksXJnNEzzb0Mh1k6Cq2HjZcRB3rGxwxnfaYLEQOQebIHu3qCgphjIfNRzRwKM4dHgvVkagNv'
30
+ 'm6Q4w8lxpr6MaYjI4ahZCkfNwUPA2AhzuDeI4wZMUj2JOWVMKwlBEECaQ8HDHAkjrqDXGpTDS5UfguQh'
31
+ 'mIZStYMugljhkuIS09oMQZho4IOtLuaQJABVR7AFwp2XxEZXEEIKyB+2YAQHHHWwFfxGohBM28aqBA5h'
32
+ 'hyNzh8QcrxSCoAvE1BaOmATBhFyb1EyhXAhKhWaYwiRwwRg16YlV3cEWHdGGY4vfOh1bQtMBxz8ThcIz'
33
+ 'YCIK+b2oQL8DhRSOWusCijsawQTLB4KNVQHBFI2oYPlT+G7KBKoJP/cRiU73FrJ7C9mXLmSxXwiYJA/o'
34
+ 'Jjjt2Ah7ZUQ1NcVejbO3HexNdDpWdNq+uM9eGPAXokDRGfviEX9xgC6O2DedjhWeshUF6JIwLWhvOrRX'
35
+ 'kO6WoB3j2d+DBk57Q9Be4dnbU+zNEdVlh3bCxV7htLW89moYJOOUMGK3DsUKu+iSU1FrxF6CxpB2KoJb'
36
+ '/1jHIJt2jNN+5GBvj6gmHOyYoP2UA23ayKKAvXCYXvyaDQah5LR/c6e/pC+6qIMuOQlg1NpJF0akgn1T'
37
+ 'iN4Mtzpj1ghdTApFp6BAbz5tLzlFZIZiVsBD9k0jUKUKz9AlEX/xGboQwG66KAC9A9xXGLEvDviLT/lL'
38
+ '4pRUNYz64FYRESseiRWd9BeNEMnzAPqJAJbcNByznvEXjWLlRcN2rPa0vRAQKETs1vPYb3CruMtf3G0v'
39
+ 'knF/cRddOCT10VcciGHLwc4IMXWIJiZFizvINQwOpOTCMClE7IWdoCFWDGN0MmYdIWLDfivRVhL3LR6w'
40
+ 'YT2jtOm0zxBIgMPTIGWcBs8nwADd53O+iAmyBO1BD+GsWPEF13dUp7SR35R7i9S9Rerui9Q8tDySU9P7'
41
+ '/FUpQ85GD6DlYa3iG2VthWSHZe5LWZBg0VKYVcZLbgMMHCxS53zGmxSQBDzTHKxH6kboVFWwoYpulvwG'
42
+ 'QRVBLn2xJwOGvj9qQP3GSz0ZQCe8ygAJxzAfYFkZoSBU9gYbUEcLrEf64MEq7CucmUM3myHs0/W9TCNk'
43
+ 'yJBjdwebRkByKplFLkO8xyRi3sISCathR/K6RjcCvcPBVuI6yKh7SLYJGaDPdNG2ZJAkrgM+0zkpi/YZ'
44
+ 'pCx60GwcopZIOXZcSrZhUwAFasnFHtMFIjPuxmnkkNk4SRJsWGrJgovBYZ+xH3onJc89GbCMXoiapkRS'
45
+ 'NbPXI3BLzronpVWeSF4DMEoEQFIwTrgNsCvBmb9onOjBai/2YASn02YQNo2QXBomMiTqMg4LtE/KjXEi'
46
+ '3S8l2NAFYuq4j5jkMg2Q6wg4UJQLE6QAWfogWeJhjM5B2kDEIA+fSGTOl6czZ2EmnZ6YBsUZ8FoC7KdG'
47
+ 'XQ4UgszH/a1XpQD1AFp6LxzdC0d3DUfDnZ9iktCuNFF528all/IMrn9X+bOpNk6Nf8NCAFbwWFGnfXG3'
48
+ '3XrKvqnPvhl9rINZxd7gWeRmb+rYjx1sLdLeCLGfQHrDaUW8cJ+iirrs1m5agGTpFFUyZMcpB2QFJ+yL'
49
+ 'T9lhFd6EbnPaTx0sytXe1rEf9mENN6dwfvWhoL0BSRHHfupiIc+BTOlWiP0CJE1IWQJZxwl74Yh9cSdd'
50
+ 'fJ7WsVNIex1aH2HrkQ703PSyVwRtLaRVOlAFCRh7C0Fe1EVyBujIiL9oMmbF6YfPOgJ9IblQSM6FrCfp'
51
+ 'wricMhVLKdMZe1GELor7i87bcSoCiUQnyYtO0jjFCsUgySkeihWFSKrTZ7eesMsp0CmbdcgOeY5Jqg74'
52
+ 'jJDP9Em5E11yBhJFoqHbXtJHF0kCUO2NFUNKdprkb30xSHtAvqgLEJIUBewl4DeSKRUO+QtPJXBIjUIk'
53
+ 'w8HpkF1KbMBOYqqvOERMgoQHX+lNAb9BLsSkAjxoJckVjNGmTmLVcKy4g2jD+Y9tJikamk6KojPgyDRo'
54
+ 'S2RKNitafPx+VC5vxHj/HzGpULeCo/5GN6TIHO1Pl9mlyJSJBEMGafbVCPs5AnqAT87ErCgAWR9QrvAU'
55
+ 'VSx5DNJC9MkU+8mICgZ9zMWiMfbGiAqIhPNkoJ8XMwES40kEyd55eyEaKIaMujO2CTTAMI1AKgjOh8TV'
56
+ 'Zz3vL+wGN9oXD9s3TYJkczJ/eHbKoRVIkmzH+fxAcmbuKwRij9hLiNP6VGPAsYjqr2FGCNpPwtoPXdqa'
57
+ 'PtVlQXsVQB7IzE5JhRA7LuJbH/KYtLgwxX4M7BW1nzi0HxOZmzwL+HiIvQ1VgYXNAtkyYHAiwo55WSzm'
58
+ 'YqdGVLAR+NilbZaqOtiDwS0ihrS3pX0KufVphL0uCUA1zN7i2Rtx9jMoR9hbDiz/iQMjUJjSsZ+C3+AW'
59
+ 'wlN4YiSBwxZDYG9KfQQ/89hysHOKmHpTICbx2svkOqljGxKFRlKYgulMNikwRld5YhWvvcURbWB/XFWv'
60
+ 'w3o+E5k6jhlLgI3ToDADHkyAY6jGmhePp/CukxmBbbDS+UbTxOyCyfT/IqFMUInUFjE7YBO6YVNmhyi0'
61
+ 'OCLtR2C46TjuV20Ex4cJpAMu1cI2jYQRcNpHeJ/F3hZZBINb0kULMCkCMetroAFvgkpgpsDWBjjTYS/p'
62
+ '9hcCG09FIaZt7qLFWbuzD5H2U4T3gzRu/ZTdkBy4gHWwPTxPJiwC2lwhLh2LsLfj7Bc8GR2OvR1iJaqM'
63
+ 'I5kzVwX2jkQkvCXEhRsjQC32Tpz9dIQIc9oPCW2uCviRcYilJKKOEyZc10HvZIbUAs9HWPCkVK13MTDc'
64
+ '1yUuCXIYx7ccWpibkgBUr/FaYOwnhN7Xee0VkI+zVwAhnBlzaMFvmDAQsYGNCRyYM04IgNmik1kEXfiQ'
65
+ 'FMaJScAHfBXZMY6RCzwpILxZxtyDMQrhdQGDQDaiDdNDN0OPhmnO8DNg0zToSIA6NtL+wtXEoaK0cQsd'
66
+ 'tXT7uXuJ973E+89KvPvWXcIRSCveh+aNML41Z6Q1jrMo3bp750j3zpHueo409q1fStu0PPQH1HHvfdm9'
67
+ '92Vf8r7sjwoVOZFG30ERaooRs0f7X2uXIkypTkXd24jd24jdfSPGq9Fu9C6H37GaVQohTdTX8IPxxAv6'
68
+ '6lipigqhk2jEht+3ntSo5BeyMbdKKaT5CtHiF/Kl737Ib2D9kQXb5IPu7ILlVTqUKjBY7Ph6najsxe/a'
69
+ 'dI8L6Ejf2Df8JLKJeyCy3ZFPyDPlFOtoRspiJXmqQDKvzO+Kjakor8q2SLm4Y6NezB8VIlFpPT3lfsKP'
70
+ 'uJS4RlwFYnYzOaN4QNk4hT9j7ZUsfomcr25zxUoZ6GAkBz2iUy7u3EQ0u/xuCazhPuGgavcxQljFve4b'
71
+ 'ksxD++09sxS+1V6uJfmheoIbdUxRul7KUCN8IXlM1IjqEELb9Qg9gBDKCgjdvGZLrk19LNUuqLPaXKW5'
72
+ 'ukHfTm6ex71SR79nzWrb34ZSswK9z3PF5wLuFwOppSt26lTlCveuD3JtkR+nvvV0KvPD2ix1mbU7lV5u'
73
+ 'yFI9ZF2pM64wZCkPPK87kqV8qJsXbfqOaMCt6SgvzVUpcwwePqqnX7Tq87uFE9Sik75FO9WnU/sX9UWV'
74
+ 'PRlPpfoW79RdjGesVHt1TJayULcy28szTZGqrPZN0ITdOErlm0/7UxUGdZbSWoUL56MBG2T+3bpxKGgD'
75
+ 'FW1cR1SpYAP+5/mIz7uT+0zEIMW0GfkLBeZJf6qPt03SVFYfOTyjN1X5Z3JSWHmagy0RprCP3ijCrz/j'
76
+ 'ZRIVWqdwXGnwMt4w08gxsBI14ESGOawjZQJKAlA+JDCtLqZpRHUVrqRaG2LxAWCYwdcR1Se8LFbLp0vI'
77
+ 'S3EWNOzQqjPnlbZ3ZudQ60u7T1yI/v2mde989JND1o+/Y7tV0bT3UvvZ31272b35u3/15Acf/OGvnvve'
78
+ 'Oz/JLf7aun8ZP7ix5D/W/mKwyCLq2h8pUyD8JTJRRMjFbNXHRtK2IyTAaOt0CF0PZ1foHzOnIqQGRKFA'
79
+ 'ojG7Uhe7fzmFEPwKINfnf13jdh1djhAHImqQO+Q4sUvTF1IiBL+IolCE3aHpLO+YLVPl0sdWz9LTQP9Q'
80
+ 'Xzm7LSMnEi34W25E5rJfqUOiZCAien7kNdBrZukpP0rnPD5Lz/nVhrdd6Un90rzSZHZLAthGKLnKNrDb'
81
+ 'aCWoJjZiUfurTXtNUtsUgRT63e/Rt0CD1DbWFQmlLT/OYIskk6DU/vB90S2SXgWBlPzJV5/YokAuJD0K'
82
+ 'LYjmZ77GZxEhkSCI0rxy/sXnpcanTTq48KySND5j0kiVRWp82qQ3tu2mkCPZpGsFaelqRCebdMb9mIAM'
83
+ 'ySbN+x5NK7CWaZMeaeVzEEpNNunah8+LRPe0SVuXtquUEUWSSavmtxRw5PuL0yZdKTsOo55s0o6dnalq'
84
+ 'UZVsUlUpLyBrsknlT/9QoYgnm/RvJwwGHa7OmHQ7EBIhdUwy6cpXvgYjoEz20terizm0MtmkqztuUZRA'
85
+ 'JXvpsZU8QmFF8qD8Uu9GSjEluXehVwYQak+X2kcKbPmGir+ldCgt2ar3X+JoDvHJLUb/dimFQskt7jhg'
86
+ 'SFXjb3XOOKH3VrWALMlO2LTkq7RCmDUuf1q/aE5zD3esopX69TKkxs19rstVCahm1hAvG9CIKJ7sqx9t'
87
+ 'G8xB1EiyVWlPvboeKSK03EPS4n22eUizRAaUuMXHU5fSSL9ZhkiLz/zrp3JvE6qO/e/V0EEeJal6Zucj'
88
+ 'Wt2MEFb17rHjYPZ0e0gRGuUcpz+mEJeuRBsAyDN1G3Iyd4Y6U1c+OKi0P3osrEzr4c76TmSKbZZQ233h'
89
+ 'tqW24Lxv9Njffi1se3LeD/7i61W7yv/x92lLb4tjX60p+Jbt6LwVBT94bcsTv/7x/bsafjtc2UvFnhut'
90
+ 'KTampb3P/+JbqvlXbv78MeaFf327eqOlhHnjd00O/fiPf/4rzxvpyjXvvOe+Y+j67ge2jxtGM3b8Yuzg'
91
+ 'F4cfeu5P2YGq5w7Ffn/7xom1H/j6az77tuGll39XFyo8se+5t9N2ZGuufVJ/+jvb/tXm+cNpzctwR/fq'
92
+ 'loeuCj96g334hfurjF8dSUM/hTV0AvqWrxYNA2OGfdlUSYfdGoh1lpKNS2N3vWYCaaUDuXxNqakf73UM'
93
+ '+/gUIuZfTBKlEkiUhps7m7zMt9X4CyBeL9PqpQ81B71cMGc4k70eYsd4bR05u5pysPm6AeMlM2wsIFs3'
94
+ '7eOfwAnyiB12fsVn8M67aHgq+5CL+XYVsxEf8DAbRXy+gg9+LMyhOymg9rAYdMIapw82dAdbun2r8Wl0'
95
+ 'nJyz8nT5EH4PJr0NM1x047dbkE2edaveD+GTZum8ufB0zAr5eAcN6eQ6aPQPbUV4axvTvFUd9O4NNnj9'
96
+ 'Tfg7O8EmfbApHMx5d4/2E+kUjRyAjXEsZNn5nAXvaWDrds5sgH3PxbgB9kzXKNM+/S5rn33TCX/RsGO5'
97
+ '3BFX8HAz09y9a+ftED6OzTc9Tr6jZMZ7yu9QeK8zbDZOuVUPH4W9bKyoD3Jbe+Ef+ovH7UUdUI11/ioN'
98
+ 'eho8DPao8VlXQ7fvsQ/J+58rkNTzy6LnbLBjWzg6ZrwEBpTlwDa95JR/cSBm7YRkNlZ8OloIifl5uni4'
99
+ '7FS9Gn9dqJ5sT3P+fZC97tJ+HCdnzDzer3zmYOtgC8LjM9FbcdXVODvuYO/wyy5fdxtgrzk6tvC62Thh'
100
+ 'Ng7ARtNsnDQv2cf9r6Iz9pLTdGGXv3B47xkYfegsbFtby/B3uHLe+Yi9wWvH4vhMFB+N8DEKf2UJ+uLs'
101
+ 'BqpgD+Njtm5fwFYYj4HrSmCkhoWBsPEs7FNtpktRw77lFTw7hsdXexUfutjN/oN6prEs6AwHj4jw7E+7'
102
+ 'KNgr4OQd9jFAp2HwmKbMPL/UbQJT340ad/uy9+3cz7Owl7oRV91waG9jVeyVuEo+E+J/KPgPVeF9f87u'
103
+ 'RbBLAx6ehN0D+JDG+wnYGYAzu2KabRmDZnwwebbH8B2f6SbeaA7+VAUMBD0wFvnzCvT4/a28Te+OnrLJ'
104
+ 'L1L+oCg5E9vUBbZVXeTI8R5sTMGB0Qw8+u72W6pJBzuGtLibU+B/0lPUAhG/AubncVMZZ+/Q5KRWVg69'
105
+ 'zfk6lXnbtm3L8pWGQ/85MKQuhHSrPDYM69iTxw2/Xlz8Ttb2BRTas+Wr3Nc9DY3VB+oOV1S5G5yN1a0e'
106
+ 'x3Y7t9NzyFNz8HCTu7zGs6/BXetZ4z1QXdfkabB5vTUerqLGXbefOyQ9yeXlruXX8pyFoGvycnl+bS7+'
107
+ 'x+fe583lnI8+vGej09m4bfvOre66Fk5WdKC2rtp7oMlT18ThlvdU12LF9nX2++/nHi612eDJOSI1NYdq'
108
+ '19YcOOBdW3uwscnbcGB/g6exseZA3X60TP3Okk7uNd+aTm51mG/rC/Sr+5emAWrp5Kwn+aOO70c1/qzi'
109
+ 'fE1I92u+zJ8f4zNHNLGHhXzloMaXFwt5z2voc7vyNcEHf80fWbIh1td8XmPXB6gNsZGD5zVUfmykqatT'
110
+ 'udKyrKDgFwXP/Wzj65t+lrcw/2d9//jGrmNn3+xbPZ/g61/P2/jmLkUGQq9AzNwIY5Ke1mCBWMS07vXC'
111
+ 'zvU0pm7hSKxtwjAoHTxH8TSR5viC9R+62I8c+MxvXEic/PWJPkwS+Uhbmtd7vSdi1lNU0Ul/SVdM8df4'
112
+ '9OXimOEihw+A4TpJvuc40mMYkiajO0rhtzrSwX96hzQpUn5DjuUg0MVgShZ1khduQ3TRags8cg60uaNb'
113
+ '8JEAhLKrLu0YXMnbvFsh7ccceyPC4sXvPVgcgU6IGSbHFBAo6ZIwbKvt1lAML65ui7R6L1O3mVXb9AFO'
114
+ 'v/4VMZ2i74Z7vwR3fQnu+BJcmIsfxXhnVK/UEHsMBG/vw2kMXsbHu1DPMqTsxP2pWDrqoo469OUOxKlV'
115
+ '8/RKuyaUi2w8T+ere79paddnV6I2V/hzn6igoeLRtbn4T20cTR8p1WlyhWGkjHIZ5wReNZBq16RBTVhE'
116
+ '/zAV/VntWv4/tdv76J/XrjGpXTwW49kuIVW3SSFEpOStYunFpLZ3z7Ttz1cfe5RPtP3H5LY/n9v2+eS2'
117
+ 'l063zZO2O0nb+P8hnepE2WFhV2iPSK2Yaf8SaT+LWh0W0qbN940qhHa9YT+07Xq+X1TmWSJ/qYzq/Aow'
118
+ 'LTQs6su9YUrdFj2YlvL9kILLs0a+oqF+myKCRedAQVxzybWwe4U3sGqBd0A8tlWjdMsdPLdo9Y/1jp+q'
119
+ 'lTlIbqvc/1IKVU588812852fabbrVN9UrbwjJ5a4H6WkH8dJP/A8y852bM/eWt2JRnaLuvHz4E+e5Mtj'
120
+ 'bmls71fmc/75/Tk4ca9YGk/2b45SuRDlDcSttE5Jp89XLgtR1C8FNXj2cegq/7xCb60UUhyaNKGN00yo'
121
+ 'FZcXqB7TX6ZtZSf4gfBe/NCa+e0dAqe/r5u689RSvWPM0G7bouzXhTi1/xtt8aEU+8LOb/LeqGBX/qcv'
122
+ 'rFzR25Y9io48mKnJtYxCd11Ppgya6VVoLA5TMgWa5P4ter4N5ZJU/psq0n8O+r9tlX9NLLsj+uxY2oDr'
123
+ 'ndD2fSjJH+uJP0LT45qNPUFvtT1EzetC1DKU8IVC9gX2iV1zrEBt47s/c4V8iPRYVwfNCyoPYh5GT9sQ'
124
+ 'vepELEK7hKNZOSw/ICKg16oH9MM/VdJrDW/AaFM5mvH8DpR5NiOXv8Qpo2L60WWhqOKX/dh5WBX3zzYF'
125
+ 'qDon6OhVhipBfVSpW6KO7VaYrebNukUvKb9e9ZCol8f5fp1/Db3ymeiztvSBmX71kn69OtOv88LnzEie'
126
+ 'wqEZ7xIKz+MJ+z/6VbFUTMkuc3fYelRmtWqR0bIKPZxWgTZbyJjCbAn/1pY/EHb4Yeh+zRpyYNg4s2Dv'
127
+ 'r1K7OmyUyOnL6kMDTP972Ss4ZWqbZuVUpp0fiIi0XunPi9PbuAzBkBtW6FRbYaj1/hUDTJvwjIWrVLdp'
128
+ '1k/lbOXDCn2av0MbQMtKdZXx539jaaPmi3b91iOc8rG3FaUB7nSFcDTfeNul6UXHYrzqYeuvfdptRzi1'
129
+ 'W2jnwhFNU8pDynDcmq3/wbx8karu830eWmbxiKE7gqB6Dp5Zua20kgt9rQXYojJEOH0XtTYczU8YOHR0'
130
+ 'vdiu13uR3+VQvRlWZX6DFk97oME11h7c4FEHbrA/awc02IgbRNqkBouhwTu+z7tXWA6Lus/P2J4wqSsN'
131
+ 'yvHJdpe2/YPlvs5D1JHvZXGvZAgr/1n35n4hGFuYMTa1NS9MZwgvmg2hMnAwUrf5KtlwPEwZ2SoUztT9'
132
+ 'RmTXc6nicsWmZlVT2LcdrczUa1uPNjpyehV3Tlr0/8F3K3LfdM8fMXuzX0g55Mg5Xdqh2PKjF9mxyXZx'
133
+ 'fmDjLt/rKV8J6g31MHLxHwXWDJfyA/EOPHjrVtSYTRfcHT4zAwO9ZMdo6Ye9lPHJrP8cHF+8O12BabSQ'
134
+ 'cGul2r/GnwVTx5bW73rHm+Lu80QUuaN5TT59Tc7mJy7kddggwrTnqvHEUmEwLrz4M029LgCPaNv40Tyx'
135
+ 'FKZg+55Q7xp6lRIer0p5RZM8/6R41DYT07sE33zuh94Nr6649lO3xFEc95c+OBTaxQYYoQsh5yN1h6vr'
136
+ 'Kp1bmys83ibIFXG2xpGUDWUpX85eqX7qvp26E3u6OWsvb/PudsdElfGfzIX0xvCZ9RZ6g8W/YdTbHV3s'
137
+ 'cEdU7hHVYpXVSz8eQ8y3FtXo45xm1AVlwGGedxbCPFf7rfrAPPWKzTrFa8oGASJY3w6x646gf20eV9lh'
138
+ 'i+LJUsEzyjdwzC6bhPmM8o+GFwS25pQL523qNirnPKXR0VK8/WY7J0I40g1En+1Rj4NPlY19nrI2bcIf'
139
+ 'MzmGEXKMskYdL+HMNL4I41WwYHHXcOjQnCdzGMs0E5mXiC/TEnO+a8maZejKrnkeR7Znlz6l9KHULntm'
140
+ 'dunbz+AT7QczYPmcHesz7DldVAo69mjp17PvnOS4hcIId9X16opQsw0djS7seID/zpg6RWk47nUMuM1t'
141
+ 'WZdpt4t+S9Prfcm3ECaskGuJimkv50TMHVqleald5xi5mnZCLUTrLXzBigWasgrN8FsaENm/dNysd1DZ'
142
+ 'Sr0SwmV7X5DbrFM+pbEJ1KLJmQfciD7npW/N38J/r0BHr8xSVUYm2+NZDrPqhQHO6nsvw7ZKY0l9P3e5'
143
+ '5nJY8RWwRfN+JDegeZZUopoLkdxxzQmInVW69KfM1TpmvnXeEvVf88xT5po+JanUOaByIB64I4j+x7zD'
144
+ '4kpxofIBizW2aXlgu2br3iq3fmRc9AuqFL3+gtvseNEy2J/m17RSR3ZlcUV36Gei94k36hWPWJ84hio5'
145
+ 'Nv7k30HYt1sfWuYemz+80Oabh1b47I+tDw9kcuP1GW9t6N6dnlF/TmSZAmRu+9swXq7xESNer2Gu2fFc'
146
+ '8x3vXWNfAAVKczJvNO90qQtm0F51//ScySbjHCDjrCBz5iGsAq2FlXkUCOfbwtA+KYHgcAIxFJ+vMsO9'
147
+ 'i5iMTzMGTEaFvEYmz8V5X6aX+wkKmVVlmHknovrT/RxkVseKYGq4plx+3ANJHrg9ra+eg7kIn3msbmmA'
148
+ '9eeov9/ty/xejmXX876sH+SUZb7gm/9yTtWuE76FH+Z0ZPb6csKLRs3/4DM/u7i5/4xv1WeGoRf/3bcu'
149
+ 'Yix7+qKvMGbqffpj6WjNA9HjaSjOo7vCBjn//IVCmls7kXTcuFe2AX/i9zSCSqpHQQ62UOi38FmAEqeA'
150
+ 'M/eRLI9/tLQ0hx5F0viQ7zAuRyiHluYi3hurZFyND/IBx4GtGv7Sk+RXAw5bN9SEpPsJvFDWL87Rb5fl'
151
+ 'n5gj75Dln5kj/6gs/3dz5PcDjjdUryLpfgI/SEv2/VyOEQlclOWjc+Sfktt9d0673XI8+wBJ+UXCD38n'
152
+ '++fiHP/8iJaOWC8j6X4C/wfZ/qtz7H+Tlk58P8VjkSR/VtavpGbrf0+WT6Nmy4/J9udQs+3/vaxnaZKe'
153
+ 'DsBv0lJ/LJTEj4Se/5LtX03Ntv9PMp4/B2eUkp5NSXqwfo1SsnNzkp3YHoNS8v9fUDP+x3pWyfijc3Cr'
154
+ 'UooD+ylpniX07FRKdrTO6dcewBdgvgE+PyEPc7RaKa31z1DS/YR+/P4AP//31OzxbVdK/OmjZvPn+0qp'
155
+ 'P29Skr2JdsPye4ghwJck6YnI7X40p90P5P7+cU5/ryglu9MUUr9Ju7A2fiH72aSYPV5/UkrjvVQhjU8C'
156
+ 'V6dI/lmlmM0fbYpkB979JPyjXo3QCsAzob5Vfi+S8FuBjD8yB38wRYoxHoXUv4QeZ4pUP6JI6i/gh+R2'
157
+ 'j89ptzNFqr+c1F+M96RIduOfRH9xgy+nzLy+UyXhP5HxtDn4z2VcNwf/FxlfMAd/S8YNc/DfyPjSOfgH'
158
+ 'Mm6Zg/9OxtfOwT9KkcYL78emxws6M5Ui2V6cFH8w/oUsvzUpnmA9tErCd87BNTK+Zw6Of/4KAs8T0pqy'
159
+ 'AfdvbWNTA/nLJdc8cs0n1/XkWkCuG8nVSq6FTmdjU2V1nZd8ehoavJICXvqQFOXmeRuq65qc8EcK+6ar'
160
+ 'Beul4sGkcpWnWSpUHjhYXuORyqAGfp0H9klPyeWDyRXvtIj0IBh1kDSyb7+nqRFuNR2okVreV169XzIA'
161
+ 'JOTyvoYDtVgY5Go8dckgIJIqKNS6a2oOVHiaq5tAJz5FbfAQZF+Dx1PhbXF6PQ2NB+rcNdVNLYlkfY+n'
162
+ '6cHdSZXtDizY4K5u9Dg9iUS+gmjBN6YhZ0WNx1130Jt4dDd+Yjrzd5cfaGgiijyNB2s900Kzag96mna6'
163
+ '6/YfdO/37PF6Kqr3VVdscTe5k27v9uwHZXua3A1NSahsosdd6fTUVRyo9FRi54ILGhvrJAfuO9xQ3eQh'
164
+ 'R8i1nlqQXuvl8W91wfppX62tOFBTuTZ3Tj1POneu3udpqq71AD2gafzY3WAvPxv11FX+T1EMevm8PCAt'
165
+ '726oLVi/xo0P1dfUuisONDbnFeDD9HWPNMLArKt1V9etc7Tgcat1NBx43FPR1LjuL7f+5brGAwcbKjzr'
166
+ 'oB9NnnUNB+uI4grnNE2l0j5nEm+dycR1TjPXmUxd5zR3ncnkdc5ir3OGvs5Z/HVOE9hJGOyUKOyUOexM'
167
+ 'JrFzDoudEo2dc3jsnB4Mp8RkJ6ayU+ayUyazE7PZOZfOs/k8i9DOuzDaKVHaeXdO353UTsJqZxKt5/D6'
168
+ '/0XsL2H2LGo778ZtJya3M8Fup0Rv51357ZxL8LlAnvNLKH5X3Ms770ryu6BefqcTx1PpujZX/syTP/Pl'
169
+ 'z/XyZ4H8uVH+tMqfELKnY3YiaCdU8olCQnlunrzm/jfhHoNh'
170
+ )
171
+
172
+ def load_runtime_bc():
173
+ data = zlib.decompress(base64.b64decode(_B64))
174
+ return binding.parse_bitcode(data)
@@ -1,4 +1,4 @@
1
- from .lexar import Token, TokenType
1
+ from .lexar import Token, TokenType, Lexer, _unescape_run
2
2
  from typing import Optional, Dict, Any, List
3
3
 
4
4
 
@@ -56,6 +56,14 @@ class String:
56
56
  def __repr__(self):
57
57
  return f'String({self.value})'
58
58
 
59
+ class FString:
60
+ __slots__ = ('parts', '_token', 'inferred_type')
61
+ def __init__(self, parts: list, token=None):
62
+ self.parts = parts
63
+ self._token = token
64
+ def __repr__(self):
65
+ return f'FString({self.parts})'
66
+
59
67
  class Variable:
60
68
  __slots__ = ('name', '_token', 'const_value', 'inferred_type')
61
69
  def __init__(self, name: str, token=None):
@@ -253,6 +261,18 @@ def _parse_atom(tokens: list[Token], pos: int):
253
261
  assert tok.value is not None
254
262
  return String(tok.value, token=tok), pos + 1
255
263
 
264
+ if tok.type == TokenType.FSTRING:
265
+ assert tok.value is not None
266
+ parts = []
267
+ for kind, payload in _split_fstring(tok.value):
268
+ if kind == 'lit':
269
+ parts.append(('lit', payload if getattr(tok, 'raw', False) else _unescape_run(payload)))
270
+ else:
271
+ expr_tokens = Lexer(payload + '\n').get_tokens()
272
+ expr_node, _ = parse_expression(expr_tokens, 0)
273
+ parts.append(('expr', expr_node))
274
+ return FString(parts, token=tok), pos + 1
275
+
256
276
  if tok.type == TokenType.IDENTIFIER:
257
277
  assert tok.value is not None
258
278
  return Variable(tok.value, token=tok), pos + 1
@@ -284,6 +304,15 @@ def _parse_atom(tokens: list[Token], pos: int):
284
304
  return InputStr(token=tok), pos + 1
285
305
  raise ParseError('Expected "(" after input_str', tok)
286
306
 
307
+ if tok.type == TokenType.KEYWORD and tok.value == 'input_big':
308
+ pos += 1
309
+ if pos < len(tokens) and tokens[pos].type == TokenType.LPAREN:
310
+ pos += 1
311
+ if pos >= len(tokens) or tokens[pos].type != TokenType.RPAREN:
312
+ raise ParseError('Expected ")" after input_big()', tok)
313
+ return InputBig(token=tok), pos + 1
314
+ raise ParseError('Expected "(" after input_big', tok)
315
+
287
316
  if tok.type == TokenType.KEYWORD and tok.value == 'new':
288
317
  pos += 1
289
318
  base_type, pos = parse_type(tokens, pos)
@@ -322,6 +351,86 @@ def _parse_atom(tokens: list[Token], pos: int):
322
351
  raise ParseError(f'Unexpected token in expression: {tok.type.name} "{tok.value}"', tok)
323
352
 
324
353
 
354
+ def _split_fstring(content: str) -> list:
355
+ """Split raw f-string content into parts.
356
+
357
+ Returns a list mixing tuples:
358
+ ('lit', literal_text) -- verbatim text
359
+ ('expr', expression_text) -- raw source of an interpolated {expr}
360
+ Handles {{ }} escaping and brace-balanced expressions containing strings.
361
+ """
362
+ parts: list = []
363
+ literal: list[str] = []
364
+ i = 0
365
+ n = len(content)
366
+
367
+ def flush_literal():
368
+ if literal:
369
+ parts.append(('lit', ''.join(literal)))
370
+ literal.clear()
371
+
372
+ while i < n:
373
+ ch = content[i]
374
+ if ch == '{':
375
+ if i + 1 < n and content[i + 1] == '{':
376
+ literal.append('{')
377
+ i += 2
378
+ continue
379
+ flush_literal()
380
+ expr_chars: list[str] = []
381
+ depth = 1
382
+ i += 1
383
+ expr_quote = None
384
+ while i < n:
385
+ c = content[i]
386
+ if expr_quote is not None:
387
+ expr_chars.append(c)
388
+ if c == '\\' and i + 1 < n:
389
+ expr_chars.append(content[i + 1])
390
+ i += 2
391
+ continue
392
+ if c == expr_quote:
393
+ expr_quote = None
394
+ i += 1
395
+ continue
396
+ if c in ('"', "'"):
397
+ expr_quote = c
398
+ expr_chars.append(c)
399
+ i += 1
400
+ continue
401
+ if c == '{':
402
+ depth += 1
403
+ expr_chars.append(c)
404
+ i += 1
405
+ continue
406
+ if c == '}':
407
+ depth -= 1
408
+ if depth == 0:
409
+ i += 1
410
+ break
411
+ expr_chars.append(c)
412
+ i += 1
413
+ continue
414
+ expr_chars.append(c)
415
+ i += 1
416
+ expr = ''.join(expr_chars).strip()
417
+ parts.append(('expr', expr))
418
+ continue
419
+ if ch == '}':
420
+ if i + 1 < n and content[i + 1] == '}':
421
+ literal.append('}')
422
+ i += 2
423
+ continue
424
+ literal.append(ch)
425
+ i += 1
426
+ continue
427
+ literal.append(ch)
428
+ i += 1
429
+
430
+ flush_literal()
431
+ return parts
432
+
433
+
325
434
  def _parse_call_args(tokens: list[Token], pos: int, callee):
326
435
  tok = tokens[pos]
327
436
  pos += 1
@@ -444,6 +553,16 @@ def _parse_expr_iterative(tokens: list[Token], pos: int, min_prec: int):
444
553
  vals.append(InputStr(token=tok))
445
554
  continue
446
555
  raise ParseError('Expected "(" after input_str', tok)
556
+ if tok.type == TokenType.KEYWORD and tok.value == 'input_big':
557
+ pos += 1
558
+ if pos < len(tokens) and tokens[pos].type == TokenType.LPAREN:
559
+ pos += 1
560
+ if pos >= len(tokens) or tokens[pos].type != TokenType.RPAREN:
561
+ raise ParseError('Expected ")" after input_big()', tok)
562
+ pos += 1
563
+ vals.append(InputBig(token=tok))
564
+ continue
565
+ raise ParseError('Expected "(" after input_big', tok)
447
566
  if tok.type == TokenType.KEYWORD and tok.value == 'new':
448
567
  pos += 1
449
568
  base_type, pos = parse_type(tokens, pos)
@@ -1011,6 +1130,14 @@ class InputStr:
1011
1130
  return 'InputStr()'
1012
1131
 
1013
1132
 
1133
+ class InputBig:
1134
+ __slots__ = ('_token',)
1135
+ def __init__(self, token=None):
1136
+ self._token = token
1137
+ def __repr__(self):
1138
+ return 'InputBig()'
1139
+
1140
+
1014
1141
  class Signed67:
1015
1142
  __slots__ = ('_token',)
1016
1143
  def __init__(self, token=None):