├── test ├── 01i.out ├── 02k.out ├── cd.out ├── dd.out ├── id.out ├── 00putc.out ├── 03s.out ├── 04read.in ├── 04read.out ├── cal.in ├── reprint.out ├── s_d.out ├── s_kd.out ├── 01i.unl ├── cd.unl ├── dd.unl ├── echo.unl ├── id.unl ├── reprint-eof.in ├── reprint-eof.out ├── 00putc.unl ├── 02k.unl ├── 03s.unl ├── echo.in ├── echo.out ├── lisp.out ├── 04read.unl ├── reprint-eof.unl ├── reprint.unl ├── lisp.in ├── s_kd.unl ├── s_d.unl ├── cal.out ├── sierpinski.unl ├── sierpinski.out ├── cal.unl └── lisp.unl ├── run_tests ├── Makefile ├── LICENSE ├── README.md └── unlambda.c /test/01i.out: -------------------------------------------------------------------------------- 1 | O -------------------------------------------------------------------------------- /test/02k.out: -------------------------------------------------------------------------------- 1 | O -------------------------------------------------------------------------------- /test/cd.out: -------------------------------------------------------------------------------- 1 | XX -------------------------------------------------------------------------------- /test/dd.out: -------------------------------------------------------------------------------- 1 | X -------------------------------------------------------------------------------- /test/id.out: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/00putc.out: -------------------------------------------------------------------------------- 1 | OK -------------------------------------------------------------------------------- /test/03s.out: -------------------------------------------------------------------------------- 1 | ABCC -------------------------------------------------------------------------------- /test/04read.in: -------------------------------------------------------------------------------- 1 | X -------------------------------------------------------------------------------- /test/04read.out: -------------------------------------------------------------------------------- 1 | OK -------------------------------------------------------------------------------- /test/cal.in: -------------------------------------------------------------------------------- 1 | 2018 5 -------------------------------------------------------------------------------- /test/reprint.out: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/s_d.out: -------------------------------------------------------------------------------- 1 | OK -------------------------------------------------------------------------------- /test/s_kd.out: -------------------------------------------------------------------------------- 1 | OK -------------------------------------------------------------------------------- /test/01i.unl: -------------------------------------------------------------------------------- 1 | ``i.Oi 2 | -------------------------------------------------------------------------------- /test/cd.unl: -------------------------------------------------------------------------------- 1 | ``cd`.Xi -------------------------------------------------------------------------------- /test/dd.unl: -------------------------------------------------------------------------------- 1 | ``dd`.Xi -------------------------------------------------------------------------------- /test/echo.unl: -------------------------------------------------------------------------------- 1 | ``ci`c`@| -------------------------------------------------------------------------------- /test/id.unl: -------------------------------------------------------------------------------- 1 | ``id`.Xi -------------------------------------------------------------------------------- /test/reprint-eof.in: -------------------------------------------------------------------------------- 1 | F -------------------------------------------------------------------------------- /test/reprint-eof.out: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test/00putc.unl: -------------------------------------------------------------------------------- 1 | ``.O.Ki 2 | -------------------------------------------------------------------------------- /test/02k.unl: -------------------------------------------------------------------------------- 1 | ```k.O.Xi 2 | -------------------------------------------------------------------------------- /test/03s.unl: -------------------------------------------------------------------------------- 1 | ````s.A.B.Ci -------------------------------------------------------------------------------- /test/echo.in: -------------------------------------------------------------------------------- 1 | Hello, Unlambda! 2 | -------------------------------------------------------------------------------- /test/echo.out: -------------------------------------------------------------------------------- 1 | Hello, Unlambda! 2 | -------------------------------------------------------------------------------- /test/lisp.out: -------------------------------------------------------------------------------- 1 | > fib 2 | > 21 3 | > -------------------------------------------------------------------------------- /test/04read.unl: -------------------------------------------------------------------------------- 1 | `` 2 | ```@i.Oi 3 | ```?Xi.Ki 4 | ```?Yi.Zi -------------------------------------------------------------------------------- /test/reprint-eof.unl: -------------------------------------------------------------------------------- 1 | # Reprint after EOF generates V 2 | ``@`v`@|`|``s``si`k.F`ki -------------------------------------------------------------------------------- /test/reprint.unl: -------------------------------------------------------------------------------- 1 | # Reprint before first read generates V 2 | `|``s``si`k.F`ki 3 | -------------------------------------------------------------------------------- /test/lisp.in: -------------------------------------------------------------------------------- 1 | (defun fib (n) (if (eq n 1) 1 (if (eq n 0) 1 (+ (fib (- n 1)) (fib (- n 2)))))) 2 | (fib 7) 3 | -------------------------------------------------------------------------------- /test/s_kd.unl: -------------------------------------------------------------------------------- 1 | # ```s`kfgx -> `f`gx 2 | # `gx should not be evaluated if f is D 3 | ``.O 4 | ```s`kd.Ki 5 | i 6 | -------------------------------------------------------------------------------- /test/s_d.unl: -------------------------------------------------------------------------------- 1 | # ```sfgx -> ``fx`gx 2 | # `gx should not be evaluated if `fx evaluates to D 3 | ``k 4 | ```si.Xd 5 | ``.O.Ki 6 | -------------------------------------------------------------------------------- /test/cal.out: -------------------------------------------------------------------------------- 1 | 2018 5 2 | Su Mo Tu We Th Fr Sa 3 | 1 2 3 4 5 4 | 6 7 8 9 10 11 12 5 | 13 14 15 16 17 18 19 6 | 20 21 22 23 24 25 26 7 | 27 28 29 30 31 8 | 9 | -------------------------------------------------------------------------------- /run_tests: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | set -e 4 | 5 | for test in test/*.unl 6 | do 7 | if [ -e ${test%.unl}.in ] 8 | then 9 | $1 $test <${test%.unl}.in |diff -u ${test%.unl}.out - 10 | else 11 | $1 $test |diff -u ${test%.unl}.out - 12 | fi 13 | done 14 | 15 | echo 'All tests passed' 16 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | CC ?= gcc 2 | CFLAGS = -std=c99 -Wall -O2 3 | PREFIX = /usr/local 4 | 5 | unlambda: unlambda.c 6 | $(CC) $(CFLAGS) -o $@ $< 7 | 8 | test: unlambda 9 | ./run_tests ./unlambda 10 | 11 | install: unlambda 12 | mkdir -p $(PREFIX)/bin 13 | cp $< $(PREFIX)/bin/ 14 | 15 | uninstall: 16 | rm -f $(PREFIX)/bin/unlambda 17 | 18 | clean: 19 | rm -f unlambda 20 | 21 | .PHONY: test install uninstall clean 22 | -------------------------------------------------------------------------------- /test/sierpinski.unl: -------------------------------------------------------------------------------- 1 | ``````sii``s``s`kski``s``s`k``sii``s`k`s``s`ks``s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``si`k`k`ki``s`k`si``s`kk``s`k`s``s`ks``s`k`s`k``s``s`ks``s`kk``s`ks``s`k`sik`kkk``s`kk``s``s`ks``s``s`kskk`ki``s`kk``s``s`ksk`k`d`k```sii``s`k`s``s`ks``s`k`s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`ks``s`kks``s`k`s``s`ks``si`d`k```sii``s`kk``s`k`s`k`s``s. . ``s`k`si``s``s`kskkk``s`kk``s`k`si``s``s`kskki``s``si`k``s./.\`k``s``si`k``s./``s._``s._.\v```sii``s`k`s``s`ks``s`k`s`kr``s``s`ksk`k``si`d`k```sii``s`kk``s`k`s`k. ``s`k`si``s``s`kskk``s`kk``s`k`si``s``s`kskk -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Kunihiko Sakamoto 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /test/sierpinski.out: -------------------------------------------------------------------------------- 1 | /\ 2 | /__\ 3 | /\ /\ 4 | /__\/__\ 5 | /\ /\ 6 | /__\ /__\ 7 | /\ /\ /\ /\ 8 | /__\/__\/__\/__\ 9 | /\ /\ 10 | /__\ /__\ 11 | /\ /\ /\ /\ 12 | /__\/__\ /__\/__\ 13 | /\ /\ /\ /\ 14 | /__\ /__\ /__\ /__\ 15 | /\ /\ /\ /\ /\ /\ /\ /\ 16 | /__\/__\/__\/__\/__\/__\/__\/__\ 17 | /\ /\ 18 | /__\ /__\ 19 | /\ /\ /\ /\ 20 | /__\/__\ /__\/__\ 21 | /\ /\ /\ /\ 22 | /__\ /__\ /__\ /__\ 23 | /\ /\ /\ /\ /\ /\ /\ /\ 24 | /__\/__\/__\/__\ /__\/__\/__\/__\ 25 | /\ /\ /\ /\ 26 | /__\ /__\ /__\ /__\ 27 | /\ /\ /\ /\ /\ /\ /\ /\ 28 | /__\/__\ /__\/__\ /__\/__\ /__\/__\ 29 | /\ /\ /\ /\ /\ /\ /\ /\ 30 | /__\ /__\ /__\ /__\ /__\ /__\ /__\ /__\ 31 | /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ /\ 32 | /__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\/__\ 33 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Unlambda interpreter 2 | 3 | This is a fast and memory-efficient interpreter of the 4 | [Unlambda](http://www.madore.org/~david/programs/unlambda/) programming 5 | language. 6 | 7 | ## Performance 8 | 9 | Compared to [unl.c](http://users.math.cas.cz/~jerabek/ptakoviny/index.html#unl) 10 | by Emil Jeřábek, which itself is 50-100 times faster than the official c-refcnt 11 | interpreter, this interpreter is about 2 times faster and uses about 1/2 of 12 | the memory. 13 | 14 | | Benchmark | unl.c | This interpreter | 15 | |---------------|-------|------------------| 16 | | adventure[^1] | 0.72s | 0.41s | 17 | | lisp[^2] | 2.05s | 1.28s | 18 | | elvm-8cc[^3] | 44.3s | 20.1s | 19 | 20 | [^1]: Complete [Adventure](https://github.com/irori/advent-unlambda) with the highest score (350 points). 21 | [^2]: Compute `(fib 16)` in [Unlambda Lisp](https://github.com/irori/unlambda-lisp). 22 | [^3]: Compile a [simple C program](https://github.com/shinh/elvm/blob/master/test/8cc.in) with `8cc.c.eir.unl` generated by [ELVM](https://github.com/shinh/elvm/) (`make unl`). 23 | 24 | ### Combinator Substitution 25 | 26 | To achieve this performance, this interpreter introduces several new 27 | combinators (`B`, `C`, `T`, and `V`) used only internally to substitute 28 | expressions under evaluation by pattern matching. The following substitution 29 | rules are implemented: 30 | 31 | ``` 32 | `S`Kf -> `Bf where ```Bfgx = `f`gx 33 | ``Sf`Kg -> ``Cfg where ```Cfgx = ``fxg 34 | ``SI`Kx -> `Tx where ``Txy = `yx 35 | ``S`Tx`Ky -> ``Vxy where ```Vxyz = ``zxy 36 | ``` 37 | 38 | (Note that `V` is the "pair" combinator (also known as "cons") and unrelated to 39 | the Unlambda's `v` ("black hole" function) builtin.) 40 | 41 | For example, when the first argument is given to `S`, if it is a partial 42 | application of `K` (with one argument `f` given), it is replaced by `` `Bf``. 43 | 44 | These auxiliary combinators use less memory and evaluate faster than the 45 | original SKI-only combinator expressions. 46 | 47 | ### Garbage Collection 48 | 49 | The object graph of Unlambda execution does not cycle, so memory management 50 | can be done using reference counting. In fact, the c-refcnt interpreter and 51 | unl.c both use reference counting. 52 | 53 | However, since Unlambda frequently creates and destroys objects, reference 54 | counting can be quite an overhead. Also, optimizing things like omitting 55 | reference counter operations where possible, or overwriting and reusing objects 56 | when the counter is 1, as unl.c does, can make the code more complicated. 57 | 58 | Therefore, this interpreter adopted a generational garbage collector. For new 59 | generation it uses two regions for 256k objects and performs copying GC. 60 | Objects that have survived this minor GC twice are moved to the old generation 61 | region. When the old generation area is full, a mark-sweep GC is performed on 62 | the entire heap as a major GC. 63 | 64 | Generational GC is very effective in Unlambda, often collecting more than 99% 65 | of objects in minor GC. In benchmark measurements, GC accounted for about 1% of 66 | the overall execution time. 67 | 68 | In general, Generational GC requires a write barrier to keep track of 69 | references from the old generation area to the new generation area. But in this 70 | interpreter, once an object is created, it is never rewritten, so references 71 | from the old generation to the new generation do not occur. Since no write 72 | barrier is needed, the evaluator can be written without worrying too much 73 | about GC (although copy GC changes object addresses). 74 | 75 | ## Building 76 | 77 | ```sh 78 | $ make 79 | ``` 80 | 81 | ## Usage 82 | 83 | ```sh 84 | $ unlambda [options] [program-file] 85 | ``` 86 | 87 | If _program-file_ is not specified, Unlambda program is read from the standard input. 88 | 89 | Options: 90 | 91 | - `-h`: Print help and exit. 92 | - `-v`: Print version and exit. 93 | - `-v0` (default): Do not print any debug information. 94 | - `-v1`: Print some statistics after execution. 95 | - `-v2`: Print logs for major GCs. 96 | - `-v3`: Print logs for minor GCs. 97 | 98 | ## License 99 | 100 | This software is released under the [MIT License](LICENSE). 101 | -------------------------------------------------------------------------------- /test/cal.unl: -------------------------------------------------------------------------------- 1 | # echo 2007 8 |unlambda cal.unl 2 | ``. `. `. `. `. `. `. `. i`````s`k`s`k`s`k``s`d`k`r`.a`.S`. `.r`.F`. `.h`.T`. `.e`.W`. `.u`.T`. `.o`.M`. `.u`.S`. `ri```sii`k```s`k``s``s`kski``s``s`ksk``s``s`kski``s`kr```s``s`ksk``s`k``s``s`kski``s``s`ksk``s``s`kski``si`k``s``s`ks``s``s`ksk`k`d`k`. i`ki``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s`k`s`k```s``s`kski``si`ki``s``s`ks``s``s`ksk`k`k``s`k`sikv`k`k`kiv`k`k`ki`k`ki``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s``s`ks``s`kk``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`kskv`k`ki``s`kk``s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s``s`ksk``s`kk``s`kk``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`k``s`kk``s`k`s`k`si``s`k`s``s`ksk``s`kkk`k`kk`k`k`ki`k`k`k``s`k``s``s`ksk``s``s`kski``s``s`ksk```s``s`ksk```sii``s``s`kski``s``s`kski``s`k`s`k`s`kk``s``s`ks``s`kk``s`ks``s`k`s`ks``s`k`s``s`ksk``s`kkk`k``s`kk``s`kk``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`k``s`kk``s`k`s`k`si``s`k`s``s`ksk``s`kkk`k`kk`k`k`ki`k`k`k`ki`k`k``s`kk``s`kk``s`k`s``s`ks``s`kk``s`k``s``s`ksk``s``s`kski```sii``s``s`kski``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`kk``s`ks``s`k`s`ks``s`k`s``s`ksk``s`kkk`k``s`kkk`k`k``s`kkk`k`k`k`ki`k`k`k``s``s`ks``s`k`s`ks``s`k`s`k`s`k`s``s``si`kii``s`k`s`k`s`kk``s`k`s`k`s`k`si``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s`kk``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s`kk``s`k`s``s``si`kii``s`kk``s`k`si``s``s`ks``s`kk``s``s``s`ks``s`k`s`ks``s`k`s`k`s`k``s``s`ksk``s`k```sii``s``s`kski``s``s`ksk```sii``s``s`kski``s``s`ks``s`kk``s`ksk`kk`k`ki`k``s`k`sikv`k`k``si`k``s``s`ks``s`kk``s``s`ks``s``s`ks``s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``si`k`ki``s`k`s`kk``s`k`s`k`s``s`ksk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ksk`k`kik`kk`k`kk`k`k`ki`k`k`k`ki`k`ki`k````sii``s``s`kski``si`ki`kk`k``s``s`ks``s`kk``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s`kk``s`k`s``s``si`kii``s`kk``s`k`si``s``s`ks``s`kk``s``s``s`ks``s`k`s`ks``s`k`s`k`s`k``s``s`ksk```sii``s``s`kski``s``s`ks``s`kk``s`ksk`kk`k`ki`k``s`k`sikv`k`k``si`k``s``s`ks``s`kk``s``s`ks``s``s`ks``s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``si`k`ki``s`k`s`kk``s`k`s`k`s``s`ksk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ksk`k`kik`kk`k`kk`k`k`ki`k`k`k`ki`k`ki`k````sii``s``s`kski``si`ki`kk`k``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s`kk``s`k`s``s``si`kii``s`kk``s`k`si``s``s`ks``s`kk``s``s`k`s`k``s``s`ksk```s``s`kski``s``s`ksk```sii``s``s`kski``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k``s`k`sikv`k`k``si`k``s``s`ks``s`kk``s``s`ks``s``s`ks``s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``si`k`ki``s`k`s`kk``s`k`s`k`s``s`ksk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ksk`k`kik`kk`k`kk`k`k`ki`k`k`k`ki`k`ki`k```s`k``s``s`kski``s``s`ksk```sii``s``s`kski``si`ki`kk`k`ki`k`k`k``s`k`sikv`k`k`k``si`k``s``s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``si`k`ki``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ksk`k`kik`kk`k``s`kk``s`k`s`k```sii``s``s`ks``s``s`ks``s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``si`k`ki``s`k`s`kk``s`k`s`k`s``s`ksk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`k``s``s`ksk`k`ki`k`kk`k`k`ki`k`k`k`ki`k`ki``s``s`ksk`k`ki`k`k`ki`k```s``s`ksk``s`k``s``s`kski``s``s`ksk``s``s`kski``si`ki`k`k`k``s`k`s``si`k``s. . k``s``s`ks``s`k`s`ks``s`k`s`k`s`k```sii``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`kskv`k`kiv``s`k`s`k`s`kk``s`k`s`k`s``s`ks``s`k`si``s``s`ks``s``s`ks``s`kk``s``s`ks``s`k`s``s``si`kii``s`kk``s`k`si``s``s`ks``s``s`ksk`k`k``s`k`sikv`k`k`ki`k`k``si`k``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`kk``s`ks``s`k`s`ks``s`k`s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``si`k`ki``s``s`ks``s`kk``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ksk`k`kik`kk`k``s`kk``s`kk``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k``s`k`s`kk``s`k`s`kk``s`k`s``s`ks``s`k`sik``s`kk``s`k`s`k```sii``s``s`ks``s``s`ks``s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``si`k`ki``s`k`s`kk``s`k`s`k`s``s`ksk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`k``s``s`ksk`k`ki`k`kk`k`k`ki`k`k`k`ki`k`ki``s``s`ksk`k`ki`k`k`k`ki`k``s`k`s`k```s`k``s``s`kski``s``s`ksk```sii``s``s`kski``si`kik`k`k``s``s`ks``s`k`s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`kskv`k`ki`k`k`k. ``s`kk``s``s`ks``s``s`ks``s``s`ksk`k`k``si`k`ki`k`k``s``si`k.0`k``s``si`k.1`k``s``si`k.2`k``s``si`k.3`k``s``si`k.4`k``s``si`k.5`k``s``si`k.6`k``s``si`k.7`k``s``si`k.8`k``s``si`k.9v`k`kk`k`ki`k``s``s``si`k``si`k`ki`k``s``si`k.0`k``s``si`k.1`k``s``si`k.2`k``s``si`k.3`k``s``si`k.4`k``s``si`k.5`k``s``si`k.6`k``s``si`k.7`k``s``si`k.8`k``s``si`k.9v`kk``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`k``s`kk``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`k``s`kk``s`k`s`k`si``s`k`s``s`ksk``s`kkk`k`kk`k`k`ki`k`k``s`kk``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k`k`ki``s`k`s`k`s`k`s``s`ks``s`kk``s``s`ksk```sii``s``s`ksk``s``s`kski``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`kk``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`kskv`k`ki``s`kk``s`kk``s``s`ks``s``s`ks``s``s`ks``s`kk``s`k`s``s``si`kii``s`kk``s`k`si``s``s`ks``s``s`ksk`k`k``s`k`sikv`k`k``si`k``s``s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``si`k`ki``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ksk`k`kik`kk`k``s`kk``s`k`s`k```sii``s``s`ks``s``s`ks``s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``si`k`ki``s`k`s`kk``s`k`s`k`s``s`ksk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`k``s``s`ksk`k`ki`k`kk`k`k`ki`k`k`k`ki`k`ki``s``s`ksk`k`ki`k`k`ki`k````sii``s``s`kski``si`kiv`k`ki`k``s`kk``s``s`ks``s``s`ks``s``s`ks``s`kk``s`k`s``s``si`kii``s`kk``s`k`si``s``s`ks``s``s`ksk`k`k``s`k`sikv`k`k``si`k``s``s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``si`k`ki``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ksk`k`kik`kk`k``s`kk``s`k`s`k```sii``s``s`ks``s``s`ks``s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``si`k`ki``s`k`s`kk``s`k`s`k`s``s`ksk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`k``s``s`ksk`k`ki`k`kk`k`k`ki`k`k`k`ki`k`ki``s``s`ksk`k`ki`k`k`ki`k````sii``s``s`kski``si`kiv`k`ki`k`k`ki`k`k``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s`k`s`k```s``s`kski``si`ki``s``s`ks``s``s`ksk`k`k``s`k`sikv`k`k`kiv`k`k`ki`k`ki``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ksk`k`k``si`ki`k`k````s``s`kski``s`k`sikv`k`k`kiv`k`k`ki`k`ki`k`k`k`k`ki`k`k``s`kk``s``s`ks``s``s`ks``s``s`ksk`k`k``si`k`ki`k`k``s``siv`k``s``si`k``s``s`ksk``s``s`kski`k``s``si`k`ki`k``s``si`k``s``s`ksk``s``s`kski`k``s``si`k``s``s`kski`k``s``si`k``s``s`ksk``s``s`kski`k``s``si`k``s``s`kski`k``s``si`k``s``s`ksk``s``s`kski`k``s``si`k``s``s`ksk``s``s`kski`k``s``si`k``s``s`kski`k``s``si`k``s``s`ksk``s``s`kski`k``s``si`k``s``s`kski`k``s``si`k``s``s`ksk``s``s`kskiv`k`kk`k`k`k`ki`k`k`kk`k`k`k`ki`k`k`ki````s``s`ks``s`kk``s`ks``s`k`s`ks``s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`k``s`k``s``s`kski``s``s`ksk```sii``s``s`kski``s``s`ks``s`kk``s`ksk`kk`k`ki`k``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki```@|i`c``s``s``s``s``s``s``s``s``s``s`d`?0i`k`ki``s`d`?1i`ki``s`d`?2i`k``s``s`kski``s`d`?3i`k``s``s`ksk``s``s`kski``s`d`?4i`k```sii``s``s`kski``s`d`?5i`k``s``s`ksk```sii``s``s`kski``s`d`?6i`k``s`k``s``s`kski``s``s`ksk``s``s`kski``s`d`?7i`k``s``s`ksk``s`k``s``s`kski``s``s`ksk``s``s`kski``s`d`?8i`k```s``s`ksk``s``s`kski``s``s`kski``s`d`?9i`k```s``s`kski``s``s`ksk``s``s`kski```@|i`c``s``s``s``s``s``s``s``s``s``s`d`?0i`k`ki``s`d`?1i`ki``s`d`?2i`k``s``s`kski``s`d`?3i`k``s``s`ksk``s``s`kski``s`d`?4i`k```sii``s``s`kski``s`d`?5i`k``s``s`ksk```sii``s``s`kski``s`d`?6i`k``s`k``s``s`kski``s``s`ksk``s``s`kski``s`d`?7i`k``s``s`ksk``s`k``s``s`kski``s``s`ksk``s``s`kski``s`d`?8i`k```s``s`ksk``s``s`kski``s``s`kski``s`d`?9i`k```s``s`kski``s``s`ksk``s``s`kski````s``s`ks``s`kk``s`ks``s`k`s`ks``s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`k``s`k``s``s`kski``s``s`ksk```sii``s``s`kski``s``s`ks``s`kk``s`ksk`kk`k`ki`k``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki```@|i`c``s``s``s``s``s``s``s``s``s``s`d`?0i`k`ki``s`d`?1i`ki``s`d`?2i`k``s``s`kski``s`d`?3i`k``s``s`ksk``s``s`kski``s`d`?4i`k```sii``s``s`kski``s`d`?5i`k``s``s`ksk```sii``s``s`kski``s`d`?6i`k``s`k``s``s`kski``s``s`ksk``s``s`kski``s`d`?7i`k``s``s`ksk``s`k``s``s`kski``s``s`ksk``s``s`kski``s`d`?8i`k```s``s`ksk``s``s`kski``s``s`kski``s`d`?9i`k```s``s`kski``s``s`ksk``s``s`kski```@|i`c``s``s``s``s``s``s``s``s``s``s`d`?0i`k`ki``s`d`?1i`ki``s`d`?2i`k``s``s`kski``s`d`?3i`k``s``s`ksk``s``s`kski``s`d`?4i`k```sii``s``s`kski``s`d`?5i`k``s``s`ksk```sii``s``s`kski``s`d`?6i`k``s`k``s``s`kski``s``s`ksk``s``s`kski``s`d`?7i`k``s``s`ksk``s`k``s``s`kski``s``s`ksk``s``s`kski``s`d`?8i`k```s``s`ksk``s``s`kski``s``s`kski``s`d`?9i`k```s``s`kski``s``s`ksk``s``s`kski```@|i````s``s`ks``s``s`ks``s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``si`ki`ki``s`k`s`k`s`d`k``|ii``s`k`s`kk``s``s`ks``s`kk``s`ks``s`k`s`ks``s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`k``s`k``s``s`kski``s``s`ksk```sii``s``s`kski``s``s`ks``s`kk``s`ksk`kk`k`ki`k``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki``s`kkk`k`ki```@|i`c``s``s``s``s``s``s``s``s``s``s`d`?0i`k`ki``s`d`?1i`ki``s`d`?2i`k``s``s`kski``s`d`?3i`k``s``s`ksk``s``s`kski``s`d`?4i`k```sii``s``s`kski``s`d`?5i`k``s``s`ksk```sii``s``s`kski``s`d`?6i`k``s`k``s``s`kski``s``s`ksk``s``s`kski``s`d`?7i`k``s``s`ksk``s`k``s``s`kski``s``s`ksk``s``s`kski``s`d`?8i`k```s``s`ksk``s``s`kski``s``s`kski``s`d`?9i`k```s``s`kski``s``s`ksk``s``s`kski``@i`c``s``s``s``s``s``s``s``s``s``s`d`?0i`k`ki``s`d`?1i`ki``s`d`?2i`k``s``s`kski``s`d`?3i`k``s``s`ksk``s``s`kski``s`d`?4i`k```sii``s``s`kski``s`d`?5i`k``s``s`ksk```sii``s``s`kski``s`d`?6i`k``s`k``s``s`kski``s``s`ksk``s``s`kski``s`d`?7i`k``s``s`ksk``s`k``s``s`kski``s``s`ksk``s``s`kski``s`d`?8i`k```s``s`ksk``s``s`kski``s``s`kski``s`d`?9i`k```s``s`kski``s``s`ksk``s``s`kski -------------------------------------------------------------------------------- /unlambda.c: -------------------------------------------------------------------------------- 1 | // Unlambda interpreter 2 | // 3 | // Copyright (c) 2018 Kunihiko Sakamoto 4 | // This code is licensed under the MIT License (see LICENSE file for details). 5 | 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | 15 | #define VERSION "1.0.0" 16 | 17 | // Verbosity levels 18 | enum { 19 | V_NONE, 20 | V_STATS, 21 | V_MAJOR_GC, 22 | V_MINOR_GC, 23 | } verbosity = V_NONE; 24 | 25 | static void errexit(char *fmt, ...) { 26 | va_list arg; 27 | va_start(arg, fmt); 28 | vfprintf(stderr, fmt, arg); 29 | va_end(arg); 30 | exit(1); 31 | } 32 | 33 | // Storage management -------------------------------------------------- 34 | 35 | typedef enum { 36 | // Expressions 37 | I, DOT, K1, K, S2, B2, C2, V2, S1, B1, T1, S, V, D1, D, CONT, C, E, AT, QUES, PIPE, AP, 38 | // Continuations 39 | EVAL_RIGHT, EVAL_RIGHT_S, APPLY, APPLY_T, EXIT, 40 | // GC 41 | COPIED, 42 | } CellType; 43 | 44 | typedef struct _Cell { 45 | CellType t; 46 | uint8_t ch; // for DOT and QUES 47 | uint8_t age; 48 | bool marked; 49 | struct _Cell *l, *r; 50 | } Cell; 51 | 52 | #define YOUNG_SIZE (256*1024) 53 | #define HEAP_CHUNK_SIZE (256*1024-1) 54 | #define AGE_MAX 2 55 | #define INITIAL_MARK_STACK_SIZE (64*1024) 56 | 57 | Cell young1[YOUNG_SIZE]; 58 | Cell young2[YOUNG_SIZE]; 59 | 60 | typedef struct _HeapChunk { 61 | Cell cells[HEAP_CHUNK_SIZE]; 62 | struct _HeapChunk *next; 63 | } HeapChunk; 64 | 65 | HeapChunk* old_area; 66 | Cell* free_list; 67 | 68 | Cell *free_ptr, *young_area_end, *next_young_area; 69 | 70 | static double total_gc_time = 0.0; 71 | static int major_gc_count = 0; 72 | static int minor_gc_count = 0; 73 | 74 | static void grow() { 75 | HeapChunk* chunk = malloc(sizeof(HeapChunk)); 76 | if (chunk == NULL) 77 | errexit("Out of memory\n"); 78 | chunk->next = old_area; 79 | old_area = chunk; 80 | 81 | for (int i = 0; i < HEAP_CHUNK_SIZE - 1; i++) 82 | chunk->cells[i].l = &chunk->cells[i + 1]; 83 | chunk->cells[HEAP_CHUNK_SIZE - 1].l = free_list; 84 | free_list = chunk->cells; 85 | } 86 | 87 | static void storage_init() { 88 | free_ptr = young1; 89 | young_area_end = free_ptr + YOUNG_SIZE; 90 | next_young_area = young2; 91 | grow(); 92 | } 93 | 94 | static inline Cell* new_cell(CellType t, Cell* l, Cell* r) { 95 | Cell* c = free_ptr++; 96 | c->t = t; 97 | c->age = 0; 98 | c->l = l; 99 | c->r = r; 100 | return c; 101 | } 102 | 103 | static inline Cell* new_cell1(CellType t, Cell* l) { 104 | Cell* c = free_ptr++; 105 | c->t = t; 106 | c->age = 0; 107 | c->l = l; 108 | return c; 109 | } 110 | 111 | static inline Cell* new_cell0(CellType t) { 112 | Cell* c = free_ptr++; 113 | c->t = t; 114 | c->age = 0; 115 | return c; 116 | } 117 | 118 | static void mark(Cell* roots[], int nroot) { 119 | int stack_size = INITIAL_MARK_STACK_SIZE; 120 | Cell** stack = malloc(sizeof(Cell*) * stack_size); 121 | if (!stack) 122 | errexit("Out of memory\n"); 123 | int i; 124 | for (i = 0; i < nroot; i++) 125 | stack[i] = roots[i]; 126 | 127 | while (i) { 128 | Cell* c = stack[--i]; 129 | top: 130 | if (!c || c->marked) 131 | continue; 132 | if (c->t == COPIED) 133 | c = c->l; 134 | c->marked = true; 135 | 136 | switch (c->t) { 137 | case K1: 138 | case S1: 139 | case B1: 140 | case D1: 141 | case T1: 142 | case CONT: 143 | c = c->l; 144 | goto top; 145 | case AP: 146 | case S2: 147 | case B2: 148 | case C2: 149 | case V2: 150 | case EVAL_RIGHT: 151 | case EVAL_RIGHT_S: 152 | case APPLY: 153 | case APPLY_T: 154 | if (i >= stack_size) { 155 | stack_size *= 2; 156 | stack = realloc(stack, sizeof(Cell*) * stack_size); 157 | if (!stack) 158 | errexit("Out of memory\n"); 159 | } 160 | stack[i++] = c->r; 161 | c = c->l; 162 | goto top; 163 | default: 164 | break; 165 | } 166 | } 167 | free(stack); 168 | } 169 | 170 | static void major_gc(Cell* roots[], int nroot) { 171 | mark(roots, nroot); 172 | 173 | // Sweep 174 | int freed = 0, total = 0; 175 | for (HeapChunk* chunk = old_area; chunk; chunk = chunk->next) { 176 | for (int i = 0; i < HEAP_CHUNK_SIZE; i++) { 177 | if (chunk->cells[i].marked) 178 | chunk->cells[i].marked = false; 179 | else { 180 | chunk->cells[i].l = free_list; 181 | free_list = &chunk->cells[i]; 182 | freed++; 183 | } 184 | } 185 | total += HEAP_CHUNK_SIZE; 186 | } 187 | if (verbosity >= V_MAJOR_GC) 188 | fprintf(stderr, "%d / %d cells freed\n", freed, total); 189 | 190 | for (int i = 0; i < YOUNG_SIZE; i++) 191 | young1[i].marked = false; 192 | for (int i = 0; i < YOUNG_SIZE; i++) 193 | young2[i].marked = false; 194 | 195 | while (freed < total / 5) { 196 | grow(); 197 | freed += HEAP_CHUNK_SIZE; 198 | total += HEAP_CHUNK_SIZE; 199 | } 200 | major_gc_count++; 201 | } 202 | 203 | static Cell* copy_cell(Cell* c) { 204 | if (!c) 205 | return NULL; 206 | 207 | if (c->t == COPIED) 208 | return c->l; 209 | 210 | if (c->age > AGE_MAX) 211 | return c; // Already promoted 212 | 213 | Cell* r; 214 | if (c->age == AGE_MAX) { 215 | // Promotion 216 | r = free_list; 217 | free_list = free_list->l; 218 | free_ptr->t = COPIED; 219 | free_ptr->l = r; 220 | free_ptr++; 221 | } else { 222 | r = free_ptr++; 223 | } 224 | *r = *c; 225 | r->age++; 226 | c->t = COPIED; 227 | c->l = r; 228 | return r; 229 | } 230 | 231 | static void gc_run(Cell* roots[], int nroot) { 232 | clock_t start = clock(); 233 | 234 | Cell* scan = free_ptr = next_young_area; 235 | next_young_area = young_area_end - YOUNG_SIZE; 236 | young_area_end = free_ptr + YOUNG_SIZE; 237 | 238 | for (int i = 0; i < nroot; i++) { 239 | if (!free_list) 240 | major_gc(roots, nroot); 241 | if (roots[i]) 242 | roots[i] = copy_cell(roots[i]); 243 | } 244 | 245 | while (scan < free_ptr) { 246 | if (!free_list) 247 | major_gc(roots, nroot); 248 | Cell* c = scan; 249 | if (c->t == COPIED) 250 | c = c->l; 251 | switch (c->t) { 252 | case COPIED: 253 | errexit("[BUG] cannot happen\n"); 254 | break; 255 | case K1: 256 | case S1: 257 | case B1: 258 | case D1: 259 | case T1: 260 | case CONT: 261 | c->l = copy_cell(c->l); 262 | break; 263 | case AP: 264 | case S2: 265 | case B2: 266 | case C2: 267 | case V2: 268 | case EVAL_RIGHT: 269 | case EVAL_RIGHT_S: 270 | case APPLY: 271 | case APPLY_T: 272 | c->l = copy_cell(c->l); 273 | if (!free_list) 274 | major_gc(roots, nroot); 275 | c->r = copy_cell(c->r); 276 | break; 277 | default: 278 | break; 279 | } 280 | scan++; 281 | } 282 | 283 | if (verbosity >= V_MINOR_GC) { 284 | long num_alive = free_ptr - (young_area_end - YOUNG_SIZE); 285 | fprintf(stderr, "Minor GC: %ld\n", num_alive); 286 | } 287 | 288 | minor_gc_count++; 289 | total_gc_time += (clock() - start) / (double)CLOCKS_PER_SEC; 290 | } 291 | 292 | // Parser -------------------------------------------------------------- 293 | 294 | static Cell* allocate_from_old(CellType t, Cell* l, Cell* r) { 295 | if (!free_list) 296 | grow(); 297 | 298 | Cell* c = free_list; 299 | free_list = free_list->l; 300 | c->t = t; 301 | c->age = AGE_MAX + 1; 302 | c->marked = false; 303 | c->l = l; 304 | c->r = r; 305 | return c; 306 | } 307 | 308 | static Cell* parse(FILE* fp) { 309 | Cell *preI = allocate_from_old(I, NULL, NULL); 310 | Cell *preK = allocate_from_old(K, NULL, NULL); 311 | Cell *preS = allocate_from_old(S, NULL, NULL); 312 | Cell *preV = allocate_from_old(V, NULL, NULL); 313 | Cell *preD = allocate_from_old(D, NULL, NULL); 314 | Cell *preC = allocate_from_old(C, NULL, NULL); 315 | Cell *preE = allocate_from_old(E, NULL, NULL); 316 | Cell *preAt = allocate_from_old(AT, NULL, NULL); 317 | Cell *prePipe = allocate_from_old(PIPE, NULL, NULL); 318 | 319 | Cell* stack = NULL; 320 | Cell* e; 321 | do { 322 | int ch; 323 | do { 324 | ch = fgetc(fp); 325 | if (ch == '#') { 326 | while (ch = fgetc(fp), ch != '\n' && ch != EOF) 327 | ; 328 | } 329 | } while (isspace(ch)); 330 | switch (ch) { 331 | case '`': 332 | stack = allocate_from_old(AP, NULL, stack); 333 | continue; 334 | case 'i': case 'I': e = preI; break; 335 | case 'k': case 'K': e = preK; break; 336 | case 's': case 'S': e = preS; break; 337 | case 'v': case 'V': e = preV; break; 338 | case 'd': case 'D': e = preD; break; 339 | case 'c': case 'C': e = preC; break; 340 | case 'e': case 'E': e = preE; break; 341 | case 'r': case 'R': e = allocate_from_old(DOT, NULL, NULL); e->ch = '\n'; break; 342 | case '@': e = preAt; break; 343 | case '|': e = prePipe; break; 344 | case '.': case '?': 345 | { 346 | int ch2 = fgetc(fp); 347 | if (ch2 == EOF) 348 | errexit("unexpected EOF\n"); 349 | e = allocate_from_old(ch == '.' ? DOT : QUES, NULL, NULL); 350 | e->ch = ch2; 351 | break; 352 | } 353 | case EOF: 354 | errexit("unexpected EOF\n"); 355 | break; 356 | default: 357 | errexit("unexpected character %c\n", ch); 358 | break; 359 | } 360 | while (stack) { 361 | if (!stack->l) { 362 | stack->l = e; 363 | break; 364 | } 365 | Cell* next = stack->r; 366 | stack->r = e; 367 | e = stack; 368 | stack = next; 369 | } 370 | } while (stack); 371 | return e; 372 | } 373 | 374 | static Cell* load_program(const char* fname) { 375 | FILE* fp; 376 | if (fname == NULL) 377 | fp = stdin; 378 | else { 379 | fp = fopen(fname, "r"); 380 | if (fp == NULL) 381 | errexit("cannot open %s\n", fname); 382 | } 383 | 384 | Cell* c = parse(fp); 385 | 386 | if (fname == NULL) { 387 | // If both program and input are from stdin, discard the rest of the 388 | // current line, for convenience 389 | int ch; 390 | do { 391 | ch = getchar(); 392 | } while (ch != EOF && ch != '\n'); 393 | } else { 394 | fclose(fp); 395 | } 396 | return c; 397 | } 398 | 399 | // Evaluator ----------------------------------------------------------- 400 | 401 | #define PUSHCONT(t, v) (next_cont = new_cell(task, next_cont, task_val), task = t, task_val = v) 402 | #define POPCONT (task = next_cont->t, task_val = next_cont->r, next_cont = next_cont->l) 403 | 404 | void run(Cell* val) { 405 | int current_ch = EOF; 406 | Cell* next_cont = NULL; 407 | Cell* op; 408 | 409 | CellType task = EXIT; 410 | Cell* task_val = NULL; 411 | 412 | goto eval; 413 | 414 | for (;;) { 415 | switch (task) { 416 | case EVAL_RIGHT: 417 | // Evaluate `. 418 | if (val->t == D) { 419 | op = val; 420 | val = task_val; 421 | POPCONT; 422 | goto apply; 423 | } else { 424 | Cell* rand = task_val; 425 | task = APPLY; 426 | task_val = val; 427 | val = rand; 428 | goto eval; 429 | } 430 | case EVAL_RIGHT_S: 431 | // Evaluate `, task_val is of the form ` 432 | // where v1 and v2 are already evaluated. 433 | if (val->t == D) { 434 | op = val; 435 | val = task_val; 436 | POPCONT; 437 | } else { 438 | Cell* rand = task_val; 439 | task = APPLY; 440 | task_val = val; 441 | op = rand->l; 442 | val = rand->r; 443 | } 444 | goto apply; 445 | case APPLY: 446 | // Apply `. 447 | op = task_val; 448 | POPCONT; 449 | goto apply; 450 | case APPLY_T: 451 | // Apply `. 452 | op = val; 453 | val = task_val; 454 | POPCONT; 455 | goto apply; 456 | case EXIT: 457 | return; 458 | default: 459 | errexit("[BUG] run: invalid task type %d\n", task); 460 | } 461 | continue; 462 | eval: 463 | while (val->t == AP) { 464 | if (free_ptr >= young_area_end) { 465 | Cell* roots[3] = {val, task_val, next_cont}; 466 | gc_run(roots, 3); 467 | val = roots[0]; 468 | task_val = roots[1]; 469 | next_cont = roots[2]; 470 | } 471 | PUSHCONT(EVAL_RIGHT, val->r); 472 | val = val->l; 473 | } 474 | continue; 475 | apply: 476 | if (free_ptr + 1 >= young_area_end) { 477 | Cell* roots[4] = {val, task_val, next_cont, op}; 478 | gc_run(roots, 4); 479 | val = roots[0]; 480 | task_val = roots[1]; 481 | next_cont = roots[2]; 482 | op = roots[3]; 483 | } 484 | switch (op->t) { 485 | case I: 486 | break; 487 | case DOT: 488 | putchar(op->ch); 489 | break; 490 | case K1: 491 | val = op->l; 492 | break; 493 | case K: 494 | val = new_cell1(K1, val); 495 | break; 496 | case S2: 497 | { 498 | Cell* e2 = new_cell(AP, op->r, val); 499 | PUSHCONT(EVAL_RIGHT_S, e2); 500 | op = op->l; 501 | goto apply; 502 | } 503 | case B2: 504 | if (op->l->t == D) { 505 | Cell* e2 = new_cell(AP, op->r, val); 506 | val = new_cell1(D1, e2); 507 | break; 508 | } else { 509 | PUSHCONT(APPLY, op->l); 510 | op = op->r; 511 | goto apply; 512 | } 513 | case C2: 514 | PUSHCONT(APPLY_T, op->r); 515 | op = op->l; 516 | goto apply; 517 | case V2: 518 | { 519 | Cell* v = op->l; 520 | PUSHCONT(APPLY_T, op->r); 521 | op = val; 522 | val = v; 523 | goto apply; 524 | } 525 | case S1: 526 | val = (val->t == K1) 527 | ? (op->l->t == I ? new_cell1(T1, val->l) 528 | : op->l->t == T1 ? new_cell(V2, op->l->l, val->l) 529 | : new_cell(C2, op->l, val->l)) 530 | : new_cell(S2, op->l, val); 531 | break; 532 | case B1: 533 | val = new_cell(B2, op->l, val); 534 | break; 535 | case T1: 536 | { 537 | Cell* v = op->l; 538 | op = val; 539 | val = v; 540 | goto apply; 541 | } 542 | case S: 543 | val = (val->t == K1) 544 | ? new_cell1(B1, val->l) 545 | : new_cell1(S1, val); 546 | break; 547 | case V: 548 | val = op; 549 | break; 550 | case D1: 551 | PUSHCONT(APPLY_T, val); 552 | val = op->l; 553 | goto eval; 554 | case D: 555 | val = new_cell1(D1, val); 556 | break; 557 | case CONT: 558 | next_cont = op->l; 559 | POPCONT; 560 | break; 561 | case C: 562 | PUSHCONT(APPLY, val); 563 | val = new_cell1(CONT, next_cont); 564 | break; 565 | case E: 566 | task = EXIT; 567 | break; 568 | case AT: 569 | current_ch = getchar(); 570 | PUSHCONT(APPLY, val); 571 | val = new_cell0(current_ch == EOF ? V : I); 572 | break; 573 | case QUES: 574 | PUSHCONT(APPLY, val); 575 | val = new_cell0(current_ch == op->ch ? I : V); 576 | break; 577 | case PIPE: 578 | PUSHCONT(APPLY, val); 579 | val = new_cell0(current_ch == EOF ? V : DOT); 580 | val->ch = current_ch; 581 | break; 582 | default: 583 | errexit("[BUG] apply: invalid operator type %d\n", op->t); 584 | } 585 | } 586 | } 587 | 588 | // Main ---------------------------------------------------------------- 589 | 590 | void help(const char *progname) { 591 | printf("Usage: %s [options] sourcefile\n", progname); 592 | printf(" -h print this help and exit\n"); 593 | printf(" -v print version and exit\n"); 594 | printf(" -v[0-3] set verbosity level (default: 0)\n"); 595 | } 596 | 597 | int main(int argc, char *argv[]) { 598 | char *prog_file = NULL; 599 | for (int i = 1; i < argc; i++) { 600 | if (argv[i][0] == '-' && argv[i][1] == 'v' && isdigit(argv[i][2])) { 601 | verbosity = argv[i][2] - '0'; 602 | } else if (strcmp(argv[i], "-h") == 0) { 603 | help(argv[0]); 604 | return 0; 605 | } else if (strcmp(argv[i], "-v") == 0) { 606 | printf("Unlambda interpreter " VERSION " by irori\n"); 607 | return 0; 608 | } else if (argv[i][0] == '-') { 609 | fprintf(stderr, "bad option %s (Try -h for more information).\n", argv[i]); 610 | return 1; 611 | } else { 612 | prog_file = argv[i]; 613 | } 614 | } 615 | 616 | storage_init(); 617 | Cell* root = load_program(prog_file); 618 | 619 | clock_t start = clock(); 620 | run(root); 621 | 622 | if (verbosity >= V_STATS) { 623 | double evaltime = (clock() - start) / (double)CLOCKS_PER_SEC; 624 | fprintf(stderr, " total eval time --- %5.2f sec.\n", evaltime - total_gc_time); 625 | fprintf(stderr, " total gc time --- %5.2f sec.\n", total_gc_time); 626 | fprintf(stderr, " major gc count --- %5d\n", major_gc_count); 627 | fprintf(stderr, " minor gc count --- %5d\n", minor_gc_count); 628 | } 629 | return 0; 630 | } 631 | -------------------------------------------------------------------------------- /test/lisp.unl: -------------------------------------------------------------------------------- 1 | ```````.>. i@i```sii``s`k`s``s`ks``s`k`s``s``s`k``sii`k``s`k`s`k`s``s`k`ki``s`d`k`ci``s`kc``s``s`d`k````````s`kc``s`k`s`k`k`ki``ss`k`kk`? i`ki`d`k`? 2 | ii@``s`kc``s`k`s`k`ki``ssv`ke`ki``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kkk``s`kk``s``s`ks``s`k`s`ks``s`k`s``s`ks``s`k`s`d`k```s`kc``s`k`s`k`k`ki``ss`k`kk`?)i``s`kk``s`k`s`d`@k``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`sik`kk````s`k`s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`kski`d`.i`.n.lk``s`k`s`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s``s`kskkv`kk``s`kk``s`kk``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ks``s``s`kskk`k`ki`ki`k``s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`ks``s`kk``s`ks``s`k`s`k``s``s`ks``s`kk``s`ks``s`k`s`ks``s`k`s``s`ksk``s`kkk`k``s`kkkk`kk`k`ki`k`k`ki``s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`kc``s`k`s`kk``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`d`?(i``s`k`s`kk``s`k`s`k`s`d`@k``s``s`ks``s`kk``s`ks``s``s`ks``s``s`kskk`k`ki`kk``s`k`s`k`s`d`?'i``s`k`s`kk``s`k`s`k`s`d`@k``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s``s`kskkv`kk`k`k`k``s``s`ks``s`k`s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`s`ks``s`k`s``s`ksk``s`kkk`k``s`kkk````s`k`s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``ci``s``s`kski`d`.t`.o`.u`.q.e``s``s`ks``s`k`s`k``s``s`ks``s`kk``s`ks``s`k`s`ks``s`k`s``s`ksk``s`kkk`k``s`kkkk`k`d`k````s`k`s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`kski`d`.i`.n.l`ki`k``s`k`si``s`kk``s``s`ks``s`kk``s``s`ks``s``s`ks``s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``si`ki`ki``s`k`s``s`ks``s`k`s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`k`s`k``s`kk``s`k`s``si`k`kikk``s`kkk``s`kk``s`k`s``s``s``s`k``sii`k``s``s`ks``s`k`s`ks``s`k`s``s`ks``s`k`s`d`k```s`kc``s`k`s`k`k`ki``ss`k`kk``````s`kc``s`k`s`k`k`ki``ss`k`kk`? i`ki`d`k``````s`kc``s`k`s`k`k`ki``ss`k`kk`? 3 | i`ki`d`k``````s`kc``s`k`s`k`k`ki``ss`k`kk`?(i`ki`d`k`?)iiii``s``s`ks``s`kk``s`ks``s`k`s`k``s``s`ks``s`kk``s`ks``s`k`sik`kkk`kk``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s`kk``s`k`s`k`s`d`@k``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`kk`k`ki`k``s`k`s``s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`d`k```sii``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``si`kk`kk`ki`k`ki``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`k`ki`k`ki`ki`k`ki``s`k`s`k`s`k``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki``s``s`ks``s`kk``s`ks``s``s`kskk`k``s``s`ksk`k`k`ki`k`ki`k``s``si`k``s``si`k?A`k?a`k``s``si`k``s``si`k?B`k?b`k``s``si`k``s``si`k?C`k?c`k``s``si`k``s``si`k?D`k?d`k``s``si`k``s``si`k?E`k?e`k``s``si`k``s``si`k?F`k?f`k``s``si`k``s``si`k?G`k?g`k``s``si`k``s``si`k?H`k?h`k``s``si`k``s``si`k?I`k?i`k``s``si`k``s``si`k?J`k?j`k``s``si`k``s``si`k?K`k?k`k``s``si`k``s``si`k?L`k?l`k``s``si`k``s``si`k?M`k?m`k``s``si`k``s``si`k?N`k?n`k``s``si`k``s``si`k?O`k?o`k``s``si`k``s``si`k?P`k?p`k``s``si`k``s``si`k?Q`k?q`k``s``si`k``s``si`k?R`k?r`k``s``si`k``s``si`k?S`k?s`k``s``si`k``s``si`k?T`k?t`k``s``si`k``s``si`k?U`k?u`k``s``si`k``s``si`k?V`k?v`k``s``si`k``s``si`k?W`k?w`k``s``si`k``s``si`k?X`k?x`k``s``si`k``s``si`k?Y`k?y`k``s``si`k``s``si`k?Z`k?z`k``s``si`k``s``si`k?0v`k``s``si`k``s``si`k?1v`k``s``si`k``s``si`k?2v`k``s``si`k``s``si`k?3v`k``s``si`k``s``si`k?4v`k``s``si`k``s``si`k?5v`k``s``si`k``s``si`k?6v`k``s``si`k``s``si`k?7v`k``s``si`k``s``si`k?8v`k``s``si`k``s``si`k?9v`k``s``si`k``s``si`k?-v`k``s``si`k``s``si`k?+v`k``s``si`k``s``si`k??v`k``s``si`k``s``si`k?!v`k``s``si`k``s``si`k?"v`k``s``si`k``s``si`k?#v`k``s``si`k``s``si`k?$v`k``s``si`k``s``si`k?%v`k``s``si`k``s``si`k?&v`k``s``si`k``s``si`k?'v`k``s``si`k``s``si`k?*v`k``s``si`k``s``si`k?,v`k``s``si`k``s``si`k?.v`k``s``si`k``s``si`k?/v`k``s``si`k``s``si`k?:v`k``s``si`k``s``si`k?v`k``s``si`k``s``si`k?@v`k``s``si`k``s``si`k?[v`k``s``si`k``s``si`k?\v`k``s``si`k``s``si`k?]v`k``s``si`k``s``si`k?^v`k``s``si`k``s``si`k?_v`k``s``si`k``s``si`k?`v`k``s``si`k``s``si`k?{v`k``s``si`k``s``si`k?|v`k``s``si`k``s``si`k?}v`k``s``si`k``s``si`k?~v`k``s``si`k``s``s`d`k``. `.r`.e`.t`.c`.a`.r`.a`.h`.c`. `.d`.i`.l`.a`.v`.n`.i`. `.:`.r`.e`.s`.r`.a`|.pr`ke`kivk`k`k``s`k`s`k|``s`kks`k`k`kiv`ki``s`kk``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``si`ki`ki``s`k`s``s`ks``s`k`s`k``s``s`ks``s`kk``s`ks``s`k`sik`kkk``s`kkk``s`k`s`kk``s``s`ks``s`kk``s`ks``s`k`s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`ksk`k`kk``s``s`ks``s`kk``s`ks``s`k`s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`kk``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ksk`k`kk`kk`k`ki``s`k`s`kk``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s`k`s`d`k```sii``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ksk`k`k`k`ki`k``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ksk`k`k`k`ki``s`k`s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k`k`ki``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ksk`k`kk`k`k``si`ki`k``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`k``s`k`sik`k`k`kiv``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`k``s``s`ksk`k`k`ki`k`k``s``s`ksk`k`k`ki`k`k`kik`ki``s`kk``s`kk``s``s`ksk`k`kk``s`kk``s``s`ks``s`kk``s`ks``s``s`ksk`k`k`ki`kk`k`k`ki`k`k`ki``s``s`ks``s`kk``s`ks``s``s`ksk`k`k`ki`kk`k`k``s``s`ks``s`k`s`ks``s`k`s`k`s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`k`s``s`ks``s`k`s`k``s`k`s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kkk``s`kkk`k`ki`k`ki`k`d`k````sii``s``s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``si`ki`ki``s`k`s`k`s`k`s`d`@k``s``s`ks``s`kk``s`ks``s`kk``s`ks``s``s`kskk`k``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ksk`k`ki`k`ki``s`kk``s`kk``s``s`ks``s`kk``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`k``s`k`s`k```ss```ss`ss``ss`ki``s`kskk`k`ki`kk`k``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k`k`ki`k`ki`kk`k``s`kkk`k`k`ki`k`d`k`c``s``s``s``s``s``s``s``s``s``s`d`?0i`k`ki``s`d`?1i`ki``s`d`?2i`k``s``s`kski``s`d`?3i`k```ss``ss`ki``s`ksk``s`d`?4i`k``ci``s``s`kski``s`d`?5i`k``s``s`ksk``ci``s``s`kski``s`d`?6i`k```ss``ss`k``ci``s``s`kski``s`ksk``s`d`?7i`k```ss``ss``ss`k``ci``s``s`kski``s`ksk``s`d`?8i`k```s``s`ksk`ci``s``s`kski``s`d`?9i`k````ss`ss``ss`ki``s`kskvv`k`k`kivk``s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s`k`s`k`s``s`ks``s`kk``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kkvv`k`k``s``s`ks``s``s`ks``s``s`ksk`k`k``si`ki`k`d`k`````ss``ss`k``ci``s``s`kski``s`ksk``s`k`sik`kiv``s``s`ks``s`kk``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`kk``s`k`s`k`s`ks``s`k`s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s`k`s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`kiv`k`kkvv`k`k`ki`k`ki`k`d`k`ri`k`d`k``.>. i``s`kk``s``s`kskk`k`kk`k`k`ki`k``s`k`s`kk``s`k`s``s`ks``s`k`s`ks``s`k`s``s`ks``s`k`s``s`k``sii`k``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s``s`ks``s`k`s``s`k``sii`k``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s``s`ks``s`kk``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ksk`k`k`k`kiv``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s`k`s`k`s``s`ks``s`kk``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ksk`k`k`k`kiv``s`k`s`k`s`k`s`kk``s`k`s`k`s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s`k`s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k`s``siv``s`kk``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kkvv`k``s`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ksk`k`k``si`ki`k``s``s`ks``s``s`ksk`k`k``s`k`sik`k`k`kiv`k``s`kk``s``s`ks``s``s`ksk`k`kkv``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s`k`s`k`s`k`s`kk``s`k`s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`kk``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`k``s``s`ks``s``s`ksk`k`k`kiv`k`k``s``s`ks``s``s`ksk`k`k`kiv`k`k`kk`k`k`k`kk`k`k`k`k`ki`k`k`k`k`k``s``s`k.s``s`k.t``s`k.n``s`k.e``s`k.m``s`k.u``s`k.g``s`k.r``s`k.a``s`k. ``s`k.w``s`k.e``s`k.f``s`k. ``s`k.o``s`k.o``s`k.t`ke`ki`k`k`k`k`ki`k`k``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ksk`k`k`k`kiv`k`k``s``s`k.s``s`k.t``s`k.n``s`k.e``s`k.m``s`k.u``s`k.g``s`k.r``s`k.a``s`k. ``s`k.y``s`k.n``s`k.a``s`k.m``s`k. ``s`k.o``s`k.o``s`k.t`ke`ki`k``s`kkk`k`k`ki`k`k`k`ki``s``s`ks``s`k`s`k``s``s`ks``s`kk``s`ks``s`k`s`ks``s`k`s``s`ksk``s`kkk`k``s`kkk``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`kiv`k`kkv`k`d`k````s`k`s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`kski`d`.i`.n.l``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`k``s``s`ks``s`kk``s`ks``s`k`s`ks``s`k`s``s`ksk``s`kkk`k``s`kkk``s`k`s`k`s`k`s`kk``s`k`s`k`s`k`s`k`s``si`ki``s`k`s`k`s`k`s`kk``s`k`s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ksk`k``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`s`ks``s`k`s``s`ksk``s`kkk`k``s`kkk````s`k`s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`ksk`d`.d`.b`.m`.a`.l.a``s``s`ks``s`k`s`k``s``s`ks``s`kk``s`ks``s`k`s`ks``s`k`s``s`ksk``s`kkk`k``s`kkk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`kiv`k`k`kiv`k`kkv``s``s`ks``s`k`s`k``s``s`ks``s`kk``s`ks``s`k`s`ks``s`k`s``s`ksk``s`kkk`k``s`kkk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`kiv`k`k`kiv`k`k`kiv`k`kkv`k`d`k````s`k`s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`kski`d`.i`.n.l`k`k`kiv`k`k`kiv`k`kkv``s`k`s`k`s``s`ks``s`kk``s`ks``s``s`ks``s`k`s``s`k``sii`k``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s``s`ks``s`kk``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ksk`k`k`k`kiv``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s`k`s`k`s``s`ks``s`kk``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ksk`k`k`k`kiv``s`k`s`k`s`k`s`kk``s`k`s`k`s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s`k`s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k`s``siv``s`kk``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kkvv`k``s`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ksk`k`k``si`ki`k``s``s`ks``s``s`ksk`k`k``s`k`sik`k`k`kiv`k``s`kk``s``s`ks``s``s`ksk`k`kkv``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s`k`s`k`s`k`s`kk``s`k`s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`kk``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`k``s``s`ks``s``s`ksk`k`k`kiv`k`k``s``s`ks``s``s`ksk`k`k`kiv`k`k`kk`k`k`k`kk`k`k`k`k`ki`k`k`k`k`k``s``s`k.s``s`k.t``s`k.n``s`k.e``s`k.m``s`k.u``s`k.g``s`k.r``s`k.a``s`k. ``s`k.w``s`k.e``s`k.f``s`k. ``s`k.o``s`k.o``s`k.t`ke`ki`k`k`k`k`ki`k`k``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ksk`k`k`k`kiv`k`k``s``s`k.s``s`k.t``s`k.n``s`k.e``s`k.m``s`k.u``s`k.g``s`k.r``s`k.a``s`k. ``s`k.y``s`k.n``s`k.a``s`k.m``s`k. ``s`k.o``s`k.o``s`k.t`ke`ki`k``s`kkk`k`k`ki`k`k`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s`k`s`d`k```s``s`ks``s`kk``s`ks``s`k`s`ks``s`k`s``s`ksk``s`kkk`k``s`kkk````s`k`s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk```ss``ss`ki``s`ksk`d`.d`.b`.m`.a`.l.a``s``s`ks``s`k`s`k``s``s`ks``s`kk``s`ks``s`k`s`ks``s`k`s``s`ksk``s`kkk`k``s`kkk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`kiv`k`k`kiv`k`kkv``s``s`ks``s`k`s`k``s``s`ks``s`kk``s`ks``s`k`s`ks``s`k`s``s`ksk``s`kkk`k``s`kkk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`kiv`k`k`kiv`k`k`kiv`k`kkv`k`d`k````s`k`s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`kski`d`.i`.n.l`k`k`kiv`k`kkv`ki``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`kk``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`kk`k`kk`k`k`kk`k`k`k`d`k````s`k`s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`kski`d`.i`.n.l`k`k`kik``s`kkk``s`kk``s`kkk``s`k`s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`kk``s`ks``s`kk``s`ks``s``s`ks``s``s`ksk`k`d`k````s`k`s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk```s``s`ksk`ci``s``s`kski`d`.n`.i`.r`.p.tv``s`k`s`k`s`kk``s`k`s`k`s`kk``s`k`s`k`s`k`si``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`k``s``s`ks``s`kk``s`ks``s`k`s`ks``s`k`s``s`ksk``s`kkk`k``s`kkk``s`k`s``s`ks``s`k`s`ks``s`k`s``s`ksk``s`kkk``s`kk``s`kkk`k`k`k`d`k````s`k`s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`kski`d`.i`.n.l``s`k`s`kk``s`k`s`k`s`kk``s``s`ks``s`kk``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s`k`s`d`k``.>. i``s``s`kskk`kk`k``s`kkk`k`k`k`k`ki`k`k`k``s`k``sii`k``s``s`ks``s`k`s`ks``s`k`s`k`s`kc``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`kskv`k`k``s``s`ks``s``s`kskv`k`ki`ki``s`kkk``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ks``s``s`kskv`k`k`k`ki`ki``s`k`s`kk``s`k`s``s`ksk``s`kkk``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kkvv`k`k``s``s`ks``s``s`ks``s``s`ksk`k`k``si`ki`k`d`k````ci``s``s`kski``s`k`sik`kiv`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`kiv`k`kkv``s`k`s``s`ks``s`kk``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kkvv`k`k``s``s`ks``s``s`ks``s``s`ksk`k`k``si`ki`k`d`k`````ss``ss`ki``s`ksk``s`k`sik`kiv`ki``s`k`s`k`s`kk``s`k`s`k`s`kk``s`k`s`k`s`kk``s`k`s`k`s`k`s``si`ki``s`k`s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`k``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`kiv`k`k`kiv`k`kkv`k``s``s`ks``s`kk``s`ks``s``s`ks``s`k`s``s`k``sii`k``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s``s`ks``s`kk``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ksk`k`k`k`kiv``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s`k`s`k`s``s`ks``s`kk``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ksk`k`k`k`kiv``s`k`s`k`s`k`s`kk``s`k`s`k`s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s`k`s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k`s``siv``s`kk``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kkvv`k``s`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ksk`k`k``si`ki`k``s``s`ks``s``s`ksk`k`k``s`k`sik`k`k`kiv`k``s`kk``s``s`ks``s``s`ksk`k`kkv``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`ks``s`k`s`k`s`k`s`kk``s`k`s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`kk``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`k``s``s`ks``s``s`ksk`k`k`kiv`k`k``s``s`ks``s``s`ksk`k`k`kiv`k`k`kk`k`k`k`kk`k`k`k`k`ki`k`k`k`k`k``s``s`k.s``s`k.t``s`k.n``s`k.e``s`k.m``s`k.u``s`k.g``s`k.r``s`k.a``s`k. ``s`k.w``s`k.e``s`k.f``s`k. ``s`k.o``s`k.o``s`k.t`ke`ki`k`k`k`k`ki`k`k``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ksk`k`k`k`kiv`k`k``s``s`k.s``s`k.t``s`k.n``s`k.e``s`k.m``s`k.u``s`k.g``s`k.r``s`k.a``s`k. ``s`k.y``s`k.n``s`k.a``s`k.m``s`k. ``s`k.o``s`k.o``s`k.t`ke`ki`k``s`kkk`k`k`ki`k`k`k`ki``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`kiv`k`kkv`ki`kk``s`k`s``s`ks``s`kk``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`kkvv`k`k``s``s`ks``s``s`ks``s``s`ksk`k`k``si`ki`k`d`k````s``s`ksk``ci``s``s`kski``s`k`sik`kiv`ki``s`k`s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`k``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`kiv`k`kkv`k`kkv`k`k`k`k``s``s`ks``s``s`ks``s``s`ksk`k`k``si`ki`k`d`k````s``s`kski``s`k`sik`kiv``s`k`s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`k``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`kiv`k`k`kiv`k`k`kiv`k`kkv`k`kk``s`k`s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`k``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k`kiv`k`k`kiv`k`kkv`k`kk`k`k`k`ki``s`k`s`k`s`k`si``s`k`s`k`s`kk``s``s`ks``s`kk``s`ks``s`kk``s`ks``s`kk``s``s`ks``s``s`ks``s`k`s``s`k``sii`k`k`k``s``s`ks``s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`kskv`k`k``s``s`ks``s``s`ks``s``s`ksk`k`k``si`ki`k`d`k``i``s`k`sik`kiv``s``s`ks``s`kk``s`ks``s``s`kskv`k``s`kk``s`kk``s`k`sik`k`k``s``s`k.e``s`k.p``s`k.y``s`k.t``s`k. ``s`k.e``s`k.r``s`k.u``s`k.d``s`k.e``s`k.c``s`k.o``s`k.r``s`k.p``s`k. ``s`k.n``s`k.w``s`k.o``s`k.n``s`k.k``s`k.n``s`k.u``s`k. ``s`k.:``s`k.y``s`k.l``s`k.p``s`k.p``s`k.a`ke`ki`k`ki``s``s`kskk`k``s``si`kkv`k``s``si`k`kiv``s``s`ks``s`kk``s`ks``s`k`s`ks``s`k`s`k`s`d`k```sii``s``s`ks``s`k`s`ks``s`k`s`k`si``s`k`s`kk``s`k`s``s`ks``s`k`s`ks``s`k`s`k`s`k``s``s`ks``s`kk``s`ks``s`k`s`ks``s`k`s``s`ksk``s`kkk`k``s`kkk``s``s`ks``s`kk``s`ksk`kk``s`k`s`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`kk`k`ki`k`k``s`kkk``s`k`s`kk``s``s`ks``s`kk``s`ks``s``s`ks``s``s`kskk`ki`kk`k``s`kkkv```s``si`k``s``si`k```ss``ss`ki``s`ksk`k``s``si`k```ss``ss`ki``s`ksk`k``s``si`k```s``s`ksk``si``s`k`s``s`ksk`ci``s``s`kski`k``s``si`k```ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`ki`k``s``si`k```ss``ss`ki``s`kskv``s``si`k``s``si`k``ci``s``s`kski`k``s``si`k```ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```ss``ss``ss``ss```ss`ss``ss`ki``s`kskv``s``si`k``s``si`k```s``s`ksk``si``s`k`s``s`ksk`ci``s``s`kskiv``s``si`k``s``si`k```s``s``s`k`ci``ss``ss`kis``s``sss`k``ci``s``s`kski``s`kskv``s``si`k``s``si`k````ci``s``s`kski```s```ss`ss``ss`kis``s`kskiv``s``si`k``s``si`k```s``s`ci`k```s```ss`ss``ss`kis``s`kski``s``s`kskiv``s``si`k``s``si`k```ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k````sss``s`ksk``ci``s``s`kski`k``s``si`kiv``s``si`k``s``si`k``s``s`ksk```s`cii``s``s`kski`k``s``si`k``s``s`ksk``ci``s``s`kskiv``s``si`k``s``si`k```ss``ss`k```s`cii``s``s`kski``s`ksk`k``s``si`k``ci``s``s`kski`k``s``si`k```ss``ss`ki``s`kskv``s``si`k``s``si`k```ss``ss`k```s`cii``s``s`kski``s`ksk`k``s``si`ki`k``s``si`k```ss``ss`ki``s`kskv``s``si`k``s``si`k```ss``ss``ss`k```s`cii``s``s`kski``s`ksk`k``s``si`k```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```ss``ss`ki``s`kskv``s``si`k``s``si`k````sss``s`ksk``ci``s``s`kski`k``s``si`k```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k````ss`ss``ss`ki``s`ksk`k``s``si`k```ss``ss`k```s`cii``s``s`kski``s`ksk`k``s``si`k```s`cii``s``s`kskiv``s``si`k``s``si`k````sss``s`ksk``ci``s``s`kskiv``s``si`k``s``si`k```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```ss``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k```ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k``s``s`ksk``ci``s``s`kski`k``s``si`k``ci``s``s`kskiv``s``si`k``s``si`k```ss``ss`k``ci``s``s`kski``s`ksk`k``s``si`k````ss`ss``ss`ki``s`kskv``s``si`k``s``si`k``s``s`ksk``ci``s``s`kski`k``s``si`k````sss``s`ksk``ci``s``s`kski`k``s``si`k```ss``ss``ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k```ss``s``sss`k``ci``s``s`kski``s`ksk`k``s``si`k``s``s`ksk```s`cii``s``s`kskiv``s``si`k``s``si`ki`k``s``si`k``ci``s``s`kski`k``s``si`k``s``s`kski`k``s``si`k```ss``ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`ki`k``s``si`k```ss``ss``ss```ss`ss``ss`ki``s`kskv``s``si`k``s``si`k```ss``ss``ss```ss`ss``ss`ki``s`ksk`k``s``si`k````ss`ss``ss`ki``s`ksk`k``s``si`k```ss``ss``ss``ss``ss```ss`ss``ss`ki``s`kskv`d`k````s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`kskiv``s`k`s``s`k``s``s`ks``s`kk``s`ks``s`k`sik`kk``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ksk`k`kk`kk`k`ki``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s`k`s`d`k```sii``s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ksk`k`k`k`ki`k``s`k`s`k``s`kc``s`k`s`k`ki``ssv``s``s`ksk`k`k`k`ki``s`k`s``s`ks``s`k`s`ks``s`k`s``s`ks``s``s`ksk`k`k`k`ki``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ksk`k`kk`k`k``si`ki`k``s``s`ks``s``s`ks``s``s`ksk`k`kk`k`k``s`k`sik`k`k`kiv``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`k``s``s`ksk`k`k`ki`k`k``s``s`ksk`k`k`ki`k`k`kik`ki`k``s`kk``s``s`ksk`k`kk`k``s``s`ks``s`kk``s`ks``s``s`ksk`k`k`ki`kk`k`k`ki``s``s`kc``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`kskv`k`k``s``s`ks``s``s`ks``s``s`ksk`k`k``si`ki`k`d`k````s``s`kski``s`k`sik`kiv`ki`k`k`d`k````s`k`s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`kski`d`.i`.n.l``s``s`ks``s``s`ks``s``s`ks``s``s`kskv`k`k``s``s`ks``s``s`ks``s``s`ksk`k`k``si`ki`k`d`k`````s``s`ksk`ci``s``s`kski``s`k`sik`kiv`ki`k`k`k`k``s``si`ki`k``s`d`k`k````s`k`s`kk``s``s`ks``s`kk``s`ks``s`k`sik`kk``s``s`kski`d`.i`.n.l``s`kr``s`d`k````sii``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kkk``s`kk``s``s`ks``s`k`s`ks``s`k`s``s`ksk``s`kk``s`kk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s`k`s`k. ``s``s`kskkv`kk``s`kk``s``s`ks``s``s`ks``s``s`kskk`k`ki`ki``s`k`s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s`k`s`k`s``s`ks``s``s`ks``s`k`s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s`ks``s``s`ks``s``s`ksk`k`k``si`ki`k`d`k````s``s`kski``s`k`sik`kiv`k`k`d`k`.)i``s`k`s`kk``s`k`s`kk``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`d`k`. `..`. i``s``s`ks``s`kk``s`ks``s``s`ks``s``s`kskkv`kk`k`k`k.)`k`k`ki`k`k`k`ki``s`kk``s``s`ks``s`k`s`ks``s`k`s``s`ksk``s`kk``s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`d`k`.(i``s``s`ks``s`kk``s`ks``s``s`ks``s``s`kskkv`kk``s`kk``s``s`ks``s``s`ks``s``s`kskk`k`ki`ki`k`k`k``s``s`ks``s`k`s`kc``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k``si`ki`k`d`k```ki``s`k`sik`kiv`ki`k``s`kk``s``s`ks``s`k`s`d`k```sii``s``s`ks``s`k`s``s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``s``s``si`k``s`k`sik`k`ki`d`k``````ss`ss``ss`ki``s`ksk``s`k`sikv``s``s`ks``s``s`ks``s``s`ksk`k`k``si`k`ki`k`k``s``si`k.0`k``s``si`k.1`k``s``si`k.2`k``s``si`k.3`k``s``si`k.4`k``s``si`k.5`k``s``si`k.6`k``s``si`k.7`k``s``si`k.8`k``s``si`k.9v`k`kk``s`k`s``s`ks``s``s`ks``s`k`s`d`k```sii``s``s`ks``s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`kk``s`ks``s`k`s`ks``s`k`s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``si`k`ki``s``s`ks``s`kk``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`kk`k``s`kk``s`kk``s`k`s``s`ksk``s``s`ks``s`k`s`ks``s``s`ks``s`kk``s`ksk`kk`k`ki`k``s`k`s`kk``s`k`s`kk``s`k`s``s`ks``s`k`sik``s`kk``s`k`s`d`k```sii``s``s`ks``s``s`ks``s`k`s``s`k``s`kc``s`k`s`k`k`ki``ss`k`kk``si`k`ki``s`k`s`kk``s`k`s`k`s``s`ksk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`k`s`ks``s`k`s`kk``s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`k``s``s`ksk`k`ki`k`kk`k`k`ki`k`k`k`ki`k`ki``s``s`ksk`k`ki`k`k`k`ki`k``s`k`s`d`k````ss```ss`ss``ss`ki``s`ksk``si`kik``s`kk``s`k`si``s``s`ks``s``s`ksk`k`k``s`k`sikv`k`k`ki``s`kk``s`kk``s``s`ks``s`k`s`ks``s`k`s`k`s`ks``s``s`ks``s`kk``s`ks``s``s`kskk`kk`k`k``s``s``si`k``si`k`ki`k``s``si`k.0`k``s``si`k.1`k``s``si`k.2`k``s``si`k.3`k``s``si`k.4`k``s``si`k.5`k``s``si`k.6`k``s``si`k.7`k``s``si`k.8`k``s``si`k.9v`kk`k`kik`k`ki``s`kk``s``s`ks``s``s`ks``s``s`ks``s``s`ks``s``s`ksk`k`k``si`ki`k`d`k``i``s`k`sik`kiv`ki`k`k`d`k`.>`.e`.r`.u`.d`.e`.c`.o`.r`.p`.