From a97e074022bc6c8f38e228f7cf6f3280da94530d Mon Sep 17 00:00:00 2001 From: Kevin O'Connor <kevin@koconnor.net> Date: Thu, 27 Apr 2017 11:19:30 -0400 Subject: [PATCH] docs: Kinematics document image updates Signed-off-by: Kevin O'Connor <kevin@koconnor.net> --- docs/Kinematics.md | 41 ++++--- docs/img/corner-blob.jpg | Bin 5772 -> 4665 bytes docs/img/corner-dimple.jpg | Bin 5507 -> 4388 bytes docs/img/corner-good.jpg | Bin 5461 -> 4354 bytes docs/img/corner.svg | 42 +++++-- docs/img/corner.svg.png | Bin 1176 -> 2157 bytes docs/img/lookahead-slow.svg | 208 ++++++++++++++++++++++++++++++++ docs/img/lookahead-slow.svg.png | Bin 0 -> 7641 bytes docs/img/lookahead.svg | 36 ++++-- docs/img/lookahead.svg.png | Bin 3323 -> 4180 bytes docs/img/trapezoids.svg | 25 ++-- docs/img/trapezoids.svg.png | Bin 4748 -> 4613 bytes 12 files changed, 304 insertions(+), 48 deletions(-) create mode 100644 docs/img/lookahead-slow.svg create mode 100644 docs/img/lookahead-slow.svg.png diff --git a/docs/Kinematics.md b/docs/Kinematics.md index 92de88adc..401554f85 100644 --- a/docs/Kinematics.md +++ b/docs/Kinematics.md @@ -73,21 +73,24 @@ flow would result in poor print quality. To solve this, the "look-ahead" mechanism queues multiple incoming moves and analyzes the angles between moves to determine a reasonable speed that can be obtained during the "junction" between two moves. If -the next move forms an acute angle (the head is going to travel in -nearly a reverse direction on the next move) then only a small -junction speed is permitted. If the next move is nearly in the same -direction then the head need only slow down a little (if at all). +the next move is nearly in the same direction then the head need only +slow down a little (if at all).  +If the next move forms an acute angle (the head is going to travel in +nearly a reverse direction on the next move) then only a small +junction speed is permitted. + + + The junction speeds are determined using "approximated centripetal acceleration". Best -[described](https://onehossshay.wordpress.com/2011/09/24/improving_grbl_cornering_algorithm/) -by the author. +[described by the author](https://onehossshay.wordpress.com/2011/09/24/improving_grbl_cornering_algorithm/). Klipper implements look-ahead between moves contained in the XY plane -that have similar extruder flow rates. Other moves are rare and -implementing look-ahead between them is unnecessary. +that have similar extruder flow rates. Other moves are relatively rare +and implementing look-ahead between them is unnecessary. Key formula for look-ahead: ``` @@ -158,20 +161,20 @@ To generate step times on Delta printers it is necessary to correlate the movement in cartesian space with the movement on each stepper tower. +To simplify the math, for each stepper tower, the code calculates the +location of a "virtual tower" that is along the line of movement. +This virtual tower is chosen at the point where the line of movement +(extended infinitely in both directions) would be closest to the +actual tower. +  -To simplify the math, for each move contained in an XY plane, the code -calculates the location of a "virtual tower" that is along the line of -movement. This virtual tower is chosen at the point where the line of -movement (extended infinitely in both directions) would be closest to -the actual tower. +It is then possible to calculate where the head will be along the line +of movement after each step is taken on the virtual tower.  -It is then possible to calculate where the head will be along the line -of movement after each step is taken on the virtual tower. The key -formula is Pythagoras's theorem: - +The key formula is Pythagoras's theorem: ``` distance_to_tower^2 = arm_length^2 - tower_height^2 ``` @@ -196,7 +199,7 @@ must also be used in the calculations. Should the move contain only Z movement (ie, no XY movement at all) then the same math is used - just in this case the tower is parallel -to the line of movement (its slope is 1.0). +to the line of movement. ### Stepper motor acceleration limits ### @@ -248,7 +251,7 @@ pressure. Pressure increases when filament is pushed into the extruder (as in [Hooke's law](https://en.wikipedia.org/wiki/Hooke%27s_law)) and the pressure necessary to extrude is dominated by the flow rate through the nozzle orifice (as in -[Poiseuille law](https://en.wikipedia.org/wiki/Poiseuille_law)). The +[Poiseuille's law](https://en.wikipedia.org/wiki/Poiseuille_law)). The key idea is that the relationship between filament, pressure, and flow rate can be modeled using a linear coefficient: ``` diff --git a/docs/img/corner-blob.jpg b/docs/img/corner-blob.jpg index 6dd529a01bd16541084d93520f515aff727009cf..eaf9024cdbfd064858f02da1b6bf46374d09a138 100644 GIT binary patch delta 12 TcmeCt-KoO#|HkG}7IPs0B7p?O delta 1126 zcmZ`%O-NKx6h8O9r=}Ll6bb#_qR6tD?t3%(oQZ;n8MAaEi?T(Fk$L9J`GFZnboI(j z1`*@iB?v=Jo1lfzMuLzwg_~T~CTbI{TDA&b=e}Qqdc&FXbHDR{){Z@nn)WCAD|BDZ z3}=840D?cTw;+FUEPdg|)v**CzsY9xO4TTrSUjfiT=ZV8I8n|RbA9R36e~|MmGePG zRR&nEQJT>!M)AnWzRXB5SDj|;S}j*FX6D&BruCm@*Nf%y%#=~Oi#qSHze%6d=A1DJ zFggmS0AL5~A}Uan_8`4nJPtB)EJ!*)x*dBv>Tl8D**iDsZjc;|sJ+*dF#`7DVY=4I zerR#yz<UzehF5@^_`s1qJ~Vs>(nj_L4mRm>63Zh)X@mi&T+vcIky4UONu(0-lp2Su zK3A)<{&Des35iV93WX^>mygz}dWC5*C8n~hI+V~dEUpbC6WRc)=mkAj)y?R%K3@$S z;c$b51um@kb<hWO*&hsj)Z7_jtd0P)V$nc;(WD**V_TNv+Xg^iH6*{!uJvXMnC|ot z)NBnMo)bW@m^?Z!1<tP*kA|406v_?i2kqRn>H+?ZMWDltL*H3#A-*m-7~HZ+H<sLF zGNBS!tw9H0>fjV1b5-S5d+6L~@srUlOAZozx1>P+xp>0GlluVAdbaucF%`}imN6IZ zAG@T#M5p+DK+6AX#Q>4>c!xiH%wQs^@+ADtY<p|({{z4kF91TIRs7*+=E?8I_}S$R zECMSLw=a(+2Zbg!Aag8K;82sD(cr$MSr19G;^m;@)rs~eh!U4BFi%nPu3lP2i-=5b z3A}qG0<#8iM_6DONh}-l3f^-F`L;2j1`+oO`aCWgb?yUs9;w&U&$yi27WP%DMg9Q4 Cw3qw< diff --git a/docs/img/corner-dimple.jpg b/docs/img/corner-dimple.jpg index 14cae0c4598e204736a05c8fdfb6326bbe5aae2b..55402d5ea3cc0bd5c8a5f1c7ff0f47b82834b1be 100644 GIT binary patch delta 12 TcmZqHUZTYG|HkG-79~LdAs_^q delta 1160 zcmZ`&O=uHQ5T5sTlTFf=)>>$>iqC>rjj6laG=HKXC8?FRY8CA@C0n~TKae!i;vrZM z)`O7lu}}z_UIY(<2f-hTAWARRn;?iD6i*&KcAb~~tDqYuGjHBEGvB;<uQ_lxTr)qJ zU!m(lW;_Fg01*6vxeK|`>GZj)7pGHf<{G=Dl`DFw$cBd$IUBiIEzFiO`cgPuoM)vu zrpj_cQI!}Q)QgK+SuY$p9?nb@vXuqKE?2X8eQ}wcVeyfZ>`I|jTAbI5H*hV7%x}W? zbZtqW1DKqI695o^4x$1@s|V%r>QN9;BO&1+>1z3dxPFZe+uycB_k+;FaPEV)jTx{P z8`HT(`oU-Afp?^P4_*OU!wnhb!#&*zAQCy?2AHI?Ral%DOCt<Gm6do(j;53(Q=+Np za4H&uDQ&4*VIwnq|2ztrt>*LdS~eG{R<tsU4=F<`n^MQ3@eCV|$CA-_jFq*#maS;D z$bz<9aRcFSgLnj2HXI)GPF-{khTd<sdl)0+Vm1uw+M7*kV=%X2v|=Ry`lKN^eRgg& zeNeMb4?#`87x0Jxg89i~@R}R^Y<0lHGzHIYP$y~Ij!}2<FAM@9D-V5RNFKf}v@kg3 z8r@#Aiiv~@VEEk*zSN;bLX=fiHiBMo!{-#EyN2i%_+bdH{cH7@g(sH)9`^2ub#f}Q zyt0n9aQ@gO{mnbY?>$QHUn2(SK8yG8r-Ml-iKME)-^w(1WB*S8*X;xd0YCr4ua={? zKR!RbzKtZ13BUW|bTYwLd;+43L^%%M#-Y}38zxyn;(Ru(`CxNAieh&DF8EEynF<f= zY;=nICD*@+rR~=syyExY33$tKUh8}{j>2mo9j<%(Q0Gv(tu=&g9kF!(OVoUS(Dt9Q fG~v{8=4Tj%fZs3qeE~_5g26zjy{F@8U;Dm4$OD_y diff --git a/docs/img/corner-good.jpg b/docs/img/corner-good.jpg index 687c73aaf9c4889050b57f60ec73654709c67119..812c82a50d734b6b8052c2f9a686dcc64e49a071 100644 GIT binary patch delta 11 Scmcbr)uhDq|Hk4_7C`_WTm*^$ delta 1125 zcmZ{jOGs2v7=ZtC?p0F@O#`6^orKCX?cO_&J2O!fF=K`rS(KX=BXiZ8^MHAX(&Cbv zrcI1@6A8vt(<W#Uv?zj*HiesP5!5DX6RlddoZEly)1c1q&;S4DeE;J-?n?isLBslN zeS_``sj(Cg0zmKwRueMkrjlo`T%1a<>8or}E0**^o`ptaDLs6nlA9@{^rfL>ex4O( znIcIsS&^e`K+l)8qMkc+Y$!FJOP3ZHyHrVM_3|=1#ni}gb~#rll;`#Q9Qsm+^<DUq zG?w&PfQbnh1b`i|izq<R+Jo}6dKg61*pRTFbldao=)b`UcfNCr_JUwDy!Qdu#tgU@ zm+9Id`=G_i1Mf)BHeLp5;DUtm;kNDtkT$Z{53op=U056+O(F)MNV1xc!U;Lf<VYeE zON1gYsV!AXEHcg4&!do;N;W&Mr8C2ol2&Buh&-aONo6#wrdUXg#=~lq6}7CEE@{T_ zg0@`p1L0tu1P!jNdwtMbHPJg5dZ)27V9XAmSvRR~KWR{x!Q7^4$F>2`XLZ5bXV*rf z1q|o(5Nfmr0gnkF%ugPJSN-4@)&78K2!UOvUeeAjv*z=!O#&TG9{Sd73;3E~GkD7e z-CT8wiG&JZw)#8xS_8WYQBoAiY!8C#EnYF&G)2F_4^!~%U)7@yPwxRd>f09U<&-69 zWescL{o^j_Z@yC;?@==Ux?+Hy)A$a5dQ4P_sqqN>tt_h<{eJ?Oa}yu}t^5y%k)by~ zzC5|MiA`W9{OyZV@fi2`4Tusp$~p8z`)KgKghiL6lYHfX9o32Rcah>Roiq2*a$mjh z9A|iDdX4kWBjL;|fa`n)#!&cWV_mNM&Y<3Q4Cp~G3P+B(nt!3(=OcqMfWrL~jwTOK JXCBhse*hJ4n63Z- diff --git a/docs/img/corner.svg b/docs/img/corner.svg index 3383a9692..f2e3d0ef2 100644 --- a/docs/img/corner.svg +++ b/docs/img/corner.svg @@ -102,8 +102,8 @@ inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="2.49" - inkscape:cx="27.644" - inkscape:cy="0.62950496" + inkscape:cx="95.030833" + inkscape:cy="-0.17370789" inkscape:document-units="px" inkscape:current-layer="layer1" showgrid="true" @@ -112,11 +112,11 @@ fit-margin-right="0" fit-margin-bottom="0" showborder="false" - inkscape:window-width="1920" - inkscape:window-height="1032" - inkscape:window-x="0" - inkscape:window-y="0" - inkscape:window-maximized="1"> + inkscape:window-width="1068" + inkscape:window-height="478" + inkscape:window-x="378" + inkscape:window-y="113" + inkscape:window-maximized="0"> <inkscape:grid type="xygrid" id="grid6021" @@ -133,7 +133,7 @@ <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> + <dc:title /> </cc:Work> </rdf:RDF> </metadata> @@ -154,5 +154,31 @@ id="path3514-5" inkscape:connector-curvature="0" sodipodi:nodetypes="cc" /> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11.25000095px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="189.09824" + y="482.48389" + id="text12656-9" + sodipodi:linespacing="125%" + transform="matrix(0.98759291,-0.15703579,0.15703579,0.98759291,0,0)" + inkscape:transform-center-x="1.3563414" + inkscape:transform-center-y="-5.7099754"><tspan + sodipodi:role="line" + id="tspan5552" + x="189.09824" + y="482.48389">move 1</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11.25000095px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="427.95532" + y="379.5321" + id="text12656-9-8" + sodipodi:linespacing="125%" + transform="matrix(0.98949457,0.14457001,-0.14457001,0.98949457,0,0)"><tspan + sodipodi:role="line" + id="tspan5554" + x="427.95532" + y="379.5321">move 2</tspan></text> </g> </svg> diff --git a/docs/img/corner.svg.png b/docs/img/corner.svg.png index c94ade2096d5f3da24d953b89a52a2942c3b06e3..12444e7c732f355467db5bb684a862f37ff75081 100644 GIT binary patch delta 2085 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 P00000NkvXXu0mjfwSNEQ delta 1096 zcmV-O1h@O`5SR&&7YY^#1^@s6eT*nJks(Zf1Qkg{K~#90?b}Ug9aR(u@LytVQ$MJ- z8?_20sm8X7;9lIgaPLCJg$U}#l{>+e3z16ID2j^+DrgnNopjliqHaWMn>78d)hbx1 zO8rRMG%n6u-gGjreQ(}J-fQO%m${ku=FH8V^S|eR&fGVmMiJw90T1CAj%O|PPvYEv z>I|($FEO&(0~laDh8f&YIDY}BaM;BpIhM6k*>`FT8EP_I8h7F|+*k71vT*uq3g^$` zXF--kkkj~4kmdnw#1S0DiR_vhtBjfqm&aPXhUbLykG6Q-a&|1vanZ(k{3M7`Y=`hy zrBT;t8#NhP$0K+j*K3^+WmwkUyq{5jPL!h}($tcyOQ^}v92>ATYg5_rUfiMDye(iF z*I^STFo_#G7~|hUZY9Z;@1Ia7`fZ^m1GizDaL(<y{zQj%Qv~=!kYE~rmVEE#-2IAe zv(BQ>uh?&8L^<4KEQ5+sjA5~tH@RBKum-nlID0xySy?UW6e%Y-DRPY&{8Q0?)>@4y zQf%9>u7hz7oBVoNM7p;{L89xp(#Vij+58H>T{wNQ>eCAHE9)$l#0p<#YbiTFiyhdd z_f?{@|91jgu)YJk3;0DjQD*UP2ezwX9ljA2z7NH7nD6EdhLsH6ls1b(HsqatKMn{@ zp0FN!#Y&wgLy81n;}v|NQAt{VP4rTJoza-5e#);Yd?)g*W$ec5*wYQ;gG`2I(&lba z(P<Y+7UUn|tZ@3J7Owvok88}?g{;3@kl?EdV_Gewxh*5gR^e<_(QEnj1U}08X(8Gx zB<ZI*$SVec484*zd8glp-#QrMllUO(r<ZNJ@M>oJN<%)X<e$qVZtB2)?xp0{oYr%z z89bf)JCWiv-cd2H=qDM<q|J8RTESK`Y17Vxwu&wIUPPn+@E&%G(&g2NUdyk1Zjzqw z5mA*(7{|B5fAR}vs^FayQDR4Cqa}2k3~NM!Q*`=nOPe|Usdik8FL9SxZQjD~eYo$i zqM!2XEMCm+Sw_GlWB1^HO)cbdRmm_6(xw}DUL?-bE?${xR6{YUB>(ADeq9PlLhTa~ z{S!^{ip!B9Nt?XW--BB!462{frdt?OZ=&lLHVRTqYUC%Wze(pRCP}EXBL90yA+H$G zT-sC(Yei|3j>iq&i<}z6fin4ZKOW3JtAYhVifK_%G$Posu}wpN=f&3Kxy;bKMwzmf z6E%8`r|_<b+*M?G9_f9>8)IUda5FM2h)jN%q)m-07vrLc@r>4X|CVjJUljiP0}f{G z5Dt!sRej3JicKwTY77!K<8vX8Xb_?7cO#3!!4GIS`+@A(^!>w#I!UZC_;^_C0N9W_ zcR_51oD&W|FI(X=#gC=h-V!qiZ=h?`XogWdi$_HzGCBLakndgH()~Yow^V!a#(psX O0000<MNUMnLSTX+*&$Z| diff --git a/docs/img/lookahead-slow.svg b/docs/img/lookahead-slow.svg new file mode 100644 index 000000000..fad4a6d9f --- /dev/null +++ b/docs/img/lookahead-slow.svg @@ -0,0 +1,208 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="97.22496mm" + height="32.550285mm" + viewBox="0 0 344.49789 115.33566" + id="svg2" + version="1.1" + inkscape:version="0.91 r13725" + sodipodi:docname="lookahead-slow.svg" + inkscape:export-filename="/home/kevin/src/reprap/firmware/klipper/docs/img/lookahead-slow.svg.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90"> + <defs + id="defs4"> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend-1" + style="overflow:visible" + inkscape:isstock="true"> + <path + inkscape:connector-curvature="0" + id="path4329-1" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + transform="matrix(-0.4,0,0,-0.4,-4,0)" /> + </marker> + <marker + inkscape:stockid="Arrow1Mend" + orient="auto" + refY="0" + refX="0" + id="Arrow1Mend" + style="overflow:visible" + inkscape:isstock="true"> + <path + id="path4329" + d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + transform="matrix(-0.4,0,0,-0.4,-4,0)" + inkscape:connector-curvature="0" /> + </marker> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1.15" + inkscape:cx="3.4198125" + inkscape:cy="101.26451" + inkscape:document-units="px" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:window-width="1091" + inkscape:window-height="588" + inkscape:window-x="149" + inkscape:window-y="422" + inkscape:window-maximized="0" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" + showborder="false" + inkscape:snap-global="false" + showguides="false"> + <inkscape:grid + type="xygrid" + id="grid3436" /> + </sodipodi:namedview> + <metadata + id="metadata7"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1" + transform="translate(-135.22429,-249.96955)"> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 150,250.23455 1.06383,102.12765 327.12765,-0.53192 -7.97871,5.85107" + id="path3347" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccc" /> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12.5px;line-height:100%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="434.04257" + y="365.1282" + id="text3349" + sodipodi:linespacing="100%"><tspan + sodipodi:role="line" + id="tspan3351" + x="434.04257" + y="365.1282">time</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12.5px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="-313.86618" + y="140.27856" + id="text3353" + sodipodi:linespacing="125%" + transform="matrix(-0.01601372,-0.99987177,0.99987177,-0.01601372,0,0)"><tspan + sodipodi:role="line" + id="tspan3355" + x="-313.86618" + y="140.27856">velocity</tspan></text> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 150,250.23455 -5.31915,8.51063" + id="path3359" + inkscape:connector-curvature="0" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.62366331px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 179.63013,351.45141 16.05677,-60.94328 43.25999,0 16.53759,47.11348" + id="path3361" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccc" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.7558428px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 254.72406,337.27551 22.65101,-77.77178 43.89917,0 24.69858,91.73948" + id="path3361-7" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccc" /> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11.25000095px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="195.45749" + y="286.52051" + id="text12656-9" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan7078" + x="195.45749" + y="286.52051">move A</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11.25000095px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="280.5639" + y="254.60564" + id="text12656-9-3" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan7080" + x="280.5639" + y="254.60564">move B</tspan></text> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend)" + d="m 74.333855,283.02668 -147.83244,52.19984" + id="path3514" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Mend-1)" + d="m -79.633985,251.6122 154.13499,31.81455" + id="path3514-5" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" /> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11.25000095px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="36.7374" + y="252.31848" + id="text12656-9-1" + sodipodi:linespacing="125%" + transform="matrix(0.96753827,0.25272454,-0.25272454,0.96753827,0,0)" + inkscape:transform-center-x="-0.91382951" + inkscape:transform-center-y="-4.9145266"><tspan + sodipodi:role="line" + id="tspan7074" + x="36.7374" + y="252.31848">move A</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11.25000095px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="-126.26086" + y="304.35226" + id="text12656-9-8" + sodipodi:linespacing="125%" + transform="matrix(0.93839918,-0.34555314,0.34555314,0.93839918,0,0)"><tspan + sodipodi:role="line" + id="tspan7076" + x="-126.26086" + y="304.35226">move B</tspan></text> + </g> +</svg> diff --git a/docs/img/lookahead-slow.svg.png b/docs/img/lookahead-slow.svg.png new file mode 100644 index 0000000000000000000000000000000000000000..80450e09e6db2121a6175e0cb0174eab732d76aa GIT binary patch literal 7641 zcmX9@1z1$w(_dI%2?<H*?uMn7UP@3pWI?)?2I&R?X%Hl2=|;LcRz*T`X%>MsP(ng! z5cu}}fA@KAob$|?b7$svXXef%8R%(|5;G73002_$$LdA^0InGJIf#$|du5gk&BEUB z{Gi$<gxDjT&@mA^Ch~a<^TX1w{CDC&`3i!ull1-?=KjXs&i+AmFPs2DK|vy}UhaMl zc0Nub-Y;AV4iy-%{LHk~RZW5m4>p2&o|`U>{W%ieO^d@bdJ26=XzGf?o=su!pxm6o z0H+lwkl4&2Alh1LAA(0hocJo8t@$zDCv`VMK8?yao|r^Db+*?A##_pfzht>x4vX@` zoX_PXhi6Zw-sJcGDu!J+A5I|#SI~@8Q&V;A_$>s%N_`4Ag-l?McG^=K3@MUF<sRAk zHowXaZ_dg;Om;5Q=edknOZo}9kbG3HaCBaZm%e(^lt_R=Za()T+ySyF{GWh(+%C{H z&YPGfpR)Y?B}Z}$1fzqoJ`L>>^fC3n5w~sMStY}OkoFiHjD_ukIU*rEX;H}0P4r~N z{+sCim|<W_w6|Gel|syJDofN6BuctniJqi^6_S`eNP7E_EX}Kga0(Pj{*V5aJ%f}A z0c#GdI!zlzuPY(lk;|xqH!)SnT+~4`j&f4dFl!HEL?ZB#-bc^>HY}TmX9d8T*mO@X zE6}F|FbDk3qnM;c>R^O0&oSpap)Lo?xv(vNTpK_!er_o$8HS8O*813;tv$d%F;zR~ zI<~^cO*`)0MwcHCRFsc|PLoC|Bx&ajFm9NRxft{6FTgLXR>QzxinNxIZkeQ}S%65n zn9d977H|Js1&q&WpE8;5%|BXh`7oT=XnlZI`9+*7jXf+)(@O;Cto3WFi(I(?X4Mx{ zRI&d(I!HZll><YInJJ&FpMKDycLOL9?NcO;Aciq-SmQJ#H$_o#i@5-f@RSIcq9bLD z=U&&r+QXTH34<a2Y`OfOn)~aiyv70qV?Pg_yZN&sBao6ve_IeHd1s%ooIJQbW$5Sv z9x5>5W^3(#Yk^5aw(?zxyVv#ZXb*HHPZDR3{A0T0JLU-$xg@ruZeb#geW__u4C0|? z_9Jg$L}*%ApLUX+zWXU$YyC4oN6YbAO2|!em5f`2w^V<|xs=>dhIS)Tur4WS8t;zU zN*RZnr_~`wIeSBim0Pl(ZsY!ujz=;#4JdB~8SUmfWFr^eKDwuQQm<8-nRo@C=|orl zj0BU1s{0qeJ}Ik+{+R4_q;6MBbL#qC<5Y4u?*nhrDk+?c;M7?{q;HcxqVdvr6a&VU zR-0|Mj3EcIs-EFH8(88>;_32R;ryfSlshu;|9uU2yJgp*%HHKmx}ra}GNJObg$h}g zqV{`HPVC1r#LaJ<^XJI9IZIUNZ*Ji`Er?2IdYzXurLPycoKB`&9#%yqCX`vQMw6F) zzFW1$;Dfn{89bBkFZI<;uZxhu*;7L53m!I&9O;=zf=&W&&+oFQJWDZIZ*B0?M%x@8 z=`h)U<QM+SqFP2mbc!C7(ecP~qwj_`r)+DM|JW&Q8xxeKSZ&>rNb+euaF(KfwWpn4 z@p`eLtgq6UU&n1ImNJ>NfGO<vG_}RuC{VwAw^9{Oy^AP!_*IH1J&1{_kRk_o;VMyC z9c5_xW+^p}K*~>=*uTtru1S$C@r+n;CsYiJN=nw3E??(t^AY9S_-}<GrQu2e42U*u zH$!VtNOkb$8NUum935bG>5*~cp-A5lUNE^2vB2se&801Br36n}gPDD-;_K?PLE4nS zsrC-UWV}l-KC|dWiN?g%*4($yd%a&;t+aoPF;9t&i|T!43iDwU-}yUuW^wM+0xH1n z{2hKJiInB919<LJh@(aM`n(BrIy8ZxikCkV_*2KT*J&gAHXmIwyKPISOsmh9d^0sB z#}^@@O3#NWf$L)7MDgle(k#>YqnuLfZwd>uyZxFq@m)S~N(Gg2eAkqxTN){R=D)Rt z`sc%ILBei5A@R;9gw01>XOu;aQ;&)=z5V<QTt_7ssT77+J*cZu(I4`M!(wix;T>WP z*Q$8Yzs$9Oc~WHiCdj|6yuH!D69BjC(=w2dWNkD(0n~|WFT6o!d_D}LZ4~#T($S;U z8p{cij4>NxB2`F7_mx16A3L}9Qy%)^E({Tr(q1d1A(@kxsVtY)W1Jg>4#ShzdyiD2 zsF$89emawz-U~+qI{S;&U9I#zc;clLf0p*;ed>{22o0jJU|&MdMw)CU@YP2qx&fve zrVRFu!b4-`E1kddd{Us~76s94tfbLq_KEzFpCTqxPl<)yT(R#ZW8FGDibt~k1EJ0v zgvO#ZmjcP4VXCV^sy3sep2nHNvNeIx`nPmY>Fw)=+b^1T)#M4K8V6GidfP?%vj$N{ zl5MKu>7yjsofU)8QDsuErFXZ@qi^}G?l#aLdEiuN1;mpf;*4pDW`%bl#e0+pQ+VB8 zIQX+<+J{$g=gvKK`E%=6=gb8eW<5<E>c~jy+*jS_zD&n4bE=EGg4tep9?tyx_8W>N z*8icJd!I+@wt#V{Ga3aq92u^NyXJ)(FWO7aS%a6Yo7hA4<jAXWYZAylG;DBrI$lAR zxTQo}y?z;wrwIwOp5sNP1)dEu954rp$N!qygl`GEv#N~;&7<+ZFhK|<jpZ-Wvjde( z`!lyw8VVNQlHw~7eTm((8-kWahd($bx6Ru*XMq>7yR#laXOk5Aahv^|a<xCgx{LbJ z9AB$y$31E5CjK-n9ym$3?GEG1;&G2}4<(;J1U3r#Kk<XMr^=Fef(u+qaMK?!$K{*4 zD4G<?k<bt+>)saWYp-uwx<5+NJgw^#M4K<7#~Q(bU#Fc{v;PGe=F{&7Dk(nk)Sh;t zPL5Oaa&+CzfBcu^Mx>Uu`pXQ`hLIuDX`*269H-G1=SqJ>h!@dIXVhQYk?Ay$w4HuB zkh%RHg}*p+D^|q_+e}YREhwW}B^0KHpY5w?Kka?b71Y+q9+i?0yLB!nt2FZwZ4s_J zlW^zb6`O92n=h*GN2M=+Dlk8clYSw%th=2i^j%lzs8XB}Mp<-%;TsaIfEw3ZE1SHP zV<2sg0yTb?C*<bq2j=mFZ@GP$Ue-I;I5=&z6|oo_CrXtnOt@~VU~Q4B;*>J3JxueE z3w_VW@(z|*U3Fc@DC|AN>_dizAHJiWStq;3QBJvwkVlvL$}zw!@f8xQUz_DdY;_?u zc7nVbJ-OV<qQZ7mj3g*~0HSU#%jd5$XEbv`K!+QOvA`YOKw%5*bMW7Oj2R&?`eM=N z-!d|SH2G88wiw2*EcWplX@fk%!`ZAYbK40HuH2ldK}jhb@@xEp#cEROX=>+k@2l?* z`<LohbE49B3aG85pIi>{!!714w(#LUI&%t%pORy3xUClQYayyu^xYa=BO#)av4>GN zBD>kwk7H9%V8RsHxfAr}v_C5T2ThQS+NbqpG{ki}@M;&?4F%abUzrvzPHC*OEMnn? z+$r>~7R#Zw`9_mmlAL}q=lgzc2bUp2+X5*vQQcz;(Y4ySDCtBDTcN1E>vuD{KZvzc zb7KK6fCac9AD2{AozK(4afO&bi$F%7BZ90idczNo&HdC|T}z;|)7|l8l~Xd&-LJ^X zRhz22_}wJi5!v33A)tM|hfASJRQVvoKR(M!XRqdBD6`Tg4@-#uaeuu`LMk&do5Ti` zF_Z)^zGHl={=#0KxY5n3p2$SzTM(lU(S-0m`-ZxmfBRCQik+gMWP9}^o&TVmG-VS* zuX{_>=JMb;_`@x8tz|>FVl@%`<Cp@3VChy!<%~IH?r@#Nfa8x?y#CLRG0LT%W@*c% zPu}lbbY{=v{xObWRbQzo<M_o`e!{w?reIm&=;P==)8MftPSzvgPeIxt+}PgNlE1ym z2mW`bhLPK2%nu=)zUr=EuWjiI2fMMM2M59%OIm*fH5NG-d=TU4yM2<~@gT#iM4$bu zEKORff9ckHQ=~R(C6a`R#_A|_rdL=XF|zQ(Xo8yIpn;JL9rA*oI@=nT$#O+MXDFk5 zW5UuD)Ceo}p#Qd{)W{%Oeru6lc06iQKRri+Hr+|9EgDGO92wTO({ZBkfgm*bY&1fo zuA12USQK4UNQ5>Y2nqHn%JmKLqB#Y;riUq31+UQ_n2)HlU8E$u(wPygb0WQX8z>}T zuqDTy9*Imam{&hNG9(&{7o)m#*kNOU3+o7NJ%UiUTj|+0$gGz_(iY|zp*CCQ<mv~j zbSP_4FIN1`l+8rC@`w3F21e#yq*r(A;f*`jh`9AXv&-Z(iDPC)tBiXL9UG%O$V_Ai z>K17D=c>GX@*O<1?h6havgd{|>=5{y&PPxFjy2ic7bD9cylIAPU>~5%GMy*Cq_k)d zVUgM?J$CJVvq$XztQ?YY6Ej@FUwbLRGT2(#x~;mbm}myx#J~NL65T%sf6_aUfi&6I z17}Id^eIw#nh}R?ju<N)m9|(M48rk#vVet&LRoljhti?5Uu~#2f^__&^aCW*x<Kf$ zhNWp>WE`bd`=VS-E7y7jI$owiX5m+~3##_Lgh`MXPQVgZ8udUl?N~n(jcb!z_;_y% zuIET^7F5_UD^S~3Ph(=z5&TzzUby;EL0Z;;AnJ(Z^b3T6hS-K~qnpHs;(B9rw48QZ zzx3P2Y6zS^TGR+~z3@~rW(z;`x3k5|JJ!C(dW+LjMoUD$qpO3yh33V;_kM+&%x0QY z-U#Seq_c&1z6q2e&`lW`uJ42kcoxJtB$W20D=_HoUbAvideI$KNC9Yq^sB@oOgtR2 zEE}{+84!vF35LDzYdz()eZztXN#G^q88sDn3sViQ5X1gGSS?$-QT=K7DSuG#Uss_Q z{66^cxXWMRc=mQ5T78QWI*Zd#i{|~ZfJ?U>wy6e157O|2Vwt1?)_~|#5^4t)MYX@9 zdG~-#gFu@Q-}=t<SwKPpS$Wc{QhxdN#m-5w>N5{wA3mQ)IYFZlOqWve0g4UM&1J3` z+Zq?7D%#VNPGdhiNnC~M(mtnX8S3gv9_R;J^cH+|GI3PQ{->8>p(z*RYV#dsv;_k8 zKa+JPI%YIU4I?=~2`}>H;SOuvYzaY!@4utYNuNxnTj?rMy=^Wl5hf=n?F`o2J3vyC zCX391|A@C^G&_c7m&$<R?f)#uY1U@!Hms_?Pm<J{U#Jvfs^2Mx#@eLzwG{&*p)YU* zen=+CHD9Pna9iW|z&2xYx#2SXrS{fX_hqu6ddhIf_8CDFcaZ&V>F1B5>8piWgF)Dg zI>~Nlfk+2Kdp@k$ZI=y_KHp{bWQ7g<nbKyoTzd1eO>TnIs@ZTuZxZJFpv7{B%?(U& z@L^M^dw!_D-R6DYr#)xqdzv5$;rGnyFdy)s_lw>Kt88DxY<O%c?Aj+*5)FSt5mXn_ z$X?yx!iH;VhObhRH_d4V(7zNpTU@MaNxD^JobIW1+37>6mDhc_PF&qqE{1eh^-)R8 zL<56F87CSYbY}gboIa{pI|>c_f$zB}x%KMmSQM*&{JsF+vfCHht8RH~rEgt&S2SGU z$@}3@c#-booQZqIG`I47N!t93G2GeH6AvqX`yEn0W`+MZi6mKCA@{9~A}G~O4<2#O zoz<;Ao?=smzrx^zcRWT=tSmZ1&_#+3SyE$wFRF_IdYaz$RH$rgg&cn>G^qBAWbHVZ zT!d?@q+yGcX&!kp%z7CPoGqaP0eR!dK1?z29<o7z2Y?Mr5NhYgg8Ar|xWEg7Mn@*^ z=fOCkK;a8;iyhUsy?Pv^C=`U!x<wH$q)9NYw#EFKP056dYqgsMBiQA;G{Y*HRJX~> z;^E+*;T_L1x5r)(_X{*bqrwCY>;mTRx7|#b3Ih5oHgZlp@DXTBR^5%NcT}sm!ED<n zKT$>|eqg}u(6rDPPX$>y=-n69Q`tQ>G{@7#+$?fnP?_P|FvDk~G6qIy<*%2#bN<H5 zMaht_f4yul4y3Y2CYUi&S#RqIlD90_T(5ri8p*rU8@mHrr2k4*zWmpzqs;2xeK=!I z4J}JepI6nK$OC2-9f<4Gf+HcsLUj?{g5kWov)orQj+8UC3emyF$bWnm?_?%5OK%G; zK9N6;k~v`X^^It~Lk5(^inSMG5kwQU*R-g*I4-S6azt?&UK_Zyq7^;OK&K}_hPz1z zNu<{0-Vn(rjjlIRu&M81kYRo6q~{AlMfrd-X_%7HH6<Da*9UsD3$f%`w|zB|@WEfl zpZJUSKf>jS1kXY&1pi1)cDh}#AvD~n6)Ykk1~0>SbR22RpqrJ0uMa_8Zr1Ps*PQD- zdmG-tkv|guE{YxH5$)Hl`KEJ;WaW{y7;oBR)w(U2vA;E}K9qGy5V5cO7g-0UPsV^X z@nq#V)qt8xpJFfYyxabs$~y5|7?l+EcM5#Wxd;i9+cSeb2#0)H6=r;e!wR~4x%}!1 z|M*qh_d|ls#gQJj0NLZ^IaTnu6MvzDw}s^UCzJ8WYOG$|1E#UTjJn97r2Iw+|6kW( zt+0C+-i(I!q>UlRmj$ndAY6GcdsAqU?mlgC6wYdE#;;3}mS@DR9d(>2_rm-tA$1T+ zj+%A=0hj_R<$nkfW>kv3i>hZf?PXr=_5FGZ<6M3^k^F}bXEz1kWXpFseH1uM#2g2! zC)`l&03jj~vCDufd<5?uuqobEs~e|3j;#D8Kk}Ix2xXgRaBoKTCfcUv(UbbV_;8Or zyIh!MMfuv;&R{J3JHaR_rq4*P`gO|#&9L_0>&UTAk3RfWVSfr5CXxYeY*uovy=U|H z?$ILDQ&GO?N73qZ0|;wQpoyLZEf%l*{0f_Fi^aVZG%hm@K3`U%1(Usk%0~90sqI_B zd+F0YJE1~4?oP+~_H3Lk1#CT%u`&aro3US?5IJHHgi;~y6#rE!cZLJ^%;1L0UA^#D z@04;dNElN%wO`%yrtNBC9Cv;QrxTO+r_g<Yb6wE*N#!)kWsni~IU|Iyy@BBYQ|g|M z+3UiNftP3=ci7KC2ANX3a}i9)ViA~ViA*82?)c4=*80pW&Ss{)Lau03b%&s^U?71K zBP5aM3UEBbFwAQ`Hc=-@_lV&?hJ+|pFoA6HykUW*;X~&j>M;dO1~MTuWXkigb^a21 z^11EsoGO<r(NbDx?0fiW2dy&C`i29{Pa>ygaT*P6WL9@D3Z5dJOC+ux-ImsQc07;< zjX|5jCoauF$K1BhiG9u8uQ`vquuOUqhxD6&PRK1vLt6krq|5ftFbQR`E#Y-8s7|3Z z2Hl6u|L;`-)=vynvGtUMpQB?H(BXcR!AbvI%1Q-1XM)Vc9VqaqIDu9qjMCFFQ1sZI z_>Z}}h3>h<Q&2hoN@p3+wS240s=I#e!u1JQaiF>zcrfe*8luCB>YT40z^v{9@b*G} zFVVBh#Jafv>gADD%3y|7s>Uvh0mLu!j=w)pj!}7bB;I5bVO;TGpl(jrn@BjMkKrCT zFdTz5<~?VKJZXEbSn{TPVln3+8ArKaA?`n5Pd0Sp^K>@Z!BM)jXR0o!821j}qXf#d zT->By5eoY&+<~Xsf5pGFRArT-32&6vsxb6#M}Xa$x`2xOGQU5{5g6{Ug)(sS_8TJ# z2a>B3Hj^}Em6EawLlb&dKzb@90TI~Z;_swLecy;l4xPN%Vc=lx*g@_J&?fbp^>Y^{ zXILQ=p&q7GBMRJHpA`Ry+8-fFBd^(>`jir2q4`urf4qJFa?=fxXr}Q?`Q<74sJb-d z@Cq*8%ZRED`@=ZyxJax>nAW18T1F8piYd$fCYEBAPI=j2p7Fuj>YzGy^CB`-^crJ- z22%;6Nw6ds1U1^VCI5&=XHf@HD608E5<lyzRmdf1bZg;G@-d5)fS4Gp?xh7rZ<z%s zH#>2}VPXB$vRwWY8k@RD6%>uX!L}7FLy;l}3)Y*2E*0EdQwT2#9hGl!-^&GtcsFC= z4|7s{zbht6Ys+IKm}{4v?#pi?lak{dv~X9bH;M^=15UktJeG?^pc|gBKb-ShNU(la z&FNXGImqH-VlPPSxOYy~{AP_lI1cK2z+k&hJf;V&;0r>9fehP8Z1q(?g|-gH+$4LE zYsjmIrGeaEkwkw~0~uB#q`#R3`NrP_;mvqBvkAi^Fc(;mo}*&2GIQXc`I_{5>wfo8 zFsq-f;vK|O(|r#tN3nM+SQ56s8`w~9Pt#&7=<2`c4ngcV4jgDPcvYSc)=arcKU7@% z_Au|8qoa(Dd?MBn7}|V^+Y7dL^^mkR%kYcIh$G{8!L{~fxpYms%3tGP^$fm_vtQs{ zk?Gz3DumUICRNKSxj**q6(lkDO<@PPJeE&)!H2!r>7yKSObzr<4#a!X`h<^}n<cGA zX}*oz2b*0sNRg^7DEK}zsA9-1h9nMXm%#!e)0d?_zjS+6?g<(*Mh67T9`CBOb|CKH z;K>GorNj7B+Qnr#@jfeEcJ~1g>Z&$(WU4MNC;oTW$UYNIKXv293rqhnp7=)f25+;{ z`Im<94dHf{v)n}g3hAE(DBOT0>Q$xay~oMxmD3H<?&F%clEB6o$G>2Uvwp_g`={!R zJr<BAwUl_oSzQgDvjpN=4*#~y?8d%N&IcbsSB$RNnL@9)wV~RSX?i66Dd<mJPI>wn z<1-&U8GHU*%*(Xy6gPy+V%0MbGP4%1>9(1E*K;48>@eLB3VRFPgL10Y<BnxY<yGV) zxfu2JRGn=MA_M<(F?{;A%W8fD?eB(^cxdT<H$g>1i}*6vSanr59`B0GIGe%#$xzSh z1)p+HNG#@b@-kF)oi=DVfzqraHY`+pv)bq^ZvE`z9VQ#02lJB#@0a|LDYc*aYN9~6 z%~cfrFu}<Wgi{YNpONB@OO5cpaE%=mi#Y{wn!nkOiqQHuyq_wIZ6PG_j^DXY`F$Qv zB#lo_lPx!-IkLyB5ethr?}w7=H%fhe-cgiF^=RL)5IL13;+#ubR`Z&mj2XQ`kjg&k z47|VwISs`m$Y7rVhj%XDDN}zwH;E#yB<V`f>CdJ)oQ@WG6i>c0ja-cQWc3`UnB*LS z$(g;U2pzhOH!4&B%|H&|1an}%TZZ*Nl*)Z;`s07IO(Xp*)}J>%Sfp>3wDs&ZJH=5w zYWE=Sr94tXlE$#C3k7nvXzj2G^%o-FIvJ1iSMJKjv>rbPIVirsb;#9auX(Ncjh~C; zD6oT}1IEEC=DbGjM(m0!vf1fjPO3nXO2VAz^yYsorQ$nS(VlBUBtLO(UXguhn;=Ss zNyj6gXl74-`&|5{*w*C#?NQ5Lc?T!KX%`B{TYa!Yh+UuYzxCqr9W=)VZ&()^WG-+l zvDLx0vHx*+3q{i{F}-z~cy5bDy-=8fkV~#^0&onNC-p}>0RS97CtGBOS7C(q@ieh2 zq_aXE	hrkc$TbKVs9|6orx1478b5B>iQ_fBT?WWGg2!t{}%cZ&=&S1Y`34qgg_> z&8eE$x$Xe!jyV|8rrPr6P9!F+Rin0G=M0J~TWNq9+-g7qF1a)(pQNN@d*}h)KcFn@ zBPLne|As69fH9m|z!5o9N`8L+_6REO3DYRx8L%6Nk(U`G!iA-|fgBIE-4FnQz>zlc zV;Qh#2k6**UUg$SbsXEGlW;Zg=Rc1n9`j1fDv)h`MEEq>i<bthuO2@#Yf3+<zL*pe zkuz41pATaUB|pa9yAGx9k?OmDZfoWr5w_TS?$CkRHp1B3GFXUT+1V1cXrMxZ(uM++ zkM(WI*1UJ6vG2%q#d7?n?dCJp+fJlQ#X4g-?O#T|h7~^%YzHmk(J|NY;ZC58kKA!% z2W}u~Dpm|r2O1w||JyAj6hlnB&$1D{?27X?eOdjQw}tbVr^C?0t-!C3VD!HR;~z>L zd;8{!cQxPEf#v&D2A)$%PQQ9M8*Q-$&(B|Dm@mqK#Sw>+t8t3IJE6|PG8ZNYR54b0 zV=TKBP`khLpo3IJ25tH;ntFy*Hbxw)F5!hJaxuos5dSTE%)6ayLF9(h)(J&bBkBqN sZ^I7CRaVcTYrwIB54)H|WAr`iR7kN&PqKD2whar=*3eULg4(|PKY=H2<NyEw literal 0 HcmV?d00001 diff --git a/docs/img/lookahead.svg b/docs/img/lookahead.svg index 4962a48a6..b5c3df789 100644 --- a/docs/img/lookahead.svg +++ b/docs/img/lookahead.svg @@ -26,15 +26,15 @@ inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="0.94" - inkscape:cx="294.7319" + inkscape:cx="116.54041" inkscape:cy="45.708959" inkscape:document-units="px" inkscape:current-layer="layer1" showgrid="false" inkscape:window-width="1091" inkscape:window-height="588" - inkscape:window-x="107" - inkscape:window-y="116" + inkscape:window-x="149" + inkscape:window-y="422" inkscape:window-maximized="0" fit-margin-top="0" fit-margin-left="0" @@ -55,7 +55,7 @@ <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> + <dc:title /> </cc:Work> </rdf:RDF> </metadata> @@ -110,11 +110,27 @@ id="path3361-7" inkscape:connector-curvature="0" sodipodi:nodetypes="cccc" /> - <path - style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 262.35192,299.34775 0,54.25533" - id="path3412" - inkscape:connector-curvature="0" - sodipodi:nodetypes="cc" /> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11.25000095px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="200.77664" + y="286.52051" + id="text12656-9" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan5532" + x="200.77664" + y="286.52051">move 1</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:11.25000095px;line-height:125%;font-family:'DejaVu Sans';-inkscape-font-specification:'DejaVu Sans, Normal';text-align:start;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + x="280.5639" + y="255.66946" + id="text12656-9-3" + sodipodi:linespacing="125%"><tspan + sodipodi:role="line" + id="tspan5534" + x="280.5639" + y="255.66946">move 2</tspan></text> </g> </svg> diff --git a/docs/img/lookahead.svg.png b/docs/img/lookahead.svg.png index eb822746c0dc49948976f6a58741d9da8426e27f..b40e256ce455eb759218ae349476df12c8f8c504 100644 GIT binary patch delta 4124 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 a{~x*)=Bc?aZ5IFl002n`MNUMnLSTY4n#{NW delta 3260 zcmV;t3`6tOAp04R7YcI-1^@s6-EbNKks(Zf40uUIK~#90?cHgNRplMW@$WFh4vG}i zf*aPQC{c+Bh)97MTCLKwHAb6IB5Im6aY>sR`l6+Mp-oMVNv&wwsI}HwQ`@RFE!IIr zEG}T(C|DvW6)0|1%2Ht1`r?1C9L}7Xxp(gJoacFdpJc+!nS18`fqS2M&hI=6^v-a9 zU;{9zm*<O!1g}po&$}5o01T;NEg~X8=}iMW6}S+16KJk&IU*wAsI-CY2mBnk2H1@n zSP_vfRocML2i60R0Q-A!zKBRPS}J(#Nx=2Mgyides0S+|(xpmzpmzc{Vm(+;11loZ zt#TXKxxh%^_S7*&1R^5cD7S(9GH?}tus3x~Jy;QuZj_tBel_Qq8rb;U2u#8L?_)3w zI1lJ>U5NOplAByv`%wcMlRiKja4t5<BnCeQCId@d7b1SDCPUp<<@w^5^MSt+PvZ*E z4$N|0g!rr4239@Tcw7oR<hqCkTZTmhBE6DsV6VV#WDPCzTtx)&=!1=aUhcYokOte8 zd<=J8i1;bpz-|P-0c-|-iCq#lb#tyFf_TIj50pFwOm|&`_$l2$F2<H0oB+IsT@J1R zeh3_&bFLzSc*GbFlqiRlx)=^D!g?)xf!_mTQs2KFTl7W3)(3cj?yqJ-)&xB7x(M-8 z-X;F&z(U~d<m)d2#{nM!ze_!TP7y&IVvYyE{@!l^C%P^~{F81V&jFssep~McCSvQp zE&~3I^;S<#Jzfz(9Ab_KN)!`FucRB;G1xMM#{k!2`D<DSa6;;9jUotNtfL3A+ObI% zA{9wDu<L;5fUTLwT!QUl0I(%>ToFO|Vvh$(HUXnhhe9fpZXhQE({dhvGYJ@*b6gQY z_!JKu^b&Bk>mtN2Ex=%4bn-C-dl5BZ3tjXFT7e}w=PDuyTPYs6)^#BTQOaRsk4vNi zEx-l9y;!5#2bhEHxAi}47RwUgiJWs45rj?gz@eT2t^;mzU5NOj1^7eqaRIid_OHu4 zS3TIUT}t_{g&1tZIut{HfbEWJ5l^IhppR488%jOcaB1{FzGuk4Pa%@41$Y#=2OA;q zJ#1_4!KueI19x-ib}^uvTp?3DkgpxM4ET%dLc|X(z+>1DtsU4*tu2|yY)QVKrHCM0 ziU;zo0Dj`S2#LdY(2FfZv9CSQlRsjUaYTBQ&QOm6?#Ow}w}9DyImZ<dgh}y0_u7G( zu8R;qq#M}jz`&fxtjBVvEJXxi(&U2fX<Y&-Te^WAh~=<Z+sWVMK%)r4qtOFBTML|o zA`~e@x`BKRxEPzkRni1}9e6$GTtx)oQ9MwdmB2XHMM&|bx9xrfTdr_5@Gv%;YZ}(z zUYB#OB7*Q}^gwxkN-@Do*M&&2WiRos1g=j$KLUHRok{1RTcC&_G>Qkxw;0{%k}|Yp zzCM86;3(%Nha!ToC>|)^$Jl*|{@9hCNUm%TbOdl4@K0>x!xyo|U-Bp-2#ZD!RAw14 z#dQ%<Z0R0sGd8Ph8}NPXxAf`QWP&C-XLE`O!l9)JD_6>YVV`zgi1^_QU=^KXgEnk$ z_^hu157fITX^77Ox416CGyPEGDm_T|Ko7^Z#@L&A%qHNloO6}IhC}f{<vOr&<0D)b zBE^;Nt-cD32j&9zV;Sox;8wcc(ZIKepf47K{L6JA4K@n63V1)~dx{5o?@3?=`sE~L zx)9r<dnfjPW;}o`ZZSCLv0q8P=ach*Z@MnRfzM#SDDx;D=)G~kFI*QP#g)xl7h!M4 zu~;my4%pDexjse&ZN!-yufuw(V}Um^-_zuR-dlxcbV;3Dj9qT~<bKx$I5ZMlSUpWk z6ISm&Y;6LOPFjE)fiH0An`|hD_HI|xdC5ZGda#3ku_0)&`T*<6PQ@k^fF>8zLTR|x zTGxe0@w8xjalMv0wiDY;wxomnn<Kt8u+uo$u*B+CtjDzsYg82vRIeRa2;Awq5D7~g z_TuuzEx@N;7f}FL0+*n8pq8Gc^Zg8wPQ$DQ0t>JOKT5kBTnt>DbFOba*rS2Xu8Syu zd$CD>A~R7uP%A62p>86F$TqNd0TY4W0Hc#*tFisJvV3Y_N01+L#ArXZOYj0TezR7z z%YpQ00M-cg2TlY2oE&e$mMhFQrc<#?BOhEw{=Q<dY63O_m%A<`5QDKL3`Gu+?!orM zmR{S9O_wcYN&~Up>b}gmKJ{Ry1JAfFqCgIR0FPiZyrg<Nuq%VSt(7EV=>~Qy@GdY9 z*n>5&&A^YyU(~{<26hPc_mhJ<To(|SCD^PukxyhZ*m>Aeg-fx}els@L`rA3@`mz?m ziNIT~i;&<chm}sULreaFO{biWT|TbI?lkYoIoFpSY#X*Hhe$oWOxNo@NTjk2>@4hm z#?@cTIM<g3b~5lQ*F{M1_F)m*v2?wDheRfOiT?vE7PuRW2D*y?e255|uwMe&H%S_y z9cXo3gcL`%ft;Fre1MIGeFykyaxBY-9_(4b>#mECXgq;(SV_t2fvy6+i(Tr>15Ux; zQ3S0hf0f2rk1h9E^ea1Qkgi?`Ex<*8*edrkuytaye256tgOx^m1>4_Fq*DWVEHEEi z)@~s-P4-maOF8Ejy$4&GII-V#Arci0*OE_U8`uYdvw>@X6R@bDtNp8r-oT!VtrjKH zNKau`eImJAbnh(l+@ePWt=P&@B8{{K7=%qRFZaD9fyy?JmAoK|-h({}&EOJ$H=e~d z*p$ds(*rGX13MJ!Nr<?h99Dqp8rUL71k=&#S>n#~z$Dj2h<l;-U}s`C8$?{#gRS0n zr0YV&txy}-k=SfB5m%nXe$h+BLW~HGLVItCd&*%Y$R2DPiU-8K)!5cc60r~)*lGB) zSD1ut4K@=}A{AmpFc8@8x(E?}6ca=*v>xm!z*^Tuh$I$ck(ETMng;ej@@G>m3aJro z4<kkL9xwvv>$(tequNXSqV-}Y0?S<&A(HX}_PUe^RolQ8DTi&wdeeCuG>W*Q95!Mh z^<c+iiyey;$x`yST#^Wc)WEi3Hx)#RWGD7MIox$2(s&_71mm#%#6*gJ=4osJB8f~W zJ=g)jE)I@t5GfMvHXEr>8rUhobFPaJ>B6hn2AmR^P$Gg>wEln;*M49lw$GhJB$OWP z@z|d9B1P4Xbp#|LAvCbVfR7#5Akq_!hmBAzA_CV9><nOu;~GSI@(yq;#fa3TL2A*1 zb^U^wf%e}LKfHo&c10zBgot1`@S)=xM9QI<ATqv31f#IKvm!ot3QahOitiD@EVMkK z_+uN;4;bXS5NQnGBZ8@Df`RzuS+w{|G<=T;`U5*0KEFt%l*2~E=ZN4mY*RTApS*|` z;EsmR5kV_jo>2U=7n>M!wCh5o{(O!ICIBxvdTx<wECyz}E<);m&)0~c8Ef44Ie2c7 zYAJ_}gs&07Il$i?Jg-PCtN~7TU4+!1uMt5j8viPOTLX-BU4+z^uMxpm;0*`QD^e?p z2_oQQL@)r2eHH&LM(e`{&&P;h8nCRv&nZ%CA7Tp?^><x})Q^u5fwqT{P&@}ra$SVf zkB<?-XtaWsgrOaOyCRc7HC1{3Bfuu$wJLtbAS$~|I)cV;5i<nn+u-M{)L~Ti%kEq( z%YMB+<>VSh^{=^lYQk!4<nvX!)qFGde_dpKvG+`o^{2k8n(YQ|XsPmtJPwQp&aUET z^ro>qqKfD1jV)CEMrgG4SSDVs6S05$Mvf=mO7SO$Y{RC1vliKQV2|q}dawiNa9u<X zYF*<X;5OiN;Bsucc8S!PXt29Tt(=Bk4c<rbd+#D5-k1x#3(Rp{h=@on%>k}<^xTI7 z4`Pc><z5ZC-Vs(rq+Hhm_hya_2Szl$6ea>M1MdM-fHxh~AR<yTHvkWn`PgCDkj|18 z;JD<^JfFgUdZgu=2V7La<3&UY>wMrp*a(Vs9Nf+1W?*6R`El52p9R3%*yx{!fwO>B z$+35VGg3eI4D4?II&8@4pQx;%6%h$SUJo{}fxRjDdN?*Ec?B>sIrcLwHw9bQWG!$- z@^v%t0B~!q3RVUyBB3cYkRM?=>0`hL$+5-2XOqu=Cu32<N^C6uS-?`@^R+6Z+KC1t zB1My)ytE683QBfkJy(EZuukUu%=yb}Rfrl`5%EQ>7ngcF`Ew3+nsug#Ktz1;4loXz zH8rLNKko%>c-0-)^!q-*sle<S{A@rCtcdvIQEdH_yMW&&$2I{QlFvKnytc+V;QiFs u|HVcp6oB=JXJa?FR$@`YL%@->D)|3{>{O2?z;~?x0000<MNUMnLSTZ+>;M}8 diff --git a/docs/img/trapezoids.svg b/docs/img/trapezoids.svg index b4ff5faf8..541309c46 100644 --- a/docs/img/trapezoids.svg +++ b/docs/img/trapezoids.svg @@ -25,9 +25,9 @@ borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" - inkscape:zoom="0.94" - inkscape:cx="294.7319" - inkscape:cy="45.708959" + inkscape:zoom="2.67" + inkscape:cx="164.48301" + inkscape:cy="76.011989" inkscape:document-units="px" inkscape:current-layer="layer1" showgrid="false" @@ -55,7 +55,7 @@ <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - <dc:title></dc:title> + <dc:title /> </cc:Work> </rdf:RDF> </metadata> @@ -106,7 +106,7 @@ sodipodi:nodetypes="cccc" /> <path style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.7558428px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 263.83557,321.45597 11.41184,-61.95224 59.85662,0 9.80496,28.97352" + d="m 263.83557,321.45597 11.41184,-61.95224 59.85662,0 9.80496,29.88826" id="path3361-7" inkscape:connector-curvature="0" sodipodi:nodetypes="cccc" /> @@ -118,19 +118,22 @@ sodipodi:nodetypes="ccc" /> <path style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 264.47958,319.56052 0,31.9149" + d="m 263.86975,321.69491 0.37453,30.52957" id="path3412" - inkscape:connector-curvature="0" /> + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" /> <path style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 343.73491,288.70946 1.06383,62.76596" + d="m 345.25947,289.31929 0.14909,62.46104" id="path3414" - inkscape:connector-curvature="0" /> + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" /> <path style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" - d="m 222.45831,289.77329 1.06383,61.70213" + d="m 222.45831,289.77329 -0.0598,62.07666" id="path3416" - inkscape:connector-curvature="0" /> + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" /> <text xml:space="preserve" style="font-style:normal;font-weight:normal;font-size:20.00000119px;line-height:125%;font-family:'DejaVu Sans';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;-inkscape-font-specification:'DejaVu Sans, Normal';font-stretch:normal;font-variant:normal;text-anchor:start;text-align:start;writing-mode:lr;" diff --git a/docs/img/trapezoids.svg.png b/docs/img/trapezoids.svg.png index 891a4715390430e0f698e10a390fd9a0f1810519..b9f1090dab5de2e1c977d33f080f6f4368720ed5 100644 GIT binary patch delta 4546 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 delta 4682 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 KS=O23lKu~vVZc=Y