4835e36925af

A few more days
[view raw] [browse files]
author Steve Losh <steve@stevelosh.com>
date Tue, 03 Dec 2019 20:15:07 -0500
parents 908a77e311fa
children 946ad8d99285
branches/tags (none)
files .lispwords data/2017/10.txt data/2017/11.txt data/2017/12.txt data/2017/13.txt data/2019/02.txt data/2019/03.txt package.lisp src/2017/day-05.lisp src/2017/day-10.lisp src/2017/day-11.lisp src/2017/day-12.lisp src/2017/day-13.lisp src/2018/day-10.lisp src/2018/day-11.lisp src/2019/day-02.lisp src/2019/day-03.lisp src/utils.lisp

Changes

--- a/.lispwords	Sun Dec 01 16:01:05 2019 -0500
+++ b/.lispwords	Tue Dec 03 20:15:07 2019 -0500
@@ -1,2 +1,2 @@
-(1 let-complex)
+(1 let-complex let-result)
 (3 define-problem)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/data/2017/10.txt	Tue Dec 03 20:15:07 2019 -0500
@@ -0,0 +1,1 @@
+129,154,49,198,200,133,97,254,41,6,2,1,255,0,191,108
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/data/2017/11.txt	Tue Dec 03 20:15:07 2019 -0500
@@ -0,0 +1,1 @@
+s,ne,ne,ne,se,se,se,s,s,s,s,s,s,s,sw,s,s,sw,sw,sw,sw,sw,sw,sw,n,s,ne,nw,nw,nw,nw,nw,se,nw,nw,nw,nw,ne,n,n,nw,nw,n,nw,n,n,nw,n,ne,nw,nw,n,n,n,n,n,s,n,n,n,n,n,n,n,ne,nw,n,nw,n,n,nw,n,n,n,n,se,n,nw,n,n,ne,s,nw,ne,ne,ne,n,ne,ne,ne,nw,sw,n,se,ne,n,ne,ne,nw,ne,ne,sw,se,ne,ne,ne,nw,ne,sw,ne,se,ne,ne,nw,se,ne,ne,ne,ne,ne,se,ne,ne,s,se,ne,s,ne,sw,ne,se,se,nw,se,ne,ne,se,ne,se,ne,se,se,se,se,se,se,se,s,ne,n,s,se,se,se,se,ne,se,se,se,nw,s,s,s,s,se,se,se,se,s,nw,s,se,s,s,s,s,s,sw,s,s,se,se,se,se,se,se,ne,ne,ne,s,ne,se,se,ne,s,ne,s,se,n,s,n,s,n,s,s,se,s,s,sw,s,s,sw,s,s,s,s,s,s,nw,s,s,s,ne,ne,s,n,ne,s,sw,s,sw,s,sw,s,s,s,sw,s,s,s,sw,s,s,sw,sw,s,s,sw,s,s,nw,sw,sw,sw,sw,ne,nw,s,s,nw,s,sw,s,sw,s,sw,sw,sw,sw,sw,s,s,sw,sw,n,s,s,sw,sw,s,s,sw,s,sw,sw,sw,s,s,sw,sw,s,sw,sw,sw,n,sw,ne,nw,s,sw,sw,s,sw,sw,nw,sw,sw,se,sw,ne,sw,sw,sw,sw,sw,sw,ne,n,s,sw,sw,sw,sw,nw,sw,sw,n,sw,sw,sw,sw,sw,sw,nw,sw,sw,sw,sw,sw,sw,sw,ne,ne,sw,s,sw,nw,nw,sw,nw,sw,ne,sw,sw,nw,sw,ne,nw,se,sw,sw,ne,sw,nw,sw,n,sw,nw,sw,nw,nw,sw,sw,sw,nw,ne,sw,nw,nw,sw,sw,sw,sw,n,sw,nw,sw,nw,sw,sw,sw,sw,n,nw,nw,nw,nw,nw,sw,sw,nw,se,se,nw,sw,nw,nw,nw,sw,nw,sw,ne,nw,nw,nw,nw,s,nw,sw,s,sw,se,sw,nw,sw,nw,sw,nw,nw,s,s,n,nw,sw,sw,nw,nw,sw,sw,nw,ne,sw,nw,se,nw,se,s,nw,nw,nw,n,nw,nw,sw,nw,ne,ne,nw,nw,nw,sw,nw,nw,se,se,nw,nw,nw,nw,sw,nw,nw,nw,nw,s,nw,nw,nw,nw,n,s,nw,nw,nw,n,nw,nw,nw,n,n,ne,nw,n,nw,nw,nw,nw,n,nw,nw,nw,nw,nw,ne,n,sw,sw,nw,nw,sw,se,nw,n,nw,sw,nw,s,nw,n,ne,nw,nw,nw,n,nw,s,n,nw,n,n,nw,n,se,n,nw,nw,n,nw,nw,ne,n,n,se,se,nw,nw,nw,sw,n,nw,sw,sw,nw,nw,s,n,nw,n,s,n,n,n,nw,nw,n,nw,sw,sw,n,sw,n,n,n,n,n,nw,nw,n,ne,n,ne,sw,n,n,n,nw,n,s,n,n,s,n,n,nw,nw,n,n,n,nw,nw,nw,n,nw,n,n,nw,se,n,nw,n,n,sw,n,n,n,n,nw,n,nw,n,n,se,n,n,n,n,n,n,nw,s,nw,n,n,nw,n,n,n,sw,n,se,nw,n,nw,n,n,n,n,n,n,n,sw,n,nw,n,n,n,n,n,n,se,n,se,n,n,n,n,n,n,nw,n,n,ne,n,n,n,n,sw,n,se,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,ne,n,n,n,n,n,n,n,n,n,ne,n,s,ne,nw,s,n,nw,n,n,n,sw,n,n,n,sw,se,ne,n,n,n,s,nw,n,se,n,n,s,sw,n,n,se,n,n,sw,n,n,n,ne,ne,ne,ne,n,n,se,sw,n,n,n,se,n,se,sw,nw,ne,n,n,n,n,nw,n,n,n,n,n,n,ne,n,nw,n,s,n,nw,nw,ne,ne,n,n,n,n,n,n,n,ne,n,n,n,n,n,ne,ne,n,ne,ne,n,n,n,ne,n,ne,n,n,n,n,ne,ne,n,s,ne,ne,n,n,s,n,ne,ne,ne,n,ne,nw,n,ne,n,ne,n,ne,ne,se,ne,s,ne,ne,n,n,ne,s,n,ne,s,n,ne,ne,ne,n,ne,s,se,se,ne,s,sw,ne,se,ne,ne,ne,n,ne,n,ne,n,nw,sw,ne,n,n,ne,ne,ne,ne,ne,se,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,s,ne,ne,ne,ne,s,ne,ne,sw,ne,ne,n,n,ne,ne,ne,ne,ne,n,ne,n,ne,ne,ne,ne,se,ne,ne,n,ne,ne,ne,n,sw,ne,ne,n,ne,ne,ne,ne,n,ne,ne,ne,ne,ne,nw,ne,s,ne,ne,ne,ne,ne,ne,ne,sw,n,sw,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,n,ne,ne,ne,ne,n,ne,ne,ne,ne,ne,ne,ne,ne,se,sw,ne,ne,ne,ne,se,ne,ne,s,ne,s,ne,se,nw,s,n,ne,ne,ne,ne,sw,ne,ne,se,ne,ne,ne,ne,ne,ne,se,ne,se,ne,ne,sw,nw,se,ne,ne,ne,ne,s,ne,n,ne,ne,nw,sw,ne,n,nw,ne,ne,se,ne,ne,ne,ne,se,ne,ne,sw,ne,s,s,se,n,ne,ne,ne,n,s,nw,ne,se,se,s,ne,se,sw,ne,ne,se,ne,ne,ne,ne,ne,ne,se,se,ne,ne,ne,se,ne,nw,ne,s,se,ne,sw,ne,ne,ne,ne,ne,ne,ne,nw,se,ne,n,s,ne,ne,ne,ne,ne,ne,ne,ne,se,se,ne,nw,ne,ne,sw,sw,ne,ne,sw,ne,se,ne,ne,ne,se,se,ne,ne,ne,ne,se,se,ne,ne,ne,ne,ne,se,ne,ne,s,se,ne,ne,se,ne,ne,ne,se,s,ne,se,se,ne,ne,ne,ne,sw,se,se,s,se,se,ne,ne,se,s,se,se,ne,ne,se,s,ne,se,ne,nw,se,ne,ne,se,se,se,sw,se,ne,se,se,se,ne,ne,se,se,ne,ne,ne,n,ne,ne,ne,nw,se,s,se,s,n,ne,ne,nw,ne,se,ne,ne,s,ne,ne,se,nw,ne,se,se,se,se,se,se,se,ne,se,se,ne,ne,se,se,se,se,n,ne,se,se,se,s,se,ne,ne,sw,se,ne,s,se,n,se,se,ne,ne,se,se,se,n,sw,ne,ne,se,ne,se,se,se,se,se,ne,sw,sw,se,se,ne,ne,se,se,se,se,se,nw,se,se,se,se,sw,se,s,se,sw,se,se,se,se,n,se,ne,s,se,ne,se,se,se,se,se,ne,ne,se,ne,ne,n,se,se,sw,se,se,nw,se,ne,n,se,n,se,sw,se,sw,se,se,se,nw,se,se,se,se,s,nw,sw,nw,se,se,se,ne,se,n,ne,se,se,se,se,se,se,se,se,se,se,nw,se,ne,se,se,se,nw,se,se,se,se,se,se,s,se,se,se,s,se,sw,nw,se,se,sw,se,se,se,se,se,n,se,se,se,se,ne,sw,se,se,sw,se,nw,n,ne,se,s,s,n,s,s,nw,se,ne,se,se,s,se,se,se,se,sw,se,se,se,se,s,se,se,se,se,se,se,se,se,se,se,se,se,s,se,n,n,se,se,se,se,ne,se,se,se,s,se,se,se,se,se,se,se,se,se,se,se,se,s,nw,se,se,s,se,s,se,s,se,se,se,s,se,se,se,se,se,se,n,ne,se,n,s,se,se,sw,nw,nw,se,se,se,se,se,s,se,ne,se,s,se,se,n,s,se,s,se,s,se,s,se,se,s,s,s,se,se,se,s,se,se,s,se,nw,ne,s,s,se,se,se,ne,se,se,s,se,se,se,se,se,nw,se,se,se,ne,se,s,se,se,se,se,se,se,s,s,se,s,nw,s,n,se,s,se,se,se,se,nw,s,se,s,s,se,se,se,ne,s,s,se,s,s,s,se,se,sw,s,se,se,sw,nw,s,s,se,se,se,se,se,ne,s,s,se,s,s,se,s,sw,sw,s,se,s,se,se,s,se,s,n,s,s,nw,nw,s,s,se,s,s,se,se,se,s,s,ne,se,se,n,ne,se,s,nw,s,se,s,s,n,se,se,ne,ne,se,s,s,se,se,se,se,se,se,se,s,se,s,se,s,se,se,s,sw,s,se,sw,se,s,s,n,s,s,s,s,nw,n,s,s,s,se,s,s,s,s,s,se,nw,s,se,s,s,nw,s,se,s,s,s,se,se,s,s,se,se,se,s,s,se,s,s,sw,se,se,se,s,se,se,n,s,s,s,se,s,s,nw,s,ne,nw,se,s,s,se,nw,se,ne,se,se,se,s,s,se,se,nw,se,n,se,s,sw,se,sw,s,se,s,s,se,s,se,s,s,se,s,s,n,s,se,se,s,s,s,s,s,s,sw,ne,s,s,s,s,se,s,se,s,se,s,se,s,s,se,se,s,s,s,s,s,se,nw,se,se,s,se,ne,s,s,nw,nw,s,s,s,se,ne,s,ne,s,s,s,sw,s,se,nw,s,nw,s,n,s,s,se,s,s,ne,se,s,s,s,se,s,s,se,s,nw,s,s,s,se,ne,n,se,s,s,s,n,s,nw,s,ne,s,s,nw,s,s,n,s,s,se,s,se,se,s,s,s,s,s,s,s,se,ne,s,ne,s,s,sw,s,s,s,s,n,s,s,s,s,sw,se,s,nw,ne,ne,s,s,se,s,s,s,s,s,ne,s,s,nw,sw,s,s,s,n,s,ne,se,s,se,s,s,s,s,s,sw,se,nw,s,s,s,s,s,s,s,s,ne,n,s,ne,s,s,s,s,nw,s,se,s,s,s,s,s,se,s,s,s,s,s,s,s,n,s,sw,s,s,s,s,s,se,s,s,sw,se,s,s,s,s,s,s,sw,s,s,s,s,s,s,s,s,s,ne,nw,nw,s,n,s,s,s,s,s,s,s,s,sw,s,s,n,s,s,nw,s,s,s,nw,s,sw,s,nw,s,s,s,s,sw,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,sw,s,sw,s,s,s,nw,sw,s,s,nw,s,s,se,nw,s,s,s,se,s,se,nw,ne,s,s,s,s,s,s,nw,s,s,s,sw,s,sw,s,s,s,s,s,s,sw,ne,sw,s,n,s,s,s,s,s,s,s,s,s,s,sw,s,s,s,s,s,s,s,sw,s,s,ne,s,s,s,s,s,sw,sw,s,s,s,s,s,s,n,sw,n,ne,s,s,s,nw,nw,s,se,ne,s,se,s,s,s,sw,n,s,s,s,nw,sw,s,sw,ne,s,s,s,s,sw,ne,s,s,s,s,s,sw,s,s,sw,s,s,s,s,s,s,s,sw,s,n,s,s,s,sw,s,s,n,sw,s,n,ne,nw,sw,s,s,sw,s,s,sw,s,n,s,s,sw,s,s,sw,s,se,s,sw,s,s,s,sw,s,s,s,s,sw,s,n,sw,s,s,s,sw,s,sw,s,sw,s,sw,s,s,sw,s,s,s,s,n,s,s,s,s,s,s,sw,s,s,sw,s,sw,s,s,s,s,n,s,sw,s,s,n,nw,s,s,nw,sw,s,sw,sw,s,sw,sw,s,s,sw,sw,nw,sw,nw,s,sw,se,sw,s,s,sw,sw,s,nw,s,s,se,s,s,s,sw,sw,sw,n,s,sw,s,sw,s,se,s,s,s,sw,sw,s,sw,nw,sw,s,s,sw,sw,s,sw,s,s,s,sw,sw,sw,sw,sw,s,s,ne,ne,s,s,sw,se,se,sw,se,nw,sw,sw,s,sw,ne,sw,sw,s,s,sw,nw,sw,s,sw,s,s,sw,s,sw,s,nw,se,s,s,s,sw,s,se,se,ne,sw,sw,sw,s,nw,s,s,n,sw,sw,s,sw,sw,s,sw,sw,s,s,sw,s,s,ne,s,sw,s,sw,sw,sw,n,s,sw,s,s,sw,sw,nw,n,sw,s,nw,s,s,sw,sw,sw,sw,sw,ne,sw,sw,sw,sw,s,s,sw,sw,sw,nw,s,s,s,sw,sw,se,sw,sw,s,s,sw,sw,ne,se,sw,se,sw,s,nw,n,ne,s,sw,se,s,sw,s,sw,s,sw,s,sw,ne,s,sw,n,sw,s,s,nw,sw,se,s,sw,sw,sw,sw,sw,sw,sw,ne,s,s,se,sw,sw,sw,sw,s,se,sw,sw,s,s,s,sw,nw,n,sw,sw,s,ne,s,sw,se,sw,sw,se,sw,sw,sw,s,s,s,s,sw,s,s,sw,se,s,sw,s,nw,s,sw,sw,s,sw,sw,sw,s,se,sw,sw,sw,sw,ne,sw,sw,sw,se,s,n,sw,se,s,sw,n,sw,sw,se,sw,s,s,sw,sw,s,sw,ne,nw,sw,s,sw,sw,s,s,sw,sw,s,sw,sw,sw,sw,sw,sw,s,sw,sw,se,sw,sw,s,sw,sw,se,sw,sw,s,ne,s,sw,ne,s,s,sw,sw,sw,s,sw,sw,sw,sw,sw,sw,sw,s,sw,ne,s,sw,sw,sw,sw,sw,sw,sw,s,n,ne,s,sw,sw,sw,sw,sw,sw,sw,s,nw,sw,sw,n,sw,sw,sw,s,sw,sw,sw,sw,sw,se,ne,sw,s,sw,ne,s,sw,sw,ne,sw,sw,s,n,sw,nw,sw,sw,ne,sw,sw,sw,sw,sw,s,sw,n,sw,sw,s,sw,n,s,s,s,sw,sw,s,sw,se,sw,ne,n,sw,sw,n,sw,s,sw,sw,sw,sw,sw,sw,s,sw,sw,s,s,sw,sw,sw,se,sw,nw,sw,sw,sw,sw,sw,se,sw,sw,sw,sw,sw,s,ne,sw,sw,sw,se,ne,sw,sw,s,sw,sw,ne,nw,s,se,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,se,sw,sw,ne,se,sw,sw,se,sw,ne,sw,se,sw,sw,sw,sw,sw,sw,sw,se,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,se,sw,sw,sw,sw,sw,sw,sw,sw,sw,se,sw,sw,sw,ne,sw,sw,sw,nw,sw,n,sw,nw,s,n,n,se,sw,se,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,s,nw,sw,sw,se,sw,sw,sw,ne,sw,sw,sw,sw,sw,nw,nw,sw,sw,sw,sw,sw,sw,sw,n,sw,sw,sw,sw,sw,sw,nw,sw,ne,sw,ne,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,n,sw,nw,n,sw,sw,sw,sw,nw,ne,sw,sw,sw,sw,sw,n,sw,sw,sw,nw,nw,sw,sw,sw,ne,sw,sw,sw,nw,sw,sw,sw,ne,sw,ne,nw,sw,nw,s,sw,sw,sw,ne,nw,sw,s,nw,sw,sw,sw,sw,sw,sw,sw,sw,sw,ne,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,ne,n,sw,sw,sw,ne,sw,nw,se,nw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,s,sw,sw,se,sw,sw,sw,nw,sw,sw,s,nw,ne,se,sw,sw,s,sw,sw,sw,se,sw,sw,nw,sw,sw,sw,sw,sw,sw,nw,sw,sw,n,sw,sw,sw,sw,nw,sw,se,sw,sw,sw,s,ne,n,sw,sw,sw,nw,sw,ne,sw,sw,sw,sw,sw,sw,sw,nw,sw,nw,sw,nw,s,sw,sw,sw,nw,nw,nw,sw,nw,sw,se,se,sw,sw,sw,sw,sw,sw,ne,nw,sw,sw,nw,nw,sw,sw,ne,sw,se,sw,sw,sw,sw,sw,nw,nw,s,nw,nw,sw,sw,sw,nw,sw,n,ne,s,sw,sw,sw,sw,sw,sw,sw,sw,sw,n,n,sw,sw,sw,sw,sw,n,nw,ne,nw,nw,ne,nw,nw,sw,sw,sw,sw,ne,nw,sw,sw,s,nw,nw,sw,nw,sw,se,sw,sw,nw,ne,sw,nw,nw,sw,sw,sw,sw,s,s,sw,sw,sw,sw,n,sw,nw,sw,sw,nw,sw,sw,ne,sw,sw,sw,ne,n,sw,sw,sw,n,nw,nw,sw,nw,nw,sw,sw,sw,sw,nw,sw,sw,sw,nw,sw,sw,sw,nw,nw,nw,nw,ne,s,sw,sw,sw,sw,nw,sw,sw,sw,sw,nw,nw,sw,sw,nw,nw,nw,sw,n,sw,nw,se,nw,s,sw,nw,sw,sw,sw,sw,nw,sw,n,nw,nw,nw,se,se,s,nw,sw,ne,sw,sw,nw,ne,s,sw,sw,nw,nw,nw,nw,nw,nw,nw,nw,sw,sw,nw,sw,nw,nw,sw,sw,sw,sw,nw,n,nw,sw,nw,sw,nw,ne,sw,se,nw,sw,n,sw,nw,sw,nw,sw,se,nw,nw,nw,sw,ne,nw,sw,s,nw,s,s,nw,nw,ne,ne,nw,sw,nw,sw,nw,sw,n,se,sw,sw,nw,sw,sw,s,nw,ne,ne,nw,sw,nw,nw,s,ne,nw,sw,sw,sw,sw,sw,sw,nw,ne,nw,nw,sw,nw,sw,se,sw,ne,sw,s,ne,sw,sw,nw,sw,nw,ne,sw,nw,nw,sw,nw,nw,se,se,s,nw,sw,sw,nw,nw,nw,nw,nw,nw,sw,sw,sw,ne,s,sw,sw,ne,nw,n,nw,se,nw,sw,se,nw,nw,sw,s,sw,s,sw,sw,sw,sw,sw,se,s,nw,sw,sw,sw,sw,nw,nw,sw,nw,sw,n,sw,nw,n,se,sw,sw,sw,nw,se,sw,s,nw,nw,nw,sw,sw,nw,s,n,nw,sw,sw,nw,sw,nw,nw,nw,se,nw,nw,s,nw,se,nw,nw,sw,sw,nw,sw,sw,nw,nw,nw,sw,nw,sw,s,sw,sw,sw,nw,nw,nw,nw,sw,nw,nw,sw,s,nw,nw,nw,sw,sw,nw,sw,nw,se,ne,nw,nw,sw,nw,sw,nw,sw,nw,nw,sw,sw,nw,sw,nw,sw,nw,sw,sw,nw,sw,nw,sw,sw,sw,nw,nw,nw,n,ne,nw,nw,sw,nw,sw,nw,s,nw,nw,sw,sw,sw,sw,sw,nw,sw,n,nw,sw,nw,sw,sw,sw,nw,sw,nw,nw,sw,sw,sw,sw,nw,nw,nw,nw,sw,sw,sw,nw,sw,sw,nw,n,sw,n,nw,sw,nw,nw,nw,s,nw,sw,nw,nw,nw,nw,nw,sw,sw,nw,nw,n,n,sw,nw,nw,sw,sw,s,nw,nw,nw,nw,nw,sw,nw,sw,nw,sw,nw,sw,nw,nw,nw,n,nw,sw,nw,nw,s,nw,nw,nw,sw,sw,nw,sw,nw,nw,ne,sw,se,nw,nw,sw,nw,nw,n,sw,sw,sw,nw,nw,nw,nw,nw,nw,n,sw,ne,nw,nw,nw,sw,sw,sw,sw,ne,nw,nw,sw,nw,nw,sw,nw,nw,nw,sw,nw,nw,sw,nw,nw,se,s,s,nw,nw,nw,nw,nw,sw,nw,nw,sw,sw,nw,nw,se,nw,nw,nw,nw,sw,nw,nw,nw,sw,s,sw,se,nw,sw,nw,nw,nw,s,nw,nw,nw,sw,sw,nw,sw,sw,n,nw,nw,sw,nw,nw,sw,nw,s,se,nw,nw,nw,nw,se,ne,nw,se,nw,ne,nw,nw,sw,nw,nw,nw,nw,nw,nw,sw,ne,nw,nw,se,nw,sw,nw,nw,se,ne,nw,nw,nw,nw,s,sw,nw,sw,sw,nw,nw,ne,nw,nw,nw,nw,nw,se,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,s,ne,nw,sw,nw,sw,nw,nw,n,sw,nw,nw,nw,ne,sw,nw,nw,nw,nw,sw,nw,nw,nw,se,nw,nw,s,nw,sw,se,sw,nw,nw,nw,s,sw,s,nw,n,se,sw,se,nw,nw,nw,sw,sw,sw,nw,se,nw,nw,nw,nw,nw,nw,sw,ne,nw,nw,nw,nw,nw,sw,nw,sw,s,nw,nw,nw,ne,nw,sw,se,se,nw,sw,sw,nw,n,s,s,nw,nw,nw,nw,nw,nw,nw,nw,nw,s,nw,nw,ne,n,se,ne,nw,nw,nw,sw,sw,sw,nw,nw,nw,nw,se,nw,se,nw,nw,ne,n,nw,nw,nw,nw,nw,nw,nw,nw,se,nw,ne,nw,nw,sw,nw,nw,nw,nw,nw,sw,se,nw,nw,nw,s,n,nw,nw,nw,s,s,nw,sw,s,nw,nw,se,nw,nw,nw,n,nw,n,nw,nw,nw,nw,nw,nw,ne,sw,nw,nw,nw,s,nw,nw,nw,nw,se,nw,nw,nw,nw,nw,nw,nw,ne,nw,nw,nw,nw,ne,sw,nw,nw,sw,nw,nw,nw,nw,n,nw,nw,se,nw,nw,sw,s,nw,se,nw,n,nw,nw,ne,nw,ne,nw,sw,s,nw,nw,nw,nw,nw,ne,nw,s,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,sw,n,ne,se,nw,nw,nw,nw,nw,nw,nw,nw,nw,ne,nw,n,nw,nw,nw,n,nw,nw,s,ne,nw,nw,nw,n,nw,nw,ne,nw,nw,nw,nw,nw,nw,nw,s,nw,se,nw,nw,nw,nw,se,se,nw,nw,nw,nw,nw,nw,s,nw,nw,nw,nw,ne,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,sw,sw,nw,se,nw,nw,nw,sw,nw,nw,n,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,sw,s,nw,n,nw,sw,s,s,n,nw,n,nw,nw,nw,nw,nw,nw,se,nw,nw,nw,nw,nw,nw,nw,nw,nw,n,ne,sw,nw,s,nw,ne,nw,nw,nw,nw,nw,sw,nw,nw,nw,ne,nw,nw,sw,sw,s,nw,nw,ne,nw,s,nw,nw,n,nw,nw,n,n,nw,nw,nw,nw,nw,nw,se,nw,n,nw,se,nw,s,nw,nw,sw,n,nw,nw,sw,nw,nw,n,nw,ne,nw,se,nw,n,se,nw,nw,nw,nw,nw,nw,n,nw,nw,nw,nw,n,sw,nw,nw,nw,nw,ne,nw,nw,nw,n,n,nw,nw,nw,nw,nw,sw,sw,n,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,se,nw,nw,nw,nw,nw,ne,nw,sw,n,s,sw,s,nw,se,nw,nw,s,sw,sw,se,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,s,ne,se,nw,nw,s,nw,nw,n,nw,nw,nw,nw,nw,n,n,nw,n,nw,nw,nw,se,nw,nw,nw,nw,n,nw,sw,nw,n,nw,nw,nw,se,nw,s,nw,s,nw,nw,n,nw,n,n,nw,se,n,nw,sw,nw,nw,nw,nw,nw,nw,nw,nw,nw,s,n,nw,nw,ne,nw,n,nw,n,n,nw,nw,n,nw,ne,ne,se,se,nw,n,nw,nw,nw,n,nw,se,n,s,nw,nw,se,n,nw,nw,sw,s,nw,nw,ne,sw,nw,n,nw,nw,n,nw,ne,ne,sw,n,ne,s,nw,nw,se,nw,nw,nw,nw,n,nw,sw,n,ne,nw,se,nw,nw,nw,se,sw,n,nw,nw,nw,nw,nw,s,n,nw,s,n,nw,nw,nw,ne,se,nw,nw,nw,nw,s,n,nw,nw,n,nw,nw,nw,n,nw,nw,nw,nw,nw,s,nw,nw,s,nw,nw,nw,nw,nw,sw,nw,nw,ne,nw,ne,nw,nw,sw,n,nw,nw,ne,nw,s,nw,n,se,sw,n,sw,s,nw,se,nw,nw,n,ne,nw,nw,nw,nw,nw,nw,se,nw,ne,n,nw,nw,sw,ne,nw,n,n,n,nw,nw,nw,n,nw,n,nw,nw,n,s,nw,nw,nw,nw,ne,nw,s,ne,ne,n,nw,se,nw,n,s,nw,se,n,nw,nw,nw,nw,nw,n,n,nw,nw,nw,sw,n,n,n,n,nw,nw,nw,nw,nw,nw,n,nw,nw,nw,nw,sw,nw,n,nw,n,nw,nw,nw,n,nw,s,nw,se,n,n,nw,n,nw,n,nw,n,n,n,nw,sw,nw,nw,s,n,nw,nw,ne,nw,se,n,nw,nw,n,n,nw,nw,nw,n,se,n,nw,nw,nw,sw,n,nw,nw,nw,n,nw,nw,n,nw,s,n,nw,n,nw,n,nw,n,nw,nw,n,nw,n,nw,n,nw,nw,n,s,sw,nw,nw,nw,nw,nw,n,ne,n,nw,nw,nw,n,s,nw,nw,nw,se,nw,nw,n,se,nw,ne,nw,n,n,nw,nw,se,nw,nw,se,n,n,nw,n,n,nw,sw,ne,nw,nw,nw,sw,nw,ne,n,se,n,ne,nw,sw,nw,n,nw,nw,nw,n,ne,s,nw,nw,sw,nw,se,nw,n,sw,sw,nw,n,n,n,nw,nw,sw,nw,n,nw,ne,n,nw,n,nw,n,nw,se,nw,nw,n,s,se,nw,n,nw,nw,nw,n,n,s,n,nw,nw,nw,sw,s,n,ne,se,nw,ne,n,nw,nw,sw,nw,n,nw,n,nw,nw,s,n,nw,nw,n,n,n,nw,nw,n,ne,n,nw,n,nw,n,ne,s,nw,n,n,nw,nw,n,nw,nw,sw,n,n,nw,nw,n,nw,sw,nw,n,nw,nw,nw,n,n,nw,n,sw,n,n,n,nw,s,se,n,ne,n,nw,n,n,nw,n,n,nw,nw,nw,n,nw,se,nw,sw,n,nw,nw,n,n,nw,n,n,s,nw,nw,n,sw,nw,nw,n,nw,nw,n,ne,s,sw,nw,nw,n,n,n,nw,sw,n,ne,n,nw,nw,ne,sw,n,n,sw,nw,n,n,n,nw,sw,n,nw,nw,n,se,nw,nw,nw,n,nw,nw,n,n,n,se,nw,nw,n,n,sw,n,nw,n,nw,n,n,nw,nw,n,nw,n,s,n,n,n,nw,nw,se,n,nw,n,n,s,nw,n,n,nw,nw,n,s,n,n,nw,n,nw,n,n,n,nw,s,sw,n,sw,nw,ne,nw,nw,nw,se,n,nw,nw,nw,nw,n,nw,nw,n,n,n,nw,nw,nw,n,n,nw,n,n,s,nw,ne,n,se,nw,nw,nw,n,n,nw,n,nw,n,n,nw,n,nw,nw,nw,n,n,s,n,s,n,n,n,n,nw,se,n,nw,n,n,se,sw,n,n,n,nw,nw,nw,nw,nw,s,s,s,nw,ne,nw,n,ne,n,n,n,nw,n,se,n,n,n,n,sw,nw,n,n,n,n,nw,n,s,se,n,n,n,nw,n,n,n,nw,n,se,n,nw,s,se,nw,n,nw,nw,n,nw,n,n,ne,n,n,n,n,n,se,n,n,s,nw,n,nw,sw,s,n,se,ne,n,sw,s,s,nw,ne,nw,sw,n,n,n,n,n,n,s,n,n,nw,nw,n,nw,n,n,sw,ne,nw,n,n,n,se,se,n,n,n,s,n,n,ne,n,nw,nw,n,n,n,n,se,nw,n,n,n,n,n,s,n,nw,s,n,n,n,se,n,n,n,n,nw,n,n,se,n,sw,n,n,n,n,n,n,s,nw,n,n,nw,nw,n,nw,nw,n,n,nw,n,n,nw,ne,n,n,n,nw,nw,n,n,n,n,n,n,n,ne,sw,nw,n,n,n,n,nw,n,n,nw,n,ne,n,n,n,s,se,nw,n,se,n,nw,n,n,se,n,n,nw,n,s,se,n,sw,n,ne,n,nw,n,n,ne,ne,n,n,n,n,n,n,nw,nw,n,n,se,n,nw,n,n,n,ne,nw,ne,n,nw,n,nw,nw,n,n,n,nw,n,se,n,nw,se,n,nw,n,n,n,n,n,n,n,nw,se,n,n,n,nw,n,se,nw,n,n,n,nw,n,sw,n,n,n,nw,nw,ne,n,n,nw,n,n,n,n,s,nw,n,sw,se,n,s,n,n,n,nw,ne,nw,n,s,n,n,n,n,n,n,n,n,n,n,nw,n,nw,nw,n,n,n,n,s,n,n,nw,n,nw,n,n,n,sw,n,n,nw,n,nw,n,n,se,s,n,se,sw,n,n,sw,n,n,n,nw,nw,n,nw,nw,nw,n,n,n,n,n,s,n,se,n,n,s,n,n,nw,n,n,n,n,n,ne,n,n,n,n,se,n,n,n,nw,n,n,nw,n,n,s,n,sw,n,n,n,n,n,n,ne,n,se,nw,nw,n,n,n,ne,n,n,n,n,nw,se,n,n,n,n,n,ne,n,n,n,sw,n,n,se,n,n,nw,n,n,n,ne,n,sw,nw,nw,n,n,n,n,n,n,n,n,sw,n,s,n,n,nw,nw,s,n,n,n,n,n,n,n,nw,n,n,n,n,n,n,n,n,ne,n,ne,n,n,n,n,n,n,se,s,s,n,n,n,ne,n,se,n,n,ne,ne,sw,sw,n,n,n,n,n,ne,s,n,nw,sw,n,s,n,sw,sw,n,ne,ne,n,sw,n,n,sw,ne,n,n,n,n,n,ne,sw,n,n,sw,ne,n,s,ne,nw,n,n,n,n,n,n,n,n,n,n,n,nw,n,n,s,n,n,ne,sw,n,n,nw,sw,s,s,se,s,s,ne,se,se,se,ne,ne,se,ne,ne,ne,ne,se,ne,ne,ne,ne,sw,ne,n,n,ne,nw,nw,n,sw,nw,n,n,n,n,ne,nw,n,sw,n,nw,ne,nw,nw,nw,sw,n,nw,n,n,n,nw,nw,nw,nw,nw,nw,nw,nw,nw,s,ne,sw,nw,nw,nw,nw,nw,nw,nw,nw,se,nw,ne,nw,sw,ne,nw,nw,sw,ne,nw,sw,nw,nw,ne,sw,se,nw,nw,nw,sw,se,sw,sw,sw,sw,nw,sw,nw,sw,s,se,sw,sw,sw,sw,sw,sw,sw,sw,sw,s,sw,s,s,n,s,sw,s,s,se,sw,n,s,sw,s,s,s,ne,sw,sw,sw,s,s,se,s,s,s,s,s,s,s,s,s,s,s,ne,se,s,s,nw,s,ne,sw,s,s,s,se,s,sw,s,s,s,s,ne,s,sw,s,s,ne,s,se,s,s,s,se,ne,se,se,se,se,se,s,ne,ne,sw,s,se,n,ne,s,se,s,se,s,se,n,s,se,s,nw,se,se,s,se,sw,se,ne,se,nw,se,se,se,se,nw,se,se,se,se,se,se,se,se,n,nw,se,n,se,ne,n,sw,se,sw,se,se,se,se,ne,se,se,n,se,sw,se,ne,se,ne,nw,ne,se,se,ne,se,sw,se,se,sw,se,n,se,n,ne,n,ne,ne,ne,se,se,ne,se,se,nw,se,se,ne,se,n,s,se,ne,ne,n,ne,ne,ne,ne,nw,s,ne,sw,n,ne,ne,ne,nw,se,ne,ne,ne,ne,ne,ne,ne,se,nw,ne,ne,ne,ne,se,ne,ne,se,ne,ne,se,se,se,sw,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,s,ne,n,ne,ne,ne,s,n,ne,se,n,n,s,se,n,ne,ne,nw,ne,ne,ne,ne,ne,ne,nw,ne,ne,ne,n,n,ne,sw,ne,n,se,sw,sw,n,n,ne,n,se,n,ne,ne,ne,nw,ne,s,n,se,sw,ne,se,n,ne,se,ne,ne,n,n,n,n,n,n,ne,n,n,n,n,ne,ne,n,ne,s,n,sw,ne,s,ne,s,ne,ne,n,n,n,nw,n,n,ne,ne,ne,n,n,n,n,ne,ne,ne,n,n,n,ne,s,s,n,ne,n,se,n,n,ne,n,n,ne,ne,n,ne,nw,sw,n,n,n,n,n,n,nw,n,n,ne,se,se,nw,se,n,n,n,n,n,nw,n,n,n,n,n,se,nw,ne,n,s,n,n,n,n,nw,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,sw,n,n,n,nw,n,n,n,nw,se,nw,s,se,n,n,n,nw,s,n,nw,n,n,n,nw,se,n,nw,n,n,n,n,nw,nw,sw,n,n,nw,n,nw,se,n,n,nw,n,n,se,n,n,n,nw,n,nw,n,nw,nw,nw,s,n,n,n,nw,nw,nw,n,n,n,n,n,nw,nw,nw,n,nw,n,nw,nw,nw,ne,nw,nw,n,nw,nw,n,n,n,n,n,n,n,n,nw,n,s,ne,nw,n,nw,nw,nw,s,n,nw,sw,sw,nw,nw,n,nw,nw,nw,nw,se,nw,nw,n,nw,n,sw,nw,nw,ne,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,se,nw,s,nw,n,sw,nw,n,ne,ne,nw,nw,nw,nw,nw,nw,nw,nw,ne,nw,nw,nw,nw,nw,nw,ne,nw,sw,nw,nw,nw,nw,nw,sw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,sw,nw,nw,nw,nw,s,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,sw,ne,sw,sw,sw,nw,nw,se,nw,s,s,nw,nw,se,s,se,s,sw,nw,nw,nw,nw,nw,se,sw,se,nw,nw,nw,nw,nw,nw,nw,nw,nw,ne,nw,sw,nw,nw,nw,sw,sw,n,n,n,nw,nw,sw,sw,nw,nw,nw,se,sw,sw,sw,sw,nw,sw,nw,se,nw,sw,nw,s,sw,nw,sw,nw,nw,nw,n,sw,se,s,nw,sw,sw,nw,sw,nw,nw,nw,n,se,sw,nw,nw,sw,ne,nw,sw,sw,sw,sw,nw,nw,ne,ne,nw,s,nw,sw,nw,sw,nw,nw,sw,n,nw,sw,nw,nw,nw,nw,sw,n,n,nw,nw,nw,nw,sw,nw,nw,nw,sw,sw,sw,nw,se,sw,sw,sw,sw,nw,nw,sw,nw,sw,se,s,sw,ne,nw,ne,sw,ne,sw,nw,sw,sw,sw,sw,nw,sw,sw,nw,sw,sw,n,nw,sw,sw,sw,se,sw,sw,sw,n,n,sw,sw,sw,sw,sw,sw,nw,sw,nw,sw,s,sw,ne,sw,s,nw,sw,sw,n,sw,sw,nw,sw,n,nw,nw,sw,nw,sw,s,sw,ne,sw,n,s,sw,ne,sw,sw,sw,sw,sw,sw,se,sw,sw,sw,se,n,sw,sw,nw,s,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,nw,sw,sw,sw,nw,sw,sw,s,sw,sw,nw,sw,ne,sw,n,sw,sw,sw,sw,n,s,s,sw,se,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,s,sw,se,sw,s,sw,ne,nw,n,s,ne,sw,se,nw,sw,sw,sw,sw,sw,s,sw,sw,sw,sw,sw,s,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,s,ne,sw,sw,sw,sw,sw,n,s,sw,sw,sw,ne,sw,sw,sw,se,sw,nw,sw,sw,sw,se,se,sw,s,sw,sw,sw,n,sw,sw,sw,sw,sw,sw,sw,sw,se,n,s,s,s,s,nw,sw,se,ne,sw,sw,n,nw,sw,s,s,s,nw,sw,s,sw,sw,sw,sw,sw,ne,s,s,sw,sw,s,s,sw,s,s,n,s,sw,s,nw,s,sw,sw,sw,n,s,sw,sw,sw,sw,sw,sw,s,sw,n,s,sw,sw,sw,s,sw,sw,sw,s,sw,s,sw,s,s,sw,sw,s,nw,sw,sw,sw,sw,s,s,sw,se,s,n,sw,s,sw,sw,sw,s,sw,s,sw,s,n,sw,s,s,sw,sw,sw,sw,sw,s,sw,nw,sw,sw,s,s,sw,sw,sw,sw,ne,sw,sw,s,sw,n,sw,sw,sw,s,nw,nw,sw,s,sw,s,s,s,s,sw,ne,s,sw,s,s,sw,sw,sw,nw,s,s,s,sw,nw,n,nw,sw,sw,s,s,sw,sw,se,s,se,sw,nw,s,s,sw,s,s,s,s,sw,s,ne,sw,s,nw,sw,s,s,ne,sw,s,sw,sw,sw,s,sw,s,sw,s,se,s,nw,sw,s,s,sw,s,sw,s,se,s,n,s,ne,s,sw,s,s,sw,nw,s,s,s,sw,s,s,s,s,sw,s,sw,sw,s,n,s,s,s,s,s,sw,ne,nw,se,s,s,s,s,s,s,sw,n,s,nw,n,s,s,s,n,s,s,nw,s,s,s,nw,s,s,nw,s,se,n,n,s,s,n,s,s,sw,sw,s,nw,s,s,s,nw,s,s,s,n,s,s,s,nw,s,s,s,se,s,s,s,ne,se,s,s,s,s,s,sw,n,s,ne,s,s,se,nw,s,s,s,s,s,n,s,s,sw,nw,nw,s,s,n,s,nw,n,s,s,s,ne,sw,s,s,s,s,s,sw,s,s,s,s,s,s,s,s,s,sw,nw,ne,s,s,s,s,s,s,nw,s,s,s,se,s,n,ne,nw,se,ne,s,s,s,n,s,nw,s,s,s,sw,sw,ne,s,se,se,s,s,s,sw,s,s,se,s,s,s,ne,s,s,se,s,s,s,se,n,s,s,s,s,s,ne,s,s,s,s,s,s,s,s,n,s,s,s,s,s,s,s,se,s,s,s,se,s,s,s,s,se,se,s,sw,nw,s,nw,s,s,se,s,n,s,se,n,sw,s,sw,sw,se,s,se,s,s,s,s,s,s,s,s,s,s,se,s,se,sw,s,s,se,s,s,s,s,se,s,s,nw,s,s,n,n,s,s,se,se,se,s,se,nw,s,s,se,s,se,se,s,s,s,nw,nw,se,n,se,n,se,se,s,s,n,s,sw,s,s,s,s,s,se,n,s,se,ne,s,s,s,sw,se,n,s,s,s,s,s,s,s,n,se,s,s,s,s,s,s,s,s,s,se,s,sw,s,se,ne,sw,nw,s,s,nw,s,s,s,se,s,s,sw,se,s,s,s,ne,se,s,s,s,s,s,s,sw,se,nw,se,se,s,sw,s,ne,se,s,se,se,se,s,se,se,se,n,se,sw,s,s,s,se,s,s,se,s,s,s,s,s,se,se,se,s,se,se,se,s,se,se,s,s,s,se,s,s,s,s,se,se,s,s,s,se,se,s,s,n,se,s,s,nw,se,se,se,se,nw,se,s,se,s,s,se,se,n,s,sw,nw,s,s,se,se,se,s,se,n,s,se,s,se,n,se,se,se,se,s,se,nw,s,se,s,n,s,se,se,s,se,se,ne,s,ne,se,se,se,s,nw,se,nw,s,se,s,s,se,se,nw,s,se,s,se,se,sw,se,s,s,se,se,se,ne,se,s,se,s,se,se,se,se,se,se,se,s,se,s,se,se,s,se,s,nw,ne,se,nw,se,se,s,se,se,s,ne,se,se,se,s,se,se,se,se,s,se,se,se,se,s,se,se,se,se,se,se,se,se,s,se,se,se,nw,s,se,s,n,s,se,se,se,se,s,s,se,se,nw,se,n,ne,se,nw,se,s,s,se,se,n,sw,ne,s,se,se,sw,s,s,se,n,se,se,s,ne,s,se,se,se,se,se,sw,se,se,se,se,se,ne,s,ne,se,s,sw,se,se,se,se,se,se,s,se,s,s,se,sw,se,se,se,se,nw,se,se,nw,se,ne,s,se,sw,se,se,se,s,se,sw,se,se,se,se,sw,se,se,sw,se,se,se,se,se,nw,ne,sw,ne,se,s,se,sw,se,se,se,se,se,se,ne,se,sw,se,se,se,se,se,sw,se,se,se,se,se,se,se,se,se,ne,se,se,n,se,n,s,se,se,se,se,se,se,se,nw,se,se,se,sw,se,se,se,se,ne,se,se,se,se,se,se,s,se,se,ne,s,ne,se,s,se,se,nw,se,se,sw,se,se,se,se,se,se,se,se,se,se,nw,ne,se,se,ne,se,se,se,se,se,se,n,se,se,se,se,ne,sw,se,se,ne,se,ne,se,nw,se,se,se,n,se,se,sw,se,s,se,se,se,se,se,se,se,se,ne,se,se,se,s,se,se,se,ne,se,nw,n,se,se,nw,ne,se,se,se,se,se,se,ne,ne,nw,se,se,se,ne,se,se,ne,n,se,se,se,se,ne,se,ne,ne,se,n,nw,se,se,s,ne,se,se,se,ne,se,se,se,se,se,s,ne,se,se,nw,se,se,se,sw,se,n,se,se,se,s,ne,se,se,se,se,se,n,n,se,se,se,se,ne,nw,se,se,ne,n,se,ne,se,se,ne,ne,se,ne,n,s,ne,se,se,se,se,ne,s,s,se,se,se,se,se,ne,se,ne,ne,ne,se,sw,s,se,s,ne,se,ne,ne,se,ne,se,se,se,se,ne,se,se,se,ne,sw,nw,se,se,s,se,nw,se,se,nw,s,se,se,se,se,se,se,nw,se,se,se,nw,ne,ne,se,se,n,se,se,se,nw,se,s,nw,ne,ne,ne,se,ne,se,se,se,ne,se,se,ne,ne,ne,nw,se,se,nw,ne,se,ne,n,se,ne,ne,ne,ne,ne,se,sw,ne,se,s,sw,se,nw,ne,se,se,se,se,se,sw,se,se,s,ne,se,se,ne,se,se,ne,se,nw,ne,se,se,se,se,se,ne,ne,se,se,se,ne,se,se,ne,ne,se,se,n,ne,ne,se,ne,se,se,ne,ne,n,ne,se,ne,se,ne,s,se,ne,se,sw,ne,ne,s,ne,n,ne,se,se,ne,ne,ne,se,se,se,se,sw,se,s,ne,nw,ne,ne,ne,se,se,se,ne,ne,nw,se,se,ne,se,nw,se,nw,se,se,nw,se,se,ne,ne,se,se,se,se,ne,ne,ne,ne,sw,se,ne,ne,se,ne,se,ne,se,se,ne,ne,ne,ne,ne,se,se,se,se,se,sw,ne,se,n,se,n,nw,se,se,sw,se,ne,se,ne,ne,ne,ne,nw,ne,se,se,ne,ne,se,ne,ne,se,ne,ne,ne,ne,se,ne,sw,se,se,n,ne,se,ne,ne,sw,ne,ne,ne,se,se,se,se,se,ne,ne,se,n,se,n,sw,se,se,se,se,ne,se,se,se,se,ne,se,se,se,ne,n,n,ne,se,se,ne,ne,ne,nw,ne,se,ne,se,ne,n,se,ne,nw,ne,se,ne,s,ne,ne,ne,se,ne,sw,ne,se,se,se,ne,ne,ne,se,s,se,ne,n,n,ne,se,se,ne,ne,ne,se,ne,n,ne,s,ne,ne,s,ne,se,ne,se,ne,ne,nw,se,ne,ne,se,nw,ne,ne,se,sw,ne,se,ne,ne,s,se,ne,ne,ne,ne,se,se,ne,n,s,se,ne,s,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,nw,n,ne,ne,n,se,ne,ne,ne,ne,ne,n,ne,se,ne,ne,se,ne,ne,nw,ne,se,ne,se,s,se,ne,ne,ne,ne,ne,ne,ne,s,ne,ne,ne,ne,ne,ne,se,ne,ne,ne,nw,ne,se,ne,ne,ne,ne,ne,nw,ne,nw,ne,ne,s,se,n,ne,ne,ne,se,ne,ne,ne,ne,ne,ne,nw,ne,s,sw,ne,ne,ne,ne,ne,ne,ne,se,se,se,ne,n,ne,ne,ne,ne,ne,n,ne,ne,ne,ne,ne,ne,ne,s,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,se,ne,se,ne,n,ne,se,ne,ne,ne,se,n,ne,ne,ne,ne,se,ne,ne,ne,ne,se,sw,ne,ne,se,se,ne,ne,n,nw,ne,se,ne,ne,ne,ne,ne,ne,nw,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,se,ne,ne,ne,sw,nw,ne,nw,se,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,se
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/data/2017/12.txt	Tue Dec 03 20:15:07 2019 -0500
@@ -0,0 +1,2000 @@
+0 <-> 82
+1 <-> 41, 1402
+2 <-> 454, 1690
+3 <-> 533, 1726
+4 <-> 82
+5 <-> 202, 1769
+6 <-> 682, 789, 1295
+7 <-> 1243, 1500
+8 <-> 1630
+9 <-> 847, 1922
+10 <-> 446
+11 <-> 98, 172, 859, 1303
+12 <-> 1748
+13 <-> 334
+14 <-> 850, 1537, 1627, 1747
+15 <-> 194, 722, 1091, 1290
+16 <-> 537, 965, 1642
+17 <-> 371
+18 <-> 422, 436, 1795
+19 <-> 487, 872, 1845
+20 <-> 423, 561, 1313, 1984
+21 <-> 62, 760
+22 <-> 62, 126, 586, 1472
+23 <-> 1057, 1809, 1938
+24 <-> 24, 986
+25 <-> 1758
+26 <-> 1780
+27 <-> 622, 748
+28 <-> 1048, 1617
+29 <-> 451, 751, 866, 1885
+30 <-> 501
+31 <-> 134, 218, 1993
+32 <-> 629
+33 <-> 1774
+34 <-> 1011, 1151
+35 <-> 1432
+36 <-> 202
+37 <-> 664, 1021, 1159
+38 <-> 103, 1123, 1228
+39 <-> 1816
+40 <-> 896
+41 <-> 1, 1905
+42 <-> 224, 824, 1453
+43 <-> 1926
+44 <-> 703
+45 <-> 438
+46 <-> 251, 1886
+47 <-> 709
+48 <-> 425, 1557, 1944
+49 <-> 1245
+50 <-> 1294
+51 <-> 51, 115, 894, 1624
+52 <-> 629, 882
+53 <-> 112, 1007, 1665
+54 <-> 766, 1169, 1349
+55 <-> 55
+56 <-> 56, 1250
+57 <-> 150
+58 <-> 168, 396, 639, 651
+59 <-> 436
+60 <-> 315, 1556
+61 <-> 1681
+62 <-> 21, 22
+63 <-> 385, 970, 979
+64 <-> 314, 1613
+65 <-> 84, 189, 1167
+66 <-> 777, 1097, 1551
+67 <-> 1380
+68 <-> 384, 500, 1490
+69 <-> 882, 1373, 1982
+70 <-> 264, 1149
+71 <-> 731, 1104, 1897
+72 <-> 442, 1118, 1126, 1392
+73 <-> 1241, 1762
+74 <-> 102
+75 <-> 75, 1153, 1226
+76 <-> 901
+77 <-> 794
+78 <-> 432
+79 <-> 79, 1042, 1086, 1471
+80 <-> 303, 621, 989, 1985, 1992
+81 <-> 118
+82 <-> 0, 4, 848, 1240
+83 <-> 845, 1338
+84 <-> 65, 973
+85 <-> 85, 1352
+86 <-> 378, 1671
+87 <-> 87, 587
+88 <-> 243, 1384
+89 <-> 1214, 1498
+90 <-> 477, 1626, 1788
+91 <-> 1036
+92 <-> 409
+93 <-> 724, 819
+94 <-> 869, 1100
+95 <-> 1394, 1523
+96 <-> 1213
+97 <-> 757
+98 <-> 11, 742, 1556
+99 <-> 508
+100 <-> 997
+101 <-> 1338
+102 <-> 74, 305, 1883
+103 <-> 38, 809, 1701
+104 <-> 104
+105 <-> 675, 993
+106 <-> 1082, 1167, 1600
+107 <-> 473, 1096
+108 <-> 762, 951
+109 <-> 1464, 1489
+110 <-> 662, 682, 1536
+111 <-> 457, 1797
+112 <-> 53, 920
+113 <-> 405, 1927
+114 <-> 1252, 1538
+115 <-> 51
+116 <-> 219, 507
+117 <-> 1562
+118 <-> 81, 1815
+119 <-> 524, 1014, 1344
+120 <-> 1141
+121 <-> 1179, 1418, 1924
+122 <-> 684
+123 <-> 1105
+124 <-> 1554
+125 <-> 674
+126 <-> 22, 1106, 1360
+127 <-> 302, 996, 1449
+128 <-> 137, 786
+129 <-> 492
+130 <-> 505, 1783
+131 <-> 945
+132 <-> 1892
+133 <-> 133, 1362
+134 <-> 31, 555, 1184
+135 <-> 603, 705, 1699, 1821
+136 <-> 1940
+137 <-> 128, 504
+138 <-> 1536, 1956
+139 <-> 192, 800, 1643, 1859
+140 <-> 1119, 1464
+141 <-> 905, 1576
+142 <-> 891, 1512
+143 <-> 157, 905
+144 <-> 439
+145 <-> 1464
+146 <-> 1263
+147 <-> 147
+148 <-> 215
+149 <-> 188
+150 <-> 57, 819
+151 <-> 151
+152 <-> 209, 359
+153 <-> 424, 452, 1473
+154 <-> 1206, 1879
+155 <-> 1560
+156 <-> 821
+157 <-> 143, 616, 1507
+158 <-> 492, 641
+159 <-> 599, 1340
+160 <-> 1790
+161 <-> 545
+162 <-> 750
+163 <-> 163
+164 <-> 817, 1059
+165 <-> 755
+166 <-> 927, 1380
+167 <-> 420, 470, 1533, 1843
+168 <-> 58, 860, 1727, 1817
+169 <-> 227, 1970
+170 <-> 670, 809
+171 <-> 661, 737, 1426, 1716
+172 <-> 11
+173 <-> 184, 1756
+174 <-> 1398, 1464, 1844
+175 <-> 292, 619
+176 <-> 1571
+177 <-> 1187, 1293, 1570
+178 <-> 1370, 1491, 1813
+179 <-> 796, 1381
+180 <-> 309, 988
+181 <-> 278, 324
+182 <-> 699, 1563
+183 <-> 411
+184 <-> 173, 1172
+185 <-> 1507
+186 <-> 1156
+187 <-> 1211
+188 <-> 149, 594, 726, 1612
+189 <-> 65, 1482
+190 <-> 1392, 1953
+191 <-> 1184
+192 <-> 139
+193 <-> 1728
+194 <-> 15
+195 <-> 1113, 1573
+196 <-> 593
+197 <-> 398, 1874, 1942
+198 <-> 584, 1412
+199 <-> 199, 1573, 1837
+200 <-> 1932
+201 <-> 678, 825
+202 <-> 5, 36, 511, 1257, 1961
+203 <-> 1003, 1480
+204 <-> 1764
+205 <-> 319
+206 <-> 396
+207 <-> 272
+208 <-> 904, 1267
+209 <-> 152, 535, 1515, 1873
+210 <-> 380, 1132, 1794
+211 <-> 483
+212 <-> 307
+213 <-> 713, 1337
+214 <-> 1117
+215 <-> 148, 869, 1619
+216 <-> 365
+217 <-> 1447, 1628
+218 <-> 31
+219 <-> 116, 383
+220 <-> 220, 382
+221 <-> 391, 648
+222 <-> 746, 1338
+223 <-> 1174
+224 <-> 42, 336
+225 <-> 790, 1476
+226 <-> 719, 1943
+227 <-> 169
+228 <-> 433, 1144
+229 <-> 258, 800
+230 <-> 1920
+231 <-> 1849
+232 <-> 1888
+233 <-> 233, 1317
+234 <-> 575, 1158
+235 <-> 335, 596, 1918
+236 <-> 327, 608, 1191
+237 <-> 628, 1214, 1448
+238 <-> 238
+239 <-> 383, 1039, 1952
+240 <-> 1023, 1203
+241 <-> 263
+242 <-> 242
+243 <-> 88
+244 <-> 397, 1912
+245 <-> 608
+246 <-> 417, 785, 900, 921, 1488
+247 <-> 592, 1846
+248 <-> 248, 770
+249 <-> 249, 1635
+250 <-> 1940
+251 <-> 46
+252 <-> 520, 1972
+253 <-> 1847
+254 <-> 323
+255 <-> 750, 1391
+256 <-> 747
+257 <-> 502, 1003
+258 <-> 229, 1749
+259 <-> 259
+260 <-> 1916
+261 <-> 1268, 1694, 1975
+262 <-> 262
+263 <-> 241, 1213, 1950
+264 <-> 70
+265 <-> 299, 538
+266 <-> 406
+267 <-> 1609
+268 <-> 1561
+269 <-> 492, 1694
+270 <-> 550, 1427, 1779
+271 <-> 675, 1179, 1294
+272 <-> 207, 603, 1485
+273 <-> 459, 556, 767, 992, 1656, 1983
+274 <-> 1002
+275 <-> 1859
+276 <-> 934, 1980
+277 <-> 1325
+278 <-> 181, 1804
+279 <-> 403
+280 <-> 1705, 1778
+281 <-> 281
+282 <-> 1509
+283 <-> 600, 764
+284 <-> 284, 506, 953, 1770
+285 <-> 815
+286 <-> 560, 1176
+287 <-> 495, 775
+288 <-> 1315
+289 <-> 442, 923
+290 <-> 1524, 1789
+291 <-> 516, 550
+292 <-> 175, 1136, 1180
+293 <-> 1855
+294 <-> 350, 490, 1658
+295 <-> 1525
+296 <-> 983
+297 <-> 1709
+298 <-> 1100
+299 <-> 265, 655, 1114
+300 <-> 716, 902
+301 <-> 1496, 1995
+302 <-> 127, 376
+303 <-> 80, 659, 1136, 1229, 1606
+304 <-> 996
+305 <-> 102, 1309, 1728
+306 <-> 306
+307 <-> 212, 342, 1067
+308 <-> 880, 1999
+309 <-> 180, 813
+310 <-> 768
+311 <-> 311
+312 <-> 943, 1355, 1865
+313 <-> 313
+314 <-> 64, 585, 1717
+315 <-> 60
+316 <-> 425
+317 <-> 526, 1484
+318 <-> 1574
+319 <-> 205, 1767
+320 <-> 601, 605
+321 <-> 1829, 1977
+322 <-> 325, 1109
+323 <-> 254, 861, 910, 1130
+324 <-> 181, 466
+325 <-> 322, 766
+326 <-> 423, 1989
+327 <-> 236, 1354
+328 <-> 1912
+329 <-> 957, 1180
+330 <-> 1175, 1350, 1645
+331 <-> 1101, 1390
+332 <-> 444, 1785
+333 <-> 685, 1678
+334 <-> 13, 890
+335 <-> 235, 1737
+336 <-> 224, 552
+337 <-> 337, 913
+338 <-> 479
+339 <-> 339
+340 <-> 1676
+341 <-> 1444
+342 <-> 307
+343 <-> 343, 1271, 1820
+344 <-> 1502, 1658, 1864
+345 <-> 765, 1009, 1324, 1613
+346 <-> 621, 729
+347 <-> 1923
+348 <-> 1385
+349 <-> 1000
+350 <-> 294
+351 <-> 423, 878
+352 <-> 1327
+353 <-> 600, 1781
+354 <-> 1231, 1969
+355 <-> 1560
+356 <-> 984, 1217
+357 <-> 1678
+358 <-> 754, 1989
+359 <-> 152
+360 <-> 886
+361 <-> 1099, 1614
+362 <-> 1584
+363 <-> 1688
+364 <-> 364
+365 <-> 216, 617
+366 <-> 475, 816
+367 <-> 886, 1315
+368 <-> 368
+369 <-> 887
+370 <-> 1129, 1466
+371 <-> 17, 748, 1205
+372 <-> 1739
+373 <-> 1009
+374 <-> 1045, 1502, 1833
+375 <-> 557, 1505
+376 <-> 302, 1217
+377 <-> 494, 619, 690, 732
+378 <-> 86, 1535
+379 <-> 379, 1563
+380 <-> 210, 1816
+381 <-> 578, 722
+382 <-> 220
+383 <-> 219, 239
+384 <-> 68
+385 <-> 63, 1043
+386 <-> 1108, 1570
+387 <-> 1548
+388 <-> 619
+389 <-> 389
+390 <-> 413, 786, 1769, 1906
+391 <-> 221, 396, 733
+392 <-> 714, 1770
+393 <-> 408, 1006
+394 <-> 1174, 1469
+395 <-> 958
+396 <-> 58, 206, 391, 1610
+397 <-> 244
+398 <-> 197, 1649
+399 <-> 647, 972
+400 <-> 1985
+401 <-> 1632
+402 <-> 807
+403 <-> 279, 852, 1624, 1981
+404 <-> 1149
+405 <-> 113
+406 <-> 266, 1336
+407 <-> 818
+408 <-> 393
+409 <-> 92, 1491
+410 <-> 836
+411 <-> 183, 963, 1308
+412 <-> 1542
+413 <-> 390
+414 <-> 1602
+415 <-> 1419
+416 <-> 1137, 1288, 1494
+417 <-> 246
+418 <-> 503, 525, 1005, 1447
+419 <-> 607, 1310
+420 <-> 167, 1078, 1404
+421 <-> 650
+422 <-> 18, 829
+423 <-> 20, 326, 351
+424 <-> 153, 1759
+425 <-> 48, 316, 1211, 1279, 1366
+426 <-> 709, 1799, 1913
+427 <-> 693, 1568
+428 <-> 1199, 1914
+429 <-> 1790
+430 <-> 469
+431 <-> 1730
+432 <-> 78, 677
+433 <-> 228, 543, 842
+434 <-> 1216, 1562
+435 <-> 554
+436 <-> 18, 59, 804, 918
+437 <-> 1065, 1274, 1560
+438 <-> 45, 1647
+439 <-> 144, 1327
+440 <-> 816, 1768, 1893
+441 <-> 930
+442 <-> 72, 289, 1555, 1778
+443 <-> 791, 1964
+444 <-> 332, 717, 1715
+445 <-> 445, 1335, 1944
+446 <-> 10, 961
+447 <-> 499, 1067, 1363
+448 <-> 1150, 1229
+449 <-> 573, 972, 1670
+450 <-> 964, 1731
+451 <-> 29, 815, 1148
+452 <-> 153, 1221
+453 <-> 1012, 1525
+454 <-> 2, 891, 1708
+455 <-> 877
+456 <-> 1850
+457 <-> 111, 544, 640
+458 <-> 458
+459 <-> 273, 495, 792
+460 <-> 1201, 1319
+461 <-> 461, 598, 1513
+462 <-> 1166, 1495
+463 <-> 542, 708, 1209
+464 <-> 770
+465 <-> 1847
+466 <-> 324, 1052
+467 <-> 708, 915
+468 <-> 1501, 1715
+469 <-> 430, 576, 1369
+470 <-> 167, 1618
+471 <-> 1875
+472 <-> 1212
+473 <-> 107, 1426
+474 <-> 484, 665
+475 <-> 366, 1262
+476 <-> 476, 1380
+477 <-> 90
+478 <-> 1688, 1811, 1894, 1949
+479 <-> 338, 1429, 1836
+480 <-> 1394
+481 <-> 1391
+482 <-> 1477
+483 <-> 211, 736
+484 <-> 474, 1815
+485 <-> 1034
+486 <-> 1682
+487 <-> 19, 1722, 1773
+488 <-> 567, 1066, 1873
+489 <-> 581, 1962
+490 <-> 294
+491 <-> 760
+492 <-> 129, 158, 269, 1099
+493 <-> 1250
+494 <-> 377
+495 <-> 287, 459
+496 <-> 1051
+497 <-> 513, 633, 1189, 1454
+498 <-> 1080, 1530
+499 <-> 447, 647
+500 <-> 68, 1329, 1719
+501 <-> 30, 1563, 1700
+502 <-> 257
+503 <-> 418, 1521
+504 <-> 137
+505 <-> 130
+506 <-> 284, 1830
+507 <-> 116, 507
+508 <-> 99, 508, 709, 877
+509 <-> 693
+510 <-> 1648
+511 <-> 202, 1127, 1510
+512 <-> 720
+513 <-> 497
+514 <-> 752, 1430
+515 <-> 1503
+516 <-> 291, 1284, 1891
+517 <-> 994
+518 <-> 1406
+519 <-> 1287
+520 <-> 252
+521 <-> 1253, 1292, 1530
+522 <-> 904
+523 <-> 1628
+524 <-> 119, 778, 1034, 1145
+525 <-> 418, 1264
+526 <-> 317, 971
+527 <-> 1566
+528 <-> 695, 1841
+529 <-> 732
+530 <-> 1972
+531 <-> 1036
+532 <-> 784
+533 <-> 3, 533, 961, 1018
+534 <-> 981, 1147, 1326
+535 <-> 209
+536 <-> 1343, 1410, 1750
+537 <-> 16
+538 <-> 265, 795
+539 <-> 1055, 1430
+540 <-> 855
+541 <-> 896, 1170
+542 <-> 463, 652, 1302, 1833
+543 <-> 433
+544 <-> 457, 890
+545 <-> 161, 791
+546 <-> 857, 1267
+547 <-> 1979
+548 <-> 580, 1988
+549 <-> 1256
+550 <-> 270, 291, 586
+551 <-> 646
+552 <-> 336
+553 <-> 930, 1754
+554 <-> 435, 1758, 1816
+555 <-> 134
+556 <-> 273
+557 <-> 375
+558 <-> 745
+559 <-> 809
+560 <-> 286
+561 <-> 20
+562 <-> 1766
+563 <-> 563
+564 <-> 564, 658
+565 <-> 1492
+566 <-> 775
+567 <-> 488
+568 <-> 1636, 1730
+569 <-> 579, 678, 740
+570 <-> 1362
+571 <-> 846, 1230
+572 <-> 1063, 1821
+573 <-> 449
+574 <-> 1946, 1961
+575 <-> 234, 674
+576 <-> 469, 1152, 1890
+577 <-> 938, 1072, 1237, 1386
+578 <-> 381
+579 <-> 569
+580 <-> 548, 944, 1464
+581 <-> 489
+582 <-> 635
+583 <-> 1378, 1891
+584 <-> 198, 1102
+585 <-> 314, 1803
+586 <-> 22, 550, 630, 1674
+587 <-> 87, 1025
+588 <-> 1562, 1588
+589 <-> 1175, 1666
+590 <-> 809, 1912
+591 <-> 1363, 1581
+592 <-> 247, 686
+593 <-> 196, 912
+594 <-> 188, 728, 1376
+595 <-> 595
+596 <-> 235, 1500, 1758
+597 <-> 1159
+598 <-> 461
+599 <-> 159, 599, 1377
+600 <-> 283, 353
+601 <-> 320, 1514, 1792
+602 <-> 815
+603 <-> 135, 272, 955, 1583, 1848
+604 <-> 1878
+605 <-> 320, 1100, 1585
+606 <-> 1590
+607 <-> 419, 1798
+608 <-> 236, 245
+609 <-> 1298, 1743
+610 <-> 1676
+611 <-> 830
+612 <-> 1479, 1942
+613 <-> 1899
+614 <-> 1633
+615 <-> 962, 1348, 1827
+616 <-> 157
+617 <-> 365, 624, 756, 1017, 1278, 1894
+618 <-> 709
+619 <-> 175, 377, 388
+620 <-> 720, 1414, 1809
+621 <-> 80, 346
+622 <-> 27, 1244, 1473, 1714
+623 <-> 972
+624 <-> 617, 1272, 1743
+625 <-> 670, 1458
+626 <-> 1260, 1580, 1615
+627 <-> 1223, 1984
+628 <-> 237
+629 <-> 32, 52, 1398
+630 <-> 586
+631 <-> 1881
+632 <-> 802
+633 <-> 497, 1231
+634 <-> 1816
+635 <-> 582, 1927
+636 <-> 1435
+637 <-> 926
+638 <-> 804
+639 <-> 58, 1904, 1965
+640 <-> 457, 999
+641 <-> 158
+642 <-> 1561
+643 <-> 959
+644 <-> 644
+645 <-> 1589
+646 <-> 551, 1733
+647 <-> 399, 499
+648 <-> 221, 1416
+649 <-> 1481
+650 <-> 421, 1536
+651 <-> 58
+652 <-> 542, 1409
+653 <-> 708, 1051
+654 <-> 805, 1474, 1948
+655 <-> 299, 1679
+656 <-> 1011
+657 <-> 1137, 1887
+658 <-> 564
+659 <-> 303
+660 <-> 996, 1875
+661 <-> 171
+662 <-> 110, 939, 1522, 1634
+663 <-> 911
+664 <-> 37
+665 <-> 474, 1911
+666 <-> 808
+667 <-> 1208, 1831
+668 <-> 926, 1219, 1302
+669 <-> 797, 1041, 1599
+670 <-> 170, 625
+671 <-> 671
+672 <-> 1845
+673 <-> 1682
+674 <-> 125, 575, 1112, 1519, 1967
+675 <-> 105, 271, 1825
+676 <-> 1648
+677 <-> 432, 677, 1079
+678 <-> 201, 569, 1088, 1693
+679 <-> 1118
+680 <-> 780, 1089
+681 <-> 681
+682 <-> 6, 110
+683 <-> 683
+684 <-> 122, 1180
+685 <-> 333, 1101, 1672
+686 <-> 592
+687 <-> 984, 1423, 1800
+688 <-> 1498
+689 <-> 1013
+690 <-> 377
+691 <-> 1091
+692 <-> 726
+693 <-> 427, 509, 1854
+694 <-> 1795
+695 <-> 528, 1031
+696 <-> 1557
+697 <-> 869
+698 <-> 698, 1480
+699 <-> 182, 1595
+700 <-> 1210
+701 <-> 1381, 1955
+702 <-> 1039
+703 <-> 44, 741
+704 <-> 1901
+705 <-> 135, 1695
+706 <-> 1532
+707 <-> 812, 1085
+708 <-> 463, 467, 653
+709 <-> 47, 426, 508, 618
+710 <-> 794, 1215
+711 <-> 1476, 1514
+712 <-> 824, 1000
+713 <-> 213
+714 <-> 392, 1444
+715 <-> 753, 1956
+716 <-> 300
+717 <-> 444, 1209, 1872
+718 <-> 1886
+719 <-> 226
+720 <-> 512, 620, 1243
+721 <-> 981, 1177
+722 <-> 15, 381, 1311, 1708, 1869
+723 <-> 1582
+724 <-> 93, 1689
+725 <-> 1151
+726 <-> 188, 692
+727 <-> 1646, 1750
+728 <-> 594, 1125
+729 <-> 346, 1102
+730 <-> 1300
+731 <-> 71, 1523, 1839
+732 <-> 377, 529
+733 <-> 391, 1111
+734 <-> 734
+735 <-> 1120
+736 <-> 483, 1478
+737 <-> 171, 1141, 1680
+738 <-> 1782
+739 <-> 990, 1227
+740 <-> 569, 758, 1340
+741 <-> 703, 741
+742 <-> 98, 785, 1586
+743 <-> 839, 1288
+744 <-> 1401, 1571
+745 <-> 558, 1137, 1308
+746 <-> 222, 746
+747 <-> 256, 1246, 1359, 1626
+748 <-> 27, 371, 1391
+749 <-> 819
+750 <-> 162, 255, 1316
+751 <-> 29
+752 <-> 514
+753 <-> 715, 1087
+754 <-> 358, 1566
+755 <-> 165, 1652
+756 <-> 617
+757 <-> 97, 928, 1905
+758 <-> 740, 1342
+759 <-> 1675, 1882
+760 <-> 21, 491
+761 <-> 1912
+762 <-> 108, 809
+763 <-> 1553
+764 <-> 283
+765 <-> 345, 1025
+766 <-> 54, 325, 1545, 1908
+767 <-> 273, 1605, 1718
+768 <-> 310, 1298
+769 <-> 1316
+770 <-> 248, 464, 1300
+771 <-> 771
+772 <-> 826
+773 <-> 1779
+774 <-> 800, 1516
+775 <-> 287, 566
+776 <-> 1190
+777 <-> 66, 1367
+778 <-> 524
+779 <-> 1504, 1782
+780 <-> 680, 1299
+781 <-> 1866
+782 <-> 950, 1395
+783 <-> 1814
+784 <-> 532, 1921
+785 <-> 246, 742
+786 <-> 128, 390
+787 <-> 787
+788 <-> 1772, 1876, 1943
+789 <-> 6
+790 <-> 225, 1117, 1384
+791 <-> 443, 545, 1822
+792 <-> 459, 1810
+793 <-> 1026
+794 <-> 77, 710
+795 <-> 538, 795
+796 <-> 179, 851, 1462, 1619
+797 <-> 669, 1093
+798 <-> 1789
+799 <-> 1088, 1269, 1999
+800 <-> 139, 229, 774, 1218
+801 <-> 1110
+802 <-> 632, 802
+803 <-> 1359
+804 <-> 436, 638
+805 <-> 654
+806 <-> 1605
+807 <-> 402, 1353
+808 <-> 666, 934, 1248, 1888
+809 <-> 103, 170, 559, 590, 762, 1139
+810 <-> 1352
+811 <-> 1766, 1937
+812 <-> 707, 1410, 1618
+813 <-> 309, 813
+814 <-> 1461, 1696, 1725
+815 <-> 285, 451, 602
+816 <-> 366, 440, 1034
+817 <-> 164, 1157
+818 <-> 407, 1341, 1699
+819 <-> 93, 150, 749, 1353, 1453
+820 <-> 1051
+821 <-> 156, 1807
+822 <-> 1951
+823 <-> 856
+824 <-> 42, 712, 1260
+825 <-> 201
+826 <-> 772, 856, 897
+827 <-> 827, 1550
+828 <-> 937, 1933, 1947
+829 <-> 422, 831
+830 <-> 611, 1049, 1314
+831 <-> 829, 1141
+832 <-> 907
+833 <-> 1754
+834 <-> 1418
+835 <-> 1509
+836 <-> 410, 1005
+837 <-> 837, 1160
+838 <-> 995, 1154
+839 <-> 743, 1637
+840 <-> 854
+841 <-> 1221
+842 <-> 433, 1611, 1848
+843 <-> 1978
+844 <-> 1575
+845 <-> 83
+846 <-> 571, 987, 1683
+847 <-> 9, 847
+848 <-> 82, 848, 1016, 1237
+849 <-> 1266
+850 <-> 14, 936
+851 <-> 796, 983
+852 <-> 403
+853 <-> 984
+854 <-> 840, 854
+855 <-> 540, 1762
+856 <-> 823, 826, 856, 1195
+857 <-> 546, 1098
+858 <-> 858, 1752, 1771
+859 <-> 11
+860 <-> 168
+861 <-> 323
+862 <-> 1716, 1772
+863 <-> 1754
+864 <-> 1261, 1724, 1762, 1903
+865 <-> 895, 1073, 1205
+866 <-> 29, 1781, 1845
+867 <-> 1457, 1598, 1993
+868 <-> 868, 1723
+869 <-> 94, 215, 697, 903
+870 <-> 945
+871 <-> 1215, 1668
+872 <-> 19
+873 <-> 1028
+874 <-> 954, 1932
+875 <-> 1686, 1718
+876 <-> 1358, 1888, 1947
+877 <-> 455, 508
+878 <-> 351
+879 <-> 1737
+880 <-> 308
+881 <-> 881, 1526
+882 <-> 52, 69
+883 <-> 928
+884 <-> 885, 1507
+885 <-> 884
+886 <-> 360, 367, 1029, 1116
+887 <-> 369, 1747
+888 <-> 1530
+889 <-> 1460, 1478, 1745
+890 <-> 334, 544, 890, 1004
+891 <-> 142, 454, 1299
+892 <-> 1095
+893 <-> 1149, 1469, 1594
+894 <-> 51, 1819, 1987
+895 <-> 865
+896 <-> 40, 541, 896
+897 <-> 826
+898 <-> 898, 1199
+899 <-> 1592
+900 <-> 246
+901 <-> 76, 1626
+902 <-> 300, 918
+903 <-> 869
+904 <-> 208, 522
+905 <-> 141, 143
+906 <-> 1064, 1650
+907 <-> 832, 1751, 1982
+908 <-> 908, 1866
+909 <-> 1222
+910 <-> 323, 1638
+911 <-> 663, 1165
+912 <-> 593, 1765
+913 <-> 337
+914 <-> 1218, 1458, 1931
+915 <-> 467, 1486
+916 <-> 1650
+917 <-> 1881
+918 <-> 436, 902, 1046
+919 <-> 1350, 1919
+920 <-> 112, 1551
+921 <-> 246, 1028, 1620
+922 <-> 960, 1650
+923 <-> 289, 1977
+924 <-> 924, 1991
+925 <-> 925, 1957
+926 <-> 637, 668, 1393
+927 <-> 166, 1420
+928 <-> 757, 883
+929 <-> 1569, 1575
+930 <-> 441, 553, 1179
+931 <-> 1891
+932 <-> 972
+933 <-> 1851
+934 <-> 276, 808
+935 <-> 1404
+936 <-> 850
+937 <-> 828, 1808
+938 <-> 577
+939 <-> 662
+940 <-> 1437
+941 <-> 1076
+942 <-> 1123
+943 <-> 312, 1008
+944 <-> 580
+945 <-> 131, 870, 945, 1929
+946 <-> 1200
+947 <-> 947, 966
+948 <-> 1221, 1498
+949 <-> 949, 1069
+950 <-> 782, 1263
+951 <-> 108, 1729
+952 <-> 1997
+953 <-> 284
+954 <-> 874
+955 <-> 603
+956 <-> 969
+957 <-> 329, 1633
+958 <-> 395, 958
+959 <-> 643, 1634
+960 <-> 922
+961 <-> 446, 533, 1521
+962 <-> 615, 1870
+963 <-> 411
+964 <-> 450, 1179
+965 <-> 16, 1699
+966 <-> 947, 1702
+967 <-> 1588
+968 <-> 1140, 1550, 1996
+969 <-> 956, 1158
+970 <-> 63
+971 <-> 526, 1375
+972 <-> 399, 449, 623, 932
+973 <-> 84, 1133, 1249, 1834
+974 <-> 1775
+975 <-> 975
+976 <-> 1822
+977 <-> 1978
+978 <-> 1451
+979 <-> 63, 1186, 1564
+980 <-> 1984
+981 <-> 534, 721, 1430, 1532
+982 <-> 1094, 1605, 1698
+983 <-> 296, 851, 1604, 1867
+984 <-> 356, 687, 853, 1881
+985 <-> 985, 1425
+986 <-> 24
+987 <-> 846
+988 <-> 180
+989 <-> 80, 1520, 1622
+990 <-> 739, 1339
+991 <-> 1767
+992 <-> 273
+993 <-> 105
+994 <-> 517, 1629
+995 <-> 838, 1945
+996 <-> 127, 304, 660
+997 <-> 100, 1275, 1909
+998 <-> 1492
+999 <-> 640
+1000 <-> 349, 712
+1001 <-> 1193, 1286, 1348
+1002 <-> 274, 1002, 1337, 1970
+1003 <-> 203, 257
+1004 <-> 890
+1005 <-> 418, 836
+1006 <-> 393, 1955
+1007 <-> 53
+1008 <-> 943
+1009 <-> 345, 373
+1010 <-> 1242
+1011 <-> 34, 656, 1445
+1012 <-> 453, 1012
+1013 <-> 689, 1999
+1014 <-> 119, 1014, 1431
+1015 <-> 1671
+1016 <-> 848
+1017 <-> 617, 1807
+1018 <-> 533
+1019 <-> 1037
+1020 <-> 1579
+1021 <-> 37
+1022 <-> 1022
+1023 <-> 240, 1823
+1024 <-> 1024
+1025 <-> 587, 765
+1026 <-> 793, 1026
+1027 <-> 1265
+1028 <-> 873, 921, 1736
+1029 <-> 886, 1235
+1030 <-> 1207
+1031 <-> 695, 1618
+1032 <-> 1139
+1033 <-> 1987
+1034 <-> 485, 524, 816, 1167
+1035 <-> 1220, 1892
+1036 <-> 91, 531, 1761
+1037 <-> 1019, 1467, 1801
+1038 <-> 1082
+1039 <-> 239, 702
+1040 <-> 1199
+1041 <-> 669, 1544, 1547, 1664
+1042 <-> 79, 1835
+1043 <-> 385, 1159, 1507
+1044 <-> 1753, 1938
+1045 <-> 374, 1175
+1046 <-> 918, 1071, 1280
+1047 <-> 1328, 1879
+1048 <-> 28, 1081, 1331, 1381
+1049 <-> 830, 1060
+1050 <-> 1166
+1051 <-> 496, 653, 820
+1052 <-> 466, 1356, 1395
+1053 <-> 1598
+1054 <-> 1054
+1055 <-> 539
+1056 <-> 1548, 1987
+1057 <-> 23
+1058 <-> 1888
+1059 <-> 164, 1423, 1493
+1060 <-> 1049, 1473
+1061 <-> 1276, 1638, 1763
+1062 <-> 1360, 1829
+1063 <-> 572
+1064 <-> 906
+1065 <-> 437, 1707, 1826
+1066 <-> 488
+1067 <-> 307, 447, 1299
+1068 <-> 1068, 1485
+1069 <-> 949
+1070 <-> 1070
+1071 <-> 1046
+1072 <-> 577, 1469
+1073 <-> 865
+1074 <-> 1161, 1927
+1075 <-> 1075
+1076 <-> 941, 1790
+1077 <-> 1971
+1078 <-> 420
+1079 <-> 677
+1080 <-> 498
+1081 <-> 1048
+1082 <-> 106, 1038, 1587
+1083 <-> 1657, 1964
+1084 <-> 1125
+1085 <-> 707, 1664
+1086 <-> 79, 1155
+1087 <-> 753
+1088 <-> 678, 799
+1089 <-> 680, 1162, 1317, 1654
+1090 <-> 1344, 1934
+1091 <-> 15, 691, 1561, 1653, 1895, 1932
+1092 <-> 1927
+1093 <-> 797, 1265
+1094 <-> 982, 1094, 1184
+1095 <-> 892, 1868, 1956
+1096 <-> 107
+1097 <-> 66, 1601
+1098 <-> 857
+1099 <-> 361, 492, 1199, 1930
+1100 <-> 94, 298, 605, 1966
+1101 <-> 331, 685, 1757
+1102 <-> 584, 729, 1791
+1103 <-> 1103
+1104 <-> 71
+1105 <-> 123, 1818
+1106 <-> 126
+1107 <-> 1107
+1108 <-> 386, 1824
+1109 <-> 322, 1668
+1110 <-> 801, 1355, 1397, 1898
+1111 <-> 733, 1790
+1112 <-> 674
+1113 <-> 195
+1114 <-> 299
+1115 <-> 1345
+1116 <-> 886, 1178
+1117 <-> 214, 790
+1118 <-> 72, 679
+1119 <-> 140
+1120 <-> 735, 1120
+1121 <-> 1121
+1122 <-> 1497
+1123 <-> 38, 942
+1124 <-> 1627
+1125 <-> 728, 1084, 1125
+1126 <-> 72
+1127 <-> 511, 1349
+1128 <-> 1923
+1129 <-> 370
+1130 <-> 323
+1131 <-> 1320, 1677, 1732
+1132 <-> 210
+1133 <-> 973
+1134 <-> 1522, 1554
+1135 <-> 1135
+1136 <-> 292, 303
+1137 <-> 416, 657, 745
+1138 <-> 1282
+1139 <-> 809, 1032
+1140 <-> 968, 1220
+1141 <-> 120, 737, 831
+1142 <-> 1699
+1143 <-> 1453
+1144 <-> 228
+1145 <-> 524
+1146 <-> 1526
+1147 <-> 534
+1148 <-> 451
+1149 <-> 70, 404, 893
+1150 <-> 448, 1364, 1551
+1151 <-> 34, 725, 1773
+1152 <-> 576, 1685
+1153 <-> 75
+1154 <-> 838, 1761
+1155 <-> 1086
+1156 <-> 186, 1289, 1481
+1157 <-> 817
+1158 <-> 234, 969
+1159 <-> 37, 597, 1043, 1920
+1160 <-> 837
+1161 <-> 1074, 1472
+1162 <-> 1089
+1163 <-> 1390
+1164 <-> 1438, 1760
+1165 <-> 911, 1442, 1571
+1166 <-> 462, 1050, 1304, 1511
+1167 <-> 65, 106, 1034
+1168 <-> 1322, 1645
+1169 <-> 54
+1170 <-> 541, 1939
+1171 <-> 1547
+1172 <-> 184
+1173 <-> 1466
+1174 <-> 223, 394, 1245, 1951
+1175 <-> 330, 589, 1045, 1742
+1176 <-> 286, 1316, 1388
+1177 <-> 721
+1178 <-> 1116, 1463
+1179 <-> 121, 271, 930, 964
+1180 <-> 292, 329, 684
+1181 <-> 1702
+1182 <-> 1182, 1529
+1183 <-> 1679
+1184 <-> 134, 191, 1094, 1270
+1185 <-> 1365, 1736
+1186 <-> 979, 1251, 1301, 1560
+1187 <-> 177, 1238, 1863
+1188 <-> 1189, 1932
+1189 <-> 497, 1188
+1190 <-> 776, 1279
+1191 <-> 236
+1192 <-> 1398
+1193 <-> 1001
+1194 <-> 1194, 1838
+1195 <-> 856
+1196 <-> 1198, 1986
+1197 <-> 1380
+1198 <-> 1196, 1198, 1459
+1199 <-> 428, 898, 1040, 1099
+1200 <-> 946, 1556, 1583
+1201 <-> 460
+1202 <-> 1407
+1203 <-> 240, 1958
+1204 <-> 1753
+1205 <-> 371, 865, 1703
+1206 <-> 154
+1207 <-> 1030, 1882
+1208 <-> 667, 1533, 1685
+1209 <-> 463, 717
+1210 <-> 700, 1306, 1766
+1211 <-> 187, 425, 1755
+1212 <-> 472, 1851
+1213 <-> 96, 263, 1213
+1214 <-> 89, 237
+1215 <-> 710, 871, 1552
+1216 <-> 434
+1217 <-> 356, 376
+1218 <-> 800, 914
+1219 <-> 668, 1730
+1220 <-> 1035, 1140
+1221 <-> 452, 841, 948
+1222 <-> 909, 1491
+1223 <-> 627, 1452
+1224 <-> 1224, 1408, 1436, 1734
+1225 <-> 1693
+1226 <-> 75
+1227 <-> 739, 1479, 1889
+1228 <-> 38
+1229 <-> 303, 448
+1230 <-> 571
+1231 <-> 354, 633
+1232 <-> 1918
+1233 <-> 1233
+1234 <-> 1721
+1235 <-> 1029
+1236 <-> 1236
+1237 <-> 577, 848
+1238 <-> 1187, 1676
+1239 <-> 1239, 1426
+1240 <-> 82
+1241 <-> 73
+1242 <-> 1010, 1558, 1841, 1872, 1951
+1243 <-> 7, 720
+1244 <-> 622, 1503
+1245 <-> 49, 1174
+1246 <-> 747
+1247 <-> 1511, 1743
+1248 <-> 808, 1321
+1249 <-> 973
+1250 <-> 56, 493, 1973
+1251 <-> 1186
+1252 <-> 114, 1428
+1253 <-> 521, 1510
+1254 <-> 1677
+1255 <-> 1377
+1256 <-> 549, 1256
+1257 <-> 202
+1258 <-> 1258
+1259 <-> 1901
+1260 <-> 626, 824
+1261 <-> 864, 1977
+1262 <-> 475
+1263 <-> 146, 950, 1295, 1424
+1264 <-> 525
+1265 <-> 1027, 1093
+1266 <-> 849, 1275, 1385
+1267 <-> 208, 546, 1716, 1940
+1268 <-> 261
+1269 <-> 799
+1270 <-> 1184
+1271 <-> 343
+1272 <-> 624
+1273 <-> 1336, 1667, 1737, 1756
+1274 <-> 437
+1275 <-> 997, 1266, 1275
+1276 <-> 1061, 1729
+1277 <-> 1324
+1278 <-> 617, 1541
+1279 <-> 425, 1190
+1280 <-> 1046, 1891
+1281 <-> 1695
+1282 <-> 1138, 1815
+1283 <-> 1283
+1284 <-> 516
+1285 <-> 1679
+1286 <-> 1001, 1415, 1767
+1287 <-> 519, 1629, 1871, 1960
+1288 <-> 416, 743
+1289 <-> 1156, 1465, 1693
+1290 <-> 15
+1291 <-> 1433
+1292 <-> 521, 1925
+1293 <-> 177
+1294 <-> 50, 271, 1852
+1295 <-> 6, 1263
+1296 <-> 1679
+1297 <-> 1615, 1973
+1298 <-> 609, 768
+1299 <-> 780, 891, 1067, 1509, 1880
+1300 <-> 730, 770
+1301 <-> 1186
+1302 <-> 542, 668
+1303 <-> 11
+1304 <-> 1166, 1717
+1305 <-> 1305
+1306 <-> 1210
+1307 <-> 1442
+1308 <-> 411, 745
+1309 <-> 305
+1310 <-> 419
+1311 <-> 722
+1312 <-> 1596, 1854
+1313 <-> 20, 1894
+1314 <-> 830
+1315 <-> 288, 367, 1617
+1316 <-> 750, 769, 1176
+1317 <-> 233, 1089
+1318 <-> 1671
+1319 <-> 460, 1364, 1379
+1320 <-> 1131
+1321 <-> 1248
+1322 <-> 1168, 1400
+1323 <-> 1449
+1324 <-> 345, 1277, 1441
+1325 <-> 277, 1640, 1895
+1326 <-> 534, 1673
+1327 <-> 352, 439, 1327, 1411, 1776
+1328 <-> 1047
+1329 <-> 500
+1330 <-> 1832
+1331 <-> 1048, 1450
+1332 <-> 1682, 1829, 1857
+1333 <-> 1433, 1813
+1334 <-> 1397
+1335 <-> 445, 1491
+1336 <-> 406, 1273
+1337 <-> 213, 1002
+1338 <-> 83, 101, 222, 1926
+1339 <-> 990
+1340 <-> 159, 740
+1341 <-> 818
+1342 <-> 758
+1343 <-> 536, 1735
+1344 <-> 119, 1090
+1345 <-> 1115, 1345
+1346 <-> 1494
+1347 <-> 1373, 1569
+1348 <-> 615, 1001, 1506
+1349 <-> 54, 1127, 1728
+1350 <-> 330, 919
+1351 <-> 1488, 1870
+1352 <-> 85, 810
+1353 <-> 807, 819
+1354 <-> 327, 1354
+1355 <-> 312, 1110
+1356 <-> 1052, 1368
+1357 <-> 1888
+1358 <-> 876
+1359 <-> 747, 803
+1360 <-> 126, 1062, 1954
+1361 <-> 1361, 1403
+1362 <-> 133, 570
+1363 <-> 447, 591
+1364 <-> 1150, 1319
+1365 <-> 1185
+1366 <-> 425
+1367 <-> 777, 1712
+1368 <-> 1356, 1419
+1369 <-> 469
+1370 <-> 178
+1371 <-> 1658
+1372 <-> 1372, 1451, 1871
+1373 <-> 69, 1347
+1374 <-> 1492
+1375 <-> 971, 1586, 1978
+1376 <-> 594, 1630
+1377 <-> 599, 1255
+1378 <-> 583, 1517
+1379 <-> 1319
+1380 <-> 67, 166, 476, 1197, 1709
+1381 <-> 179, 701, 1048
+1382 <-> 1382
+1383 <-> 1752
+1384 <-> 88, 790, 1632, 1746, 1775
+1385 <-> 348, 1266
+1386 <-> 577
+1387 <-> 1387
+1388 <-> 1176
+1389 <-> 1995
+1390 <-> 331, 1163
+1391 <-> 255, 481, 748
+1392 <-> 72, 190
+1393 <-> 926
+1394 <-> 95, 480, 1616, 1663
+1395 <-> 782, 1052
+1396 <-> 1450
+1397 <-> 1110, 1334
+1398 <-> 174, 629, 1192
+1399 <-> 1995
+1400 <-> 1322
+1401 <-> 744
+1402 <-> 1, 1402
+1403 <-> 1361
+1404 <-> 420, 935
+1405 <-> 1677
+1406 <-> 518, 1406
+1407 <-> 1202, 1826
+1408 <-> 1224
+1409 <-> 652, 1461
+1410 <-> 536, 812
+1411 <-> 1327, 1418
+1412 <-> 198
+1413 <-> 1655, 1974
+1414 <-> 620
+1415 <-> 1286
+1416 <-> 648
+1417 <-> 1417, 1437, 1884
+1418 <-> 121, 834, 1411
+1419 <-> 415, 1368, 1456
+1420 <-> 927, 1534
+1421 <-> 1755
+1422 <-> 1422
+1423 <-> 687, 1059, 1768
+1424 <-> 1263, 1499, 1968
+1425 <-> 985
+1426 <-> 171, 473, 1239
+1427 <-> 270
+1428 <-> 1252
+1429 <-> 479
+1430 <-> 514, 539, 981, 1621
+1431 <-> 1014
+1432 <-> 35, 1704, 1990
+1433 <-> 1291, 1333
+1434 <-> 1904
+1435 <-> 636, 1435
+1436 <-> 1224, 1963
+1437 <-> 940, 1417
+1438 <-> 1164
+1439 <-> 1868
+1440 <-> 1752
+1441 <-> 1324
+1442 <-> 1165, 1307, 1701, 1850, 1875
+1443 <-> 1443, 1692
+1444 <-> 341, 714
+1445 <-> 1011, 1590
+1446 <-> 1446
+1447 <-> 217, 418
+1448 <-> 237, 1625, 1789
+1449 <-> 127, 1323
+1450 <-> 1331, 1396
+1451 <-> 978, 1372
+1452 <-> 1223, 1711
+1453 <-> 42, 819, 1143
+1454 <-> 497
+1455 <-> 1743, 1849
+1456 <-> 1419
+1457 <-> 867
+1458 <-> 625, 914
+1459 <-> 1198
+1460 <-> 889
+1461 <-> 814, 1409
+1462 <-> 796
+1463 <-> 1178
+1464 <-> 109, 140, 145, 174, 580, 1467
+1465 <-> 1289
+1466 <-> 370, 1173, 1863
+1467 <-> 1037, 1464
+1468 <-> 1468
+1469 <-> 394, 893, 1072
+1470 <-> 1758
+1471 <-> 79
+1472 <-> 22, 1161, 1721
+1473 <-> 153, 622, 1060
+1474 <-> 654, 1744
+1475 <-> 1919
+1476 <-> 225, 711, 1662, 1684, 1856
+1477 <-> 482, 1528
+1478 <-> 736, 889
+1479 <-> 612, 1227, 1774
+1480 <-> 203, 698
+1481 <-> 649, 1156, 1846
+1482 <-> 189, 1962
+1483 <-> 1483
+1484 <-> 317
+1485 <-> 272, 1068
+1486 <-> 915
+1487 <-> 1816
+1488 <-> 246, 1351
+1489 <-> 109, 1489
+1490 <-> 68
+1491 <-> 178, 409, 1222, 1335
+1492 <-> 565, 998, 1374, 1492
+1493 <-> 1059
+1494 <-> 416, 1346, 1848
+1495 <-> 462
+1496 <-> 301, 1660
+1497 <-> 1122, 1577
+1498 <-> 89, 688, 948
+1499 <-> 1424
+1500 <-> 7, 596
+1501 <-> 468
+1502 <-> 344, 374, 1631
+1503 <-> 515, 1244, 1524
+1504 <-> 779
+1505 <-> 375, 1980
+1506 <-> 1348
+1507 <-> 157, 185, 884, 1043
+1508 <-> 1511
+1509 <-> 282, 835, 1299
+1510 <-> 511, 1253
+1511 <-> 1166, 1247, 1508
+1512 <-> 142
+1513 <-> 461
+1514 <-> 601, 711, 1553
+1515 <-> 209, 1739
+1516 <-> 774
+1517 <-> 1378
+1518 <-> 1518
+1519 <-> 674, 1519
+1520 <-> 989
+1521 <-> 503, 961
+1522 <-> 662, 1134, 1998
+1523 <-> 95, 731, 1783
+1524 <-> 290, 1503, 1741
+1525 <-> 295, 453
+1526 <-> 881, 1146
+1527 <-> 1741
+1528 <-> 1477, 1824
+1529 <-> 1182
+1530 <-> 498, 521, 888
+1531 <-> 1660
+1532 <-> 706, 981, 1532
+1533 <-> 167, 1208
+1534 <-> 1420
+1535 <-> 378
+1536 <-> 110, 138, 650, 1897, 1901
+1537 <-> 14
+1538 <-> 114, 1552
+1539 <-> 1640
+1540 <-> 1540, 1896
+1541 <-> 1278
+1542 <-> 412, 1944
+1543 <-> 1543
+1544 <-> 1041
+1545 <-> 766, 1640
+1546 <-> 1546
+1547 <-> 1041, 1171
+1548 <-> 387, 1056, 1567
+1549 <-> 1878
+1550 <-> 827, 968
+1551 <-> 66, 920, 1150
+1552 <-> 1215, 1538
+1553 <-> 763, 1514
+1554 <-> 124, 1134
+1555 <-> 442
+1556 <-> 60, 98, 1200
+1557 <-> 48, 696
+1558 <-> 1242
+1559 <-> 1668
+1560 <-> 155, 355, 437, 1186
+1561 <-> 268, 642, 1091, 1976
+1562 <-> 117, 434, 588, 1579
+1563 <-> 182, 379, 501
+1564 <-> 979
+1565 <-> 1565
+1566 <-> 527, 754
+1567 <-> 1548
+1568 <-> 427, 1997
+1569 <-> 929, 1347, 1579
+1570 <-> 177, 386
+1571 <-> 176, 744, 1165
+1572 <-> 1572
+1573 <-> 195, 199
+1574 <-> 318, 1912
+1575 <-> 844, 929
+1576 <-> 141, 1652
+1577 <-> 1497, 1998
+1578 <-> 1776
+1579 <-> 1020, 1562, 1569
+1580 <-> 626
+1581 <-> 591, 1591
+1582 <-> 723, 1972
+1583 <-> 603, 1200
+1584 <-> 362, 1639
+1585 <-> 605
+1586 <-> 742, 1375, 1945
+1587 <-> 1082
+1588 <-> 588, 967
+1589 <-> 645, 1919
+1590 <-> 606, 1445
+1591 <-> 1581, 1641
+1592 <-> 899, 1592
+1593 <-> 1868
+1594 <-> 893, 1878
+1595 <-> 699
+1596 <-> 1312, 1627, 1974
+1597 <-> 1720, 1961
+1598 <-> 867, 1053, 1719
+1599 <-> 669
+1600 <-> 106
+1601 <-> 1097, 1681
+1602 <-> 414, 1687
+1603 <-> 1605
+1604 <-> 983
+1605 <-> 767, 806, 982, 1603
+1606 <-> 303
+1607 <-> 1607, 1847
+1608 <-> 1975
+1609 <-> 267, 1778
+1610 <-> 396
+1611 <-> 842
+1612 <-> 188, 1877
+1613 <-> 64, 345
+1614 <-> 361
+1615 <-> 626, 1297
+1616 <-> 1394
+1617 <-> 28, 1315
+1618 <-> 470, 812, 1031
+1619 <-> 215, 796
+1620 <-> 921
+1621 <-> 1430, 1764
+1622 <-> 989
+1623 <-> 1761
+1624 <-> 51, 403
+1625 <-> 1448
+1626 <-> 90, 747, 901, 1943, 1985
+1627 <-> 14, 1124, 1596
+1628 <-> 217, 523
+1629 <-> 994, 1287
+1630 <-> 8, 1376
+1631 <-> 1502
+1632 <-> 401, 1384, 1697
+1633 <-> 614, 957
+1634 <-> 662, 959
+1635 <-> 249, 1793
+1636 <-> 568
+1637 <-> 839
+1638 <-> 910, 1061
+1639 <-> 1584, 1730
+1640 <-> 1325, 1539, 1545
+1641 <-> 1591
+1642 <-> 16
+1643 <-> 139
+1644 <-> 1644, 1900
+1645 <-> 330, 1168
+1646 <-> 727
+1647 <-> 438, 1647
+1648 <-> 510, 676, 1722
+1649 <-> 398
+1650 <-> 906, 916, 922, 1914
+1651 <-> 1769
+1652 <-> 755, 1576
+1653 <-> 1091
+1654 <-> 1089
+1655 <-> 1413
+1656 <-> 273
+1657 <-> 1083
+1658 <-> 294, 344, 1371, 1740
+1659 <-> 1688, 1805
+1660 <-> 1496, 1531, 1948
+1661 <-> 1749
+1662 <-> 1476, 1979
+1663 <-> 1394
+1664 <-> 1041, 1085
+1665 <-> 53
+1666 <-> 589
+1667 <-> 1273, 1853
+1668 <-> 871, 1109, 1559
+1669 <-> 1931
+1670 <-> 449, 1832
+1671 <-> 86, 1015, 1318, 1671
+1672 <-> 685, 1861
+1673 <-> 1326, 1747
+1674 <-> 586, 1812
+1675 <-> 759
+1676 <-> 340, 610, 1238, 1676
+1677 <-> 1131, 1254, 1405, 1784
+1678 <-> 333, 357
+1679 <-> 655, 1183, 1285, 1296, 1745
+1680 <-> 737
+1681 <-> 61, 1601
+1682 <-> 486, 673, 1332
+1683 <-> 846, 1766, 1773
+1684 <-> 1476
+1685 <-> 1152, 1208
+1686 <-> 875
+1687 <-> 1602, 1687
+1688 <-> 363, 478, 1659, 1860
+1689 <-> 724
+1690 <-> 2
+1691 <-> 1691
+1692 <-> 1443, 1707
+1693 <-> 678, 1225, 1289
+1694 <-> 261, 269
+1695 <-> 705, 1281
+1696 <-> 814
+1697 <-> 1632
+1698 <-> 982
+1699 <-> 135, 818, 965, 1142
+1700 <-> 501
+1701 <-> 103, 1442
+1702 <-> 966, 1181
+1703 <-> 1205, 1958
+1704 <-> 1432
+1705 <-> 280
+1706 <-> 1706
+1707 <-> 1065, 1692
+1708 <-> 454, 722
+1709 <-> 297, 1380
+1710 <-> 1710
+1711 <-> 1452
+1712 <-> 1367
+1713 <-> 1713
+1714 <-> 622, 1817
+1715 <-> 444, 468
+1716 <-> 171, 862, 1267
+1717 <-> 314, 1304, 1873
+1718 <-> 767, 875, 1738
+1719 <-> 500, 1598
+1720 <-> 1597
+1721 <-> 1234, 1472
+1722 <-> 487, 1648
+1723 <-> 868
+1724 <-> 864, 1757
+1725 <-> 814
+1726 <-> 3
+1727 <-> 168
+1728 <-> 193, 305, 1349
+1729 <-> 951, 1276
+1730 <-> 431, 568, 1219, 1639
+1731 <-> 450
+1732 <-> 1131
+1733 <-> 646, 1733
+1734 <-> 1224
+1735 <-> 1343
+1736 <-> 1028, 1185
+1737 <-> 335, 879, 1273
+1738 <-> 1718
+1739 <-> 372, 1515
+1740 <-> 1658
+1741 <-> 1524, 1527, 1818
+1742 <-> 1175
+1743 <-> 609, 624, 1247, 1455
+1744 <-> 1474
+1745 <-> 889, 1679
+1746 <-> 1384
+1747 <-> 14, 887, 1673
+1748 <-> 12, 1748
+1749 <-> 258, 1661, 1907, 1921
+1750 <-> 536, 727
+1751 <-> 907
+1752 <-> 858, 1383, 1440
+1753 <-> 1044, 1204
+1754 <-> 553, 833, 863
+1755 <-> 1211, 1421
+1756 <-> 173, 1273
+1757 <-> 1101, 1724
+1758 <-> 25, 554, 596, 1470
+1759 <-> 424
+1760 <-> 1164, 1793
+1761 <-> 1036, 1154, 1623
+1762 <-> 73, 855, 864
+1763 <-> 1061
+1764 <-> 204, 1621
+1765 <-> 912, 1765
+1766 <-> 562, 811, 1210, 1683
+1767 <-> 319, 991, 1286
+1768 <-> 440, 1423
+1769 <-> 5, 390, 1651
+1770 <-> 284, 392
+1771 <-> 858
+1772 <-> 788, 862
+1773 <-> 487, 1151, 1683, 1773
+1774 <-> 33, 1479
+1775 <-> 974, 1384, 1775, 1935
+1776 <-> 1327, 1578
+1777 <-> 1958
+1778 <-> 280, 442, 1609
+1779 <-> 270, 773
+1780 <-> 26, 1983
+1781 <-> 353, 866
+1782 <-> 738, 779, 1991
+1783 <-> 130, 1523
+1784 <-> 1677, 1784
+1785 <-> 332
+1786 <-> 1947
+1787 <-> 1814, 1845
+1788 <-> 90
+1789 <-> 290, 798, 1448
+1790 <-> 160, 429, 1076, 1111, 1998
+1791 <-> 1102
+1792 <-> 601
+1793 <-> 1635, 1760
+1794 <-> 210, 1972
+1795 <-> 18, 694
+1796 <-> 1889, 1915
+1797 <-> 111
+1798 <-> 607, 1798
+1799 <-> 426
+1800 <-> 687
+1801 <-> 1037
+1802 <-> 1821
+1803 <-> 585
+1804 <-> 278
+1805 <-> 1659
+1806 <-> 1806
+1807 <-> 821, 1017
+1808 <-> 937
+1809 <-> 23, 620
+1810 <-> 792
+1811 <-> 478, 1865
+1812 <-> 1674
+1813 <-> 178, 1333
+1814 <-> 783, 1787
+1815 <-> 118, 484, 1282
+1816 <-> 39, 380, 554, 634, 1487
+1817 <-> 168, 1714
+1818 <-> 1105, 1741, 1910, 1948, 1972
+1819 <-> 894
+1820 <-> 343
+1821 <-> 135, 572, 1802
+1822 <-> 791, 976
+1823 <-> 1023
+1824 <-> 1108, 1528
+1825 <-> 675
+1826 <-> 1065, 1407, 1936
+1827 <-> 615
+1828 <-> 1828
+1829 <-> 321, 1062, 1332
+1830 <-> 506
+1831 <-> 667
+1832 <-> 1330, 1670
+1833 <-> 374, 542
+1834 <-> 973
+1835 <-> 1042
+1836 <-> 479, 1836
+1837 <-> 199
+1838 <-> 1194
+1839 <-> 731
+1840 <-> 1840
+1841 <-> 528, 1242
+1842 <-> 1895
+1843 <-> 167
+1844 <-> 174, 1964
+1845 <-> 19, 672, 866, 1787
+1846 <-> 247, 1481
+1847 <-> 253, 465, 1607
+1848 <-> 603, 842, 1494
+1849 <-> 231, 1455
+1850 <-> 456, 1442
+1851 <-> 933, 1212
+1852 <-> 1294
+1853 <-> 1667
+1854 <-> 693, 1312
+1855 <-> 293, 1925
+1856 <-> 1476
+1857 <-> 1332
+1858 <-> 1858
+1859 <-> 139, 275
+1860 <-> 1688, 1994
+1861 <-> 1672
+1862 <-> 1938
+1863 <-> 1187, 1466
+1864 <-> 344
+1865 <-> 312, 1811
+1866 <-> 781, 908
+1867 <-> 983
+1868 <-> 1095, 1439, 1593
+1869 <-> 722
+1870 <-> 962, 1351, 1899
+1871 <-> 1287, 1372
+1872 <-> 717, 1242
+1873 <-> 209, 488, 1717
+1874 <-> 197
+1875 <-> 471, 660, 1442
+1876 <-> 788
+1877 <-> 1612
+1878 <-> 604, 1549, 1594
+1879 <-> 154, 1047, 1949
+1880 <-> 1299
+1881 <-> 631, 917, 984
+1882 <-> 759, 1207, 1882
+1883 <-> 102
+1884 <-> 1417
+1885 <-> 29
+1886 <-> 46, 718, 1886
+1887 <-> 657
+1888 <-> 232, 808, 876, 1058, 1357, 1989
+1889 <-> 1227, 1796, 1889
+1890 <-> 576
+1891 <-> 516, 583, 931, 1280
+1892 <-> 132, 1035
+1893 <-> 440
+1894 <-> 478, 617, 1313
+1895 <-> 1091, 1325, 1842
+1896 <-> 1540
+1897 <-> 71, 1536
+1898 <-> 1110
+1899 <-> 613, 1870
+1900 <-> 1644
+1901 <-> 704, 1259, 1536
+1902 <-> 1902
+1903 <-> 864
+1904 <-> 639, 1434
+1905 <-> 41, 757
+1906 <-> 390
+1907 <-> 1749
+1908 <-> 766
+1909 <-> 997
+1910 <-> 1818
+1911 <-> 665, 1911
+1912 <-> 244, 328, 590, 761, 1574
+1913 <-> 426
+1914 <-> 428, 1650, 1941
+1915 <-> 1796
+1916 <-> 260, 1924
+1917 <-> 1917
+1918 <-> 235, 1232
+1919 <-> 919, 1475, 1589
+1920 <-> 230, 1159
+1921 <-> 784, 1749
+1922 <-> 9, 1928
+1923 <-> 347, 1128, 1923
+1924 <-> 121, 1916
+1925 <-> 1292, 1855
+1926 <-> 43, 1338
+1927 <-> 113, 635, 1074, 1092
+1928 <-> 1922
+1929 <-> 945
+1930 <-> 1099
+1931 <-> 914, 1669
+1932 <-> 200, 874, 1091, 1188
+1933 <-> 828
+1934 <-> 1090
+1935 <-> 1775
+1936 <-> 1826
+1937 <-> 811
+1938 <-> 23, 1044, 1862
+1939 <-> 1170
+1940 <-> 136, 250, 1267
+1941 <-> 1914
+1942 <-> 197, 612
+1943 <-> 226, 788, 1626
+1944 <-> 48, 445, 1542
+1945 <-> 995, 1586
+1946 <-> 574
+1947 <-> 828, 876, 1786
+1948 <-> 654, 1660, 1818
+1949 <-> 478, 1879
+1950 <-> 263
+1951 <-> 822, 1174, 1242
+1952 <-> 239
+1953 <-> 190
+1954 <-> 1360
+1955 <-> 701, 1006
+1956 <-> 138, 715, 1095
+1957 <-> 925
+1958 <-> 1203, 1703, 1777
+1959 <-> 1959
+1960 <-> 1287
+1961 <-> 202, 574, 1597
+1962 <-> 489, 1482
+1963 <-> 1436
+1964 <-> 443, 1083, 1844
+1965 <-> 639
+1966 <-> 1100
+1967 <-> 674
+1968 <-> 1424
+1969 <-> 354
+1970 <-> 169, 1002
+1971 <-> 1077, 1971
+1972 <-> 252, 530, 1582, 1794, 1818
+1973 <-> 1250, 1297
+1974 <-> 1413, 1596
+1975 <-> 261, 1608
+1976 <-> 1561
+1977 <-> 321, 923, 1261
+1978 <-> 843, 977, 1375
+1979 <-> 547, 1662
+1980 <-> 276, 1505
+1981 <-> 403
+1982 <-> 69, 907
+1983 <-> 273, 1780
+1984 <-> 20, 627, 980
+1985 <-> 80, 400, 1626
+1986 <-> 1196
+1987 <-> 894, 1033, 1056
+1988 <-> 548
+1989 <-> 326, 358, 1888
+1990 <-> 1432, 1990
+1991 <-> 924, 1782
+1992 <-> 80
+1993 <-> 31, 867
+1994 <-> 1860
+1995 <-> 301, 1389, 1399
+1996 <-> 968
+1997 <-> 952, 1568
+1998 <-> 1522, 1577, 1790
+1999 <-> 308, 799, 1013
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/data/2017/13.txt	Tue Dec 03 20:15:07 2019 -0500
@@ -0,0 +1,44 @@
+0: 5
+1: 2
+2: 3
+4: 4
+6: 6
+8: 4
+10: 8
+12: 6
+14: 6
+16: 14
+18: 6
+20: 8
+22: 8
+24: 10
+26: 8
+28: 8
+30: 10
+32: 8
+34: 12
+36: 9
+38: 20
+40: 12
+42: 12
+44: 12
+46: 12
+48: 12
+50: 12
+52: 12
+54: 12
+56: 14
+58: 14
+60: 14
+62: 20
+64: 14
+66: 14
+70: 14
+72: 14
+74: 14
+76: 14
+78: 14
+80: 12
+90: 30
+92: 17
+94: 18
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/data/2019/02.txt	Tue Dec 03 20:15:07 2019 -0500
@@ -0,0 +1,1 @@
+1,0,0,3,1,1,2,3,1,3,4,3,1,5,0,3,2,1,13,19,1,9,19,23,2,13,23,27,2,27,13,31,2,31,10,35,1,6,35,39,1,5,39,43,1,10,43,47,1,5,47,51,1,13,51,55,2,55,9,59,1,6,59,63,1,13,63,67,1,6,67,71,1,71,10,75,2,13,75,79,1,5,79,83,2,83,6,87,1,6,87,91,1,91,13,95,1,95,13,99,2,99,13,103,1,103,5,107,2,107,10,111,1,5,111,115,1,2,115,119,1,119,6,0,99,2,0,14,0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/data/2019/03.txt	Tue Dec 03 20:15:07 2019 -0500
@@ -0,0 +1,2 @@
+R992,U284,L447,D597,R888,D327,R949,U520,R27,U555,L144,D284,R538,U249,R323,U297,R136,U838,L704,D621,R488,U856,R301,U539,L701,U363,R611,D94,L734,D560,L414,U890,R236,D699,L384,D452,R702,D637,L164,U410,R649,U901,L910,D595,R339,D346,R959,U777,R218,D667,R534,D762,R484,D914,L25,U959,R984,D922,R612,U999,L169,D599,L604,D357,L217,D327,L730,D949,L565,D332,L114,D512,R460,D495,L187,D697,R313,U319,L8,D915,L518,D513,R738,U9,R137,U542,L188,U440,R576,D307,R734,U58,R285,D401,R166,U156,L859,U132,L10,U753,L933,U915,R459,D50,R231,D166,L253,U844,R585,D871,L799,U53,R785,U336,R622,D108,R555,D918,L217,D668,L220,U738,L997,D998,R964,D456,L54,U930,R985,D244,L613,D116,L994,D20,R949,D245,L704,D564,L210,D13,R998,U951,L482,U579,L793,U680,L285,U770,L975,D54,R79,U613,L907,U467,L256,D783,R883,U810,R409,D508,L898,D286,L40,U741,L759,D549,R210,U411,R638,D643,L784,U538,L739,U771,L773,U491,L303,D425,L891,U182,R412,U951,L381,U501,R482,D625,R870,D320,L464,U555,R566,D781,L540,D754,L211,U73,L321,D869,R994,D177,R496,U383,R911,U819,L651,D774,L591,U666,L883,U767,R232,U822,L499,U44,L45,U873,L98,D487,L47,U803,R855,U256,R567,D88,R138,D678,L37,U38,R783,U569,L646,D261,L597,U275,L527,U48,R433,D324,L631,D160,L145,D128,R894,U223,R664,U510,R756,D700,R297,D361,R837,U996,L769,U813,L477,U420,L172,U482,R891,D379,L329,U55,R284,U155,L816,U659,L671,U996,R997,U252,R514,D718,L661,D625,R910,D960,L39,U610,R853,U859,R174,U215,L603,U745,L587,D736,R365,U78,R306,U158,L813,U885,R558,U631,L110,D232,L519,D366,R909,D10,R294
+L1001,D833,L855,D123,R36,U295,L319,D700,L164,U576,L68,D757,R192,D738,L640,D660,R940,D778,R888,U772,R771,U900,L188,D464,L572,U184,R889,D991,L961,U751,R560,D490,L887,D748,R37,U910,L424,D401,L385,U415,L929,U193,R710,D855,L596,D323,L966,D505,L422,D139,L108,D135,R737,U176,R538,D173,R21,D951,R949,D61,L343,U704,R127,U468,L240,D834,L858,D127,R328,D863,R329,U477,R131,U864,R997,D38,R418,U611,R28,U705,R148,D414,R786,U264,L785,D650,R201,D250,R528,D910,R670,U309,L658,U190,R704,U21,R288,D7,R930,U62,R782,U621,R328,D725,R305,U700,R494,D137,R969,U142,L867,U577,R300,U162,L13,D698,R333,U865,R941,U796,L60,U902,L784,U832,R78,D578,R196,D390,R728,D922,R858,D994,L457,U547,R238,D345,R329,D498,R873,D212,R501,U474,L657,U910,L335,U133,R213,U417,R698,U829,L2,U704,L273,D83,R231,D247,R675,D23,L692,D472,L325,D659,L408,U746,L715,U395,L596,U296,R52,D849,L713,U815,R684,D551,L319,U768,R176,D182,R557,U731,R314,D543,L9,D256,R38,D809,L567,D332,R375,D572,R81,D479,L71,U968,L831,D247,R989,U390,R463,D576,R740,D539,R488,U367,L596,U375,L763,D824,R70,U448,R979,D977,L744,D379,R488,D671,L516,D334,L542,U517,L488,D390,L713,D932,L28,U924,L448,D229,L488,D501,R19,D910,L979,D411,R711,D824,L973,U291,R794,D485,R208,U370,R655,U450,L40,D804,L374,D671,R962,D829,L209,U111,L84,D876,L832,D747,L733,D560,L702,D972,R188,U817,L111,U26,L492,U485,L71,D59,L269,D870,L152,U539,R65,D918,L932,D260,L485,U77,L699,U254,R924,U643,L264,U96,R395,D917,R360,U354,R101,D682,R854,U450,L376,D378,R872,D311,L881,U630,R77,D766,R672
--- a/package.lisp	Sun Dec 01 16:01:05 2019 -0500
+++ b/package.lisp	Tue Dec 03 20:15:07 2019 -0500
@@ -7,9 +7,15 @@
     :read-lines
     :read-lines-of-words
     :read-lines-of-numbers-and-garbage
+    :read-numbers
+    :read-numbers-from-string
+    :read-comma-separated-values
 
     :ensure-string
     :ensure-stream
+    :ensure-keyword
+
+    :returning
 
     :char-invertcase
     :emptyp
@@ -20,10 +26,14 @@
     :integral-range
     :manhattan-distance
     :manhattan-neighbors
+    :x
+    :y
     :nth-digit
     :unique
     :positions-if
     :digits
+    :fresh-vector
+    :let-result
 
     :ring
     :ring-prev
--- a/src/2017/day-05.lisp	Sun Dec 01 16:01:05 2019 -0500
+++ b/src/2017/day-05.lisp	Tue Dec 03 20:15:07 2019 -0500
@@ -1,14 +1,9 @@
 (defpackage :advent/2017/05 #.cl-user::*advent-use*)
 (in-package :advent/2017/05)
 
-(defun fresh-simple-vector (sequence)
-  (if (typep sequence 'simple-vector)
-    (copy-seq sequence)
-    (coerce sequence 'simple-vector)))
-
 (defun compute (data modification-function)
   (iterate
-    (with maze = (fresh-simple-vector data))
+    (with maze = (fresh-vector data))
     (with bound = (1- (length maze)))
     (with address = 0)
     (while (<= 0 address bound))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/2017/day-10.lisp	Tue Dec 03 20:15:07 2019 -0500
@@ -0,0 +1,52 @@
+(defpackage :advent/2017/10 #.cl-user::*advent-use*)
+(in-package :advent/2017/10)
+
+(defun reverse-chunk (vector start length)
+  (iterate
+    (repeat (truncate length 2))
+    (for i :modulo (length vector) :from start)
+    (for j :modulo (length vector) :downfrom (+ start (1- length)))
+    (rotatef (aref vector i) (aref vector j))))
+
+(defun simple-knot-hash (lengths)
+  (iterate
+    (with numbers = (coerce (alexandria:iota 256) 'vector))
+    (with current = 0)
+    (with skip = 0)
+    (for length :in lengths)
+    (reverse-chunk numbers current length)
+    (zapf current (mod (+ % length skip) 256))
+    (incf skip)
+    (finally (return (* (aref numbers 0) (aref numbers 1))))))
+
+(defun sparse->dense (numbers)
+  (iterate
+    (for i :from 0 :by 16 :below (length numbers))
+    (collect (reduce #'logxor numbers :start i :end (+ i 16)))))
+
+(defun bytes->hex (bytes)
+  (format nil "~(~{~2,'0X~}~)" bytes))
+
+(defun initial-lengths (string)
+  (append (map 'list #'char-code string)
+          (list 17 31 73 47 23)))
+
+(defun full-knot-hash (string)
+  (iterate
+    (with lengths = (initial-lengths string))
+    (with numbers = (coerce (alexandria:iota 256) 'vector))
+    (with current = 0)
+    (with skip = 0)
+    (repeat 64)
+    (iterate
+      (for length :in lengths)
+      (reverse-chunk numbers current length)
+      (zapf current (mod (+ % length skip) 256))
+      (incf skip))
+    (finally (return (bytes->hex (sparse->dense numbers))))))
+
+(define-problem (2017 10) (data alexandria:read-stream-content-into-string) ()
+  (values
+    (simple-knot-hash (read-numbers-from-string data))
+    (full-knot-hash (str:trim data))))
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/2017/day-11.lisp	Tue Dec 03 20:15:07 2019 -0500
@@ -0,0 +1,21 @@
+(defpackage :advent/2017/11 #.cl-user::*advent-use*)
+(in-package :advent/2017/11)
+
+;; https://www.redblobgames.com/grids/hexagons/#coordinates
+
+(defun coord+ (c1 c2)
+  (map 'vector #'+ c1 c2))
+
+(defun coord- (c1 c2)
+  (map 'vector #'- c1 c2))
+
+(defun distance (c1 &optional (c2 #(0 0 0)))
+  (/ (reduce #'+ (coord- c1 c2) :key #'abs) 2))
+
+(define-problem (2017 11) (data read-comma-separated-values) (773 1560)
+  (iterate
+    (with pos = #(0 0 0))
+    (for direction :in (mapcar #'ensure-keyword data))
+    (setf pos (coord+ pos (delta direction)))
+    (maximizing (distance pos) :into furthest)
+    (finally (return (values (distance pos) furthest)))))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/2017/day-12.lisp	Tue Dec 03 20:15:07 2019 -0500
@@ -0,0 +1,36 @@
+(defpackage :advent/2017/12 #.cl-user::*advent-use*)
+(in-package :advent/2017/12)
+
+(defun parse-line (line)
+  (destructuring-bind (id others) (str:split "<->" line)
+    (list (parse-integer id)
+          (mapcar #'parse-integer (str:split #\, others)))))
+
+(defun build-graph (records)
+  (iterate
+    (with graph = (digraph:make-digraph :initial-vertices (mapcar #'car records)))
+    (for (id others) :in records)
+    (dolist (id2 others)
+      (digraph:insert-edge graph id id2))
+    (finally (return graph))))
+
+(defun connected-to (graph start)
+  (gathering
+    (digraph:mapc-depth-first #'gather graph start)))
+
+(defun count-subgraph (graph start)
+  (length (connected-to graph start)))
+
+(defun remove-subgraph (graph start)
+  (map nil (alexandria:curry #'digraph:remove-vertex graph)
+       (connected-to graph start)))
+
+(define-problem (2017 12) (data read-lines) (141 171)
+  (let ((graph (build-graph (mapcar #'parse-line data))))
+    (values
+      (count-subgraph graph 0)
+      (iterate
+        (for vertex = (digraph:arbitrary-vertex graph))
+        (while vertex)
+        (remove-subgraph graph vertex)
+        (counting t)))))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/2017/day-13.lisp	Tue Dec 03 20:15:07 2019 -0500
@@ -0,0 +1,68 @@
+(defpackage :advent/2017/13 #.cl-user::*advent-use*)
+(in-package :advent/2017/13)
+
+;; There's a magical insight that you need to get if you want to do this
+;; problem: the length of a scanner of range R is `2(R-1)`.
+;;
+;; Examples:
+;;
+;;     R = 2: S.     1
+;;            .S     2 = 2(R-1) = 2(2-1) = 2(1) = 2
+;;
+;;     R = 3: S..    1
+;;            .S.    2
+;;            ..S    3
+;;            .S.    4 = 2(R-1) = 2(3-1) = 2(2) = 4
+;;
+;;     R = 4: S...   1
+;;            .S..   2
+;;            ..S.   3
+;;            ...S   4
+;;            ..S.   5
+;;            .S..   6 = 2(R-1) = 2(4-1) = 2(3) = 6
+;;
+;; The best "intuition" I can come up with for this is:
+;;
+;; * We spend 1 turn at each end position.
+;; * We spend 2 turns at each inner position.
+;; * We have R positions, 2 of which are an end and (R-2) of which are inner.
+;; * So we have (2 * 1) + ((R-2) * 2) = 2 + 2(R-2) turns.
+;; * Factor out the 2 and simplify: 2(1 + (R-2)) = 2(R-1).
+;;
+;; Figuring out the exact position of a scanner at a given time it tricky
+;; because you need to wrap the position around properly during the second half,
+;; but we can skip that because all we care about is whether it's at zero.
+
+(defun catchesp (range time)
+  (zerop (mod time (* (1- range) 2))))
+
+(defun make-scanners (specs)
+  (iterate
+    (with scanners = (make-array (1+ (caar (last specs))) :initial-element nil))
+    (for (level range) :in specs)
+    (setf (aref scanners level) range)
+    (finally (return scanners))))
+
+(defun severity (level range)
+  (* level range))
+
+(defun traverse (scanners start-time)
+  (iterate
+    (for level :from 0)
+    (for time :from start-time)
+    (for range :in-vector scanners)
+    (for caught = (and range (catchesp range time)))
+    (oring caught :into ever-caught)
+    (when caught
+      (summing (severity level range) :into score))
+    (returning score ever-caught)))
+
+(define-problem (2017 13) (data read-lines-of-numbers-and-garbage)
+    (2604 3941460)
+  (let ((scanners (make-scanners data)))
+    (values
+      (traverse scanners 0)
+      (iterate
+        (for delay :from 0)
+        (for (values score caught) = (traverse scanners delay))
+        (finding delay :such-that (not caught))))))
--- a/src/2018/day-10.lisp	Sun Dec 01 16:01:05 2019 -0500
+++ b/src/2018/day-10.lisp	Tue Dec 03 20:15:07 2019 -0500
@@ -1,4 +1,5 @@
-(defpackage :advent/2018/10 #.cl-user::*advent-use*)
+(defpackage :advent/2018/10 #.cl-user::*advent-use*
+  (:shadow :x))
 (in-package :advent/2018/10)
 
 (defun parse-line (line)
--- a/src/2018/day-11.lisp	Sun Dec 01 16:01:05 2019 -0500
+++ b/src/2018/day-11.lisp	Tue Dec 03 20:15:07 2019 -0500
@@ -1,4 +1,5 @@
-(defpackage :advent/2018/11 #.cl-user::*advent-use*)
+(defpackage :advent/2018/11 #.cl-user::*advent-use*
+  (:shadow :x :y))
 (in-package :advent/2018/11)
 
 (defun cell (x y)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/2019/day-02.lisp	Tue Dec 03 20:15:07 2019 -0500
@@ -0,0 +1,30 @@
+(defpackage :advent/2019/02 #.cl-user::*advent-use*)
+(in-package :advent/2019/02)
+
+(defun run-intcode (memory a b)
+  (let ((memory (fresh-vector memory)))
+    (macrolet ((m (addr &rest deltas)
+                 `(aref memory (+ ,addr ,@deltas))))
+      (iterate
+        (initially (setf (m 1) a
+                         (m 2) b))
+        (with pc = 0)
+        (for op   = (m pc))
+        (for x    = (m (m pc 1)))
+        (for y    = (m (m pc 2)))
+        (for dest = (m pc 3))
+        (ecase op
+          (1 (setf (m dest) (+ x y)))
+          (2 (setf (m dest) (* x y)))
+          (99 (return (m 0))))
+        (incf pc 4)))))
+
+(define-problem (2019 2) (data read-numbers) ()
+  (values
+    (run-intcode data 12 2)
+    (iterate
+      (for-nested ((a :from 0 :to 99)
+                   (b :from 0 :to 99)))
+      (when (= 19690720 (run-intcode data a b))
+        (return (+ (* 100 a) b))))))
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/2019/day-03.lisp	Tue Dec 03 20:15:07 2019 -0500
@@ -0,0 +1,92 @@
+(defpackage :advent/2019/03 #.cl-user::*advent-use*)
+(in-package :advent/2019/03)
+
+(defun bounds (grid)
+  (multiple-value-bind (bottom top)
+      (losh:extrema #'< (alexandria:hash-table-keys grid) :key #'y)
+    (multiple-value-bind (left right)
+        (losh:extrema #'< (alexandria:hash-table-keys grid) :key #'x)
+      (values (x left)
+              (x right)
+              (y top)
+              (y bottom)))))
+
+(defun print-grid (grid)
+  (multiple-value-bind (left right top bottom) (bounds grid)
+    (iterate
+      (for y :from (1+ top) :downto (1- bottom))
+      (iterate
+        (for x :from (1- left) :to (1+ right))
+        (princ (gethash (complex x y) grid #\.)))
+      (terpri))))
+
+(defun first-character (string)
+  (aref string 0))
+
+(defun parse-path (string)
+  (gathering
+    (ppcre:do-register-groups
+        ((#'first-character direction) (#'parse-integer distance))
+        ("([UDLR])(\\d+)" string)
+      (gather (cons direction distance)))))
+
+(defun delta (direction)
+  (ecase direction
+    (#\U #c( 0  1))
+    (#\D #c( 0 -1))
+    (#\L #c(-1  0))
+    (#\R #c( 1  0))))
+
+(defun place-wire (grid path label)
+  (iterate
+    (with scores = (make-hash-table))
+    (with steps = 0)
+    (with pos = #c(0 0))
+    (for (direction . distance) :in path)
+    (for delta = (delta direction))
+    (iterate
+      (repeat distance)
+      (incf pos delta)
+      (incf steps)
+      (for cur = (gethash pos grid))
+      (cond ((null cur) (setf (gethash pos grid) label ; never seen anything
+                              (gethash pos scores) steps))
+            ((char= cur label)) ; already seen
+            ((char= cur #\X)) ; already seen
+            (t (setf (gethash pos grid) #\X ; seen the other wire
+                     (gethash pos scores) steps))))
+    (finally (return scores))))
+
+(defun find-intersections (grid)
+  (iterate (for (k v) :in-hashtable grid)
+           (when (eql #\X v) (collect k))))
+
+(defun make-grid ()
+  (let-result (grid (make-hash-table))
+    (setf (gethash #c(0 0) grid) #\o)))
+
+(define-problem (2019 3) (data read-lines) (5357 101956)
+  (let* ((path1 (parse-path (first data)))
+         (path2 (parse-path (second data)))
+         (grid (make-grid))
+         (scores1 (place-wire grid path1 #\1))
+         (scores2 (place-wire grid path2 #\2))
+         (intersections (find-intersections grid)))
+    (flet ((intersection-cost (point)
+             (+ (gethash point scores1)
+                (gethash point scores2))))
+      (values
+        (alexandria:extremum (mapcar #'manhattan-distance intersections) #'<)
+        (alexandria:extremum (mapcar #'intersection-cost intersections) #'<)))))
+
+;; (run '("R8,U5,L5,D3" "U7,R6,D4,L4"))
+;; (run '(
+;; "R75,D30,R83,U83,L12,D49,R71,U7,L72"
+;; "U62,R66,U55,R34,D71,R55,D58,R83"
+;;        ))
+
+;; (run '(
+;; "R98,U47,R26,D63,R33,U87,L62,D20,R33,U53,R51"
+;; "U98,R91,D20,R16,D67,R40,U7,R15,U6,R7"
+
+;;        ))
--- a/src/utils.lisp	Sun Dec 01 16:01:05 2019 -0500
+++ b/src/utils.lisp	Tue Dec 03 20:15:07 2019 -0500
@@ -25,6 +25,13 @@
     (stream (alexandria:read-stream-content-into-string input))
     (string (copy-seq input))))
 
+(defun ensure-keyword (input)
+  (values
+    (ctypecase input
+      (keyword input)
+      (symbol (alexandria:make-keyword input))
+      (string (alexandria:make-keyword (string-upcase (str:trim input)))))))
+
 
 ;;;; Problems -----------------------------------------------------------------
 (defmacro define-problem-tests ((year day) part1 part2)
@@ -50,7 +57,8 @@
              ,@declarations
              (let ((,file (unless ,arg (open (problem-data-path ,year ,day)))))
                (unwind-protect
-                   (progn (setf ,arg (,reader (ensure-stream (or ,arg ,file))))
+                   (progn (unless ,arg
+                            (setf ,arg (,reader (ensure-stream (or ,arg ,file)))))
                           ,@body)
                  (when ,file (close ,file)))))
            ,@(when answer1
@@ -66,16 +74,19 @@
 
 
 ;;;; Readers ------------------------------------------------------------------
-(defun read-numbers-from-line (line)
+(defun read-numbers-from-string (line)
   (mapcar #'parse-integer (ppcre:all-matches-as-strings "-?\\d+" line)))
 
 (defun read-and-collect (stream reader)
   (iterate (for value :in-stream stream :using reader)
            (collect value)))
 
+
 (defun read-all (stream)
   "Read all forms from `stream` and return them as a fresh list."
   (read-and-collect stream #'read))
+(defun read-numbers (stream)
+  (read-numbers-from-string (alexandria:read-stream-content-into-string stream)))
 
 (defun read-lines (stream)
   "Read all lines from `stream` and return them as a fresh list of strings."
@@ -90,7 +101,7 @@
 
   "
   (iterate (for line :in-stream stream :using #'read-line)
-           (for numbers = (read-numbers-from-line line))
+           (for numbers = (read-numbers-from-string line))
            (when numbers
              (collect numbers))))
 
@@ -98,6 +109,9 @@
   (mapcar (lambda (line) (split-sequence:split-sequence #\space line))
           (read-lines stream)))
 
+(defun read-comma-separated-values (stream)
+  (str:split #\, (alexandria:read-stream-content-into-string stream)))
+
 
 ;;;; Rings --------------------------------------------------------------------
 (declaim (inline ring-prev ring-next ring-data))
@@ -213,6 +227,11 @@
                (return start)))))
 
 
+;;;; Iterate ------------------------------------------------------------------
+(defmacro returning (&rest values)
+  `(finally (return (values ,@values))))
+
+
 ;;;; Miscellaneous ------------------------------------------------------------
 (defun hash-table= (h1 h2 &optional (test #'eql))
   "Return whether `h1` and `h2` have the same keys and values.
@@ -303,12 +322,18 @@
     (char-upcase char)
     (char-downcase char)))
 
-(defun manhattan-distance (point1 point2)
+(defun-inline x (point)
+  (realpart point))
+
+(defun-inline y (point)
+  (imagpart point))
+
+(defun manhattan-distance (point1 &optional (point2 #c(0 0)))
   "Return the Manhattan distance between the two points on the complex plane."
-  (+ (abs (- (realpart point1)
-             (realpart point2)))
-     (abs (- (imagpart point1)
-             (imagpart point2)))))
+  (+ (abs (- (x point1)
+             (x point2)))
+     (abs (- (y point1)
+             (y point2)))))
 
 (defun manhattan-neighbors (point)
   "Return points adjacent to point (excluding diagonals) on the complex plane."
@@ -403,6 +428,31 @@
     result-type))
 
 
+(defun fresh-vector (sequence)
+  (if (typep sequence 'vector)
+    (copy-seq sequence)
+    (coerce sequence 'vector)))
+
+
+(defmacro let-result ((symbol initform) &body body)
+  "Bind `symbol` to initform, execute `body`, and return `symbol`.
+
+  This is useful for creating a object, doing some work on it, and returning the
+  object.  For example:
+
+    (let-result (table (make-hash-table))
+      (setf (gethash 0 table) 'foo))
+    ; ==>
+    (let ((table (make-hash-table)))
+      (setf (gethash 0 table) 'foo)
+      table)
+
+  "
+  `(let ((,symbol ,initform))
+     ,@body
+     ,symbol))
+
+
 ;;;; A* Search ----------------------------------------------------------------
 (defstruct path
   state