diff --git a/audio/Series_of_Tubes.ogg b/audio/Series_of_Tubes.ogg new file mode 100644 index 0000000..6bfe608 Binary files /dev/null and b/audio/Series_of_Tubes.ogg differ diff --git a/css/default.css b/css/default.css new file mode 100644 index 0000000..65ccf1d --- /dev/null +++ b/css/default.css @@ -0,0 +1 @@ +body{color:black;font-size:16px;margin-right:auto;margin-left:auto;max-width:700px}body *{margin-right:initial;margin-left:initial}body > header{border-bottom:2px solid black;margin-bottom:30px;padding:12px 6px 12px 6px}div#logo a{color:black;float:left;font-size:18px;font-weight:bold;text-decoration:none}body > header nav{text-align:right}body > header nav a{color:black;font-size:18px;font-weight:bold;margin-left:12px;text-decoration:none;text-transform:uppercase}footer{border-top:solid 2px black;color:#555;font-size:12px;margin-top:30px;padding:12px 0px 12px 0px;text-align:right;clear:both}article header{color:#555;font-size:14px;font-style:italic}body img{margin:10px}.caption{color:#555;font-size:14px;font-style:italic} \ No newline at end of file diff --git a/css/syntax.css b/css/syntax.css new file mode 100644 index 0000000..1c64f90 --- /dev/null +++ b/css/syntax.css @@ -0,0 +1 @@ + table.sourceCode, tr.sourceCode, td.lineNumbers, td.sourceCode, table.sourceCode pre{margin:0;padding:0;border:0;vertical-align:baseline;border:none}td.lineNumbers{border-right:1px solid #AAAAAA;text-align:right;color:#AAAAAA;padding-right:5px;padding-left:5px}td.sourceCode{padding-left:5px}.sourceCode span.kw{color:#007020;font-weight:bold}.sourceCode span.dt{color:#902000}.sourceCode span.dv{color:#40a070}.sourceCode span.bn{color:#40a070}.sourceCode span.fl{color:#40a070}.sourceCode span.ch{color:#4070a0}.sourceCode span.st{color:#4070a0}.sourceCode span.co{color:#60a0b0;font-style:italic}.sourceCode span.ot{color:#007020}.sourceCode span.al{color:red;font-weight:bold}.sourceCode span.fu{color:#06287e}.sourceCode span.re{}.sourceCode span.er{color:red;font-weight:bold} \ No newline at end of file diff --git a/images/KEEPCAML.png b/images/KEEPCAML.png new file mode 100644 index 0000000..e77e67b Binary files /dev/null and b/images/KEEPCAML.png differ diff --git a/images/P1030359.jpg b/images/P1030359.jpg new file mode 100644 index 0000000..a4c15f7 Binary files /dev/null and b/images/P1030359.jpg differ diff --git a/images/RAK.jpg b/images/RAK.jpg new file mode 100644 index 0000000..e6fa273 Binary files /dev/null and b/images/RAK.jpg differ diff --git a/images/builder-migrations.png b/images/builder-migrations.png new file mode 100644 index 0000000..f41c7b4 Binary files /dev/null and b/images/builder-migrations.png differ diff --git a/images/did-you-mean-95f89861f324e4d9768d2a7393f6f8e2.png b/images/did-you-mean-95f89861f324e4d9768d2a7393f6f8e2.png new file mode 100644 index 0000000..1409659 Binary files /dev/null and b/images/did-you-mean-95f89861f324e4d9768d2a7393f6f8e2.png differ diff --git a/images/mario.jpg b/images/mario.jpg new file mode 100644 index 0000000..6c16d43 Binary files /dev/null and b/images/mario.jpg differ diff --git a/js/index.js b/js/index.js new file mode 100644 index 0000000..7ba6131 --- /dev/null +++ b/js/index.js @@ -0,0 +1,2461 @@ + +// Generated by js_of_ocaml 2.7 +(function(X){"use strict";var +cn=125,eV=56319,cA="\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\0\0\0\0\xff\xff\x03\0\0\0\x86\0\xff\xff\x03\0\xff\xff\x86\0E\x01\x92\x019\0\xff\xffE\x01\x92\x01\xff\xff\xff\xff\xff\xff\xff\xff}\0\x8a\0\xff\xff\0\0\xff\xff\0\0\x03\0\xa9\0\x86\0\xae\0\xff\xff\0\0\n\x01E\x01\x92\x01\f\x01\0\0\n\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x05\0s\0\0\0}\0\x81\0\x05\0\xec\x01\x88\0\xff\x01&\0\xff\xff\n\0\x88\0f\0:\0\0\0k\0f\0\xff\xff\x0b\0\0\0\x0b\0\x0b\0\x0b\0\x0b\0\x0b\0\x0b\0\x0b\0\x0b\0\x0b\0\x0b\0\x1d\0&\0\0\0o\0\xd0\0\xe9\0\xff\0\f\x01\x0f\0\x11\0<\0\x0b\0\n\0\0\0\x14\0\x18\0\x1f\0 \0\"\0\x16\0\x1a\0\0\0\x0e\0\x1b\0!\0\x12\0\x17\0\0\0\x10\0\x13\0#\0(\0$\0&\0\0\0)\0*\0+\0,\0-\0.\0:\0R\0\x0b\0\r\0\r\0\r\0\r\0\r\0\r\0\r\0\r\0\r\0\r\0'\0?\0'\0'\0'\0'\0'\0'\0'\0'\0'\0'\0U\0\x8c\0<\0\r\0\x8f\0\x90\0\x91\x000\0\x93\x000\0\x94\0'\x000\x000\x000\x000\x000\x000\x000\x000\x000\x000\x001\x001\x001\x001\x001\x001\x001\x001\x001\x001\x002\x002\x002\x002\x002\x002\x002\x002\x002\x002\0A\0'\0\x95\0\x96\0\x9c\0?\0\x9d\x003\0\x9e\x003\0\x9f\x002\x003\x003\x003\x003\x003\x003\x003\x003\x003\x003\x004\x004\x004\x004\x004\x004\x004\x004\x004\x004\x005\x005\x005\x005\x005\x005\x005\x005\x005\x005\0\x9b\x002\x006\x006\x006\x006\x006\x006\x006\x006\x006\x006\0\xa1\0\xa2\0\x9b\0[\0A\0\0\x007\x007\x007\x007\x007\x007\x007\x007\x007\x007\x009\0D\0f\0k\0s\0\x83\0\x85\0\x85\0}\0\x8a\0\x85\0\xa3\0^\0\xa5\0D\0\xa6\0\xa7\0\xa8\0\xab\0o\0\xac\0\xad\0\xce\0\xcb\0\xcf\0\xd2\0\xd3\0:\0R\0\x85\0\xd4\0\xd5\0\xd6\0\xd7\0\xd9\0\x8c\0\xda\0a\0\xdb\0\xdc\0w\0\xdd\0\xde\0\xdf\0\x85\0[\0\xcb\0\"\x01>\x01\xe9\0\x98\0\x01\x01P\x01\xf7\0<\0\xfb\x006\x01:\x01Q\x01D\0)\x01R\x01S\x01\x06\x01\x1a\x01D\0w\0\x1e\x01\x0f\x01D\0^\0\x0f\x01T\x01U\x01V\x01G\x01X\x01D\0\xcb\x002\x01G\x01D\0Y\x01D\0D\0G\0G\0G\0G\0G\0G\0G\0G\0G\0G\0a\0L\x01w\0Z\x01?\0\x01\x01\\\x01G\0G\0G\0G\0G\0G\0N\0N\0N\0N\0N\0N\0N\0N\0N\0N\0\x98\0L\x01]\x01_\x01a\x01b\x01-\x01N\0N\0N\0N\0N\0N\0c\x01\x98\0d\x01G\0G\0G\0G\0G\0G\0\xb4\0\xb4\0\xb4\0\xb4\0\xb4\0\xb4\0\xb4\0\xb4\0\xb4\0\xb4\0\x14\x01L\x01A\0\x14\x01e\x01f\x01h\x01N\0N\0N\0N\0N\0N\0O\0O\0O\0O\0O\0O\0O\0O\0O\0O\0i\x01j\x01-\x01$\x01k\x01l\x01m\x01O\0O\0O\0O\0O\0O\0P\0P\0P\0P\0P\0P\0P\0P\0P\0P\0n\x01\x1a\x01y\x01\x9d\x01\x1e\x01\x9e\x01\x14\x01P\0P\0P\0P\0P\0P\0[\0\x9f\x01>\x01O\0O\0O\0O\0O\0O\0\xf7\0\xa0\x01\xfb\0\xa1\x01:\x01D\0V\0V\0V\0V\0V\0V\0V\0V\0V\0V\0^\0P\0P\0P\0P\0P\0P\0V\0V\0V\0V\0V\0V\0W\0W\0W\0W\0W\0W\0W\0W\0W\0W\0$\x01)\x01a\0\xa2\x01\xa3\x01w\0\x01\x01W\0W\0W\0W\0W\0W\0\xa5\x016\x01\x98\0V\0V\0V\0V\0V\0V\0\x06\x01\xa6\x01\xa7\x01\xa8\x01\x0f\x01\xa9\x01X\0X\0X\0X\0X\0X\0X\0X\0X\0X\x002\x01W\0W\0W\0W\0W\0W\0X\0X\0X\0X\0X\0X\0Y\0Y\0Y\0Y\0Y\0Y\0Y\0Y\0Y\0Y\0_\0\x85\x01\xaa\x01\xab\x01\x9a\x01\x85\x01\xac\x01Y\0Y\0Y\0Y\0Y\0Y\0_\0\xb0\0\xad\x01X\0X\0X\0X\0X\0X\0-\x01\xae\x01\xaf\x01\xb0\0\xb0\x01\x9a\x01\xb0\0\xb0\0\xb0\0\xb0\0\xb0\0\xb0\0\xb0\0\xb0\0\xb0\0\xb0\0z\x01Y\0Y\0Y\0Y\0Y\0Y\0\x94\x01\xb1\x01\x14\x01\xb2\x01b\0\x94\x01\xb3\x01\xb4\x01\xb5\x01\xb6\x01\xb7\x01\xd8\x01\xc1\x01_\0\x9a\x01\xd8\x01\xcd\x01b\0\xde\x01_\0\xcd\x01\xe5\x01\x01\x02_\0\xda\x01$\x01\xd7\x01\xd7\x01\x02\x02\xda\x01\xd7\x01_\0\x03\x02\x05\x02\xd8\x01_\0\x06\x02_\0_\0`\0`\0`\0`\0`\0`\0`\0`\0`\0`\0\xd7\x01\x07\x02z\x01\b\x02\t\x02\n\x02\x0b\x02`\0`\0`\0`\0`\0`\0b\0\f\x02\xd7\x01\xf7\x01\r\x02\x0e\x02b\0\x0f\x02}\x01\x80\x01b\0\x10\x02\xdc\x01\x11\x02\xfb\x01\x12\x02\x13\x02\x14\x02b\0y\x01\x15\x02\xc2\x01b\0\x16\x02b\0b\0`\0`\0`\0`\0`\0`\0c\0c\0c\0c\0c\0c\0c\0c\0c\0c\0\xe7\x01\x17\x02\xee\x01\x18\x02\xfb\x01\xee\x01\x19\x02c\0c\0c\0c\0c\0c\0d\0d\0d\0d\0d\0d\0d\0d\0d\0d\0\xf3\x01}\x01\x80\x01\xe0\x01\x1a\x02\xc5\x01\x1b\x02d\0d\0d\0d\0d\0d\0\x1c\x02\xc2\x01\x1d\x02c\0c\0c\0c\0c\0c\0\x1e\x02\x1f\x02 \x02\xc8\x01\xe7\x01\x85\x01e\0e\0e\0e\0e\0e\0e\0e\0e\0e\0!\x02d\0d\0d\0d\0d\0d\0e\0e\0e\0e\0e\0e\0\xb6\0\xb6\0\xb6\0\xb6\0\xb6\0\xb6\0\xb6\0\xb6\0\xb6\0\xb6\0\xff\xff\xff\xff\xc5\x01\xb0\0\xb8\0\xb8\0\xb8\0\xb8\0\xb8\0\xb8\0\xb8\0\xb8\0\xb8\0\xb8\0\xb9\0\xff\xffe\0e\0e\0e\0e\0e\0\xc8\x01\xe0\x01\xff\xff\xb9\0\xcd\x01z\x01\xb9\0\xb9\0\xb9\0\xb9\0\xb9\0\xb9\0\xb9\0\xb9\0\xb9\0\xb9\0\xbe\0\xbe\0\xbe\0\xbe\0\xbe\0\xbe\0\xbe\0\xbe\0\xbe\0\xbe\0\xbf\0\xbf\0\xbf\0\xbf\0\xbf\0\xbf\0\xbf\0\xbf\0\xbf\0\xbf\0\xc0\0\xc5\0\xc5\0\xc5\0\xc5\0\xc5\0\xc5\0\xc5\0\xc5\0\xc5\0\xc5\0\xc0\0\xc1\x01\xf7\x01\xc0\0\xc0\0\xc0\0\xc0\0\xc0\0\xc0\0\xc0\0\xc0\0\xc0\0\xc0\0\xc6\0\xc6\0\xc6\0\xc6\0\xc6\0\xc6\0\xc6\0\xc6\0\xc6\0\xc6\0\xc7\0\xe2\0\xe2\0\xe2\0\xe2\0\xe2\0\xe2\0\xe2\0\xe2\0\xe2\0\xe2\0\xc7\0}\x01\x80\x01\xc7\0\xc7\0\xc7\0\xc7\0\xc7\0\xc7\0\xc7\0\xc7\0\xc7\0\xc7\0\xcc\0\xc2\x01\xcc\0\xcc\0\xcc\0\xcc\0\xcc\0\xcc\0\xcc\0\xcc\0\xcc\0\xcc\0\xe7\x01\xff\xff\xff\xff\xc7\0\xdc\x01\xee\x01\xfb\x01\xff\xff\xc7\0\xf3\x01\xff\xff\xcc\0\xcd\0\xcd\0\xcd\0\xcd\0\xcd\0\xcd\0\xcd\0\xcd\0\xcd\0\xcd\0\xe1\0\xff\xff\xe1\0\xff\xff\xe0\x01\xe1\0\xe1\0\xe1\0\xe1\0\xe1\0\xe1\0\xe1\0\xe1\0\xe1\0\xe1\0\xcd\0\xc5\x01\xff\xff\xff\xff\xff\xff\xff\xff\xcc\0\xe3\0\xe3\0\xe3\0\xe3\0\xe3\0\xe3\0\xe3\0\xe3\0\xe3\0\xe3\0\xff\xff\xff\xff\xff\xff\xff\xff\xc8\x01\xff\xff\xff\xff\xe4\0\xff\xff\xe4\0\xff\xff\xe3\0\xe4\0\xe4\0\xe4\0\xe4\0\xe4\0\xe4\0\xe4\0\xe4\0\xe4\0\xe4\0\xe5\0\xe5\0\xe5\0\xe5\0\xe5\0\xe5\0\xe5\0\xe5\0\xe5\0\xe5\0\xe6\0\xe6\0\xe6\0\xe6\0\xe6\0\xe6\0\xe6\0\xe6\0\xe6\0\xe6\0\xff\xff\xe3\0\xe7\0\xe7\0\xe7\0\xe7\0\xe7\0\xe7\0\xe7\0\xe7\0\xe7\0\xe7\0\xb9\0\xe8\0\xe8\0\xe8\0\xe8\0\xe8\0\xe8\0\xe8\0\xe8\0\xe8\0\xe8\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xed\0\xff\xffM\x01\xff\xffM\x01M\x01M\x01M\x01M\x01M\x01M\x01M\x01M\x01M\x01q\x01q\x01q\x01q\x01q\x01q\x01q\x01q\x01q\x01q\x01\xff\xffM\x01\xff\xff\xff\xff\xc0\0\xff\xff\xff\xff\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0M\x01\xff\xff\xff\xff\xff\xff\xed\0\xc7\0\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0\xed\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xff\xff\xf2\0\xff\xff\xff\xff\xf0\0\xff\xff\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xff\xff\xff\xff\xff\xff\xff\xff\xf2\0\xff\xff\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xf2\0\xed\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xff\xff\xff\xff\xff\xff\xff\xff\xf5\0\xff\xff\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0B\x01B\x01\xff\xff\xff\xffB\x01O\x01O\x01O\x01O\x01O\x01O\x01O\x01O\x01O\x01O\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffB\x01\xff\xffB\x01\xff\xff\xff\xff\xff\xff\xff\xffO\x01B\x01\xff\xff\xff\xff\xff\xff\xff\xffB\x01\xff\xffB\x01B\x01B\x01B\x01B\x01B\x01B\x01B\x01B\x01B\x01B\x01\xff\xff\xff\xffB\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf2\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffB\x01p\x01\xff\xffp\x01\xff\xffB\x01p\x01p\x01p\x01p\x01p\x01p\x01p\x01p\x01p\x01p\x01\xff\xff\xff\xffB\x01r\x01r\x01r\x01r\x01r\x01r\x01r\x01r\x01r\x01r\x01B\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffB\x01\xff\xff\xff\xffr\x01\xff\xff\xff\xffB\x01\xff\xff\xff\xffs\x01\xff\xffs\x01\xff\xffB\x01s\x01s\x01s\x01s\x01s\x01s\x01s\x01s\x01s\x01s\x01t\x01t\x01t\x01t\x01t\x01t\x01t\x01t\x01t\x01t\x01\xff\xffr\x01u\x01u\x01u\x01u\x01u\x01u\x01u\x01u\x01u\x01u\x01v\x01v\x01v\x01v\x01v\x01v\x01v\x01v\x01v\x01v\x01w\x01w\x01w\x01w\x01w\x01w\x01w\x01w\x01w\x01w\x01\xff\xff~\x01\x7f\x01\x7f\x01\x7f\x01\x7f\x01\x7f\x01\x7f\x01\x7f\x01\x7f\x01\x7f\x01\x7f\x01\xff\xff\xff\xff~\x01\xff\xff\xff\xff\xff\xff\x81\x01\x7f\x01\x7f\x01\x7f\x01\x7f\x01\x7f\x01\x7f\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x81\x01\xff\xff\xff\xff\x9b\x01\xff\xff\x9b\x01\x9b\x01\x9b\x01\x9b\x01\x9b\x01\x9b\x01\x9b\x01\x9b\x01\x9b\x01\x9b\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7f\x01\x7f\x01\x7f\x01\x7f\x01\x7f\x01\x7f\x01\x9b\x01\xff\xff~\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff~\x01\xff\xff\xff\xff\xff\xff~\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x81\x01~\x01\xff\xff\xff\xffB\x01~\x01\x81\x01~\x01~\x01\xff\xff\x81\x01\xff\xff\xff\xff\x9b\x01\xff\xff\xff\xff\xff\xff\xff\xff\x81\x01\xff\xff\xff\xff\xff\xff\x81\x01\xff\xff\x81\x01\x81\x01\x82\x01\x82\x01\x82\x01\x82\x01\x82\x01\x82\x01\x82\x01\x82\x01\x82\x01\x82\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x82\x01\x82\x01\x82\x01\x82\x01\x82\x01\x82\x01\x83\x01\x83\x01\x83\x01\x83\x01\x83\x01\x83\x01\x83\x01\x83\x01\x83\x01\x83\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x83\x01\x83\x01\x83\x01\x83\x01\x83\x01\x83\x01\xff\xff\xff\xff\xff\xff\x82\x01\x82\x01\x82\x01\x82\x01\x82\x01\x82\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x84\x01\x84\x01\x84\x01\x84\x01\x84\x01\x84\x01\x84\x01\x84\x01\x84\x01\x84\x01\xff\xff\x83\x01\x83\x01\x83\x01\x83\x01\x83\x01\x83\x01\x84\x01\x84\x01\x84\x01\x84\x01\x84\x01\x84\x01\xb8\x01\x8a\x01\xb8\x01\xff\xff\xff\xff\xb8\x01\xb8\x01\xb8\x01\xb8\x01\xb8\x01\xb8\x01\xb8\x01\xb8\x01\xb8\x01\xb8\x01\xb9\x01\xb9\x01\xb9\x01\xb9\x01\xb9\x01\xb9\x01\xb9\x01\xb9\x01\xb9\x01\xb9\x01\xff\xff\x84\x01\x84\x01\x84\x01\x84\x01\x84\x01\x84\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\xff\xff\xff\xff\xff\xff\xff\xff\x8a\x01\xff\xff\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8a\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\xff\xff\xff\xff\xff\xff\xff\xff\x8d\x01\xff\xff\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8f\x01\x8f\x01\xff\xff\xff\xff\x8f\x01\x9c\x01\x9c\x01\x9c\x01\x9c\x01\x9c\x01\x9c\x01\x9c\x01\x9c\x01\x9c\x01\x9c\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc6\x01\x8f\x01\xff\xff\x8f\x01\xff\xff\xff\xff\xff\xff\xff\xff\x9c\x01\x8f\x01\xff\xff\xff\xff\xff\xff\xc6\x01\x8f\x01\xff\xff\x8f\x01\x8f\x01\x8f\x01\x8f\x01\x8f\x01\x8f\x01\x8f\x01\x8f\x01\x8f\x01\x8f\x01\x8f\x01\xff\xff\xff\xff\x8f\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x8a\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x8f\x01\xff\xff\xff\xff\xff\xff\xff\xff\x8f\x01\xba\x01\xba\x01\xba\x01\xba\x01\xba\x01\xba\x01\xba\x01\xba\x01\xba\x01\xba\x01\xc6\x01\xff\xff\x8f\x01\xff\xff\xff\xff\xff\xff\xc6\x01\xff\xff\xff\xff\xff\xff\xc6\x01\xba\x01\xff\xff\x8f\x01\xff\xff\xff\xff\xff\xff\xff\xff\xc6\x01\xff\xff\xff\xff\x8f\x01\xc6\x01\xff\xff\xc6\x01\xc6\x01\xff\xff\x8f\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x8f\x01\xff\xff\xff\xff\xff\xff\xff\xff\xbb\x01\xff\xff\xbb\x01\xff\xff\xba\x01\xbb\x01\xbb\x01\xbb\x01\xbb\x01\xbb\x01\xbb\x01\xbb\x01\xbb\x01\xbb\x01\xbb\x01\xbc\x01\xbc\x01\xbc\x01\xbc\x01\xbc\x01\xbc\x01\xbc\x01\xbc\x01\xbc\x01\xbc\x01\xbd\x01\xbd\x01\xbd\x01\xbd\x01\xbd\x01\xbd\x01\xbd\x01\xbd\x01\xbd\x01\xbd\x01\xbe\x01\xbe\x01\xbe\x01\xbe\x01\xbe\x01\xbe\x01\xbe\x01\xbe\x01\xbe\x01\xbe\x01\xbf\x01\xbf\x01\xbf\x01\xbf\x01\xbf\x01\xbf\x01\xbf\x01\xbf\x01\xbf\x01\xbf\x01\xc7\x01\xc7\x01\xc7\x01\xc7\x01\xc7\x01\xc7\x01\xc7\x01\xc7\x01\xc7\x01\xc7\x01\xc9\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc7\x01\xc7\x01\xc7\x01\xc7\x01\xc7\x01\xc7\x01\xc9\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc7\x01\xc7\x01\xc7\x01\xc7\x01\xc7\x01\xc7\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc9\x01\xff\xff\xff\xff\xff\xff\xff\xff\x8f\x01\xc9\x01\xff\xff\xff\xff\xff\xff\xc9\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xc9\x01\xff\xff\xff\xff\xff\xff\xc9\x01\xff\xff\xc9\x01\xc9\x01\xca\x01\xca\x01\xca\x01\xca\x01\xca\x01\xca\x01\xca\x01\xca\x01\xca\x01\xca\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xca\x01\xca\x01\xca\x01\xca\x01\xca\x01\xca\x01\xcb\x01\xcb\x01\xcb\x01\xcb\x01\xcb\x01\xcb\x01\xcb\x01\xcb\x01\xcb\x01\xcb\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xcb\x01\xcb\x01\xcb\x01\xcb\x01\xcb\x01\xcb\x01\xff\xff\xff\xff\xff\xff\xca\x01\xca\x01\xca\x01\xca\x01\xca\x01\xca\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xcc\x01\xcc\x01\xcc\x01\xcc\x01\xcc\x01\xcc\x01\xcc\x01\xcc\x01\xcc\x01\xcc\x01\xff\xff\xcb\x01\xcb\x01\xcb\x01\xcb\x01\xcb\x01\xcb\x01\xcc\x01\xcc\x01\xcc\x01\xcc\x01\xcc\x01\xcc\x01\xff\xff\xd2\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xcc\x01\xcc\x01\xcc\x01\xcc\x01\xcc\x01\xcc\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xff\xff\xff\xff\xff\xff\xff\xff\xd2\x01\xff\xff\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd2\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xff\xff\xff\xff\xff\xff\xff\xff\xd5\x01\xff\xff\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xd2\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff",e$=123,fr=254,N=255,cu=224,aT=365180284,cP="i",eU="Invalid_argument",fh="msg",by="Map.bal",e4=65536,e_='"',ae=16777215,eN="\\b",eT="@[",fg=1027,eM=", characters ",bx=250,e3="\\\\",be=1024,eA="jsError",e9="o",ff="%.17g",eL=".0",e2="Noop",eK="(Program not linked with -g, cannot print stack backtrace)\n",e1=246,eJ=102,aU=963043957,cO=512,ez="End_of_file",e8=120,ey="Failure",eI=-10,bA=17724,eH="% ",aF=848054398,cN=513,e="",e0="Stack_overflow",i=128,fe=55296,fd="\\t",ct=100,ad="0",fq=1026,f=248,cM=726928360,eZ="Not_found",cL="%#",cI='\x01\0\0\0\0\0\xff\xff\0\0\xff\xff\0\0\0\0\0\0\0\0\xff\xff\xff\xff\0\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\0\0\xff\xff\xff\xff\xff\xff\0\0\xff\xff\xff\xff\0\0\xff\xff\0\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\0\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\0\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\0\x009\0<\0\0\0<\0\0\0\0\0A\0\0\0A\0\0\0\0\0F\0\0\0\0\0\xff\xff\0\0\0\0\0\0\0\0\0\0\0\0\xff\xff\xff\xff\xff\xff\0\0T\0\0\0\0\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\0\0^\0\0\0\0\0a\0\xff\xff\xff\xffa\0\xff\xff\xff\xff\xff\xff\xff\xffh\0\0\0\0\0\0\0\0\0m\0\0\0\0\0\0\0q\0\0\0\0\0\0\0u\0\0\0\0\0\0\0y\0\0\0\0\0\0\0\0\0\0\0~\0\0\0\0\0\0\0\xff\xff\0\0\xff\xff\0\0\xff\xff\xff\xff\0\0\xff\xff\0\0\x8a\0\0\0\x8e\0\0\0\0\0\xff\xff\xff\xff\xff\xff\0\0\xff\xff\xff\xff\xff\xff\xff\xff\0\0\x9a\0\0\0\0\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\0\0\xff\xff\xff\xff\xff\xff\0\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\0\0\xff\xff\xff\xff\xff\xff\xff\xff\0\0\xb2\0\0\0\0\0\0\0\xff\xff\0\0\xff\xff\0\0\xff\xff\xbb\0\0\0\0\0\0\0\0\0\xff\xff\xff\xff\xc2\0\0\0\0\0\0\0\0\0\xff\xff\xff\xff\xc9\0\0\0\0\0\0\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\0\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\0\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\0\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xeb\0\0\0\0\0\0\0\xef\0\0\0\0\0\xff\xff\0\0\xf4\0\0\0\0\0\xff\xff\0\0\xf9\0\0\0\0\0\0\0\xfd\0\0\0\0\0\0\0\xff\xff\0\0\x03\x01\0\0\0\0\0\0\0\0\b\x01\0\0\0\0\0\0\xff\xff\0\0\xff\xff\0\0\0\0\x11\x01\0\0\0\0\0\0\0\0\x16\x01\0\0\0\0\0\0\0\0\0\0\x1c\x01\0\0\0\0\0\0 \x01\0\0\0\0\0\0\xff\xff\0\0&\x01\0\0\0\0\0\0\0\0+\x01\0\0\0\0\0\0/\x01\0\0\0\0\0\0\0\x004\x01\0\0\0\0\0\x008\x01\0\0\0\0\0\0<\x01\0\0\0\0\0\0@\x01\0\0\0\0\0\0C\x01\0\0\0\0\xff\xff\0\0\xff\xff\0\0\0\0\0\0\0\0\xff\xff\xff\xff\0\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\0\0\xff\xff\xff\xff\xff\xff\0\0\xff\xff\xff\xff\0\0\xff\xff\0\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\0\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\0\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\0\0y\x01}\x01\0\0\0\0\x80\x01\xff\xff\xff\xff\x80\x01\xff\xff\xff\xff\xff\xff\xff\xff\x87\x01\0\0\0\0\0\0\0\0\x8c\x01\0\0\0\0\xff\xff\0\0\x90\x01\0\0\0\0\xff\xff\0\0\xff\xff\0\0\0\0\0\0\0\0\0\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\0\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\0\0\xc1\x01\xc5\x01\0\0\0\0\xc8\x01\xff\xff\xff\xff\xc8\x01\xff\xff\xff\xff\xff\xff\xff\xff\xcf\x01\0\0\0\0\0\0\0\0\xd4\x01\0\0\0\0\xff\xff\0\0\xff\xff\xff\xff\0\0\xff\xff\0\0\xdc\x01\0\0\xff\xff\0\0\xe2\x01\0\0\0\0\0\0\0\0\xff\xff\0\0\xe9\x01\0\0\0\0\0\0\0\0\xff\xff\0\0\xf0\x01\0\0\0\0\0\0\0\0\xf5\x01\0\0\0\0\0\0\xf9\x01\0\0\0\0\0\0\xfc\x01\0\0\0\0\0\0\xff\xff\0\0\x02\x02\x03\x02\x05\x02\0\0\x06\x02\x07\x02\b\x02\t\x02\n\x02\x0b\x02\f\x02\r\x02\x0e\x02\x0f\x02\x10\x02\x11\x02\x12\x02\x13\x02\x14\x02\x15\x02\x16\x02\x17\x02\x18\x02\x19\x02\x1a\x02\x1b\x02\x1c\x02\x1d\x02\x1e\x02\x1f\x02 \x02!\x02"\x02\x04\x02',eS="Sys_blocked_io",fc=103,fp="fd ",fo=1023,eG="Match_failure",eu=", ",z="camlinternalFormat.ml",e7="Division_by_zero",fn=">",eF=1e3,av="src/core/lwt.ml",ex="Sys_error",cF="x",bd=".",cs="+",bc=65535,fm="sender",cq=1073741823,eR="%u",cE="%d",eQ=110,$="Unexpected end of input",cD=57343,cm=252,cr=127,eY="false",e6="'",ew="\\n",eP="@{",at=" ",cK="e",et="Undefined_recursive_module",bw="read.mll",fl="Index.message",cJ="d",eO="X",bb=256,aS="-",eE="nan",cC=-48,bC=-752863768,eX=192,cH=65520,fk='", line ',cB="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\x04\0\0\0\x03\0\x03\0\x86\0\0\0\x03\0\0\0\x86\0E\x01\x92\x01\xff\xff\0\0E\x01\x92\x01\0\0\0\0\0\0\0\0\x7f\0\x8b\0\0\0\x03\0\0\0\f\0\x03\0\xaa\0\x86\0\xaf\0\0\0\x07\0\x0b\x01E\x01\x92\x01\x0e\x01\r\x001\0\x05\0\n\0\x0b\0\x0b\0\x0b\0\x0b\0\x0b\0\x0b\0\x0b\0\x0b\0\x0b\x008\0v\0\x06\0\x81\0\x82\x009\0\xed\x01\x89\0\0\x021\0\0\x000\0\x8a\0j\0>\0\x0e\0n\0i\0\0\x001\0\x0f\0\x0b\0\x0b\0\x0b\0\x0b\0\x0b\0\x0b\0\x0b\0\x0b\0\x0b\0\x0b\0\x1e\x000\0\b\0r\0\xd1\0\xec\0\0\x01\r\x01\x1d\0\x16\0\xff\xff0\x000\0\x11\0\x15\0\x19\0 \0!\0#\0\x17\0\x1b\0\x10\0\x1f\0\x1c\0\"\0\x13\0\x18\0\x12\0\x1a\0\x14\0$\0)\0%\x000\0\t\0*\0+\0,\0-\0.\0/\0=\0U\x000\0&\0'\0'\0'\0'\0'\0'\0'\0'\0'\x001\0C\0'\0'\0'\0'\0'\0'\0'\0'\0'\0'\0V\0\x8f\0\xff\xff(\0\x90\0\x91\0\x92\x007\0\x94\x007\0\x95\x000\x006\x006\x006\x006\x006\x006\x006\x006\x006\x006\x002\x002\x002\x002\x002\x002\x002\x002\x002\x002\x002\x002\x002\x002\x002\x002\x002\x002\x002\x002\0\xff\xff0\0\x96\0\x97\0\xa1\0B\0\x9e\x005\0\x9f\x005\0\xa0\x003\x004\x004\x004\x004\x004\x004\x004\x004\x004\x004\x004\x004\x004\x004\x004\x004\x004\x004\x004\x004\x004\x004\x004\x004\x004\x004\x004\x004\x004\x004\0\xa5\x003\x006\x006\x006\x006\x006\x006\x006\x006\x006\x006\0\xa2\0\xa3\0\xa6\0]\0\xff\xff\x02\x006\x006\x006\x006\x006\x006\x006\x006\x006\x006\0\xff\xffM\0g\0l\0t\0\x84\0\x86\0\x87\0\x80\0\x8b\0\x86\0\xa4\0]\0\xab\0M\0\xa7\0\xa8\0\xa9\0\xac\0p\0\xad\0\xae\0\xd2\0\xe2\0\xd0\0\xd3\0\xd4\0;\0S\0\x86\0\xd5\0\xd6\0\xd7\0\xd8\0\xda\0\x8d\0\xdb\0]\0\xdc\0\xdd\0{\0\xde\0\xdf\0\xe0\0\x88\0_\0\xe1\0#\x01A\x01\xea\0\x9b\0\x05\x01a\x01\xfa\0\xff\xff\xfe\x009\x01=\x01_\x01M\0,\x01\\\x01X\x01\t\x01\x1d\x01L\0|\0!\x01\x12\x01K\0b\0\x13\x01U\x01V\x01W\x01x\x01Y\x01J\0\xe1\x005\x01y\x01I\0Z\x01H\0G\0N\0N\0N\0N\0N\0N\0N\0N\0N\0N\0b\0q\x01z\0[\x01@\0\x04\x01]\x01N\0N\0N\0N\0N\0N\0O\0O\0O\0O\0O\0O\0O\0O\0O\0O\0\x9c\0p\x01^\x01`\x01b\x01c\x011\x01O\0O\0O\0O\0O\0O\0d\x01\x9d\0e\x01N\0N\0N\0N\0N\0N\0\xb7\0\xb8\0\xb8\0\xb8\0\xb8\0\xb8\0\xb8\0\xb8\0\xb8\0\xb8\0\x18\x01p\x01\xff\xff\x19\x01f\x01g\x01i\x01O\0O\0O\0O\0O\0O\0P\0P\0P\0P\0P\0P\0P\0P\0P\0P\0j\x01k\x010\x01(\x01l\x01m\x01n\x01P\0P\0P\0P\0P\0P\0Q\0Q\0Q\0Q\0Q\0Q\0Q\0Q\0Q\0Q\0o\x01\x1b\x01\xff\xff\xab\x01\x1f\x01\xaa\x01\x17\x01Q\0Q\0Q\0Q\0Q\0Q\0\\\0\xa8\x01?\x01P\0P\0P\0P\0P\0P\0\xf8\0\xa5\x01\xfc\0\xa2\x01;\x01E\0W\0W\0W\0W\0W\0W\0W\0W\0W\0W\0\xff\xffQ\0Q\0Q\0Q\0Q\0Q\0W\0W\0W\0W\0W\0W\0X\0X\0X\0X\0X\0X\0X\0X\0X\0X\0'\x01*\x01\xff\xff\xa3\x01\xa4\x01x\0\x02\x01X\0X\0X\0X\0X\0X\0\xa6\x017\x01\x99\0W\0W\0W\0W\0W\0W\0\x07\x01\xa7\x01\xa4\x01\xa9\x01\x10\x01\xa4\x01Y\0Y\0Y\0Y\0Y\0Y\0Y\0Y\0Y\0Y\x003\x01X\0X\0X\0X\0X\0X\0Y\0Y\0Y\0Y\0Y\0Y\0Z\0Z\0Z\0Z\0Z\0Z\0Z\0Z\0Z\0Z\0a\0\x89\x01\xa4\x01\xac\x01\xb9\x01\x88\x01\xad\x01Z\0Z\0Z\0Z\0Z\0Z\0a\0\xb3\0\xae\x01Y\0Y\0Y\0Y\0Y\0Y\0.\x01\xaf\x01\xb0\x01\xb4\0\xa4\x01\xb8\x01\xb5\0\xb6\0\xb6\0\xb6\0\xb6\0\xb6\0\xb6\0\xb6\0\xb6\0\xb6\0|\x01Z\0Z\0Z\0Z\0Z\0Z\0\xc0\x01\xb2\x01\x15\x01\xb3\x01a\0\xc1\x01\xb4\x01\xb5\x01\xb6\x01\xb7\x01\xa4\x01\xd8\x01\xff\xffa\0\xb8\x01\xd8\x01\xd1\x01a\0\xdf\x01a\0\xd0\x01\xe6\x01\xff\xffa\0\xdb\x01%\x01\xd8\x01\xd9\x01\x04\x02\xdc\x01\xd8\x01a\0\x04\x02\x04\x02\xd8\x01a\0\x04\x02a\0`\0c\0c\0c\0c\0c\0c\0c\0c\0c\0c\0\xd8\x01\x04\x02~\x01\x04\x02\x04\x02\x04\x02\x04\x02c\0c\0c\0c\0c\0c\0a\0\x04\x02\xda\x01\xfa\x01\x04\x02\x04\x02a\0\x04\x02|\x01|\x01a\0\x04\x02\xdd\x01\x04\x02\xfd\x01\x04\x02\x04\x02\x04\x02a\0\xff\xff\x04\x02\xc4\x01a\0\x04\x02a\0`\0c\0c\0c\0c\0c\0c\0d\0d\0d\0d\0d\0d\0d\0d\0d\0d\0\xeb\x01\x04\x02\xf1\x01\x04\x02\xff\x01\xf2\x01\x04\x02d\0d\0d\0d\0d\0d\0e\0e\0e\0e\0e\0e\0e\0e\0e\0e\0\xf6\x01\x81\x01\x81\x01\xe4\x01\x04\x02\xc4\x01\x04\x02e\0e\0e\0e\0e\0e\0\x04\x02\xc6\x01\x04\x02d\0d\0d\0d\0d\0d\0\x04\x02\x04\x02\x04\x02\xc4\x01\xea\x01\x86\x01a\0a\0a\0a\0a\0a\0a\0a\0a\0a\0\x04\x02e\0e\0e\0e\0e\0e\0a\0a\0a\0a\0a\0a\0\xb6\0\xb6\0\xb6\0\xb6\0\xb6\0\xb6\0\xb6\0\xb6\0\xb6\0\xb6\0\0\0\0\0\xc9\x01\xb1\0\xb8\0\xb8\0\xb8\0\xb8\0\xb8\0\xb8\0\xb8\0\xb8\0\xb8\0\xb8\0\xbc\0\0\0a\0a\0a\0a\0a\0a\0\xc9\x01\xe3\x01\0\0\xbf\0\xce\x01{\x01\xbd\0\xbe\0\xbe\0\xbe\0\xbe\0\xbe\0\xbe\0\xbe\0\xbe\0\xbe\0\xbe\0\xbe\0\xbe\0\xbe\0\xbe\0\xbe\0\xbe\0\xbe\0\xbe\0\xbe\0\xbd\0\xbe\0\xbe\0\xbe\0\xbe\0\xbe\0\xbe\0\xbe\0\xbe\0\xbe\0\xc3\0\xc5\0\xc5\0\xc5\0\xc5\0\xc5\0\xc5\0\xc5\0\xc5\0\xc5\0\xc5\0\xc6\0\xff\xff\xf8\x01\xc4\0\xc5\0\xc5\0\xc5\0\xc5\0\xc5\0\xc5\0\xc5\0\xc5\0\xc5\0\xc4\0\xc5\0\xc5\0\xc5\0\xc5\0\xc5\0\xc5\0\xc5\0\xc5\0\xc5\0\xca\0\xe3\0\xe3\0\xe3\0\xe3\0\xe3\0\xe3\0\xe3\0\xe3\0\xe3\0\xe3\0\xcd\0\xff\xff\xff\xff\xcb\0\xcc\0\xcc\0\xcc\0\xcc\0\xcc\0\xcc\0\xcc\0\xcc\0\xcc\0\xe2\0\xc3\x01\xcc\0\xcc\0\xcc\0\xcc\0\xcc\0\xcc\0\xcc\0\xcc\0\xcc\0\xcc\0\xe8\x01\0\0\0\0\xce\0\xdd\x01\xef\x01\xfe\x01\0\0\xcf\0\xf4\x01\0\0\xe1\0\xcb\0\xcc\0\xcc\0\xcc\0\xcc\0\xcc\0\xcc\0\xcc\0\xcc\0\xcc\0\xe8\0\0\0\xe8\0\0\0\xe1\x01\xe7\0\xe7\0\xe7\0\xe7\0\xe7\0\xe7\0\xe7\0\xe7\0\xe7\0\xe7\0\xd9\0\xff\xff\0\0\0\0\0\0\0\0\xe1\0\xe3\0\xe3\0\xe3\0\xe3\0\xe3\0\xe3\0\xe3\0\xe3\0\xe3\0\xe3\0\0\0\0\0\0\0\0\0\xff\xff\0\0\0\0\xe6\0\0\0\xe6\0\0\0\xe4\0\xe5\0\xe5\0\xe5\0\xe5\0\xe5\0\xe5\0\xe5\0\xe5\0\xe5\0\xe5\0\xe5\0\xe5\0\xe5\0\xe5\0\xe5\0\xe5\0\xe5\0\xe5\0\xe5\0\xe5\0\xe5\0\xe5\0\xe5\0\xe5\0\xe5\0\xe5\0\xe5\0\xe5\0\xe5\0\xe5\0\0\0\xe4\0\xe7\0\xe7\0\xe7\0\xe7\0\xe7\0\xe7\0\xe7\0\xe7\0\xe7\0\xe7\0\xba\0\xe7\0\xe7\0\xe7\0\xe7\0\xe7\0\xe7\0\xe7\0\xe7\0\xe7\0\xe7\0\0\0\0\0\0\0\0\0\0\0\xf1\0\0\0q\x01\0\0M\x01M\x01M\x01M\x01M\x01M\x01M\x01M\x01M\x01M\x01r\x01r\x01r\x01r\x01r\x01r\x01r\x01r\x01r\x01r\x01\0\0p\x01\0\0\0\0\xc1\0\0\0\0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0p\x01\0\0\0\0\0\0\xf0\0\xc8\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\0\0\xf6\0\0\0\0\0\xf0\0\0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf0\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\0\0\0\0\0\0\0\0\xf5\0\0\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xee\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\0\0\0\0\0\0\0\0\xf5\0\0\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0\xf5\0E\x01F\x01\0\0\0\0E\x01L\x01M\x01M\x01M\x01M\x01M\x01M\x01M\x01M\x01M\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0E\x01\0\0N\x01\0\0\0\0\0\0\0\0h\x01I\x01\0\0\0\0\0\0\0\0O\x01\0\0G\x01L\x01M\x01M\x01M\x01M\x01M\x01M\x01M\x01M\x01M\x01\0\0\0\0H\x01\0\0\0\0\0\0\0\0\0\0\xf3\0\0\0\0\0\0\0\0\0\0\0\0\0P\x01w\x01\0\0w\x01\0\0Q\x01v\x01v\x01v\x01v\x01v\x01v\x01v\x01v\x01v\x01v\x01\0\0\0\0J\x01r\x01r\x01r\x01r\x01r\x01r\x01r\x01r\x01r\x01r\x01S\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0R\x01\0\0\0\0s\x01\0\0\0\0T\x01\0\0\0\0u\x01\0\0u\x01\0\0K\x01t\x01t\x01t\x01t\x01t\x01t\x01t\x01t\x01t\x01t\x01t\x01t\x01t\x01t\x01t\x01t\x01t\x01t\x01t\x01t\x01\0\0s\x01t\x01t\x01t\x01t\x01t\x01t\x01t\x01t\x01t\x01t\x01v\x01v\x01v\x01v\x01v\x01v\x01v\x01v\x01v\x01v\x01v\x01v\x01v\x01v\x01v\x01v\x01v\x01v\x01v\x01v\x01\0\0\x80\x01\x82\x01\x82\x01\x82\x01\x82\x01\x82\x01\x82\x01\x82\x01\x82\x01\x82\x01\x82\x01\0\0\0\0\x80\x01\0\0\0\0\0\0\x80\x01\x82\x01\x82\x01\x82\x01\x82\x01\x82\x01\x82\x01\0\0\0\0\0\0\0\0\0\0\0\0\x80\x01\0\0\0\0\xb9\x01\0\0\x9b\x01\x9b\x01\x9b\x01\x9b\x01\x9b\x01\x9b\x01\x9b\x01\x9b\x01\x9b\x01\x9b\x01\0\0\0\0\0\0\0\0\0\0\x82\x01\x82\x01\x82\x01\x82\x01\x82\x01\x82\x01\xb8\x01\0\0\x80\x01\0\0\0\0\0\0\0\0\0\0\x80\x01\0\0\0\0\0\0\x80\x01\0\0\0\0\0\0\0\0\0\0\0\0\x80\x01\x80\x01\0\0\0\0D\x01\x80\x01\x80\x01\x80\x01\x7f\x01\0\0\x80\x01\0\0\0\0\xb8\x01\0\0\0\0\0\0\0\0\x80\x01\0\0\0\0\0\0\x80\x01\0\0\x80\x01\x7f\x01\x83\x01\x83\x01\x83\x01\x83\x01\x83\x01\x83\x01\x83\x01\x83\x01\x83\x01\x83\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x83\x01\x83\x01\x83\x01\x83\x01\x83\x01\x83\x01\x84\x01\x84\x01\x84\x01\x84\x01\x84\x01\x84\x01\x84\x01\x84\x01\x84\x01\x84\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x84\x01\x84\x01\x84\x01\x84\x01\x84\x01\x84\x01\0\0\0\0\0\0\x83\x01\x83\x01\x83\x01\x83\x01\x83\x01\x83\x01\0\0\0\0\0\0\0\0\0\0\0\0\x80\x01\x80\x01\x80\x01\x80\x01\x80\x01\x80\x01\x80\x01\x80\x01\x80\x01\x80\x01\0\0\x84\x01\x84\x01\x84\x01\x84\x01\x84\x01\x84\x01\x80\x01\x80\x01\x80\x01\x80\x01\x80\x01\x80\x01\xbf\x01\x8e\x01\xbf\x01\0\0\0\0\xbe\x01\xbe\x01\xbe\x01\xbe\x01\xbe\x01\xbe\x01\xbe\x01\xbe\x01\xbe\x01\xbe\x01\xba\x01\xba\x01\xba\x01\xba\x01\xba\x01\xba\x01\xba\x01\xba\x01\xba\x01\xba\x01\0\0\x80\x01\x80\x01\x80\x01\x80\x01\x80\x01\x80\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\0\0\0\0\0\0\0\0\x8d\x01\0\0\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\0\0\0\0\0\0\0\0\x8d\x01\0\0\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x8d\x01\x92\x01\x93\x01\0\0\0\0\x92\x01\x9a\x01\x9b\x01\x9b\x01\x9b\x01\x9b\x01\x9b\x01\x9b\x01\x9b\x01\x9b\x01\x9b\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xc8\x01\x92\x01\0\0\x99\x01\0\0\0\0\0\0\0\0\xb1\x01\x96\x01\0\0\0\0\0\0\xc8\x01\x9c\x01\0\0\x94\x01\x9a\x01\x9b\x01\x9b\x01\x9b\x01\x9b\x01\x9b\x01\x9b\x01\x9b\x01\x9b\x01\x9b\x01\0\0\0\0\x95\x01\0\0\0\0\0\0\0\0\0\0\0\0\x8b\x01\0\0\0\0\0\0\0\0\0\0\x9d\x01\0\0\0\0\0\0\0\0\x9e\x01\xba\x01\xba\x01\xba\x01\xba\x01\xba\x01\xba\x01\xba\x01\xba\x01\xba\x01\xba\x01\xc8\x01\0\0\x97\x01\0\0\0\0\0\0\xc8\x01\0\0\0\0\0\0\xc8\x01\xbb\x01\0\0\xa0\x01\0\0\0\0\0\0\0\0\xc8\x01\0\0\0\0\x9f\x01\xc8\x01\0\0\xc8\x01\xc7\x01\0\0\xa1\x01\0\0\0\0\0\0\0\0\0\0\0\0\x98\x01\0\0\0\0\0\0\0\0\xbd\x01\0\0\xbd\x01\0\0\xbb\x01\xbc\x01\xbc\x01\xbc\x01\xbc\x01\xbc\x01\xbc\x01\xbc\x01\xbc\x01\xbc\x01\xbc\x01\xbc\x01\xbc\x01\xbc\x01\xbc\x01\xbc\x01\xbc\x01\xbc\x01\xbc\x01\xbc\x01\xbc\x01\xbc\x01\xbc\x01\xbc\x01\xbc\x01\xbc\x01\xbc\x01\xbc\x01\xbc\x01\xbc\x01\xbc\x01\xbe\x01\xbe\x01\xbe\x01\xbe\x01\xbe\x01\xbe\x01\xbe\x01\xbe\x01\xbe\x01\xbe\x01\xbe\x01\xbe\x01\xbe\x01\xbe\x01\xbe\x01\xbe\x01\xbe\x01\xbe\x01\xbe\x01\xbe\x01\xca\x01\xca\x01\xca\x01\xca\x01\xca\x01\xca\x01\xca\x01\xca\x01\xca\x01\xca\x01\xc8\x01\0\0\0\0\0\0\0\0\0\0\0\0\xca\x01\xca\x01\xca\x01\xca\x01\xca\x01\xca\x01\xc8\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xca\x01\xca\x01\xca\x01\xca\x01\xca\x01\xca\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xc8\x01\0\0\0\0\0\0\0\0\x91\x01\xc8\x01\0\0\0\0\0\0\xc8\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xc8\x01\0\0\0\0\0\0\xc8\x01\0\0\xc8\x01\xc7\x01\xcb\x01\xcb\x01\xcb\x01\xcb\x01\xcb\x01\xcb\x01\xcb\x01\xcb\x01\xcb\x01\xcb\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xcb\x01\xcb\x01\xcb\x01\xcb\x01\xcb\x01\xcb\x01\xcc\x01\xcc\x01\xcc\x01\xcc\x01\xcc\x01\xcc\x01\xcc\x01\xcc\x01\xcc\x01\xcc\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xcc\x01\xcc\x01\xcc\x01\xcc\x01\xcc\x01\xcc\x01\0\0\0\0\0\0\xcb\x01\xcb\x01\xcb\x01\xcb\x01\xcb\x01\xcb\x01\0\0\0\0\0\0\0\0\0\0\0\0\xc8\x01\xc8\x01\xc8\x01\xc8\x01\xc8\x01\xc8\x01\xc8\x01\xc8\x01\xc8\x01\xc8\x01\0\0\xcc\x01\xcc\x01\xcc\x01\xcc\x01\xcc\x01\xcc\x01\xc8\x01\xc8\x01\xc8\x01\xc8\x01\xc8\x01\xc8\x01\0\0\xd6\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xc8\x01\xc8\x01\xc8\x01\xc8\x01\xc8\x01\xc8\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\0\0\0\0\0\0\0\0\xd5\x01\0\0\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\0\0\0\0\0\0\0\0\xd5\x01\0\0\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\xd5\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xd3\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0",cp=240,cx=" : file already exists",cz=708012133,e5=2048,au=106380200,fb="%.12g",cG=56320,eD="%+",cw="\xff\xff\xff\xff\xff\xff\x11\0\xff\xff\x13\0\xff\xff\xff\xff\xff\xff\xff\xff\x07\0\x07\0\xff\xff\x13\0\x13\0\x13\0\x13\0\x13\0\x13\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\b\0\b\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\t\0\xff\xff\t\0\xff\xff\t\0\xff\xff\xff\xff\x0e\0\xff\xff\xff\xff\x02\0\xff\xff\xff\xff\xff\xff\xff\xff\x02\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x07\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\0\x01\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x03\0\xff\xff\x01\0\xff\xff\x04\0\x03\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\0\xff\xff\xff\xff\xff\xff\x01\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x04\0\x04\0\x04\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x03\0\xff\xff\0\0\xff\xff\x01\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\0\0\x02\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\0\0\x02\0\xff\xff\xff\xff\xff\xff\xff\xff\x03\0\x03\0\x05\0\x05\0\x05\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x03\0\xff\xff\x03\0\xff\xff\x03\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\0\xff\xff\xff\xff\xff\xff\xff\xff\x01\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\0\xff\xff\x02\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x10\0\xff\xff\x12\0\xff\xff\xff\xff\xff\xff\xff\xff\x07\0\x07\0\xff\xff\x12\0\x12\0\x12\0\x12\0\x12\0\x12\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\b\0\xff\xff\b\0\xff\xff\b\0\xff\xff\xff\xff\r\0\xff\xff\xff\xff\xff\xff\x01\0\x01\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\0\xff\xff\xff\xff\xff\xff\xff\xff\t\0\xff\xff\x0b\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\0\0\0\0\x0b\0\x0b\0\x0b\0\x0b\0\x0b\0\x0b\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\0\0\xff\xff\0\0\xff\xff\0\0\xff\xff\xff\xff\x06\0\xff\xff\xff\xff\xff\xff\x01\0\x01\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\0\xff\xff\x04\0\x03\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x03\0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff",cy=32752,bz=-976970511,es="%.16g",ev="Tubes",aR="%",eC="/",fa="Assert_failure",bB=737456202,er="%i",fj="Out_of_memory",co=32768,eW="true",fi="index out of bounds",aV=3654863,eB="\\r",cv="\0\0\xec\xff\xed\xff\x03\0\xef\xff\x10\0\xf2\xff\xf3\xff\xf4\xff\xf5\xff\0\0\x1f\0\xf9\xffU\0\x01\0\0\0\0\0\x01\0\0\0\x01\0\x02\0\xff\xff\0\0\0\0\x03\0\xfe\xff\x01\0\x04\0\xfd\xff\x0b\0\xfc\xff\x03\0\x01\0\x03\0\x02\0\x03\0\0\0\xfb\xff\x15\0a\0\n\0\x16\0\x14\0\x10\0\x16\0\f\0\b\0\xfa\xffw\0\x81\0\x8b\0\xa1\0\xab\0\xb5\0\xc1\0\xd1\0\xf0\xff\x0b\0&\0\xfc\xffA\0\xfe\xff\xff\xffn\0\xfc\xff\xa3\0\xfe\xff\xff\xff\xea\0\xf7\xff\xf8\xff0\x01\xfa\xff\xfb\xff\xfc\xff\xfd\xff\xfe\xff\xff\xffG\x01~\x01\x95\x01\xf9\xff'\0\xfd\xff\xfe\xff&\0\xbb\x01\xd2\x01\xf8\x01\x0f\x02\xff\xff\xdc\0\xfd\xff\xff\xff\xf5\0'\x02m\x02\x0e\x01X\x02\xa4\x02\xbb\x02\xe1\x02\r\0\xfc\xff\xfd\xff\xfe\xff\xff\xff\x0e\0\xfd\xff\xfe\xff\xff\xff\x1e\0\xfd\xff\xfe\xff\xff\xff\x0f\0\xfd\xff\xfe\xff\xff\xff\x11\x01\xfb\xff\xfc\xff\xfd\xff\xfe\xff\xff\xff\x13\0\xfc\xff\xfd\xff\xfe\xff\x0f\0\xff\xff\x10\0\xff\xff\b\x01\x05\0\xfd\xff\x17\0\xfe\xff\x14\0\xff\xff.\0\xfd\xff\xfe\xff*\x004\x005\0\xff\xff5\x000\0[\0\\\0\xff\xff\x1b\x01\xfa\xff\xfb\xff\x89\0h\0Y\0X\0j\0\xff\xff\x8f\0\x89\0\xb1\0\xfe\xff\xb7\0\xa8\0\xa6\0\xb7\0\x02\0\xfd\xff\xb1\0\xac\0\xbb\0\x04\0\xfc\xff5\x02\xfb\xff\xfc\xff\xfd\xffg\x01\xff\xff\xf8\x02\xfe\xff\x06\x03\x1e\x03\xfc\xff\xfd\xff\xfe\xff\xff\xff(\x032\x03J\x03\xfc\xff\xfd\xff\xfe\xff\xff\xff=\x03T\x03l\x03\xf9\xff\xfa\xff\xfb\xff\xf4\0x\x03\x8e\x03\xb3\0\xc2\0\x0f\0\xff\xff\xbe\0\xbc\0\xbb\0\xc1\0\xb7\0\xb3\0\xfe\xff\xbf\0\xc9\0\xc8\0\xc4\0\xcb\0\xc1\0\xbd\0\xfd\xff\x9d\x03_\x03\xae\x03\xc4\x03\xce\x03\xd8\x03\xe4\x03\xef\x03<\0\xfd\xff\xfe\xff\xff\xff\f\x04\xfc\xff\xfd\xffW\x04\xff\xff\x91\x04\xfc\xff\xfd\xff\xdd\x04\xff\xff\xe5\0\xfd\xff\xfe\xff\xff\xff\xe7\0\xfd\xff\xfe\xff\xff\xff\x02\0\xff\xff\x12\x01\xfc\xff\xfd\xff\xfe\xff\xff\xff\"\x01\xfd\xff\xfe\xff\xff\xff\0\0\xff\xff\x03\0\xfe\xff\xff\xff&\x01\xfc\xff\xfd\xff\xfe\xff\xff\xffx\x01\xfb\xff\xfc\xff\xfd\xff\xfe\xff\xff\xff\xd0\0\xfd\xff\xfe\xff\xff\xff\xd3\0\xfd\xff\xfe\xff\xff\xff\xbd\0\xff\xff\x8f\x01\xfc\xff\xfd\xff\xfe\xff\xff\xff\r\x01\xfd\xff\xfe\xff\xff\xff_\x01\xfc\xff\xfd\xff\xfe\xff\xff\xff2\x01\xfd\xff\xfe\xff\xff\xff\x1a\x01\xfd\xff\xfe\xff\xff\xff\xe9\0\xfd\xff\xfe\xff\xff\xff\xde\0\xfd\xff\xfe\xff\xff\xffO\x05\xed\xff\xee\xff\n\0\xf0\xff,\x01\xf3\xff\xf4\xff\xf5\xff\xf6\xff=\x01\x02\x04\xf9\xff-\x05\xd1\0\xe4\0\xd3\0\xe8\0\xe1\0\xdf\0\xf0\0\xff\xff\xeb\0\xea\0\b\x01\xfe\xff\x04\x01\x17\x01\xfd\xff6\x01\xfc\xff\x1f\x01\x1d\x01 \x01'\x011\x01-\x01\xfb\xff9\x01R\x01P\x01N\x01T\x01J\x01V\x01\xfa\xffn\x05\f\x04{\x05\x9b\x05\xa5\x05\xb1\x05\xbb\x05\xc5\x05\xf1\xff\xc7\x01M\x02\xfd\xff\xff\xff\x9a\x02\xde\x05\xd1\x05\x9b\x02\xef\x055\x06L\x06r\x06\x10\x02\xfc\xff\xfd\xff\xfe\xff\xff\xff\x98\x06\xfc\xff\xfd\xff\xe3\x06\xff\xffU\x07\xf4\xff\xf5\xff\x0b\0\xf7\xffL\x02\xfa\xff\xfb\xff\xfc\xff\xfd\xff\xfe\xff\x1f\x02\xf3\x053\x07d\x01s\x01h\x01\x85\x01v\x01\x9a\x01\xab\x01\xff\xff\xad\x01\xb0\x01\xbf\x01\xb9\x01\xbb\x01\xfd\x01\xe6\x01\xe6\x01\xea\x01\xf7\x01\xed\x01\xea\x01\t\x02\x13\x02\x13\x02\x0f\x02\x15\x02\x0b\x02\x07\x02\x8e\x06\x98\x06t\x07\xaa\x07\xb4\x07\xbe\x07\xc8\x07\xd2\x07\xf8\xffx\x02\xa7\x02\xfd\xff\xff\xff\xd8\x02R\x07\xdc\x07\xec\x02\xf4\x07:\bQ\bw\bL\x02\xfc\xff\xfd\xff\xfe\xff\xff\xff\x9d\b\xfc\xff\xfd\xff\xe8\b\xff\xff\x87\x02x\x02\xfd\xffd\x02\xfe\xff\xb6\x02\xff\xff\x0b\x02\xff\xff\xcc\x02\xfc\xff\xfd\xff\xfe\xff\xff\xff.\x02\xff\xff\xb2\x02\xfc\xff\xfd\xff\xfe\xff\xff\xff\x17\0\xff\xff\xb7\x02\xfc\xff\xfd\xff\xfe\xff\xff\xff\xbb\x02\xfd\xff\xfe\xff\xff\xffy\x02\xfd\xff\xfe\xff\xff\xff\xb8\x02\xfc\xff\xfd\xff\xfe\xff\x13\0\xff\xff\x8c\x01\x92\x01\x96\x01\xff\xff\x97\x01\x9a\x01\xa8\x01\xaa\x01\xab\x01\xac\x01\xad\x01\xb5\x01\xb8\x01\xb9\x01\xbb\x01\xbf\x01\xc1\x01\xc3\x01\xc4\x01\xc5\x01\xc8\x01\xcb\x01\xdf\x01\xe1\x01\xe4\x01\xf9\x01\xfb\x01\x02\x02\x04\x02\x0b\x02\f\x02\r\x02\x1b\x02\0\0";function +lc(a,b,c){var +d=new +Array(c+1);d[0]=0;for(var +e=1,f=b+1;e<=c;e++,f++)d[e]=a[f];return d}function +bL(a,b,c){var +e=new +Array(c);for(var +d=0;d=c.l||c.t==2&&e>=c.c.length)){c.c=a.t==4?c0(a.c,b,e):b==0&&a.c.length==e?a.c:a.c.substr(b,e);c.t=c.c.length==c.l?0:2}else +if(c.t==2&&d==c.c.length){c.c+=a.t==4?c0(a.c,b,e):b==0&&a.c.length==e?a.c:a.c.substr(b,e);c.t=c.c.length==c.l?0:2}else{if(c.t!=4)bD(c);var +g=a.c,h=c.c;if(a.t==4)for(var +f=0;f>=1;if(a==0)return c;b+=b;d++;if(d==9)b.slice(0,1)}}function +ax(a){if(a.t==2)a.c+=bJ(a.l-a.c.length,"\0");else +a.c=c0(a.c,0,a.c.length);a.t=0}function +fw(a){if(a.length<24){for(var +b=0;bcr)return false;return true}else +return!/[^\x00-\x7f]/.test(a)}function +lW(a){for(var +l=e,d=e,h,g,j,b,c=0,k=a.length;ccO){d.substr(0,1);l+=d;d=e;l+=a.slice(c,f)}else +d+=a.slice(c,f);if(f==k)break;c=f}b=1;if(++c=55295&&b<57344)b=2}else{b=3;if(++c1114111)b=3}}}}}if(b<4){c-=b;d+="\ufffd"}else +if(b>bc)d+=String.fromCharCode(55232+(b>>10),cG+(b&fo));else +d+=String.fromCharCode(b);if(d.length>be){d.substr(0,1);l+=d;d=e}}return l+d}function +lU(a){switch(a.t){case +9:return a.c;default:ax(a);case +0:if(fw(a.c)){a.t=9;return a.c}a.t=8;case +8:return lW(a.c)}}function +T(a,b,c){this.t=a;this.c=b;this.l=c}T.prototype.toString=function(){return lU(this)};function +d(a){return new +T(0,a,a.length)}function +cZ(a,b){lK(a,d(b))}var +A=[0];function +aH(a){cZ(A.Invalid_argument,a)}function +la(){aH(fi)}function +p(a,b){if(b>>>0>=a.length-1)la();return a}function +cQ(a){if(isFinite(a)){if(Math.abs(a)>=2.22507385850720138e-308)return 0;if(a!=0)return 1;return 2}return isNaN(a)?4:3}function +ll(a,b){var +c=a[3]<<16,d=b[3]<<16;if(c>d)return 1;if(cb[2])return 1;if(a[2]b[1])return 1;if(a[1]b.c?1:0}function +bg(a,b,c){var +e=[];for(;;){if(!(c&&a===b))if(a +instanceof +T)if(b +instanceof +T){if(a!==b){var +d=lO(a,b);if(d!=0)return d}}else +return 1;else +if(a +instanceof +Array&&a[0]===(a[0]|0)){var +f=a[0];if(f===fr)f=0;if(f===bx){a=a[1];continue}else +if(b +instanceof +Array&&b[0]===(b[0]|0)){var +g=b[0];if(g===fr)g=0;if(g===bx){b=b[1];continue}else +if(f!=g)return f1)e.push(a,b,1)}}else +return 1}else +if(b +instanceof +T||b +instanceof +Array&&b[0]===(b[0]|0))return-1;else +if(typeof +a!="number"&&a&&a.compare)return a.compare(b,c);else{if(ab)return 1;if(a!=b){if(!c)return NaN;if(a==a)return 1;if(b==b)return-1}}if(e.length==0)return 0;var +h=e.pop();b=e.pop();a=e.pop();if(h+10)if(b==0&&(c>=a.l||a.t==2&&c>=a.c.length))if(d==0){a.c=e;a.t=2}else{a.c=bJ(c,String.fromCharCode(d));a.t=c==a.l?0:2}else{if(a.t!=4)bD(a);for(c+=b;b0&&b===b)return b;a=a.replace(/_/g,e);b=+a;if(a.length>0&&b===b||/^[+-]?nan$/i.test(a))return b;if(/^ *0x[0-9a-f_]+p[+-]?[0-9_]+/i.test(a)){var +c=a.indexOf("p");c=c==-1?a.indexOf("P"):c;var +d=+a.substring(c+1);b=+a.substring(0,c);return b*Math.pow(2,d)}if(/^\+?inf(inity)?$/i.test(a))return Infinity;if(/^-inf(inity)?$/i.test(a))return-Infinity;cR("float_of_string")}function +cY(a){a=bf(a);var +e=a.length;if(e>31)aH("format_int: format too long");var +b={justify:cs,signstyle:aS,filler:at,alternate:false,base:0,signedconv:false,width:0,uppercase:false,sign:1,prec:-1,conv:"f"};for(var +d=0;d=0&&c<=9){b.width=b.width*10+c;d++}d--;break;case".":b.prec=0;d++;while(c=a.charCodeAt(d)-48,c>=0&&c<=9){b.prec=b.prec*10+c;d++}d--;case"d":case"i":b.signedconv=true;case"u":b.base=10;break;case"x":b.base=16;break;case"X":b.base=16;b.uppercase=true;break;case"o":b.base=8;break;case"e":case"f":case"g":b.signedconv=true;b.conv=c;break;case"E":case"F":case"G":b.signedconv=true;b.uppercase=true;b.conv=c.toLowerCase();break}}return b}function +cS(a,b){if(a.uppercase)b=b.toUpperCase();var +g=b.length;if(a.signedconv&&(a.sign<0||a.signstyle!=aS))g++;if(a.alternate){if(a.base==8)g+=1;if(a.base==16)g+=2}var +c=e;if(a.justify==cs&&a.filler==at)for(var +f=g;f=1e+21||b.toFixed(0).length>e){var +d=i-1;while(c.charAt(d)==ad)d--;if(c.charAt(d)==bd)d--;c=c.slice(0,d+1)+c.slice(i);d=c.length;if(c.charAt(d-3)==cK)c=c.slice(0,d-1)+ad+c.slice(d-1);break}else{var +g=e;if(h<0){g-=h+1;c=b.toFixed(g)}else +while(c=b.toFixed(g),c.length>e+1)g--;if(g){var +d=c.length-1;while(c.charAt(d)==ad)d--;if(c.charAt(d)==bd)d--;c=c.slice(0,d+1)}}break}return cS(f,c)}function +bE(a,b){if(bf(a)==cE)return d(e+b);var +c=cY(a);if(b<0)if(c.signedconv){c.sign=-1;b=-b}else +b>>>=0;var +f=b.toString(c.base);if(c.prec>=0){c.filler=at;var +g=c.prec-f.length;if(g>0)f=bJ(g,ad)+f}return cS(c,f)}function +li(){return 0}function +ft(a,b){return+(bg(a,b,false)>=0)}function +lk(a){if(!isFinite(a)){if(isNaN(a))return[N,1,0,cH];return a>0?[N,0,0,cy]:[N,0,0,cH]}var +f=a>=0?0:co;if(f)a=-a;var +b=Math.floor(Math.LOG2E*Math.log(a))+fo;if(b<=0){b=0;a/=Math.pow(2,-fq)}else{a/=Math.pow(2,b-fg);if(a<16){a*=2;b-=1}if(b==0)a/=2}var +d=Math.pow(2,24),c=a|0;a=(a-c)*d;var +e=a|0;a=(a-e)*d;var +g=a|0;c=c&15|f|b<<4;return[N,g,e,c]}if(!Math.imul)Math.imul=function(a,b){b|=0;return((a>>16)*b<<16)+(a&bc)*b|0};var +aY=Math.imul,lj=function(){var +o=bb;function +c(a,b){return a<>>32-b}function +g(a,b){b=aY(b,3432918353|0);b=c(b,15);b=aY(b,461845907);a^=b;a=c(a,13);return(a+(a<<2)|0)+(3864292196|0)|0}function +q(a){a^=a>>>16;a=aY(a,2246822507|0);a^=a>>>13;a=aY(a,3266489909|0);a^=a>>>16;return a}function +r(a,b){var +d=b[1]|b[2]<<24,c=b[2]>>>8|b[3]<<16;a=g(a,d);a=g(a,c);return a}function +s(a,b){var +d=b[1]|b[2]<<24,c=b[2]>>>8|b[3]<<16;a=g(a,c^d);return a}function +u(a,b){var +e=b.length,c,d;for(c=0;c+4<=e;c+=4){d=b.charCodeAt(c)|b.charCodeAt(c+1)<<8|b.charCodeAt(c+2)<<16|b.charCodeAt(c+3)<<24;a=g(a,d)}d=0;switch(e&3){case +3:d=b.charCodeAt(c+2)<<16;case +2:d|=b.charCodeAt(c+1)<<8;case +1:d|=b.charCodeAt(c);a=g(a,d)}a^=e;return a}function +t(a,b){var +e=b.length,c,d;for(c=0;c+4<=e;c+=4){d=b[c]|b[c+1]<<8|b[c+2]<<16|b[c+3]<<24;a=g(a,d)}d=0;switch(e&3){case +3:d=b[c+2]<<16;case +2:d|=b[c+1]<<8;case +1:d|=b[c];a=g(a,d)}a^=e;return a}return function(a,b,c,d){var +k,l,m,i,h,f,e,j,n;i=b;if(i<0||i>o)i=o;h=a;f=c;k=[d];l=0;m=1;while(l0){e=k[l++];if(e +instanceof +Array&&e[0]===(e[0]|0))switch(e[0]){case +248:f=g(f,e[2]);h--;break;case +250:k[--l]=e[1];break;case +255:f=s(f,e);h--;break;default:var +p=e.length-1<<10|e[0];f=g(f,p);for(j=1,n=e.length;j=i)break;k[m++]=e[j]}break}else +if(e +instanceof +T){switch(e.t&6){default:ax(e);case +0:f=u(f,e.c);break;case +2:f=t(f,e.c)}h--}else +if(e===(e|0)){f=g(f,e+e+1);h--}else +if(e===+e){f=r(f,lk(e));h--}}f=q(f);return f&cq}}();function +cV(a){var +c=(a[3]&32767)>>4;if(c==2047)return(a[1]|a[2]|a[3]&15)==0?a[3]&co?-Infinity:Infinity:NaN;var +d=Math.pow(2,-24),b=(a[1]*d+a[2])*d+(a[3]&15);if(c>0){b+=16;b*=Math.pow(2,c-fg)}else +b*=Math.pow(2,-fq);if(a[3]&co)b=-b;return b}function +lo(a){return(a[3]|a[2]|a[1])==0}function +lr(a){return[N,a&ae,a>>24&ae,a>>31&bc]}function +fA(a){var +d=a.length,c=new +Array(d);for(var +b=0;b>24),e=a[3]-b[3]+(d>>24);return[N,c&ae,d&ae,e&bc]}function +fv(a,b){if(a[3]>b[3])return 1;if(a[3]b[2])return 1;if(a[2]b[1])return 1;if(a[1]>23;a[2]=(a[2]<<1|a[1]>>23)&ae;a[1]=a[1]<<1&ae}function +lp(a){a[1]=(a[1]>>>1|a[2]<<23)&ae;a[2]=(a[2]>>>1|a[3]<<23)&ae;a[3]=a[3]>>>1}function +lu(a,b){var +e=0,d=fA(a),c=fA(b),f=[N,0,0,0];while(fv(d,c)>0){e++;fu(c)}while(e>=0){e--;fu(f);if(fv(d,c)>=0){f[1]++;d=ls(d,c)}lp(c)}return[0,f,d]}function +lt(a){return a[1]|a[2]<<24}function +ln(a){return a[3]<<16<0}function +lq(a){var +b=-a[1],c=-a[2]+(b>>24),d=-a[3]+(c>>24);return[N,b&ae,c&ae,d&bc]}function +lm(a,b){var +c=cY(a);if(c.signedconv&&ln(b)){c.sign=-1;b=lq(b)}var +d=e,i=lr(c.base),h="0123456789abcdef";do{var +g=lu(b,i);b=g[1];d=h.charAt(lt(g[2]))+d}while(!lo(b));if(c.prec>=0){c.filler=at;var +f=c.prec-d.length;if(f>0)d=bJ(f,ad)+d}return cS(c,d)}function +bF(a){return+(a>31&&acO){c.substr(0,1);g+=c;c=e;g+=a.slice(d,f)}else +c+=a.slice(d,f);if(f==h)break;d=f}if(b>6);c+=String.fromCharCode(i|b&63)}else +if(b=cD)c+=String.fromCharCode(cu|b>>12,i|b>>6&63,i|b&63);else +if(b>=eV||d+1==h||(j=a.charCodeAt(d+1))cD)c+="\xef\xbf\xbd";else{d++;b=(b<<10)+j-56613888;c+=String.fromCharCode(cp|b>>18,i|b>>12&63,i|b>>6&63,i|b&63)}if(c.length>be){c.substr(0,1);g+=c;c=e}}return g+c}function +ay(a){var +b=9;if(!fw(a))b=8,a=lX(a);return new +T(b,a,a.length)}function +l1(a){var +d=a.length,c=new +Array(d);for(var +b=0;b0?af(a,l1(arguments)):af(a,[undefined])}}function +lz(a,b){return+(bg(a,b,false)<=0)}function +lA(a,b){return+(bg(a,b,false)<0)}function +bh(a){a=bf(a);var +d=a.length/2,c=new +Array(d);for(var +b=0;b>16;return c}function +lb(a){if(a.t!=4)bD(a);return a.c}function +B(a,b,c){var +o=2,p=3,s=5,e=6,i=7,h=8,k=9,n=1,m=2,r=3,t=4,q=5;if(!a.lex_default){a.lex_base=bh(a[n]);a.lex_backtrk=bh(a[m]);a.lex_check=bh(a[q]);a.lex_trans=bh(a[t]);a.lex_default=bh(a[r])}var +f,d=b,l=lb(c[o]);if(d>=0){c[i]=c[s]=c[e];c[h]=-1}else +d=-d-1;for(;;){var +g=a.lex_base[d];if(g<0)return-g-1;var +j=a.lex_backtrk[d];if(j>=0){c[i]=c[e];c[h]=j}if(c[e]>=c[p])if(c[k]==0)return-d-1;else +f=bb;else{f=l[c[e]];c[e]++}d=a.lex_check[g+f]==d?a.lex_trans[g+f]:a.lex_default[d];if(d<0){c[e]=c[i];if(c[h]==-1)cR("lexing: empty token");else +return c[h]}else +if(f==bb)c[k]=0}}function +aW(a,b){var +a=a+1|0,c=new +Array(a);c[0]=0;for(var +d=1;d>>32-e,c)}function +h(a,b,c,d,e,f,g){return m(b&c|~b&d,a,b,e,f,g)}function +j(a,b,c,d,e,f,g){return m(b&d|c&~d,a,b,e,f,g)}function +k(a,b,c,d,e,f,g){return m(b^c^d,a,b,e,f,g)}function +l(a,b,c,d,e,f,g){return m(c^(b|~d),a,b,e,f,g)}function +o(a,b){var +g=b;a[g>>2]|=i<<8*(g&3);for(g=(g&~3)+8;(g&63)<60;g+=4)a[(g>>2)-1]=0;a[(g>>2)-1]=b<<3;a[g>>2]=b>>29&536870911;var +m=[1732584193,4023233417,2562383102,271733878];for(g=0;g>8*o&N;return p}return function(a,b,c){var +h=[];switch(a.t&6){default:ax(a);case +0:var +g=a.c;for(var +d=0;d>2]=g.charCodeAt(e)|g.charCodeAt(e+1)<<8|g.charCodeAt(e+2)<<16|g.charCodeAt(e+3)<<24}for(;d>2]|=g.charCodeAt(d+b)<<8*(d&3);break;case +4:var +f=a.c;for(var +d=0;d>2]=f[e]|f[e+1]<<8|f[e+2]<<16|f[e+3]<<24}for(;d>2]|=f[d+b]<<8*(d&3)}return fG(o(h,c))}}();function +aa(a){cZ(A.Sys_error,a)}function +aX(a){if(!a.opened)aa("Cannot flush a closed channel");if(a.buffer==e)return 0;if(a.output)switch(a.output.length){case +2:a.output(a,a.buffer);break;default:a.output(a.buffer)}a.buffer=e;return 0}var +fI=0;function +l2(){return new +Date().getTime()/eF}function +c1(){return Math.floor(l2())}function +aw(a){this.data=a;this.inode=fI++;var +b=c1();this.atime=b;this.mtime=b;this.ctime=b}aw.prototype={truncate:function(){this.data=x(0);this.modified()},modified:function(){var +a=c1();this.atime=a;this.mtime=a}};function +g(a){return a.l}function +fC(a){a=a +instanceof +T?a.toString():a;aa(a+": No such file or directory")}var +lf=eC;function +bG(a){a=a +instanceof +T?a.toString():a;if(a.charCodeAt(0)!=47)a=lf+a;var +d=a.split(eC),b=[];for(var +c=0;c1)b.pop();break;case".":break;case"":if(b.length==0)b.push(e);break;default:b.push(d[c]);break}b.orig=a;return b}function +aG(){this.content={};this.inode=fI++;var +a=c1();this.atime=a;this.mtime=a;this.ctime=a}aG.prototype={exists:function(a){return this.content[a]?1:0},mk:function(a,b){this.content[a]=b},get:function(a){return this.content[a]},list:function(){var +a=[];for(var +b +in +this.content)a.push(b);return a},remove:function(a){delete +this.content[a]}};var +bI=new +aG();bI.mk(e,new +aG());function +cU(a){var +b=bI;for(var +c=0;c=h){var +e=x(f+c);V(a.file.data,0,e,0,h);V(i,0,e,f,c);a.file.data=e}a.offset+=c;a.file.modified();return 0}function +fy(a){var +b;switch(a){case +1:b=lZ;break;case +2:b=lY;break;default:b=lN}var +d=A.fds[a];if(d.flags.rdonly)aa(fp+a+" is readonly");var +c={file:d.file,offset:d.offset,fd:a,opened:true,buffer:e,output:b};bH[c.fd]=c;return c}function +lD(){var +a=0;for(var +b +in +bH)if(bH[b].opened)a=[0,bH[b],a];return a}function +cW(a,b,c,d){if(!a.opened)aa("Cannot output to a closed channel");var +f;if(c==0&&g(b)==d)f=b;else{f=x(d);V(b,c,f,0,d)}var +e=f.toString(),h=e.lastIndexOf("\n");if(h<0)a.buffer+=e;else{a.buffer+=e.substr(0,h+1);aX(a);a.buffer+=e.substr(h+1)}return 0}function +cX(a,b){var +c=d(String.fromCharCode(b));cW(a,c,0,1);return 0}function +fB(a){throw a}function +lL(){fB(A.Division_by_zero)}function +lE(a,b){if(b==0)lL();return a%b}function +bi(a,b){return+(bg(a,b,false)!=0)}function +lG(a){return+(a +instanceof +Array)}function +lH(a,b){a[0]=b;return 0}function +bj(a){return a +instanceof +Array?a[0]:a +instanceof +T?cm:eF}function +W(a,b,c){A[a+1]=b;if(c)A[c]=b}var +fz={};function +lM(a,b){fz[bf(a)]=b;return 0}var +lI=0;function +a(a){a[2]=lI++;return a}function +fF(a,b){a.t&6&&ax(a);b.t&6&&ax(b);return a.c==b.c?1:0}function +fE(){aH(fi)}function +bk(a,b){switch(a.t&6){default:if(b>=a.c.length)return 0;case +0:return a.c.charCodeAt(b);case +4:return a.c[b]}}function +u(a,b){if(b>>>0>=a.l)fE();return bk(a,b)}function +bK(a,b){return 1-fF(a,b)}function +v(a,b,c){c&=N;if(a.t!=4){if(b==a.c.length){a.c+=String.fromCharCode(c);if(b+1==a.l)a.t=0;return 0}bD(a)}a.c[b]=c;return 0}function +ag(a,b,c){if(b>>>0>=a.l)fE();return v(a,b,c)}function +lP(){return 32}function +lQ(a){var +b=X;if(b.quit)b.quit(a);if(b.process&&b.process.exit)b.process.exit(a);aH("Function 'exit' not implemented")}function +lJ(){fB(A.Not_found)}function +fH(a){var +b=X,c=a.toString();if(b.process&&b.process.env&&b.process.env[c]!=undefined)return ay(b.process.env[c]);lJ()}function +lT(){var +a=new +Date()^4294967295*Math.random();return[0,a]}function +Q(a){var +b=1;while(a&&a.joo_tramp){a=a.joo_tramp.apply(null,a.joo_args);b++}return a}function +k(a,b){return{joo_tramp:a,joo_args:b}}function +lV(a,b){if(typeof +b==="function"){a.fun=b;return 0}if(b.fun){a.fun=b.fun;return 0}var +c=b.length;while(c--)a[c]=b[c];return 0}function +fD(a){return a}function +lF(a){return fz[a]}function +C(a){if(a +instanceof +Array)return a;if(X.RangeError&&a +instanceof +X.RangeError&&a.message&&a.message.match(/maximum call stack/i))return fD(A.Stack_overflow);if(X.InternalError&&a +instanceof +X.InternalError&&a.message&&a.message.match(/too much recursion/i))return fD(A.Stack_overflow);if(a +instanceof +X.Error)return[0,lF(eA),a];return[0,A.Failure,ay(String(a))]}function +h(a,b){return a.length==1?a(b):af(a,[b])}function +l(a,b,c){return a.length==2?a(b,c):af(a,[b,c])}function +ac(a,b,c,d){return a.length==3?a(b,c,d):af(a,[b,c,d])}function +k$(a,b,c,d,e){return a.length==4?a(b,c,d,e):af(a,[b,c,d,e])}function +bv(a,b,c,d,e,f){return a.length==5?a(b,c,d,e,f):af(a,[b,c,d,e,f])}var +dm=[f,d(fj),-1],bm=[f,d(ey),-3],c2=[f,d(eU),-4],J=[f,d(eZ),-7],dp=[f,d(eG),-8],dn=[f,d(e0),-9],m=[f,d(fa),-11],dq=[f,d(et),-12],c$=[0,d(e),1,0,0],bZ=[0,[11,d('File "'),[2,0,[11,d(fk),[4,0,0,0,[11,d(eM),[4,0,0,0,[12,45,[4,0,0,0,[11,d(": "),[2,0,0]]]]]]]]]],d('File "%s", line %d, characters %d-%d: %s')],dy=[0,0],d8=[0,1,1,0,1,1,1,1,-921200851,2,0,0,0,0,0],H=[0,d(cv),d(cw),d(cI),d(cB),d(cA),d(e),d(e),d(e),d(e),d(e),d(e)];W(11,dq,et);W(10,m,fa);W(9,[f,d(eS),eI],eS);W(8,dn,e0);W(7,dp,eG);W(6,J,eZ);W(5,[f,d(e7),-6],e7);W(4,[f,d(ez),-5],ez);W(3,c2,eU);W(2,bm,ey);W(1,[f,d(ex),-2],ex);W(0,dm,fj);var +fW=d("output_substring"),fU=d(fb),fT=d(bd),fR=d(eW),fS=d(eY),fJ=d("Pervasives.Exit"),fL=[N,0,0,cy],fN=[N,0,0,cH],fP=[N,1,0,cy],fZ=d("Array.Bottom"),f3=d(eN),f4=d(fd),f5=d(ew),f6=d(eB),f2=d(e3),f1=d("\\'"),f0=d("Char.chr"),ga=d("String.contains_from / Bytes.contains_from"),f9=d("String.blit / Bytes.blit_string"),f8=d("Bytes.blit"),f7=d("String.sub / Bytes.sub"),gb=d(e),gd=d("Sys.Break"),gj=d("Map.remove_min_elt"),gk=[0,0,0,0],gl=[0,d("map.ml"),270,10],gm=[0,0,0],gf=d(by),gg=d(by),gh=d(by),gi=d(by),go=d("Queue.Empty"),gr=d("CamlinternalLazy.Undefined"),gv=d("Stream.Failure"),gw=d("Stream.Error"),gy=d("Buffer.add_substring/add_subbytes"),gx=d("Buffer.add: cannot grow buffer"),gH=d("%c"),gI=d("%s"),gJ=d(er),gK=d("%li"),gL=d("%ni"),gM=d("%Li"),gN=d("%f"),gO=d("%B"),gP=d("%{"),gQ=d("%}"),gR=d("%("),gS=d("%)"),gT=d("%a"),gU=d("%t"),gV=d("%?"),gW=d("%r"),gX=d("%_r"),gY=[0,d(z),816,23],g9=[0,d(z),780,21],g1=[0,d(z),781,21],g_=[0,d(z),784,21],g2=[0,d(z),785,21],g$=[0,d(z),788,19],g3=[0,d(z),789,19],ha=[0,d(z),792,22],g4=[0,d(z),793,22],hb=[0,d(z),797,30],g5=[0,d(z),798,30],g7=[0,d(z),802,26],gZ=[0,d(z),803,26],g8=[0,d(z),812,28],g0=[0,d(z),813,28],g6=[0,d(z),817,23],hN=d(eR),hL=[0,d(z),1449,4],hM=d("Printf: bad conversion %["),hO=[0,d(z),1517,39],hP=[0,d(z),1540,31],hQ=[0,d(z),1541,31],dk=d("Printf: bad conversion %_"),hR=d(eP),hS=d(eT),hT=d(eP),hU=d(eT),hJ=[0,d(e6),[0,d(e6),0]],hH=d(eE),hI=d(bd),hF=d("neg_infinity"),hG=d("infinity"),hE=d(fb),hr=[0,d(aR),[0,d(cJ),0]],hs=[0,d(eD),[0,d(cJ),0]],ht=[0,d(eH),[0,d(cJ),0]],hu=[0,d(aR),[0,d(cP),0]],hv=[0,d(eD),[0,d(cP),0]],hw=[0,d(eH),[0,d(cP),0]],hx=[0,d(aR),[0,d(cF),0]],hy=[0,d(cL),[0,d(cF),0]],hz=[0,d(aR),[0,d(eO),0]],hA=[0,d(cL),[0,d(eO),0]],hB=[0,d(aR),[0,d(e9),0]],hC=[0,d(cL),[0,d(e9),0]],hD=[0,d(aR),[0,d("u"),0]],he=d(cE),hf=d("%+d"),hg=d("% d"),hh=d(er),hi=d("%+i"),hj=d("% i"),hk=d("%x"),hl=d("%#x"),hm=d("%X"),hn=d("%#X"),ho=d("%o"),hp=d("%#o"),hq=d(eR),hd=[0,d(e_),[0,d(e_),0]],gz=d("@]"),gA=d("@}"),gB=d("@?"),gC=d("@\n"),gD=d("@."),gE=d("@@"),gF=d("@%"),gG=d("@"),hc=d("CamlinternalFormat.Type_mismatch"),hZ=d(e),h0=[0,[11,d(eu),[2,0,[2,0,0]]],d(", %s%s")],ih=[0,[2,0,[12,10,0]],d("%s\n")],ii=[0,[11,d(eK),0],d(eK)],ia=d("Raised at"),ib=d("Re-raised at"),ic=d("Raised by primitive operation at"),id=d("Called from"),ie=[0,[2,0,[11,d(' file "'),[2,0,[11,d(fk),[4,0,0,0,[11,d(eM),[4,0,0,0,[12,45,[4,0,0,0,0]]]]]]]]],d('%s file "%s", line %d, characters %d-%d')],ig=[0,[2,0,[11,d(" unknown location"),0]],d("%s unknown location")],h6=d("Out of memory"),h7=d("Stack overflow"),h8=d("Pattern matching failed"),h9=d("Assertion failed"),h_=d("Undefined recursive module"),h2=[0,[12,40,[2,0,[2,0,[12,41,0]]]],d("(%s%s)")],h3=d(e),h4=d(e),h5=[0,[12,40,[2,0,[12,41,0]]],d("(%s)")],hY=[0,[4,0,0,0,0],d(cE)],hW=[0,[3,0,0],d("%S")],hX=d("_"),ij=d(cF),k8=d("OCAMLRUNPARAM"),k6=d("CAMLRUNPARAM"),il=d(e),iK=[3,0,3],iL=d(bd),iG=d(fn),iH=d("' but found"),ko=d($),kp=d("Expected '>' but found"),kq=d($),kr=d("Unterminated comment"),ks=d("Expected string or identifier but found"),kt=d($),ku=d("Expected ',' or ']' but found"),kv=d($),kw=d("Expected ',' or ')' but found"),kx=d($),ky=d("Expected ',' or '}' but found"),kz=d($),kA=d("Expected ':' but found"),kB=d($),kF=d("Blank input data"),kC=d("Junk after end of JSON value:"),j4=[0,[2,0,[11,d(" '"),[2,0,[2,0,[12,39,0]]]]],d("%s '%s%s'")],j3=[0,d(bw),72,32],jY=[0,[11,d("File "),[2,0,[11,d(", line"),0]]],d("File %s, line")],j2=d("Line"),jZ=[0,[11,d("byte "),[4,3,0,0,0]],d("byte %i")],j1=[0,[11,d("bytes "),[4,3,0,0,[12,45,[4,3,0,0,0]]]],d("bytes %i-%i")],j0=[0,[2,0,[12,32,[4,3,0,0,[11,d(eu),[2,0,[11,d(":\n"),[2,0,0]]]]]]],d("%s %i, %s:\n%s")],jX=[0,d(bw),44,13],jW=d("Root is not an object or array"),jS=d("NaN value not allowed in standard JSON"),jT=[0,[8,9,0,[0,16],0],d(es)],jV=[0,[8,9,0,[0,17],0],d(ff)],jU=d(eL),jQ=d("Infinity value not allowed in standard JSON"),jR=d("-Infinity value not allowed in standard JSON"),jM=d("NaN"),jN=[0,[8,9,0,[0,16],0],d(es)],jP=[0,[8,9,0,[0,17],0],d(ff)],jO=d(eL),jK=d("Infinity"),jL=d("-Infinity"),jH=d(eW),jI=d(eY),jG=d("null"),jA=d(eN),jB=d(fd),jC=d(ew),jD=d("\\f"),jE=d(eB),jF=d('\\"'),jz=d(e3),jx=[0,[11,d("src="),[3,0,[11,d(" start="),[4,3,0,0,[11,d(" len="),[4,3,0,0,[12,10,[10,0]]]]]]]],d("src=%S start=%i len=%i\n%!")],jy=d("oops"),jv=d("\\u00"),jp=[0,d(bw),72,32],jn=[0,d("common.ml"),57,4],jh=d("Yojson.Json_error"),jj=d("Yojson.End_of_array"),jk=d("Yojson.End_of_object"),jl=d("Yojson.End_of_tuple"),jm=d("Yojson.End_of_input"),jr=d("Yojson.Basic.Int_overflow"),js=[0,d(cv),d(cw),d(cI),d(cB),d(cA),d(e),d(e),d(e),d(e),d(e),d(e)],jt=d("Yojson.Basic.Util.Type_error"),ju=d("Yojson.Basic.Util.Undefined"),j5=d("Yojson.Safe.Int_overflow"),kI=d("Yojson.Raw.Int_overflow"),kJ=[0,d(cv),d(cw),d(cI),d(cB),d(cA),d(e),d(e),d(e),d(e),d(e),d(e)],kL=[0,au,d("Index.id")],kM=d(fm),kN=d(fh),kP=d(fh),kQ=d(fm),kR=[0,au,d(fl)],kS=[0,[0,au,d("Index.message.msg")],[0,au,d("Index.message.sender")]],kO=[0,au,d(fl)],kU=[0,aF,[0,[0,bz,d(e2)],0]],kT=[0,aF,[0,[0,bz,d(ev)],0]],kW=d(e2),kX=d(ev),kY=[0,bA,0],kZ=[0,bA,1],kV=[0,au,d("Index.command")],k2=d("https:"),k3=d("wss://"),k5=d("ws://"),k4=d("/mux/"),k0=d("Unknown command!"),k1=[0,[11,d("Got message from "),[4,0,0,0,[11,d("!\n"),0]]],d("Got message from %d!\n")];function +s(a){if(typeof +a==="number")return 0;else +switch(a[0]){case +0:return[0,s(a[1])];case +1:return[1,s(a[1])];case +2:return[2,s(a[1])];case +3:return[3,s(a[1])];case +4:return[4,s(a[1])];case +5:return[5,s(a[1])];case +6:return[6,s(a[1])];case +7:return[7,s(a[1])];case +8:var +c=a[1];return[8,c,s(a[2])];case +9:var +b=a[1];return[9,b,b,s(a[3])];case +10:return[10,s(a[1])];case +11:return[11,s(a[1])];case +12:return[12,s(a[1])];case +13:return[13,s(a[1])];default:return[14,s(a[1])]}}function +K(a,b){if(typeof +a==="number")return b;else +switch(a[0]){case +0:return[0,K(a[1],b)];case +1:return[1,K(a[1],b)];case +2:return[2,K(a[1],b)];case +3:return[3,K(a[1],b)];case +4:return[4,K(a[1],b)];case +5:return[5,K(a[1],b)];case +6:return[6,K(a[1],b)];case +7:return[7,K(a[1],b)];case +8:var +c=a[1];return[8,c,K(a[2],b)];case +9:var +d=a[2],e=a[1];return[9,e,d,K(a[3],b)];case +10:return[10,K(a[1],b)];case +11:return[11,K(a[1],b)];case +12:return[12,K(a[1],b)];case +13:return[13,K(a[1],b)];default:return[14,K(a[1],b)]}}function +r(a,b){if(typeof +a==="number")return b;else +switch(a[0]){case +0:return[0,r(a[1],b)];case +1:return[1,r(a[1],b)];case +2:var +c=a[1];return[2,c,r(a[2],b)];case +3:var +d=a[1];return[3,d,r(a[2],b)];case +4:var +e=a[3],f=a[2],g=a[1];return[4,g,f,e,r(a[4],b)];case +5:var +h=a[3],i=a[2],j=a[1];return[5,j,i,h,r(a[4],b)];case +6:var +k=a[3],l=a[2],m=a[1];return[6,m,l,k,r(a[4],b)];case +7:var +n=a[3],o=a[2],p=a[1];return[7,p,o,n,r(a[4],b)];case +8:var +q=a[3],s=a[2],t=a[1];return[8,t,s,q,r(a[4],b)];case +9:return[9,r(a[1],b)];case +10:return[10,r(a[1],b)];case +11:var +u=a[1];return[11,u,r(a[2],b)];case +12:var +v=a[1];return[12,v,r(a[2],b)];case +13:var +w=a[2],x=a[1];return[13,x,w,r(a[3],b)];case +14:var +y=a[2],z=a[1];return[14,z,y,r(a[3],b)];case +15:return[15,r(a[1],b)];case +16:return[16,r(a[1],b)];case +17:var +A=a[1];return[17,A,r(a[2],b)];case +18:var +B=a[1];return[18,B,r(a[2],b)];case +19:return[19,r(a[1],b)];case +20:var +C=a[2],D=a[1];return[20,D,C,r(a[3],b)];case +21:var +E=a[1];return[21,E,r(a[2],b)];case +22:return[22,r(a[1],b)];case +23:var +F=a[1];return[23,F,r(a[2],b)];default:var +G=a[2],H=a[1];return[24,H,G,r(a[3],b)]}}function +c3(a){throw[0,bm,a]}function +L(a){throw[0,c2,a]}var +c4=a([f,fJ,0]);function +aI(a,b){return ft(a,b)?a:b}function +aZ(a){return 0<=a?a:-a|0}var +fK=2147483647,fM=cV(fL),fO=cV(fN),fQ=cV(fP);function +Y(a,b){var +c=g(a),e=g(b),d=x(c+e|0);V(a,0,d,0,c);V(b,0,d,c,e);return d}lC(0);var +a0=fy(1),az=fy(2);function +fV(a){function +b(a){var +b=a;for(;;){if(b){var +c=b[2],d=b[1];try{aX(d)}catch(f){}var +b=c;continue}return 0}}return b(lD(0))}function +aJ(a,b){return cW(a,b,0,g(b))}function +c5(a){aJ(a0,a);cX(a0,10);return aX(a0)}function +c6(a){return aJ(az,a)}var +bM=[0,fV];function +fX(b){var +c=bM[1];bM[1]=function(a){h(b,0);return h(c,0)};return 0}function +c7(a){return h(bM[1],0)}function +fY(a,b){var +d=b.length-1;if(0===d)return[0];var +e=aW(d,h(a,b[1])),f=d-1|0,g=1;if(!(f<1)){var +c=g;for(;;){e[c+1]=h(a,b[c+1]);var +i=c+1|0;if(f!==c){var +c=i;continue}break}}return e}a([f,fZ,0]);function +bN(a){var +b=a,c=0;for(;;){if(b){var +d=[0,b[1],c],b=b[2],c=d;continue}return c}}function +bO(a,b){var +c=b;for(;;){if(c){var +d=c[2];h(a,c[1]);var +c=d;continue}return 0}}function +t(a){if(0<=a)if(!(N>>0?1:0:65<=e?0:1;else{if(32===e)var +h=1;else +if(43<=e)switch(e-43|0){case +5:if(c<(d+2|0))if(1>>0)if(-20<=j)var +m=1;else{switch(j+34|0){case +8:v(c,b[1],92);b[1]++;v(c,b[1],98);var +h=1;break;case +9:v(c,b[1],92);b[1]++;v(c,b[1],116);var +h=1;break;case +10:v(c,b[1],92);b[1]++;v(c,b[1],eQ);var +h=1;break;case +13:v(c,b[1],92);b[1]++;v(c,b[1],114);var +h=1;break;default:var +m=1,h=0}if(h)var +m=0}else +var +m=56<(j-1|0)>>>0?(v(c,b[1],92),b[1]++,v(c,b[1],d),0):1;if(m)if(bF(d))v(c,b[1],d);else{v(c,b[1],92);b[1]++;v(c,b[1],48+(d/ct|0)|0);b[1]++;v(c,b[1],48+((d/10|0)%10|0)|0);b[1]++;v(c,b[1],48+(d%10|0)|0)}b[1]++;var +t=i+1|0;if(q!==i){var +i=t;continue}break}}var +o=c}}else +var +o=a;return bQ(o,hd)}}function +bX(a,b){switch(a){case +0:var +c=hr;break;case +1:var +c=hs;break;case +2:var +c=ht;break;case +3:var +c=hu;break;case +4:var +c=hv;break;case +5:var +c=hw;break;case +6:var +c=hx;break;case +7:var +c=hy;break;case +8:var +c=hz;break;case +9:var +c=hA;break;case +10:var +c=hB;break;case +11:var +c=hC;break;default:var +c=hD}return bQ(bP(1,b),c)}function +dg(a,b){switch(a){case +0:var +c=he;break;case +1:var +c=hf;break;case +2:var +c=hg;break;case +3:var +c=hh;break;case +4:var +c=hi;break;case +5:var +c=hj;break;case +6:var +c=hk;break;case +7:var +c=hl;break;case +8:var +c=hm;break;case +9:var +c=hn;break;case +10:var +c=ho;break;case +11:var +c=hp;break;default:var +c=hq}return bE(c,b)}function +dh(a,b){return bE(bX(a,108),b)}function +di(a,b){return bE(bX(a,eQ),b)}function +dj(a,b){return lm(bX(a,76),b)}function +ai(a,b,c){var +p=aZ(b);if(15===a)var +l=hE;else{var +o=aZ(p);switch(a){case +15:var +h=70;break;case +0:case +1:case +2:var +h=eJ;break;case +3:case +4:case +5:var +h=101;break;case +6:case +7:case +8:var +h=69;break;case +9:case +10:case +11:var +h=fc;break;default:var +h=71}var +f=db(16);a3(f,37);switch(a){case +1:case +4:case +7:case +10:case +13:a3(f,43);break;case +2:case +5:case +8:case +11:case +14:a3(f,32);break}a3(f,46);E(f,d(e+o));a3(f,h);var +l=dd(f)}var +i=fs(l,c);if(15===a){var +m=cQ(c),q=g(i);if(3===m)return c<0?hF:hG;if(4<=m)return hH;var +j=0;for(;;){if(j===q)var +n=0;else{var +k=u(i,j)-46|0,r=23>>0?55===k?1:0:21<(k-1|0)>>>0?1:0;if(!r){var +j=j+1|0;continue}var +n=1}return n?i:Y(i,hI)}}return i}function +ba(a,b,j,d,e){var +i=b,f=d,g=e;for(;;)if(typeof +g==="number")return l(i,j,f);else +switch(g[0]){case +0:var +N=g[1];return function(a){return n(i,j,[5,f,a],N)};case +1:var +O=g[1];return function(a){if(39===a)var +b=f1;else +if(92===a)var +b=f2;else{if(14<=a)var +c=0;else +switch(a){case +8:var +b=f3,c=1;break;case +9:var +b=f4,c=1;break;case +10:var +b=f5,c=1;break;case +13:var +b=f6,c=1;break;default:var +c=0}if(!c)if(bF(a)){var +e=x(1);v(e,0,a);var +b=e}else{var +d=x(4);v(d,0,92);v(d,1,48+(a/ct|0)|0);v(d,2,48+((a/10|0)%10|0)|0);v(d,3,48+(a%10|0)|0);var +b=d}}return n(i,j,[4,f,bQ(b,hJ)],O)};case +2:var +I=g[2],J=g[1];return a<50?a$(1+a,i,j,f,I,J,function(a){return a}):k(a$,[0,i,j,f,I,J,function(a){return a}]);case +3:return a<50?a$(1+a,i,j,f,g[2],g[1],df):k(a$,[0,i,j,f,g[2],g[1],df]);case +4:return a<50?al(1+a,i,j,f,g[4],g[2],g[3],dg,g[1]):k(al,[0,i,j,f,g[4],g[2],g[3],dg,g[1]]);case +5:return a<50?al(1+a,i,j,f,g[4],g[2],g[3],dh,g[1]):k(al,[0,i,j,f,g[4],g[2],g[3],dh,g[1]]);case +6:return a<50?al(1+a,i,j,f,g[4],g[2],g[3],di,g[1]):k(al,[0,i,j,f,g[4],g[2],g[3],di,g[1]]);case +7:return a<50?al(1+a,i,j,f,g[4],g[2],g[3],dj,g[1]):k(al,[0,i,j,f,g[4],g[2],g[3],dj,g[1]]);case +8:var +t=g[4],u=g[3],z=g[2],y=g[1];if(typeof +z==="number"){if(typeof +u==="number")return 0===u?function(a){return n(i,j,[4,f,ai(y,bU,a)],t)}:function(a,b){return n(i,j,[4,f,ai(y,a,b)],t)};var +ad=u[1];return function(a){return n(i,j,[4,f,ai(y,ad,a)],t)}}else{if(0===z[0]){var +D=z[2],E=z[1];if(typeof +u==="number")return 0===u?function(a){return n(i,j,[4,f,P(E,D,ai(y,bU,a))],t)}:function(a,b){return n(i,j,[4,f,P(E,D,ai(y,a,b))],t)};var +ae=u[1];return function(a){return n(i,j,[4,f,P(E,D,ai(y,ae,a))],t)}}var +F=z[1];if(typeof +u==="number")return 0===u?function(a,b){return n(i,j,[4,f,P(F,a,ai(y,bU,b))],t)}:function(a,b,c){return n(i,j,[4,f,P(F,a,ai(y,b,c))],t)};var +af=u[1];return function(a,b){return n(i,j,[4,f,P(F,a,ai(y,af,b))],t)}}case +9:var +Q=g[1];return function(a){var +b=a?fR:fS;return n(i,j,[4,f,b],Q)};case +10:var +f=[7,f],g=g[1];continue;case +11:var +f=[2,f,g[1]],g=g[2];continue;case +12:var +f=[3,f,g[1]],g=g[2];continue;case +13:var +R=g[3],S=g[2],H=db(16);bV(H,S);var +M=dd(H);return function(a){return n(i,j,[4,f,M],R)};case +14:var +T=g[3],U=g[2];return function(a){var +c=a[1],b=q(c,s(w(U)));if(typeof +b[2]==="number")return n(i,j,f,r(b[1],T));throw G};case +15:var +V=g[1];return function(c,b){return n(i,j,[6,f,function(a){return l(c,a,b)}],V)};case +16:var +W=g[1];return function(a){return n(i,j,[6,f,a],W)};case +17:var +f=[0,f,g[1]],g=g[2];continue;case +18:var +B=g[1];if(0===B[0]){var +c=g[2],X=B[1][1],Y=0,i=function(f,i,c){return function(a,b){return n(i,a,[1,f,[0,b]],c)}}(f,i,c),f=Y,g=X;continue}var +C=g[2],Z=B[1][1],_=0,i=function(f,i,C){return function(a,b){return n(i,a,[1,f,[1,b]],C)}}(f,i,C),f=_,g=Z;continue;case +19:throw[0,m,hL];case +20:var +$=g[3],aa=[8,f,hM];return function(a){return n(i,j,aa,$)};case +21:var +ab=g[2];return function(a){return n(i,j,[4,f,bE(hN,a)],ab)};case +22:var +ac=g[1];return function(a){return n(i,j,[5,f,a],ac)};case +23:var +p=g[2],A=g[1];if(typeof +A==="number")switch(A){case +0:return a<50?o(1+a,i,j,f,p):k(o,[0,i,j,f,p]);case +1:return a<50?o(1+a,i,j,f,p):k(o,[0,i,j,f,p]);case +2:return a<50?o(1+a,i,j,f,p):k(o,[0,i,j,f,p]);case +3:throw[0,m,hO];default:return a<50?o(1+a,i,j,f,p):k(o,[0,i,j,f,p])}else +switch(A[0]){case +0:return a<50?o(1+a,i,j,f,p):k(o,[0,i,j,f,p]);case +1:return a<50?o(1+a,i,j,f,p):k(o,[0,i,j,f,p]);case +2:return a<50?o(1+a,i,j,f,p):k(o,[0,i,j,f,p]);case +3:return a<50?o(1+a,i,j,f,p):k(o,[0,i,j,f,p]);case +4:return a<50?o(1+a,i,j,f,p):k(o,[0,i,j,f,p]);case +5:return a<50?o(1+a,i,j,f,p):k(o,[0,i,j,f,p]);case +6:return a<50?o(1+a,i,j,f,p):k(o,[0,i,j,f,p]);case +7:return a<50?o(1+a,i,j,f,p):k(o,[0,i,j,f,p]);case +8:return a<50?ci(1+a,i,j,f,A[2],p):k(ci,[0,i,j,f,A[2],p]);case +9:return a<50?o(1+a,i,j,f,p):k(o,[0,i,j,f,p]);default:return a<50?o(1+a,i,j,f,p):k(o,[0,i,j,f,p])}default:var +K=g[3],L=g[1];return a<50?ch(1+a,i,j,f,K,L,h(g[2],0)):k(ch,[0,i,j,f,K,L,h(g[2],0)])}}function +ci(a,g,c,d,e,f){if(typeof +e==="number")return a<50?o(1+a,g,c,d,f):k(o,[0,g,c,d,f]);else +switch(e[0]){case +0:var +b=e[1];return function(a){return R(g,c,d,b,f)};case +1:var +h=e[1];return function(a){return R(g,c,d,h,f)};case +2:var +i=e[1];return function(a){return R(g,c,d,i,f)};case +3:var +j=e[1];return function(a){return R(g,c,d,j,f)};case +4:var +l=e[1];return function(a){return R(g,c,d,l,f)};case +5:var +n=e[1];return function(a){return R(g,c,d,n,f)};case +6:var +p=e[1];return function(a){return R(g,c,d,p,f)};case +7:var +q=e[1];return function(a){return R(g,c,d,q,f)};case +8:var +r=e[2];return function(a){return R(g,c,d,r,f)};case +9:var +s=e[3],t=e[2],u=y(w(e[1]),t);return function(a){return R(g,c,d,K(u,s),f)};case +10:var +v=e[1];return function(a,b){return R(g,c,d,v,f)};case +11:var +x=e[1];return function(a){return R(g,c,d,x,f)};case +12:var +z=e[1];return function(a){return R(g,c,d,z,f)};case +13:throw[0,m,hP];default:throw[0,m,hQ]}}function +o(a,b,c,d,e){return a<50?ba(1+a,b,c,[8,d,dk],e):k(ba,[0,b,c,[8,d,dk],e])}function +a$(a,i,c,d,e,f,g){if(typeof +f==="number")return function(a){return n(i,c,[4,d,h(g,a)],e)};else{if(0===f[0]){var +b=f[2],j=f[1];return function(a){return n(i,c,[4,d,P(j,b,h(g,a))],e)}}var +k=f[1];return function(a,b){return n(i,c,[4,d,P(k,a,h(g,b))],e)}}}function +al(a,k,j,d,e,f,g,h,i){if(typeof +f==="number"){if(typeof +g==="number")return 0===g?function(a){return n(k,j,[4,d,l(h,i,a)],e)}:function(a,b){return n(k,j,[4,d,aK(a,l(h,i,b))],e)};var +b=g[1];return function(a){return n(k,j,[4,d,aK(b,l(h,i,a))],e)}}else{if(0===f[0]){var +c=f[2],m=f[1];if(typeof +g==="number")return 0===g?function(a){return n(k,j,[4,d,P(m,c,l(h,i,a))],e)}:function(a,b){return n(k,j,[4,d,P(m,c,aK(a,l(h,i,b)))],e)};var +p=g[1];return function(a){return n(k,j,[4,d,P(m,c,aK(p,l(h,i,a)))],e)}}var +o=f[1];if(typeof +g==="number")return 0===g?function(a,b){return n(k,j,[4,d,P(o,a,l(h,i,b))],e)}:function(a,b,c){return n(k,j,[4,d,P(o,a,aK(b,l(h,i,c)))],e)};var +q=g[1];return function(a,b){return n(k,j,[4,d,P(o,a,aK(q,l(h,i,b)))],e)}}}function +ch(a,b,c,d,e,f,g){if(f){var +i=f[1];return function(a){return hK(b,c,d,e,i,h(g,a))}}return a<50?ba(1+a,b,c,[4,d,g],e):k(ba,[0,b,c,[4,d,g],e])}function +n(b,j,d,e){return Q(ba(0,b,j,d,e))}function +R(g,c,d,e,f){return Q(ci(0,g,c,d,e,f))}function +l4(b,c,d,e){return Q(o(0,b,c,d,e))}function +l5(i,c,d,e,f,g){return Q(a$(0,i,c,d,e,f,g))}function +l6(k,j,d,e,f,g,h,i){return Q(al(0,k,j,d,e,f,g,h,i))}function +hK(b,c,d,e,f,g){return Q(ch(0,b,c,d,e,f,g))}function +aj(a,b){var +c=b;for(;;)if(typeof +c==="number")return 0;else +switch(c[0]){case +0:var +f=c[1],g=de(c[2]);aj(a,f);return aJ(a,g);case +1:var +d=c[2],e=c[1];if(0===d[0]){var +i=d[1];aj(a,e);aJ(a,hR);var +c=i;continue}var +j=d[1];aj(a,e);aJ(a,hS);var +c=j;continue;case +6:var +m=c[2];aj(a,c[1]);return h(m,a);case +7:aj(a,c[1]);return aX(a);case +8:var +n=c[2];aj(a,c[1]);return L(n);case +2:case +4:var +k=c[2];aj(a,c[1]);return aJ(a,k);default:var +l=c[2];aj(a,c[1]);return cX(a,l)}}function +ap(a,b){var +c=b;for(;;)if(typeof +c==="number")return 0;else +switch(c[0]){case +0:var +g=c[1],i=de(c[2]);ap(a,g);return a2(a,i);case +1:var +e=c[2],f=c[1];if(0===e[0]){var +j=e[1];ap(a,f);a2(a,hT);var +c=j;continue}var +k=e[1];ap(a,f);a2(a,hU);var +c=k;continue;case +6:var +n=c[2];ap(a,c[1]);return a2(a,h(n,0));case +7:var +c=c[1];continue;case +8:var +o=c[2];ap(a,c[1]);return L(o);case +2:case +4:var +l=c[2];ap(a,c[1]);return a2(a,l);default:var +m=c[2];ap(a,c[1]);var +d=a[2];if(a[3]<=d)bT(a,1);v(a[1],d,m);a[2]=d+1|0;return 0}}function +bo(a,b){var +c=b[1],d=0;return n(function(a,b){aj(a,b);return 0},a,d,c)}function +hV(a){return bo(az,a)}function +D(a){var +b=a[1];return n(function(a,b){var +c=da(64);ap(c,b);return bn(c[1],0,c[2])},0,0,b)}var +bY=[0,0];function +b0(a,b){var +c=a[b+1];if(lG(c)){if(bj(c)===cm)return h(D(hW),c);if(bj(c)===253){var +e=fs(fU,c),d=0,i=g(e);for(;;){if(i<=d)return Y(e,fT);var +f=u(e,d),j=48<=f?58<=f?0:1:45===f?1:0;if(j){var +d=d+1|0;continue}return e}}return hX}return h(D(hY),c)}function +dl(a,b){if(a.length-1<=b)return hZ;var +c=dl(a,b+1|0),d=b0(a,b);return l(D(h0),d,c)}function +h1(a){var +b=a.length-1;if(2>>0){var +c=dl(a,2),d=b0(a,1);return l(D(h2),d,c)}switch(b){case +0:return h3;case +1:return h4;default:var +e=b0(a,1);return h(D(h5),e)}}function +b1(b){function +a(a){var +c=a;for(;;){if(c){var +l=c[2],n=c[1];try{var +o=h(n,b),d=o}catch(f){var +d=0}if(d)return d[1];var +c=l;continue}if(b===dm)return h6;if(b===dn)return h7;if(b[1]===dp){var +e=b[2],i=e[3],p=e[2],q=e[1];return bv(D(bZ),q,p,i,i+5|0,h8)}if(b[1]===m){var +f=b[2],j=f[3],r=f[2],s=f[1];return bv(D(bZ),s,r,j,j+6|0,h9)}if(b[1]===dq){var +g=b[2],k=g[3],t=g[2],u=g[1];return bv(D(bZ),u,t,k,k+6|0,h_)}if(0===bj(b)){var +v=b[1][1];return Y(v,h1(b))}return b[1]}}return a(bY[1])}function +h$(a){try{var +b=[0,fY(function(a){return le(a)},a)];return b}catch(f){f=C(f);if(f[1]===bm)return 0;throw f}}function +dr(a){var +i=h$(li(0));if(i){var +f=i[1],g=f.length-1-1|0,q=0;if(!(g<0)){var +b=q;for(;;){var +c=p(f,b)[b+1],e=function(b){return function(a){return a?0===b?ia:ib:0===b?ic:id}}(b);if(0===c[0])var +j=c[5],k=c[4],l=c[3],m=c[2],n=e(c[1]),d=[0,bv(D(ie),n,m,l,k,j)];else +if(0===c[1])var +o=e(0),d=[0,h(D(ig),o)];else +var +d=0;if(d){var +r=d[1];h(bo(a,ih),r)}var +s=b+1|0;if(g!==b){var +b=s;continue}break}}return 0}return bo(a,ii)}function +ds(a){bY[1]=[0,a,bY[1]];return 0}32===bR;function +ik(a){return lj(10,ct,0,a)}try{var +k9=fH(k8),du=k9}catch(f){f=C(f);if(f!==J)throw f;try{var +k7=fH(k6),dt=k7}catch(f){f=C(f);if(f!==J)throw f;var +dt=il}var +du=dt}var +im=gc(du,82),bp=[e1,function(a){var +q=lT(0),c=[0,aW(55,0),0],l=0===q.length-1?[0,0]:q,m=l.length-1,b=0;for(;;){p(c[1],b)[b+1]=b;var +x=b+1|0;if(54!==b){var +b=x;continue}var +j=[0,ij],n=54+aI(55,m)|0,s=0;if(!(n<0)){var +f=s;for(;;){var +h=f%55|0,o=lE(f,m),t=p(l,o)[o+1],k=Y(j[1],d(e+t));j[1]=lB(k,0,g(k));var +i=j[1],r=((u(i,0)+(u(i,1)<<8)|0)+(u(i,2)<<16)|0)+(u(i,3)<<24)|0,v=(p(c[1],h)[h+1]^r)&cq;p(c[1],h)[h+1]=v;var +w=f+1|0;if(n!==f){var +f=w;continue}break}}c[2]=0;return c}}];function +dv(a){a[1]=0;var +c=a[2].length-1-1|0,d=0;if(!(c<0)){var +b=d;for(;;){p(a[2],b)[b+1]=0;var +e=b+1|0;if(c!==b){var +b=e;continue}break}}return 0}function +io(a){var +b=a[2].length-1;if(4<=a.length-1)if(b!==a[4]){a[1]=0;a[2]=aW(a[4],0);return 0}return dv(a)}function +ip(a){var +c=a[2],b=c.length-1,d=a[4],e=a[3],f=0===b?[0]:lc(c,0,b);return[0,a[1],f,e,d]}function +iq(a){return a[1]}function +dw(k,b){var +d=b[2],e=d.length-1,f=e*2|0,g=f>>25|0)&31)|0)&cq,h=b[2];p(b[1],h)[h+1]=g;var +j=g}else +var +j=0;return[0,0,aW(c,0),j,c]}},dv,io,ip,a,b,f,g,i,j,ir,is,iq,it]}function +dz(a,b){var +c=[0,[0,a,0]],d=b[1];if(d){var +e=d[1];b[1]=c;e[2]=c;return 0}b[1]=c;b[2]=c;return 0}var +b2=a([f,iv,0]);function +dA(a){var +b=a[2];if(b){var +c=b[1],d=c[2],e=c[1];a[2]=d;if(0===d)a[1]=0;return e}throw b2}function +b3(a,b){a[13]=a[13]+b[3]|0;return dz(b,a[27])}var +dB=1000000010;function +b4(a,b){return ac(a[17],b,0,g(b))}function +b5(a){return h(a[19],0)}function +dC(a,b){return h(a[20],b)}function +aB(a,b,c){b5(a);a[11]=1;var +d=(a[6]-c|0)+b|0,e=a[8],f=lz(e,d)?e:d;a[10]=f;a[9]=a[6]-a[10]|0;return dC(a,a[10])}function +dD(a,b){return aB(a,0,b)}function +aL(a,b){a[9]=a[9]-b|0;return dC(a,b)}function +iw(a){var +b=a[2];if(b){var +c=b[1],d=c[2],e=c[1],f=a[9]>>a|0)?1:0}if(d(7,b))return c(a,t(b));if(d(11,b)){c(a,t(eX|(b>>>6|0)&31));return c(a,t(i|b&63))}if(d(16,b)){c(a,t(cu|(b>>>12|0)&15));c(a,t(i|(b>>>6|0)&63));return c(a,t(i|b&63))}if(d(21,b)){c(a,t(cp|(b>>>18|0)&7));c(a,t(i|(b>>>12|0)&63));c(a,t(i|(b>>>6|0)&63));return c(a,t(i|b&63))}if(d(26,b)){c(a,t(f|(b>>>24|0)&3));c(a,t(i|(b>>>18|0)&63));c(a,t(i|(b>>>12|0)&63));c(a,t(i|(b>>>6|0)&63));return c(a,t(i|b&63))}if(d(31,b)){c(a,t(cm|(b>>>30|0)&1));c(a,t(i|(b>>>24|0)&63));c(a,t(i|(b>>>18|0)&63));c(a,t(i|(b>>>12|0)&63));c(a,t(i|(b>>>6|0)&63));return c(a,t(i|b&63))}throw[0,m,jn]}function +jo(a,b,c,d){var +e=c?c[1]:1,f=a?a[1]:d9(0,0,bb);return[0,f,e,0,b]}var +ce=d8.slice();ce[1]=0;ce[5]=0;ce[7]=0;d8.slice()[5]=0;var +jq=[0,function(a){throw[0,m,jp]}];a([f,jr,0]);jq[1]=function(a){var +b=cN;for(;;){var +c=B(js,b,a);if(0===c)return aA(a);h(a[1],a);var +b=c;continue}};a([f,jt,0]);a([f,ju,0]);function +ec(a){var +b=10<=a?a+87|0:a+48|0;return t(b)}function +aC(a,b,c,d,e){a7(d,a,b[1],c-b[1]|0);_(d,e);b[1]=c+1|0;return 0}function +jw(a,b,c){try{var +f=a7(c,a,b[1],g(a)-b[1]|0);return f}catch(f){var +d=g(a)-b[1]|0,e=b[1];ac(hV(jx),a,e,d);return c3(jy)}}function +aD(a,b){c(a,34);var +e=[0,0],l=g(b)-1|0,m=0;if(!(l<0)){var +d=m;for(;;){var +h=u(b,d);if(92===h)aC(b,e,d,a,jz);else{if(35<=h)var +i=cr===h?1:0;else +if(8<=h){switch(h-8|0){case +0:aC(b,e,d,a,jA);var +f=1;break;case +1:aC(b,e,d,a,jB);var +f=1;break;case +2:aC(b,e,d,a,jC);var +f=1;break;case +4:aC(b,e,d,a,jD);var +f=1;break;case +5:aC(b,e,d,a,jE);var +f=1;break;case +26:aC(b,e,d,a,jF);var +f=1;break;case +24:case +25:var +i=0,f=0;break;default:var +i=1,f=0}if(f)var +i=2}else +var +i=1;switch(i){case +0:break;case +1:a7(a,b,e[1],d-e[1]|0);var +j=d_(a,6),k=a[1];O(jv,0,k,j,4);ag(k,j+4|0,ec(h>>>4|0));ag(k,j+5|0,ec(h&15));e[1]=d+1|0;break}}var +n=d+1|0;if(l!==d){var +d=n;continue}break}}jw(b,e,a);return c(a,34)}function +ed(a,b){return _(a,jG)}function +ee(a,b){var +c=b?jH:jI;return _(a,c)}var +jJ=aI(10,11);function +cf(a,b,c){if(0===c)return b;var +d=cf(a,b,c/10|0);ag(a,d,t(aZ(c%10|0)+48|0));return d+1|0}function +ef(a,b){ca(a,jJ);if(0>>0))return a-48|0;throw[0,m,jX]}function +U(a,b,c){var +e=c[4]-1|0,f=b[3],d=((e+c[5]|0)-f|0)-1|0,g=aI(d,(e+c[6]|0)-f|0),i=b[4];if(i)var +k=i[1],j=h(D(jY),k);else +var +j=j2;var +m=d===g?h(D(jZ),d+1|0):l(D(j1),d+1|0,g+1|0),n=b[2];return a8(k$(D(j0),j,n,m,a))}var +ei=[0,function(a){throw[0,m,j3]}];function +S(a,b,c){var +d=aA(c),e=h(ei[1],c);return U(ac(D(j4),a,d,e),b,c)}var +aQ=a([f,j5,0]);function +j6(a){var +d=a[5],b=[0,0],e=a[6]-1|0,f=a[2];if(!(e>>0){h(c[1],c);var +j=f;continue}switch(f){case +0:return kd;case +1:return ke;case +2:return 870828711;case +3:return[0,aT,fQ];case +4:return[0,aT,fM];case +5:return[0,aT,fO];case +6:bt(b[1]);return[0,bz,ej(b,c)];case +7:try{var +l=[0,aV,j6(c)];return l}catch(f){f=C(f);if(f===aQ)return[0,bC,aA(c)];throw f}case +8:try{var +m=[0,aV,j7(c)];return m}catch(f){f=C(f);if(f===aQ)return[0,bC,aA(c)];throw f}case +9:return[0,aT,cT(aA(c))];case +10:var +e=[0,0];try{I(b,c);kb(c);var +n=cg(b,c);I(b,c);em(b,c);I(b,c);var +o=e[1];e[1]=[0,[0,n,as(b,c)],o];for(;;){I(b,c);kc(b,c);I(b,c);var +p=cg(b,c);I(b,c);em(b,c);I(b,c);var +q=e[1];e[1]=[0,[0,p,as(b,c)],q];continue}}catch(f){f=C(f);if(f===cc)return[0,aU,bN(e[1])];throw f}case +11:var +g=[0,0];try{I(b,c);j9(c);var +r=g[1];g[1]=[0,as(b,c),r];for(;;){I(b,c);j_(b,c);I(b,c);var +s=g[1];g[1]=[0,as(b,c),s];continue}}catch(f){f=C(f);if(f===cb)return[0,aF,bN(g[1])];throw f}case +12:var +i=[0,0];try{I(b,c);j$(c);var +t=i[1];i[1]=[0,as(b,c),t];for(;;){I(b,c);ka(b,c);I(b,c);var +u=i[1];i[1]=[0,as(b,c),u];continue}}catch(f){f=C(f);if(f===cd)return[0,cM,bN(i[1])];throw f}case +13:I(b,c);var +v=cg(b,c);I(b,c);return[0,cz,[0,v,j8(b,c)]];case +14:return a<50?an(1+a,b,c):k(an,[0,b,c]);case +15:ek(b,c);return a<50?an(1+a,b,c):k(an,[0,b,c]);case +16:bu(b,c);return a<50?an(1+a,b,c):k(an,[0,b,c]);case +17:return a<50?an(1+a,b,c):k(an,[0,b,c]);case +18:return U(kf,b,c);default:return S(kg,b,c)}}}function +as(b,c){return Q(an(0,b,c))}function +l9(b,c,d){return Q(cl(0,b,c,d))}function +ej(a,b){a:for(;;){var +k=58;for(;;){var +e=B(H,k,b);if(3>>0){h(b[1],b);var +k=e;continue}switch(e){case +0:return d$(a[1]);case +1:var +l=68;for(;;){var +f=B(H,l,b);if(8>>0){h(b[1],b);var +l=f;continue}switch(f){case +0:var +n=ah(b,b[5]);c(a[1],n);break;case +1:c(a[1],8);break;case +2:c(a[1],12);break;case +3:c(a[1],10);break;case +4:c(a[1],13);break;case +5:c(a[1],9);break;case +6:var +o=ah(b,b[5]+1|0),p=ah(b,b[5]+2|0),q=ah(b,b[5]+3|0),r=ar(ah(b,b[5]+4|0)),s=ar(q)<<4,t=ar(p)<<8,d=ar(o)<<12|t|s|r;if(fe<=d)if(eV>>0){h(b[1],b);var +m=g;continue}switch(g){case +0:var +u=ah(b,b[5]+2|0),v=ah(b,b[5]+3|0),w=ah(b,b[5]+4|0),x=ar(ah(b,b[5]+5|0)),y=ar(w)<<4,z=ar(v)<<8,i=ar(u)<<12|z|y|x,A=cG<=i?cD>>0){h(b[1],b);var +e=c;continue}switch(c){case +0:var +g=as(a,b);I(a,b);var +f=111;for(;;){var +d=B(H,f,b);if(2>>0){h(b[1],b);var +f=d;continue}switch(d){case +0:break;case +1:S(kp,a,b);break;default:U(kq,a,b)}return[0,g]}case +1:return 0;case +2:return S(kn,a,b);default:return U(ko,a,b)}}}function +ek(a,b){a:for(;;){var +d=cn;for(;;){var +c=B(H,d,b);if(3>>0){h(b[1],b);var +d=c;continue}switch(c){case +0:return 0;case +1:return S(kr,a,b);case +2:bu(a,b);continue a;default:continue a}}}}function +el(a){var +c=131;for(;;){var +b=B(H,c,a);if(0===b)return 1;if(1===b)return 0;h(a[1],a);var +c=b;continue}}function +I(a,b){a:for(;;){var +d=133;for(;;){var +c=B(H,d,b);if(4>>0){h(b[1],b);var +d=c;continue}switch(c){case +0:bu(a,b);continue a;case +1:ek(a,b);continue a;case +2:bu(a,b);continue a;case +3:continue a;default:return 0}}}}function +cg(a,b){var +d=237;for(;;){var +c=B(H,d,b);if(3>>0){h(b[1],b);var +d=c;continue}switch(c){case +0:bt(a[1]);return ej(a,b);case +1:var +e=b[5];return bn(b[2],e,b[6]-e|0);case +2:return S(ks,a,b);default:return U(kt,a,b)}}}function +j9(a){var +c=N;for(;;){var +b=B(H,c,a);if(0===b)throw cb;if(1===b)return 0;h(a[1],a);var +c=b;continue}}function +j_(a,b){var +d=257;for(;;){var +c=B(H,d,b);if(3>>0){h(b[1],b);var +d=c;continue}switch(c){case +0:return 0;case +1:throw cb;case +2:return S(ku,a,b);default:return U(kv,a,b)}}}function +j$(a){var +c=266;for(;;){var +b=B(H,c,a);if(0===b)throw cd;if(1===b)return 0;h(a[1],a);var +c=b;continue}}function +ka(a,b){var +d=271;for(;;){var +c=B(H,d,b);if(3>>0){h(b[1],b);var +d=c;continue}switch(c){case +0:return 0;case +1:throw cd;case +2:return S(kw,a,b);default:return U(kx,a,b)}}}function +kb(a){var +c=290;for(;;){var +b=B(H,c,a);if(0===b)throw cc;if(1===b)return 0;h(a[1],a);var +c=b;continue}}function +kc(a,b){var +d=292;for(;;){var +c=B(H,d,b);if(3>>0){h(b[1],b);var +d=c;continue}switch(c){case +0:return 0;case +1:throw cc;case +2:return S(ky,a,b);default:return U(kz,a,b)}}}function +em(a,b){var +d=297;for(;;){var +c=B(H,d,b);if(2>>0){h(b[1],b);var +d=c;continue}switch(c){case +0:return 0;case +1:return S(kA,a,b);default:return U(kB,a,b)}}}ei[1]=function(a){var +b=cN;for(;;){var +c=B(H,b,a);if(0===c)return aA(a);h(a[1],a);var +b=c;continue}};function +kD(a,b,c){var +d=b?b[1]:0;I(a,c);if(el(c))throw ea;var +e=as(a,c);if(1-d){I(a,c);if(1-el(c))S(kC,a,c)}return e}function +kE(a,b,c,d){try{var +e=ge(d),f=kD(jo(a,b,c,0),0,e);return f}catch(f){f=C(f);if(f===ea)return a8(kF);throw f}}var +kH=[0,function(a){throw[0,m,kG]}];a([f,kI,0]);kH[1]=function(a){var +b=cN;for(;;){var +c=B(kJ,b,a);if(0===c)return aA(a);h(a[1],a);var +b=c;continue}};function +en(a,b){return au<=a[1]?a:h(b,a[2])}var +kK=Z.document,eo=1e6*i5.random()|0;function +ep(a,b){var +c=[0,[0,kM,[0,aV,b[2]]],0];return[0,aU,[0,[0,kN,h(a,b[1])],c]]}function +eq(a){return 0===a?kT:kU}dZ(function(a){function +b(a){var +c=i_.getElementById("mario");if(c==bs)throw J;var +p=kK.createElement("audio");p.src="/audio/Series_of_Tubes.ogg";var +j=Z.location.host,k=fF(ay(Z.location.protocol),k2)?k3:k5,b=new +jc(Y(k,Y(ay(j),k4)).toString());b.onmessage=d4(function(a){var +n=kE(0,0,0,ay(a.data));if(typeof +n==="number")var +g=0;else +if(aU===n[1]){var +c=n[2],d=kS;for(;;){var +q=d[2],r=d[1];if(c){var +i=c[1],s=i[1];if(!bK(s,kP)){var +k=i[2];if(typeof +k==="number")var +b=0;else +if(aF===k[1]){var +e=k[2];if(e){var +m=e[1];if(typeof +m==="number")var +b=0;else +if(bz===m[1]){var +u=m[2];if(bK(u,kW))if(bK(u,kX))var +b=0;else +if(e[2])var +b=0;else +var +l=kY,b=1;else +if(e[2])var +b=0;else +var +l=kZ,b=1}else +var +b=0}else +var +b=0}else +var +b=0;if(!b)var +l=kV;var +c=c[2],d=[0,l,q];continue}if(!bK(s,kQ)){var +j=i[2];if(typeof +j==="number")var +o=0;else +if(aV===j[1])var +t=[0,bA,j[2]],o=1;else +var +o=0;if(!o)var +t=kL;var +c=c[2],d=[0,r,t];continue}var +f=kR,g=1}else +var +f=en(q,function(b){return en(r,function(a){return[0,bA,[0,a,b]]})}),g=1;break}}else +var +g=0;if(!g)var +f=kO;if(au<=f[1]){c5(k0);c5(ay(a.data));return d2}var +v=f[2],w=v[2];h(bo(a0,k1),w);if(0===v[1])p.play();return d2});Z.setInterval(fx(function(a){return b.send(eh(0,0,0,ep(eq,[0,1,eo])).toString())}),1e4);var +d=[0,0],e=[0,aN([0,bm,jb])],f=[0,a6(0)],g=dW(0)[1],l=0;dX(g,function(a){var +f=[1,a5],h=e[1];function +g(a,b){var +h=b;for(;;){var +i=aq(h),j=i[1];if(2===j[0]){var +k=j[1],c=k[1];if(typeof +c==="number")return 0===c?a:(i[1]=f,[0,[0,k],a]);else{if(0===c[0]){var +h=c[1][1];continue}var +e=a,d=c[1][1];for(;;){if(d){var +l=d[2],e=g(e,d[1]),d=l;continue}return e}}}return a}}var +b=g(0,h),c=dP(0);bO(function(a){dO(a[1][4],0);return dN(f,a[1][2],0)},b);dQ(c);d[1]=1;return 0});function +i(a){if(d[1])return a6(0);var +g=d7(i8,l,c);e[1]=g;return b_(g,function(a){function +c(a){d5.log(b1(a).toString());return a6(0)}f[1]=dY(function(a){return a6(b.send(eh(0,0,0,ep(eq,[0,0,eo])).toString()))},c);return b_(f[1],i)})}dZ(function(b){function +a(a){return a===a5?a6(0):aN(a)}return dY(function(a){return i(b)},a)});return g}return b_(d7(i9,0,Z),b)});c7(0);return}(function(){return this}())); + +//# sourceMappingURL=index.map \ No newline at end of file diff --git a/js/index.map b/js/index.map new file mode 100644 index 0000000..c86d8eb --- /dev/null +++ b/js/index.map @@ -0,0 +1,30 @@ +{"version":3, + "file":"js/index.js", + "sourceRoot":"", + "names":[], + "mappings": + ";;;yo0CAy3BA;UACS;;kBAEP,OAAW;IAAO,mBAA6B,UAG/C,QACF,CA12BA;UACQ;;SACN,IAAU;wBACV,QACF,CC2CA;UACQ;sBACN,8BAA8C,MAAO,iBAC/C;IACN,wBACO,aAAe,OAAmB,iBACzC,QACF,CAsLA;SAEQ;;WAAoB,MAAS,WAAc,IACjD,kBAA0B,gBAC1B,qCAGA,QACF,CA4GA;aACE,QAAc,SACd,yCACsE,YAE3D,oCACqC,4CAEzC;yBAAkD,aAE9C,oCACqC,4CAEzC,CACL,UAA2B,SACpB;MAAW,MAClB,UACE,IAAW;8BACR,CACG;EAAE,uBACR,IAAW;mBAA+B,kBAC1C,uBAGJ,QACF,CDjWA;WACQ;WACA;WACA,IACN,8BAEA,QACF,CAKA;QACE,SACE,MAAO,gBACH;WACM,WACN,MACN,QACE,MAAO,qBACJ;OACH,MAAO,IAAc,aACQ,WACR,iBAErB;mBAAqB,MAAO,MAAiB,QAAtC,CACX,CAoDA;QAA0C,YAAqB,CC3E/D;QACE,YAAc,MAAO,gBACf;IAAQ,IACd,QAAY,SACZ,OAAQ,CACN,kBAEA,QAAY,kBAGZ,QAAY,aAMhB,CAuLA;MAEE,eACS;IAED,0BAEV,CA9FA;MAEE,eAAmB,CAEjB,IAAW;mBAAwB,GAAI,mBAAuB,aAC9D,gBAEA;OAAQ,sBACZ,CAvDA;MACE,OAAW;IAAQ,YAAsB,IAAO,mBAAwB,GACjE,gBACL,OAAe,CACb,IAAW;cAA0B,uBAA6B,CAClE,UAAiB,CAAE,0BAAqC;GAC9C,aACV,QAAY,cAId,cAAyB,yBAAiC,YAExD,QAAe,WAEb,eACK,KAEL,cAAyB,yBAAiC,YAExD,QAAe,YAEb,mCACK,KAEH,cAAyB,gCACR,qBAEf,2BAMZ,OAAW,sBAGJ;WACA;GAEA,uBACP,eAAqB,CAAC,wBAExB,UACF,CAeA;MACE;EAEE,mBAEA;EAEA,GAAI,QAAoB,OAEtB;EAIF,MAAO,SAEX,CAqDA;mCAEA,iCACyC,MAAO,SAAlB,EAuD9B;KAA+B;eAAmC,CD3KlE;QACE,KAA0B,KAC5B,CAvCqB;MA+ErB;MACE,wBACF,CAsBA;KACE,MACF,CAuFA;OACE,qBAAqC,KACrC,QACF,CE7NA;MACE,GAAI,YAAc,CAChB,GAAI,sCAAwC,SAC5C,QAAY,SACZ,SAEF,MAAO,aACT,CClCA;WACS;WACA,WACP,OAAa,SACb,OAAa,SACb,aAAiB,SACjB,aAAiB,SACjB,aAAiB,SACjB,aAAiB,SACjB,QACF,CHwVA;QACE,OAAW,SAAa,QAAY,SAAU,QAChD,CCxFA;eACgB,aACA,MACd,6BACF,CDDA;UACY;KACV,OAAQ,CACN,eAAyB;;EACI;;GACE,SACV,CACjB;EAAE,QACR,QAAY,cAIJ;aACG;;;uBAA6C,CAC3C;OAEP,cAEA,UAAgB,QAEd,aACK;;;uBAA6C,CAC3C;OAEP,cAEA,UAAgB,QAEd,aACK;QAAc,oBAEd;;IAIT;EAAE,cACR,QAAY,SACZ;IAEoB;IAKd;EAAE,QACR,QAAY,SACZ,cAGY,sBAA0B,8BAC1B,cAAkB,mBAItB;aACG;;;;;uBAC+C,aAE/C;;0BAA4C,MAC1C,oBACF,CACL,OAAW,SACX,OAAW,SACX,QAAY,CACV,MAAY,WACZ,QAAY,SACZ,QAAY,UAIlB,eAAuB,SACjB;EAAE,UACJ,UACA,QACJ,gBAAsB,8BAI1B,CAGA;QAA+B,MAAO,aAA+B,CA1PrE;MACE,eACF,CAu4BA;KACE,qCACF,CClvBA;KACE,OAAa,oBACb;YACF,CA0DA;YACE,OAAW,yCACgE,QAC3D,iBAGL,KACC,KAAoB,2CAGvB,CACL,UAA0B,MAC1B,0BAGJ,QACF,CA7FA;MACE,cAAgC,MAChC,UACF,CD6LA;;IAEM,WAEJ,qBAAqC,WACjC,uBAEJ,sBAAyC,sBAAuB,SAChE,GAAG,wCAAwC,CAChC;EAAE,uBACO,iBACV;GAAG,oBACJ,iBACP,SAAa,cAEf,GAAG,4BAA6B,gBAChC,GAAG,0BAA2B,gBAC9B,qBACF,CAQA;QACQ,MACE;WACR,QAAc,kCACR;8HAIN,IAAW;YAAmB,CACtB;EAAE,YACR,+BAEmB,oCAEA,0BAED,+BAEI,wFAIpB,QAAS,8BAA0C,8BAIpD,2BAIC,QAAS,8BAA0C,gFAOtC,wBAEA,yCAEoB,uBAErB,yDAEqB,wEAGxB,gBAAkB,OAG/B,QACF,CAIA;QACE,iBAA6B,gBACrB;WAER,iDACA,eAAiB,CACf,kBACA,mBAGS;IACX,+BACE,IAAW;wBACb,gBAAkB,sBAEX;kCAEP,gCACA,mCACA,+BACE,IAAW;6BAEb,iBACE,IAAW;wBACb,MAAO,KACT,CAoBA;;EACW,EAAE,MACF,oBACT,OAAW,gBACX,GAAI,SAAU,sBACT;IAAK,YAAa,yBAErB;0BAEQ;EAAE,mBAEF,WACN,GAAI,oBACE,kBAA2B,aACjC,gBAEI,aAAiB,wBAGjB,wBACE;EAAE,cACA,GAAG,aACX,mBAA6B,sBAA4B,CAEjD;MAAS,MAAO,oBACtB,GAAI,sBACA,eAAoB,sBAExB,GAAI,oBACE,kBAA2B,aACjC,UACK,CACC;IACN,OAAa,UAAoB,iBAC5B;QAAW,8BAChB,KAAO,CAEC;aAAgB,MAAO,oBAC7B,GAAI,sBACA,gBAGR,MAEJ,MAAO,QACT,CA5DA;QACE,GAAI,UAAmC,MAAO,QACxC;EAAE,MACR,OAAW,gBAAoB;OACzB;EAAE,mBACR,aAAiB,aAET;kBACN,SAAe,WAEjB,MAAO,QACT,CAsXA;KAA+C,QAAU,CAnjBzD;QAAoC,QAAS,iBAAmC,CE/XhF;MACE,IAAK,YAAa,CAChB,GAAI,SAAU,iBACd,iCAEO;YACT,UACQ;EAAE,sBAAsB,gBAChC,QAAc,QAEP,oBACA,IACA,iBACL,QAAY,WACZ,QAAc,QAEV;EAAE,eACD,gBAEA;gBAEA;oBAEP,eACF,CFmMA,2CAGc,gCADV,KAES;aA4cC,GACd,WACsB;KACpB;OAAuB,oBAAoC,CAC3D;SACM,qBACA,UACA,uBAEA,QACJ,mCACF,CACA;iBAEM,+BAEA,6BAEJ,QACF,CACA;UACS;gBACA,sBACH,SACA,OACJ,QACF,CACA;UACS;gBACA,sBACH,SACJ,QACF,CACA;UACU;eACR,oBAAkC,GAC5B,gBACG,qBACA,sBACA,wBACH,WAGN;IACa;KACA;KACA,kBACD,YAIZ,QACF,CACA;UACU;eACR,oBAAkC,0CAK5B,WAGN;;;YAIY,YAIZ,QACF,CACA;sBAGE,sCAIA,eAA2B,UAEzB;;uBAA6C;MAIrC,cAEJ;gBAIA;MAGI,WAEJ,cAEQ;wBACJ,OACJ,2BAA0C,CACxC,QAAc,kBAGhB,UAEG;;;EAA2B,CAChC,sBAEE;IAEI,SACJ;IAEI,iBAGD;aAAiB,GAElB,mBAEC;UAAc,GAEf,IAAuB,cAI3B,KACJ,WAxDK,CAxET,IElpBA;MACU;kBACR,WAAiB,+DAMX;EAAE,gBACA,4BACR,OAAa,UAEJ;GAEA,gBACT,gBACA,QACF,CCqBA;MACE,yBACF,CA0JA;MACE,gCACF,CHtBA;SACQ;WACA;SACN,IAAU;sBACV,QACF,CG9JA;WACS;YACA,oBACA,oBACP,wBACF,CAjDA;QACE,aAAiB,SACjB,aAAiB,SACjB,aAAiB,SACjB,aAAiB,SACjB,aAAiB,SACjB,aAAiB,SACjB,QACF,CA8IA;sEAIA,CAGA;2EAIA,CAMA;WACa;IACC,EAAE,MACF,EAAE,MACD,YACb,MAAO,UAA4C,KAEjD,MAEF,WAAoB,KAElB,MACA,GAAI,WAA6C,UAErC,QAEZ,MAEF,aACF,CAoCA;MACE,oBACF,CA9JA;MACE,iBACF,CAxCA;SACS;QACA,gBACA,gBACP,wBACF,CAqNA;QACQ;EAAE,MACR,iBAAoB,MAA2B,aAC5B,SAER;IACD,EAAE,WACF,qBACV,EAAG,CACK;EAAE,iBAEC,SAAa,mBACb,OACX,aAAiB,aAET;kBACN,SAAoB,WAEtB,MAAO,QACT,CH0MA;MAAgC,mBAA6B,CIxc7D;MAAiC,MAAO,mBAA+B,CAmBvE;UAAoC,MAAO,WAAW,MAA2B,CCWjF;QACQ;yBACA,6HAEN;IAAe,CACf,IAAW;mBAAwB,sBACnC,QACF,CJQA;MACE,OAAW;IAAQ,QAAa,IAAO,mBAAwB,GACzD,gBACJ,OAAc,CACZ,IAAW;cAAyB,uBAA6B,CACjE,UAAiB,CAAE,0BAAqC;GAC9C,aACV,QAAY,UAGd,QAAe,IACR,gCACA,gCACA;eAA+B,GAC/B,mDAGA;qBACS,4BAA6C,sBAGtD,6BAGA,0DAKP,eAAqB,CAAC,wBAExB,UACF,CA6KA;MACU;IACR,IAAK,YACkC,MACvC;eACF,CDpQA;SACQ;WACA;SACN,IAAU;sBACV,QACF,CIgDA;MACE,kBACE,0BACS,KAAiB,eAEjB,iBAJJ,CAOT,CJ+TA;QAAiC,QAAS,iBAAmC,CAG7E;QAAgC,QAAS,gBAAkC,CMzY3E;QACM,SACE;aACA;SACN,IAAW;kBACD,kBAAuB,gCACjC,QACF,CLoPA;MACE,UAA0B,MAC1B,UACF,CKnPA;YACiB;IACI,IACD,IACD,IACA,IACG,IACA,IACP,IACG,IACA,IACF,IACA,IAEd,kBAAsB,YACF,uBACA,qBACA,qBACA,uBACA;EAGP,IAEF,EAAE,SAEb,QAAgB,4BAIT;OAIP,OAAQ,CAEG;gBACT,OAAc,WAEF;mBACZ,QAAkB,kBAKlB,cAAmD,WAE/C;SAGC,kBAML,wDAKA,OAAe,WAEb,YACE,8BAEA;gBACC;gBAOT,CNyLA;WACU;QACF;gBAEN,IAAW;mBACX,QACF,CCOA;MAAoC;eAAmC,CM/QnD;GACpB,WACE;OAAsB,YAAoB,CAC1C;iBACM,EAAI,OAAW,QACnB,MAAO,mBACT,CACA;iBACE,MAAO,sBACT,CACA;iBACE,MAAO,sBACT,CACA;iBAA6B,MAAO,mBAA8B,CAClE;iBAA6B,MAAO,sBAAmC,CAEvE;OACQ;wBAEN,qFAKM;+CAEN,yBAAuC,IAC/B;OAAU,OAAU,OAAU,SAEhC,iCACA,kCACA,iCACA,kCACA,iCACA,kCACA,kCACA,kCACA,iCACA,kCACA,mCACA,mCACA,kCACA,mCACA,mCACA,mCAEA,iCACA,iCACA,kCACA,kCACA,iCACA,gCACA,mCACA,kCACA,gCACA,kCACA,kCACA,kCACA,kCACA,iCACA,kCACA,mCAEA,iCACA,kCACA,mCACA,mCACA,iCACA,kCACA,kCACA,mCACA,iCACA,kCACA,kCACA,gCACA,iCACA,mCACA,kCACA,kCAEA,iCACA,kCACA,mCACA,kCACA,kCACA,kCACA,mCACA,kCACA,iCACA,mCACA,kCACA,mCACA,iCACA,mCACA,iCACA,qCAEG,eACA,eACA,eACA,UAGH;;UACN,IAAW;YACT,IAAW;iCAEb,QACF,CAEA,uBAGU;KACR,sBAEE;EAEM;MACN,IAAW;aAAoB,CACvB;cAEJ,gBAAmB,qBAClB,sBAA4B,sBAEjC,sBAAkC,2BAClC;EAEM;MACN,IAAW;aAAoB,CACvB;mDAGR,sCAEF,MAAO,IAAqB,OAzBvB,CA7GT,IPsGA;MACE,iBACF,CQiNA;MACI,aAAgB,oCAChB,eAAoB,SACpB,YACE;EACQ,qBAAwB,cACvB,8BAIX,QACJ,CC5Ue;KCvBf;KACE,MAAO;mBACT,CAIA;KACE,MAAO,YAAW,KACpB,CDyCA;kCAEkC;EAAE,2CAIpC,6CAGgB,KACZ,eAFO,sBAKC;EAAE,8BADH,GRoVX;KAAoC,UAAW,CQtT/C;;;EACoC,eAClC,mCACF,CAzEqB;MAoFrB;;;EACkC,eAChC,GAAG,8BAEM;EAAE,YACD,KACV,IAAU;mBAAwB,sBAErB,cAAmB,QAAa,cACjC,aACD,eAAsB,UAAgB,cACtC,aAAoB,eAI/B,QAEF,CA/FA;qCAE0B;EAAE,2CAIV,kCAEM,0BAAf,oCACJ,kBACgB,sBAAf,kBAEI;KACN;;;aACE,UACF,QAJG;eAME,GA0BS;;KAClB;MA4GA;MACU;KACR,IAAS;mBAAqB,CAC5B,eAAmB,gBAAsB,aACrC,YAEN,QACF,CAoEA;SACW;EAAE,MACH,EAAE,MACV;;MACF,CA/HA;WACW;EAAE,MACH,KACR,IAAS;qBAAuB,CACxB;OACN,IAAK,YACH;QACI,SACN;;IACE,cAEE;gBACN,GAAG,YAAe,cAClB;;GAA6B,cACxB;;;GAA8B,cAC9B;;;EAAgC;WAChC;;;MAA6B;GAAoB,YACjD;cAAqB;GAAqB,EAAgB,oBAC1D;uBACL,QACF,CAuCA;SACU;KACC,EAAE,UAGX,IAAS;mBAAqB,CAC5B,UAAa,cACb,eAAmB,gBAAsB,SAE9B,WAIP,YAEN,QACF,CD9KA;UACE;iBAES;gCAEkB,iDAI3B,QACF,CACA;UACQ;KACN,QAAY,CACV;aACqB;aACA;aACA;aACA;eACE;WACH;aACC;WACF;eACI,gBAIf;EAAE,aACH,EAAE,MACX,sBACE,gEACF,oBACE,8DACF,GAAI,MAA4B,CAC9B,GAAI,MAA6B,0BACjC,oBAAwB,YAChB;gCACC,EAAE,MACX,cAAe,aACf,MAAO,iBACF;YAAc,CACX;gCACR,KAAsB,MACb;EAAE,MACX,MAAO,iBAEJ;KACP,CACA;GAAoC,OACpC;GAAoC,OACpC;GAAoC,OAqEpC;MACW;WACT,kBAAsB,yBAEtB,gEAOF,CHhEA;MAGE,GAAG,+BACG,uBACA;wBACU,UAClB,CAhBA;MAGE,GAAG,+BACG,uBACA;sBACS,QACjB,CGHyB;;QAkBzB;WACU;EAAE,KACD,EAAE,KACF,EAAE,eACA,WACX,UAA0B,CACZ;EAAE,OACd,uBACA,uCAIF,kBACA,QACF,CAEA;;EAEE;OACiC;OACA,mBAGxB;WACT,kBAAsB,wBACV;8EAUZ,QACF,CAlDA;KACQ;IACN;;;GAAkC,8BAIlC,QACF,CAkQA;YACI,aAAgB;EAEhB,SAAkB,gBAEb,GACQ,KACT,gBAES;EAAE,aACR,EAAE,oBACT,uBAEK,WACU,gBACX,gBACa,cAEjB,QACJ,CAIA;QACU;EAAE,EAAgB,wBACxB,YACA,QACJ,CRrRA;MAAqC,OAAW,CAqEhD;KACE,sBACF,CA6EA;QACE,QAAY,KACZ,UACF,CAwIA;QAAgC,QAAS,iBAAmC,CAlM5E;MAAiC;;MAA8B,CAK/D;eAAiD,QAAU,CAF3D;MAA4B;;;;OAAmE,CAlH/F;kBAEE,WACF,CAvBsB;MAItB;WACoB,SAClB,QACF,CA86BoB;KAIpB;eAEE,QACF,CC7sBA;eACgB,aACA,MACd,mBACF,CAjGA;KACE,MACF,CAhCA;QACE,sBAEE,iBAAqB;EAErB,MAAO;EAEP,cAEJ,CA2BA;OACE,cAAoB,KACpB,MAAO,QACT,CA4FA;QAAwC,SAAS,OAA2B,CAtH5E;cAGE,UAA0B,CACxB,iBAAqB,MACZ,uBACP,kBACA,SAEF,eAGF,QACF,CAiBA;UACE,cAAoB,KACpB,MAAO,SACT,CDqnBA;KAAuC,SAAW,CA0HlD;MACQ;IACN,UAAW,UAEX,6BAAgC,kBAChC,qCACF,CAtyBA;KACE,eAAiD,CAmxBnD;SACQ;IACA,EAAE,aAER,yDAGE,MAAO,sBACT,IACF,CAjIA;KACQ;;kBAAwB,cAC9B,WACF,CKjxBA;KACQ;IACN,qBAA2B,GACnB,uCAIR,QACF,CAGA;OACE,8BACF,CLgHA;QACE;eAA4B,SAAa,SACzC,SAAY,aAAiB,SACvB;WAAY,oBAAyB,QAC7C,CAlFA;MAA0C,QAAY,CAnCtD;MACE,YACF,CA2DA;KACE;;MAAuB,SAEvB;;yBAGM,uCACJ,MAAO,sBAET;;4BAGM,uCACJ,MAAO,sBAET;;QACE,SAAU,UAEZ,mBAAmC,GAAmB,WACxD,C", + "sources": + ["/home/rbj/.opam/4.02.3/lib/js_of_ocaml/stdlib.js", + "/home/rbj/.opam/4.02.3/lib/js_of_ocaml/mlString.js", + "/home/rbj/.opam/4.02.3/lib/js_of_ocaml/ieee_754.js", + "/home/rbj/.opam/4.02.3/lib/js_of_ocaml/int64.js", + "/home/rbj/.opam/4.02.3/lib/js_of_ocaml/jslib_js_of_ocaml.js", + "/home/rbj/.opam/4.02.3/lib/js_of_ocaml/jslib.js", + "/home/rbj/.opam/4.02.3/lib/js_of_ocaml/lexing.js", + "/home/rbj/.opam/4.02.3/lib/js_of_ocaml/md5.js", + "/home/rbj/.opam/4.02.3/lib/js_of_ocaml/io.js", + "/home/rbj/.opam/4.02.3/lib/js_of_ocaml/fs.js", + "/home/rbj/.opam/4.02.3/lib/js_of_ocaml/unix.js"], + "sourcesContent": + ["// Js_of_ocaml runtime support\n// http://www.ocsigen.org/js_of_ocaml/\n// Copyright (C) 2010 Jérôme Vouillon\n// Laboratoire PPS - CNRS Université Paris Diderot\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation, with linking exception;\n// either version 2.1 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n\n///////////// Core\n\n//Provides: raw_array_sub\nfunction raw_array_sub (a,i,l) {\n var b = new Array(l);\n for(var j = 0; j < l; j++) b[j] = a[i+j];\n return b\n}\n\n//Provides: raw_array_copy\nfunction raw_array_copy (a) {\n var l = a.length;\n var b = new Array(l);\n for(var i = 0; i < l; i++ ) b[i] = a[i];\n return b\n}\n\n//Provides: raw_array_cons\nfunction raw_array_cons (a,x) {\n var l = a.length;\n var b = new Array(l+1);\n b[0]=x;\n for(var i = 1; i <= l; i++ ) b[i] = a[i-1];\n return b\n}\n\n//Provides: raw_array_append_one\nfunction raw_array_append_one(a,x) {\n var l = a.length;\n var b = new Array(l+1);\n var i = 0;\n for(; i < l; i++ ) b[i] = a[i];\n b[i]=x;\n return b\n}\n\n//Provides: caml_call_gen (const, shallow)\n//Requires: raw_array_sub\n//Requires: raw_array_append_one\nfunction caml_call_gen(f, args) {\n if(f.fun)\n return caml_call_gen(f.fun, args);\n var n = f.length;\n var argsLen = args.length;\n var d = n - argsLen;\n if (d == 0)\n return f.apply(null, args);\n else if (d < 0)\n return caml_call_gen(f.apply(null,\n raw_array_sub(args,0,n)),\n raw_array_sub(args,n,argsLen - n));\n else\n return function (x){ return caml_call_gen(f, raw_array_append_one(args,x)); };\n}\n\n//Provides: caml_named_values\nvar caml_named_values = {};\n\n//Provides: caml_register_named_value (const,const)\n//Requires: caml_named_values, caml_bytes_of_string\nfunction caml_register_named_value(nm,v) {\n caml_named_values[caml_bytes_of_string(nm)] = v;\n return 0;\n}\n\n//Provides: caml_named_value\n//Requires: caml_named_values\nfunction caml_named_value(nm) {\n return caml_named_values[nm]\n}\n\n//Provides: caml_global_data\nvar caml_global_data = [0];\n\n//Provides: caml_register_global (const, shallow, const)\n//Requires: caml_global_data\nfunction caml_register_global (n, v, name_opt) {\n caml_global_data[n + 1] = v;\n if(name_opt) caml_global_data[name_opt] = v;\n}\n\n//Provides: caml_get_global_data mutable\n//Requires: caml_global_data\nfunction caml_get_global_data () { return caml_global_data; }\n\n//Raise exception\n\n\n//Provides: caml_raise_constant (const)\n//Version: < 4.02\nfunction caml_raise_constant (tag) { throw [0, tag]; }\n\n//Provides: caml_raise_constant (const)\n//Version: >= 4.02\nfunction caml_raise_constant (tag) { throw tag; }\n\n//Provides: caml_return_exn_constant (const)\n//Version: < 4.02\nfunction caml_return_exn_constant (tag) { return [0, tag]; }\n\n//Provides: caml_return_exn_constant (const)\n//Version: >= 4.02\nfunction caml_return_exn_constant (tag) { return tag; }\n\n//Provides: caml_raise_with_arg (const, const)\nfunction caml_raise_with_arg (tag, arg) { throw [0, tag, arg]; }\n\n//Provides: caml_raise_with_string (const, const)\n//Requires: caml_raise_with_arg,caml_new_string\nfunction caml_raise_with_string (tag, msg) {\n caml_raise_with_arg (tag, caml_new_string (msg));\n}\n\n//Provides: caml_raise_sys_error (const)\n//Requires: caml_raise_with_string, caml_global_data\nfunction caml_raise_sys_error (msg) {\n caml_raise_with_string(caml_global_data.Sys_error, msg);\n}\n\n//Provides: caml_failwith (const)\n//Requires: caml_raise_with_string, caml_global_data\nfunction caml_failwith (msg) {\n caml_raise_with_string(caml_global_data.Failure, msg);\n}\n\n//Provides: caml_wrap_exception const (const)\n//Requires: caml_global_data,caml_js_to_string,caml_named_value\n//Requires: caml_return_exn_constant\nfunction caml_wrap_exception(e) {\n if(e instanceof Array) return e;\n //Stack_overflow: chrome, safari\n if(joo_global_object.RangeError\n && e instanceof joo_global_object.RangeError\n && e.message\n && e.message.match(/maximum call stack/i))\n return caml_return_exn_constant(caml_global_data.Stack_overflow);\n //Stack_overflow: firefox\n if(joo_global_object.InternalError\n && e instanceof joo_global_object.InternalError\n && e.message\n && e.message.match(/too much recursion/i))\n return caml_return_exn_constant(caml_global_data.Stack_overflow);\n //Wrap Error in Js.Error exception\n if(e instanceof joo_global_object.Error)\n return [0,caml_named_value(\"jsError\"),e];\n //fallback: wrapped in Failure\n return [0,caml_global_data.Failure,caml_js_to_string (String(e))];\n}\n\n//Provides: caml_invalid_argument (const)\n//Requires: caml_raise_with_string, caml_global_data\nfunction caml_invalid_argument (msg) {\n caml_raise_with_string(caml_global_data.Invalid_argument, msg);\n}\n\n//Provides: caml_raise_end_of_file\n//Requires: caml_raise_constant, caml_global_data\nfunction caml_raise_end_of_file () {\n caml_raise_constant(caml_global_data.End_of_file);\n}\n\n//Provides: caml_raise_zero_divide\n//Requires: caml_raise_constant, caml_global_data\nfunction caml_raise_zero_divide () {\n caml_raise_constant(caml_global_data.Division_by_zero);\n}\n\n//Provides: caml_raise_not_found\n//Requires: caml_raise_constant, caml_global_data\nfunction caml_raise_not_found () {\n caml_raise_constant(caml_global_data.Not_found); }\n\n\n//Provides: caml_array_bound_error\n//Requires: caml_invalid_argument\nfunction caml_array_bound_error () {\n caml_invalid_argument(\"index out of bounds\");\n}\n\n//Provides: caml_update_dummy\nfunction caml_update_dummy (x, y) {\n if( typeof y===\"function\" ) { x.fun = y; return 0; }\n if( y.fun ) { x.fun = y.fun; return 0; }\n var i = y.length; while (i--) x[i] = y[i]; return 0;\n}\n\n//Provides: caml_obj_is_block const (const)\nfunction caml_obj_is_block (x) { return +(x instanceof Array); }\n//Provides: caml_obj_tag const (const)\n//Requires: MlString\nfunction caml_obj_tag (x) { return (x instanceof Array)?x[0]:(x instanceof MlString)?252:1000; }\n//Provides: caml_obj_set_tag (mutable, const)\nfunction caml_obj_set_tag (x, tag) { x[0] = tag; return 0; }\n//Provides: caml_obj_block const (const,const)\nfunction caml_obj_block (tag, size) {\n var o = new Array(size+1);\n o[0]=tag;\n for (var i = 1; i <= size; i++) o[i] = 0;\n return o;\n}\n//Provides: caml_obj_dup mutable (const)\nfunction caml_obj_dup (x) {\n var l = x.length;\n var a = new Array(l);\n for(var i = 0; i < l; i++ ) a[i] = x[i];\n return a;\n}\n//Provides: caml_obj_truncate (mutable, const)\n//Requires: caml_invalid_argument\nfunction caml_obj_truncate (x, s) {\n if (s<=0 || s + 1 > x.length)\n caml_invalid_argument (\"Obj.truncate\");\n if (x.length != s + 1) x.length = s + 1;\n return 0;\n}\n\n//Provides: caml_lazy_make_forward const (const)\nfunction caml_lazy_make_forward (v) { return [250, v]; }\n\n//Provides: caml_mul const\nif (!Math.imul)\n Math.imul =\n function (x,y)\n { y |= 0; return ((((x >> 16) * y) << 16) + (x & 0xffff) * y)|0; };\nvar caml_mul = Math.imul;\n\n//slightly slower\n// function mul32(x,y) {\n// var xlo = x & 0xffff;\n// var xhi = x - xlo;\n// return (((xhi * y) |0) + xlo * y)|0;\n// }\n\n//Provides: caml_div\n//Requires: caml_raise_zero_divide\nfunction caml_div(x,y) {\n if (y == 0) caml_raise_zero_divide ();\n return (x/y)|0;\n}\n\n//Provides: caml_mod\n//Requires: caml_raise_zero_divide\nfunction caml_mod(x,y) {\n if (y == 0) caml_raise_zero_divide ();\n return x%y;\n}\n\n///////////// Pervasive\n//Provides: caml_array_set (mutable, const, const)\n//Requires: caml_array_bound_error\nfunction caml_array_set (array, index, newval) {\n if ((index < 0) || (index >= array.length - 1)) caml_array_bound_error();\n array[index+1]=newval; return 0;\n}\n\n//Provides: caml_array_get mutable (const, const)\n//Requires: caml_array_bound_error\nfunction caml_array_get (array, index) {\n if ((index < 0) || (index >= array.length - 1)) caml_array_bound_error();\n return array[index+1];\n}\n\n//Provides: caml_check_bound (const, const)\n//Requires: caml_array_bound_error\nfunction caml_check_bound (array, index) {\n if (index >>> 0 >= array.length - 1) caml_array_bound_error();\n return array;\n}\n\n//Provides: caml_make_vect const (const, const)\nfunction caml_make_vect (len, init) {\n var len = len + 1 | 0;\n var b = new Array(len);\n b[0]=0;\n for (var i = 1; i < len; i++) b[i] = init;\n return b;\n}\n\n//Provides: caml_make_float_vect const (const)\nfunction caml_make_float_vect(len){\n var len = len + 1 | 0;\n var b = new Array(len);\n b[0]=254;\n for (var i = 1; i < len; i++) b[i] = 0;\n return b\n}\n\n//Provides: caml_compare_val (const, const, const)\n//Requires: MlString, caml_int64_compare, caml_int_compare, caml_string_compare\n//Requires: caml_invalid_argument\nfunction caml_compare_val (a, b, total) {\n var stack = [];\n for(;;) {\n if (!(total && a === b)) {\n if (a instanceof MlString) {\n if (b instanceof MlString) {\n if (a !== b) {\n\u0009\u0009var x = caml_string_compare(a, b);\n\u0009\u0009if (x != 0) return x;\n\u0009 }\n } else\n // Should not happen\n return 1;\n } else if (a instanceof Array && a[0] === (a[0]|0)) {\n var ta = a[0];\n // ignore double_array_tag\n if (ta === 254) ta=0;\n // Forward object\n if (ta === 250) {\n a = a[1];\n continue;\n } else if (b instanceof Array && b[0] === (b[0]|0)) {\n var tb = b[0];\n // ignore double_array_tag\n if (tb === 254) tb=0;\n // Forward object\n if (tb === 250) {\n b = b[1];\n continue;\n } else if (ta != tb) {\n return (ta < tb)?-1:1;\n } else {\n switch (ta) {\n case 248: {\n\u0009\u0009// Object\n\u0009\u0009var x = caml_int_compare(a[2], b[2]);\n\u0009\u0009if (x != 0) return x;\n\u0009\u0009break;\n\u0009 }\n case 251: {\n caml_invalid_argument(\"equal: abstract value\");\n }\n case 255: {\n\u0009\u0009// Int64\n\u0009\u0009var x = caml_int64_compare(a, b);\n\u0009\u0009if (x != 0) return x;\n\u0009\u0009break;\n\u0009 }\n default:\n if (a.length != b.length) return (a.length < b.length)?-1:1;\n if (a.length > 1) stack.push(a, b, 1);\n }\n }\n } else\n return 1;\n } else if (b instanceof MlString ||\n (b instanceof Array && b[0] === (b[0]|0))) {\n return -1;\n } else if (typeof a != \"number\" && a && a.compare) {\n return a.compare(b,total);\n } else {\n if (a < b) return -1;\n if (a > b) return 1;\n if (a != b) {\n if (!total) return NaN;\n if (a == a) return 1;\n if (b == b) return -1;\n }\n }\n }\n if (stack.length == 0) return 0;\n var i = stack.pop();\n b = stack.pop();\n a = stack.pop();\n if (i + 1 < a.length) stack.push(a, b, i + 1);\n a = a[i];\n b = b[i];\n }\n}\n//Provides: caml_compare (const, const)\n//Requires: caml_compare_val\nfunction caml_compare (a, b) { return caml_compare_val (a, b, true); }\n//Provides: caml_int_compare mutable (const, const)\nfunction caml_int_compare (a, b) {\n if (a < b) return (-1); if (a == b) return 0; return 1;\n}\n//Provides: caml_equal mutable (const, const)\n//Requires: caml_compare_val\nfunction caml_equal (x, y) { return +(caml_compare_val(x,y,false) == 0); }\n//Provides: caml_notequal mutable (const, const)\n//Requires: caml_compare_val\nfunction caml_notequal (x, y) { return +(caml_compare_val(x,y,false) != 0); }\n//Provides: caml_greaterequal mutable (const, const)\n//Requires: caml_compare_val\nfunction caml_greaterequal (x, y) { return +(caml_compare_val(x,y,false) >= 0); }\n//Provides: caml_greaterthan mutable (const, const)\n//Requires: caml_compare_val\nfunction caml_greaterthan (x, y) { return +(caml_compare_val(x,y,false) > 0); }\n//Provides: caml_lessequal mutable (const, const)\n//Requires: caml_compare_val\nfunction caml_lessequal (x, y) { return +(caml_compare_val(x,y,false) <= 0); }\n//Provides: caml_lessthan mutable (const, const)\n//Requires: caml_compare_val\nfunction caml_lessthan (x, y) { return +(caml_compare_val(x,y,false) < 0); }\n\n//Provides: caml_parse_sign_and_base\n//Requires: caml_string_unsafe_get, caml_ml_string_length\nfunction caml_parse_sign_and_base (s) {\n var i = 0, len = caml_ml_string_length(s), base = 10,\n sign = (len > 0 && caml_string_unsafe_get(s,0) == 45)?(i++,-1):1;\n if (i + 1 < len && caml_string_unsafe_get(s, i) == 48)\n switch (caml_string_unsafe_get(s, i + 1)) {\n case 120: case 88: base = 16; i += 2; break;\n case 111: case 79: base = 8; i += 2; break;\n case 98: case 66: base = 2; i += 2; break;\n }\n return [i, sign, base];\n}\n\n//Provides: caml_parse_digit\nfunction caml_parse_digit(c) {\n if (c >= 48 && c <= 57) return c - 48;\n if (c >= 65 && c <= 90) return c - 55;\n if (c >= 97 && c <= 122) return c - 87;\n return -1;\n}\n\n//Provides: caml_int_of_string (const)\n//Requires: caml_ml_string_length, caml_string_unsafe_get\n//Requires: caml_parse_sign_and_base, caml_parse_digit, caml_failwith\nfunction caml_int_of_string (s) {\n var r = caml_parse_sign_and_base (s);\n var i = r[0], sign = r[1], base = r[2];\n var len = caml_ml_string_length(s);\n var threshold = -1 >>> 0;\n var c = (i < len)?caml_string_unsafe_get(s, i):0;\n var d = caml_parse_digit(c);\n if (d < 0 || d >= base) caml_failwith(\"int_of_string\");\n var res = d;\n for (i++;i= base) break;\n res = base * res + d;\n if (res > threshold) caml_failwith(\"int_of_string\");\n }\n if (i != len) caml_failwith(\"int_of_string\");\n // For base different from 10, we expect an unsigned representation,\n // hence any value of 'res' (less than 'threshold') is acceptable.\n // But we have to convert the result back to a signed integer.\n res = sign * res;\n if ((base == 10) && ((res | 0) != res))\n /* Signed representation expected, allow -2^(nbits-1) to 2^(nbits-1) - 1 */\n caml_failwith(\"int_of_string\");\n return res | 0;\n}\n\n//Provides: caml_float_of_string (const)\n//Requires: caml_failwith, caml_bytes_of_string\nfunction caml_float_of_string(s) {\n var res;\n s = caml_bytes_of_string (s);\n res = +s;\n if ((s.length > 0) && (res === res)) return res;\n s = s.replace(/_/g,\"\");\n res = +s;\n if (((s.length > 0) && (res === res)) || /^[+-]?nan$/i.test(s)) return res;\n if(/^ *0x[0-9a-f_]+p[+-]?[0-9_]+/i.test(s)){\n var pidx = s.indexOf('p');\n pidx = (pidx==-1)?s.indexOf('P'):pidx;\n var exp = +s.substring(pidx + 1);\n res = +s.substring(0,pidx);\n return res * Math.pow(2,exp);\n }\n if(/^\\+?inf(inity)?$/i.test(s)) return Infinity;\n if(/^-inf(inity)?$/i.test(s)) return -Infinity;\n caml_failwith(\"float_of_string\");\n}\n\n//Provides: caml_is_printable const (const)\nfunction caml_is_printable(c) { return +(c > 31 && c < 127); }\n\n///////////// Format\n//Provides: caml_parse_format\n//Requires: caml_bytes_of_string, caml_invalid_argument\nfunction caml_parse_format (fmt) {\n fmt = caml_bytes_of_string(fmt);\n var len = fmt.length;\n if (len > 31) caml_invalid_argument(\"format_int: format too long\");\n var f =\n { justify:'+', signstyle:'-', filler:' ', alternate:false,\n base:0, signedconv:false, width:0, uppercase:false,\n sign:1, prec:-1, conv:'f' };\n for (var i = 0; i < len; i++) {\n var c = fmt.charAt(i);\n switch (c) {\n case '-':\n f.justify = '-'; break;\n case '+': case ' ':\n f.signstyle = c; break;\n case '0':\n f.filler = '0'; break;\n case '#':\n f.alternate = true; break;\n case '1': case '2': case '3': case '4': case '5':\n case '6': case '7': case '8': case '9':\n f.width = 0;\n while (c=fmt.charCodeAt(i) - 48, c >= 0 && c <= 9) {\n f.width = f.width * 10 + c; i++\n }\n i--;\n break;\n case '.':\n f.prec = 0;\n i++;\n while (c=fmt.charCodeAt(i) - 48, c >= 0 && c <= 9) {\n f.prec = f.prec * 10 + c; i++\n }\n i--;\n case 'd': case 'i':\n f.signedconv = true; /* fallthrough */\n case 'u':\n f.base = 10; break;\n case 'x':\n f.base = 16; break;\n case 'X':\n f.base = 16; f.uppercase = true; break;\n case 'o':\n f.base = 8; break;\n case 'e': case 'f': case 'g':\n f.signedconv = true; f.conv = c; break;\n case 'E': case 'F': case 'G':\n f.signedconv = true; f.uppercase = true;\n f.conv = c.toLowerCase (); break;\n }\n }\n return f;\n}\n\n//Provides: caml_finish_formatting\n//Requires: caml_new_string\nfunction caml_finish_formatting(f, rawbuffer) {\n if (f.uppercase) rawbuffer = rawbuffer.toUpperCase();\n var len = rawbuffer.length;\n /* Adjust len to reflect additional chars (sign, etc) */\n if (f.signedconv && (f.sign < 0 || f.signstyle != '-')) len++;\n if (f.alternate) {\n if (f.base == 8) len += 1;\n if (f.base == 16) len += 2;\n }\n /* Do the formatting */\n var buffer = \"\";\n if (f.justify == '+' && f.filler == ' ')\n for (var i = len; i < f.width; i++) buffer += ' ';\n if (f.signedconv) {\n if (f.sign < 0) buffer += '-';\n else if (f.signstyle != '-') buffer += f.signstyle;\n }\n if (f.alternate && f.base == 8) buffer += '0';\n if (f.alternate && f.base == 16) buffer += \"0x\";\n if (f.justify == '+' && f.filler == '0')\n for (var i = len; i < f.width; i++) buffer += '0';\n buffer += rawbuffer;\n if (f.justify == '-')\n for (var i = len; i < f.width; i++) buffer += ' ';\n return caml_new_string (buffer);\n}\n\n//Provides: caml_format_int const (const, const)\n//Requires: caml_parse_format, caml_finish_formatting, caml_str_repeat\n//Requires: caml_new_string, caml_bytes_of_string\nfunction caml_format_int(fmt, i) {\n if (caml_bytes_of_string(fmt) == \"%d\") return caml_new_string(\"\"+i);\n var f = caml_parse_format(fmt);\n if (i < 0) { if (f.signedconv) { f.sign = -1; i = -i; } else i >>>= 0; }\n var s = i.toString(f.base);\n if (f.prec >= 0) {\n f.filler = ' ';\n var n = f.prec - s.length;\n if (n > 0) s = caml_str_repeat (n, '0') + s;\n }\n return caml_finish_formatting(f, s);\n}\n\n//Provides: caml_format_float const\n//Requires: caml_parse_format, caml_finish_formatting\nfunction caml_format_float (fmt, x) {\n var s, f = caml_parse_format(fmt);\n var prec = (f.prec < 0)?6:f.prec;\n if (x < 0) { f.sign = -1; x = -x; }\n if (isNaN(x)) { s = \"nan\"; f.filler = ' '; }\n else if (!isFinite(x)) { s = \"inf\"; f.filler = ' '; }\n else\n switch (f.conv) {\n case 'e':\n var s = x.toExponential(prec);\n // exponent should be at least two digits\n var i = s.length;\n if (s.charAt(i - 3) == 'e')\n s = s.slice (0, i - 1) + '0' + s.slice (i - 1);\n break;\n case 'f':\n s = x.toFixed(prec); break;\n case 'g':\n prec = prec?prec:1;\n s = x.toExponential(prec - 1);\n var j = s.indexOf('e');\n var exp = +s.slice(j + 1);\n if (exp < -4 || x >= 1e21 || x.toFixed(0).length > prec) {\n // remove trailing zeroes\n var i = j - 1; while (s.charAt(i) == '0') i--;\n if (s.charAt(i) == '.') i--;\n s = s.slice(0, i + 1) + s.slice(j);\n i = s.length;\n if (s.charAt(i - 3) == 'e')\n s = s.slice (0, i - 1) + '0' + s.slice (i - 1);\n break;\n } else {\n var p = prec;\n if (exp < 0) { p -= exp + 1; s = x.toFixed(p); }\n else while (s = x.toFixed(p), s.length > prec + 1) p--;\n if (p) {\n // remove trailing zeroes\n var i = s.length - 1; while (s.charAt(i) == '0') i--;\n if (s.charAt(i) == '.') i--;\n s = s.slice(0, i + 1);\n }\n }\n break;\n }\n return caml_finish_formatting(f, s);\n}\n\n///////////// Hashtbl\n//Provides: caml_hash_univ_param mutable\n//Requires: MlString, caml_convert_string_to_bytes\n//Requires: caml_int64_to_bytes, caml_int64_bits_of_float\nfunction caml_hash_univ_param (count, limit, obj) {\n var hash_accu = 0;\n function hash_aux (obj) {\n limit --;\n if (count < 0 || limit < 0) return;\n if (obj instanceof Array && obj[0] === (obj[0]|0)) {\n switch (obj[0]) {\n case 248:\n // Object\n count --;\n hash_accu = (hash_accu * 65599 + obj[2]) | 0;\n break;\n case 250:\n // Forward\n limit++; hash_aux(obj); break;\n case 255:\n // Int64\n count --;\n hash_accu = (hash_accu * 65599 + obj[1] + (obj[2] << 24)) | 0;\n break;\n default:\n count --;\n hash_accu = (hash_accu * 19 + obj[0]) | 0;\n for (var i = obj.length - 1; i > 0; i--) hash_aux (obj[i]);\n }\n } else if (obj instanceof MlString) {\n count --;\n switch (obj.t & 6) {\n default: /* PARTIAL */\n caml_convert_string_to_bytes(obj);\n case 0: /* BYTES */\n for (var b = obj.c, l = obj.l, i = 0; i < l; i++)\n hash_accu = (hash_accu * 19 + b.charCodeAt(i)) | 0;\n break;\n case 2: /* ARRAY */\n for (var a = obj.c, l = obj.l, i = 0; i < l; i++)\n hash_accu = (hash_accu * 19 + a[i]) | 0;\n }\n } else if (obj === (obj|0)) {\n // Integer\n count --;\n hash_accu = (hash_accu * 65599 + obj) | 0;\n } else if (obj === +obj) {\n // Float\n count--;\n var p = caml_int64_to_bytes (caml_int64_bits_of_float (obj));\n for (var i = 7; i >= 0; i--) hash_accu = (hash_accu * 19 + p[i]) | 0;\n }\n }\n hash_aux (obj);\n return hash_accu & 0x3FFFFFFF;\n}\n\n//Provides: caml_hash mutable\n//Requires: MlString, caml_convert_string_to_bytes\n//Requires: caml_int64_bits_of_float, caml_mul\nvar caml_hash =\nfunction () {\n var HASH_QUEUE_SIZE = 256;\n function ROTL32(x,n) { return ((x << n) | (x >>> (32-n))); }\n function MIX(h,d) {\n d = caml_mul(d, 0xcc9e2d51|0);\n d = ROTL32(d, 15);\n d = caml_mul(d, 0x1b873593);\n h ^= d;\n h = ROTL32(h, 13);\n return (((h + (h << 2))|0) + (0xe6546b64|0))|0;\n }\n function FINAL_MIX(h) {\n h ^= h >>> 16;\n h = caml_mul (h, 0x85ebca6b|0);\n h ^= h >>> 13;\n h = caml_mul (h, 0xc2b2ae35|0);\n h ^= h >>> 16;\n return h;\n }\n function caml_hash_mix_int64 (h, v) {\n var lo = v[1] | (v[2] << 24);\n var hi = (v[2] >>> 8) | (v[3] << 16);\n h = MIX(h, lo);\n h = MIX(h, hi);\n return h;\n }\n function caml_hash_mix_int64_2 (h, v) {\n var lo = v[1] | (v[2] << 24);\n var hi = (v[2] >>> 8) | (v[3] << 16);\n h = MIX(h, hi ^ lo);\n return h;\n }\n function caml_hash_mix_string_str(h, s) {\n var len = s.length, i, w;\n for (i = 0; i + 4 <= len; i += 4) {\n w = s.charCodeAt(i)\n | (s.charCodeAt(i+1) << 8)\n | (s.charCodeAt(i+2) << 16)\n | (s.charCodeAt(i+3) << 24);\n h = MIX(h, w);\n }\n w = 0;\n switch (len & 3) {\n case 3: w = s.charCodeAt(i+2) << 16;\n case 2: w |= s.charCodeAt(i+1) << 8;\n case 1: w |= s.charCodeAt(i);\n h = MIX(h, w);\n default:\n }\n h ^= len;\n return h;\n }\n function caml_hash_mix_string_arr(h, s) {\n var len = s.length, i, w;\n for (i = 0; i + 4 <= len; i += 4) {\n w = s[i]\n | (s[i+1] << 8)\n | (s[i+2] << 16)\n | (s[i+3] << 24);\n h = MIX(h, w);\n }\n w = 0;\n switch (len & 3) {\n case 3: w = s[i+2] << 16;\n case 2: w |= s[i+1] << 8;\n case 1: w |= s[i];\n h = MIX(h, w);\n default:\n }\n h ^= len;\n return h;\n }\n return function (count, limit, seed, obj) {\n var queue, rd, wr, sz, num, h, v, i, len;\n sz = limit;\n if (sz < 0 || sz > HASH_QUEUE_SIZE) sz = HASH_QUEUE_SIZE;\n num = count;\n h = seed;\n queue = [obj]; rd = 0; wr = 1;\n while (rd < wr && num > 0) {\n v = queue[rd++];\n if (v instanceof Array && v[0] === (v[0]|0)) {\n switch (v[0]) {\n case 248:\n // Object\n h = MIX(h, v[2]);\n num--;\n break;\n case 250:\n // Forward\n queue[--rd] = v[1];\n break;\n case 255:\n // Int64\n h = caml_hash_mix_int64_2 (h, v);\n num --;\n break;\n default:\n var tag = ((v.length - 1) << 10) | v[0];\n h = MIX(h, tag);\n for (i = 1, len = v.length; i < len; i++) {\n if (wr >= sz) break;\n queue[wr++] = v[i];\n }\n break;\n }\n } else if (v instanceof MlString) {\n switch (v.t & 6) {\n default:\n caml_convert_string_to_bytes (v);\n case 0: /* BYTES */\n h = caml_hash_mix_string_str(h, v.c);\n break;\n case 2: /* ARRAY */\n h = caml_hash_mix_string_arr(h, v.c);\n }\n num--;\n } else if (v === (v|0)) {\n // Integer\n h = MIX(h, v+v+1);\n num--;\n } else if (v === +v) {\n // Float\n h = caml_hash_mix_int64(h, caml_int64_bits_of_float (v));\n num--;\n }\n }\n h = FINAL_MIX(h);\n return h & 0x3FFFFFFF;\n }\n} ();\n\n///////////// Sys\n//Provides: caml_sys_time mutable\nvar caml_initial_time = new Date() * 0.001;\nfunction caml_sys_time () { return new Date() * 0.001 - caml_initial_time; }\n//Provides: caml_sys_get_config const\n//Requires: caml_new_string\nfunction caml_sys_get_config () {\n return [0, caml_new_string(\"Unix\"), 32, 0];\n}\n//Provides: caml_sys_random_seed mutable\n//Version: < 4.00\n//The function needs to return an array since OCaml 4.0...\nfunction caml_sys_random_seed () {\n var x = new Date()^0xffffffff*Math.random();\n return x;\n}\n\n//Provides: caml_sys_random_seed mutable\n//Version: >= 4.00\n//The function needs to return an array since OCaml 4.0...\nfunction caml_sys_random_seed () {\n var x = new Date()^0xffffffff*Math.random();\n return [0,x];\n}\n\n\n\n//Provides: caml_sys_const_big_endian const\nfunction caml_sys_const_big_endian () { return 0; }\n//Provides: caml_sys_const_word_size const\nfunction caml_sys_const_word_size () { return 32; }\n//Provides: caml_sys_const_int_size const\nfunction caml_sys_const_int_size () { return 32; }\n\n//Provides: caml_sys_const_max_wosize const\n// max_int / 4 so that the following does not overflow\n//let max_string_length = word_size / 8 * max_array_length - 1;;\nfunction caml_sys_const_max_wosize () { return (0x7FFFFFFF/4) | 0;}\n\n//Provides: caml_sys_const_ostype_cygwin const\nfunction caml_sys_const_ostype_cygwin () { return 0; }\n//Provides: caml_sys_const_ostype_unix const\nfunction caml_sys_const_ostype_unix () { return 1; }\n//Provides: caml_sys_const_ostype_win32 const\nfunction caml_sys_const_ostype_win32 () { return 0; }\n\n//Provides: caml_sys_system_command\nfunction caml_sys_system_command(_cmd){\n return 127;\n}\n\n///////////// Array\n//Provides: caml_array_sub mutable\nfunction caml_array_sub (a, i, len) {\n var a2 = new Array(len+1);\n a2[0]=0;\n for(var i2 = 1, i1= i+1; i2 <= len; i2++,i1++ ){\n a2[i2]=a[i1];\n }\n return a2;\n}\n\n//Provides: caml_array_append mutable\nfunction caml_array_append(a1, a2) {\n var l1 = a1.length, l2 = a2.length;\n var l = l1+l2-1\n var a = new Array(l);\n a[0] = 0;\n var i = 1,j = 1;\n for(;i= 1; j--) a2[i2 + j] = a1[i1 + j];\n };\n return 0;\n}\n\n///////////// CamlinternalOO\n//Provides: caml_get_public_method const\nvar caml_method_cache = [];\nfunction caml_get_public_method (obj, tag, cacheid) {\n var meths = obj[1];\n var ofs = caml_method_cache[cacheid];\n if (ofs === null) {\n // Make sure the array is not sparse\n for (var i = caml_method_cache.length; i < cacheid; i++)\n caml_method_cache[i] = 0;\n } else if (meths[ofs] === tag) {\n// console.log(\"cache hit\");\n return meths[ofs - 1];\n }\n// console.log(\"cache miss\");\n var li = 3, hi = meths[1] * 2 + 1, mi;\n while (li < hi) {\n mi = ((li+hi) >> 1) | 1;\n if (tag < meths[mi+1]) hi = mi-2;\n else li = mi;\n }\n caml_method_cache[cacheid] = li + 1;\n /* return 0 if tag is not there */\n return (tag == meths[li+1] ? meths[li] : 0);\n}\n\n//Provides: caml_final_register const\nfunction caml_final_register () { return 0; }\n//Provides: caml_final_release const\nfunction caml_final_release () { return 0; }\n//Provides: caml_backtrace_status const\nfunction caml_backtrace_status () { return 0; }\n//Provides: caml_get_exception_backtrace const\nfunction caml_get_exception_backtrace () { return 0; }\n//Provides: caml_get_exception_raw_backtrace const\nfunction caml_get_exception_raw_backtrace () { return 0; }\n//Provides: caml_record_backtrace\nfunction caml_record_backtrace () { return 0; }\n//Provides: caml_convert_raw_backtrace const\nfunction caml_convert_raw_backtrace () { return 0; }\n//Provides: caml_get_current_callstack const\nfunction caml_get_current_callstack () { return 0; }\n//Provides: caml_sys_getenv\n//Requires: caml_raise_not_found\n//Requires: caml_js_to_string\nfunction caml_sys_getenv (name) {\n var g = joo_global_object;\n var n = name.toString();\n //nodejs env\n if(g.process\n && g.process.env\n && g.process.env[n] != undefined)\n return caml_js_to_string(g.process.env[n]);\n caml_raise_not_found ();\n}\n//Provides: caml_sys_exit\n//Requires: caml_invalid_argument\nfunction caml_sys_exit (code) {\n var g = joo_global_object;\n if(g.quit) g.quit(code);\n //nodejs\n if(g.process && g.process.exit) g.process.exit(code);\n caml_invalid_argument(\"Function 'exit' not implemented\");\n}\n\n//Provides: caml_sys_get_argv const\n//Requires: caml_js_to_string\n//Requires: raw_array_sub\nfunction caml_sys_get_argv () {\n var g = joo_global_object;\n var main = \"a.out\";\n var args = []\n\n if(g.process\n && g.process.argv\n && g.process.argv.length > 0) {\n var argv = g.process.argv\n //nodejs\n main = argv[1];\n args = raw_array_sub(argv,2,argv.length - 2);\n }\n\n var p = caml_js_to_string(main);\n var args2 = [0, p];\n for(var i = 0; i < args.length; i++)\n args2.push(caml_js_to_string(args[i]));\n return [0, p, args2];\n}\n\n//Provides: unix_inet_addr_of_string\nfunction unix_inet_addr_of_string () {return 0;}\n\n//Provides: caml_oo_last_id\nvar caml_oo_last_id = 0;\n\n//Provides: caml_set_oo_id\n//Requires: caml_oo_last_id\nfunction caml_set_oo_id (b) {\n b[2]=caml_oo_last_id++;\n return b;\n}\n\n//Provides: caml_fresh_oo_id\n//Requires: caml_oo_last_id\nfunction caml_fresh_oo_id() {\n return caml_oo_last_id++;\n}\n\n//Provides: caml_install_signal_handler const\nfunction caml_install_signal_handler(){return 0}\n\n\n//Provides: caml_convert_raw_backtrace_slot\n//Requires: caml_failwith\nfunction caml_convert_raw_backtrace_slot(){\n caml_failwith(\"caml_convert_raw_backtrace_slot\");\n}\n\n//Provides: caml_bswap16\nfunction caml_bswap16(x) {\n return ((((x & 0x00FF) << 8) |\n ((x & 0xFF00) >> 8)));\n}\n//Provides: caml_int32_bswap\nfunction caml_int32_bswap(x) {\n return (((x & 0x000000FF) << 24) |\n ((x & 0x0000FF00) << 8) |\n ((x & 0x00FF0000) >> 8) |\n ((x & 0xFF000000) >> 24));\n}\n//Provides: caml_int64_bswap\nfunction caml_int64_bswap(x) {\n return [\n 255,\n (((x[3] & 0x0000ff00) >> 8) |\n ((x[3] & 0x000000ff) << 8) |\n ((x[2] & 0x00ff0000))),\n (((x[2] & 0x0000ff00) >> 8) |\n ((x[2] & 0x000000ff) << 8) |\n ((x[1] & 0x00ff0000))),\n (((x[1] & 0x0000ff00) >> 8) |\n ((x[1] & 0x000000ff) << 8))]\n}\n\n//Provides: caml_list_of_js_array const (const)\nfunction caml_list_of_js_array(a){\n var l = 0;\n for(var i=a.length - 1; i>=0; i--){\n var e = a[i];\n l = [0,e,l];\n }\n return l\n}\n", + "// Js_of_ocaml runtime support\n// http://www.ocsigen.org/js_of_ocaml/\n// Copyright (C) 2010-2014 Jérôme Vouillon\n// Laboratoire PPS - CNRS Université Paris Diderot\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation, with linking exception;\n// either version 2.1 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n\n// An OCaml string is an object with three fields:\n// - tag 't'\n// - length 'l'\n// - contents 'c'\n//\n// The contents of the string can be either a JavaScript array or\n// a JavaScript string. The length of this string can be less than the\n// length of the OCaml string. In this case, remaining bytes are\n// assumed to be zeroes. Arrays are mutable but consumes more memory\n// than strings. A common pattern is to start from an empty string and\n// progressively fill it from the start. Partial strings makes it\n// possible to implement this efficiently.\n//\n// When converting to and from UTF-16, we keep track of whether the\n// string is composed only of ASCII characters (in which case, no\n// conversion needs to be performed) or not.\n//\n// The string tag can thus take the following values:\n// full string BYTE | UNKNOWN: 0\n// BYTE | ASCII: 9\n// BYTE | NOT_ASCII: 8\n// string prefix PARTIAL: 2\n// array ARRAY: 4\n//\n// One can use bit masking to discriminate these different cases:\n// known_encoding(x) = x&8\n// is_ascii(x) = x&1\n// kind(x) = x&6\n\n//Provides: caml_str_repeat\nfunction caml_str_repeat(n, s) {\n if (s.repeat) return s.repeat(n); // ECMAscript 6 and Firefox 24+\n var r = \"\", l = 0;\n if (n == 0) return r;\n for(;;) {\n if (n & 1) r += s;\n n >>= 1;\n if (n == 0) return r;\n s += s;\n l++;\n if (l == 9) {\n s.slice(0,1); // flatten the string\n // then, the flattening of the whole string will be faster,\n // as it will be composed of larger pieces\n }\n }\n}\n\n//Provides: caml_subarray_to_string\n//Requires: raw_array_sub\nfunction caml_subarray_to_string (a, i, len) {\n var f = String.fromCharCode;\n if (i == 0 && len <= 4096 && len == a.length) return f.apply (null, a);\n var s = \"\";\n for (; 0 < len; i += 1024,len-=1024)\n s += f.apply (null, raw_array_sub(a,i, Math.min(len, 1024)));\n return s;\n}\n\n//Provides: caml_utf8_of_utf16\nfunction caml_utf8_of_utf16(s) {\n for (var b = \"\", t = b, c, d, i = 0, l = s.length; i < l; i++) {\n c = s.charCodeAt(i);\n if (c < 0x80) {\n for (var j = i + 1; (j < l) && (c = s.charCodeAt(j)) < 0x80; j++);\n if (j - i > 512) { t.substr(0, 1); b += t; t = \"\"; b += s.slice(i, j) }\n else t += s.slice(i, j);\n if (j == l) break;\n i = j;\n }\n if (c < 0x800) {\n t += String.fromCharCode(0xc0 | (c >> 6));\n t += String.fromCharCode(0x80 | (c & 0x3f));\n } else if (c < 0xd800 || c >= 0xdfff) {\n t += String.fromCharCode(0xe0 | (c >> 12),\n 0x80 | ((c >> 6) & 0x3f),\n 0x80 | (c & 0x3f));\n } else if (c >= 0xdbff || i + 1 == l ||\n (d = s.charCodeAt(i + 1)) < 0xdc00 || d > 0xdfff) {\n // Unmatched surrogate pair, replaced by \\ufffd (replacement character)\n t += \"\\xef\\xbf\\xbd\";\n } else {\n i++;\n c = (c << 10) + d - 0x35fdc00;\n t += String.fromCharCode(0xf0 | (c >> 18),\n 0x80 | ((c >> 12) & 0x3f),\n 0x80 | ((c >> 6) & 0x3f),\n 0x80 | (c & 0x3f));\n }\n if (t.length > 1024) {t.substr(0, 1); b += t; t = \"\";}\n }\n return b+t;\n}\n\n//Provides: caml_utf16_of_utf8\nfunction caml_utf16_of_utf8(s) {\n for (var b = \"\", t = \"\", c, c1, c2, v, i = 0, l = s.length; i < l; i++) {\n c1 = s.charCodeAt(i);\n if (c1 < 0x80) {\n for (var j = i + 1; (j < l) && (c1 = s.charCodeAt(j)) < 0x80; j++);\n if (j - i > 512) { t.substr(0, 1); b += t; t = \"\"; b += s.slice(i, j) }\n else t += s.slice(i, j);\n if (j == l) break;\n i = j;\n }\n v = 1;\n if ((++i < l) && (((c2 = s.charCodeAt(i)) & -64) == 128)) {\n c = c2 + (c1 << 6);\n if (c1 < 0xe0) {\n v = c - 0x3080;\n if (v < 0x80) v = 1;\n } else {\n v = 2;\n if ((++i < l) && (((c2 = s.charCodeAt(i)) & -64) == 128)) {\n c = c2 + (c << 6);\n if (c1 < 0xf0) {\n v = c - 0xe2080;\n if ((v < 0x800) || ((v >= 0xd7ff) && (v < 0xe000))) v = 2;\n } else {\n v = 3;\n if ((++i < l) && (((c2 = s.charCodeAt(i)) & -64) == 128) &&\n (c1 < 0xf5)) {\n v = c2 - 0x3c82080 + (c << 6);\n if (v < 0x10000 || v > 0x10ffff) v = 3;\n }\n }\n }\n }\n }\n if (v < 4) { // Invalid sequence\n i -= v;\n t += \"\\ufffd\";\n } else if (v > 0xffff)\n t += String.fromCharCode(0xd7c0 + (v >> 10), 0xdc00 + (v & 0x3FF))\n else\n t += String.fromCharCode(v);\n if (t.length > 1024) {t.substr(0, 1); b += t; t = \"\";}\n }\n return b+t;\n}\n\n//Provides: caml_is_ascii\nfunction caml_is_ascii (s) {\n // The regular expression gets better at around this point for all browsers\n if (s.length < 24) {\n // Spidermonkey gets much slower when s.length >= 24 (on 64 bit archs)\n for (var i = 0; i < s.length; i++) if (s.charCodeAt(i) > 127) return false;\n return true;\n } else\n return !/[^\\x00-\\x7f]/.test(s);\n}\n\n//Provides: caml_to_js_string\n//Requires: caml_convert_string_to_bytes, caml_is_ascii, caml_utf16_of_utf8\nfunction caml_to_js_string(s) {\n switch (s.t) {\n case 9: /*BYTES | ASCII*/\n return s.c;\n default:\n caml_convert_string_to_bytes(s);\n case 0: /*BYTES | UNKOWN*/\n if (caml_is_ascii(s.c)) {\n s.t = 9; /*BYTES | ASCII*/\n return s.c;\n }\n s.t = 8; /*BYTES | NOT_ASCII*/\n case 8: /*BYTES | NOT_ASCII*/\n return caml_utf16_of_utf8(s.c);\n }\n}\n\n//Provides: caml_string_unsafe_get mutable\nfunction caml_string_unsafe_get (s, i) {\n switch (s.t & 6) {\n default: /* PARTIAL */\n if (i >= s.c.length) return 0;\n case 0: /* BYTES */\n return s.c.charCodeAt(i);\n case 4: /* ARRAY */\n return s.c[i]\n }\n}\n\n//Provides: caml_string_unsafe_set\n//Requires: caml_convert_string_to_array\nfunction caml_string_unsafe_set (s, i, c) {\n // The OCaml compiler uses Char.unsafe_chr on integers larger than 255!\n c &= 0xff;\n if (s.t != 4 /* ARRAY */) {\n if (i == s.c.length) {\n s.c += String.fromCharCode (c);\n if (i + 1 == s.l) s.t = 0; /*BYTES | UNKOWN*/\n return 0;\n }\n caml_convert_string_to_array (s);\n }\n s.c[i] = c;\n return 0;\n}\n\n//Provides: caml_string_bound_error\n//Requires: caml_invalid_argument\nfunction caml_string_bound_error () {\n caml_invalid_argument (\"index out of bounds\");\n}\n\n//Provides: caml_string_get mutable\n//Requires: caml_string_bound_error, caml_string_unsafe_get\nfunction caml_string_get (s, i) {\n if (i >>> 0 >= s.l) caml_string_bound_error();\n return caml_string_unsafe_get (s, i);\n}\n\n//Provides: caml_string_set\n//Requires: caml_string_bound_error, caml_string_unsafe_set\nfunction caml_string_set (s, i, c) {\n if (i >>> 0 >= s.l) caml_string_bound_error();\n return caml_string_unsafe_set (s, i, c);\n}\n\n//Provides: MlString\n//Requires: caml_to_js_string\nfunction MlString (tag, contents, length) {\n this.t=tag; this.c=contents; this.l=length;\n}\nMlString.prototype.toString = function(){return caml_to_js_string(this)};\n\n//Provides: caml_convert_string_to_bytes\n//Requires: caml_str_repeat, caml_subarray_to_string\nfunction caml_convert_string_to_bytes (s) {\n /* Assumes not BYTES */\n if (s.t == 2 /* PARTIAL */)\n s.c += caml_str_repeat(s.l - s.c.length, '\\0')\n else\n s.c = caml_subarray_to_string (s.c, 0, s.c.length);\n s.t = 0; /*BYTES | UNKOWN*/\n}\n\n//Provides: caml_convert_string_to_array\nfunction caml_convert_string_to_array (s) {\n /* Assumes not ARRAY */\n var a = new Array(s.l), b = s.c, l = b.length, i = 0;\n for (; i < l; i++) a[i] = b.charCodeAt(i);\n for (l = s.l; i < l; i++) a[i] = 0;\n s.c = a;\n s.t = 4; /* ARRAY */\n return a;\n}\n\n//Provides: caml_array_of_string mutable\n//Requires: caml_convert_string_to_array\nfunction caml_array_of_string (s) {\n if (s.t != 4 /* ARRAY */) caml_convert_string_to_array(s);\n return s.c;\n}\n\n//Provides: caml_bytes_of_string mutable\n//Requires: caml_convert_string_to_bytes\nfunction caml_bytes_of_string (s) {\n if ((s.t & 6) != 0 /* BYTES */) caml_convert_string_to_bytes(s);\n return s.c;\n}\n\n//Provides: caml_js_to_string const\n//Requires: caml_is_ascii, caml_utf8_of_utf16, MlString\nfunction caml_js_to_string (s) {\n var tag = 9 /* BYTES | ASCII */;\n if (!caml_is_ascii(s))\n tag = 8 /* BYTES | NOT_ASCII */, s = caml_utf8_of_utf16(s);\n return new MlString(tag, s, s.length);\n}\n\n//Provides: caml_create_string const\n//Requires: MlString,caml_invalid_argument\nfunction caml_create_string(len) {\n if (len < 0) caml_invalid_argument(\"String.create\");\n return new MlString(len?2:9,\"\",len);\n}\n//Provides: caml_new_string\n//Requires: MlString\nfunction caml_new_string (s) { return new MlString(0,s,s.length); }\n//Provides: caml_string_of_array\n//Requires: MlString\nfunction caml_string_of_array (a) { return new MlString(4,a,a.length); }\n\n//Provides: caml_string_compare mutable\n//Requires: caml_convert_string_to_bytes\nfunction caml_string_compare(s1, s2) {\n (s1.t & 6) && caml_convert_string_to_bytes(s1);\n (s2.t & 6) && caml_convert_string_to_bytes(s2);\n return (s1.c < s2.c)?-1:(s1.c > s2.c)?1:0;\n}\n\n//Provides: caml_string_equal mutable\n//Requires: caml_convert_string_to_bytes\nfunction caml_string_equal(s1, s2) {\n (s1.t & 6) && caml_convert_string_to_bytes(s1);\n (s2.t & 6) && caml_convert_string_to_bytes(s2);\n return (s1.c == s2.c)?1:0;\n}\n\n//Provides: caml_string_notequal mutable\n//Requires: caml_string_equal\nfunction caml_string_notequal(s1, s2) { return 1-caml_string_equal(s1, s2); }\n\n//Provides: caml_string_lessequal mutable\n//Requires: caml_convert_string_to_bytes\nfunction caml_string_lessequal(s1, s2) {\n (s1.t & 6) && caml_convert_string_to_bytes(s1);\n (s2.t & 6) && caml_convert_string_to_bytes(s2);\n return (s1.c <= s2.c)?1:0;\n}\n\n//Provides: caml_string_lessthan mutable\n//Requires: caml_convert_string_to_bytes\nfunction caml_string_lessthan(s1, s2) {\n (s1.t & 6) && caml_convert_string_to_bytes(s1);\n (s2.t & 6) && caml_convert_string_to_bytes(s2);\n return (s1.c < s2.c)?1:0;\n}\n\n//Provides: caml_string_greaterequal\n//Requires: caml_string_lessequal\nfunction caml_string_greaterequal(s1, s2) {\n return caml_string_lessequal(s2,s1);\n}\n\n//Provides: caml_string_greaterthan\n//Requires: caml_string_lessthan\nfunction caml_string_greaterthan(s1, s2) {\n return caml_string_lessthan(s2, s1);\n}\n\n//Provides: caml_fill_string\n//Requires: caml_str_repeat, caml_convert_string_to_array\nfunction caml_fill_string(s, i, l, c) {\n if (l > 0) {\n if (i == 0 && (l >= s.l || (s.t == 2 /* PARTIAL */ && l >= s.c.length))) {\n if (c == 0) {\n s.c = \"\";\n s.t = 2; /* PARTIAL */\n } else {\n s.c = caml_str_repeat (l, String.fromCharCode(c));\n s.t = (l == s.l)?0 /* BYTES | UNKOWN */ :2; /* PARTIAL */\n }\n } else {\n if (s.t != 4 /* ARRAY */) caml_convert_string_to_array(s);\n for (l += i; i < l; i++) s.c[i] = c;\n }\n }\n return 0;\n}\n\n//Provides: caml_blit_string\n//Requires: caml_subarray_to_string, caml_convert_string_to_array\nfunction caml_blit_string(s1, i1, s2, i2, len) {\n if (len == 0) return 0;\n if ((i2 == 0) &&\n (len >= s2.l || (s2.t == 2 /* PARTIAL */ && len >= s2.c.length))) {\n s2.c = (s1.t == 4 /* ARRAY */)?\n caml_subarray_to_string(s1.c, i1, len):\n (i1 == 0 && s1.c.length == len)?s1.c:s1.c.substr(i1, len);\n s2.t = (s2.c.length == s2.l)?0 /* BYTES | UNKOWN */ :2; /* PARTIAL */\n } else if (s2.t == 2 /* PARTIAL */ && i2 == s2.c.length) {\n s2.c += (s1.t == 4 /* ARRAY */)?\n caml_subarray_to_string(s1.c, i1, len):\n (i1 == 0 && s1.c.length == len)?s1.c:s1.c.substr(i1, len);\n s2.t = (s2.c.length == s2.l)?0 /* BYTES | UNKOWN */ :2; /* PARTIAL */\n } else {\n if (s2.t != 4 /* ARRAY */) caml_convert_string_to_array(s2);\n var c1 = s1.c, c2 = s2.c;\n if (s1.t == 4 /* ARRAY */)\n for (var i = 0; i < len; i++) c2 [i2 + i] = c1 [i1 + i];\n else {\n var l = Math.min (len, c1.length - i1);\n for (var i = 0; i < l; i++) c2 [i2 + i] = c1.charCodeAt(i1 + i);\n for (; i < len; i++) c2 [i2 + i] = 0;\n }\n }\n return 0;\n}\n\n//Provides: caml_ml_string_length const\nfunction caml_ml_string_length(s) { return s.l }\n", + "// Js_of_ocaml runtime support\n// http://www.ocsigen.org/js_of_ocaml/\n// Copyright (C) 2010 Jérôme Vouillon\n// Laboratoire PPS - CNRS Université Paris Diderot\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation, with linking exception;\n// either version 2.1 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n\n//Provides: caml_int64_bits_of_float const\nfunction caml_int64_bits_of_float (x) {\n if (!isFinite(x)) {\n if (isNaN(x)) return [255, 1, 0, 0xfff0];\n return (x > 0)?[255,0,0,0x7ff0]:[255,0,0,0xfff0];\n }\n var sign = (x>=0)?0:0x8000;\n if (sign) x = -x;\n var exp = Math.floor(Math.LOG2E*Math.log(x)) + 1023;\n if (exp <= 0) {\n exp = 0;\n x /= Math.pow(2,-1026);\n } else {\n x /= Math.pow(2,exp-1027);\n if (x < 16) { x *= 2; exp -=1; }\n if (exp == 0) { x /= 2; }\n }\n var k = Math.pow(2,24);\n var r3 = x|0;\n x = (x - r3) * k;\n var r2 = x|0;\n x = (x - r2) * k;\n var r1 = x|0;\n r3 = (r3 &0xf) | sign | exp << 4;\n return [255, r1, r2, r3];\n}\n//Provides: caml_int64_float_of_bits const\nfunction caml_int64_float_of_bits (x) {\n var exp = (x[3] & 0x7fff) >> 4;\n if (exp == 2047) {\n if ((x[1]|x[2]|(x[3]&0xf)) == 0)\n return (x[3] & 0x8000)?(-Infinity):Infinity;\n else\n return NaN;\n }\n var k = Math.pow(2,-24);\n var res = (x[1]*k+x[2])*k+(x[3]&0xf);\n if (exp > 0) {\n res += 16;\n res *= Math.pow(2,exp-1027);\n } else\n res *= Math.pow(2,-1026);\n if (x[3] & 0x8000) res = - res;\n return res;\n}\n//Provides: caml_classify_float const\nfunction caml_classify_float (x) {\n if (isFinite (x)) {\n if (Math.abs(x) >= 2.2250738585072014e-308) return 0;\n if (x != 0) return 1;\n return 2;\n }\n return isNaN(x)?4:3;\n}\n//Provides: caml_modf_float const\nfunction caml_modf_float (x) {\n if (isFinite (x)) {\n var neg = (1/x) < 0;\n x = Math.abs(x);\n var i = Math.floor (x);\n var f = x - i;\n if (neg) { i = -i; f = -f; }\n return [0, f, i];\n }\n if (isNaN (x)) return [0, NaN, NaN];\n return [0, 1/x, x];\n}\n//Provides: caml_ldexp_float const\nfunction caml_ldexp_float (x,exp) {\n exp |= 0;\n if (exp > 1023) {\n exp -= 1023;\n x *= Math.pow(2, 1023);\n if (exp > 1023) { // in case x is subnormal\n exp -= 1023;\n x *= Math.pow(2, 1023);\n }\n }\n if (exp < -1023) {\n exp += 1023;\n x *= Math.pow(2, -1023);\n }\n x *= Math.pow(2, exp);\n return x;\n}\n//Provides: caml_frexp_float const\nfunction caml_frexp_float (x) {\n if ((x == 0) || !isFinite(x)) return [0, x, 0];\n var neg = x < 0;\n if (neg) x = - x;\n var exp = Math.floor(Math.LOG2E*Math.log(x)) + 1;\n x *= Math.pow(2,-exp);\n if (x < 0.5) { x *= 2; exp -= 1; }\n if (neg) x = - x;\n return [0, x, exp];\n}\n\n//Provides: caml_float_compare const\nfunction caml_float_compare (x, y) {\n if (x === y) return 0;\n if (x < y) return -1;\n if (x > y) return 1;\n if (x === x) return 1;\n if (y === y) return -1;\n return 0;\n}\n\n//Provides: caml_copysign_float const\nfunction caml_copysign_float (x, y) {\n if (y == 0) y = 1 / y;\n x = Math.abs(x);\n return (y < 0)?(-x):x;\n}\n\n//Provides: caml_expm1_float const\nfunction caml_expm1_float (x) {\n var y = Math.exp(x), z = y - 1;\n return (Math.abs(x)>1?z:(z==0?x:x*z/Math.log(y)));\n}\n\n//Provides: caml_log1p_float const\nfunction caml_log1p_float (x) {\n var y = 1 + x, z = y - 1;\n return (z==0?x:x*Math.log(y)/z);\n}\n\n//Provides: caml_hypot_float const\nfunction caml_hypot_float (x, y) {\n var x = Math.abs(x), y = Math.abs(y);\n var a = Math.max(x, y), b = Math.min(x,y) / (a?a:1);\n return (a * Math.sqrt(1 + b*b));\n}\n\n// FIX: these five functions only give approximate results.\n//Provides: caml_log10_float const\nfunction caml_log10_float (x) { return Math.LOG10E * Math.log(x); }\n//Provides: caml_cosh_float const\nfunction caml_cosh_float (x) { return (Math.exp(x) + Math.exp(-x)) / 2; }\n//Provides: caml_sinh_float const\nfunction caml_sinh_float (x) { return (Math.exp(x) - Math.exp(-x)) / 2; }\n//Provides: caml_tanh_float const\nfunction caml_tanh_float (x) {\n var y = Math.exp(x), z = Math.exp(-x);\n return (y + z) / (y - z);\n}\n", + "// Js_of_ocaml runtime support\n// http://www.ocsigen.org/js_of_ocaml/\n// Copyright (C) 2010 Jérôme Vouillon\n// Laboratoire PPS - CNRS Université Paris Diderot\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation, with linking exception;\n// either version 2.1 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n\n//Provides: caml_int64_offset\nvar caml_int64_offset = Math.pow(2, -24);\n\n//Provides: caml_int64_ucompare const\nfunction caml_int64_ucompare(x,y) {\n if (x[3] > y[3]) return 1;\n if (x[3] < y[3]) return -1;\n if (x[2] > y[2]) return 1;\n if (x[2] < y[2]) return -1;\n if (x[1] > y[1]) return 1;\n if (x[1] < y[1]) return -1;\n return 0;\n}\n\n//Provides: caml_int64_ult const\n//Requires: caml_int64_ucompare\nfunction caml_int64_ult(x,y) { return caml_int64_ucompare(x,y) < 0; }\n\n//Provides: caml_int64_compare const\nfunction caml_int64_compare(x,y) {\n var x3 = x[3] << 16;\n var y3 = y[3] << 16;\n if (x3 > y3) return 1;\n if (x3 < y3) return -1;\n if (x[2] > y[2]) return 1;\n if (x[2] < y[2]) return -1;\n if (x[1] > y[1]) return 1;\n if (x[1] < y[1]) return -1;\n return 0;\n}\n\n//Provides: caml_int64_neg const\nfunction caml_int64_neg (x) {\n var y1 = - x[1];\n var y2 = - x[2] + (y1 >> 24);\n var y3 = - x[3] + (y2 >> 24);\n return [255, y1 & 0xffffff, y2 & 0xffffff, y3 & 0xffff];\n}\n\n//Provides: caml_int64_add const\nfunction caml_int64_add (x, y) {\n var z1 = x[1] + y[1];\n var z2 = x[2] + y[2] + (z1 >> 24);\n var z3 = x[3] + y[3] + (z2 >> 24);\n return [255, z1 & 0xffffff, z2 & 0xffffff, z3 & 0xffff];\n}\n\n//Provides: caml_int64_sub const\nfunction caml_int64_sub (x, y) {\n var z1 = x[1] - y[1];\n var z2 = x[2] - y[2] + (z1 >> 24);\n var z3 = x[3] - y[3] + (z2 >> 24);\n return [255, z1 & 0xffffff, z2 & 0xffffff, z3 & 0xffff];\n}\n\n//Provides: caml_int64_mul const\n//Requires: caml_int64_offset\nfunction caml_int64_mul(x,y) {\n var z1 = x[1] * y[1];\n var z2 = ((z1 * caml_int64_offset) | 0) + x[2] * y[1] + x[1] * y[2];\n var z3 = ((z2 * caml_int64_offset) | 0) + x[3] * y[1] + x[2] * y[2] + x[1] * y[3];\n return [255, z1 & 0xffffff, z2 & 0xffffff, z3 & 0xffff];\n}\n\n//Provides: caml_int64_is_zero const\nfunction caml_int64_is_zero(x) {\n return (x[3]|x[2]|x[1]) == 0;\n}\n\n//Provides: caml_int64_is_negative const\nfunction caml_int64_is_negative(x) {\n return (x[3] << 16) < 0;\n}\n\n//Provides: caml_int64_is_min_int const\nfunction caml_int64_is_min_int(x) {\n return x[3] == 0x8000 && (x[1]|x[2]) == 0;\n}\n\n//Provides: caml_int64_is_minus_one const\nfunction caml_int64_is_minus_one(x) {\n return x[3] == 0xffff && (x[1]&x[2]) == 0xffffff;\n}\n\n//Provides: caml_int64_and const\nfunction caml_int64_and (x, y) {\n return [255, x[1]&y[1], x[2]&y[2], x[3]&y[3]];\n}\n\n//Provides: caml_int64_or const\nfunction caml_int64_or (x, y) {\n return [255, x[1]|y[1], x[2]|y[2], x[3]|y[3]];\n}\n\n//Provides: caml_int64_xor const\nfunction caml_int64_xor (x, y) {\n return [255, x[1]^y[1], x[2]^y[2], x[3]^y[3]];\n}\n\n//Provides: caml_int64_shift_left const\nfunction caml_int64_shift_left (x, s) {\n s = s & 63;\n if (s == 0) return x;\n if (s < 24)\n return [255,\n (x[1] << s) & 0xffffff,\n ((x[2] << s) | (x[1] >> (24 - s))) & 0xffffff,\n ((x[3] << s) | (x[2] >> (24 - s))) & 0xffff];\n if (s < 48)\n return [255, 0,\n (x[1] << (s - 24)) & 0xffffff,\n ((x[2] << (s - 24)) | (x[1] >> (48 - s))) & 0xffff];\n return [255, 0, 0, (x[1] << (s - 48)) & 0xffff];\n}\n\n//Provides: caml_int64_shift_right_unsigned const\nfunction caml_int64_shift_right_unsigned (x, s) {\n s = s & 63;\n if (s == 0) return x;\n if (s < 24)\n return [255,\n ((x[1] >> s) | (x[2] << (24 - s))) & 0xffffff,\n ((x[2] >> s) | (x[3] << (24 - s))) & 0xffffff,\n (x[3] >> s)];\n if (s < 48)\n return [255,\n ((x[2] >> (s - 24)) | (x[3] << (48 - s))) & 0xffffff,\n (x[3] >> (s - 24)),\n 0];\n return [255, (x[3] >> (s - 48)), 0, 0];\n}\n\n//Provides: caml_int64_shift_right const\nfunction caml_int64_shift_right (x, s) {\n s = s & 63;\n if (s == 0) return x;\n var h = (x[3] << 16) >> 16;\n if (s < 24)\n return [255,\n ((x[1] >> s) | (x[2] << (24 - s))) & 0xffffff,\n ((x[2] >> s) | (h << (24 - s))) & 0xffffff,\n ((x[3] << 16) >> s) >>> 16];\n var sign = (x[3] << 16) >> 31;\n if (s < 48)\n return [255,\n ((x[2] >> (s - 24)) | (x[3] << (48 - s))) & 0xffffff,\n ((x[3] << 16) >> (s - 24) >> 16) & 0xffffff,\n sign & 0xffff];\n return [255,\n ((x[3] << 16) >> (s - 32)) & 0xffffff,\n sign & 0xffffff, sign & 0xffff];\n}\n\n//Provides: caml_int64_lsl1 const\nfunction caml_int64_lsl1 (x) {\n x[3] = (x[3] << 1) | (x[2] >> 23);\n x[2] = ((x[2] << 1) | (x[1] >> 23)) & 0xffffff;\n x[1] = (x[1] << 1) & 0xffffff;\n}\n\n//Provides: caml_int64_lsr1 const\nfunction caml_int64_lsr1 (x) {\n x[1] = ((x[1] >>> 1) | (x[2] << 23)) & 0xffffff;\n x[2] = ((x[2] >>> 1) | (x[3] << 23)) & 0xffffff;\n x[3] = x[3] >>> 1;\n}\n\n//Provides: caml_int64_udivmod const\n//Requires: caml_int64_ucompare, caml_int64_lsl1, caml_int64_lsr1\n//Requires: caml_int64_sub\n//Requires: caml_obj_dup\nfunction caml_int64_udivmod (x, y) {\n var offset = 0;\n var modulus = caml_obj_dup(x);\n var divisor = caml_obj_dup(y);\n var quotient = [255, 0, 0, 0];\n while (caml_int64_ucompare (modulus, divisor) > 0) {\n offset++;\n caml_int64_lsl1 (divisor);\n }\n while (offset >= 0) {\n offset --;\n caml_int64_lsl1 (quotient);\n if (caml_int64_ucompare (modulus, divisor) >= 0) {\n quotient[1] ++;\n modulus = caml_int64_sub (modulus, divisor);\n }\n caml_int64_lsr1 (divisor);\n }\n return [0,quotient, modulus];\n}\n\n//Provides: caml_int64_div const\n//Requires: caml_int64_is_zero, caml_raise_zero_divide\n//Requires: caml_int64_neg, caml_int64_udivmod\nfunction caml_int64_div (x, y)\n{\n if (caml_int64_is_zero (y)) caml_raise_zero_divide ();\n var sign = x[3] ^ y[3];\n if (x[3] & 0x8000) x = caml_int64_neg(x);\n if (y[3] & 0x8000) y = caml_int64_neg(y);\n var q = caml_int64_udivmod(x, y)[1];\n if (sign & 0x8000) q = caml_int64_neg(q);\n return q;\n}\n\n//Provides: caml_int64_mod const\n//Requires: caml_int64_is_zero, caml_raise_zero_divide\n//Requires: caml_int64_neg, caml_int64_udivmod\nfunction caml_int64_mod (x, y)\n{\n if (caml_int64_is_zero (y)) caml_raise_zero_divide ();\n var sign = x[3] ^ y[3];\n if (x[3] & 0x8000) x = caml_int64_neg(x);\n if (y[3] & 0x8000) y = caml_int64_neg(y);\n var r = caml_int64_udivmod(x, y)[2];\n if (sign & 0x8000) r = caml_int64_neg(r);\n return r;\n}\n\n//Provides: caml_int64_of_int32 const\nfunction caml_int64_of_int32 (x) {\n return [255, x & 0xffffff, (x >> 24) & 0xffffff, (x >> 31) & 0xffff]\n}\n\n//Provides: caml_int64_to_int32 const\nfunction caml_int64_to_int32 (x) {\n return x[1] | (x[2] << 24);\n}\n\n//Provides: caml_int64_to_float const\nfunction caml_int64_to_float (x) {\n return ((x[3] << 16) * Math.pow(2, 32) + x[2] * Math.pow(2, 24)) + x[1];\n}\n\n//Provides: caml_int64_of_float const\n//Requires: caml_int64_offset\nfunction caml_int64_of_float (x) {\n if (x < 0) x = Math.ceil(x);\n return [255,\n x & 0xffffff,\n Math.floor(x * caml_int64_offset) & 0xffffff,\n Math.floor(x * caml_int64_offset * caml_int64_offset) & 0xffff];\n}\n\n//Provides: caml_int64_format const\n//Requires: caml_parse_format, caml_finish_formatting\n//Requires: caml_int64_is_negative, caml_int64_neg\n//Requires: caml_int64_of_int32, caml_int64_udivmod, caml_int64_to_int32\n//Requires: caml_int64_is_zero, caml_str_repeat\nfunction caml_int64_format (fmt, x) {\n var f = caml_parse_format(fmt);\n if (f.signedconv && caml_int64_is_negative(x)) {\n f.sign = -1; x = caml_int64_neg(x);\n }\n var buffer = \"\";\n var wbase = caml_int64_of_int32(f.base);\n var cvtbl = \"0123456789abcdef\";\n do {\n var p = caml_int64_udivmod(x, wbase);\n x = p[1];\n buffer = cvtbl.charAt(caml_int64_to_int32(p[2])) + buffer;\n } while (! caml_int64_is_zero(x));\n if (f.prec >= 0) {\n f.filler = ' ';\n var n = f.prec - buffer.length;\n if (n > 0) buffer = caml_str_repeat (n, '0') + buffer;\n }\n return caml_finish_formatting(f, buffer);\n}\n\n//Provides: caml_int64_of_string\n//Requires: caml_parse_sign_and_base, caml_failwith, caml_parse_digit, MlString\n//Requires: caml_int64_of_int32, caml_int64_udivmod, caml_int64_ult\n//Requires: caml_int64_add, caml_int64_mul, caml_int64_neg\n//Requires: caml_ml_string_length,caml_string_unsafe_get\nfunction caml_int64_of_string(s) {\n var r = caml_parse_sign_and_base (s);\n var i = r[0], sign = r[1], base = r[2];\n var base64 = caml_int64_of_int32(base);\n var threshold =\n caml_int64_udivmod([255, 0xffffff, 0xfffffff, 0xffff], base64)[1];\n var c = caml_string_unsafe_get(s, i);\n var d = caml_parse_digit(c);\n if (d < 0 || d >= base) caml_failwith(\"int_of_string\");\n var res = caml_int64_of_int32(d);\n for (;;) {\n i++;\n c = caml_string_unsafe_get(s, i);\n if (c == 95) continue;\n d = caml_parse_digit(c);\n if (d < 0 || d >= base) break;\n /* Detect overflow in multiplication base * res */\n if (caml_int64_ult(threshold, res)) caml_failwith(\"int_of_string\");\n d = caml_int64_of_int32(d);\n res = caml_int64_add(caml_int64_mul(base64, res), d);\n /* Detect overflow in addition (base * res) + d */\n if (caml_int64_ult(res, d)) caml_failwith(\"int_of_string\");\n }\n if (i != caml_ml_string_length(s)) caml_failwith(\"int_of_string\");\n if (r[2] == 10 && caml_int64_ult([255, 0, 0, 0x8000], res))\n caml_failwith(\"int_of_string\");\n if (sign < 0) res = caml_int64_neg(res);\n return res;\n}\n\n//Provides: caml_int64_of_bytes\nfunction caml_int64_of_bytes(a) {\n return [255, a[7] | (a[6] << 8) | (a[5] << 16),\n a[4] | (a[3] << 8) | (a[2] << 16), a[1] | (a[0] << 8)];\n}\n//Provides: caml_int64_to_bytes\nfunction caml_int64_to_bytes(x) {\n return [x[3] >> 8, x[3] & 0xff, x[2] >> 16, (x[2] >> 8) & 0xff, x[2] & 0xff,\n x[1] >> 16, (x[1] >> 8) & 0xff, x[1] & 0xff];\n}\n", + "// Js_of_ocaml library\n// http://www.ocsigen.org/js_of_ocaml/\n// Copyright (C) 2010 Jérôme Vouillon\n// Laboratoire PPS - CNRS Université Paris Diderot\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation, with linking exception;\n// either version 2.1 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n\n///////////// Jslib: code specific to Js_of_ocaml\n\n//Provides: caml_js_from_bool const (const)\nfunction caml_js_from_bool(x) { return !!x; }\n//Provides: caml_js_to_bool const (const)\nfunction caml_js_to_bool(x) { return +x; }\n//Provides: caml_js_from_float const (const)\nfunction caml_js_from_float(x) { return x; }\n//Provides: caml_js_to_float const (const)\nfunction caml_js_to_float(x) { return x; }\n//Provides: caml_js_from_string mutable (const)\n//Requires: MlString\nfunction caml_js_from_string(s) { return s.toString(); }\n//Provides: caml_js_from_array mutable (shallow)\n//Requires: raw_array_sub\nfunction caml_js_from_array(a) { return raw_array_sub(a,1,a.length-1); }\n//Provides: caml_js_to_array mutable (shallow)\n//Requires: raw_array_cons\nfunction caml_js_to_array(a) { return raw_array_cons(a,0); }\n\n//Provides: caml_js_var mutable (const)\n//Requires: js_print_stderr\n//Requires: MlString\nfunction caml_js_var(x) {\n var x = x.toString();\n //Checks that x has the form ident[.ident]*\n if(!x.match(/^[a-zA-Z_$][a-zA-Z_$0-9]*(\\.[a-zA-Z_$][a-zA-Z_$0-9]*)*$/)){\n js_print_stderr(\"caml_js_var: \\\"\" + x + \"\\\" is not a valid JavaScript variable. continuing ..\");\n //joo_global_object.console.error(\"Js.Unsafe.eval_string\")\n }\n return eval(x);\n}\n//Provides: caml_js_call (const, mutable, shallow)\n//Requires: caml_js_from_array\nfunction caml_js_call(f, o, args) { return f.apply(o, caml_js_from_array(args)); }\n//Provides: caml_js_fun_call (const, shallow)\n//Requires: caml_js_from_array\nfunction caml_js_fun_call(f, args) { return f.apply(null, caml_js_from_array(args)); }\n//Provides: caml_js_meth_call (mutable, const, shallow)\n//Requires: MlString\n//Requires: caml_js_from_array\nfunction caml_js_meth_call(o, f, args) {\n return o[f.toString()].apply(o, caml_js_from_array(args));\n}\n//Provides: caml_js_new (const, shallow)\n//Requires: caml_js_from_array\nfunction caml_js_new(c, a) {\n switch (a.length) {\n case 1: return new c;\n case 2: return new c (a[1]);\n case 3: return new c (a[1],a[2]);\n case 4: return new c (a[1],a[2],a[3]);\n case 5: return new c (a[1],a[2],a[3],a[4]);\n case 6: return new c (a[1],a[2],a[3],a[4],a[5]);\n case 7: return new c (a[1],a[2],a[3],a[4],a[5],a[6]);\n case 8: return new c (a[1],a[2],a[3],a[4],a[5],a[6], a[7]);\n }\n function F() { return c.apply(this, caml_js_from_array(a)); }\n F.prototype = c.prototype;\n return new F;\n}\n//Provides: caml_js_wrap_callback const (const)\n//Requires: caml_call_gen,raw_array_copy\nfunction caml_js_wrap_callback(f) {\n return function () {\n if(arguments.length > 0){\n return caml_call_gen(f, raw_array_copy(arguments));\n } else {\n return caml_call_gen(f, [undefined]);\n }\n }\n}\n//Provides: caml_js_wrap_meth_callback const (const)\n//Requires: caml_call_gen,raw_array_cons\nfunction caml_js_wrap_meth_callback(f) {\n return function () {\n return caml_call_gen(f,raw_array_cons(arguments,this));\n }\n}\n//Provides: caml_js_wrap_meth_callback_unsafe const (const)\n//Requires: caml_call_gen,raw_array_cons\nfunction caml_js_wrap_meth_callback_unsafe(f) {\n return function () { f.apply(null, raw_array_cons(arguments,this)); }\n}\n//Provides: caml_js_equals mutable (const, const)\nfunction caml_js_equals (x, y) { return +(x == y); }\n//Provides: caml_js_to_byte_string const\n//Requires: caml_new_string\nfunction caml_js_to_byte_string (s) {return caml_new_string (s);}\n\n//Provides: caml_js_eval_string (const)\n//Requires: MlString\nfunction caml_js_eval_string (s) {return eval(s.toString());}\n\n//Provides: caml_js_expr (const)\n//Requires: js_print_stderr\n//Requires: MlString\nfunction caml_js_expr(s) {\n js_print_stderr(\"caml_js_expr: fallback to runtime evaluation\");\n return eval(s.toString());}\n\n//Provides: caml_pure_js_expr const (const)\n//Requires: js_print_stderr\n//Requires: MlString\nfunction caml_pure_js_expr (s){\n js_print_stderr(\"caml_pure_js_expr: fallback to runtime evaluation\");\n return eval(s.toString());}\n\n//Provides: caml_js_object (object_literal)\n//Requires: MlString\nfunction caml_js_object (a) {\n var o = {};\n for (var i = 1; i < a.length; i++) {\n var p = a[i];\n o[p[1].toString()] = p[2];\n }\n return o;\n}\n", + "// Js_of_ocaml library\n// http://www.ocsigen.org/js_of_ocaml/\n// Copyright (C) 2010 Jérôme Vouillon\n// Laboratoire PPS - CNRS Université Paris Diderot\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation, with linking exception;\n// either version 2.1 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n\n///////////// Jslib\n\n//Provides: caml_js_pure_expr const\nfunction caml_js_pure_expr (f) { return f(); }\n\n//Provides: caml_js_set (mutable, const, const)\nfunction caml_js_set(o,f,v) { o[f]=v;return 0}\n//Provides: caml_js_get mutable (const, const)\nfunction caml_js_get(o,f) { return o[f]; }\n//Provides: caml_js_delete (mutable, const)\nfunction caml_js_delete(o,f) { delete o[f]; return 0}\n\n//Provides: caml_js_instanceof (const, const)\nfunction caml_js_instanceof(o,c) { return o instanceof c; }\n\n//Provides: caml_js_typeof (const)\nfunction caml_js_typeof(o) { return typeof o; }\n\n//Provides: caml_js_on_ie const\nfunction caml_js_on_ie () {\n var ua =\n joo_global_object.navigator?joo_global_object.navigator.userAgent:\"\";\n return ua.indexOf(\"MSIE\") != -1 && ua.indexOf(\"Opera\") != 0;\n}\n\n//Provides: caml_js_html_escape const (const)\nvar caml_js_regexps = { amp:/&/g, lt:/10) joo_global_object.console.log(\"trampoline \", c, \"times\")\n return res;\n}\n\n//Provides:caml_trampoline_return\nfunction caml_trampoline_return(f,args) {\n return {joo_tramp:f,joo_args:args};\n}\n\n//Provides: js_print_stdout (const)\nfunction js_print_stdout(s) {\n // Do not output the last \\n if present\n // as console logging display a newline at the end\n if(s.charCodeAt(s.length - 1) == 10)\n s = s.substr(0,s.length - 1 );\n var v = joo_global_object.console;\n v && v.log && v.log(s);\n}\n//Provides: js_print_stderr (const)\nfunction js_print_stderr(s) {\n // Do not output the last \\n if present\n // as console logging display a newline at the end\n if(s.charCodeAt(s.length - 1) == 10)\n s = s.substr(0,s.length - 1 );\n var v = joo_global_object.console;\n v && v.error && v.error(s);\n}\n", + "/***********************************************************************/\n/* */\n/* Objective Caml */\n/* */\n/* Xavier Leroy, projet Cristal, INRIA Rocquencourt */\n/* */\n/* Copyright 1996 Institut National de Recherche en Informatique et */\n/* en Automatique. All rights reserved. This file is distributed */\n/* under the terms of the GNU Library General Public License, with */\n/* the special exception on linking described in file ../LICENSE. */\n/* */\n/***********************************************************************/\n\n/* $Id: lexing.c 6045 2004-01-01 16:42:43Z doligez $ */\n\n/* The table-driven automaton for lexers generated by camllex. */\n\n//Provides: caml_lex_array\n//Requires: caml_bytes_of_string\nfunction caml_lex_array(s) {\n s = caml_bytes_of_string(s);\n var l = s.length / 2;\n var a = new Array(l);\n for (var i = 0; i < l; i++)\n a[i] = (s.charCodeAt(2 * i) | (s.charCodeAt(2 * i + 1) << 8)) << 16 >> 16;\n return a;\n}\n\n//Provides: caml_lex_engine\n//Requires: caml_failwith, caml_lex_array, caml_array_of_string\nfunction caml_lex_engine(tbl, start_state, lexbuf) {\n var lex_buffer = 2;\n var lex_buffer_len = 3;\n var lex_start_pos = 5;\n var lex_curr_pos = 6;\n var lex_last_pos = 7;\n var lex_last_action = 8;\n var lex_eof_reached = 9;\n var lex_base = 1;\n var lex_backtrk = 2;\n var lex_default = 3;\n var lex_trans = 4;\n var lex_check = 5;\n\n if (!tbl.lex_default) {\n tbl.lex_base = caml_lex_array (tbl[lex_base]);\n tbl.lex_backtrk = caml_lex_array (tbl[lex_backtrk]);\n tbl.lex_check = caml_lex_array (tbl[lex_check]);\n tbl.lex_trans = caml_lex_array (tbl[lex_trans]);\n tbl.lex_default = caml_lex_array (tbl[lex_default]);\n }\n\n var c, state = start_state;\n\n var buffer = caml_array_of_string(lexbuf[lex_buffer]);\n\n if (state >= 0) {\n /* First entry */\n lexbuf[lex_last_pos] = lexbuf[lex_start_pos] = lexbuf[lex_curr_pos];\n lexbuf[lex_last_action] = -1;\n } else {\n /* Reentry after refill */\n state = -state - 1;\n }\n for(;;) {\n /* Lookup base address or action number for current state */\n var base = tbl.lex_base[state];\n if (base < 0) return -base-1;\n /* See if it's a backtrack point */\n var backtrk = tbl.lex_backtrk[state];\n if (backtrk >= 0) {\n lexbuf[lex_last_pos] = lexbuf[lex_curr_pos];\n lexbuf[lex_last_action] = backtrk;\n }\n /* See if we need a refill */\n if (lexbuf[lex_curr_pos] >= lexbuf[lex_buffer_len]){\n if (lexbuf[lex_eof_reached] == 0)\n return -state - 1;\n else\n c = 256;\n }else{\n /* Read next input char */\n c = buffer[lexbuf[lex_curr_pos]];\n lexbuf[lex_curr_pos] ++;\n }\n /* Determine next state */\n if (tbl.lex_check[base + c] == state)\n state = tbl.lex_trans[base + c];\n else\n state = tbl.lex_default[state];\n /* If no transition on this char, return to last backtrack point */\n if (state < 0) {\n lexbuf[lex_curr_pos] = lexbuf[lex_last_pos];\n if (lexbuf[lex_last_action] == -1)\n caml_failwith(\"lexing: empty token\");\n else\n return lexbuf[lex_last_action];\n }else{\n /* Erase the EOF condition only if the EOF pseudo-character was\n consumed by the automaton (i.e. there was no backtrack above)\n */\n if (c == 256) lexbuf[lex_eof_reached] = 0;\n }\n }\n}\n\n/***********************************************/\n/* New lexer engine, with memory of positions */\n/***********************************************/\n\n//Provides: caml_new_lex_engine\n//Requires: caml_failwith, caml_lex_array\n//Requires: caml_bytes_of_string, caml_array_of_string\nfunction caml_lex_run_mem(s, i, mem, curr_pos) {\n for (;;) {\n var dst = s.charCodeAt(i); i++;\n if (dst == 0xff) return;\n var src = s.charCodeAt(i); i++;\n if (src == 0xff)\n mem [dst + 1] = curr_pos;\n else\n mem [dst + 1] = mem [src + 1];\n }\n}\n\nfunction caml_lex_run_tag(s, i, mem) {\n for (;;) {\n var dst = s.charCodeAt(i); i++;\n if (dst == 0xff) return ;\n var src = s.charCodeAt(i); i++;\n if (src == 0xff)\n mem [dst + 1] = -1;\n else\n mem [dst + 1] = mem [src + 1];\n }\n}\n\nfunction caml_new_lex_engine(tbl, start_state, lexbuf) {\n var lex_buffer = 2;\n var lex_buffer_len = 3;\n var lex_start_pos = 5;\n var lex_curr_pos = 6;\n var lex_last_pos = 7;\n var lex_last_action = 8;\n var lex_eof_reached = 9;\n var lex_mem = 10;\n var lex_base = 1;\n var lex_backtrk = 2;\n var lex_default = 3;\n var lex_trans = 4;\n var lex_check = 5;\n var lex_base_code = 6;\n var lex_backtrk_code = 7;\n var lex_default_code = 8;\n var lex_trans_code = 9;\n var lex_check_code = 10;\n var lex_code = 11;\n\n if (!tbl.lex_default) {\n tbl.lex_base = caml_lex_array (tbl[lex_base]);\n tbl.lex_backtrk = caml_lex_array (tbl[lex_backtrk]);\n tbl.lex_check = caml_lex_array (tbl[lex_check]);\n tbl.lex_trans = caml_lex_array (tbl[lex_trans]);\n tbl.lex_default = caml_lex_array (tbl[lex_default]);\n }\n if (!tbl.lex_default_code) {\n tbl.lex_base_code = caml_lex_array (tbl[lex_base_code]);\n tbl.lex_backtrk_code = caml_lex_array (tbl[lex_backtrk_code]);\n tbl.lex_check_code = caml_lex_array (tbl[lex_check_code]);\n tbl.lex_trans_code = caml_lex_array (tbl[lex_trans_code]);\n tbl.lex_default_code = caml_lex_array (tbl[lex_default_code]);\n }\n if (tbl.lex_code == null) tbl.lex_code = caml_bytes_of_string(tbl[lex_code]);\n\n var c, state = start_state;\n\n var buffer = caml_array_of_string(lexbuf[lex_buffer]);\n\n if (state >= 0) {\n /* First entry */\n lexbuf[lex_last_pos] = lexbuf[lex_start_pos] = lexbuf[lex_curr_pos];\n lexbuf[lex_last_action] = -1;\n } else {\n /* Reentry after refill */\n state = -state - 1;\n }\n for(;;) {\n /* Lookup base address or action number for current state */\n var base = tbl.lex_base[state];\n if (base < 0) {\n var pc_off = tbl.lex_base_code[state];\n caml_lex_run_tag(tbl.lex_code, pc_off, lexbuf[lex_mem]);\n return -base-1;\n }\n /* See if it's a backtrack point */\n var backtrk = tbl.lex_backtrk[state];\n if (backtrk >= 0) {\n var pc_off = tbl.lex_backtrk_code[state];\n caml_lex_run_tag(tbl.lex_code, pc_off, lexbuf[lex_mem]);\n lexbuf[lex_last_pos] = lexbuf[lex_curr_pos];\n lexbuf[lex_last_action] = backtrk;\n }\n /* See if we need a refill */\n if (lexbuf[lex_curr_pos] >= lexbuf[lex_buffer_len]){\n if (lexbuf[lex_eof_reached] == 0)\n return -state - 1;\n else\n c = 256;\n }else{\n /* Read next input char */\n c = buffer[lexbuf[lex_curr_pos]];\n lexbuf[lex_curr_pos] ++;\n }\n /* Determine next state */\n var pstate = state ;\n if (tbl.lex_check[base + c] == state)\n state = tbl.lex_trans[base + c];\n else\n state = tbl.lex_default[state];\n /* If no transition on this char, return to last backtrack point */\n if (state < 0) {\n lexbuf[lex_curr_pos] = lexbuf[lex_last_pos];\n if (lexbuf[lex_last_action] == -1)\n caml_failwith(\"lexing: empty token\");\n else\n return lexbuf[lex_last_action];\n }else{\n /* If some transition, get and perform memory moves */\n var base_code = tbl.lex_base_code[pstate], pc_off;\n if (tbl.lex_check_code[base_code + c] == pstate)\n pc_off = tbl.lex_trans_code[base_code + c];\n else\n pc_off = tbl.lex_default_code[pstate];\n if (pc_off > 0)\n caml_lex_run_mem\n (tbl.lex_code, pc_off, lexbuf[lex_mem], lexbuf[lex_curr_pos]);\n /* Erase the EOF condition only if the EOF pseudo-character was\n consumed by the automaton (i.e. there was no backtrack above)\n */\n if (c == 256) lexbuf[lex_eof_reached] = 0;\n }\n }\n}\n\n", + "// Js_of_ocaml runtime support\n// http://www.ocsigen.org/js_of_ocaml/\n// Copyright (C) 2010 Jérôme Vouillon\n// Laboratoire PPS - CNRS Université Paris Diderot\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation, with linking exception;\n// either version 2.1 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n\n\n//Provides: caml_md5_chan\n//Requires: caml_md5_string, caml_string_of_array,caml_ml_string_length\nfunction caml_md5_chan(chan,len){\n if(len<0){\n len=caml_ml_string_length(chan.file.data) - chan.offset;\n }\n return caml_md5_string(chan.file.data,chan.offset,len);\n}\n\n//Provides: caml_md5_string\n//Requires: caml_string_of_array, caml_convert_string_to_bytes\nvar caml_md5_string =\nfunction () {\n function add (x, y) { return (x + y) | 0; }\n function xx(q,a,b,x,s,t) {\n a = add(add(a, q), add(x, t));\n return add((a << s) | (a >>> (32 - s)), b);\n }\n function ff(a,b,c,d,x,s,t) {\n return xx((b & c) | ((~b) & d), a, b, x, s, t);\n }\n function gg(a,b,c,d,x,s,t) {\n return xx((b & d) | (c & (~d)), a, b, x, s, t);\n }\n function hh(a,b,c,d,x,s,t) { return xx(b ^ c ^ d, a, b, x, s, t); }\n function ii(a,b,c,d,x,s,t) { return xx(c ^ (b | (~d)), a, b, x, s, t); }\n\n function md5(buffer, length) {\n var i = length;\n buffer[i >> 2] |= 0x80 << (8 * (i & 3));\n for (i = (i & ~0x3) + 8;(i & 0x3F) < 60 ;i += 4)\n buffer[(i >> 2) - 1] = 0;\n buffer[(i >> 2) -1] = length << 3;\n buffer[i >> 2] = (length >> 29) & 0x1FFFFFFF;\n\n var w = [0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476];\n\n for(i = 0; i < buffer.length; i += 16) {\n var a = w[0], b = w[1], c = w[2], d = w[3];\n\n a = ff(a, b, c, d, buffer[i+ 0], 7, 0xD76AA478);\n d = ff(d, a, b, c, buffer[i+ 1], 12, 0xE8C7B756);\n c = ff(c, d, a, b, buffer[i+ 2], 17, 0x242070DB);\n b = ff(b, c, d, a, buffer[i+ 3], 22, 0xC1BDCEEE);\n a = ff(a, b, c, d, buffer[i+ 4], 7, 0xF57C0FAF);\n d = ff(d, a, b, c, buffer[i+ 5], 12, 0x4787C62A);\n c = ff(c, d, a, b, buffer[i+ 6], 17, 0xA8304613);\n b = ff(b, c, d, a, buffer[i+ 7], 22, 0xFD469501);\n a = ff(a, b, c, d, buffer[i+ 8], 7, 0x698098D8);\n d = ff(d, a, b, c, buffer[i+ 9], 12, 0x8B44F7AF);\n c = ff(c, d, a, b, buffer[i+10], 17, 0xFFFF5BB1);\n b = ff(b, c, d, a, buffer[i+11], 22, 0x895CD7BE);\n a = ff(a, b, c, d, buffer[i+12], 7, 0x6B901122);\n d = ff(d, a, b, c, buffer[i+13], 12, 0xFD987193);\n c = ff(c, d, a, b, buffer[i+14], 17, 0xA679438E);\n b = ff(b, c, d, a, buffer[i+15], 22, 0x49B40821);\n\n a = gg(a, b, c, d, buffer[i+ 1], 5, 0xF61E2562);\n d = gg(d, a, b, c, buffer[i+ 6], 9, 0xC040B340);\n c = gg(c, d, a, b, buffer[i+11], 14, 0x265E5A51);\n b = gg(b, c, d, a, buffer[i+ 0], 20, 0xE9B6C7AA);\n a = gg(a, b, c, d, buffer[i+ 5], 5, 0xD62F105D);\n d = gg(d, a, b, c, buffer[i+10], 9, 0x02441453);\n c = gg(c, d, a, b, buffer[i+15], 14, 0xD8A1E681);\n b = gg(b, c, d, a, buffer[i+ 4], 20, 0xE7D3FBC8);\n a = gg(a, b, c, d, buffer[i+ 9], 5, 0x21E1CDE6);\n d = gg(d, a, b, c, buffer[i+14], 9, 0xC33707D6);\n c = gg(c, d, a, b, buffer[i+ 3], 14, 0xF4D50D87);\n b = gg(b, c, d, a, buffer[i+ 8], 20, 0x455A14ED);\n a = gg(a, b, c, d, buffer[i+13], 5, 0xA9E3E905);\n d = gg(d, a, b, c, buffer[i+ 2], 9, 0xFCEFA3F8);\n c = gg(c, d, a, b, buffer[i+ 7], 14, 0x676F02D9);\n b = gg(b, c, d, a, buffer[i+12], 20, 0x8D2A4C8A);\n\n a = hh(a, b, c, d, buffer[i+ 5], 4, 0xFFFA3942);\n d = hh(d, a, b, c, buffer[i+ 8], 11, 0x8771F681);\n c = hh(c, d, a, b, buffer[i+11], 16, 0x6D9D6122);\n b = hh(b, c, d, a, buffer[i+14], 23, 0xFDE5380C);\n a = hh(a, b, c, d, buffer[i+ 1], 4, 0xA4BEEA44);\n d = hh(d, a, b, c, buffer[i+ 4], 11, 0x4BDECFA9);\n c = hh(c, d, a, b, buffer[i+ 7], 16, 0xF6BB4B60);\n b = hh(b, c, d, a, buffer[i+10], 23, 0xBEBFBC70);\n a = hh(a, b, c, d, buffer[i+13], 4, 0x289B7EC6);\n d = hh(d, a, b, c, buffer[i+ 0], 11, 0xEAA127FA);\n c = hh(c, d, a, b, buffer[i+ 3], 16, 0xD4EF3085);\n b = hh(b, c, d, a, buffer[i+ 6], 23, 0x04881D05);\n a = hh(a, b, c, d, buffer[i+ 9], 4, 0xD9D4D039);\n d = hh(d, a, b, c, buffer[i+12], 11, 0xE6DB99E5);\n c = hh(c, d, a, b, buffer[i+15], 16, 0x1FA27CF8);\n b = hh(b, c, d, a, buffer[i+ 2], 23, 0xC4AC5665);\n\n a = ii(a, b, c, d, buffer[i+ 0], 6, 0xF4292244);\n d = ii(d, a, b, c, buffer[i+ 7], 10, 0x432AFF97);\n c = ii(c, d, a, b, buffer[i+14], 15, 0xAB9423A7);\n b = ii(b, c, d, a, buffer[i+ 5], 21, 0xFC93A039);\n a = ii(a, b, c, d, buffer[i+12], 6, 0x655B59C3);\n d = ii(d, a, b, c, buffer[i+ 3], 10, 0x8F0CCC92);\n c = ii(c, d, a, b, buffer[i+10], 15, 0xFFEFF47D);\n b = ii(b, c, d, a, buffer[i+ 1], 21, 0x85845DD1);\n a = ii(a, b, c, d, buffer[i+ 8], 6, 0x6FA87E4F);\n d = ii(d, a, b, c, buffer[i+15], 10, 0xFE2CE6E0);\n c = ii(c, d, a, b, buffer[i+ 6], 15, 0xA3014314);\n b = ii(b, c, d, a, buffer[i+13], 21, 0x4E0811A1);\n a = ii(a, b, c, d, buffer[i+ 4], 6, 0xF7537E82);\n d = ii(d, a, b, c, buffer[i+11], 10, 0xBD3AF235);\n c = ii(c, d, a, b, buffer[i+ 2], 15, 0x2AD7D2BB);\n b = ii(b, c, d, a, buffer[i+ 9], 21, 0xEB86D391);\n\n w[0] = add(a, w[0]);\n w[1] = add(b, w[1]);\n w[2] = add(c, w[2]);\n w[3] = add(d, w[3]);\n }\n\n var t = new Array(16);\n for (var i = 0; i < 4; i++)\n for (var j = 0; j < 4; j++)\n t[i * 4 + j] = (w[i] >> (8 * j)) & 0xFF;\n return t;\n }\n\n return function (s, ofs, len) {\n // FIX: maybe we should perform the computation by chunk of 64 bytes\n // as in http://www.myersdaily.org/joseph/javascript/md5.js\n var buf = [];\n switch (s.t & 6) {\n default:\n caml_convert_string_to_bytes(s);\n case 0: /* BYTES */\n var b = s.c;\n for (var i = 0; i < len; i+=4) {\n var j = i + ofs;\n buf[i>>2] =\n b.charCodeAt(j) | (b.charCodeAt(j+1) << 8) |\n (b.charCodeAt(j+2) << 16) | (b.charCodeAt(j+3) << 24);\n }\n for (; i < len; i++) buf[i>>2] |= b.charCodeAt(i + ofs) << (8 * (i & 3));\n break;\n case 4: /* ARRAY */\n var a = s.c;\n for (var i = 0; i < len; i+=4) {\n var j = i + ofs;\n buf[i>>2] = a[j] | (a[j+1] << 8) | (a[j+2] << 16) | (a[j+3] << 24);\n }\n for (; i < len; i++) buf[i>>2] |= a[i + ofs] << (8 * (i & 3));\n }\n return caml_string_of_array(md5(buf, len));\n }\n} ();\n", + "// Js_of_ocaml runtime support\n// http://www.ocsigen.org/js_of_ocaml/\n// Copyright (C) 2014 Jérôme Vouillon, Hugo Heuzard\n// Laboratoire PPS - CNRS Université Paris Diderot\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation, with linking exception;\n// either version 2.1 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n\n///////////// Io\n\n//Provides: caml_sys_close\n//Requires: caml_global_data\nfunction caml_sys_close(fd) {\n delete caml_global_data.fds[fd];\n return 0;\n}\n\n//Provides: caml_sys_open\n//Requires: MlString, caml_raise_sys_error, caml_global_data,caml_sys_file_exists\n//Requires: caml_fs_register,caml_make_path,caml_fs_content\n//Requires: caml_raise_no_such_file,caml_sys_is_directory\n//Requires: caml_create_string,MlFile,caml_ml_string_length\nfunction caml_sys_open_internal(idx,file,flags) {\n if(caml_global_data.fds === undefined) caml_global_data.fds = new Array();\n flags=flags?flags:{};\n var info = {};\n info.file = file;\n info.offset = flags.append?caml_ml_string_length(file.data):0;\n info.flags = flags;\n caml_global_data.fds[idx] = info;\n caml_global_data.fd_last_idx = idx;\n return idx;\n}\nfunction caml_sys_open (name, flags, _perms) {\n var f = {};\n while(flags){\n switch(flags[1]){\n case 0: f.rdonly = 1;break;\n case 1: f.wronly = 1;break;\n case 2: f.append = 1;break;\n case 3: f.create = 1;break;\n case 4: f.truncate = 1;break;\n case 5: f.excl = 1; break;\n case 6: f.binary = 1;break;\n case 7: f.text = 1;break;\n case 8: f.nonblock = 1;break;\n }\n flags=flags[2];\n }\n var name2 = name.toString();\n var path = caml_make_path(name);\n if(f.rdonly && f.wronly)\n caml_raise_sys_error(name2 + \" : flags Open_rdonly and Open_wronly are not compatible\");\n if(f.text && f.binary)\n caml_raise_sys_error(name2 + \" : flags Open_text and Open_binary are not compatible\");\n if (caml_sys_file_exists(name)) {\n if (caml_sys_is_directory(name)) caml_raise_sys_error(name2 + \" : is a directory\");\n if (f.create && f.excl) caml_raise_sys_error(name2 + \" : file already exists\");\n var idx = caml_global_data.fd_last_idx?caml_global_data.fd_last_idx:0;\n var file = caml_fs_content(path);\n if(f.truncate) file.truncate();\n return caml_sys_open_internal (idx+1,file,f);\n } else if (f.create) {\n var idx = caml_global_data.fd_last_idx?caml_global_data.fd_last_idx:0;\n caml_fs_register(name,caml_create_string(0));\n var file = caml_fs_content(path);\n return caml_sys_open_internal (idx+1,file,f);\n }\n else caml_raise_no_such_file (name);\n}\ncaml_sys_open_internal(0,new MlFile(caml_create_string(0))); //stdin\ncaml_sys_open_internal(1,new MlFile(caml_create_string(0))); //stdout\ncaml_sys_open_internal(2,new MlFile(caml_create_string(0))); //stderr\n\n\n// ocaml Channels\n\n//Provides: caml_ml_set_channel_name\nfunction caml_ml_set_channel_name() {\n return 0\n}\n\n//Provides: caml_ml_out_channels\nvar caml_ml_out_channels = new Array();\n\n//Provides: caml_ml_out_channels_list\n//Requires: caml_ml_out_channels\nfunction caml_ml_out_channels_list () {\n var l = 0;\n for(var c in caml_ml_out_channels){\n if(caml_ml_out_channels[c].opened)\n l=[0,caml_ml_out_channels[c],l];\n }\n return l;\n}\n\n\n//Provides: caml_ml_open_descriptor_out\n//Requires: js_print_stderr, js_print_stdout, caml_ml_out_channels, caml_global_data,caml_sys_open\n//Requires: caml_raise_sys_error,caml_new_string\n//Requires: caml_create_string, caml_blit_string,caml_ml_string_length\nfunction caml_std_output(chan,s){\n var str = caml_new_string(s);\n var slen = caml_ml_string_length(str);\n var clen = caml_ml_string_length(chan.file.data);\n var offset = chan.offset;\n if(offset + slen >= clen) {\n var new_str = caml_create_string (offset + slen);\n caml_blit_string(chan.file.data, 0, new_str, 0, clen);\n caml_blit_string(str, 0, new_str, offset, slen);\n chan.file.data = new_str;\n }\n chan.offset += slen;\n chan.file.modified();\n return 0;\n}\n\nfunction caml_ml_open_descriptor_out (fd) {\n var output;\n switch(fd){\n case 1: output=js_print_stdout;break;\n case 2: output=js_print_stderr;break;\n default: output=caml_std_output;\n }\n var data = caml_global_data.fds[fd];\n if(data.flags.rdonly) caml_raise_sys_error(\"fd \"+ fd + \" is readonly\");\n var channel = {\n file:data.file,\n offset:data.offset,\n fd:fd,\n opened:true,\n\n buffer:\"\",\n output : output\n };\n caml_ml_out_channels[channel.fd]=channel;\n return channel;\n}\n\n//Provides: caml_ml_open_descriptor_in\n//Requires: caml_global_data,caml_sys_open,caml_raise_sys_error\nfunction caml_ml_open_descriptor_in (fd) {\n var data = caml_global_data.fds[fd];\n if(data.flags.wronly) caml_raise_sys_error(\"fd \"+ fd + \" is writeonly\");\n\n return {\n file:data.file,\n offset:data.offset,\n fd:fd,\n opened:true,\n refill:null\n };\n}\n\n\n//Provides: caml_ml_set_binary_mode\n//Requires: caml_global_data\nfunction caml_ml_set_binary_mode(chan,mode){\n var data = caml_global_data.fds[chan.fd];\n data.flags.text = !mode\n data.flags.binary = mode\n return 0;\n}\n\n//Input from in_channel\n\n//Provides: caml_ml_close_channel\n//Requires: caml_ml_flush, caml_ml_out_channels\n//Requires: caml_sys_close\nfunction caml_ml_close_channel (channel) {\n caml_ml_flush(channel);\n channel.opened = false;\n delete caml_ml_out_channels[channel.fd];\n caml_sys_close(channel.fd)\n return 0;\n}\n\n//Provides: caml_ml_channel_size\n//Requires: caml_ml_string_length\nfunction caml_ml_channel_size(chan) {\n return caml_ml_string_length(chan.file.data);\n}\n\n//Provides: caml_ml_channel_size_64\n//Requires: caml_ml_channel_size,caml_int64_of_float,caml_ml_string_length\nfunction caml_ml_channel_size_64(chan) {\n return caml_int64_of_float(caml_ml_string_length(chan.file.data));\n}\n\n//Provides: caml_ml_set_channel_output\nfunction caml_ml_set_channel_output(chan,f) {\n chan.output = f;\n return 0;\n}\n\n//Provides: caml_ml_set_channel_refill\nfunction caml_ml_set_channel_refill(chan,f) {\n chan.refill = f;\n return 0;\n}\n\n//Provides: caml_ml_refill_input\n//Requires: caml_ml_string_length, caml_create_string, caml_blit_string\nfunction caml_ml_refill_input (chan) {\n var str = chan.refill();\n var str_len = caml_ml_string_length(str);\n if (str_len == 0) chan.refill = null;\n var old_len = caml_ml_string_length(chan.file.data) - chan.offset;\n if (old_len == 0) {\n chan.file.data = str;\n } else {\n var new_data = caml_create_string(old_len + str_len);\n caml_blit_string(chan.file.data, chan.offset, new_data, 0, old_len);\n caml_blit_string(str, 0, new_data, old_len, str_len);\n chan.file.data = new_data;\n }\n chan.offset = 0;\n return str_len;\n}\n\n//Provides: caml_ml_may_refill_input\n//Requires: caml_ml_string_length, caml_ml_refill_input\nfunction caml_ml_may_refill_input (chan) {\n if (chan.refill == null) return;\n if (caml_ml_string_length(chan.file.data) != chan.offset) return;\n caml_ml_refill_input (chan);\n}\n\n//Provides: caml_ml_input\n//Requires: caml_blit_string, caml_string_of_array, caml_ml_string_length\n//Requires: caml_ml_refill_input\nfunction caml_ml_input (chan, s, i, l) {\n var l2 = caml_ml_string_length(chan.file.data) - chan.offset;\n if (l2 == 0 && chan.refill != null) l2 = caml_ml_refill_input(chan);\n if (l2 < l) l = l2;\n caml_blit_string(chan.file.data, chan.offset, s, i, l);\n chan.offset += l;\n return l;\n}\n\n//Provides: caml_fs_file_content\n//Requires: caml_string_of_array, caml_fs_content, caml_make_path, MlFile\n//Requires: caml_raise_not_found, unix_time\nfunction caml_fs_file_content(name) {\n var path = caml_make_path(name);\n var f = caml_fs_content(path);\n if(f instanceof MlFile){\n var now = unix_time();\n f.atime = now;\n return f.data;\n }\n caml_raise_not_found();\n}\n\n//Provides: caml_input_value\n//Requires: caml_marshal_data_size, caml_input_value_from_string, caml_string_of_array\nfunction caml_input_value (chan) {\n var str = chan.file.data;\n var offset = [chan.offset];\n var _len = caml_marshal_data_size (str, offset[0]);\n var res = caml_input_value_from_string(str, offset);\n chan.offset = offset[0];\n return res;\n}\n\n//Provides: caml_ml_input_char\n//Requires: caml_raise_end_of_file, caml_array_bound_error\n//Requires: caml_ml_string_length, caml_string_get, caml_ml_may_refill_input\nfunction caml_ml_input_char (chan) {\n caml_ml_may_refill_input(chan);\n if (chan.offset >= caml_ml_string_length(chan.file.data))\n caml_raise_end_of_file();\n var c = caml_string_get(chan.file.data, chan.offset);\n chan.offset++;\n return c;\n}\n\n//Provides: caml_ml_input_int\n//Requires: caml_raise_end_of_file\n//Requires: caml_ml_string_length, caml_string_unsafe_get, caml_ml_refill_input\nfunction caml_ml_input_int (chan) {\n var s = chan.file.data, o = chan.offset;\n while ((o + 3) >= caml_ml_string_length(s)) {\n var l = caml_ml_refill_input(chan);\n if (l == 0) caml_raise_end_of_file();\n s = chan.file.data;\n o = chan.offset;\n }\n var r = (caml_string_unsafe_get(s,o) << 24) | (caml_string_unsafe_get(s,o+1) << 16) | (caml_string_unsafe_get(s,o+2) << 8) | (caml_string_unsafe_get(s,o+3));\n chan.offset+=4;\n return r;\n}\n\n//Provides: caml_ml_seek_in\n//Requires: caml_raise_sys_error\nfunction caml_ml_seek_in(chan,pos){\n if (chan.refill != null) caml_raise_sys_error(\"Illegal seek\");\n chan.offset = pos;\n return 0;\n}\n\n//Provides: caml_ml_seek_in_64\n//Requires: caml_int64_to_float, caml_raise_sys_error\nfunction caml_ml_seek_in_64(chan,pos){\n if (chan.refill != null) caml_raise_sys_error(\"Illegal seek\");\n chan.offset = caml_int64_to_float(pos);\n return 0;\n}\n\n//Provides: caml_ml_pos_in\nfunction caml_ml_pos_in(chan) {return chan.offset}\n\n//Provides: caml_ml_pos_in_64\n//Requires: caml_int64_of_float\nfunction caml_ml_pos_in_64(chan) {return caml_int64_of_float(chan.offset)}\n\n//Provides: caml_ml_input_scan_line\n//Requires: caml_array_bound_error, caml_ml_string_length, caml_string_get\n//Requires: caml_ml_may_refill_input\nfunction caml_ml_input_scan_line(chan){\n caml_ml_may_refill_input(chan);\n var p = chan.offset;\n var s = chan.file.data;\n var len = caml_ml_string_length(s);\n if(p >= len) { return 0;}\n while(true) {\n if(p >= len) return - (p - chan.offset);\n if(caml_string_get(s, p) == 10) return p - chan.offset + 1;\n p++;\n }\n}\n\n//Provides: caml_ml_flush\n//Requires: caml_raise_sys_error\nfunction caml_ml_flush (oc) {\n if(! oc.opened) caml_raise_sys_error(\"Cannot flush a closed channel\");\n if(oc.buffer == \"\") return 0;\n if(oc.output) {\n switch(oc.output.length){\n case 2: oc.output(oc,oc.buffer);break;\n default: oc.output(oc.buffer)\n };\n }\n oc.buffer = \"\";\n return 0;\n}\n\n//output to out_channel\n\n//Provides: caml_ml_output\n//Requires: caml_ml_flush,caml_ml_string_length\n//Requires: caml_create_string, caml_blit_string, caml_raise_sys_error\nfunction caml_ml_output (oc,buffer,offset,len) {\n if(! oc.opened) caml_raise_sys_error(\"Cannot output to a closed channel\");\n var string;\n if(offset == 0 && caml_ml_string_length(buffer) == len)\n string = buffer;\n else {\n string = caml_create_string(len);\n caml_blit_string(buffer,offset,string,0,len);\n }\n var jsstring = string.toString();\n var id = jsstring.lastIndexOf(\"\\n\");\n if(id < 0)\n oc.buffer+=jsstring;\n else {\n oc.buffer+=jsstring.substr(0,id+1);\n caml_ml_flush (oc);\n oc.buffer += jsstring.substr(id+1);\n }\n return 0;\n}\n//Provides: caml_ml_output_char\n//Requires: caml_ml_output\n//Requires: caml_new_string\nfunction caml_ml_output_char (oc,c) {\n var s = caml_new_string(String.fromCharCode(c));\n caml_ml_output(oc,s,0,1);\n return 0;\n}\n\n//Provides: caml_output_value\n//Requires: caml_output_value_to_string, caml_ml_output,caml_ml_string_length\nfunction caml_output_value (chan,v,_flags) {\n var s = caml_output_value_to_string(v);\n caml_ml_output(chan,s,0,caml_ml_string_length(s));\n return 0;\n}\n\n\n//Provides: caml_ml_seek_out\nfunction caml_ml_seek_out(chan,pos){\n chan.offset = pos;\n return 0;\n}\n\n//Provides: caml_ml_seek_out_64\n//Requires: caml_int64_to_float\nfunction caml_ml_seek_out_64(chan,pos){\n chan.offset = caml_int64_to_float(pos);\n return 0;\n}\n\n//Provides: caml_ml_pos_out\nfunction caml_ml_pos_out(chan) {return chan.offset}\n\n//Provides: caml_ml_pos_out_64\n//Requires: caml_int64_of_float\nfunction caml_ml_pos_out_64(chan) {\n return caml_int64_of_float (chan.offset);\n}\n\n//Provides: caml_ml_output_int\n//Requires: caml_ml_output\n//Requires: caml_string_of_array\nfunction caml_ml_output_int (oc,i) {\n var arr = [(i>>24) & 0xFF,(i>>16) & 0xFF,(i>>8) & 0xFF,i & 0xFF ];\n var s = caml_string_of_array(arr);\n caml_ml_output(oc,s,0,4);\n return 0\n}\n", + "// Js_of_ocaml runtime support\n// http://www.ocsigen.org/js_of_ocaml/\n// Copyright (C) 2014 Jérôme Vouillon, Hugo Heuzard\n// Laboratoire PPS - CNRS Université Paris Diderot\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU Lesser General Public License as published by\n// the Free Software Foundation, with linking exception;\n// either version 2.1 of the License, or (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU Lesser General Public License for more details.\n//\n// You should have received a copy of the GNU Lesser General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n\n///////////// Dummy filesystem\n\n//Provides: caml_current_dir\nvar caml_current_dir = \"/\";\n//Provides: file_inode\nvar file_inode = 0\n\n//Provides: MlDir\n//Requires: file_inode, unix_time\nfunction MlDir(){ this.content={};\n this.inode = file_inode++;\n var now = unix_time();\n this.atime = now;\n this.mtime = now;\n this.ctime = now;\n }\nMlDir.prototype = {\n exists:function(name){return this.content[name]?1:0;},\n mk:function(name,c){this.content[name]=c},\n get:function(name){return this.content[name]},\n list:function(){\n var a = [];\n for(var n in this.content)\n a.push(n);\n return a;\n },\n remove:function(name){delete this.content[name];}\n}\n\n//Provides: MlFile\n//Requires: caml_create_string, file_inode, unix_time\nfunction MlFile(content){ this.data = content;\n this.inode = file_inode++;\n var now = unix_time();\n this.atime = now;\n this.mtime = now;\n this.ctime = now;\n}\nMlFile.prototype = {\n truncate:function(){\n this.data = caml_create_string(0);\n this.modified();\n },\n modified:function() {\n var now = unix_time();\n this.atime = now;\n this.mtime = now;\n }\n}\n\n//Provides: caml_root_dir\n//Requires: MlDir\nvar caml_root_dir = new MlDir();\ncaml_root_dir.mk(\"\",new MlDir());\n\n//Provides: caml_sys_getcwd\n//Requires: caml_current_dir, caml_new_string\nfunction caml_sys_getcwd() { return caml_new_string(caml_current_dir); }\n//Provides: caml_sys_chdir\n//Requires: caml_current_dir, caml_make_path\n//Requires: caml_sys_file_exists, caml_sys_is_directory,caml_raise_no_such_file\nfunction caml_sys_chdir(dir) {\n if(caml_sys_file_exists(dir) && caml_sys_is_directory(dir)){\n var name = caml_make_path(dir);\n name.push(\"\"); // we want the slash a the end\n caml_current_dir = name.join(\"/\");\n return 0;\n }\n else\n caml_raise_no_such_file(dir);\n}\n//Provides: caml_raise_no_such_file\n//Requires: MlString, caml_raise_sys_error\nfunction caml_raise_no_such_file(name){\n name = (name instanceof MlString)?name.toString():name;\n caml_raise_sys_error (name + \": No such file or directory\");\n}\n\n//Provides: caml_raise_not_a_dir\n//Requires: MlString, caml_raise_sys_error\nfunction caml_raise_not_a_dir(name){\n name = (name instanceof MlString)?name.toString():name;\n caml_raise_sys_error (name + \": Not a directory\");\n}\n\n//Provides: caml_make_path\n//Requires: caml_current_dir,MlString\nfunction caml_make_path (name) {\n name=(name instanceof MlString)?name.toString():name;\n if(name.charCodeAt(0) != 47)\n name = caml_current_dir + name;\n var comp = name.split(\"/\");\n var ncomp = []\n for(var i = 0; i1) ncomp.pop(); break;\n case \".\": break;\n case \"\": if(ncomp.length == 0) ncomp.push(\"\"); break;\n default: ncomp.push(comp[i]);break\n }\n }\n ncomp.orig = name;\n return ncomp;\n\n}\n\n\n//Provides: caml_fs_register\n//Requires: MlDir, MlFile, caml_root_dir, caml_make_path, caml_raise_sys_error\n//Requires: MlString, caml_array_of_string\n//Requires: caml_invalid_argument, caml_new_string\n//Requires: caml_string_of_array\n// content can be : MlDIr,MlFile,MlString,Array, string\nfunction caml_fs_register(name,content) {\n var path = caml_make_path(name);\n var dir = caml_root_dir;\n for(var i=0;i' +--- +Mario + + +

λxλyλz.z x y

+ + + + +## Hello, World! + +I've reproduced a list of recent posts here for your reading pleasure: + +## Recent posts +{% for article in articles %} +- [{{article.title}}]({{article.location}}) - {{article.date.month_repr}} {{article.date.day}}, {{article.date.year}} +{% endfor %} diff --git a/posts/miragevpn-tls-crypt-v2.md b/posts/miragevpn-tls-crypt-v2.md new file mode 100644 index 0000000..f3c5313 --- /dev/null +++ b/posts/miragevpn-tls-crypt-v2.md @@ -0,0 +1,115 @@ +--- +author: + name: Reynir Björnsson +title: Miragevpn & tls-crypt-v2 +date: 2023-11-14 +--- + +hannes is undecided - should it be "MirageVPN"? + +In 2019 [Robur][robur.coop] started working on a [OpenVPN™-compatible implementation in OCaml][miragevpn]. +The project was funded for 6 months in 2019 by [prototypefund](https://prototypefund.de). +In late 2022 we applied again for funding this time to the [NGI Assure][ngi-assure] open call, and our application was eventually accepted. +In this blog post I will explain why reimplementing the OpenVPN™ protocol in OCaml is a worthwhile effort, and describe the Miragevpn implementation and in particular the `tls-crypt-v2` mechanism. + +## What even is OpenVPN™? + +[OpenVPN™][openvpn] is a protocol and software implementation to provide [virtual private networks][vpn-wiki]: computer networks that do not exist in hardware and are encrypted and tunnelled through existing networks. +Common use cases for this is to provide access to internal networks for remote workers, and for routing internet traffic through another machine for various reasons e.g. when using untrusted wifi, privacy from a snooping ISP, circumventing geoblock etc. + +It is a protocol that has been worked on and evolved over the decades. +OpenVPN™ has a number of modes of operations as well as a number of options in the order of hundreds. +The modes can be categorized into two main categories: static mode and TLS mode. +The former mode uses static symmetric keys, and will be removed in the upcoming OpenVPN™ 2.7 (community edition). +I will not focus on static mode in this post. +The latter uses separate data & control channels where the control channel uses TLS - more on that later. + +### Why reimplement it? And why in OCaml? + +Before diving into TLS mode and eventually tls-crypt-v2 it's worth to briefly discuss why we spend time reimplementing the OpenVPN™ protocol. +You may ask yourself: why not just use the existing tried and tested implementation? + +OpenVPN™ community edition is implemented in the C programming language. +It heavily uses the OpenSSL library[^mbedtls] which is as well written in C and has in the past had some notable security vulnerabilities. +Many vulnerabilities and bugs in C can be easily avoided in other languages due to bounds checking and stricter and more expressive type systems. +The state machine of the protocol can be more easily be expressed in OCaml, and some properties of the protocol can be encoded in the type system. + +[^mbedtls]: It is possible to compile OpenVPN™ community edition with Mbed TLS instead of OpenSSL which is written in C as well. + +Another reason is [Mirage OS][mirage], a library operating system implemented in OCaml. +We work on the Mirage project and write applications (unikernels) using Mirage. +In many cases it would be desirable to be able to connect to an existing VPN network[^vpn-network], +or be able to offer a VPN network to clients using OpenVPN™. + +One very interesting example is a unikernel for [Qubes OS][qubes] that we have planned. +Qubes OS is an operating system with a high focus on security. +It offers an almost seamless experience of running applications in different virtual machines on the same machine. +The networking provided to a application (virtual machine) can be restricted to only go through the VPN. +It is possible to use OpenVPN™ for such a setup, but that requires running OpenVPN™ in a full Linux virtual machine. +With Mirage OS the resource footprint is typically much smaller than an equivalent application running in a Linux virtual machine; often the memory footprint is smaller by an order. + +[^vpn-network]: I use the term "VPN network" to mean the virtual private network itself. It is a bit odd because the 'N' in 'VPN' is 'Network', but without disambiguation 'VPN' could refer to the network itself, the software or the service. + +Finally, while it's not an explicit goal of ours, reimplementing a protocol without an explicit specification can help uncover bugs and things that need better documentation in the original implementation. + +### TLS mode + +There are different variants of TLS mode, but what they share is separate "control" channel and "data" channel. +The control channel is used to do a TLS handshake, and with the established TLS session data channel encryption keys, username/password authentication, etc. is negotiated. +Once this dance has been performed and data channel encryption keys have been negotiated the peers can exchange IP packets over the data channel. + +Over the years a number of mechanisms has been implemented to protect the TLS stack from being exposed to third parties, protect against denial of service attacks and to hide information exchanged during a TLS handshake such as certificates (which was an isue before TLS 1.3). +These are known as `tls-auth`, `tls-crypt` and `tls-crypt-v2`. +The `tls-auth` mechanism adds a pre-shared key for hmac authentication on the control channel. +This makes it possible for an OpenVPN™ server to reject early clients that don't know the shared key before any TLS handshakes are performed. +In `tls-crypt` the control channel is encrypted as well as hmac authenticated using a pre-shared key. +Common to both is that the pre-shared key is shared between the server and all clients. +For large deployments this significantly reduces the usefulness - the key is more likely to be leaked the greate the number of clients who share this key. + +### tls-crypt-v2 + +To improve on `tls-crypt`, `tls-crypt-v2` uses one pre-shared key per client. +This could be a lot of keys for the server to keep track of, so instead of storing all the client keys on the server the server has a special tls-crypt-v2 server key that is used to *[wrap][wiki-wrap]* the client keys. +That is, each client has their own client key as well as the client key wrapped using the server key. +The protocol is then extended so the client in the first message appends the wrapped key *unencrypted*. +The server can then decrypt and verify the client key and decrypt the rest of the packet. +Then the client and server use the client key just as in `tls-crypt`. + +This is great! +Each client can have their own key, and the server doesn't need to keep a potentially large database of client keys. +What if the client's key is leaked? +A detail I didn't mention is that the wrapped key contains metadata. +By default this is the current timestamp, but it is possible on creation to put any (relative short) binary data in there as the metadata. +The server can then be configured to check the metadata by calling a script. + +An issue exists that an initial packet takes up resources on the server because the server needs to + +1) decrypt the wrapped key, and +2) keep the unwrapped key and other data in memory while waiting for the handshake to complete. + +This can be abused in an attack very similar to a TCP [SYN flood][syn-flood]. +Without `tls-crypt-v2` OpenVPN uses a specially crafted session ID (a 64 bit identifier) to avoid this issue similar to [SYN cookies][syn-cookie]. +To address this in OpenVPN 2.6 the protocol for `tls-crypt-v2` was extended yet further with a 'HMAC cookie' mechanism. +The client sends the same packet as before, but uses a sequence number `0x0f000001` instead of `1` to signal support of this mechanism. +The server responds in a similar manner with a sequence number of `0x0f000001` and the packet is appended with a tag-length-value encoded list of flags. +At the moment only one tag and one value is defined which signifies the server supports HMAC cookies - this seems unnecessarily complex, but is done to allow future extensibility. +Finally, if the server supports HMAC cookies, the client sends a packet where the wrapped key is appended in cleartext. +The server is now able to decrypt the third packet without having to keep the key from the first packet around and can verify the session id. + + + +[robur.coop]: https://robur.coop/ +[miragevpn]: https://github.com/robur-coop/miragevpn/ +[ngi-assure]: https://www.assure.ngi.eu/ +[openvpn]: https://openvpn.net/ +[vpn-wiki]: https://en.wikipedia.org/wiki/Virtual_private_network +[mirage]: https://mirage.io/ +[qubes]: https://www.qubes-os.org/ +[wiki-wrap]: https://en.wikipedia.org/wiki/Key_wrap +[syn-flood]: https://en.wikipedia.org/wiki/SYN_flood +[syn-cookie]: https://en.wikipedia.org/wiki/SYN_cookies diff --git a/reynir-www.opam b/reynir-www.opam new file mode 100644 index 0000000..541502a --- /dev/null +++ b/reynir-www.opam @@ -0,0 +1,41 @@ +opam-version: "2.0" +version: "dev" +synopsis: "The reynir.dk website" +maintainer: "reynir@reynir.dk" +authors: [ "Reynir Björnsson " ] + +build: [ + [ "dune" "subst" ] + [ "dune" "build" "-p" name "-j" jobs ] + [ "dune" "runtest" "-p" name ] {with-test} + [ "dune" "build" "@doc" "-p" name ] {with-doc} +] + +license: "GPL-3.0-or-later" +homepage: "https://git.robur.io/robur/robur.coop" +dev-repo: "git://git.robur.io/robur/robur.coop.git" +bug-reports: "https://git.robur.io/robur/robur.coop/issues" + +depends: [ + "ocaml" { >= "4.11.1" } + "dune" { >= "2.8" } + "preface" { >= "0.1.0" } + "logs" {>= "0.7.0" } + "cmdliner" { >= "1.0.0"} + "http-lwt-client" + "yocaml" + "yocaml_unix" + "yocaml_yaml" + "yocaml_markdown" + "yocaml_git" + "yocaml_jingoo" +] + +pin-depends: [ + ["yocaml.dev" "git+https://github.com/xhtmlboi/yocaml.git"] + ["yocaml_unix.dev" "git+https://github.com/xhtmlboi/yocaml.git"] + ["yocaml_yaml.dev" "git+https://github.com/xhtmlboi/yocaml.git"] + ["yocaml_markdown.dev" "git+https://github.com/xhtmlboi/yocaml.git"] + ["yocaml_jingoo.dev" "git+https://github.com/xhtmlboi/yocaml.git"] + ["yocaml_git.dev" "git+https://github.com/xhtmlboi/yocaml.git"] +] diff --git a/src/model.ml b/src/model.ml new file mode 100644 index 0000000..5d713b7 --- /dev/null +++ b/src/model.ml @@ -0,0 +1,146 @@ +open Yocaml + +let article_path file = + let filename = basename $ replace_extension file "html" in + filename |> into "posts" + +module Author = struct + type t = { + name : string; + } + + let equal a b = String.equal a.name b.name + + let make name = { name } + + let from (type a) (module V : Metadata.VALIDABLE with type t = a) obj = + V.object_and + (fun assoc -> + let open Validate.Applicative in + make + <$> V.(required_assoc string) "name" assoc) + obj + + let default_author = + make "Reynir Björnsson" + + let inject (type a) (module D : Key_value.DESCRIBABLE with type t = a) { name } = + D.[ "name", string name ] +end + +module Article = struct + type t = { + title : string; + date : Date.t; + author : Author.t; + } + + let make title date author = + { title; date; author } + + let from (type a) (module V : Metadata.VALIDABLE with type t = a) obj = + V.object_and + (fun assoc -> + let open Validate.Applicative in + make + <$> V.(required_assoc string) "title" assoc + <*> V.(required_assoc (Metadata.Date.from (module V))) "date" assoc + <*> V.(required_assoc (Author.from (module V))) "author" assoc) + obj + + let from_string (module V : Metadata.VALIDABLE) = function + | None -> Validate.error $ Error.Required_metadata [ "Article" ] + | Some str -> + let open Validate.Monad in + V.from_string str >>= + from (module V) + + let inject (type a) (module D : Key_value.DESCRIBABLE with type t = a) + { title; date; author } = + D.[ "title", string title; + "date", object_ $ Metadata.Date.inject (module D) date; + "author", object_ $ Author.inject (module D) author ]; +end + +module Articles = struct + type t = (string * Article.t) list + + let make path article = (path, article) + + let inject (type a) (module D : Key_value.DESCRIBABLE with type t = a) articles = + D.[ + "articles", + list + (List.map (fun (path, article) -> + object_ @@ + [ "location", string path ] @ + Article.inject (module D) article) + articles) + ] +end + +module With_path (V : Metadata.INJECTABLE) = struct + type t = { + path : string; + extension : V.t; + } + + let merge path v = + { path; extension=v; } + + let inject (type a) (module D : Key_value.DESCRIBABLE with type t = a) { path; extension } = + D.[ "path", string path ] @ V.inject (module D) extension +end + +module Page = struct + type t = { + title : string; + head_extra : string option; + } + + let make title head_extra = { title; head_extra } + + let from (type a) (module V : Metadata.VALIDABLE with type t = a) obj = + V.object_and + (fun assoc -> + let open Validate.Applicative in + make + <$> V.(required_assoc string) "title" assoc + <*> V.(optional_assoc string) "head_extra" assoc) + obj + + let from_string (module V : Metadata.VALIDABLE) = function + | None -> Validate.valid { title = "TODO"; head_extra = None } + | Some str -> + Validate.Monad.bind + (from (module V)) + (V.from_string str) + + let inject (type a) (module D : Key_value.DESCRIBABLE with type t = a) + { title; head_extra } = + let r = D.[ "title", string title ] in + match head_extra with + | None -> r + | Some head_extra -> ("head_extra", D.string head_extra) :: r +end + +module With_layout (V : Metadata.INJECTABLE) = struct + type t = { + title : string; + head_extra : string option; + extension : V.t + } + + let merge ~title ~head_extra v = + { title; head_extra; extension = v } + + let inject (type a) (module D : Key_value.DESCRIBABLE with type t = a) + { title; head_extra; extension = v } = + let r = + D.[ "title", string title ] @ + V.inject (module D) v + in + match head_extra with + | None -> r + | Some head_extra -> ("head_extra", D.string head_extra) :: r +end diff --git a/src/reynir_www.ml b/src/reynir_www.ml index acc4d72..ccb420b 100644 --- a/src/reynir_www.ml +++ b/src/reynir_www.ml @@ -6,7 +6,14 @@ let default_target = Fpath.v "_site" let program ~target = let open Yocaml in let* () = Task.move_css target in - Task.move_images target + let* () = Task.move_images target in + let* () = Task.move_js target in + let* () = Task.move_audio target in + let* () = Task.process_articles target in + let* () = Task.generate_about target in + let* () = Task.generate_contact target in + let* () = Task.generate_archive target in + Task.generate_index target let local_build _quiet target = Yocaml_unix.execute (program ~target:(Fpath.to_string target)) diff --git a/src/task.ml b/src/task.ml index 7548265..18a730a 100644 --- a/src/task.ml +++ b/src/task.ml @@ -5,9 +5,13 @@ module Template = Yocaml_jingoo let css_target target = "css" |> into target let images_target target = "images" |> into target +let js_target target = "js" |> into target +let audio_target target = "audio" |> into target let index_html target = "index.html" |> into target let about_html target = "about.html" |> into target let contact_html target = "contact.html" |> into target +let archive_html target = "archive.html" |> into target +let article_target file target = Model.article_path file |> into target let move_css target = process_files @@ -21,3 +25,78 @@ let move_images target = File.is_image (Build.copy_file ~into:(images_target target)) +let move_js target = + process_files + [ "js" ] + (fun f -> File.is_javascript f || with_extension "map" f) + (Build.copy_file ~into:(js_target target)) + +let move_audio target = + process_files + [ "audio" ] + (with_extension "ogg") + (Build.copy_file ~into:(audio_target target)) + +let with_layout (type a) (module M : Metadata.INJECTABLE with type t = a) + (read_model : (_, a) Build.t) page target = + let open Build in + let module M = Model.With_layout(M) in + let apply_template_from_string (v, content) = + let values = M.inject (module Template) v in + let content = Template.to_string ~strict:true values content in + (v, content) + in + create_file target + (watch Sys.argv.(0) + >>> Metaformat.read_file_with_metadata (module Model.Page) page + &&& read_model + >>^ (fun (({ Model.Page.title; head_extra }, content), v) -> + M.merge ~title ~head_extra v, content) + >>^ apply_template_from_string + >>> Markup.content_to_html () + >>> Template.apply_as_template (module M) "templates/layout.html" + >>^ Stdlib.snd) + +let process_articles target = + let open Build in + process_files [ "posts" ] File.is_markdown (fun article_file -> + create_file (article_target article_file target) + (Metaformat.read_file_with_metadata (module Model.Article) article_file + >>> Markup.content_to_html () + >>> Template.apply_as_template (module Model.Article) "templates/article.html" + >>> Template.apply_as_template (module Model.Article) "templates/layout.html" + >>^ Stdlib.snd)) + + +let articles = + let open Build in + collection + (read_child_files "posts" (with_extension "md")) + (fun path -> + Metaformat.read_file_with_metadata (module Model.Article) path + >>^ fun (meta, _data) -> + (Model.article_path path, meta)) + (fun articles () -> articles) + +let generate_archive target = + let* articles = articles in + with_layout (module Model.Articles) articles "pages/archive.md" (archive_html target) + +let page page_file target = + let open Build in + create_file target + (watch Sys.argv.(0) + >>> Metaformat.read_file_with_metadata (module Model.Page) page_file + >>> Markup.content_to_html () + >>> Template.apply_as_template (module Model.Page) "templates/layout.html" + >>^ Stdlib.snd) + +let generate_about target = + page "pages/about.md" (about_html target) + +let generate_contact target = + page "pages/contact.md" (contact_html target) + +let generate_index target = + let* articles = articles in + with_layout (module Model.Articles) articles "pages/index.md" (index_html target) diff --git a/templates/article.html b/templates/article.html new file mode 100644 index 0000000..bca90bd --- /dev/null +++ b/templates/article.html @@ -0,0 +1,4 @@ +

{{title}}

+
Written by {{author.name}}, {{date.month_repr}} {{date.day}}, {{date.year}}
+ +{{body|safe}} diff --git a/templates/layout.html b/templates/layout.html new file mode 100644 index 0000000..7a163b6 --- /dev/null +++ b/templates/layout.html @@ -0,0 +1,33 @@ + + + + + + Reynir 网 - {{ title }} + + + + {{ head_extra|safe }} + + +
+ + +
+
+ {%- autoescape false -%} + {{ body }} + {% endautoescape %} +
+ + +