Java StarLogo 2.0 english `turtle` to move :meanDist :stdDevDist :windXOffset :windYOffset :distanceScale ;------------------------------------------------------------------------------- ; Instead of taking two simple steps - one for winged flight, and one for wind - ; we can calculate the vector sum, and travel the resultant in one step. This ; is less confusing, visually; as it turns out, it also executes much faster ; than we might expect. ;------------------------------------------------------------------------------- let [:randDirection random 360] let [:randDistance (max 0 (:meanDist + random-gaussian :stdDevDist))] let [:targetX (xcor + ((:randDistance * sin :randDirection) + :windXOffset) / :distanceScale)] let [:targetY (ycor + ((:randDistance * cos :randDirection) + :windYOffset) / :distanceScale)] setheading towards :targetX :targetY forward distance :targetX :targetY setheading :randDirection end to emerge ;-------------------------------------------------------------------------------- ; When the beetle emerges from the tree (or is dropped into the system ; initially), display it with the built-in termite-shape, color it red, and turn ; it in a random direction. ;-------------------------------------------------------------------------------- setshape termite-shape setcolor beetleColor setheading random 360 end `observer` globals [ distanceScale meanFlyingDistance stdDevFlyingDistance gestationPeriod currentWeek minSuccessfulWeakAttack minSuccessfulHealthyAttack eggsPerPair beetlesInForest beetleColor windXOffset windYOffset ] patches-own [ healthyTrees weakTrees infestedHealthyTrees infestedWeakTrees healthyInfestation weakInfestation deadTrees ] to emergeInitial :beetlesToEmerge let [:xCoord 0] let [:yCoord 0] let [:cornerSelector 0] let [:cornerSpaces screen-half-width + screen-half-height] ;------------------------------------------------------------------------------ ; Bring in the "seed" beetles from a corner or side, based on prevailing winds. ;------------------------------------------------------------------------------ case prevailingWind [ 0 [ set :ycoord (0 - screen-half-height) set :xcoord (screen-half-width - (random screen-width)) ] 1 [ set :cornerSelector random :cornerSpaces ifelse (:cornerSelector < screen-half-width) [ set :ycoord (0 - screen-half-height) set :xcoord (:cornerSelector - screen-half-width) ] [ set :ycoord (:cornerSelector - :cornerSpaces) set :xcoord (0 - screen-half-width) ] ] 2 [ set :ycoord (screen-half-height - (random screen-height)) set :xcoord (0 - screen-half-width) ] 3 [ set :cornerSelector random :cornerSpaces ifelse (:cornerSelector < screen-half-width) [ set :ycoord (screen-half-height) set :xcoord (:cornerSelector - screen-half-width) ] [ set :ycoord (:cornerSelector - screen-half-width) set :xcoord (0 - screen-half-width) ] ] 4 [ set :ycoord screen-half-height set :xcoord (screen-half-width - (random screen-width)) ] 5 [ set :cornerSelector random :cornerSpaces ifelse (:cornerSelector < screen-half-width) [ set :ycoord (screen-half-height) set :xcoord (:cornerSelector + 1) ] [ set :ycoord (:cornerSelector - screen-half-width) set :xcoord (screen-half-width) ] ] 6 [ set :ycoord (screen-half-height - (random screen-height)) set :xcoord screen-half-width ] 7 [ set :cornerSelector random :cornerSpaces ifelse (:cornerSelector < screen-half-width) [ set :ycoord (0 - screen-half-height) set :xcoord (:cornerSelector + 1) ] [ set :ycoord (:cornerSelector - :cornerSpaces) set :xcoord (screen-half-width) ] ] ] ask-patch-at :xcoord :ycoord [ dotimes [:dummyCounter :beetlesToEmerge] [ sprout [emerge] ] ] end to emergeFromTrees :gestation ask-patches [ let [:beetlesToAdd 0] ;------------------------------------------------------------- ; Check to see if there are beetles ready to emerge this week. ;------------------------------------------------------------- if (not empty? infestedHealthyTrees) and ((length infestedHealthyTrees) >= :gestation) [ set :beetlesToAdd ((last weakInfestation) + (last healthyInfestation)) ; Check to see if the number of beetles is non-zero if (:beetlesToAdd > 0) [ ; Turn infested trees into dead trees set deadTrees (deadTrees + (last infestedHealthyTrees) + (last infestedWeakTrees)) ; Compute the number of beetles to emerge dotimes [:dummyCounter :beetlesToAdd] [ sprout [emerge] ] ] ; Drop the emerging generation from the calendar set infestedHealthyTrees (butlast infestedHealthyTrees) set infestedWeakTrees (butlast infestedWeakTrees) set healthyInfestation (butlast healthyInfestation) set weakInfestation (butlast weakInfestation) ] ] end to infestTrees ask-patches [ let [:attacks 0] let [:healthyAttacks 0] let [:weakAttacks 0] let [:beetles count-turtles-here] let [:avgPairs 0] let [:newHealthyInfestations 0] let [:newWeakInfestations 0] let [:newHealthyInfestationPairs 0] let [:newWeakInfestationPairs 0] ;--------------------------------------------------- ; Check to see if there are any beetles in the area. ;--------------------------------------------------- ifelse (:beetles > 0) [ ifelse (weakTrees + healthyTrees < :beetles / 2) [ set :attacks (weakTrees + healthyTrees) ] [ set :attacks (int (:beetles / 2)) ] set :healthyAttacks (int (:attacks * healthyTrees / (healthyTrees + weakTrees))) set :weakAttacks (:attacks - :healthyAttacks) set :avgPairs (:beetles / (2 * :attacks)) ;------------------------------------------------------------------------------- ; Check the number of pairs of beetles against the thresholds for attacking weak ; and healthy trees. ;------------------------------------------------------------------------------- ifelse (:avgPairs <= (minSuccessfulWeakAttack - 1)) [ set :newHealthyInfestations 0 set :newHealthyInfestationPairs 0 set :newWeakInfestations 0 set :newWeakInfestationPairs 0 ] [ ifelse (:avgPairs < minSuccessfulWeakAttack) [ set :newHealthyInfestations 0 set :newHealthyInfestationPairs 0 set :newWeakInfestations (int (:weakAttacks * (:avgPairs - int :avgPairs))) set :newWeakInfestationPairs minSuccessfulWeakAttack * :newWeakInfestations ] [ ifelse (:avgPairs <= (minSuccessfulHealthyAttack - 1)) [ set :newHealthyInfestations 0 set :newHealthyInfestationPairs 0 set :newWeakInfestations :weakAttacks set :newWeakInfestationPairs (int (:weakAttacks * :avgPairs)) ] [ ifelse (:avgPairs < minSuccessfulHealthyAttack) [ set :newHealthyInfestations (int (:healthyAttacks * (:avgPairs - int :avgPairs))) set :newHealthyInfestationPairs minSuccessfulHealthyAttack * :newHealthyInfestations set :newWeakInfestations :weakAttacks set :newWeakInfestationPairs (int (:weakAttacks * :avgPairs)) ] [ set :newHealthyInfestations :healthyAttacks set :newHealthyInfestationPairs (int (:healthyAttacks * :avgPairs)) set :newWeakInfestations :weakAttacks set :newWeakInfestationPairs (int (:weakAttacks * :avgPairs)) ] ] ] ] ;--------------------------------------------------------------------- ; Put the eggs in the galleries, by "scheduling" the future emergence. ;--------------------------------------------------------------------- set infestedHealthyTrees (fput :newHealthyInfestations infestedHealthyTrees) set healthyTrees (healthyTrees - :newHealthyInfestations) set infestedWeakTrees (fput :newWeakInfestations infestedWeakTrees) set weakTrees (weakTrees - :newWeakInfestations) set healthyInfestation (fput (:newHealthyInfestationPairs * 75) healthyInfestation) set weakInfestation (fput (:newWeakInfestationPairs * 75) weakInfestation) ] [ set infestedHealthyTrees (fput 0 infestedHealthyTrees) set infestedWeakTrees (fput 0 infestedWeakTrees) set healthyInfestation (fput 0 healthyInfestation) set weakInfestation (fput 0 weakInfestation) ] ] end to iterate ;-------------------------------------------------------------------------- ; Follow an iterative cycle of emergence, movement, and attack/infestation. ;-------------------------------------------------------------------------- set currentWeek (currentWeek + 1) if (currentWeek <= initEmergenceWeeks) [ dotimes [:emergencePoint initEmergencePoints] [emergeInitial initBeetles] ] emergeFromTrees gestationPeriod ask-turtles [move meanFlyingDistance stdDevFlyingDistance windXOffset windYOffset distanceScale] infestTrees ask-turtles [die] ask-patches [ ifelse (deadTrees > (healthyTrees + weakTrees)) [ scale-pc brown deadTrees (deadTrees + healthyTrees + weakTrees) (-20) ] [ scale-pc green (healthyTrees + (weakTrees / 2)) 140 (-10) ] ] end to initializeGlobals set distanceScale 100 set meanFlyingDistance 250 set stdDevFlyingDistance 50 set gestationPeriod 26 set currentWeek 0 set minSuccessfulWeakAttack 1 set minSuccessfulHealthyAttack 100 set eggsPerPair 75 set beetleColor red case prevailingWind [ 0 [ set windXOffset 0 set windYOffset avgWind ] 1 [ set windXOffset avgWind * sin 45 set windYOffset avgWind * sin 45 ] 2 [ set windXOffset avgWind set windYOffset 0 ] 3 [ set windXOffset avgWind * sin 45 set windYOffset avgWind * sin -45 ] 4 [ set windXOffset 0 set windYOffset (0 - avgWind) ] 5 [ set windXOffset avgWind * sin -45 set windYOffset avgWind * sin -45 ] 6 [ set windXOffset (0 - avgWind) set windYOffset 0 ] 7 [ set windXOffset avgWind * sin -45 set windYOffset avgWind * sin 45 ] ] end to startup ;---------------------- ; Set up the ecosystem. ;---------------------- clearall initializeGlobals ask-patches [ ;--------------------------------------------------------------------------------- ; For simplicity's sake, we're going to use a normal distribution for tree counts, ; but scale it so that the standard deviation is the square root of the average. ;--------------------------------------------------------------------------------- ifelse (avgHealthy > 0) [ set healthyTrees (max 0 ((random-gaussian (sqrt avgHealthy)) + avgHealthy)) ] [ set healthyTrees 0 ] ifelse (avgWeak > 0) [ set weakTrees (max 0 ((random-gaussian (sqrt avgHealthy)) + avgWeak)) ] [ set weakTrees 0 ] set infestedHealthyTrees [] set infestedWeakTrees [] set healthyInfestation [] set weakInfestation [] set deadTrees 0 scale-pc green (healthyTrees + (weakTrees / 2)) 140 (-10) ] end `information` `interface` SLCanvas top-left 20 270 SLTextWidget top-left 300 20 width-height 235 25 textwidth 231 linenums 1 words "0=N, 1=NE, 2=E, 3=SE, 4=S, 5=SW, 6=W, 7=NW " drawBorder false textwidget-number 1 SLSlider top-left 230 20 width-height 230 25 name "Initial Emergence Weeks" variable "initEmergenceWeeks" min-value 0 max-value 52 current-value 26 slider-number 6 show-name? true SLSlider top-left 330 20 width-height 230 25 name "Average Wind Speed" variable "avgWind" min-value 0 max-value 500 current-value 400 slider-number 8 show-name? true SLSlider top-left 280 20 width-height 230 25 name "Prevailing Wind Direction (Towards)" variable "prevailingWind" min-value 0 max-value 8 current-value 7 slider-number 7 show-name? true SLSlider top-left 130 20 width-height 230 25 name "Beetles in Initial Emergence Points" variable "initBeetles" min-value 0 max-value 200 current-value 10 slider-number 4 show-name? true SLMonitor top-left 430 80 width-height 111 36 name "Week" list-to-run "currentWeek" digits 0 delay 1.0 monitor-number 1 show-name? true whichip 10 onewhichip 11 SLSlider top-left 80 20 width-height 230 25 name "Average # of Weak Trees per Hectare" variable "avgWeak" min-value 0 max-value 50 current-value 10 slider-number 3 show-name? true SLSlider top-left 180 20 width-height 230 25 name "Initial Emergence Points" variable "initEmergencePoints" min-value 0 max-value 100 current-value 1 slider-number 5 show-name? true SLSlider top-left 30 20 width-height 230 25 name "Average # of Healthy Trees per Hectare" variable "avgHealthy" min-value 0 max-value 50 current-value 25 slider-number 2 show-name? true SLButton turtle-or-observer? observer top-left 380 140 width-height 110 30 name "Go!" line-to-run "iterate" forever? true button-number 2 show-name? true whichip 8 SLButton turtle-or-observer? observer top-left 380 20 width-height 110 30 name "Initialize" line-to-run "startup" forever? false button-number 1 show-name? true whichip 9 `turtle shapes` H4sIAAAAAAAAAO3c2bIkR33A4UJsAgTCeDfGlPG+CEsz0kjyeq64cXDrCwcXkuyx RQQgLIkg7Kt+UD8Ab2FThU73TOp0V3VXZuX2fRHuX3TNqc7Kmpozi8V/ePmdj3/2 4cc/ejp+9P67P3360Tt3Lw737ubXl37146/MPz4d+Mwv/++zv/y/F49fQs8O08v/ /VLY8Ni5r4t1/jWf/dDnbT1/7eds3UeB+//6r74tAAD9eWF+vfbPESX02j+jpVp3 7+vYa/1zn7t2/VuvK/XPYa7riPXzsNe61u97/a3r3nodsdeNdR1rr2/p/AI7DsPn BgAAAAAAAACgBb/63xEV8t8kaAdd+prc12f/++639fth//bf0v6vvd7Y+899v3rb f8p7uUftv6/nIfUaufeXe/+l3Y/c99z+7d/+7d/+7d/+7b/1/efeb+77kXt/e+8/ 935y34/c1597/9fej9j3b+v69q96sZ8ZXvrov3727oen8aHzmEDjQ7l3KORR1Uwd jA8FgI69kP3PIqqqqrp/B+NDAQAAAAAAAKAhL2b/bxFUVVVVVVVVVVVVVVVVVVV1 e4dpINBLP3364Ucf/OQ4PvSFaU6g8aHcO0wvDz1CDzxOF7/u2vMjPuabrj/2+bde 79r7eev1Xvhx40MBoFsvzK9b/oy09c9cude/9c9qt65f+vm99dpzYn+e9ctef+tn tLZ+7K8vbf2t97PC80fjQwEAAAAAAACgFS/Or1v+W42lbv2M1Ndn//bf8/5Tr597 /9a3vvXTfg9R1Tqbeo3Sr8/+7d/+7d/+7d/+999f7ffH/u3f/tNdn/3bv/3n2//W z7C+9a1f9PqfHb768dMPf/zDj58e54d+tsn5oXcvH57rtT9e+/obHKaXrc/imud7 j/OfdenHLn3ell93ude/8f6ZHwqF2vp7R8G/96xi/4cHm+o8enX9/NDeG+vParHX TX0dudfPff9zrP+sLefGuK4cP/8l7X/tfYi1zq17uKS2n3/r7/L8jeaHAgAAcM65 /1/DXv8/h9zrQ89y//rLvT70bOnXX+xfj3uvBwDQvvTzQ1W13279jNzXn2vftd6H 1Gvk3p/927/9738fcu8n133Iff327/l/6FrOybl2Cfdpj/3n/vm3/773f0nOtUu4 Pz38/Oe4D7n3k+s+5L7+c9e01p5rxVrTz3/+fdd6H1KvkXt/9m//9m//e9+H3PvJ dR92uM7PDd+4nx/68w8++PfjENHPXRwieve9H1zskq3n3yr3EM/c629wmF4eekAv WfOAbzn/oV9k16675ppu+cVd8vo33r9VQ0SXfm2n/rXf+/r0yRDNw3Pd+/zcDBFl H+uGiG618S823a+/5s+It/6ZsZb1115HqnVzrP+sLefGuK4cP/8l7X/tfYi1zq17 uKS2n3/r7/L8jTGGiG79u3Ltf9e2f/vP2dzsv+/9AwDtyz3EK/f60LPcv/5yrw89 M0QUAKB2cYaI5pbiv7m4prnZv/3nbG72n3f/z3aPe13CPu3f/u3f/ve6D7n3k+s+ 5L7+XPsu+T5cknPtEu7THvvP/fNv/33v/5Kca5dwf3r4+c9xH3LvJ9d9yH39565p rT3XirVmCT/vNTwHe+y7tvtg//Zv//bf6/5T3Yfc+8l1H3a4zs8PL3347nvv/fDj 4/jQz18eH3r/n12+863n3p9z983hwa879/7+65c+51M9c97Z88+8j33+8euubHj+ 0ued+/pz7r7/i3VfeOX40EuPcvg1595f+ry11lzHnuff6pp7denrl/az8HXrxoeG vybvv0cE3ytuHvN37pm/8j8VP3cd5z7/3I9vXffc97Bb1//U11/540vrn72eSPu+ VjHrn7uOK3/c+hvXP/d79NLxK9e/9ff0a3/v33vda7//xLqupc+/9cdj7W+tT63z yZ+xjt34+VdfT7D+dmnGh97y16KHzt9q6fNjrXOta9Zfe6+u2Uvsn++t61nf+iWs n1qudZeu49yPx1rn1vVvvY5rPz/2c3Ht52+9no2fN8YYH3ov9t+ha7F6X+98+5M+ /G8oue/D6r+7XPvzedz3mUZ6LlL9HfBTXx/734o27v/Wv4OuPT/Zv5FF/je2ZPvP vc+N92FJrP1/6nO3Ptc77f+43sb7cPP133p+pH0f16vt10Hk/Z9T+v5TK+452Pvf 3nL/utjpOT9n8/4Tn5+a/a9s7P1H+vPdVva/svb/cHvZ/7n9xP56+3+usV2938J6 q9zXnfs+5L7eXPvPfZ2578Py59wFzb2v665nydr11n992p6u4y7o5a8/59b7t9/z cJfk+pc+Z/nr71atn3r/t15/LKv38f3/fb6Rv4/ntnrfK+9DK5b234ty9x1nfGju /4Ynd1PLtY9c+10S+7+RuXa93LZef2n7Sc3+0+9/62em/DnZ4/t4ifsv7fexvaX6 fbE0sfZp//b/UEtn//afsqWzf/tP2dLZf1/7XdLrvkP23+e+Q/YfZ/+l3K9br/vW /Zfy3MS+/qXPKe3XTezrr+XPC3vto7T7kHs/e92X3NeX6z7kvp5P+oXhaz96+h8f v/Jv7354HCD6henHzw4Q3eruX277yPvzbj2fmx2ml2cfnEsP+TW/IG79sbVrLV1v LT23/6X7E/HHVw0QpSy5vlfm+l4drrvX+ufW9XsV0I51A0S1rKb62jWflWP9h6S8 Z5fW3bqnpa/Z6xlSHT5x6ceedctn33L+ktbP3/n+jzEHiALAs3r/N7Re99/rv6H2 +m/IS/tudf9r993a/q/ddyv7v3XfrewfAAAAgNrEHSCqqqr6bJ8V47Ny7yfn/mu6 Dw/pYf+XpFgr937X7Dv1tZa+772usdR957i2kva99/5j34e9r7uU+5P7+nLtP/d1 qaqqarrees4le1xzjvWv1cr6W1nf+tavd/1bryPWuqWsv/Y6Uq2baP0vDi9/+MP/ fP/5CaJfnL4g2QTRc7b+L2X8L26SOUwvDz1Bl57SS0/emqf7mvMu/epYc17pvbTH pXsQ6cdNEG1I7u+Rub9X5/5fafpfiwL1MUG09K792mflXj/GdVx7ziUp112z/qXr iPlztfY6c66vZXXpx551y2ffcv6S1s/f+f6PJogCUIre/w3N/u8ebC96/zfl3icx 9j6RsvfJnCaUAgAAABCXCaKqqhqnWz/jISXsK/W+7f/8/ku+D7E/c40W933N/nPe h9Rr3KKFfW/Zf8r7sNe+Y+z/lvuw9/72vI8973/tfch9fbnvQ+7rUlVVzdFbz7lk j2vOsf61Wll/K+tb3/r1rn/rdcRat5T1115HqnUTrf/i8OWPfv7uT47DQ+f/KODm 4aF337n2jOfPO/bJuq9bOn728xd663mxeuv1Lwnv67n7/IzD9HLrQxrr4V76uqXj W7+J5HLr9V/787NwXhfDQ6/9tZRq3aXvgXuvn/o6Yt/3a783bl0/9vf2VOte+3tc qnVr/b24lj8DpFo/9fXcKte6n7qOhe+Tyb+PLny/3v79/IX5NfVfcHI3lGvdva9j rVru+7XXv3X9a8Vaf6tY9yu1XOvmXr+U+77Xc5D6+1fsdc9dx60/Hvv7XuTvc6Ph odRur78TlGbvvxOV4uq/G+70b197sf8r++Rya2P/l9u60vef+t/sSt1/Kf9Wm1ru f7O2/9vOu9Ve+127n73/fwK59x/uI9X3la2fX0uX5L6+Ur+vtNJQ7uux/316Tu7r sv+0XSv3debefyj3de+1zyW595Vr3+f0tt9Q7/sPbf33xOr/PdL+Lzb1+bnVv3/D Q7X+Lsl9fbn23er+t8p9/fafd/+13w/7b2s/re3/Wq3sP5bS978X+y9j/7ltvZ7a 939v6/XUtt9U7L/Pfd/rdd/3et2/577P/ff++17tf+5ZK/afe2u5D6n2Xer92Hu/ 9n/d/dj7/Ny1/8tSn5+7le//S8NLT3/yP//946fH8aFfmuYEHseH3v3zx/Nl3H3v /VUN3Z+/ZO35W9cPv+7W82Ptf/G+rrx/Zz/3/ufvxg6fjA+91rnHfO0vh6XjW9df +rzU61/7bWDp/K2fu2AeH/qpZ+R7P4jaJaWtv1Vr6+e+/6Wtf+31tbZ+7vtf2q// zd+nKl9/8/UWtn5vvR8fmtpOf6aJtn7sv0LWvv5Wra1/7fW1tv61al//2vNTX29p 68e+3tzrd2acxocu/pkh8t/N9/67/hL7t/+LLWSfufafm/3b/6Vu/nz7v9it19f6 9z/7t/+c3Sr1/reeb//2v+XzF9e3/4tdPN/3v6zdyv7t/1JTy33/7N/+LzW13vef mv3b/8Xav6p22vvxobXr/b8NsX/739LUn1/69dm//dv/7Z+fm/3b/5Zu/fzcSt9/ 6vtn//a/pamvv/f9p2b/9r+lWz8/t9z7T71+bvZv/ylbutT7L/3+5r5++7f/nPsH mvXl4cvvP/rg0XF46JefGx56/1V3r/z0uYZ6+fElS18XrrO47r9+98Gu/bqt5w+f DA8995vJ0m82rf742t90b/1Nee3Xb/3NfuX58/DQ0LXPsvOd7/x2z9+qtvWXzr+2 W6Vef+ufMbZ+nvXzrn8/PHTrn2Wc73znt3v+0tfH/rzc6197P5fEvv7Y6+f+POtn XX+chocuaf3Pwta3vvWtb33rW9/61re+9a1vfetbP/3nb2X/9n+ppX/+Vrmvb+v3 p9zf37ayf/vP2c3Xn/m/Xch9ffZv/ym7Ve7rt3/739Ktcl9/6/u/Hx6a+79Fsb71 rW9961vf+ta3vvWtb33rW9/65a+/9fNLvz77t/+e9791/dRKv/+p2b/9b2nv15ea /dv/ltbO/u1/S2tX+P6/Mrz03s/ee+9HT4/jQ7/y4PjQe3ffvNxzls479zmf+vHv /+L5Xvm5m8/fufduPS90w3mH6eXaxzLW49zKt4Gttt6/jT9/X39ofGgo1rN+q73X 3+vXfinrX/29de/vtdbPu7423dDe65W2fuzr2Sr9+g+PD439V5bcf2Uq7K9oxa0P 9Cv395/S1s/9+8/O649rxocuKe3Psnuz/7zNrfX9595f7vuT+/rtf1u3yn39qfe/ eZ2lf6ts/d8y7d/+7d/+7d/+e9y/qqqqVtclua8v9f6W5L5++9/WrXJff+79L2l9 f0vsP29zq3//68aH5v5vN5ZsvX77t/8tza31/W1l//a/pbVrfX8AAADAstb/fcC/ /9j/ltZu6/5Lvz+p92f/9n+puW28/peGF+e5oa+89mh+N1wYHUp3DtNL7l9iKfrQ L+M9z6+oq0aHAgAtWjc6VFXLanist/VVNUrHGKNDAQAAAAAAAIASxBkdqqqqqqqq qqoPNzyW+3rsX1VVVVVVVbXpfvU4OvTx/G4wOpSTw/RSyKMateGxvc+vqEaHAkC3 jA5VrbHhsd7WV9UoHY0OBQAAAAAAAIBWGB2qqqqqqqqqmrLhsdzXY/+qqqqqqqqq Tfdrx9Ghr8/vBqNDOTlML4U8qlEbHtv7/IpqdCgAdMvoUNUaGx7rbX1VjdLR6FAA AAAAAAAAaIXRoaqqqqqqqqopGx7LfT32r6qqqqqqqtp0Xz6ODn1jfjcYHcrJYXop 5FGN2vDY3udXVKNDAaBbRoeq1tjwWG/rq2qUjkaHAgAAAAAAAEArjA5VVVVVVVVV TdnwWO7rsX9VVVVVVVXVpvv14+jQJ/O7wehQTg7TSyGPatSGx/Y+v6IaHQoA3TI6 VLXGhsd6W19Vo3Q0OhQAAAAAAAAAWmF0qKqqqqqqqmrKhsdyX4/9q6qqqqqqqjbd XzuODn1zfjcYHcrJYXop5FGN2vDY3udXVKNDAaBbRoeq1tjwWG/rq2qUjkaHAgAA AAAAAEArjA5VVVVVVVVVTdnwWO7rsX9VVVVVVVXVpvuN4+jQt+Z3g9GhnByml0Ie 1agNj+19fkU1OhQAumV0qGqNDY/1tr6qRulodCgAAAAAAAAAtMLoUFVVVVVVVdWU DY/lvh77V1VVVVVVVW26v34cHfr2/G4wOpSTw/RSyKMateGxvc+vqEaHAkC3jA5V rbHhsd7WV9UoHY0OBQAAAAAAAIBWGB2qqqqqqqqqmrLhsdzXY/+qqqqqqqqqTfc3 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 XbDPdBUPFQAAFQ8V `template` null `settings` patch-size 32 num-shapes 64 screen-half-width 13 screen-half-height 13 interface-window-xcor -4 interface-window-ycor -4 interface-window-size 1230 903 output-window-xcor 0 output-window-ycor 0 output-window-width 646 output-window-height 200 info-window-xcor 0 info-window-ycor 0 info-window-width 500 info-window-height 400 control-center-xcor -4 control-center-ycor -4 control-center-width 1288 control-center-height 1032 turtle-command-center-height 150 observer-command-center-height 150 `string table` H4sIAAAAAAAAAGNgYGAAABzfRCEEAAAAAAAABA== `symbol table` H4sIAAAAAAAAAGNgYGAAABzfRCEEAAAAAAAABA== `double table` H4sIAAAAAAAAAFXNPQ6CQBBA4SkpTbCwsDDEGEMMURFFURnA0HgPe2sbL0RNu0fy CCTM28JpvrzJ/ohIoomM497dx4WvXr2l7XWNBUa4xTuucIcLnOIR57jBG+4xRv2a AZ3jGa848efxgDPMcIknrHn/Qsv/aGqWP7rycq/Bmv3D2vn/nzT/utZ6ALYIW8x0 AQAAAAABdA== `list table` H4sIAAAAAAAAAH1TOW7DQAzkHlpLsZMicRHkABJASJGjcZ8ylb7hwo/Ji1NlCA/h weYQQA2XhzjkUmZ2ZT+fbcJLZCV6Ej0TC7FCBsY0yXO4lJzMuEpbo61ks1vXgY88 O5cKvPYc4AYp7x2/vyRJTdXVH1zSL/lDp7curgV38g178E7AGbhID0v0EXwkN/JM 4k36vuPMEn2V9WOWRXo6g6yFpzHvSXiH7Rny0s3kE7ZXmD6g7+n7Yj87cr4JvuST 2Nee97gAL/LRr/vg53vgCJxYc4S8hZ36RC4j7UZb6ePzKb7K901qDBLX5zSJ1Tqr Pid4IeSh26XcnfW/CH/h/Pz784A78jkC1z5H4MbnCDyP/fA5/nM3/QNfOqSjHrs0 uY3+2A/frdlO/0X9Bq1RJnAIBAAAAAAECA== `bytecodes` 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 `observer world` H4sIAAAAAAAAAGWQTUsDMRCGZ6u22iiVIgg9+Rs8iSfFUhQPFnqo3poms2lompRk tqV/3ZOzWV0oLrxL8jyTjwlcL8IyYdxhvEskCRdP0H6P0N+6QHurDRLPT6Hr0Bta 8fgBerXbos+lIi9u7TnnEq60ZewVzpR0mOuGG5R+4g7Wm/GvZFrATSI9xt0/04GB wXpvG/wUow2a4QkIVcWInuaI63yx2431s0opTKms3Bzl+plIqlqewehIvqJ0tDq0 vgsCjUm8+1TayKAHgyUiOUxvfhIiH587Eg18CS7UVRcg9tbrz4+yTPl1+g34aoHI nXH4pznfnHvOqGjEH38vcqM5BafzAy3zSAeVAQAAAAABlQ== `patch world` H4sIAAAAAAAAAKWdf6hk51nHT/feyT17m3HP7Z25d+71dHIyd3acDsMwv38WGySU qLmlxca2iNJt9qYbE5PQ3LgG/2hBsUtRsFKpW3+ApVa7QksptcRFRCq0mBQUrCI2 pQiWUtpQKqhoMZ6z6bx78n3Od879zgaG3c3u5z5n3vd5n1/v877HK777qUunD1+J nj69dHry7vs899/Pepu/8vCT77v1++2nHn/y9Oqjl997chr/KfTOPfVw/Gvg3fX4 yRPvPb0S//6N3lbyb546eSL+Q8XbfPYV1Pdee+sHu38XxZ/iDz9b3t1XTi49fnrl 2be/7+Tk6VuSzl89ufTY8o+v8UqPPvHIydOnJ5cfePU/POftLP/mHSlgw3vdD3/i T97620unjz6ZPNCmdyH5ua/+nwXv/OWTS5eX7F1v+t4rX3z5630PPvHSS9995slb DxJ/zsU/P/5sFm6x3mviz7n4s5H85XLcbrN/+OKLX3vrOMUW4s9dmayP7DcfeeTy cx9NsfH39bYy2QDZX7///p/4m99PsT6VW0L2V2/e/Ms3/hWw5zPZCrL/cv36R7// Uyl2+9wrnGVDZN//8sv/9/42jPNrM9kI2OPN+Pt+6I9B7t2ZbA3l/sPOzoVfeizF FuPPj2Sy9dw52oo/FzLZBrLXrl374OY26EY220T2kVju9z6cYoP4s5PJtpD99o0b f/aDu+CZX5fJtpH931g3Cl8ENluvOsgandyNP6VMtovs7z700M88/84UW07mOJPt IfvheH6vfSvF7tF11M+do3269gd3IHeI7PXr13+v+KUUm6zBSiY7QvbpwaD3ha+n 2AM6R+NcvfLpM0+QNWvhMP78aCY7RfbL1679xrd+K8WG1ObM7kA35si+HNucB/op NrGxr89kF8Bam7PD9NkxHtUrvvY9ZL8af9/P/GuKrVLd8JH9ZDxHXy0Bm22fA2Q/ F+vVH7wHxjl7rErIvike5499KsXek+dTbrM3btz41P6vpdiI+oUQWeNTDqhORsje jG3dvfel2JDOUQ3Z33zhheff/GyKDegarCP78Vot+p0/SbFFatsbyL4YxxvD52B+ 713lU26zfxvr8yerKTbRydoqn3KbNX5/J8+nrJAb0Wfu5LIhtc/d3PmN6DrqIWvs VZnGG31kBZ0cIPtQvPa/+Y8pNvFH5VU+5Tb7rtinvOH+FLtL52iErFn7e3QNjpE1 +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 `turtle world` H4sIAAAAAAAAAE2Ouw7CMAxFr0QfCBATIwMDUwcGYGDkUxoaq6kUJVFiVPgaPhXc 8hB38TmSfWUsa75GtrRJrJjqM355oLDkWjbCJ+SXSKQFt5gF67nvdEssfkQ5eCAn skPeeOuj4BrZvRlpgflY/tc2lXXtexfE9siTUYEEK2S3902GSW/8+EeRzGfzgNKQ 0p1rRVbfP5+SYb4ATYOGr8sAAAAAAADL