summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPrefetch2024-03-02 19:36:12 +0100
committerPrefetch2024-03-02 19:36:12 +0100
commit1fbb07c54523c7a576bfff1cb689e155dd55f15a (patch)
tree7aa9f92a7d99ae9203b538803b7efefd846b67e0
parentaf589b238c1d51960d8af3b36041aca2bad7855b (diff)
Add first five days
-rw-r--r--01/input.txt1
-rw-r--r--01/lib.scm34
-rw-r--r--01/main.scm14
-rw-r--r--01/test.scm43
-rw-r--r--02/input.txt16
-rw-r--r--02/lib.scm74
-rw-r--r--02/main.scm20
-rw-r--r--02/test.scm38
-rw-r--r--03/lib.scm99
-rw-r--r--03/main.scm13
-rw-r--r--03/test.scm42
-rw-r--r--04/input.txt512
-rw-r--r--04/lib.scm74
-rw-r--r--04/main.scm20
-rw-r--r--04/test.scm41
-rw-r--r--05/input.txt1044
-rw-r--r--05/lib.scm29
-rw-r--r--05/main.scm20
-rw-r--r--05/test.scm29
19 files changed, 2163 insertions, 0 deletions
diff --git a/01/input.txt b/01/input.txt
new file mode 100644
index 0000000..eb275f7
--- /dev/null
+++ b/01/input.txt
@@ -0,0 +1 @@
+649713959682898259577777982349515784822684939966191359164369933435366431847754488661965363557985166219358714739318371382388296151195361571216131925158492441461844687324923315381358331571577613789649166486152237945917987977793891739865149734755993241361886336926538482271124755359572791451335842534893192693558659991171983849285489139421425933638614884415896938914992732492192458636484523228244532331587584779552788544667253577324649915274115924611758345676183443982992733966373498385685965768929241477983727921279826727976872556315428434799161759734932659829934562339385328119656823483954856427365892627728163524721467938449943358192632262354854593635831559352247443975945144163183563723562891357859367964126289445982135523535923113589316417623483631637569291941782992213889513714525342468563349385271884221685549996534333765731243895662624829924982971685443825366827923589435254514211489649482374876434549682785459698885521673258939413255158196525696236457911447599947449665542554251486847388823576937167237476556782133227279324526834946534444718161524129285919477959937684728882592779941734186144138883994322742484853925383518651687147246943421311287324867663698432546619583638976637733345251834869985746385371617743498627111441933546356934671639545342515392536574744795732243617113574641284231928489312683617154536648219244996491745718658151648246791826466973654765284263928884137863647623237345882469142933142637583644258427416972595241737254449718531724176538648369253796688931245191382956961544775856872281317743828552629843551844927913147518377362266554334386721313244223233396453291224932499277961525785755863852487141946626663835195286762947172384186667439516367219391823774338692151926472717373235612911848773387771244144969149482477519437822863422662157461968444281972353149695515494992537927492111388193837553844671719291482442337761321272333982924289323437277224565149928416255435841327756139118119744528993269157174414264387573331116323982614862952264597611885999285995516357519648695594299657387614793341626318866519144574571816535351149394735916975448425618171572917195165594323552199346814729617189679698944337146
diff --git a/01/lib.scm b/01/lib.scm
new file mode 100644
index 0000000..fcdf642
--- /dev/null
+++ b/01/lib.scm
@@ -0,0 +1,34 @@
+(library (lib)
+ (export solve-part1 solve-part2)
+ (import (chezscheme))
+
+ ; Rotate contents of `ilist' to the right `times' times
+ (define (list-rotate ilist times)
+ (let loop ((xs ilist) (n times))
+ (if (= n 0)
+ xs
+ (loop (append (cdr xs) (list (car xs))) (- n 1)))))
+
+ (define (solve-puzzle chars chars-rot)
+ (fold-left
+ (lambda (accum c1 c2)
+ ; Does `k'th char in list match with `k'th char in rotated list?
+ (if (char=? c1 c2)
+ ; Assume `c1' is a digit, convert it to integer in [0,9]
+ (+ accum (string->number (string c1)))
+ accum))
+ 0 chars chars-rot))
+
+ ; Compare each char to its right neighbour in circular list
+ (define (solve-part1 str)
+ (let* ((chars (string->list str))
+ (chars-rot (list-rotate chars 1)))
+ (solve-puzzle chars chars-rot)))
+
+ ; Compare each char to char halfway across circular list
+ (define (solve-part2 str)
+ (let* ((chars (string->list str))
+ (chars-rot (list-rotate chars (div (length chars) 2))))
+ (solve-puzzle chars chars-rot)))
+
+)
diff --git a/01/main.scm b/01/main.scm
new file mode 100644
index 0000000..9ec5afa
--- /dev/null
+++ b/01/main.scm
@@ -0,0 +1,14 @@
+(import (chezscheme))
+
+; Where the magic happens
+(import (lib))
+
+; Read my personal puzzle input
+(define input
+ (call-with-input-file "input.txt" get-line))
+
+; Part 1 gives 1228 for me
+(printf "Part 1 solution: ~a\n" (solve-part1 input))
+
+; Part 2 gives 1238 for me
+(printf "Part 2 solution: ~a\n" (solve-part2 input))
diff --git a/01/test.scm b/01/test.scm
new file mode 100644
index 0000000..6dbff81
--- /dev/null
+++ b/01/test.scm
@@ -0,0 +1,43 @@
+(import (chezscheme))
+
+; Where the magic happens
+(import (lib))
+
+; My quick-and-dirty unit testing framework (copied for each day)
+(define (run-test name proc input expected)
+ (let ((result (proc input)))
+ (if (= result expected)
+ (printf "\x1b;[32;1mPASS\x1b;[0m: ~a\n"
+ name)
+ (printf "\x1b;[31;1mFAIL\x1b;[0m: ~a: got ~a, expected ~a\n"
+ name result expected))))
+
+(printf "Part 1 tests:\n")
+
+(define (test-part1 name input expected)
+ (run-test name solve-part1 input expected))
+
+(test-part1 "part 1 example 1"
+ "1122" 3)
+(test-part1 "part 1 example 2"
+ "1111" 4)
+(test-part1 "part 1 example 3"
+ "1234" 0)
+(test-part1 "part 1 example 4"
+ "91212129" 9)
+
+(printf "Part 2 tests:\n")
+
+(define (test-part2 name input expected)
+ (run-test name solve-part2 input expected))
+
+(test-part2 "part 2 example 1"
+ "1212" 6)
+(test-part2 "part 2 example 2"
+ "1221" 0)
+(test-part2 "part 2 example 3"
+ "123425" 4)
+(test-part2 "part 2 example 4"
+ "123123" 12)
+(test-part2 "part 2 example 5"
+ "12131415" 4)
diff --git a/02/input.txt b/02/input.txt
new file mode 100644
index 0000000..315a416
--- /dev/null
+++ b/02/input.txt
@@ -0,0 +1,16 @@
+62 1649 1731 76 51 1295 349 719 52 1984 2015 2171 981 1809 181 1715
+161 99 1506 1658 84 78 533 242 1685 86 107 1548 670 960 1641 610
+95 2420 2404 2293 542 2107 2198 121 109 209 2759 1373 1446 905 1837 111
+552 186 751 527 696 164 114 530 558 307 252 200 481 142 205 479
+581 1344 994 1413 120 112 656 1315 1249 193 1411 1280 110 103 74 1007
+2536 5252 159 179 4701 1264 1400 2313 4237 161 142 4336 1061 3987 2268 4669
+3270 1026 381 185 293 3520 1705 1610 3302 628 3420 524 3172 244 295 39
+4142 1835 4137 3821 3730 2094 468 141 150 3982 147 4271 1741 2039 4410 179
+1796 83 2039 1252 84 1641 2165 1218 1936 335 1807 2268 66 102 1977 2445
+96 65 201 275 257 282 233 60 57 200 216 134 72 105 81 212
+3218 5576 5616 5253 178 3317 6147 5973 2424 274 4878 234 200 4781 5372 276
+4171 2436 134 3705 3831 3952 2603 115 660 125 610 152 4517 587 1554 619
+2970 128 2877 1565 1001 167 254 2672 59 473 2086 181 1305 162 1663 2918
+271 348 229 278 981 1785 2290 516 473 2037 737 2291 2521 1494 1121 244
+2208 2236 1451 621 1937 1952 865 61 1934 49 1510 50 1767 59 194 1344
+94 2312 2397 333 1192 106 2713 2351 2650 2663 703 157 89 510 1824 125
diff --git a/02/lib.scm b/02/lib.scm
new file mode 100644
index 0000000..0274dad
--- /dev/null
+++ b/02/lib.scm
@@ -0,0 +1,74 @@
+(library (lib)
+ (export solve-part1 solve-part2)
+ (import (chezscheme))
+
+ ; Split list at first delimiter into `prefix' and `suffix'
+ ; Return value is a pair like `((p r e f i x) s u f f i x)'
+ (define (list-split-left delimiter? xs)
+ (let loop ((prefix '())
+ (suffix xs))
+ (if (null? suffix)
+ (cons prefix suffix)
+ (let ((x (car suffix)))
+ (if (delimiter? x)
+ ; Found first delimiter, so return immediately
+ (cons prefix (cdr suffix))
+ ; `x' isn't a delimiter, so append it to `prefix'
+ (loop (append prefix (list x)) (cdr suffix)))))))
+
+ ; Split list at given delimiter into list of sublists
+ (define (list-split delimiter? xs)
+ (let loop ((pieces '())
+ (rest xs))
+ (if (null? rest)
+ ; Fix order and remove all empty sublists from output
+ ; (which are caused by consecutive delimiters in `xs')
+ (reverse (remp null? pieces))
+ ; Extract next piece from `rest' and prepend it to `pieces'
+ (let ((next (list-split-left delimiter? rest)))
+ (loop (cons (car next) pieces) (cdr next))))))
+
+ ; Split string at whitespace into list of words
+ (define (string-split str)
+ (map list->string (list-split char-whitespace? (string->list str))))
+
+ ; Partially applied divisibility check
+ (define (check-divisor? x)
+ (lambda (y)
+ (and (not (= y 0)) ; Don't try dividing by zero
+ (not (= x y)) ; Disallow trivial solution
+ (= (mod x y) 0))))
+
+ ; Find minimum and maximum in row, return difference
+ (define (find-range row)
+ (- (apply max row) (apply min row)))
+
+ ; Find `x' and `y' where `y' is divisor of `x', return quotient
+ (define (find-quotient row)
+ ; Note: we don't check if we've reached the end of `xs',
+ ; because we're guaranteed success before that happens.
+ ; We're also guaranteed only one non-trivial solution.
+ (let loop ((xs row))
+ (let* ((x (car xs))
+ (y (find (check-divisor? x) row)))
+ ; Is this the (`x',`y') combination we're looking for,
+ ; i.e. have we found a valid divisor `y' for this `x'?
+ (if y
+ (div x y)
+ (loop (cdr xs))))))
+
+ ; Add up result of `proc' for each `row' of numbers in `lines'
+ (define (solve-puzzle proc lines)
+ (fold-left
+ (lambda (accum row)
+ (+ accum (proc (map string->number row))))
+ 0
+ (map string-split lines)))
+
+ (define (solve-part1 lines)
+ (solve-puzzle find-range lines))
+
+ (define (solve-part2 lines)
+ (solve-puzzle find-quotient lines))
+
+)
diff --git a/02/main.scm b/02/main.scm
new file mode 100644
index 0000000..746fa01
--- /dev/null
+++ b/02/main.scm
@@ -0,0 +1,20 @@
+(import (chezscheme))
+
+; Where the magic happens
+(import (lib))
+
+; Read my personal puzzle input
+(define input
+ (call-with-input-file "input.txt"
+ (lambda (port)
+ (let loop ((line (get-line port))
+ (result '()))
+ (if (eof-object? line)
+ (reverse result)
+ (loop (get-line port) (cons line result)))))))
+
+; Part 1 gives 44216 for me
+(printf "Part 1 solution: ~a\n" (solve-part1 input))
+
+; Part 2 gives 320 for me
+(printf "Part 2 solution: ~a\n" (solve-part2 input))
diff --git a/02/test.scm b/02/test.scm
new file mode 100644
index 0000000..10ee751
--- /dev/null
+++ b/02/test.scm
@@ -0,0 +1,38 @@
+(import (chezscheme))
+
+; Where the magic happens
+(import (lib))
+
+; My quick-and-dirty unit testing framework (copied for each day)
+(define (run-test name proc input expected)
+ (let ((result (proc input)))
+ (if (= result expected)
+ (printf "\x1b;[32;1mPASS\x1b;[0m: ~a\n"
+ name)
+ (printf "\x1b;[31;1mFAIL\x1b;[0m: ~a: got ~a, expected ~a\n"
+ name result expected))))
+
+(printf "Part 1 tests:\n")
+
+(define (test-part1 name input expected)
+ (run-test name solve-part1 input expected))
+
+(define part1-example1
+ '("5 1 9 5"
+ "7 5 3"
+ "2 4 6 8"))
+(test-part1 "part 1 example 1"
+ part1-example1 18)
+
+(printf "Part 2 tests:\n")
+
+(define (test-part2 name input expected)
+ (run-test name solve-part2 input expected))
+
+(define part2-example1
+ '("5 9 2 8"
+ "9 4 7 3"
+ "3 8 6 5"))
+(test-part2 "part 2 example 1"
+ part2-example1 9)
+
diff --git a/03/lib.scm b/03/lib.scm
new file mode 100644
index 0000000..6e1e4d1
--- /dev/null
+++ b/03/lib.scm
@@ -0,0 +1,99 @@
+(library (lib)
+ (export solve-part1 solve-part2)
+ (import (chezscheme))
+
+ ; Is this direction up or down?
+ (define (vertical? dir)
+ (= 0 (vector-ref dir 0)))
+
+ ; Rotate stepping direction counterclockwise 90 degrees
+ (define (rotate-ccw dir)
+ (cond
+ ((equal? dir '#(1 0))
+ '#(0 1))
+ ((equal? dir '#(0 1))
+ '#(-1 0))
+ ((equal? dir '#(-1 0))
+ '#(0 -1))
+ ((equal? dir '#(0 -1))
+ '#(1 0))))
+
+ ; Follow the spiral to find (x,y) `pos' of the `address'th square.
+ ; The idea is to take `steps' steps in the current direction `dir',
+ ; rotate `dir', take `steps' steps again, rotate, increment `steps',
+ ; then start over, and so on. So the sequence starts like this:
+ ; 1 step right, 1 step up,
+ ; 2 steps left, 2 steps down,
+ ; 3 steps right, 3 steps up,
+ ; 4 steps left, 4 steps down,
+ ; etc.
+ ; Note: for each value of `steps', the last stage is always up/down.
+ (define (get-position address)
+ (let loop ((pos '#(0 0))
+ (dir '#(1 0))
+ (steps 1)
+ (count 0)
+ (total 1))
+ (if (= total address)
+ pos
+ (if (= count (- steps 1))
+ ; Yes, this is the last step before we need to turn
+ (loop
+ ; Take the step, i.e. add direction to position
+ (vector-map + pos dir)
+ ; Rotate counterclockwise after this step
+ (rotate-ccw dir)
+ ; If this step is vertical, we need to increment
+ (+ steps (if (vertical? dir) 1 0))
+ ; Reset step counter for the current direction
+ 0
+ ; Keep track of total steps since square one
+ (+ total 1))
+ ; No, this is an ordinary step, no rotation needed
+ (loop
+ (vector-map + pos dir)
+ dir
+ steps
+ (+ count 1)
+ (+ total 1))))))
+
+ ; Given a position, return all eight positions adjacent to it
+ (define (get-adjacent pos)
+ (map
+ (lambda (dir) (vector-map + pos dir))
+ '(#(1 0) #(1 1) #(0 1) #(-1 1) #(-1 0) #(-1 -1) #(0 -1) #(1 -1))))
+
+ ; Given a position, sum the values of all initialized adjacent squares
+ (define (sum-adjacent pos memory)
+ (fold-left
+ (lambda (sum adj)
+ ; Try to retrieve `pair' from memory
+ (let ((pair (assoc adj memory)))
+ (+ sum
+ ; If position `(car pair)' has been written,
+ ; add its value `(cdr pair) to the sum total.
+ (if pair (cdr pair) 0))))
+ 0
+ (get-adjacent pos)))
+
+ (define (solve-part1 target)
+ (let* ((xy (get-position target))
+ (x (vector-ref xy 0))
+ (y (vector-ref xy 1)))
+ (+ (abs x) (abs y))))
+
+ (define (solve-part2 target)
+ (let loop ((address 2)
+ (memory '((#(0 0) . 1))))
+ (let ((value (cdar memory)))
+ ; Has the most recently written `value' crossed the threshold?
+ (if (> value target)
+ value
+ ; If not, move on, writing a new `val' to the next `pos'
+ (let* ((pos (get-position address))
+ (val (sum-adjacent pos memory)))
+ (loop
+ (+ address 1)
+ (cons (cons pos val) memory)))))))
+
+)
diff --git a/03/main.scm b/03/main.scm
new file mode 100644
index 0000000..561fcd7
--- /dev/null
+++ b/03/main.scm
@@ -0,0 +1,13 @@
+(import (chezscheme))
+
+; Where the magic happens
+(import (lib))
+
+; My personal puzzle input
+(define input 289326)
+
+; Part 1 gives 419 for me
+(printf "Part 1 solution: ~a\n" (solve-part1 input))
+
+; Part 2 gives 295229 for me
+(printf "Part 2 solution: ~a\n" (solve-part2 input))
diff --git a/03/test.scm b/03/test.scm
new file mode 100644
index 0000000..0f7817c
--- /dev/null
+++ b/03/test.scm
@@ -0,0 +1,42 @@
+(import (chezscheme))
+
+; Where the magic happens
+(import (lib))
+
+; My quick-and-dirty unit testing framework (copied for each day)
+(define (run-test name proc input expected)
+ (let ((result (proc input)))
+ (if (= result expected)
+ (printf "\x1b;[32;1mPASS\x1b;[0m: ~a\n"
+ name)
+ (printf "\x1b;[31;1mFAIL\x1b;[0m: ~a: got ~a, expected ~a\n"
+ name result expected))))
+
+(printf "Part 1 tests:\n")
+
+(define (test-part1 name input expected)
+ (run-test name solve-part1 input expected))
+
+(test-part1 "part 1 example 1"
+ 1 0)
+(test-part1 "part 1 example 2"
+ 12 3)
+(test-part1 "part 1 example 3"
+ 23 2)
+(test-part1 "part 1 example 4"
+ 1024 31)
+
+(printf "Part 2 tests:\n")
+
+(define (test-part2 name input expected)
+ (run-test name solve-part2 input expected))
+
+(test-part2 "part 2 example 1"
+ 1 2)
+(test-part2 "part 2 example 2"
+ 23 25)
+(test-part2 "part 2 example 3"
+ 133 142)
+(test-part2 "part 2 example 4"
+ 747 806)
+
diff --git a/04/input.txt b/04/input.txt
new file mode 100644
index 0000000..bf3fffb
--- /dev/null
+++ b/04/input.txt
@@ -0,0 +1,512 @@
+pphsv ojtou brvhsj cer ntfhlra udeh ccgtyzc zoyzmh jum lugbnk
+vxjnf fzqitnj uyfck blnl impo kxoow nngd worcm bdesehw
+caibh nfuk kfnu llfdbz uxjty yxjut jcea
+qiho qif eupwww avyglnj nxzotsu hio lws
+xjty usocjsh pivk qnknunc yjcgh bwya djw zpyr
+ycfmfe mgq sjiomg nfzjul bjwkmgu yvsnvgj dcjupu wzz blmn
+rdowgbt vpwfdoi blzl laghnk gsa vhnpo cztxzlb rtz hvwonhb eciju pfjtbo
+bqs bqs dbutvgf mmzb izpyud rap izpyud xlzeb mnj hjncs
+xpu vwp nujcos piu irindir tpmfd umtvlm gznu
+sfpuxar qcnbte omouazv cnh uaxspfr sepolf rusafpx
+xbmaf iceyqqq sabpt gliexel muubepe qqiyqce fmrcc eazk obkeonl fmccr kgk
+apg gbycwe gap pag
+gagv saqbk lwtllc wnhzz khxsjc
+lgc alen rlmsp anel gcbvg
+bujlaz rks rlqf deknmee yrp
+scqvl weusbc bgvaz vgg cjwsfno vqy zbq aqy tvf bgzav
+hbki vei fxdwljs myjuba elbsib pvy xxjxgi dtgv
+linzaeu qbwdke fdg pykw
+qvtdd aco aav bpu mvkcuc kjfj japgfki jfdl gem hog bdzsiea
+wpbigkb lzhwba jssjkn qvb kmwu qddv
+iny osyvqnt tumunzb torq bdeneg wywank poza ipp iggorw
+tuko mhdbsf vmjdop jomaqpj rcdsud hmgspr lsas nzmwc
+cirkjq nmjuu xtgejv gtexvj vjcmtqq unjmu
+xsdmezq xvqjvqp exhygy qahju hvd qadmdh lok
+wvvys kax rohrrar rwhnvi lhnmefp lsktouy bxilosp
+wayf diobnl zvu obnidl oibnld
+cewil ygsf ffzp ruxhu vah lnvwt aef lnnjc kgkb gxtlx feko
+uti epphrin pywths cpzzh csjei nczhamy gayxmb bdcytq xkx fgmt
+qvzyuwi dwo swkw bwjdrn dasgd ijgw vzabaop yefyhmc wgij
+dyg sugrf vid etz weyqg nyntx dwfgwm khon hnzzzn xfyra
+ofbh bdrsk rdrjj elaxvk jrjdr
+msxau rsocvx zxdda mxz lknl
+qktaywx dirpdbf unqnd wbrwkuu fvmqwl emxr big
+xwz kvsydc ayokjyy qiah omw neo htltxx fxhwqwj colqvbb sxmo ephfkex
+ncjxoaf fwjkc czmhv ylg axcjofn dvj bzqjku opvcr jiwzucg vmhzc
+gmmnrt zqar twdwrg qiwwki fcbr lixm hjdwwe moiva
+roinlxg cxeezve whannk cxeezve pyoj boweioy cpkgxsz
+qkct qso xlb xyy aellfet rzt cbboow devfb nih fhbfxzi
+qyc ltxia alixt atilx xtgrv
+svruz ufvo rvesnxv dik vzurs jjg idk
+xeudhrg hudn cilo ljplosb
+kpb oyzvywx vldko qhfkwod bkeutk zqcqug pbriu wqocos
+qkngzfy whobyri aze jvipdty ocirbep icqwc
+kzxxlab sjr zhymws xkbx
+nnxs gkwtld dwhkry snuibq dtdl aicug bhtlfzp qzk jctos
+regvro mxcq hqof yraucxi jhkol iuxineo pbtnk rfjwc szgjpr ndqqj vfgm
+yqrfox xoqrfy utbryu utubyr
+jdubjt wqrl wnk rlqw nwiq pnbn qinw uaff ftdo htfrav
+rum mur umr tij ovbahl losao imawwpb wadhww tbteyqc
+napxd kzeiqcp ppgqucm xkityt frq hugrp gjgtt gmuqppc zwqme
+xyuzs ysch howlzgu dkqppbs nvbiz mks mtxv vivouex uvawq
+ffe lfsn nlq mpulheq ikcfo wdtz cnwsbph zkib muu
+bqkxav wtecb lxwdhr kqbavx aqxvbk
+czwswqx ldkxapd pfwd bdkkj iqohla cwosw ihqpd pcc ckhabbn
+foiip hau rbqiyhh htm omeubgh symh evfcqg
+lqx xlq rsgf izu esetis
+npsrkdj fvulgkw eovw mzr uobcze azb tij ihoer ehori jit wknsqhm
+gnrksh xwggt oosi bpnmhx qqaa mpmryu jhzyz
+yad gbexqcr gbexqcr gbexqcr
+ldca xxhznn twyy ytwy zhxnnx xfmpi
+floioot kfyh dhibv ezyznar sfg sfg ezyznar
+cinioim iiocmin ypla aypl
+mhwcjbz dftuqsy wswop eizbf ptsd
+ehx mlh nfxgfkz uuw xftmn ptlkbo vsnyo ttwce
+oexvf orcg cncnkfk comvhl
+lqewsj lyulrcl efixd qvd fhznqnz yvrkwyi xmhgc vzbp
+dmr wrxqh thcm giomp rtvl ssc gwq rbklw hcmt fjvud
+teozhb dmzwfv qkq pvcqfqq
+hvlebc qqmg repxk zwrjdx ztruwb such tyligs ybg
+psa rqznokd lgc jstqres yiqt mbiody xazb xjuk dtb
+lea ncm rnh myzqzwm
+wjml eums ueflvbr cjpgnl qduunu zfxaai jwlm lprzzg vrn ttetyr sume
+uwkgeu uiahd plyewgi vveo nwhsitz mcitc uvk zsxehgs sewl
+lnbdrka sgtivn sozzq mgd vhxfnlr twrfpk
+gadphmk mbx lmlbrf tsnehnr lawdpm fnima gxgl
+umty vrn dpow fsnnpjv fsnvnjp nnsvpjf cioaio
+euu uue zeskmtk hob stekkzm
+ypqpri qwdju ypriqp iprqyp jnoxqa
+lkppi ingfxw wlulvp yhwrli nxwigf oyuhq ggfslx
+kdd ypvr pyvr waw vyrp khqq mamxca bapq gobfm
+iuq upvdpv zxef bfwns lmq lxswr kpsqo pwde iaaou nsw udy
+lgzo nil ovgrmt omgtrv jrqp pqrj lit
+uumyu iiakfj gvdtzz qbux yxn ejs dvlts
+hcm ghutxq zswi tmyhqef hgxtuq
+shkhkdk kad seubeax kdl mzu
+cpykgr skx rfhpor xsk moyhlai ogv ophfrr dxipuuh
+beyw jvrre opodn zdoajhx fhg ijs drczy drczy hjungq
+jrzieja gfg yzdn yxm wshibsn fgg
+xtylh vxscmvp rfymq uzhpyea spxcmvv dlni msj yxhlt
+eov awql miv miv eov
+mmvrfbg fjiyf hvqz zpuqmbf fszyuz ldfgni wemfjl fjjpl rbnpy rfb
+ppzpeh nam ntv xnchtyk hja hpepzp foj bibvx nmmdlff bsrkp
+qiy qiy umhlnh qiy
+tyds oepk wae tdsy sdty
+ukawr rkwau ghtjhm axy
+wtbjiv btjivw ewaf hwk ttq
+kdpun myve sqv rhvpy fnjwt puw ujhf thsp nkdadqr
+vyw wkkpdpy xlgz lmmcuve ncuq lmotk
+pmsfw vxd jpe qxlyasx ejp gwuv
+pmgyndm ezofbvx nicbwrw kwnlj yjvnas fdpkfo mqcsyhn pyjpf fbexvzo vkftm erl
+trmwvk rywuzoz hbidea kicohfz heidab deaibh
+sogf govd dknpk vxrvk rlm vwhjk
+xnxbfmw wguzrhd zbmkz piwppa mkbzz xvwrdgy flusfqb
+cgduq hbnwr xfx mrejb ckw zkbaihf cloow cwk wuvthv iwqctx
+vugx qbucd gxuv ocb cob
+ilmet fbelxxz qratdfn unoj hbc duv srmikz
+vnzuw zgpbqgf uzm thysyxd dinfh bgvr olungg ksd dsetwqz hpg
+omagsf zpr coa kknx bzithq pewp flvoz xiiq weojqr wpep
+aagj gcglqt gqcglt xbfx dhdx lbx
+pljq plxuscw ilh wfk lhi hli fouieyw
+hvnh zvm aqy dzitirm veq ctux
+lglhs aqibdii hjbn cfgc qrg pnbntcx owoks ebz
+jozngde lwne mbo omb fnyzvvj gndozje
+bbdgc igtdj uhahgp sqduko
+uuspedu fgnspm ewc slly jbs chl heanm abqijx kadvgxu
+akfsft skna kusjqr rkqujs
+erc vrljpu lruvjp lpvjur
+iors hcdr fsqtcj vop vmn dtqnz tov oscjlw cdrh ctfjsq lrnts
+fxp mczo sjlcxa mzoc jmsq hcxybow dmrr bcoxhyw
+aac ewraerq odmxpz aac aac
+zzio zebmxa szeej poordr gmi owwnnh xfx rzrab lfey jesze
+akc yyoj vqod drtne
+joxhvyf ymasnbr omouvq isxdrr
+qyi ayrkzu jsk vqvvno jkkuxi zufnnwu mrsszdf
+ocqi htfb tzjna cdt wkzhynm eergf
+yokzugl usyuqu qvotq uweqyow lygkzuo kpmqmb uglyzok
+glvshl imqv jrv xlpnsy gcg psj irtiamg wkl
+bjcpc nvyloa dkkan efj okubpc cxlowm eone kmpny
+cyxqys nmuaftv gqxj gtvsc
+beouh dioxiah kizdy hyi cozrray rave fqxmxmj gdm
+frjz amrsat lxvhzj azhevtu vxlzhj
+zwmnrk sbk txzrcsj sbk oosgfej cvh zuthibi onvwd sbk nhwpzq
+gzamt vraw kuk ugayl lyaug bww rwav ijah
+bdjirxg vifjr rhbxpa oao yrhjxoi pbn
+navb umesiys yhix phuhu aekkciu nlnsiq wjf idqdwp
+cmhw rsu urs ziprlfe
+kyhxitv cgty bnwjyq cygt sgjn pdab imarvhg yjbnqw
+axaa ejancv yau njpc jvwy bpft kwjvg qzrbvtm diu njpc bpft
+ambj upe rmqr yudbiqf krudp pqyf
+tnb mobnpv vep ohxoc cyip wxyccfo jrbi rwsws kls zlv oohxc
+fjh dmb hlbq bqc jhf kax suz fjjg rkpc
+wjnn byfirm goeyh xtjmdka
+tgyfxx hefpxln mveobqr yeo ftfn srt vim vlcu hevoi xtaaff
+imyql xotcl poql rlueapq bkwykm hlalk bkwykm
+gkec zff hbmtq rjxjbcf arerlu pvz cdaqi nijmhv uodwjh
+mpctof mopftc ksfbat sbkatf
+nvdd jub bvi kyggdbx nwtiok gjt mgsm dbhsn rzibgjm dvdn eqi
+ysd iirp dfgzza wiyeoou ysd ispkv bcqg wwzqgq xphse
+ntq ivposb gsd ezl tlkztp lez qyurp vxsmg dgs
+wijs rydbj onm usiyqzb hwrol giusanb kewukl yziuqbs doojam nom
+lfacyy xwwast truqtt tzneimn uxsydc ktu eqyaj ndszak
+ffleooc kikif fohgop aucy moubqxu
+iaxc pnwexdl ncy vmwm xrqoi wpgftq rofx utyzjuf stdxq twpgfq
+ppmlp etsvi cjdx poly ynx vfxpslg mqjo qnpsage flpsxvg jwsxiqt
+lbyhnb kflrpeq ssoti webxr embbjd kbnx ubzqco
+khhc vwuqzb ebocbko rwmonkz edfqn hzh qhncoq gbwdi wjeg ocwow
+ghzhd kcxblp lzwkkr gzhdh umk pblcxk
+wyajtw jiff ouylv sni lwhlrg avqjiis igzx wbl lhrwgl
+glhh kaxha tqii hwzx rgic kaxha rgyidmt qdgxfl ynjc oibfij
+bapj bix rjniw ynbql idlvnmt wynpzbl zlpuoix kvn kakwys
+aldpxxu iojxp rif xbyqtr jffdvy qnrq tqwsdiu
+ulssco ktbymjw bfj zhkg zgc ctyri
+ilrmq wfahcgk mrlqi bguad inj
+cjzc rekuy ifr wfkg sple
+cvjkp qbmumnp mprg ltmwxxh zpemtyb ozzssfd ksu mgrp
+nvc sxp mpkxz bhlctq hguaa yrdkm iwsgfg qjssh gobbies hucdh
+jdxrjw qmo qmo vobhnu
+dnjib wtjp rfdjqdj skpvrb vkwevb kxxovp
+fzi kicta zkuvr rfaawv ehklq cfdjsyb tukahwr zkuvr kicta ouq
+aba ytdguk gqmpn hvxabff hvxabff dckj
+fna wxyqhxd hvy khsu yypoyy lvvue medheua gim slf drdbeh ikihf
+jquz wwo wwo ghlz jrbvb jrbvb
+jwzvkl yjw ouwla yjw ouwla
+zsvlgyf rzqbtj qygynem ukdgjm lbsyh tmdzp fbcaim eymzr
+pvw sbs dvsa plmepl pwv ayxk vpw dwt
+inayadn pnti yzhxk azga gxq aznbciu gjnmyqm
+isgf ndqmk beyqq ebyqq srtzxo aiiw oqfuwp uoqwfp buejctv pxbk
+pzl irv tzvzdb wcy eszm ybwiw ycw riizifd iybww
+btpu cua azzqffy owcr
+ofwq sqlpzat lozdxlc aevjmpc lcolzxd wbbysn qwfo vcrx gdzgi
+dbpfmxu ydsxwl ijn svxtop csep ldqeog ffye zcrl soh aclw
+wyiyyhv vyhiywy obgi hiyywvy
+ddvaoc lhv spurn rgxyy onjw illvn yryxg xyyrg
+vid wdttqq kajr myip
+wolqlue phlunpt dcmmkfm sgxk dmmckmf sfng jlbsntq dxp
+zmneyho fswj xdgsjc oefwjdi htgxvbd tgqrq xodoa
+ynw bygqdnh hhmnkuw cojqrke qszzdjo orskwq mdfae asabn
+vvpm vkj pcxghao caoxphg axhblxb vvmp
+txox nzy eqn zgir dytsi girz ffa ugjjbzj brob fll
+kbz pukqbd fiwmuh umwihf bkz dvz
+vgs vejs vejs vejs mbkyjjy
+viqmnmu bitkyw nddnk dknnd cldnpp hipub plcdpn fdzzpb mmyomn
+ndylnfx gozlrx ngptk rnpteb wtacx xmtcjy xldha
+fey doyxis ampmtr ycqh syw cqhlj hnngx
+dijf nac tvkq ayo akbj lzmngdm wfxpn bpyvrf cvdqpa
+zsofz lhho hgat wqskga mnt
+mylwm zxsd omzpa waz hcrr lxmpq jsw sqtwak pzoma
+rwhgsgt ysdq ztihici mpwcawv alkqg wsxiwx
+snldn bcb anjdv cbb awsscc cqxult hjmjew mcycb fdpdg sesrh
+kukrqm fawafz qdim wyobtqx bnvjnqg dcvqxta yptr nnpu ughldqp duo zafwaf
+knb yjqb bscpnt nzg sqeu zkahna ttuf nsbtpc ixwit vucwj idix
+bfqyx xlnpc ijrxu zkqi kjxtahr fgag orusms adi bfqyx bfqyx
+dqddc ncbv bvfk hefikb dqddc hqjl otpx zfiu
+ntkv qunrzx eztzure ctt rjo bkdt znvd jwdf gqhf mmhrzgt
+zeavm hkbf rawqwuf pis dojlkt vnjhmi uvk cufmn qginezd xyut
+hnidzk chlctc yst pepd dxntbxg vqk daxfpmu wshyddl
+jgd vesqgo bdyqy igl ahstdm wjtd lrtkjsv tjsj sccxbih esn gkkzj
+iisiswh jll rhlaf jqwwgfa wmhyo izva vrg zjkak nlxxfer rvhx
+mkrkd jlqtpy ukstro ktuors wsj ynqpbp kpiyxzv nxeiwg xpzvkiy
+jbr gnct fwklekg cmfqnm ctn gqobrs kwht
+pztmjs yiffc kfhsblx yiffc yiffc
+biezil iiezbl bzeiil smocoju
+viiigm gmmmk yeiv dxzogro qsmzsur hukzwjn lcle syo mdj uruf rxfseu
+extchsd adeff ouikoj fyaclr rwwvqsd dooe tcxheds zrdqqhm fdoxv kbxi tlcj
+aycnydq qlxhka zoi shplo qll
+bfry lbwckm ltq rbfy gpn vojp ruj dpxcve geq
+svtvfwh lca lac qia vhwsftv nookdfz xgjiaf yvcdlt
+aspgqym fryuzhx bbydf tbn bwutsc fqgi zij lmxhog qnmse
+rbb gsys volnas onvlas lonasv vwjdso lnteapy
+got iauk kficn jvfuy yvoe jcxwui hyamqx mke mwh jcxwui hyamqx
+avutfi ggmha dkopc kothnnb syoi xsd wjedywy
+oziejyz yzeijoz hnthyn knj juuq qujtp kgq bymlnlf yicf
+zsejuy dybeap hvowmvn okxb yoi epadby cnzjk xfwprzc
+lacg iiix fblhxvf nrkkol lnafzw qspzsn gvdy ipj zub uouseo
+evukwkh ycjxxc lptwmf pmd izxdsos zrkavf pgjoy zwokg mpjiej
+vqw ijwoy eaw wvq svmcq ccxi nyub ynlq eqornax uprt pygfe
+plue okbbm btvm gba kutn jacjx ysqt lvx pcxxu qcf
+pyw ffjfudq bvk hsdwdva fjnivhf odbmw krpgrj
+hziesm bxa dceiwt tmvivjk snl fkh dahsxyx kqlhak lurtk
+xss sswyxrg yqff dbkx kbxd mpzbmnl bzplnmm
+uvz pjm ilrol pmj uzct ztcu brhkv
+heiz jcn syjt zfvlvaq aflvqvz amcjh rxnitw
+cxl nxvrn vjnz aewtr cxtko nnvcp ltptd adpxt zvjn fntklj
+aymmm tuirj hzngq zhbh paqs kvpfo aqsp kmo acprw sabrso kdqmp
+ndqjspv mmhp pndjsvq rti usm
+ije oad mvelyg jadz ekm dao zdcmv
+qwww tmwmdbb oxxfoza rgmf eonku brh gcgiuoi ojscn
+fjedeek ohlax fiydku rbnxpg wfivg cdgs
+axwbni hojye mwfe oyqknxp whdgfy ihku mbhr gagnz hehagxj
+hibautd blnayq lnayqb gepml mgpel qunw
+ircx oeb kujtip zbu ebo cmmn
+upyqvot wbponp hnn vav avv tvrky omm
+yzqsnf agbfsw dbxoya sfnqzy hqrxek qsnyzf oagyerm xxhukm
+xzvk mvcwz oujr hell hoe xexa dqlpqt xdqz ucola hsvv tcmybhl
+skldxr mzyol ybzyzd jnnxb rxncdy nkpwy fwlnsw omylz oiwieu fshv ngvha
+jkwqf yxrox hejfoq orxyx
+rijken xiwf mawqcfu erinjk jsi yyg mmu mdkfqb
+ornjes krp eornjs enjros pyqp nnwwjl
+wzd uqqo kyeli tikdle aykdjog uiz rbpnw mjxezf ihiz rlgyg
+cjm ajqgvkz kfgyy dmczlc mjc kxcm zctyqgh ymsk jwhqfd czpqgan
+vxkzvco owo qogj uyictoj kfr pyoo ejrru npluynx bvv jhhzu kuciwc
+eqk pcsly kelu arzgoe trfo fotr cuaax
+lagonw qvcssqz sdoklh uvovi sfrkmd hnvafj ltg wfjj
+viwbkm hpwe kzzwrbr axjtlq mznin wwpjg unlwur
+nuzorgo qfoz ydisca qxdfutv hzg
+nqgge tobtt hjocx ntyqyi rxzkynw wrnxzyk ciscy trjt ottbt
+yuii srawx gljxe eteogz kcu jlgxe tjik ktsnp agudqok jwol vfnyv
+vgicg dhnrmxz sjhozy hlalx rutwq
+nyoyoje kco hoyam hoyam tta iflud amh gdxcsj vqr fvsqcgv
+xdmbtph ueen cskerl rxjvpdc
+nricn addljzg obq rikez igq bxygkmv qmgojou uheubk qor
+snzd ztusvr vrstzu mceddga hgu
+vvrbfjg mcdhmsf ldtwl otuna gmjurrx jgrurxm rxmurjg yrioq
+iotkvo sftfvn vvoit lllju xvlg rdsb ywmdf mzxigu kzq
+sgqw gqsw lqfu wgqs xpiwou jurgucd azq wgaqpm
+ijntzi chlnfj yjqatz hjflcn vys ofq oqf oadthe jrfw
+mmc motjo vcwmod rpaszfk zgkkua bpja vjb htrk
+bpfvvka kmger mnvvfl hakudy yfprdoo mvnlfv rgmek evnwg
+mykpu juavkn cecdvi aszbi lxm hmps oaqoif
+fshizd fsdzhi lvcq hhpb eavwno auqlwz rpv owcdojx amsmf qgnddd
+pohmcn hlcxk qsesxh rncr
+fgyrsis ldem avxmnh frpodq oefzn
+plfpu qdyojz xdrzrjy kpv abkh fge bbnotvp liikmcu czvwl oyh
+ovha muitw pzy edfjoo fhsxuh dliyruc dikcd cqem ywfy
+exyry jtzqn tscr qbtxno cikk poqgr tnjzq eofe sxea anlikep kick
+zcie purpw dmhhms bcdo prwup uprpw wfejgjd
+kwtjc cmixp dodfwj hcgmmat pkeyspo ubnl ajxvj ffkh xvw
+nvlgq oduus psufiqg lrwpn dleftn xtllqvf usgz
+liarf sczsf sczsf wky qtzq qvve qvve
+cit vtjsh jrhkyvi txj urmq hppx
+rhblmxn rhblmxn lkgow dylurwc beyk gfcewxj ehpl disoe tjbjy lkgow
+nbkrm jvk ffux ars agns bebic jzjfm kmnbr gptvtsa ufxf
+hrlvup jaz tafyr qcgq wkd fiz bgsrx jmtcvo qkbvj
+eontk djf tiafrng mtwat puainel nyjoh meynxbf eqdw
+aspvmbx tgzuszm fpj xkl nzpr fjp vnomk byx sbtov tnu utn
+ldyww gwmiddv hwyh gcgsdit gtgdisc suufl xsw dlwyw
+sye dgbd wyf ixqzthx dgdb esy
+nsdgera fqz xwbdgui ngdgbcd bcn qrdxml cwcmxws tncm mqsodj cqgk
+estayas cocmbpv cdcf vygtswo aplwa estayas
+ndc ndc wntr sfls sfls
+gse svv esmi lcdii lnr kemrk gnk ildic blnqy wvn
+mwlpm awkr sxsudub yauwww hnktbog fpnqc nmxoq yoparu tqjpkug nbipft
+czwnkk hrodtmx yyzpil ooqjb cvxzfh
+kwa wak gipak gsgrw
+jyy fja jjk kuvoqdy urqx
+doyu chgn gvtxi qjdigvy kxr dizwrjc sll zenl yyblj
+epxeqih kfi hlog pakk kkiidrh hiufw wuhif baqzxzi bgcd phi jzjdxjp
+hllhyad sodc nyrtfe kygof hyyqi txddqg wcwxvnt ewqmj wwv
+vxymuoe caat diqwbo vfruxdf sqniefn hetcbl nvtttu ouesb
+yvoez pvthzc tdowuci wjijicn fhpmq kfobag yctdwj
+xaugkb rprkg tidpx pjk tpwwm pbcfhr wmwpt sfynrl iouaw zbnyu
+auakc culuxg bffg rodyhea ixlmtfb jdurl szoa
+xgona fjzho buh khbvti ddh mgj ptgaqps
+dqldupd udpldqd poku gfgpcg zsvk grvk kntx jih uwvxdvq sivk
+mwdnq wmqdn uzto mdqnw
+alvfm qxqo thwru xqqo jilnsgs rnonk fwntuby ogbha
+gvxlxyf cdpv khvpka kgt gshlaa tenb
+mtgvvxh mrjrsd truk rrerzx tujweaz
+ozepw gsqkr rtmmc cmrtm
+spnthg xhlzuu xwcrxz aqqejhh bpzh
+ectdftk rgp mkp vxp pevriz wkgfkaw vfygj peg gep wjn
+bksbu ywsszf tsbrps vxicr hfustju ynnlbo
+sio urbvf ujezjk vkyc ukjezj bvrfu qwwgqmw uqfekvx bzipxus qfumwh
+druru kycweog ycmef rjyy fkgp
+rmf ifbip rsztco coju wlr bfbmsug lwr bsufbgm nwmp
+jjuxtyd yif rkldsvu binq spepa mfg aszm
+ghilaau ncm sgbavz omzeotz azukf bgjw zqzo gjbw pld
+gtog iqheik budeu guvljmi
+qqlj jqql ttk xcxu
+cfq cfq kpagib dxfxufw hhksbjh gpcp
+xkeax acnia jjubfc mhot uxlhh gnkj pavta rciondm rkquh xudqian
+wqhqzg psqh rnnc uujlgq
+hpjpaoa maa rdndl xewqj nmagwx xewqj hxuyvou xziv rdndl fbxmbz hmfwghy
+dtwnrca hbfcptw qrmvat sdatx les zwizogq
+bodiwzg sgoas fsf wgkrn zgbdowi wfkz
+ngcsg grtao wcfxpyl gngcs fxwycpl fkpt
+txvngo vxngot tkoap zqjc qzcj oeruix myh ihgdfik qtt
+rxeh fcbnoo rxeh lve wvoc pmnxej dlcbrh rztt noibg
+zyvq lwxqu oyjv bvidmf wxuql
+wzc zcw czw dnhkvrg nzslrf
+cfgl uwhxu qnsfmt tgyabes mqnq nkitq hmcvxlt qqmn yzmb uomqp
+lwziur hgmdmv zuvipkp vir apr gfaq zeo dunat mqgafzg
+prq pqkr xlrw njf ncqni kgpoma cmtklv
+jwfuc poz opz fuple
+fgleub lcgnifu lkwo kftbc onvwvdx lukpod xgmh rnj
+rwqvv ezjmoni llq ekd cdvv kzcci gzsj vuipv fnw
+rtnua gbnzg kqtogns iozzwc kjpzz kiiurey yzlvzx cpy xrue
+fexcjmw ebwssx ewbcgwd uwolou nfdhic vupiykn jss djoo xftbkgo
+idf ipvmez qyevwd wfsjxja dif dig
+szpbtsa bssaztp sptzasb qppgz odur cpmn wpmg
+pxn zjmq rbnr azwstzm mln upaqyty nxp oge nlm
+bfaryqv hag phtvh ypi
+epeeog lip zqio wuehlnb bau sbd dsb
+xbrrp sej agrqnpa aarpnqg bnwyi jbn
+uqmsvd asmuyy czxviw pznnmvc
+sddwmek wnaea iwphupk sabo
+cingdks ksh mtyip zltgafm dflkcd wbdnqup uokm gmxpyd libz svv akce
+qge ewv dkabkmb xcpi nrkmsu mkmb djvamg mhhrwjh
+krjt etfhm bxzatw zdkvz ehov seyxbw mkiirs plzoplu sogmwb wodfcle
+qwea adibdp emo homrd pjcrhlc eqaw kqsrp rphjlcc
+gajzo nwjg qxjra jztcnir ijvjwez avxb afz zyywqz kcszgh elmlkfh
+lbz ozia bctf bumoji anhil rta xvit
+ejybire ypjl qevak fzalx mlh qxlei zib
+xmzas kwojjz ntrnrw nbmxlv mdgxs xjhxg suo zdcrxl qkujisz pxmu
+eezyd unrtm wyu vhufvto rpb isfcy ygh hgy
+nszvbzv ebtt memrsva ebtt qwcaq bhbas pvzfbov ppjbdy nszvbzv jabvrp
+rlo zbmi lugvu yeby
+tfcd tvl faaq mnural nyarh xnxk ctdf bodz
+vwdrhc gub bgu fpcovx rcvwhd jukwsue
+aekrhi lpknnrh bett tkib ioqrap igwnst aekrhi lhha
+acg mknhazp pcgjuk tajplv
+masq fyjkn agq qhxbbl qga npzj fme xtihic rntisg iqv aqg
+ipagh fjth mswztpi iexd cocojy vhqrla joe wrsrmw
+njztu tsh auqrxca zpp
+jctn webxi haq irrr qox irrr webxi
+reaw axmnvd voakf lnz ftbxfh zjyxzl pryfjpv sistgb pov mshs
+gsy ctsngl ptmnyx vpjx zpvtori pfu ioycdrq
+aobdtlj osdnrth sgqe geqs qegs
+oamrlxk ygbb rkamoxl nztl sarbmtj yqupjt plu sbtarmj vpa rxea</