<snapdata remixID="14546589"><project name="3d!" app="Snap! 11.0.4, https://snap.berkeley.edu" version="2"><notes></notes><thumbnail>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAYAAAB1ovlvAAAAAXNSR0IArs4c6QAAA4lJREFUeF7tkiFOnWEURO8naysQbwOVVU0FAk2wNc+xFZA1NdUsgYU0JPUkNbUEEiBpyGvCq+wCziOZTM7vv/nnnjlrv9/vx6+WwFprJR+3FDB5Ht5NATlDEwABBQTwfMoJKCBnaAIgoIAAnk85AQXkDE0ABBQQwPMpJ6CAnKEJgIACAng+5QQUkDM0ARBQQADPp5yAAnKGJgACCgjg+ZQTUEDO0ARAQAEBPJ9yAgrIGZoACCgggOdTTkABOUMTAAEFBPB8ygkoIGdoAiCggACeTzkBBeQMTQAEFBDA8yknoICcoQmAgAICeD7lBBSQMzQBEFBAAM+nnIACcoYmAAIKCOD5lBNQQM7QBEBAAQE8n3ICCsgZmgAIKCCA51NOQAE5QxMAAQUE8HzKCSggZ2gCIKCAAJ5POQEF5AxNAAQUEMDzKSeggJyhCYCAAgJ4PuUEFJAzNAEQUEAAz6ecgAJyhiYAAgoI4PmUE1BAztAEQEABATyfcgIKyBmaAAgoIIDnU05AATlDEwABBQTwfMoJKCBnaAIgoIAAnk85AQXkDE0ABBQQwPMpJ6CAnKEJgIACAnhv9XS3+zt3d0+z2byftdZb/SYiVwEjZvhf4v7+ac7Ovs3Dw4fZbl/m4uI8rOFh6yjgYXnitOPjy9ntPs3j4++Z+TW3t19xZnKAAoats91+n5ubzby+/pyrqy9zcvIxrOFh6yjgYXnitOfnP3N9/WOOjt7N6elnnJceoIDpC5X3U8DygdPPU8D0hcr7KWD5wOnnKWD6QuX9FLB84PTzFDB9ofJ+Clg+cPp5Cpi+UHk/BSwfOP08BUxfqLyfApYPnH6eAqYvVN5PAcsHTj9PAdMXKu+ngOUDp5+ngOkLlfdTwPKB089TwPSFyvspYPnA6ecpYPpC5f0UsHzg9PMUMH2h8n4KWD5w+nkKmL5QeT8FLB84/TwFTF+ovJ8Clg+cfp4Cpi9U3k8BywdOP08B0xcq76eA5QOnn6eA6QuV91PA8oHTz1PA9IXK+ylg+cDp5ylg+kLl/RSwfOD08xQwfaHyfgpYPnD6eQqYvlB5PwUsHzj9PAVMX6i8nwKWD5x+ngKmL1TeTwHLB04/TwHTFyrvp4DlA6efp4DpC5X3U8DygdPPU8D0hcr7KWD5wOnnKWD6QuX9FLB84PTzFDB9ofJ+Clg+cPp5Cpi+UHk/BSwfOP28dAH/AQqrBpdDNwgtAAAAAElFTkSuQmCC</thumbnail><scenes select="1"><scene name="3d!"><notes></notes><hidden></hidden><headers></headers><code></code><blocks><block-definition s="go to screen %&apos;#1&apos; %&apos;#2&apos;" type="command" category="pen"><header></header><code></code><translations></translations><inputs><input type="%n" initial="1">128</input><input type="%n" initial="1">128</input></inputs><script><block s="gotoXY"><block s="reportDifference"><block s="reportModulus"><block var="#1"/><l>256</l></block><l>128</l></block><block s="reportDifference"><block s="reportModulus"><block var="#2"/><l>256</l></block><l>128</l></block></block></script></block-definition><block-definition s="set color to %&apos;#1&apos;" type="command" category="pen"><header></header><code></code><translations></translations><inputs><input type="%n" initial="1">146</input></inputs><script><block s="doSetVar"><l>#1</l><block s="reportModulus"><block var="#1"/><l>256</l></block></block><block s="setPenColorDimension"><l><option>r-g-b(-a)</option></l><block s="reportNewList"><list><block s="reportVariadicProduct"><list><block s="reportMonadic"><l><option>floor</option></l><block s="reportQuotient"><block s="reportMonadic"><l><option>floor</option></l><block s="reportQuotient"><block var="#1"/><l>4</l></block></block><l>8</l></block></block><block s="reportPower"><l>2</l><l>5</l></block></list></block><block s="reportVariadicProduct"><list><block s="reportModulus"><block s="reportMonadic"><l><option>floor</option></l><block s="reportQuotient"><block var="#1"/><l>4</l></block></block><l>8</l></block><block s="reportPower"><l>2</l><l>5</l></block></list></block><block s="reportVariadicProduct"><list><block s="reportModulus"><block var="#1"/><l>4</l></block><block s="reportPower"><l>2</l><l>6</l></block></list></block></list></block></block></script></block-definition><block-definition s="draw pixel" type="command" category="pen"><header></header><code></code><translations></translations><inputs></inputs><script><block s="down"></block><block s="changeYPosition"><l>1</l></block><block s="up"></block><block s="changeYPosition"><l>-1</l></block></script></block-definition><block-definition s="draw sprite %&apos;#1&apos;" type="command" category="pen"><header></header><code></code><translations></translations><inputs><input type="%l" initial="1"></input></inputs><script><block s="doWarp"><script><custom-block s="%upvar for each %upvar of %l %ca"><l>y</l><l>row</l><block var="#1"/><script><custom-block s="%upvar for each %upvar of %l %ca"><l>x</l><l>pixel</l><block var="row"/><script><block s="doIf"><block s="reportNot"><block s="reportVariadicEquals"><list><block s="reportModulus"><block var="pixel"/><l>256</l></block><l>0</l></list></block></block><script><custom-block s="set color to %n"><block var="pixel"/></custom-block><custom-block s="draw pixel"></custom-block></script><list></list></block><block s="changeXPosition"><l>1</l></block></script></custom-block><block s="changeXPosition"><block s="reportVariadicProduct"><list><block s="reportDifference"><l></l><block s="reportListAttribute"><l><option>length</option></l><block var="row"/></block></block><l>1</l></list></block></block><block s="changeYPosition"><l>-1</l></block></script></custom-block></script></block></script></block-definition><block-definition s="$flash sort %&apos;data&apos; ordering with %&apos;function&apos;" type="reporter" category="lists"><comment x="0" y="0" w="161.14285714285708" collapsed="false">Reports a sorted version of the list in its first input slot, using the comparison function in the second input slot.  For a list of numbers, using &lt; as the comparison function will sort from low to high; using &gt; will sort from high to low.</comment><header></header><code></code><translations>ca:ordena _ segons criteri _&#xD;pl:$flash sortuj _ za pomocą _&#xD;</translations><inputs><input type="%l"></input><input type="%predRing"></input></inputs><script><block s="doReport"><block s="reportApplyExtension"><l>lst_sort(list, fn)</l><list><block var="data"/><block var="function"/></list></block></block></script></block-definition><block-definition s="$flash assoc %&apos;key&apos; %&apos;a-list&apos;" type="reporter" category="lists"><comment x="0" y="0" w="289.3333333333333" collapsed="false">The second input is an &quot;association list,&quot; a list of two-item lists.  Each of those smaller lists has a &quot;key&quot; as its first item and a &quot;value&quot; as its second.  ASSOC reports the first key-value pair in the association list whose key matches the first input.</comment><header></header><code></code><translations>ca:associació _ _&#xD;pl:$flash skojarz _ _&#xD;</translations><inputs><input type="%s"></input><input type="%l"></input></inputs><script><block s="doReport"><block s="reportAtomicFindFirst"><block s="reifyPredicate"><autolambda><block s="reportVariadicEquals"><list><block var="key"/><block s="reportListItem"><l>1</l><l/></block></list></block></autolambda><list></list></block><block var="a-list"/></block></block></script></block-definition><block-definition s="%&apos;#&apos; for each %&apos;item&apos; of %&apos;data&apos; %&apos;action&apos;" type="command" category="lists"><comment x="0" y="0" w="228.57142857142858" collapsed="false">This block carries out the given script for each item of the given list, like the primitive FOR EACH.&#xD;&#xD;What&apos;s different is that it provides the # variable, which will contain the item number in the list of each item in turn, 1 while processing item 1, and so on.</comment><header></header><code></code><translations>ca:_ per cada _ de _ _&#xD;pl:_ dla każdego _ z _ _&#xD;</translations><inputs><input type="%upvar"></input><input type="%upvar"></input><input type="%l"></input><input type="%ca"></input></inputs><script><block s="doForEach"><l>inner item</l><block var="data"/><script><block s="doSetVar"><l>item</l><block var="inner item"/></block><block s="doChangeVar"><l>#</l><l>1</l></block><block s="doRun"><block var="action"/><list></list></block></script></block></script></block-definition><block-definition s="☠︎ linked? %&apos;data&apos;" type="predicate" category="lists" helper="true"><header></header><code></code><translations></translations><inputs><input type="%l"></input></inputs><script><block s="doReport"><block s="reportApplyExtension"><l>lst_linked(list)</l><list><block var="data"/></list></block></block></script></block-definition><block-definition s="☠︎ link %&apos;data&apos;" type="reporter" category="lists" helper="true"><header></header><code></code><translations></translations><inputs><input type="%l"></input></inputs><script><block s="doIf"><block s="reportListIsEmpty"><block var="data"/></block><script><block s="doReport"><block var="data"/></block></script><list></list></block><block s="doReport"><block s="reportCONS"><block s="reportListItem"><l>1</l><block var="data"/></block><block s="reportCDR"><block var="data"/></block></block></block></script></block-definition><block-definition s="printable %&apos;data&apos;" type="reporter" category="lists"><comment x="0" y="0" w="188.66666666666666" collapsed="false">Takes a (possibly deep) list as input,&#xD;and reports a human-readable text form &#xD;of the list (namely, Lisp notation).&#xD;&#xD;Will not work on circular lists.</comment><header></header><code></code><translations>ca:notació textual de _&#xD;pl:tekstowa _&#xD;</translations><inputs><input type="%l"></input></inputs><script><block s="doIf"><block s="reportNot"><block s="reportIsA"><block var="data"/><l><option>list</option></l></block></block><script><block s="doReport"><block var="data"/></block></script><list></list></block><block s="doIf"><block s="reportListIsEmpty"><block var="data"/></block><script><block s="doReport"><l>()</l></block></script><list></list></block><block s="doReport"><block s="reportJoinWords"><list><l>(</l><block s="reportAtomicCombine"><block s="reportMap"><block s="reifyReporter"><autolambda><custom-block s="printable %l"><l/></custom-block></autolambda><list></list></block><block var="data"/></block><block s="reifyReporter"><autolambda><block s="reportJoinWords"><list><l></l><l> </l><l></l></list></block></autolambda><list></list></block></block><l>)</l></list></block></block></script></block-definition><block-definition s="sentence %&apos;phrase&apos;" type="reporter" category="lists"><comment x="0" y="0" w="302.6666666666667" collapsed="false">SENTENCE is the main constructor for sentences, represented&#xD;as lists of words.  It takes zero or more inputs, each of which can&#xD;be either a list or a text string.  If a list, the input is assumed to be&#xD;a list of words.  If a text string, it is converted to a list of words using&#xD;SENTENCE→LIST.  Then all the lists of words are appended to form a new list of words.&#xD;&#xD;If the inputs are lists of lists rather than lists of words, SENTENCE,&#xD;like APPEND, does only one level of flattening, reporting a list of&#xD;all the items of all the input lists.</comment><header></header><code></code><translations>ca:frase _&#xD;pl:zdanie _&#xD;</translations><inputs><input type="%mult%s"></input></inputs><script><block s="doReport"><block s="reportConcatenatedLists"><block s="reportMap"><block s="reifyReporter"><autolambda><block s="reportIfElse"><block s="reportIsA"><l></l><l><option>list</option></l></block><l></l><custom-block s="sentence $arrowRight list %txt"><l></l></custom-block></block></autolambda><list></list></block><block var="phrase"/></block></block></block></script></block-definition><block-definition s="$flash zip %&apos;lists&apos;" type="reporter" category="lists"><comment x="0" y="0" w="192" collapsed="false">ZIP takes any number of lists as inputs.  The lists should all be the same length.  ZIP reports a list of lists in which the first item is a list of all the first items, the second item is a list of all the second items, etc.&#xD;Viewing the inputs as the rows of a matrix, ZIP reports its transpose.</comment><header></header><code></code><translations>pl:$flash spakuj _&#xD;</translations><inputs><input type="%mult%l"></input></inputs><script><block s="doReport"><block s="reportListAttribute"><l><option>columns</option></l><block var="lists"/></block></block></script></block-definition><block-definition s="%&apos;x&apos;" type="reporter" category="lists"><comment x="0" y="0" w="105.33333333333333" collapsed="false">The identity function reports its input.</comment><header></header><code></code><translations></translations><inputs><input type="%s"></input></inputs><script><block s="doReport"><block var="x"/></block></script></block-definition><block-definition s="multimap %&apos;function&apos; over %&apos;lists&apos;" type="reporter" category="lists"><comment x="0" y="0" w="267.3333333333333" collapsed="false">Takes as input a function of N inputs and N lists.&#xD;The function is called with item 1 of all the lists as its inputs, with item 2 of all the lists as its inputs, and so on.  (The lists should all be the same length.)</comment><header></header><code></code><translations>ca:multi-mapeja _ sobre _&#xD;pl:mapuj wielokrotnie _ na _&#xD;</translations><inputs><input type="%repRing"></input><input type="%mult%l"></input></inputs><script><block s="doReport"><block s="reportMap"><block s="reifyReporter"><autolambda><block s="evaluate"><block var="function"/><custom-block s="%s"><l></l></custom-block></block></autolambda><list></list></block><custom-block s="$flash zip %mult%l"><block var="lists"/></custom-block></block></block></script></block-definition><block-definition s="sentence $arrowRight list %&apos;text&apos;" type="reporter" category="operators"><comment x="0" y="0" w="196" collapsed="false">Takes a sentence in text string form and reports the sentence as a list of its words.</comment><header></header><code></code><translations>de:Satz $arrowRight Liste _&#xD;ca:frase $arrowRight llista _&#xD;es:frase $arrowRight lista _&#xD;fr:phrase $arrowRight liste _&#xD;pt:uma lista com as palavras da frase _&#xD;pl:zdanie $arrowRight lista _&#xD;</translations><inputs><input type="%txt"></input></inputs><script><block s="doReport"><block s="reportAtomicKeep"><block s="reifyPredicate"><autolambda><block s="reportNot"><block s="reportVariadicEquals"><list><block s="reportTextAttribute"><l><option>length</option></l><l></l></block><l>0</l></list></block></block></autolambda><list></list></block><block s="reportTextSplit"><block var="text"/><l><option>whitespace</option></l></block></block></block></script></block-definition><block-definition s="play sound %&apos;#1&apos; using %&apos;#2&apos;" type="command" category="sound"><header></header><code></code><translations></translations><inputs><input type="%n" initial="1">44</input><input type="%n" initial="1">0</input></inputs><script><block s="stopFreq"></block><block s="doIf"><block s="reportNot"><block s="reportVariadicEquals"><list><block s="reportModulus"><block var="#1"/><l>256</l></block><l>0</l></list></block></block><script><block s="doSetInstrument"><block s="reportVariadicSum"><list><block s="reportModulus"><block var="#2"/><l>4</l></block><l>1</l></list></block></block><block s="playFreq"><block s="reportVariadicProduct"><list><block s="reportModulus"><block var="#1"/><l>256</l></block><l>10</l></list></block></block></script><list></list></block></script></block-definition><block-definition s="setting %&apos;which&apos;" type="reporter" category="sensing"><comment x="0" y="0" w="254.66666666666666" collapsed="false">Allows reading global settings programmatically.&#xD;&#xD;Eisenberg&apos;s Law:  Anything you can do from the user interface you should be able to do in your program, and vice versa.  This library is just a beginning; there are many UI controls outside of the Settings menu.</comment><header></header><code></code><translations>pt:o valor da configuração _&#xD;ca:paràmetre _&#xD;pl:ustawienie _&#xD;</translations><inputs><input type="%s" readonly="true"><options>Project notes&#xD;Project name&#xD;User&#xD;Presentation mode&#xD;Language&#xD;Zoom blocks&#xD;Stage size&#xD;Stage scale&#xD;Retina display support&#xD;Long form input dialog&#xD;Plain prototype labels&#xD;Input sliders&#xD;Execute on slider change&#xD;Clicking sound&#xD;Turbo mode&#xD;Flat design&#xD;Keyboard editing&#xD;Visible stepping&#xD;Thread safe scripts&#xD;Prefer smooth animations&#xD;Flat line ends&#xD;Codification support&#xD;Inheritance support&#xD;Hyper blocks support&#xD;Visible palette</options></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>which</l></list><l>var stage = this.parentThatIsA(StageMorph),&#xD;    ide = stage.parentThatIsA(IDE_Morph),&#xD;    world = stage.parentThatIsA(WorldMorph);&#xD;&#xD;switch (which) {&#xD;    case &apos;Project notes&apos;:&#xD;        return ide.projectNotes;&#xD;    case &apos;Project name&apos;:&#xD;        return ide.projectName;&#xD;    case &apos;User&apos;:&#xD;        return ide.cloud.username;&#xD;    case &apos;Presentation mode&apos;:&#xD;        return ide.isAppMode;&#xD;    case &apos;Language&apos;:&#xD;        return SnapTranslator.language;&#xD;    case &apos;Zoom blocks&apos;:&#xD;        return SyntaxElementMorph.prototype.scale;&#xD;    case &apos;Stage size&apos;:&#xD;        return new List([stage.dimensions.x, stage.dimensions.y]);&#xD;    case &apos;Stage scale&apos;:&#xD;       return stage.scale;&#xD;    case &apos;Retina display support&apos;:&#xD;        return isRetinaEnabled();&#xD;    case &apos;Long form input dialog&apos;:&#xD;        return InputSlotDialogMorph.prototype.isLaunchingExpanded;&#xD;    case &apos;Plain prototype labels&apos;:&#xD;        return BlockLabelPlaceHolderMorph.prototype.plainLabel;&#xD;    case &apos;Input sliders&apos;:&#xD;        return MorphicPreferences.useSliderForInput;&#xD;    case &apos;Execute on slider change&apos;:&#xD;        return ArgMorph.prototype.executeOnSliderEdit;&#xD;    case &apos;Clicking sound&apos;:&#xD;        return !!BlockMorph.prototype.snapSound;&#xD;    case &apos;Turbo mode&apos;:&#xD;        return stage.isFastTracked;&#xD;    case &apos;Flat design&apos;:&#xD;        return MorphicPreferences.isFlat;&#xD;    case &apos;Keyboard editing&apos;:&#xD;        return !!this.scripts.focus;&#xD;    case &apos;Visible stepping&apos;:&#xD;        return Process.prototype.enableSingleStepping;&#xD;    case &apos;Thread safe scripts&apos;:&#xD;        return stage.isThreadSafe;&#xD;    case &apos;Prefer smooth animations&apos;:&#xD;        return StageMorph.prototype.frameRate &gt; 0;&#xD;    case &apos;Flat line ends&apos;:&#xD;        return SpriteMorph.prototype.useFlatLineEnds;&#xD;    case &apos;Codification support&apos;:&#xD;        return StageMorph.prototype.enableCodeMapping;&#xD;    case &apos;Inheritance support&apos;:&#xD;        return StageMorph.prototype.enableInheritance;&#xD;    case &apos;Hyper blocks support&apos;:&#xD;        return Process.prototype.enableHyperOps;&#xD;    default: return which;&#xD;    case &apos;Visible palette&apos;:&#xD;        return ide.currentCategory;&#xD;}</l></block><list><block var="which"/></list></block></block></script></block-definition><block-definition s="set flag %&apos;which&apos; to %&apos;tf&apos;" type="command" category="sensing"><comment x="0" y="0" w="254.66666666666666" collapsed="false">Allows changing global settings programmatically.&#xD;This block is for Boolean (checkbox) settings; use&#xD;SET VALUE for numeric or text values.&#xD;&#xD;Eisenberg&apos;s Law:  Anything you can do from the user interface you should be able to do in your program, and vice versa.  This library is just a beginning; there are many UI controls outside of the Settings menu.</comment><header></header><code></code><translations>pt:altera o valor da configuração _ para _&#xD;ca:fixa el paràmetre _ a _&#xD;pl:ustaw flagę _ na _&#xD;</translations><inputs><input type="%s" readonly="true"><options>Presentation mode&#xD;Retina display support&#xD;Long form input dialog&#xD;Plain prototype labels&#xD;Input sliders&#xD;Execute on slider change&#xD;Clicking sound&#xD;Turbo mode&#xD;Flat design&#xD;Keyboard editing&#xD;Visible stepping&#xD;Thread safe scripts&#xD;Prefer smooth animations&#xD;Flat line ends&#xD;Codification support&#xD;Inheritance support&#xD;Hyper blocks support</options></input><input type="%b"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>which</l><l>tf</l></list><l>var   stage = this.parentThatIsA(StageMorph),&#xD;        ide = stage.parentThatIsA(IDE_Morph),&#xD;        world = stage.parentThatIsA(WorldMorph),&#xD;        thisObj = this;&#xD;&#xD;if (tf != !!tf) return;&#xD;&#xD;try{&#xD;ide.savingPreferences = false;&#xD;&#xD;switch (which) {&#xD;    case &apos;Presentation mode&apos;:&#xD;        if (tf != ide.isAppMode) ide.toggleAppMode();&#xD;        break;&#xD;    case &apos;Retina display support&apos;:&#xD;        if (tf != isRetinaEnabled()) ide.toggleRetina();&#xD;        break;&#xD;    case &apos;Long form input dialog&apos;:&#xD;        if (tf != InputSlotDialogMorph.prototype.isLaunchingExpanded)&#xD;            ide.toggleLongFormInputDialog();&#xD;        break;&#xD;    case &apos;Plain prototype labels&apos;:&#xD;        if (tf != BlockLabelPlaceHolderMorph.prototype.plainLabel)&#xD;            ide.togglePlainPrototypeLabels();&#xD;        break;&#xD;    case &apos;Input sliders&apos;:&#xD;        MorphicPreferences.useSliderForInput = tf;&#xD;        break;&#xD;    case &apos;Execute on slider change&apos;:&#xD;        ArgMorph.prototype.executeOnSliderEdit = tf;&#xD;        break;&#xD;    case &apos;Clicking sound&apos;:&#xD;        if (tf != !!BlockMorph.prototype.snapSound)&#xD;            BlockMorph.prototype.toggleSnapSound();&#xD;        break;&#xD;    case &apos;Turbo mode&apos;:&#xD;        if (tf != stage.isFastTracked)&#xD;            ide.toggleFastTracking();&#xD;        break;&#xD;    case &apos;Flat design&apos;:&#xD;        if (tf == MorphicPreferences.isFlat) break;&#xD;        if (tf)&#xD;            ide.flatDesign();&#xD;        else&#xD;            ide.defaultDesign();&#xD;        break;&#xD;    case &apos;Keyboard editing&apos;:&#xD;        if (thisObj.scripts.focus &amp;&amp; !tf) {&#xD;            thisObj.scripts.focus.stopEditing();&#xD;        } else if (tf &amp;&amp; !thisObj.scripts.focus) {&#xD;            thisObj.scripts.toggleKeyboardEntry();&#xD;        };&#xD;        break;&#xD;    case &apos;Visible stepping&apos;:&#xD;        if (tf != Process.prototype.enableSingleStepping)&#xD;            ide.toggleSingleStepping();&#xD;        break;&#xD;    case &apos;Thread safe scripts&apos;:&#xD;        stage.isThreadSafe = tf;&#xD;        break;&#xD;    case &apos;Prefer smooth animations&apos;:&#xD;        if (tf != (StageMorph.prototype.frameRate &gt; 0))&#xD;            ide.toggleVariableFrameRate();&#xD;        break;&#xD;    case &apos;Flat line ends&apos;:&#xD;        SpriteMorph.prototype.useFlatLineEnds = tf;&#xD;        break;&#xD;    case &apos;Codification support&apos;:&#xD;        if (tf != StageMorph.prototype.enableCodeMapping) {&#xD;            StageMorph.prototype.enableCodeMapping = tf;&#xD;            ide.currentSprite.blocksCache.variables = null;&#xD;            ide.currentSprite.paletteCache.variables = null;&#xD;            ide.refreshPalette();&#xD;        }&#xD;        break;&#xD;    case &apos;Inheritance support&apos;:&#xD;        if (tf != StageMorph.prototype.enableInheritance) {&#xD;            StageMorph.prototype.enableInheritance = tf;&#xD;            ide.currentSprite.blocksCache.variables = null;&#xD;            ide.currentSprite.paletteCache.variables = null;&#xD;            ide.refreshPalette();&#xD;        }&#xD;        break;&#xD;    case &apos;Hyper blocks support&apos;:&#xD;        Process.prototype.enableHyperOps = tf;&#xD;        break;&#xD;};&#xD;}&#xD;finally {&#xD;ide.savingPreferences = false;&#xD;};&#xD;</l></block><list><block var="which"/><block var="tf"/></list></block></script></block-definition><block-definition s="set value %&apos;which&apos; to %&apos;value&apos;" type="command" category="sensing"><comment x="0" y="0" w="254.66666666666666" collapsed="false">Allows changing global settings programmatically.&#xD;This block is for numeric or text settings; use&#xD;SET FLAG for Boolean (checkbox) values.&#xD;&#xD;Eisenberg&apos;s Law:  Anything you can do from the user interface you should be able to do in your program, and vice versa.  This library is just a beginning; there are many UI controls outside of the Settings menu.</comment><header></header><code></code><translations>pt:altera o valor da configuração _ para _&#xD;ca:fixa el valor de _ a _&#xD;pl:ustaw wartość _ na _&#xD;</translations><inputs><input type="%s" readonly="true"><options>Project notes&#xD;Project name&#xD;Language&#xD;Zoom blocks&#xD;Stage size&#xD;Stage scale&#xD;Visible palette</options></input><input type="%s"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>which</l><l>value</l></list><l>var   stage = this.parentThatIsA(StageMorph),&#xD;        ide = stage.parentThatIsA(IDE_Morph),&#xD;        world = stage.parentThatIsA(WorldMorph);&#xD;&#xD;try {&#xD;ide.savingPreferences = false;&#xD;&#xD;switch (which) {&#xD;    case &apos;Project notes&apos;:&#xD;        ide.projectNotes = value;&#xD;        break;&#xD;    case &apos;Project name&apos;:&#xD;        ide.setProjectName(value);&#xD;        break;&#xD;    case &apos;Language&apos;:&#xD;        ide.setLanguage(value);&#xD;        break;&#xD;    case &apos;Zoom blocks&apos;:&#xD;        if (!isNaN(value)) ide.setBlocksScale(Math.min(value, 12));&#xD;        break;&#xD;    case &apos;Stage size&apos;:&#xD;        if ((value instanceof List) &amp;&amp; value.length()==2&#xD;                       &amp;&amp; !isNaN(value.at(1)) &amp;&amp; !isNaN(value.at(2)))&#xD;            ide.setStageExtent(new Point(value.at(1), value.at(2)));&#xD;        break;&#xD;    case &apos;Stage scale&apos;:&#xD;        ide.toggleStageSize(value != 1, Math.max(0.1, value));&#xD;        break;&#xD;    case &apos;Visible palette&apos;:&#xD;        ide.currentCategory = value.toLowerCase();&#xD;        ide.categories.children.forEach(function (each) {&#xD;                each.refresh();&#xD;        });&#xD;        ide.refreshPalette(true);&#xD;        break;&#xD;};&#xD;}&#xD;finally {ide.savingPreferences = true;&#xD;};</l></block><list><block var="which"/><block var="value"/></list></block></script></block-definition><block-definition s="draw sprite %&apos;#1&apos; with shader %&apos;#2&apos;" type="command" category="pen"><header></header><code></code><translations></translations><inputs><input type="%l" initial="1"></input><input type="%repRing" initial="1"></input></inputs><script><block s="doDeclareVariables"><list><l>last pos</l><l>shader result</l></list></block><block s="doWarp"><script><custom-block s="%upvar for each %upvar of %l %ca"><l>y</l><l>row</l><block var="#1"/><script><custom-block s="%upvar for each %upvar of %l %ca"><l>x</l><l>pixel</l><block var="row"/><script><block s="doSetVar"><l>last pos</l><block s="getPosition"></block></block><block s="doWarp"><script><block s="doSetVar"><l>shader result</l><block s="evaluate"><block var="#2"/><list><block s="reportVariadicSum"><list><block s="xPosition"></block><l>128</l></list></block><block s="reportVariadicSum"><list><block s="yPosition"></block><l>128</l></list></block><block var="pixel"/></list></block></block></script></block><custom-block s="go to screen %n %n"><block s="reportListItem"><l>1</l><block var="shader result"/></block><block s="reportListItem"><l>2</l><block var="shader result"/></block></custom-block><block s="doIf"><block s="reportNot"><block s="reportVariadicEquals"><list><block s="reportModulus"><block s="reportListItem"><l>3</l><block var="shader result"/></block><l>256</l></block><l>0</l></list></block></block><script><custom-block s="set color to %n"><block s="reportListItem"><l>3</l><block var="shader result"/></block></custom-block><custom-block s="draw pixel"></custom-block></script><list></list></block><block s="doGotoObject"><block var="last pos"/></block><block s="changeXPosition"><l>1</l></block></script></custom-block><block s="changeXPosition"><block s="reportVariadicProduct"><list><block s="reportDifference"><l></l><block s="reportListAttribute"><l><option>length</option></l><block var="row"/></block></block><l>1</l></list></block></block><block s="changeYPosition"><l>-1</l></block></script></custom-block></script></block></script></block-definition><block-definition s="rotate %&apos;x&apos; %&apos;y&apos; by %&apos;angle&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%n" initial="1">0</input><input type="%n" initial="1">100</input><input type="%n" initial="1">45</input></inputs><script><block s="doWarp"><script><block s="doReport"><block s="reportVariadicSum"><list><block s="reportVariadicProduct"><list><block s="reportNewList"><list><block s="reportMonadic"><l><option>sin</option></l><block s="reportVariadicSum"><list><block var="angle"/><l>90</l></list></block></block><block s="reportMonadic"><l><option>cos</option></l><block s="reportVariadicSum"><list><block var="angle"/><l>90</l></list></block></block></list></block><block var="x"/></list></block><block s="reportVariadicProduct"><list><block s="reportNewList"><list><block s="reportMonadic"><l><option>sin</option></l><block var="angle"/></block><block s="reportMonadic"><l><option>cos</option></l><block var="angle"/></block></list></block><block var="y"/></list></block></list></block></block></script></block></script></block-definition><block-definition s="rotate 3d %&apos;x&apos; %&apos;y&apos; %&apos;z&apos; by %&apos;x rot&apos; %&apos;y rot&apos; %&apos;z rot&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%n" initial="1">0</input><input type="%n" initial="1">0</input><input type="%n" initial="1">0</input><input type="%n" initial="1">0</input><input type="%n" initial="1">0</input><input type="%n" initial="1">0</input></inputs><script><block s="doWarp"><script><block s="doReport"><block s="reportPipe"><block s="reportNewList"><list><block var="x"/><block var="y"/><block var="z"/></list></block><list><block s="reifyReporter"><autolambda><block s="reportNewList"><list><block s="reportListItem"><l>1</l><custom-block s="rotate %n %n by %n"><block s="reportListItem"><l>1</l><block var="#1"/></block><block s="reportListItem"><l>2</l><block var="#1"/></block><block var="z rot"/></custom-block></block><block s="reportListItem"><l>2</l><custom-block s="rotate %n %n by %n"><block s="reportListItem"><l>1</l><block var="#1"/></block><block s="reportListItem"><l>2</l><block var="#1"/></block><block var="z rot"/></custom-block></block><block s="reportListItem"><l>3</l><block var="#1"/></block></list></block></autolambda><list><l>#1</l></list></block><block s="reifyReporter"><autolambda><block s="reportNewList"><list><block s="reportListItem"><l>1</l><block var="#1"/></block><block s="reportListItem"><l>1</l><custom-block s="rotate %n %n by %n"><block s="reportListItem"><l>2</l><block var="#1"/></block><block s="reportListItem"><l>3</l><block var="#1"/></block><block var="x rot"/></custom-block></block><block s="reportListItem"><l>2</l><custom-block s="rotate %n %n by %n"><block s="reportListItem"><l>2</l><block var="#1"/></block><block s="reportListItem"><l>3</l><block var="#1"/></block><block var="x rot"/></custom-block></block></list></block></autolambda><list><l>#1</l></list></block><block s="reifyReporter"><autolambda><block s="reportNewList"><list><block s="reportListItem"><l>1</l><custom-block s="rotate %n %n by %n"><block s="reportListItem"><l>1</l><block var="#1"/></block><block s="reportListItem"><l>3</l><block var="#1"/></block><block var="y rot"/></custom-block></block><block s="reportListItem"><l>2</l><block var="#1"/></block><block s="reportListItem"><l>2</l><custom-block s="rotate %n %n by %n"><block s="reportListItem"><l>1</l><block var="#1"/></block><block s="reportListItem"><l>3</l><block var="#1"/></block><block var="y rot"/></custom-block></block></list></block></autolambda><list><l>#1</l></list></block></list></block></block></script></block></script></block-definition></blocks><primitives></primitives><stage name="Stage" width="256" height="256" costume="0" color="255,255,255,1" tempo="60" threadsafe="true" penlog="true" volume="100" pan="0" lines="flat" ternary="false" hyperops="true" codify="true" inheritance="true" sublistIDs="false" id="747"><pentrails>data:image/png;base64,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</pentrails><costumes><list struct="atomic" id="748"></list></costumes><sounds><list struct="atomic" id="749"></list></sounds><variables></variables><blocks></blocks><scripts></scripts><sprites select="1"><sprite name="Sprite" idx="1" x="-124.00000000000023" y="-134.0000000000001" heading="90" scale="1" volume="100" pan="0" rotation="1" instrument="1"  draggable="true" hidden="true" costume="0" color="0,0,64,1" pen="tip" id="754"><costumes><list struct="atomic" id="755"></list></costumes><sounds><list struct="atomic" id="756"></list></sounds><blocks></blocks><variables></variables><scripts><script x="27" y="10"><block s="receiveGo"></block><block s="gotoXY"><l>0</l><l>0</l></block><block s="setHeading"><l>90</l></block><block s="doResetTimer"></block><block s="hide"></block><block s="up"></block><block s="clear"></block><block s="doSetVar"><l>Frames</l><l>0</l></block><block s="doSetVar"><l>Ball x</l><l>0</l></block><block s="doSetVar"><l>Ball y</l><l>0</l></block><block s="doSetVar"><l>Ball z</l><l>0</l></block><block s="doSetVar"><l>Texture1</l><block s="reportNewList"><list><block s="reportNewList"><list><l>0</l><l>1</l><l>1</l><l>1</l><l>1</l><l>1</l><l>1</l><l>0</l></list></block><block s="reportNewList"><list><l>1</l><l>3</l><l>1</l><l>3</l><l>3</l><l>1</l><l>3</l><l>1</l></list></block><block s="reportNewList"><list><l>1</l><l>3</l><l>1</l><l>3</l><l>3</l><l>1</l><l>3</l><l>1</l></list></block><block s="reportNewList"><list><l>1</l><l>3</l><l>1</l><l>3</l><l>3</l><l>1</l><l>3</l><l>1</l></list></block><block s="reportNewList"><list><l>1</l><l>3</l><l>3</l><l>3</l><l>3</l><l>3</l><l>3</l><l>1</l></list></block><block s="reportNewList"><list><l>0</l><l>1</l><l>1</l><l>1</l><l>1</l><l>1</l><l>1</l><l>0</l></list></block><block s="reportNewList"><list><l>0</l><l>1</l><l>0</l><l>0</l><l>0</l><l>0</l><l>1</l><l>0</l></list></block><block s="reportNewList"><list><l>1</l><l>1</l><l>0</l><l>0</l><l>0</l><l>0</l><l>1</l><l>1</l></list></block></list></block></block><block s="doSetVar"><l>Shader1</l><block s="reifyReporter"><autolambda><block s="reportNewList"><list><block s="reportVariadicSum"><list><block s="reportVariadicProduct"><list><block s="reportListItem"><l>1</l><custom-block s="rotate 3d %n %n %n by %n %n %n"><block var="x"/><block var="y"/><l>0</l><block s="reportVariadicProduct"><list><block var="Ball x"/><l>10</l></list></block><block s="reportVariadicProduct"><list><block var="Ball y"/><l>10</l></list></block><block s="reportVariadicProduct"><list><block var="Ball z"/><l>10</l></list></block></custom-block></block><l>1</l></list></block><l>128</l></list></block><block s="reportVariadicSum"><list><block s="reportVariadicProduct"><list><block s="reportListItem"><l>2</l><custom-block s="rotate 3d %n %n %n by %n %n %n"><block var="x"/><block var="y"/><l>0</l><block s="reportVariadicProduct"><list><block var="Ball x"/><l>10</l></list></block><block s="reportVariadicProduct"><list><block var="Ball y"/><l>10</l></list></block><block s="reportVariadicProduct"><list><block var="Ball z"/><l>10</l></list></block></custom-block></block><l>1</l></list></block><l>128</l></list></block><block var="colour"/></list></block></autolambda><list><l>x</l><l>y</l><l>colour</l></list></block></block><block s="doForever"><script><block s="clear"></block><custom-block s="go to screen %n %n"><l>0</l><l>0</l></custom-block><custom-block s="draw sprite %l with shader %repRing"><block var="Texture1"/><block var="Shader1"/></custom-block><block s="doChangeVar"><l>Frames</l><l>1</l></block><block s="doChangeVar"><l>Ball x</l><block s="reportDifference"><block s="reportKeyPressed"><l><option>w</option></l></block><block s="reportKeyPressed"><l><option>s</option></l></block></block></block><block s="doChangeVar"><l>Ball y</l><block s="reportDifference"><block s="reportKeyPressed"><l><option>d</option></l></block><block s="reportKeyPressed"><l><option>a</option></l></block></block></block><block s="doChangeVar"><l>Ball z</l><block s="reportDifference"><block s="reportKeyPressed"><l><option>e</option></l></block><block s="reportKeyPressed"><l><option>q</option></l></block></block></block></script></block></script></scripts></sprite><watcher var="Texture1" style="normal" x="9.999999999999773" y="10.000000000000007" color="243,118,29" hidden="true"/><watcher var="Shader1" style="normal" x="0" y="106.99999799999989" color="243,118,29" hidden="true"/><watcher var="Frames" style="normal" x="9.999999999999773" y="234.99999799999995" color="243,118,29" hidden="true"/><watcher var="Ball x" style="normal" x="9.999999999999773" y="234.99999799999995" color="243,118,29" hidden="true"/><watcher var="Ball y" style="normal" x="9.999999999999773" y="234.99999799999995" color="243,118,29" hidden="true"/><watcher var="Ball z" style="normal" x="10" y="10" color="243,118,29" hidden="true"/></sprites></stage><variables><variable name="Texture1"><list id="1021"><item><list struct="atomic" id="1022">0,1,1,1,1,1,1,0</list></item><item><list struct="atomic" id="1023">1,3,1,3,3,1,3,1</list></item><item><list struct="atomic" id="1024">1,3,1,3,3,1,3,1</list></item><item><list struct="atomic" id="1025">1,3,1,3,3,1,3,1</list></item><item><list struct="atomic" id="1026">1,3,3,3,3,3,3,1</list></item><item><list struct="atomic" id="1027">0,1,1,1,1,1,1,0</list></item><item><list struct="atomic" id="1028">0,1,0,0,0,0,1,0</list></item><item><list struct="atomic" id="1029">1,1,0,0,0,0,1,1</list></item></list></variable><variable name="Shader1"><context id="1030"><inputs><input>x</input><input>y</input><input>colour</input></inputs><variables></variables><block s="reportNewList"><list><block s="reportVariadicSum"><list><block s="reportVariadicProduct"><list><block s="reportListItem"><l>1</l><custom-block s="rotate 3d %n %n %n by %n %n %n"><block var="x"/><block var="y"/><l>0</l><block s="reportVariadicProduct"><list><block var="Ball x"/><l>10</l></list></block><block s="reportVariadicProduct"><list><block var="Ball y"/><l>10</l></list></block><block s="reportVariadicProduct"><list><block var="Ball z"/><l>10</l></list></block></custom-block></block><l>1</l></list></block><l>128</l></list></block><block s="reportVariadicSum"><list><block s="reportVariadicProduct"><list><block s="reportListItem"><l>2</l><custom-block s="rotate 3d %n %n %n by %n %n %n"><block var="x"/><block var="y"/><l>0</l><block s="reportVariadicProduct"><list><block var="Ball x"/><l>10</l></list></block><block s="reportVariadicProduct"><list><block var="Ball y"/><l>10</l></list></block><block s="reportVariadicProduct"><list><block var="Ball z"/><l>10</l></list></block></custom-block></block><l>1</l></list></block><l>128</l></list></block><block var="colour"/></list></block><receiver><ref id="754"></ref></receiver><origin><ref id="754"></ref></origin><context id="1109"><inputs></inputs><variables></variables><receiver><ref id="754"></ref></receiver><origin><ref id="754"></ref></origin></context></context></variable><variable name="Frames"><l>52</l></variable><variable name="Ball x"><l>0</l></variable><variable name="Ball y"><l>0</l></variable><variable name="Ball z"><l>-4</l></variable></variables></scene></scenes></project><media name="3d!" app="Snap! 11.0.4, https://snap.berkeley.edu" version="2"></media></snapdata>