<snapdata remixID="12325009"><project name="File blocks but no JS" app="Snap! 8.1, https://snap.berkeley.edu" version="2"><notes>snap-endorsed file blocks</notes><thumbnail>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAYAAAB1ovlvAAAAAXNSR0IArs4c6QAAAnpJREFUeF7t17Fpw1AARdFv7WJN4EVcawrPJZeeR3u4kiGQkCYJaXxBHLUSPHT/AaHTvu/7cCkQFTgBGJU3+1EAQBDSAgCm+Y0DyEBaAMA0v3EAGUgLAJjmNw4gA2kBANP8xgFkIC0AYJrfOIAMpAUATPMbB5CBtACAaX7jADKQFgAwzW8cQAbSAgCm+Y0DyEBaAMA0v3EAGUgLAJjmNw4gA2kBANP8xgFkIC0AYJrfOIAMpAUATPMbB5CBtACAaX7jADKQFgAwzW8cQAbSAgCm+Y0DyEBaAMA0v3EAGUgLAJjmNw4gA2kBANP8xgFkIC0AYJrfOIAMpAUATPMbB5CBtACAaX7jADKQFgAwzW8cQAbSAgCm+Y0DyEBaAMA0v3EAGUgLAJjmNw4gA2kBAH/If7lcxu12G8uypAd09HEAfznh6/X6dXfbtnG/38f5fD66ibe+H4B/5P6O8PPRaZrG8/kcj8fjrYd1xDEAAUxdA/iPT/C6rmOe5/TAjjYOoJ+Q1DSAaX7jADKQFgAwzW8cQAbSAgCm+Y0DyEBaAMA0v3EAGUgLAJjmNw4gA2kBANP8xgFkIC0AYJrfOIAMpAUATPMbB5CBtACAaX7jADKQFgAwzW8cQAbSAgCm+Y0DyEBaAMA0v3EAGUgLAJjmNw4gA2kBANP8xgFkIC0AYJrfOIAMpAUATPMbB5CBtACAaX7jADKQFgAwzW8cQAbSAgCm+Y0DyEBaAMA0v3EAGUgLAJjmNw4gA2kBANP8xgFkIC0AYJrfOIAMpAUATPMbB5CBtACAaX7jADKQFgAwzW8cQAbSAgCm+Y0DyEBaAMA0v3EAGUgLAJjmN/4C1wn8qIbHiI0AAAAASUVORK5CYII=</thumbnail><scenes select="1"><scene name="File blocks but no JS"><notes>snap-endorsed file blocks</notes><hidden></hidden><headers></headers><code></code><blocks><block-definition s="%&apos;prop&apos; of file %&apos;file&apos;" type="reporter" category="other" helper="true"><comment x="0" y="0" w="90" collapsed="false">Gets an attribute of a file.&#xD;&#xD;The last modified attribute reports the time the file was last modified in milliseconds since the Unix epoch (Jan 1, 1970, 12:00 AM)</comment><header></header><code></code><translations></translations><inputs><input type="%s" readonly="true">name<options>name&#xD;size&#xD;type&#xD;last modified</options></input><input type="%s"></input></inputs><script><block s="doReport"><custom-block s="call function ( %mult%s ) { %code } with %mult%s"><list><l>f</l><l>which</l></list><l>if (!(f instanceof File))&#xD;throw new Error("Not a File");&#xD;switch (which) {&#xD; case "last modified":&#xD;  return f.lastModified;&#xD; default:&#xD;  return f[which];&#xD;}</l><list><block var="file"/><block var="prop"/></list></custom-block></block></script></block-definition><block-definition s="is %&apos;file&apos; a %&apos;type&apos; file?" type="predicate" category="other" helper="true"><header></header><code></code><translations></translations><inputs><input type="%s"></input><input type="%txt" readonly="true">text<options>image&#xD;audio&#xD;video&#xD;text&#xD;SVG&#xD;MIDI&#xD;any</options></input></inputs><script><block s="doIf"><block s="evaluate"><block s="reportJSFunction"><list><l>file</l></list><l>return !(file instanceof File);</l></block><list><block var="file"/></list></block><script><block s="doReport"><block s="reportBoolean"><l><bool>false</bool></l></block></block></script></block><block s="doIf"><block s="reportEquals"><block var="type"/><l>any</l></block><script><block s="doReport"><block s="reportBoolean"><l><bool>true</bool></l></block></block></script></block><block s="doIf"><block s="reportEquals"><block var="type"/><l>MIDI</l></block><script><block s="doReport"><block s="reportEquals"><l>mid</l><block s="reportListItem"><l>2</l><block s="reportTextSplit"><custom-block s="%s of file %s"><l>type</l><block var="file"/></custom-block><l>/</l></block></block></block></block></script></block><block s="doIf"><block s="reportEquals"><block var="type"/><l>SVG</l></block><script><block s="doReport"><block s="reportEquals"><custom-block s="%s of file %s"><l>type</l><block var="file"/></custom-block><l>image/svg+xml</l></block></block></script></block><block s="doReport"><block s="reportEquals"><block var="type"/><block s="reportListItem"><l>1</l><block s="reportTextSplit"><custom-block s="%s of file %s"><l>type</l><block var="file"/></custom-block><l>/</l></block></block></block></block></script></block-definition><block-definition s="call function ( %&apos;params&apos; ) { %&apos;body&apos; } with %&apos;inputs&apos;" type="reporter" category="control" helper="true"><header></header><code></code><translations>es:llamar función ( _ ) { _ } con _&#xD;</translations><inputs><input type="%mult%s"></input><input type="%code">return 0;</input><input type="%mult%s"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><block var="params"/><block var="body"/></block><block var="inputs"/></block></block></script></block-definition><block-definition s="read file %&apos;file&apos; as %&apos;type&apos;" type="reporter" category="other" helper="true"><comment x="0" y="0" w="90" collapsed="false">Reads a file as a certain type.</comment><header></header><code></code><translations></translations><inputs><input type="%s"></input><input type="%s" readonly="true">text<options>text&#xD;binary string&#xD;costume&#xD;vector costume&#xD;sound</options></input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>file</l><l>type</l><l>process</l></list><l>if (!(file instanceof File)) throw new Error("Not a File");&#xD;&#xD;var reader = new FileReader();&#xD;&#xD;var isMedia = type == "costume" || type == "vector costume" || type == "sound";&#xD;&#xD;reader.addEventListener("load", function() {&#xD;    var res = reader.result;&#xD;&#xD;    if (type == "costume" || type == "vector costume") {&#xD;        var img = document.createElement("img");&#xD;        &#xD;        img.onload = function() {&#xD;          //for bitmap costume&#xD;          if (type == "costume") {&#xD;            var canvas = document.createElement("canvas");&#xD;            canvas.width = img.width;&#xD;            canvas.height = img.height;&#xD;            canvas.getContext("2d").drawImage(img, 0, 0);&#xD;&#xD;            res = new Costume(canvas, file.name);&#xD;          } else if (type == "vector costume") { //for vector costume&#xD;            res = new SVG_Costume(img, file.name);&#xD;          }&#xD;&#xD;          process.homeContext.variables.setVar("res", res);&#xD;          process.resume()&#xD;        }&#xD;&#xD;        img.src = res;&#xD;    } else if (type == "sound") {&#xD;       var audioElem = document.createElement("audio");&#xD;&#xD;       audioElem.type = file.type;&#xD;       audioElem.src = res;&#xD;&#xD;       res = new Sound(audioElem, file.name);&#xD;       process.homeContext.variables.setVar("res", res);&#xD;       process.resume(); &#xD;    } else {&#xD;        process.homeContext.variables.setVar("res", res);&#xD;        process.resume();&#xD;    }&#xD;})&#xD;    &#xD;if (isMedia) {&#xD;  if (type == "costume" &amp;&amp; file.type.slice(0, 6) != "image/") throw new Error("Not an image file");&#xD;  if (type == "vector costume" &amp;&amp; file.type != "image/svg+xml") throw new Error("Not an SVG file");&#xD;  if (type == "sound" &amp;&amp; file.type.slice(0, 6) != "audio/") throw new Error("Not an audio file");&#xD;&#xD;  reader.readAsDataURL(file);&#xD;} else if (type == "text") {&#xD;  reader.readAsText(file);&#xD;} else if (type == "binary string") {&#xD;  reader.readAsBinaryString(file);&#xD;} else {&#xD;  throw new Error("Incorrect type");&#xD;}&#xD;&#xD;process.homeContext.variables.addVar("res")&#xD;process.pause();</l></block><list><block var="file"/><block var="type"/></list></block><block s="doReport"><block s="evaluate"><block s="reportJSFunction"><list><l>varName</l><l>proc</l></list><l>if ((typeof varName) != "string") {&#xD;    throw new Error("name isn&apos;t a string: " + varName);&#xD;}&#xD;return proc.homeContext.variables.getVar(varName);</l></block><list><l>res</l></list></block><comment w="90" collapsed="false">stolen from the variables library</comment></block></script></block-definition><block-definition s="import %&apos;types&apos; files $nl multiple? %&apos;mult&apos;" type="reporter" category="other" helper="true"><header></header><code></code><translations>es:importar _ archivos _ ¿múltiple? _&#xD;en:import _ files _ multiple? _&#xD;</translations><inputs><input type="%mult%s"></input><input type="%b">true</input></inputs><script><block s="doDeclareVariables"><list><l>list</l></list></block><block s="doSetVar"><l>list</l><block s="evaluate"><block s="reportJSFunction"><list><l>typesList</l><l>multiple</l></list><l>typesList = typesList.asArray();&#xD;if (typesList.length &gt; 0){&#xD;typesList = typesList.map(e =&gt; &#xD;e.replaceAll(",", "\\&apos;")).join(&apos;,&apos;);&#xD;} else {typesList = &apos;*.*&apos;;}&#xD;var list = null,&#xD;    input = document.createElement(&apos;input&apos;);&#xD;input.type = &apos;file&apos;;&#xD;input.multiple = multiple;&#xD;input.accept = typesList;&#xD;document.body.onfocus = function() {&#xD; delete document.body.onfocus;&#xD; setTimeout(() =&gt; {&#xD;  if (multiple){&#xD;  list = new List(Array.from(input.files || []));&#xD;  } else {let filesArray = Array.from(input.files);&#xD;          if (filesArray.length &gt; 0){&#xD;           list = filesArray[0];&#xD;          } else {list = true;}}&#xD; }, 200);&#xD;}&#xD;input.click();&#xD;return () =&gt; list;</l></block><list><block var="types"/><block var="mult"/></list></block></block><block s="doWaitUntil"><block s="evaluate"><block var="list"/><list></list></block></block><block s="doIf"><block s="reportIsA"><block s="evaluate"><block var="list"/><list></list></block><l><option>Boolean</option></l></block><script><block s="doReport"><l></l></block></script></block><block s="doReport"><block s="evaluate"><block var="list"/><list></list></block></block></script><scripts><comment x="504" y="132.2" w="90" collapsed="false">The first dropdown is the list of types.</comment></scripts></block-definition><block-definition s="download text %&apos;text&apos; as %&apos;name&apos; .txt" type="command" category="other"><header></header><code></code><translations></translations><inputs><input type="%s">Hello, World!</input><input type="%s">data</input></inputs><script><block s="doApplyExtension"><l>src_load(url)</l><list><l>libraries/SciSnapExtensions.js</l></list></block><block s="doApplyExtension"><l>SciS_writeToFile(data,filename)</l><list><block var="text"/><block var="name"/></list></block></script></block-definition><block-definition s="download list %&apos;list&apos; as %&apos;name&apos; .csv" type="command" category="other"><header></header><code></code><translations></translations><inputs><input type="%l"></input><input type="%s">data</input></inputs><script><block s="doApplyExtension"><l>src_load(url)</l><list><l>libraries/SciSnapExtensions.js</l></list></block><block s="doApplyExtension"><l>SciS_writetoCSVfile(data,filename)</l><list><block var="list"/><block var="name"/></list></block></script></block-definition><block-definition s="import file" type="reporter" category="other"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doApplyExtension"><l>src_load(url)</l><list><l>libraries/SciSnapExtensions.js</l></list></block><custom-block s="let %upvar be %s"><l>function</l><block s="reportApplyExtension"><l>SciS_readFileWithFilepicker()</l><list><l></l></list></block></custom-block><block s="doWaitUntil"><block s="reportListItem"><l>1</l><block s="evaluate"><block var="function"/><list></list></block></block></block><block s="doReport"><block s="reportListItem"><l>2</l><block s="evaluate"><block var="function"/><list></list></block></block></block></script></block-definition><block-definition s="let %&apos;var&apos; be %&apos;val&apos;" type="command" category="other" helper="true"><header></header><code></code><translations></translations><inputs><input type="%upvar"></input><input type="%s"></input></inputs><script><block s="doSetVar"><l>var</l><block var="val"/></block></script></block-definition><block-definition s="file save prompt name: %&apos;name&apos; $nl contents: %&apos;body&apos; extension: %&apos;extension&apos;" type="command" category="other" helper="true"><comment x="0" y="0" w="130.94611150568156" collapsed="false">Downloads a file onto the user&apos;s computer.&#xD;&#xD;The contents parameter can take a text string or a file object as input.</comment><header></header><code></code><translations></translations><inputs><input type="%s"></input><input type="%mlt"></input><input type="%s"><options>.xml&#xD;.html&#xD;.txt</options></input></inputs><script><custom-block s="run function ( %mult%s ) { %code } with %mult%s"><list><l>name, body, extension</l></list><l>var lnk = top.document.createElement(&apos;a&apos;),&#xD;    finish = function() {&#xD;             console.log("Downloading file...");&#xD;             lnk.href = url;&#xD;             lnk.download = name + extension;&#xD;             lnk.click();},&#xD;    url = null;&#xD;if (body instanceof Blob){&#xD;var reader = new top.FileReader();&#xD;console.log("Reading data URL...");&#xD;reader.addEventListener(&apos;load&apos;, () =&gt; {console.log("Data URL loaded!");&#xD;                                       url = reader.result;finish()});&#xD;reader.readAsDataURL(body);&#xD;} else {&#xD;console.log("Initializing file...")&#xD;var blob = new top.Blob([body]);&#xD;url = (URL||webkitURL).createObjectURL(new Blob([body]));&#xD;finish();&#xD;}</l><list><block var="name"/><block var="body"/><block var="extension"/></list></custom-block></script></block-definition><block-definition s="run function ( %&apos;params&apos; ) { %&apos;body&apos; } with %&apos;inputs&apos;" type="command" category="control" helper="true"><header></header><code></code><translations>es:ejecutar función ( _ ) { _ } con _&#xD;</translations><inputs><input type="%mult%s"></input><input type="%code"></input><input type="%mult%s"></input></inputs><script><block s="doRun"><block s="reportJSFunction"><block var="params"/><block var="body"/></block><block var="inputs"/></block></script></block-definition></blocks><stage name="Stage" width="480" height="360" costume="0" color="255,255,255,1" tempo="60" threadsafe="false" penlog="false" volume="100" pan="0" lines="round" ternary="false" hyperops="true" codify="false" inheritance="true" sublistIDs="false" id="272"><pentrails>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAAFoCAYAAACPNyggAAAAAXNSR0IArs4c6QAADoVJREFUeF7t1cEJAAAIxDDdf2m3sJ+4wEEQuuMIECBAgACBd4F9XzRIgAABAgQIjAB7AgIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECByxcQFpoRMBzwAAAABJRU5ErkJggg==</pentrails><costumes><list struct="atomic" id="273"></list></costumes><sounds><list struct="atomic" id="274"></list></sounds><variables></variables><blocks></blocks><scripts></scripts><sprites select="1"><sprite name="Sprite" idx="1" x="0" y="0" heading="90" scale="1" volume="100" pan="0" rotation="1" draggable="true" costume="0" color="80,80,80,1" pen="tip" id="279"><costumes><list struct="atomic" id="280"></list></costumes><sounds><list struct="atomic" id="281"></list></sounds><blocks></blocks><variables></variables><scripts><script x="10" y="13.999999999999886"><custom-block s="download text %s as %s .txt"><l>Hello, World!</l><l>data</l></custom-block></script><script x="342" y="18.333333333333485"><custom-block s="import file"></custom-block></script><script x="10" y="57.999999999999886"><custom-block s="download list %l as %s .csv"><l/><l>data</l></custom-block></script></scripts></sprite></sprites></stage><variables></variables></scene></scenes></project><media name="File blocks but no JS" app="Snap! 8.1, https://snap.berkeley.edu" version="2"></media></snapdata>